From 16d13e6f63d56ade031ad3e9489659a38fa1353f Mon Sep 17 00:00:00 2001 From: dinkc64 <12570148+dinkc64@users.noreply.github.com> Date: Sat, 26 Mar 2016 00:19:18 +0000 Subject: [PATCH] fix crash issue with the ym2151 savestates when the current samplerate is different from samplerate when the state was made. a compromise was added to prevent breakage of all old savestate files --- src/burn/snd/burn_ym2151.cpp | 38 ++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/src/burn/snd/burn_ym2151.cpp b/src/burn/snd/burn_ym2151.cpp index 8cc3e5f53..46d179c9d 100644 --- a/src/burn/snd/burn_ym2151.cpp +++ b/src/burn/snd/burn_ym2151.cpp @@ -234,21 +234,29 @@ void BurnYM2151Scan(INT32 nAction) return; } - SCAN_VAR(nBurnCurrentYM2151Register); - SCAN_VAR(BurnYM2151Registers); - SCAN_VAR(YM2151Volumes); - SCAN_VAR(YM2151RouteDirs); - SCAN_VAR(nBurnYM2151SoundRate); - SCAN_VAR(nBurnPosition); - SCAN_VAR(nSampleSize); - SCAN_VAR(nFractionalPosition); - SCAN_VAR(nSamplesRendered); + { + // A long time ago these variables were mistakenly scanned for the savestates. + // Recently it was found that this causes crash situations if the samplerate or + // sample size had changed between machines loading the states. + // These dummy variables are to prevent the breaking all states for games that use the 2151. + double dummyYM2151Volumes[2]; + INT32 dummyYM2151RouteDirs[2]; + INT32 dummynBurnYM2151SoundRate; + INT32 dummynBurnPosition; + UINT32 dummynSampleSize; + UINT32 dummynFractionalPosition; + UINT32 dummynSamplesRendered; - BurnYM2151Scan_int(nAction); // Properly scan the YM2151's internal registers + SCAN_VAR(nBurnCurrentYM2151Register); + SCAN_VAR(BurnYM2151Registers); + SCAN_VAR(dummyYM2151Volumes); + SCAN_VAR(dummyYM2151RouteDirs); + SCAN_VAR(dummynBurnYM2151SoundRate); + SCAN_VAR(dummynBurnPosition); + SCAN_VAR(dummynSampleSize); + SCAN_VAR(dummynFractionalPosition); + SCAN_VAR(dummynSamplesRendered); + } - /*if (nAction & ACB_WRITE) { // Restore the operator connections, see burn_ym2151.h BurnYM2151WriteRegister() for more info. - for (INT32 i = 0; i < 0x0100; i++) { - YM2151WriteReg(0, i, BurnYM2151Registers[i]); - } - }*/ + BurnYM2151Scan_int(nAction); // Scan the YM2151's internal registers }