1
0
Fork 0

Do less to update the frequency of an active SB DMA transfer, and include DSP command 0x41 (fixes SB16 sound in Tempest 2000). Handle DSP command 0x42 as unimplemented, because it is.

Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@3896
This commit is contained in:
ripsaw8080 2015-01-28 22:20:49 +00:00
parent 3c8a5bdc95
commit 6cec6d144b

View file

@ -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;