HD Pack Builder: Fixed issues with pause icon/break functionality when recording hd packs with debugger opened
This commit is contained in:
parent
35b182b435
commit
5f01ec59f4
6 changed files with 57 additions and 13 deletions
|
@ -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
33
Core/ConsolePauseHelper.h
Normal 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();
|
||||
}
|
||||
}
|
||||
};
|
|
@ -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" />
|
||||
|
|
|
@ -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">
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue