From bb89bc8e544ec1ea19592762b922989118ce39ba Mon Sep 17 00:00:00 2001 From: SpinDizzy Date: Tue, 5 Feb 2019 10:03:50 +0000 Subject: [PATCH] Refactor code from previous svn768 (Note : break old savestate compatibility) --- Src/Model3/DSB.cpp | 49 ++++++++++++++++++++------------------------ Src/Model3/DSB.h | 16 ++++++++++----- Src/OSD/SDL/Main.cpp | 2 +- 3 files changed, 34 insertions(+), 33 deletions(-) diff --git a/Src/Model3/DSB.cpp b/Src/Model3/DSB.cpp index f0f0336..f38277b 100644 --- a/Src/Model3/DSB.cpp +++ b/Src/Model3/DSB.cpp @@ -778,6 +778,7 @@ void CDSB2::WriteMPEGFIFO(UINT8 byte) // default to full stereo //mixer_set_stereo_volume(0, 255, 255); //mixer_set_stereo_pan(0, MIXER_PAN_RIGHT, MIXER_PAN_LEFT); + stereo = StereoMode::Stereo; mpegState = ST_IDLE; break; @@ -786,14 +787,7 @@ void CDSB2::WriteMPEGFIFO(UINT8 byte) //mixer_set_stereo_volume(0, 0, 255); //printf("ch 0 mono\n"); //mixer_set_stereo_pan(0, MIXER_PAN_CENTER, MIXER_PAN_CENTER); - - if (byte == 0) { - audioChannel = AudioChannel::stereo; - } - else { - audioChannel = AudioChannel::channel0; - } - + stereo = (byte != 0x00) ? StereoMode::MonoRight : StereoMode::Stereo; mpegState = ST_IDLE; break; @@ -818,12 +812,7 @@ void CDSB2::WriteMPEGFIFO(UINT8 byte) //printf("ch 1 mono\n"); //mixer_set_stereo_volume(0, 255, 0); //mixer_set_stereo_pan(0, MIXER_PAN_CENTER, MIXER_PAN_CENTER); - if (byte == 0) { - audioChannel = AudioChannel::stereo; - } - else { - audioChannel = AudioChannel::channel1; - } + stereo = (byte != 0x00) ? StereoMode::MonoLeft : StereoMode::Stereo; mpegState = ST_IDLE; break; case ST_GOTB4: @@ -1046,23 +1035,26 @@ void CDSB2::RunFrame(INT16 *audioL, INT16 *audioR) // Decode MPEG for this frame INT16 *mpegFill[2] = { &mpegL[retainedSamples], &mpegR[retainedSamples] }; MPEG_Decode(mpegFill, 32000/60-retainedSamples+2); - //retainedSamples = Resampler.UpSampleAndMix(audioL, audioR, mpegL, mpegR, volume[0], volume[1], 44100/60, 32000/60+2, 44100, 32000); - switch (audioChannel) + + INT16 *leftChannelSource = nullptr; + INT16 *rightChannelSource = nullptr; + switch (stereo) { - case AudioChannel::stereo: - retainedSamples = Resampler.UpSampleAndMix(audioL, audioR, mpegL, mpegR, volume[0], volume[1], 44100 / 60, 32000 / 60 + 2, 44100, 32000); - break; - case AudioChannel::channel0: - retainedSamples = Resampler.UpSampleAndMix(audioL, audioR, mpegR, mpegR, volume[0], volume[0], 44100 / 60, 32000 / 60 + 2, 44100, 32000); - break; - case AudioChannel::channel1: - retainedSamples = Resampler.UpSampleAndMix(audioL, audioR, mpegL, mpegL, volume[1], volume[1], 44100 / 60, 32000 / 60 + 2, 44100, 32000); - break; default: - //retainedSamples = Resampler.UpSampleAndMix(audioL, audioR, mpegL, mpegR, volume[0], volume[1], 44100 / 60, 32000 / 60 + 2, 44100, 32000); + case StereoMode::Stereo: + leftChannelSource = mpegL; + rightChannelSource = mpegR; + break; + case StereoMode::MonoLeft: + leftChannelSource = mpegL; + rightChannelSource = mpegL; + break; + case StereoMode::MonoRight: + leftChannelSource = mpegR; + rightChannelSource = mpegR; break; } - + retainedSamples = Resampler.UpSampleAndMix(audioL, audioR, leftChannelSource, rightChannelSource, volume[0], volume[1], 44100/60, 32000/60+2, 44100, 32000); } void CDSB2::Reset(void) @@ -1080,6 +1072,7 @@ void CDSB2::Reset(void) playing = 0; volume[0] = 0xFF; // set to max volume in case we miss the volume commands volume[1] = 0xFF; + stereo = StereoMode::Stereo; // Even if DSB emulation is disabled, must reset to establish valid Z80 state M68KSetContext(&M68K); @@ -1122,6 +1115,7 @@ void CDSB2::SaveState(CBlockFile *StateFile) StateFile->Write(&mpegEnd, sizeof(mpegEnd)); StateFile->Write(&playing, sizeof(playing)); StateFile->Write(volume, sizeof(volume)); + StateFile->Write(&stereo, sizeof(stereo)); // 68K CPU state M68KSetContext(&M68K); @@ -1163,6 +1157,7 @@ void CDSB2::LoadState(CBlockFile *StateFile) StateFile->Read(&mpegEnd, sizeof(mpegEnd)); StateFile->Read(&playing, sizeof(playing)); StateFile->Read(volume, sizeof(volume)); + StateFile->Read(&stereo, sizeof(stereo)); M68KSetContext(&M68K); M68KLoadState(StateFile, "DSB2 68K"); diff --git a/Src/Model3/DSB.h b/Src/Model3/DSB.h index 0c3c3bf..2cb948d 100644 --- a/Src/Model3/DSB.h +++ b/Src/Model3/DSB.h @@ -200,7 +200,7 @@ private: CDSBResampler Resampler; int retainedSamples; // how many MPEG samples carried over from previous frame - // MPEG decode buffers (48KHz, 1/60th second + 2 extra padding samples) + // MPEG decode buffers (48KHz, 1/60th second + 2 extra padding samples) INT16 *mpegL, *mpegR; // DSB memory @@ -233,7 +233,7 @@ private: UINT8 status; UINT8 cmdLatch; UINT8 volume; // 0x00-0x7F - UINT8 stereo; + UINT8 stereo; // Z80 CPU CZ80 Z80; @@ -283,6 +283,14 @@ private: // MPEG decode buffers (48KHz, 1/60th second + 2 extra padding samples) INT16 *mpegL, *mpegR; + // Stereo mode (do not change values because they are used in save states!) + enum StereoMode: uint8_t + { + Stereo = 0, // both channels + MonoLeft = 1, // mono, using left stream as source data + MonoRight = 2 // mono, using right stream as source data + }; + // DSB memory const UINT8 *progROM; // 68K program ROM (passed in from parent object) const UINT8 *mpegROM; // MPEG music ROM @@ -299,6 +307,7 @@ private: int mpegState; int mpegStart, mpegEnd, playing; UINT8 volume[2]; // left, right volume (0x00-0xFF) + StereoMode stereo; // Settings of currently playing stream (may not match the playback register variables above) UINT32 usingLoopStart; // what was last set by MPEG_SetLoop() or MPEG_PlayMemory() @@ -308,9 +317,6 @@ private: // M68K CPU M68KCtx M68K; - - enum class AudioChannel { stereo, channel0, channel1 }; - AudioChannel audioChannel = AudioChannel::stereo; }; diff --git a/Src/OSD/SDL/Main.cpp b/Src/OSD/SDL/Main.cpp index f4df13e..1789cff 100644 --- a/Src/OSD/SDL/Main.cpp +++ b/Src/OSD/SDL/Main.cpp @@ -520,7 +520,7 @@ static void TestPolygonHeaderBits(IEmulator *Emu) Different subsystems output their own blocks. ******************************************************************************/ -static const int STATE_FILE_VERSION = 2; // save state file version +static const int STATE_FILE_VERSION = 3; // save state file version static const int NVRAM_FILE_VERSION = 0; // NVRAM file version static unsigned s_saveSlot = 0; // save state slot #