HD Pack Builder: Fixed issues with pause icon/break functionality when recording hd packs with debugger opened

This commit is contained in:
Sour 2018-09-14 22:09:51 -04:00
parent 35b182b435
commit 5f01ec59f4
6 changed files with 57 additions and 13 deletions

View file

@ -45,6 +45,7 @@
#include "DebugHud.h"
#include "NotificationManager.h"
#include "HistoryViewer.h"
#include "ConsolePauseHelper.h"
Console::Console(shared_ptr<Console> 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();
}
}

33
Core/ConsolePauseHelper.h Normal file
View file

@ -0,0 +1,33 @@
#pragma once
#include "stdafx.h"
#include "DebugBreakHelper.h"
#include "Console.h"
class ConsolePauseHelper
{
private:
unique_ptr<DebugBreakHelper> _breakHelper;
shared_ptr<Debugger> _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();
}
}
};

View file

@ -528,6 +528,7 @@
<ClInclude Include="BmcHpxx.h" />
<ClInclude Include="BmcK3046.h" />
<ClInclude Include="CityFighter.h" />
<ClInclude Include="ConsolePauseHelper.h" />
<ClInclude Include="ControlDeviceState.h" />
<ClInclude Include="Dance2000.h" />
<ClInclude Include="DragonFighter.h" />

View file

@ -1468,6 +1468,9 @@
<ClInclude Include="StereoCombFilter.h">
<Filter>Nes\APU\Filters</Filter>
</ClInclude>
<ClInclude Include="ConsolePauseHelper.h">
<Filter>Misc</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="stdafx.cpp">

View file

@ -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<int, std::milli>(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()

View file

@ -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<const uint32_t, std::map<uint32_t, vector<HdPackTileInfo*>>> &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();
}