@@ -49,7 +49,7 @@ static int VSB_HDMA = 5;
49
49
#endif
50
50
static int VSB_DACSpeaker = 1 ;
51
51
static unsigned int VSB_Bits = 8 ;
52
- static int VSB_SampleRate = 22050 ;
52
+ static int VSB_SampleRate ;
53
53
static unsigned int VSB_Samples = 0 ; /* the length argument after a play command (samples - 1) */
54
54
static int VSB_Auto = false; /* auto-initialize mode active */
55
55
static int VSB_HighSpeed = 0 ;
@@ -220,12 +220,13 @@ static void DSP_Reset( uint8_t value )
220
220
#else
221
221
VSB_MixerRegs [SB_MIXERREG_DMA_SETUP ] = (1 << VSB_DMA ) & 0xB ;
222
222
#endif
223
- VSB_MixerRegs [SB_MIXERREG_MODEFILTER ] = 0xFD ; //mask out stereo
223
+ VSB_MixerRegs [SB_MIXERREG_MODEFILTER ] = 0x11 ; //SB Pro: mono, no filter
224
224
VSB_MixerRegIndex = 0 ;
225
225
VSB_DSPCMD = -1 ;
226
226
VSB_DSPCMD_Subindex = 0 ;
227
227
DSPDataBytes = 0 ;
228
228
VSB_Started = 0 ;
229
+ VSB_SampleRate = 0 ;
229
230
VSB_Samples = 0 ;
230
231
VSB_Auto = false;
231
232
VSB_Signed = false;
@@ -261,6 +262,24 @@ static void DSP_Reset( uint8_t value )
261
262
}
262
263
}
263
264
265
+ int VSB_CalcSampleRate ( uint8_t value )
266
+ ///////////////////////////////////////
267
+ {
268
+ int rc = 0 ;
269
+ int i ;
270
+ for ( i = 0 ; i < 3 ; ++ i ) {
271
+ if (value >= VSB_TimeConstantMapMono [i ][0 ] - 3 && value <= VSB_TimeConstantMapMono [i ][0 ] + 3 ) {
272
+ rc = VSB_TimeConstantMapMono [i ][1 ] / VSB_GetChannels ();
273
+ break ;
274
+ }
275
+ }
276
+ if (!rc ) {
277
+ //rc = 1000000 / ( 256 - value ) / VSB_GetChannels();
278
+ rc = 256000000 /( 65536 - (value << 8 ) ) / VSB_GetChannels ();
279
+ }
280
+ return rc ;
281
+ }
282
+
264
283
/* write port 2xC */
265
284
266
285
static void DSP_Write ( uint8_t value )
@@ -330,7 +349,7 @@ static void DSP_Write( uint8_t value )
330
349
ISR_adpcm_state .useRef = true;
331
350
ISR_adpcm_state .step = 0 ;
332
351
VSB_Bits = (value == SB_DSP_2BIT_OUT_AUTO ) ? 2 : (value == SB_DSP_3BIT_OUT_AUTO ) ? 3 : 4 ;
333
- VSB_MixerRegs [SB_MIXERREG_MODEFILTER ] &= ~0x2 ;
352
+ VSB_MixerRegs [SB_MIXERREG_MODEFILTER ] &= ~SB_MIXERREG_MODEFILTER_STEREO ;
334
353
VSB_Silent = false;
335
354
VSB_Started = true; //start transfer here
336
355
VSB_Pos = 0 ;
@@ -405,8 +424,10 @@ static void DSP_Write( uint8_t value )
405
424
/* bit 4 of value: 1=signed */
406
425
VSB_Signed = ( ( value & 0x10 ) ? true : false );
407
426
/* bit 5 of value: 1=stereo */
408
- VSB_MixerRegs [SB_MIXERREG_MODEFILTER ] &= ~2 ;
409
- VSB_MixerRegs [SB_MIXERREG_MODEFILTER ] |= ( ( value & 0x20 ) ? 2 : 0 );
427
+ if ( value & 0x20 )
428
+ VSB_MixerRegs [SB_MIXERREG_MODEFILTER ] |= SB_MIXERREG_MODEFILTER_STEREO ;
429
+ else
430
+ VSB_MixerRegs [SB_MIXERREG_MODEFILTER ] &= ~SB_MIXERREG_MODEFILTER_STEREO ;
410
431
VSB_DSPCMD_Subindex ++ ;
411
432
break ;
412
433
case 1 :
@@ -425,21 +446,14 @@ static void DSP_Write( uint8_t value )
425
446
int i ;
426
447
switch ( VSB_DSPCMD ) {
427
448
case SB_DSP_SET_TIMECONST : /* 40 */
428
- VSB_SampleRate = 0 ;
429
449
#if !LATERATE
430
- for ( i = 0 ; i < 3 ; ++ i ) {
431
- if (value >= VSB_TimeConstantMapMono [i ][0 ]- 3 && value <= VSB_TimeConstantMapMono [i ][0 ]+ 3 ) {
432
- VSB_SampleRate = VSB_TimeConstantMapMono [i ][1 ] / VSB_GetChannels ();
433
- break ;
434
- }
435
- }
436
- if (VSB_SampleRate == 0 )
437
- VSB_SampleRate = 256000000 /( 65536 - (value << 8 ) ) / VSB_GetChannels ();
438
- //VSB_SampleRate = 1000000 / ( 256 - value ) / VSB_GetChannels();
450
+ VSB_SampleRate = VSB_CalcSampleRate ( value );
451
+ dbgprintf (("DSP_Write: time constant=%X, rate=%u\n" , value , VSB_SampleRate ));
439
452
#else
453
+ VSB_SampleRate = 0 ;
440
454
bTimeConst = value ;
441
- #endif
442
455
dbgprintf (("DSP_Write: time constant=%X\n" , value ));
456
+ #endif
443
457
VSB_DSPCMD_Subindex = 2 ; //only 1byte
444
458
break ;
445
459
case SB_DSP_8BIT_DIRECT : /* 10 */
@@ -480,8 +494,8 @@ static void DSP_Write( uint8_t value )
480
494
ISR_adpcm_state .useRef = (VSB_DSPCMD & 1 );
481
495
ISR_adpcm_state .step = 0 ;
482
496
VSB_Bits = (VSB_DSPCMD <= SB_DSP_2BIT_OUT_1 ) ? 2 : (VSB_DSPCMD >= SB_DSP_3BIT_OUT_1_NREF ) ? 3 : 4 ;
483
- VSB_MixerRegs [SB_MIXERREG_MODEFILTER ] &= ~0x2 ; /* reset stereo */
484
- VSB_Started = true; //start transfer here
497
+ VSB_MixerRegs [SB_MIXERREG_MODEFILTER ] &= ~SB_MIXERREG_MODEFILTER_STEREO ; /* reset stereo */
498
+ VSB_Started = true;
485
499
VSB_Silent = false;
486
500
VSB_Signed = false;
487
501
VSB_Pos = 0 ;
@@ -505,7 +519,7 @@ static void DSP_Write( uint8_t value )
505
519
VSB_Samples = value ;
506
520
else {
507
521
VSB_Samples |= value << 8 ; /* the value is #samples-1! */
508
- VSB_MixerRegs [SB_MIXERREG_MODEFILTER ] &= ~0x2 ; /* reset stereo */
522
+ VSB_MixerRegs [SB_MIXERREG_MODEFILTER ] &= ~SB_MIXERREG_MODEFILTER_STEREO ; /* reset stereo */
509
523
VSB_Signed = false;
510
524
VSB_Bits = 8 ;
511
525
VSB_Pos = 0 ;
@@ -717,24 +731,16 @@ int VSB_IsSigned()
717
731
int VSB_GetChannels ()
718
732
/////////////////////
719
733
{
720
- return (VSB_MixerRegs [SB_MIXERREG_MODEFILTER ] & 0x2 ) ? 2 : 1 ;
734
+ /* MIXERREG_MODEFILTER is for SB Pro only, but in vsbhda also set for sb16 */
735
+ return (VSB_MixerRegs [SB_MIXERREG_MODEFILTER ] & SB_MIXERREG_MODEFILTER_STEREO ) ? 2 : 1 ;
721
736
}
722
737
723
738
int VSB_GetSampleRate ()
724
739
///////////////////////
725
740
{
726
741
#if LATERATE
727
- if ( !VSB_SampleRate ) {
728
- for (int i = 0 ; i < 3 ; ++ i ) {
729
- if ( bTimeConst >= VSB_TimeConstantMapMono [i ][0 ]- 3 && bTimeConst <= VSB_TimeConstantMapMono [i ][0 ]+ 3 ) {
730
- VSB_SampleRate = VSB_TimeConstantMapMono [i ][1 ] / VSB_GetChannels ();
731
- break ;
732
- }
733
- }
734
- if ( VSB_SampleRate == 0 )
735
- VSB_SampleRate = 256000000 /( 65536 - ( bTimeConst << 8 ) ) / VSB_GetChannels ();
736
- //VSB_SampleRate = 1000000 / ( 256 - bTimeConst ) / VSB_GetChannels();
737
- }
742
+ if ( !VSB_SampleRate )
743
+ VSB_SampleRate = VSB_CalcSampleRate ( bTimeConst );
738
744
#endif
739
745
return VSB_SampleRate ;
740
746
}
0 commit comments