diff --git a/3rdparty/libchdr/libchdr b/3rdparty/libchdr/libchdr index d8e4c256e5..42bfcb0ca0 160000 --- a/3rdparty/libchdr/libchdr +++ b/3rdparty/libchdr/libchdr @@ -1 +1 @@ -Subproject commit d8e4c256e5941d9951c3f155b15258b5be714022 +Subproject commit 42bfcb0ca002ebbad13657ac4d71ebad4cc6afa1 diff --git a/pcsx2/Recording/InputRecordingControls.cpp b/pcsx2/Recording/InputRecordingControls.cpp index 1ffd33bd97..ddb68af034 100644 --- a/pcsx2/Recording/InputRecordingControls.cpp +++ b/pcsx2/Recording/InputRecordingControls.cpp @@ -47,12 +47,12 @@ void InputRecordingControls::CheckPauseStatus() g_InputRecording.SetToReplayMode(); switchToReplay = false; } - - if (!pauseEmulation && - g_InputRecording.IsReplaying() && - g_InputRecording.GetFrameCounter() >= g_InputRecording.GetInputRecordingData().GetTotalFrames()) + + if (IsFinishedReplaying() || g_InputRecording.GetFrameCounter() == INT_MAX) { - pauseEmulation = true; + if (!pauseEmulation) + pauseEmulation = true; + StopCapture(); } } g_InputRecording.LogAndRedraw(); @@ -93,15 +93,14 @@ void InputRecordingControls::ResumeCoreThreadIfStarted() void InputRecordingControls::FrameAdvance() { - if (g_InputRecording.IsReplaying() && - g_InputRecording.GetFrameCounter() >= g_InputRecording.GetInputRecordingData().GetTotalFrames()) + if (!IsFinishedReplaying()) { - g_InputRecording.SetToRecordMode(); - return; + frameAdvancing = true; + frame_advance_frame_counter = 0; + Resume(); } - frameAdvancing = true; - frame_advance_frame_counter = 0; - Resume(); + else + g_InputRecording.SetToRecordMode(); } void InputRecordingControls::setFrameAdvanceAmount(int amount) @@ -116,7 +115,7 @@ bool InputRecordingControls::IsFrameAdvancing() bool InputRecordingControls::IsPaused() { - return (emulationCurrentlyPaused && CoreThread.IsOpen() && CoreThread.IsPaused()); + return emulationCurrentlyPaused && CoreThread.IsOpen() && CoreThread.IsPaused(); } void InputRecordingControls::Pause() @@ -127,67 +126,64 @@ void InputRecordingControls::Pause() void InputRecordingControls::PauseImmediately() { - if (CoreThread.IsPaused()) - return; - Pause(); - if (CoreThread.IsOpen() && CoreThread.IsRunning()) + if (!CoreThread.IsPaused()) { - emulationCurrentlyPaused = true; - CoreThread.PauseSelf(); + Pause(); + if (CoreThread.IsOpen() && CoreThread.IsRunning()) + { + emulationCurrentlyPaused = true; + CoreThread.PauseSelf(); + } } } void InputRecordingControls::Resume() { - if (g_InputRecording.IsReplaying() && - g_InputRecording.GetFrameCounter() >= g_InputRecording.GetInputRecordingData().GetTotalFrames()) + if (!IsFinishedReplaying()) { - g_InputRecording.SetToRecordMode(); - return; + pauseEmulation = false; + resumeEmulation = true; } - pauseEmulation = false; - resumeEmulation = true; + else + g_InputRecording.SetToRecordMode(); } void InputRecordingControls::ResumeImmediately() { - if (!CoreThread.IsPaused()) - return; - Resume(); - if (CoreThread.IsPaused() && CoreThread.IsRunning()) + if (CoreThread.IsPaused()) { - emulationCurrentlyPaused = false; - CoreThread.Resume(); + Resume(); + if (CoreThread.IsRunning()) + { + emulationCurrentlyPaused = false; + CoreThread.Resume(); + } } } void InputRecordingControls::TogglePause() { - if (pauseEmulation && - g_InputRecording.IsReplaying() && - g_InputRecording.GetFrameCounter() >= g_InputRecording.GetInputRecordingData().GetTotalFrames()) + if (!pauseEmulation || !IsFinishedReplaying()) { - g_InputRecording.SetToRecordMode(); - return; + resumeEmulation = pauseEmulation; + pauseEmulation = !pauseEmulation; + inputRec::log(pauseEmulation ? "Paused Emulation" : "Resumed Emulation"); } - resumeEmulation = pauseEmulation; - pauseEmulation = !pauseEmulation; - inputRec::log(pauseEmulation ? "Paused Emulation" : "Resumed Emulation"); + else + g_InputRecording.SetToRecordMode(); } void InputRecordingControls::RecordModeToggle() { - if (IsPaused() || - g_InputRecording.IsReplaying() || - g_InputRecording.GetFrameCounter() < g_InputRecording.GetInputRecordingData().GetTotalFrames()) - { - if (g_InputRecording.IsReplaying()) - g_InputRecording.SetToRecordMode(); - else if (g_InputRecording.IsRecording()) - g_InputRecording.SetToReplayMode(); - } + if (g_InputRecording.IsReplaying()) + g_InputRecording.SetToRecordMode(); else if (g_InputRecording.IsRecording()) - switchToReplay = true; + { + if (IsPaused() || g_InputRecording.GetFrameCounter() < g_InputRecording.GetInputRecordingData().GetTotalFrames()) + g_InputRecording.SetToReplayMode(); + else + switchToReplay = true; + } } void InputRecordingControls::Lock(u32 frame) @@ -201,4 +197,22 @@ void InputRecordingControls::Lock(u32 frame) else sMainFrame.StartInputRecording(); } + +bool InputRecordingControls::IsFinishedReplaying() const +{ + return g_InputRecording.IsReplaying() && + g_InputRecording.GetFrameCounter() >= g_InputRecording.GetInputRecordingData().GetTotalFrames(); +} + +void InputRecordingControls::StopCapture() const +{ + if (MainEmuFrame* mainFrame = GetMainFramePtr()) + { + if (mainFrame->IsCapturing()) + { + mainFrame->VideoCaptureToggle(); + inputRec::log("Capture completed"); + } + } +} #endif diff --git a/pcsx2/Recording/InputRecordingControls.h b/pcsx2/Recording/InputRecordingControls.h index afc05f5fad..b0e3b0373f 100644 --- a/pcsx2/Recording/InputRecordingControls.h +++ b/pcsx2/Recording/InputRecordingControls.h @@ -90,6 +90,10 @@ private: bool frameLock = false; // The frame value to use as the frame lock reset point u32 frameLockTracker = 0; + + bool IsFinishedReplaying() const; + // Calls mainEmuFrame's videoCaptureToggle to end a capture if active + void StopCapture() const; }; extern InputRecordingControls g_InputRecordingControls; diff --git a/pcsx2/gui/MainFrame.h b/pcsx2/gui/MainFrame.h index d9f0a685b3..6b0839e902 100644 --- a/pcsx2/gui/MainFrame.h +++ b/pcsx2/gui/MainFrame.h @@ -124,6 +124,8 @@ public: void AppendShortcutToMenuOption(wxMenuItem& item, wxString keyCodeStr); void UpdateStatusBar(); void VideoCaptureToggle(); + bool IsCapturing() const noexcept { return m_capturingVideo; } + #ifndef DISABLE_RECORDING void initializeRecordingMenuItem(MenuIdentifiers menuId, wxString keyCodeStr, bool enable = true); void enableRecordingMenuItem(MenuIdentifiers menuId, bool enable);