From d5f079d78b8a894d03dee0590bfa691962f033f2 Mon Sep 17 00:00:00 2001 From: Dentomologist Date: Wed, 13 Aug 2025 15:43:08 -0700 Subject: [PATCH] DSPEmulator: Extract UnpauseAndUnlock from PauseAndLock Replace call to PauseAndLock(do_lock=false) with new function UnpauseAndUnlock. --- Source/Core/Core/Core.cpp | 2 +- Source/Core/Core/DSPEmulator.h | 1 + Source/Core/Core/HW/DSPHLE/DSPHLE.cpp | 4 ++++ Source/Core/Core/HW/DSPHLE/DSPHLE.h | 1 + Source/Core/Core/HW/DSPLLE/DSPLLE.cpp | 12 ++++++++++++ Source/Core/Core/HW/DSPLLE/DSPLLE.h | 1 + 6 files changed, 20 insertions(+), 1 deletion(-) diff --git a/Source/Core/Core/Core.cpp b/Source/Core/Core/Core.cpp index 06100980167..429d51d3ade 100644 --- a/Source/Core/Core/Core.cpp +++ b/Source/Core/Core/Core.cpp @@ -798,7 +798,7 @@ static void RestoreStateAndUnlock(Core::System& system, const bool unpause_on_un if (!IsRunning(system)) return; - system.GetDSP().GetDSPEmulator()->PauseAndLock(false); + system.GetDSP().GetDSPEmulator()->UnpauseAndUnlock(); ResetRumble(); // CPU is unlocked last because CPU::RestoreStateAndUnlock contains the synchronization mechanism diff --git a/Source/Core/Core/DSPEmulator.h b/Source/Core/Core/DSPEmulator.h index edd64cabad7..59a400ea22a 100644 --- a/Source/Core/Core/DSPEmulator.h +++ b/Source/Core/Core/DSPEmulator.h @@ -23,6 +23,7 @@ public: virtual void DoState(PointerWrap& p) = 0; virtual void PauseAndLock(bool do_lock) = 0; + virtual void UnpauseAndUnlock() = 0; virtual void DSP_WriteMailBoxHigh(bool cpu_mailbox, u16 value) = 0; virtual void DSP_WriteMailBoxLow(bool cpu_mailbox, u16 value) = 0; diff --git a/Source/Core/Core/HW/DSPHLE/DSPHLE.cpp b/Source/Core/Core/HW/DSPHLE/DSPHLE.cpp index e29fbddb714..325d9cc3620 100644 --- a/Source/Core/Core/HW/DSPHLE/DSPHLE.cpp +++ b/Source/Core/Core/HW/DSPHLE/DSPHLE.cpp @@ -245,4 +245,8 @@ u16 DSPHLE::DSP_ReadControlRegister() void DSPHLE::PauseAndLock(bool do_lock) { } + +void DSPHLE::UnpauseAndUnlock() +{ +} } // namespace DSP::HLE diff --git a/Source/Core/Core/HW/DSPHLE/DSPHLE.h b/Source/Core/Core/HW/DSPHLE/DSPHLE.h index 08b5c75e030..7ba5c12b334 100644 --- a/Source/Core/Core/HW/DSPHLE/DSPHLE.h +++ b/Source/Core/Core/HW/DSPHLE/DSPHLE.h @@ -35,6 +35,7 @@ public: bool IsLLE() const override { return false; } void DoState(PointerWrap& p) override; void PauseAndLock(bool do_lock) override; + void UnpauseAndUnlock() override; void DSP_WriteMailBoxHigh(bool cpu_mailbox, u16 value) override; void DSP_WriteMailBoxLow(bool cpu_mailbox, u16 value) override; diff --git a/Source/Core/Core/HW/DSPLLE/DSPLLE.cpp b/Source/Core/Core/HW/DSPLLE/DSPLLE.cpp index 9925dd5354c..9e8ee5baff1 100644 --- a/Source/Core/Core/HW/DSPLLE/DSPLLE.cpp +++ b/Source/Core/Core/HW/DSPLLE/DSPLLE.cpp @@ -305,4 +305,16 @@ void DSPLLE::PauseAndLock(bool do_lock) } } } + +void DSPLLE::UnpauseAndUnlock() +{ + m_dsp_thread_mutex.unlock(); + + if (m_is_dsp_on_thread) + { + // Signal the DSP thread so it can perform any outstanding work now (if any) + m_ppc_event.Wait(); + m_dsp_event.Set(); + } +} } // namespace DSP::LLE diff --git a/Source/Core/Core/HW/DSPLLE/DSPLLE.h b/Source/Core/Core/HW/DSPLLE/DSPLLE.h index 5796fd8fee2..3deb3be039d 100644 --- a/Source/Core/Core/HW/DSPLLE/DSPLLE.h +++ b/Source/Core/Core/HW/DSPLLE/DSPLLE.h @@ -27,6 +27,7 @@ public: bool IsLLE() const override { return true; } void DoState(PointerWrap& p) override; void PauseAndLock(bool do_lock) override; + void UnpauseAndUnlock() override; void DSP_WriteMailBoxHigh(bool cpu_mailbox, u16 value) override; void DSP_WriteMailBoxLow(bool cpu_mailbox, u16 value) override;