Implement a "Pause Emulation" option & hotkey (#2428)

* Add a "Pause Emulation" option and hotkey

Closes Ryujinx#1604

* Refactoring how pause is handled

* Applied suggested changes from review

* Applied suggested fixes

* Pass correct suspend type to threads for suspend/resume

* Fix NRE after stoping emulation

* Removing SimulateWakeUpMessage call after resuming emulation

* Skip suspending non game process

* Pause the tickCounter in the ExecutionContext

* Refactoring tickCounter pause/resume as suggested

* Fix Config migration to add pause hotkey

* Fixed pausing only application threads

* Fix exiting emulator while paused

* Avoid pause/resume while already paused/resumed

* Cleanup unused code

* Avoid restarting audio if stopping emulation while in pause.

* Added suggested changes

* Fix ConfigurationState
This commit is contained in:
mpnico 2021-09-11 22:08:25 +02:00 committed by GitHub
parent b0e410a828
commit 117e32a6ff
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
21 changed files with 311 additions and 54 deletions

View file

@ -1082,5 +1082,60 @@ namespace Ryujinx.HLE.HOS.Kernel.Process
}
protected override void Destroy() => Context.Dispose();
public KernelResult SetActivity(bool pause)
{
KernelContext.CriticalSection.Enter();
if (State != ProcessState.Exiting && State != ProcessState.Exited)
{
if (pause)
{
if (IsPaused)
{
KernelContext.CriticalSection.Leave();
return KernelResult.InvalidState;
}
lock (_threadingLock)
{
foreach (KThread thread in _threads)
{
thread.Suspend(ThreadSchedState.ProcessPauseFlag);
}
}
IsPaused = true;
}
else
{
if (!IsPaused)
{
KernelContext.CriticalSection.Leave();
return KernelResult.InvalidState;
}
lock (_threadingLock)
{
foreach (KThread thread in _threads)
{
thread.Resume(ThreadSchedState.ProcessPauseFlag);
}
}
IsPaused = false;
}
KernelContext.CriticalSection.Leave();
return KernelResult.Success;
}
KernelContext.CriticalSection.Leave();
return KernelResult.InvalidState;
}
}
}