From 4f5c6cbbb5db7b31fa154d48189858ceeb20d539 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Mon, 9 Sep 2024 19:28:16 -0500 Subject: [PATCH] SoundUnit: emulation changes no longer uses int for the filter stages, instead using short this makes a 1982 design cheaper and more viable --- src/engine/platform/sound/su.cpp | 11 ++++++----- src/engine/platform/sound/su.h | 12 ++++++------ 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/engine/platform/sound/su.cpp b/src/engine/platform/sound/su.cpp index 8d5373cef..505a0d48b 100644 --- a/src/engine/platform/sound/su.cpp +++ b/src/engine/platform/sound/su.cpp @@ -146,7 +146,8 @@ void SoundUnit::NextSample(short* l, short* r) { } } } - fns[i]=ns[i]*chan[i].vol*((chan[i].flags0&8)?4:2); + fns[i]=ns[i]*chan[i].vol; + if (!(chan[i].flags0&8)) fns[i]>>=1; if ((chan[i].flags0&0xe0)!=0) { int ff=chan[i].cutoff; nslow[i]=nslow[i]+(((ff)*nsband[i])>>16); @@ -259,12 +260,12 @@ void SoundUnit::NextSample(short* l, short* r) { // mix if (dsOut) { - tnsL=nsL[dsChannel]<<1; - tnsR=nsR[dsChannel]<<1; + tnsL=nsL[dsChannel]<<3; + tnsR=nsR[dsChannel]<<3; dsChannel=(dsChannel+1)&7; } else { - tnsL=(nsL[0]+nsL[1]+nsL[2]+nsL[3]+nsL[4]+nsL[5]+nsL[6]+nsL[7])>>2; - tnsR=(nsR[0]+nsR[1]+nsR[2]+nsR[3]+nsR[4]+nsR[5]+nsR[6]+nsR[7])>>2; + tnsL=(nsL[0]+nsL[1]+nsL[2]+nsL[3]+nsL[4]+nsL[5]+nsL[6]+nsL[7]); + tnsR=(nsR[0]+nsR[1]+nsR[2]+nsR[3]+nsR[4]+nsR[5]+nsR[6]+nsR[7]); IL1=minval(32767,maxval(-32767,tnsL))>>8; IL2=minval(32767,maxval(-32767,tnsR))>>8; diff --git a/src/engine/platform/sound/su.h b/src/engine/platform/sound/su.h index 8e8009568..091f7de73 100644 --- a/src/engine/platform/sound/su.h +++ b/src/engine/platform/sound/su.h @@ -33,12 +33,12 @@ class SoundUnit { int rcycle[8]; unsigned int lfsr[8]; signed char ns[8]; - int fns[8]; - int nsL[8]; - int nsR[8]; - int nslow[8]; - int nshigh[8]; - int nsband[8]; + short fns[8]; + short nsL[8]; + short nsR[8]; + short nslow[8]; + short nshigh[8]; + short nsband[8]; int tnsL, tnsR; unsigned char ilBufPeriod; unsigned short ilBufPos;