From ce412686b93d20eb0323b6c616ea604f34a77d79 Mon Sep 17 00:00:00 2001 From: Connor McLaughlin Date: Sun, 4 Dec 2022 18:56:51 +1000 Subject: [PATCH] VMManager: Better separate shutdown and close for SPU2 and GS --- pcsx2/CMakeLists.txt | 1 - pcsx2/GS/GS.cpp | 6 +-- pcsx2/SPU2/Global.h | 13 +---- pcsx2/SPU2/Host/Dialogs.cpp | 38 ------------- pcsx2/SPU2/SndOut.h | 2 + pcsx2/SPU2/Wavedump_wav.cpp | 4 +- pcsx2/SPU2/spu2.cpp | 94 ++++++++++++++++----------------- pcsx2/SPU2/spu2.h | 9 ++-- pcsx2/VMManager.cpp | 24 +++++---- pcsx2/gui/SysCoreThread.cpp | 2 +- pcsx2/pcsx2core.vcxproj | 1 - pcsx2/pcsx2core.vcxproj.filters | 3 -- 12 files changed, 74 insertions(+), 123 deletions(-) delete mode 100644 pcsx2/SPU2/Host/Dialogs.cpp diff --git a/pcsx2/CMakeLists.txt b/pcsx2/CMakeLists.txt index 2f90b586a8..74b6683157 100644 --- a/pcsx2/CMakeLists.txt +++ b/pcsx2/CMakeLists.txt @@ -819,7 +819,6 @@ if(PCSX2_CORE) SPU2/Host/Config.cpp SPU2/Host/ConfigDebug.cpp SPU2/Host/ConfigSoundTouch.cpp - SPU2/Host/Dialogs.cpp ) list(APPEND pcsx2SPU2Headers SPU2/Host/Config.h diff --git a/pcsx2/GS/GS.cpp b/pcsx2/GS/GS.cpp index d57f6a2063..374dc2945d 100644 --- a/pcsx2/GS/GS.cpp +++ b/pcsx2/GS/GS.cpp @@ -131,6 +131,9 @@ void GSshutdown() s_hr = E_FAIL; } #endif + + // ensure all screenshots have been saved + GSJoinSnapshotThreads(); } void GSclose() @@ -150,9 +153,6 @@ void GSclose() g_host_display->SetGPUTimingEnabled(false); Host::ReleaseHostDisplay(true); - - // ensure all screenshots have been saved - GSJoinSnapshotThreads(); } static RenderAPI GetAPIForRenderer(GSRendererType renderer) diff --git a/pcsx2/SPU2/Global.h b/pcsx2/SPU2/Global.h index e189ba92c5..eb2a183184 100644 --- a/pcsx2/SPU2/Global.h +++ b/pcsx2/SPU2/Global.h @@ -15,7 +15,7 @@ #pragma once -#define NOMINMAX +#include "PrecompiledHeader.h" extern bool psxmode; @@ -30,15 +30,6 @@ namespace soundtouch class SoundTouch; } -#include "PrecompiledHeader.h" - -////////////////////////////////////////////////////////////////////////// -// Override Win32 min/max macros with the STL's type safe and macro -// free varieties (much safer!) - -#undef min -#undef max - template static __forceinline void Clampify(T& src, T min, T max) { @@ -51,8 +42,6 @@ static __forceinline T GetClamped(T src, T min, T max) return std::min(std::max(src, min), max); } -extern void SysMessage(const char* fmt, ...); -extern void SysMessage(const wchar_t* fmt, ...); // Uncomment to enable debug keys on numpad (0 to 5) //#define DEBUG_KEYS diff --git a/pcsx2/SPU2/Host/Dialogs.cpp b/pcsx2/SPU2/Host/Dialogs.cpp deleted file mode 100644 index de3c899e48..0000000000 --- a/pcsx2/SPU2/Host/Dialogs.cpp +++ /dev/null @@ -1,38 +0,0 @@ -/* PCSX2 - PS2 Emulator for PCs - * Copyright (C) 2002-2020 PCSX2 Dev Team - * - * PCSX2 is free software: you can redistribute it and/or modify it under the terms - * of the GNU Lesser General Public License as published by the Free Software Found- - * ation, either version 3 of the License, or (at your option) any later version. - * - * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with PCSX2. - * If not, see . - */ - -// To be continued... - -#include "PrecompiledHeader.h" -#include "Dialogs.h" -#include -#include - -void SysMessage(const char* fmt, ...) -{ - va_list list; - va_start(list, fmt); - vfprintf(stderr, fmt, list); - va_end(list); -} - -void DspUpdate() -{ -} - -s32 DspLoadLibrary(wchar_t* fileName, int modnum) -{ - return 0; -} diff --git a/pcsx2/SPU2/SndOut.h b/pcsx2/SPU2/SndOut.h index f7f4e4f299..bda7f02548 100644 --- a/pcsx2/SPU2/SndOut.h +++ b/pcsx2/SPU2/SndOut.h @@ -676,7 +676,9 @@ extern bool RecordStart(const std::string* filename); extern void RecordStop(); extern void RecordWrite(const StereoOut16& sample); +#ifndef PCSX2_CORE extern s32 DspLoadLibrary(wchar_t* fileName, int modNum); extern void DspCloseLibrary(); extern int DspProcess(s16* buffer, int samples); extern void DspUpdate(); // to let the Dsp process window messages +#endif diff --git a/pcsx2/SPU2/Wavedump_wav.cpp b/pcsx2/SPU2/Wavedump_wav.cpp index e96d1cf03f..dadc7b2236 100644 --- a/pcsx2/SPU2/Wavedump_wav.cpp +++ b/pcsx2/SPU2/Wavedump_wav.cpp @@ -134,9 +134,9 @@ bool RecordStart(const std::string* filename) { m_wavrecord = nullptr; // not needed, but what the heck. :) if (filename) - SysMessage("SPU2 couldn't open file for recording: %s.\nWavfile capture disabled.", filename->c_str()); + Console.Error("SPU2 couldn't open file for recording: %s.\nWavfile capture disabled.", filename->c_str()); else - SysMessage("SPU2 couldn't open file for recording: audio_recording.wav.\nWavfile capture disabled."); + Console.Error("SPU2 couldn't open file for recording: audio_recording.wav.\nWavfile capture disabled."); return false; } } diff --git a/pcsx2/SPU2/spu2.cpp b/pcsx2/SPU2/spu2.cpp index 654824b768..5da4da79b1 100644 --- a/pcsx2/SPU2/spu2.cpp +++ b/pcsx2/SPU2/spu2.cpp @@ -31,21 +31,19 @@ using namespace Threading; -std::recursive_mutex mtx_SPU2Status; - static int ConsoleSampleRate = 48000; int SampleRate = 48000; static double DeviceSampleRateMultiplier = 1.0; -static bool IsOpened = false; -static bool IsInitialized = false; - u32 lClocks = 0; #ifndef PCSX2_CORE #include "gui/AppCoreThread.h" +static bool IsOpened = false; +std::recursive_mutex mtx_SPU2Status; + void SPU2configure() { ScopedCoreThreadPause paused_core(SystemsMask::System_SPU2); @@ -176,11 +174,10 @@ static void SPU2InternalReset(PS2Modes isRunningPSXMode) } } -s32 SPU2reset(PS2Modes isRunningPSXMode) +void SPU2reset(PS2Modes isRunningPSXMode) { SPU2InternalReset(isRunningPSXMode); SPU2UpdateSampleRate(); - return 0; } void SPU2SetDeviceSampleRateMultiplier(double multiplier) @@ -192,27 +189,9 @@ void SPU2SetDeviceSampleRateMultiplier(double multiplier) SPU2UpdateSampleRate(); } -s32 SPU2init(bool KeepMode) +bool SPU2init() { - assert(regtable[0x400] == nullptr); - - if (IsInitialized) - return 0; - - IsInitialized = true; - - ReadSettings(); - -#ifdef SPU2_LOG - if (AccessLog()) - { - spu2Log = OpenLog(AccessLogFileName.c_str()); - setvbuf(spu2Log, nullptr, _IONBF, 0); - FileLog("SPU2init\n"); - } -#endif - srand((unsigned)time(nullptr)); - + pxAssert(regtable[0x400] == nullptr); spu2regs = (s16*)malloc(0x010000); _spu2mem = (s16*)malloc(0x200000); @@ -225,10 +204,10 @@ s32 SPU2init(bool KeepMode) pcm_cache_data = (PcmCacheEntry*)calloc(pcm_BlockCount, sizeof(PcmCacheEntry)); - if ((spu2regs == nullptr) || (_spu2mem == nullptr) || (pcm_cache_data == nullptr)) + if (!spu2regs || !_spu2mem || !pcm_cache_data) { - SysMessage("SPU2: Error allocating Memory\n"); - return -1; + Console.Error("SPU2: Error allocating Memory"); + return false; } // Patch up a copy of regtable that directly maps "nullptrs" to SPU2 memory. @@ -244,12 +223,8 @@ s32 SPU2init(bool KeepMode) } } - SPU2InternalReset((ConsoleSampleRate == 44100 && KeepMode) ? PS2Modes::PSX : PS2Modes::PS2); - - DMALogOpen(); InitADSR(); - - return 0; + return true; } #if defined(_MSC_VER) && !defined(PCSX2_CORE) @@ -292,18 +267,17 @@ static INT_PTR CALLBACK DebugProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lP return TRUE; } #endif -uptr gsWindowHandle = 0; -s32 SPU2open() +bool SPU2open(PS2Modes isRunningPSXMode) { +#ifndef PCSX2_CORE std::unique_lock lock(mtx_SPU2Status); if (IsOpened) - return 0; + return true; - FileLog("[%10d] SPU2 Open\n", Cycles); +#if defined(_MSC_VER) && defined(PCSX2_DEVBUILD) // Define may not be needed but not tested yet. Better make sure. + IsOpened = true; -#if defined(_MSC_VER) && !defined(PCSX2_CORE) -#ifdef PCSX2_DEVBUILD // Define may not be needed but not tested yet. Better make sure. if (IsDevBuild && VisualDebug()) { if (debugDialogOpen == 0) @@ -321,9 +295,25 @@ s32 SPU2open() #endif #endif - IsOpened = true; + ReadSettings(); + +#ifdef SPU2_LOG + if (AccessLog()) + { + spu2Log = OpenLog(AccessLogFileName.c_str()); + setvbuf(spu2Log, nullptr, _IONBF, 0); + FileLog("SPU2init\n"); + } +#endif + + DMALogOpen(); + + FileLog("[%10d] SPU2 Open\n", Cycles); + lClocks = psxRegs.cycle; + SPU2InternalReset(isRunningPSXMode); + try { SampleRate = static_cast(std::round(static_cast(ConsoleSampleRate) * DeviceSampleRateMultiplier)); @@ -336,19 +326,22 @@ s32 SPU2open() } catch (std::exception& ex) { - fprintf(stderr, "SPU2 Error: Could not initialize device, or something.\nReason: %s", ex.what()); + Console.Error("SPU2 Error: Could not initialize device, or something.\nReason: %s", ex.what()); SPU2close(); - return -1; + return false; } - return 0; + + return true; } void SPU2close() { +#ifndef PCSX2_CORE std::unique_lock lock(mtx_SPU2Status); if (!IsOpened) return; IsOpened = false; +#endif FileLog("[%10d] SPU2 Close\n", Cycles); @@ -361,10 +354,6 @@ void SPU2close() void SPU2shutdown() { - if (!IsInitialized) - return; - IsInitialized = false; - ConLog("* SPU2: Shutting down.\n"); SPU2close(); @@ -396,6 +385,11 @@ void SPU2shutdown() #endif } +bool SPU2IsRunningPSXMode() +{ + return (ConsoleSampleRate == 44100); +} + void SPU2SetOutputPaused(bool paused) { SndBuffer::SetPaused(paused); @@ -408,7 +402,9 @@ static bool lState[6]; void SPU2async(u32 cycles) { +#ifndef PCSX2_CORE DspUpdate(); +#endif TimeUpdate(psxRegs.cycle); diff --git a/pcsx2/SPU2/spu2.h b/pcsx2/SPU2/spu2.h index 561efb0320..f8ebccf88c 100644 --- a/pcsx2/SPU2/spu2.h +++ b/pcsx2/SPU2/spu2.h @@ -19,7 +19,9 @@ #include "IopCounters.h" #include +#ifndef PCSX2_CORE extern std::recursive_mutex mtx_SPU2Status; +#endif enum class PS2Modes { @@ -27,11 +29,12 @@ enum class PS2Modes PSX, }; -s32 SPU2init(bool KeepMode); -s32 SPU2reset(PS2Modes isRunningPSXMode); -s32 SPU2open(); +bool SPU2init(); +void SPU2reset(PS2Modes isRunningPSXMode = PS2Modes::PS2); +bool SPU2open(PS2Modes isRunningPSXMode = PS2Modes::PS2); void SPU2close(); void SPU2shutdown(); +bool SPU2IsRunningPSXMode(); void SPU2SetOutputPaused(bool paused); void SPU2SetDeviceSampleRateMultiplier(double multiplier); void SPU2write(u32 mem, u16 value); diff --git a/pcsx2/VMManager.cpp b/pcsx2/VMManager.cpp index 51683740dd..5b142de710 100644 --- a/pcsx2/VMManager.cpp +++ b/pcsx2/VMManager.cpp @@ -267,11 +267,20 @@ bool VMManager::Internal::InitializeGlobals() return false; } + if (!SPU2init()) + { + Host::ReportErrorAsync("Error", "Failed to initialize SPU2 (SPU2init())."); + return false; + } + return true; } void VMManager::Internal::ReleaseGlobals() { + SPU2shutdown(); + GSshutdown(); + #ifdef _WIN32 CoUninitialize(); #endif @@ -954,16 +963,12 @@ bool VMManager::Initialize(VMBootParameters boot_params) }; Console.WriteLn("Opening SPU2..."); - if (SPU2init(false) != 0 || SPU2open() != 0) + if (!SPU2open()) { Host::ReportErrorAsync("Startup Error", "Failed to initialize SPU2."); - SPU2shutdown(); return false; } - ScopedGuard close_spu2 = []() { - SPU2close(); - SPU2shutdown(); - }; + ScopedGuard close_spu2(&SPU2close); Console.WriteLn("Opening PAD..."); if (PADinit() != 0 || PADopen(g_host_display->GetWindowInfo()) != 0) @@ -1136,10 +1141,8 @@ void VMManager::Shutdown(bool save_resume_state) } USBshutdown(); - SPU2shutdown(); PADshutdown(); DEV9shutdown(); - GSshutdown(); s_state.store(VMState::Shutdown, std::memory_order_release); Host::OnVMDestroyed(); @@ -1715,9 +1718,10 @@ void VMManager::CheckForSPU2ConfigChanges(const Pcsx2Config& old_config) return; } + const bool psxmode = SPU2IsRunningPSXMode(); + SPU2close(); - SPU2shutdown(); - if (SPU2init(true) != 0 || SPU2open() != 0) + if (!SPU2open(psxmode ? PS2Modes::PSX : PS2Modes::PS2)) { Console.Error("(CheckForSPU2ConfigChanges) Failed to reopen SPU2, we'll probably crash :("); return; diff --git a/pcsx2/gui/SysCoreThread.cpp b/pcsx2/gui/SysCoreThread.cpp index f03611daa5..a1edea4946 100644 --- a/pcsx2/gui/SysCoreThread.cpp +++ b/pcsx2/gui/SysCoreThread.cpp @@ -111,7 +111,7 @@ void SysCoreThread::OnSuspendInThread() void SysCoreThread::Start() { - SPU2init(false); + SPU2init(); PADinit(); DEV9init(); USBinit(); diff --git a/pcsx2/pcsx2core.vcxproj b/pcsx2/pcsx2core.vcxproj index b965a8eb82..01afeb688f 100644 --- a/pcsx2/pcsx2core.vcxproj +++ b/pcsx2/pcsx2core.vcxproj @@ -248,7 +248,6 @@ - diff --git a/pcsx2/pcsx2core.vcxproj.filters b/pcsx2/pcsx2core.vcxproj.filters index e01c5611b8..23ec37a1b9 100644 --- a/pcsx2/pcsx2core.vcxproj.filters +++ b/pcsx2/pcsx2core.vcxproj.filters @@ -1214,9 +1214,6 @@ System\Ps2\SPU2 - - System\Ps2\SPU2 - System\Ps2\SPU2