1
0
Fork 0

add/fix some more soundblaster modes (Srecko)

Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@2692
This commit is contained in:
Sebastian Strohhäcker 2006-08-25 09:40:19 +00:00
parent 85603ac5eb
commit e11274fe6e
3 changed files with 50 additions and 23 deletions

View file

@ -54,6 +54,8 @@ public:
void AddSamples(Bitu len,void * data);
void AddSamples_m8(Bitu len,Bit8u * data);
void AddSamples_s8(Bitu len,Bit8u * data);
void AddSamples_m8s(Bitu len,Bit8s * data);
void AddSamples_s8s(Bitu len,Bit8s * data);
void AddSamples_m16(Bitu len,Bit16s * data);
void AddSamples_s16(Bitu len,Bit16s * data);
void AddSamples_m16u(Bitu len,Bit16u * data);

View file

@ -16,7 +16,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/* $Id: mixer.cpp,v 1.41 2006-08-21 20:08:26 c2woody Exp $ */
/* $Id: mixer.cpp,v 1.42 2006-08-25 09:40:19 c2woody Exp $ */
/*
Remove the sdl code from here and have it handeld in the sdlmain.
@ -182,6 +182,7 @@ template<bool _8bits,bool stereo,bool signeddata>
INLINE void MixerChannel::AddSamples(Bitu len,void * data) {
Bits diff[2];
Bit8u * data8=(Bit8u*)data;
Bit8s * data8s=(Bit8s*)data;
Bit16s * data16=(Bit16s*)data;
Bit16u * data16u=(Bit16u*)data;
Bitu mixpos=mixer.pos+done;
@ -198,11 +199,20 @@ INLINE void MixerChannel::AddSamples(Bitu len,void * data) {
thestart:
if (pos>=len) return;
if (_8bits) {
if (stereo) {
diff[0]=(((Bit8s)(data8[pos*2+0] ^ 0x80)) << 8)-last[0];
diff[1]=(((Bit8s)(data8[pos*2+1] ^ 0x80)) << 8)-last[1];
if (!signeddata) {
if (stereo) {
diff[0]=(((Bit8s)(data8[pos*2+0] ^ 0x80)) << 8)-last[0];
diff[1]=(((Bit8s)(data8[pos*2+1] ^ 0x80)) << 8)-last[1];
} else {
diff[0]=(((Bit8s)(data8[pos] ^ 0x80)) << 8)-last[0];
}
} else {
diff[0]=(((Bit8s)(data8[pos] ^ 0x80)) << 8)-last[0];
if (stereo) {
diff[0]=(data8s[pos*2+0] << 8)-last[0];
diff[1]=(data8s[pos*2+1] << 8)-last[1];
} else {
diff[0]=(data8s[pos] << 8)-last[0];
}
}
} else {
if (signeddata) {
@ -214,10 +224,10 @@ thestart:
}
} else {
if (stereo) {
diff[0]=data16u[pos*2+0]-last[0];
diff[1]=data16u[pos*2+1]-last[1];
diff[0]=(Bits)data16u[pos*2+0]-32768-last[0];
diff[1]=(Bits)data16u[pos*2+1]-32768-last[1];
} else {
diff[0]=data16u[pos]-last[0];
diff[0]=(Bits)data16u[pos]-32768-last[0];
}
}
}
@ -267,6 +277,12 @@ void MixerChannel::AddSamples_m8(Bitu len,Bit8u * data) {
void MixerChannel::AddSamples_s8(Bitu len,Bit8u * data) {
AddSamples<true,true,false>(len,data);
}
void MixerChannel::AddSamples_m8s(Bitu len,Bit8s * data) {
AddSamples<true,false,true>(len,data);
}
void MixerChannel::AddSamples_s8s(Bitu len,Bit8s * data) {
AddSamples<true,true,true>(len,data);
}
void MixerChannel::AddSamples_m16(Bitu len,Bit16s * data) {
AddSamples<false,false,true>(len,data);
}

View file

@ -16,7 +16,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/* $Id: sblaster.cpp,v 1.56 2006-08-21 20:08:26 c2woody Exp $ */
/* $Id: sblaster.cpp,v 1.57 2006-08-25 09:40:19 c2woody Exp $ */
#include <string.h>
#include <math.h>
@ -404,19 +404,26 @@ static void GenerateDMASound(Bitu size) {
if (sb.dma.stereo) {
read=sb.dma.chan->Read(size,&sb.dma.buf.b8[sb.dma.remain_size]);
Bitu total=read+sb.dma.remain_size;
sb.chan->AddSamples_s8(total>>1,sb.dma.buf.b8);
if (!sb.dma.sign) sb.chan->AddSamples_s8(total>>1,sb.dma.buf.b8);
else sb.chan->AddSamples_s8s(total>>1,(Bit8s*)sb.dma.buf.b8);
if (total&1) {
sb.dma.remain_size=1;
sb.dma.buf.b8[0]=sb.dma.buf.b8[total-1];
} else sb.dma.remain_size=0;
} else {
read=sb.dma.chan->Read(size,sb.dma.buf.b8);
sb.chan->AddSamples_m8(read,sb.dma.buf.b8);
if (!sb.dma.sign) sb.chan->AddSamples_m8(read,sb.dma.buf.b8);
else sb.chan->AddSamples_m8s(read,(Bit8s *)sb.dma.buf.b8);
}
break;
case DSP_DMA_16:
case DSP_DMA_16_ALIASED:
if (sb.dma.stereo) {
read=sb.dma.chan->Read(size,(Bit8u *)&sb.dma.buf.b16[sb.dma.remain_size]);
/* In DSP_DMA_16_ALIASED mode temporarily divide by 2 to get number of 16-bit
samples, because 8-bit DMA Read returns byte size, while in DSP_DMA_16 mode
16-bit DMA Read returns word size */
read=sb.dma.chan->Read(size,(Bit8u *)&sb.dma.buf.b16[sb.dma.remain_size])
>> (sb.dma.mode==DSP_DMA_16_ALIASED ? 1:0);
Bitu total=read+sb.dma.remain_size;
if (sb.dma.sign) sb.chan->AddSamples_s16(total>>1,sb.dma.buf.b16);
else sb.chan->AddSamples_s16u(total>>1,(Bit16u *)sb.dma.buf.b16);
@ -425,16 +432,13 @@ static void GenerateDMASound(Bitu size) {
sb.dma.buf.b16[0]=sb.dma.buf.b16[total-1];
} else sb.dma.remain_size=0;
} else {
read=sb.dma.chan->Read(size,sb.dma.buf.b8);
sb.chan->AddSamples_m16(read,sb.dma.buf.b16);
}
break;
case DSP_DMA_16_ALIASED:
if (sb.dma.stereo) {
sb.chan->AddSamples_s16(read>>2,sb.dma.buf.b16);
} else {
sb.chan->AddSamples_m16(read>>1,sb.dma.buf.b16);
read=sb.dma.chan->Read(size,(Bit8u *)sb.dma.buf.b16)
>> (sb.dma.mode==DSP_DMA_16_ALIASED ? 1:0);
if (sb.dma.sign) sb.chan->AddSamples_m16(read,sb.dma.buf.b16);
else sb.chan->AddSamples_m16u(read,(Bit16u *)sb.dma.buf.b16);
}
//restore buffer length value to byte size in aliased mode
if (sb.dma.mode==DSP_DMA_16_ALIASED) read=read<<1;
break;
default:
LOG_MSG("Unhandled dma mode %d",sb.dma.mode);
@ -589,6 +593,7 @@ static void DSP_PrepareDMA_Old(DMA_MODES mode,bool autoinit) {
static void DSP_PrepareDMA_New(DMA_MODES mode,Bitu length,bool autoinit,bool stereo) {
Bitu freq=sb.freq;
//equal length if data format and dma channel are both 16-bit or 8-bit
sb.dma.total=length;
sb.dma.autoinit=autoinit;
if (mode==DSP_DMA_16) {
@ -597,12 +602,15 @@ static void DSP_PrepareDMA_New(DMA_MODES mode,Bitu length,bool autoinit,bool ste
if (sb.dma.chan==NULL) {
sb.dma.chan=GetDMAChannel(sb.hw.dma8);
mode=DSP_DMA_16_ALIASED;
freq/=2;
sb.dma.total<<=1;
}
} else {
sb.dma.chan=GetDMAChannel(sb.hw.dma8);
mode=DSP_DMA_16_ALIASED;
freq/=2;
//UNDOCUMENTED:
//In aliased mode sample length is written to DSP as number of
//16-bit samples so we need double 8-bit DMA buffer length
sb.dma.total<<=1;
}
} else sb.dma.chan=GetDMAChannel(sb.hw.dma8);
DSP_DoDMATransfer(mode,freq,stereo);
@ -631,6 +639,7 @@ static void DSP_Reset(void) {
sb.dma.left=0;
sb.dma.total=0;
sb.dma.stereo=false;
sb.dma.sign=false;
sb.dma.autoinit=false;
sb.dma.mode=DSP_DMA_NONE;
sb.dma.remain_size=0;