From be9a70adfdfbfd710992b9663a8c9d0e5a8b08b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Strohh=C3=A4cker?= Date: Mon, 21 Aug 2006 20:08:26 +0000 Subject: [PATCH] fix unsigned 16bit samples sb16 output Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@2690 --- include/mixer.h | 4 +++- src/hardware/mixer.cpp | 36 ++++++++++++++++++++++++++---------- src/hardware/sblaster.cpp | 5 +++-- 3 files changed, 32 insertions(+), 13 deletions(-) diff --git a/include/mixer.h b/include/mixer.h index c778bf5d..af232b99 100644 --- a/include/mixer.h +++ b/include/mixer.h @@ -50,12 +50,14 @@ public: void SetFreq(Bitu _freq); void Mix(Bitu _needed); void AddSilence(void); //Fill up until needed - template + template void AddSamples(Bitu len,void * data); void AddSamples_m8(Bitu len,Bit8u * data); void AddSamples_s8(Bitu len,Bit8u * data); void AddSamples_m16(Bitu len,Bit16s * data); void AddSamples_s16(Bitu len,Bit16s * data); + void AddSamples_m16u(Bitu len,Bit16u * data); + void AddSamples_s16u(Bitu len,Bit16u * data); void AddStretched(Bitu len,Bit16s * data); //Strech block up into needed data void FillUp(void); void Enable(bool _yesno); diff --git a/src/hardware/mixer.cpp b/src/hardware/mixer.cpp index 9fac2291..d2f4db11 100644 --- a/src/hardware/mixer.cpp +++ b/src/hardware/mixer.cpp @@ -16,7 +16,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* $Id: mixer.cpp,v 1.40 2006-05-18 11:32:09 qbix79 Exp $ */ +/* $Id: mixer.cpp,v 1.41 2006-08-21 20:08:26 c2woody Exp $ */ /* Remove the sdl code from here and have it handeld in the sdlmain. @@ -178,11 +178,12 @@ void MixerChannel::AddSilence(void) { } } -template +template INLINE void MixerChannel::AddSamples(Bitu len,void * data) { Bits diff[2]; Bit8u * data8=(Bit8u*)data; Bit16s * data16=(Bit16s*)data; + Bit16u * data16u=(Bit16u*)data; Bitu mixpos=mixer.pos+done; freq_index&=MIXER_REMAIN; Bitu pos=0;Bitu new_pos; @@ -204,11 +205,20 @@ thestart: diff[0]=(((Bit8s)(data8[pos] ^ 0x80)) << 8)-last[0]; } } else { - if (stereo) { - diff[0]=data16[pos*2+0]-last[0]; - diff[1]=data16[pos*2+1]-last[1]; + if (signeddata) { + if (stereo) { + diff[0]=data16[pos*2+0]-last[0]; + diff[1]=data16[pos*2+1]-last[1]; + } else { + diff[0]=data16[pos]-last[0]; + } } else { - diff[0]=data16[pos]-last[0]; + if (stereo) { + diff[0]=data16u[pos*2+0]-last[0]; + diff[1]=data16u[pos*2+1]-last[1]; + } else { + diff[0]=data16u[pos]-last[0]; + } } } } @@ -252,16 +262,22 @@ void MixerChannel::AddStretched(Bitu len,Bit16s * data) { }; void MixerChannel::AddSamples_m8(Bitu len,Bit8u * data) { - AddSamples(len,data); + AddSamples(len,data); } void MixerChannel::AddSamples_s8(Bitu len,Bit8u * data) { - AddSamples(len,data); + AddSamples(len,data); } void MixerChannel::AddSamples_m16(Bitu len,Bit16s * data) { - AddSamples(len,data); + AddSamples(len,data); } void MixerChannel::AddSamples_s16(Bitu len,Bit16s * data) { - AddSamples(len,data); + AddSamples(len,data); +} +void MixerChannel::AddSamples_m16u(Bitu len,Bit16u * data) { + AddSamples(len,data); +} +void MixerChannel::AddSamples_s16u(Bitu len,Bit16u * data) { + AddSamples(len,data); } void MixerChannel::FillUp(void) { diff --git a/src/hardware/sblaster.cpp b/src/hardware/sblaster.cpp index dd2efd4b..805bed23 100644 --- a/src/hardware/sblaster.cpp +++ b/src/hardware/sblaster.cpp @@ -16,7 +16,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* $Id: sblaster.cpp,v 1.55 2006-08-16 16:08:24 c2woody Exp $ */ +/* $Id: sblaster.cpp,v 1.56 2006-08-21 20:08:26 c2woody Exp $ */ #include #include @@ -418,7 +418,8 @@ static void GenerateDMASound(Bitu size) { if (sb.dma.stereo) { read=sb.dma.chan->Read(size,(Bit8u *)&sb.dma.buf.b16[sb.dma.remain_size]); Bitu total=read+sb.dma.remain_size; - sb.chan->AddSamples_s16(total>>1,sb.dma.buf.b16); + 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); if (total&1) { sb.dma.remain_size=1; sb.dma.buf.b16[0]=sb.dma.buf.b16[total-1];