From 1325664d25fde20ae5b94cbbc8ae2624c9a3bc55 Mon Sep 17 00:00:00 2001 From: tildearrow Date: Sat, 29 Jul 2023 17:12:46 -0500 Subject: [PATCH] SNES: fix possible sample corruption when toggling echo --- src/engine/platform/opll.cpp | 9 +++++++++ src/engine/platform/opll.h | 1 + src/engine/platform/snes.cpp | 8 +++++--- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/engine/platform/opll.cpp b/src/engine/platform/opll.cpp index b0012c224..593b659c3 100644 --- a/src/engine/platform/opll.cpp +++ b/src/engine/platform/opll.cpp @@ -392,6 +392,15 @@ void DivPlatformOPLL::commitState(int ch, DivInstrument* ins) { } } +void DivPlatformOPLL::switchMode(bool mode) { + if (mode==properDrums) return; + if (mode) { + + } else { + + } +} + int DivPlatformOPLL::dispatch(DivCommand c) { switch (c.cmd) { case DIV_CMD_NOTE_ON: { diff --git a/src/engine/platform/opll.h b/src/engine/platform/opll.h index 7333f7298..f5d79b39c 100644 --- a/src/engine/platform/opll.h +++ b/src/engine/platform/opll.h @@ -75,6 +75,7 @@ class DivPlatformOPLL: public DivDispatch { int octave(int freq); int toFreq(int freq); void commitState(int ch, DivInstrument* ins); + void switchMode(bool mode); friend void putDispatchChip(void*,int); friend void putDispatchChan(void*,int,int); diff --git a/src/engine/platform/snes.cpp b/src/engine/platform/snes.cpp index 43401ebcb..a03121613 100644 --- a/src/engine/platform/snes.cpp +++ b/src/engine/platform/snes.cpp @@ -733,6 +733,7 @@ int DivPlatformSNES::getRegisterPoolSize() { void DivPlatformSNES::initEcho() { unsigned char esa=0xf8-(echoDelay<<3); + unsigned char control=(noiseFreq&0x1f)|(echoOn?0:0x20); if (echoOn) { rWrite(0x6d,esa); rWrite(0x7d,echoDelay); @@ -742,13 +743,14 @@ void DivPlatformSNES::initEcho() { for (int i=0; i<8; i++) { rWrite(0x0f+(i<<4),echoFIR[i]); } + rWrite(0x6c,control); } else { - rWrite(0x6d,0); - rWrite(0x7d,0); rWrite(0x2c,0); rWrite(0x3c,0); + rWrite(0x6c,control); + rWrite(0x7d,0); + rWrite(0x6d,0xff); } - writeControl=true; } void DivPlatformSNES::reset() {