From dc0be652246f5d73def927c5249a64f7f65abe9f Mon Sep 17 00:00:00 2001 From: Sjoerd van der Berg Date: Mon, 23 Aug 2004 10:06:09 +0000 Subject: [PATCH] Improve timing between sequential dma transfers Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@1918 --- src/hardware/sblaster.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/hardware/sblaster.cpp b/src/hardware/sblaster.cpp index e429c433..fca0ee63 100644 --- a/src/hardware/sblaster.cpp +++ b/src/hardware/sblaster.cpp @@ -224,14 +224,15 @@ static void DSP_DMA_CallBack(DmaChannel * chan, DMAEvent event) { if (event==DMA_REACHED_TC) return; else if (event==DMA_MASKED) { if (sb.mode==MODE_DMA) { - DSP_ChangeMode(MODE_NONE); - LOG(LOG_SB,LOG_NORMAL)("DMA deactivated,stopping output"); + sb.mode=MODE_DMA_PAUSE; +// DSP_ChangeMode(MODE_DMA_PAUSE); + LOG(LOG_SB,LOG_NORMAL)("DMA masked,stopping output"); } } else if (event==DMA_UNMASKED) { - if (sb.mode!=MODE_DMA && sb.dma.mode!=DSP_DMA_NONE) { + if (sb.mode==MODE_DMA_PAUSE && sb.dma.mode!=DSP_DMA_NONE) { DSP_ChangeMode(MODE_DMA); CheckDMAEnd(); - LOG(LOG_SB,LOG_NORMAL)("DMA Activated,starting output, auto %d block %X",chan->autoinit,chan->basecnt); + LOG(LOG_SB,LOG_NORMAL)("DMA unmasked,starting output, auto %d block %X",chan->autoinit,chan->basecnt); } } } @@ -453,6 +454,7 @@ static void DSP_RaiseIRQEvent(Bitu val) { static void DSP_DoDMATranfser(DMA_MODES mode,Bitu freq,bool stereo) { char * type; + sb.mode=MODE_DMA_PAUSE; sb.chan->FillUp(); sb.dma.left=sb.dma.total; sb.dma.mode=mode; @@ -670,7 +672,7 @@ static void DSP_DoCommand(void) { case 0xd5: /* Halt 16-bit DMA */ // DSP_ChangeMode(MODE_NONE); // Games sometimes already program a new dma before stopping, gives noise - sb.mode=MODE_DMA; + sb.mode=MODE_DMA_PAUSE; PIC_RemoveEvents(END_DMA_Event); break; case 0xd1: /* Enable Speaker */