diff --git a/src/hardware/sblaster.cpp b/src/hardware/sblaster.cpp index 875c75c8..d5da7e52 100644 --- a/src/hardware/sblaster.cpp +++ b/src/hardware/sblaster.cpp @@ -758,6 +758,16 @@ static void DSP_ADC_CallBack(DmaChannel * /*chan*/, DMAEvent event) { ch->Register_Callback(0); } +static void DSP_ChangeRate(Bitu freq) { + if (sb.freq!=freq && sb.dma.mode!=DSP_DMA_NONE) { + sb.chan->FillUp(); + sb.chan->SetFreq(freq / (sb.mixer.stereo ? 2 : 1)); + sb.dma.rate=(freq*sb.dma.mul) >> SB_SH; + sb.dma.min=(sb.dma.rate*3)/1000; + } + sb.freq=freq; +} + Bitu DEBUG_EnableDebugger(void); #define DSP_SB16_ONLY if (sb.type != SBT_16) { LOG(LOG_SB,LOG_ERROR)("DSP:Command %2X requires SB16",sb.dsp.cmd); break; } @@ -845,16 +855,14 @@ static void DSP_DoCommand(void) { if (sb.midi == true) MIDI_RawOutByte(sb.dsp.in.data[0]); break; case 0x40: /* Set Timeconstant */ - sb.freq=(1000000 / (256 - sb.dsp.in.data[0])); - /* Nasty kind of hack to allow runtime changing of frequency */ - if (sb.dma.mode != DSP_DMA_NONE && sb.dma.autoinit) { - DSP_PrepareDMA_Old(sb.dma.mode,sb.dma.autoinit,sb.dma.sign); - } + DSP_ChangeRate(1000000 / (256 - sb.dsp.in.data[0])); break; case 0x41: /* Set Output Samplerate */ - case 0x42: /* Set Input Samplerate */ DSP_SB16_ONLY; - sb.freq=(sb.dsp.in.data[0] << 8) | sb.dsp.in.data[1]; + DSP_ChangeRate((sb.dsp.in.data[0] << 8) | sb.dsp.in.data[1]); + break; + case 0x42: /* Set Input Samplerate */ + LOG(LOG_SB,LOG_ERROR)("DSP:Unimplemented input sample rate command"); break; case 0x48: /* Set DMA Block Size */ DSP_SB2_ABOVE;