SNES: prepare for anti-click

This commit is contained in:
tildearrow 2024-08-31 04:38:21 -05:00
parent 160639cdec
commit 42f7755479
2 changed files with 11 additions and 5 deletions

View file

@ -27,6 +27,8 @@
#define rWrite(a,v) if (!skipRegisterWrites) {writes.push(QueuedWrite(a,v)); if (dumpWrites) {addWrite(a,v);} } #define rWrite(a,v) if (!skipRegisterWrites) {writes.push(QueuedWrite(a,v)); if (dumpWrites) {addWrite(a,v);} }
#define chWrite(c,a,v) {rWrite((a)+(c)*16,v)} #define chWrite(c,a,v) {rWrite((a)+(c)*16,v)}
#define rWriteDelay(a,v,d) if (!skipRegisterWrites) {writes.push(QueuedWrite(a,v,d)); if (dumpWrites) {addWrite(a,v);} }
#define chWriteDelay(c,a,v,d) {rWrite((a)+(c)*16,v,d)}
#define sampleTableAddr(c) (sampleTableBase+(c)*4) #define sampleTableAddr(c) (sampleTableBase+(c)*4)
#define waveTableAddr(c) (sampleTableBase+8*4+(c)*9*16) #define waveTableAddr(c) (sampleTableBase+8*4+(c)*9*16)
@ -77,7 +79,7 @@ void DivPlatformSNES::acquire(short** buf, size_t len) {
dsp.write(w.addr,w.val); dsp.write(w.addr,w.val);
regPool[w.addr&0x7f]=w.val; regPool[w.addr&0x7f]=w.val;
writes.pop(); writes.pop();
delay=(w.addr==0x5c)?8:1; delay=w.delay;
} }
} }
dsp.set_output(out,1); dsp.set_output(out,1);
@ -253,7 +255,7 @@ void DivPlatformSNES::tick(bool sysTick) {
} }
} }
if (koff!=0) { if (koff!=0) {
rWrite(0x5c,koff); rWriteDelay(0x5c,koff,8);
} }
if (writeControl) { if (writeControl) {
unsigned char control=(noiseFreq&0x1f)|(echoOn?0:0x20); unsigned char control=(noiseFreq&0x1f)|(echoOn?0:0x20);
@ -314,7 +316,7 @@ void DivPlatformSNES::tick(bool sysTick) {
} }
} }
if (koff!=0) { if (koff!=0) {
rWrite(0x5c,0); rWriteDelay(0x5c,0,8);
} }
if (kon!=0) { if (kon!=0) {
rWrite(0x4c,kon); rWrite(0x4c,kon);
@ -1027,6 +1029,7 @@ void DivPlatformSNES::setFlags(const DivConfig& flags) {
initEchoMask=flags.getInt("echoMask",0); initEchoMask=flags.getInt("echoMask",0);
interpolationOff=flags.getBool("interpolationOff",false); interpolationOff=flags.getBool("interpolationOff",false);
antiClick=flags.getBool("antiClick",true);
} }
int DivPlatformSNES::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) { int DivPlatformSNES::init(DivEngine* p, int channels, int sugRate, const DivConfig& flags) {

View file

@ -70,6 +70,7 @@ class DivPlatformSNES: public DivDispatch {
bool writeDryVol; bool writeDryVol;
bool echoOn; bool echoOn;
bool interpolationOff; bool interpolationOff;
bool antiClick;
bool initEchoOn; bool initEchoOn;
signed char initEchoVolL; signed char initEchoVolL;
@ -82,8 +83,10 @@ class DivPlatformSNES: public DivDispatch {
struct QueuedWrite { struct QueuedWrite {
unsigned char addr; unsigned char addr;
unsigned char val; unsigned char val;
QueuedWrite(): addr(0), val(0) {} unsigned char delay;
QueuedWrite(unsigned char a, unsigned char v): addr(a), val(v) {} unsigned char padding;
QueuedWrite(): addr(0), val(0), delay(0), padding(0) {}
QueuedWrite(unsigned char a, unsigned char v, unsigned char d=0): addr(a), val(v), delay(d), padding(0) {}
}; };
FixedQueue<QueuedWrite,256> writes; FixedQueue<QueuedWrite,256> writes;