From 5f01ec59f492033c9467317cbdf36dfc913b1304 Mon Sep 17 00:00:00 2001 From: Sour Date: Fri, 14 Sep 2018 22:09:51 -0400 Subject: [PATCH] HD Pack Builder: Fixed issues with pause icon/break functionality when recording hd packs with debugger opened --- Core/Console.cpp | 13 +++++++++---- Core/ConsolePauseHelper.h | 33 +++++++++++++++++++++++++++++++++ Core/Core.vcxproj | 1 + Core/Core.vcxproj.filters | 3 +++ Core/Debugger.cpp | 12 ++++++++---- Core/HdPackBuilder.cpp | 8 +++----- 6 files changed, 57 insertions(+), 13 deletions(-) create mode 100644 Core/ConsolePauseHelper.h diff --git a/Core/Console.cpp b/Core/Console.cpp index 62e242c7..d6e5c312 100644 --- a/Core/Console.cpp +++ b/Core/Console.cpp @@ -45,6 +45,7 @@ #include "DebugHud.h" #include "NotificationManager.h" #include "HistoryViewer.h" +#include "ConsolePauseHelper.h" Console::Console(shared_ptr master, EmulationSettings* initialSettings) { @@ -1129,7 +1130,8 @@ void Console::LoadHdPack(VirtualFile &romFile, VirtualFile &patchFile) void Console::StartRecordingHdPack(string saveFolder, ScaleFilterType filterType, uint32_t scale, uint32_t flags, uint32_t chrRamBankSize) { - Pause(); + ConsolePauseHelper helper(this); + std::stringstream saveState; SaveState(saveState); @@ -1147,13 +1149,15 @@ void Console::StartRecordingHdPack(string saveFolder, ScaleFilterType filterType } LoadState(saveState); - Resume(); + + _soundMixer->StopAudio(); } void Console::StopRecordingHdPack() { if(_hdPackBuilder) { - Pause(); + ConsolePauseHelper helper(this); + std::stringstream saveState; SaveState(saveState); @@ -1173,7 +1177,8 @@ void Console::StopRecordingHdPack() } LoadState(saveState); - Resume(); + + _soundMixer->StopAudio(); } } diff --git a/Core/ConsolePauseHelper.h b/Core/ConsolePauseHelper.h new file mode 100644 index 00000000..5529a799 --- /dev/null +++ b/Core/ConsolePauseHelper.h @@ -0,0 +1,33 @@ +#pragma once +#include "stdafx.h" +#include "DebugBreakHelper.h" +#include "Console.h" + +class ConsolePauseHelper +{ +private: + unique_ptr _breakHelper; + shared_ptr _debugger; + Console* _console; + +public: + ConsolePauseHelper(Console* console) + { + _console = console; + _debugger = console->GetDebugger(false); + if(_debugger) { + //Pause using the debugger (on the next instruction), when possible + _breakHelper.reset(new DebugBreakHelper(_debugger.get())); + } else { + //If the debugger isn't active, pause at the end of the next frame + console->Pause(); + } + } + + ~ConsolePauseHelper() + { + if(!_debugger) { + _console->Resume(); + } + } +}; \ No newline at end of file diff --git a/Core/Core.vcxproj b/Core/Core.vcxproj index 3d23c961..ac47d34a 100644 --- a/Core/Core.vcxproj +++ b/Core/Core.vcxproj @@ -528,6 +528,7 @@ + diff --git a/Core/Core.vcxproj.filters b/Core/Core.vcxproj.filters index eec872d8..61ff0a0f 100644 --- a/Core/Core.vcxproj.filters +++ b/Core/Core.vcxproj.filters @@ -1468,6 +1468,9 @@ Nes\APU\Filters + + Misc + diff --git a/Core/Debugger.cpp b/Core/Debugger.cpp index 672182dd..48b13b0d 100644 --- a/Core/Debugger.cpp +++ b/Core/Debugger.cpp @@ -703,11 +703,15 @@ bool Debugger::SleepUntilResume(BreakSource source) source = BreakSource::BreakAfterSuspend; } - if((stepCount == 0 || _breakRequested) && !_stopFlag && _suspendCount == 0) { + //Read both values here since they might change while executing the code below + int32_t preventResume = _preventResume; + bool breakRequested = _breakRequested; + + if((stepCount == 0 || breakRequested) && !_stopFlag && _suspendCount == 0) { //Break auto lock = _breakLock.AcquireSafe(); - if(_preventResume == 0) { + if(preventResume == 0) { _console->GetSoundMixer()->StopAudio(); _console->GetNotificationManager()->SendNotification(ConsoleNotificationType::CodeBreak, (void*)(uint64_t)source); ProcessEvent(EventType::CodeBreak); @@ -718,7 +722,7 @@ bool Debugger::SleepUntilResume(BreakSource source) } _executionStopped = true; - _pausedForDebugHelper = _breakRequested; + _pausedForDebugHelper = breakRequested; while(((stepCount == 0 || _breakRequested) && !_stopFlag && _suspendCount == 0) || _preventResume > 0) { std::this_thread::sleep_for(std::chrono::duration(10)); if(stepCount == 0) { @@ -1039,7 +1043,7 @@ bool Debugger::IsExecutionStopped() bool Debugger::IsPauseIconShown() { - return IsExecutionStopped() && !CheckFlag(DebuggerFlags::HidePauseIcon) && _preventResume == 0 && !_pausedForDebugHelper; + return (_executionStopped || _console->IsPaused()) && !CheckFlag(DebuggerFlags::HidePauseIcon) && _preventResume == 0 && !_pausedForDebugHelper; } void Debugger::PreventResume() diff --git a/Core/HdPackBuilder.cpp b/Core/HdPackBuilder.cpp index a1479cbf..9d136bdc 100644 --- a/Core/HdPackBuilder.cpp +++ b/Core/HdPackBuilder.cpp @@ -4,6 +4,7 @@ #include "HdPackBuilder.h" #include "HdNesPack.h" #include "Console.h" +#include "ConsolePauseHelper.h" HdPackBuilder* HdPackBuilder::_instance = nullptr; @@ -350,18 +351,17 @@ void HdPackBuilder::SaveHdPack() void HdPackBuilder::GetChrBankList(uint32_t *banks) { - _instance->_console->Pause(); + ConsolePauseHelper helper(_instance->_console.get()); for(std::pair>> &kvp : _instance->_tilesByChrBankByPalette) { *banks = kvp.first; banks++; } *banks = -1; - _instance->_console->Resume(); } void HdPackBuilder::GetBankPreview(uint32_t bankNumber, uint32_t pageNumber, uint32_t *rgbBuffer) { - _instance->_console->Pause(); + ConsolePauseHelper helper(_instance->_console.get()); for(uint32_t i = 0; i < 128 * 128 * _instance->_hdData.Scale*_instance->_hdData.Scale; i++) { rgbBuffer[i] = 0xFF666666; @@ -410,6 +410,4 @@ void HdPackBuilder::GetBankPreview(uint32_t bankNumber, uint32_t pageNumber, uin } } } - - _instance->_console->Resume(); }