diff --git a/Source/Core/Core/FifoPlayer/FifoRecorder.cpp b/Source/Core/Core/FifoPlayer/FifoRecorder.cpp index 3473b4deb4..f4465e273f 100644 --- a/Source/Core/Core/FifoPlayer/FifoRecorder.cpp +++ b/Source/Core/Core/FifoPlayer/FifoRecorder.cpp @@ -6,7 +6,6 @@ #include #include -#include #include "Common/MsgHandler.h" #include "Common/Thread.h" @@ -16,24 +15,16 @@ #include "Core/HW/Memmap.h" static FifoRecorder instance; -static std::recursive_mutex sMutex; FifoRecorder::FifoRecorder() = default; -FifoRecorder::~FifoRecorder() -{ - m_IsRecording = false; -} - void FifoRecorder::StartRecording(s32 numFrames, CallbackFunc finishedCb) { - std::lock_guard lk(sMutex); - - delete m_File; + std::lock_guard lk(m_mutex); FifoAnalyzer::Init(); - m_File = new FifoDataFile; + m_File = std::make_unique(); // TODO: This, ideally, would be deallocated when done recording. // However, care needs to be taken since global state @@ -68,6 +59,7 @@ void FifoRecorder::StartRecording(s32 numFrames, CallbackFunc finishedCb) void FifoRecorder::StopRecording() { + std::lock_guard lk(m_mutex); m_RequestedRecordingEnd = true; } @@ -95,7 +87,7 @@ void FifoRecorder::WriteGPCommand(const u8* data, u32 size) m_CurrentFrame.fifoData = m_FifoData; { - std::lock_guard lk(sMutex); + std::lock_guard lk(m_mutex); // Copy frame to file // The file will be responsible for freeing the memory allocated for each frame's fifoData @@ -153,7 +145,7 @@ void FifoRecorder::UseMemory(u32 address, u32 size, MemoryUpdate::Type type, boo void FifoRecorder::EndFrame(u32 fifoStart, u32 fifoEnd) { // m_IsRecording is assumed to be true at this point, otherwise this function would not be called - std::lock_guard lk(sMutex); + std::lock_guard lk(m_mutex); m_FrameEnded = true; @@ -196,7 +188,7 @@ void FifoRecorder::EndFrame(u32 fifoStart, u32 fifoEnd) void FifoRecorder::SetVideoMemory(const u32* bpMem, const u32* cpMem, const u32* xfMem, const u32* xfRegs, u32 xfRegsSize, const u8* texMem) { - std::lock_guard lk(sMutex); + std::lock_guard lk(m_mutex); if (m_File) { diff --git a/Source/Core/Core/FifoPlayer/FifoRecorder.h b/Source/Core/Core/FifoPlayer/FifoRecorder.h index ba0ab38fa6..3f819f1b65 100644 --- a/Source/Core/Core/FifoPlayer/FifoRecorder.h +++ b/Source/Core/Core/FifoPlayer/FifoRecorder.h @@ -4,6 +4,8 @@ #pragma once +#include +#include #include #include "Core/FifoPlayer/FifoDataFile.h" @@ -14,12 +16,11 @@ public: typedef void (*CallbackFunc)(void); FifoRecorder(); - ~FifoRecorder(); void StartRecording(s32 numFrames, CallbackFunc finishedCb); void StopRecording(); - FifoDataFile* GetRecordedFile() const { return m_File; } + FifoDataFile* GetRecordedFile() const { return m_File.get(); } // Called from video thread // Must write one full GP command at a time @@ -46,15 +47,15 @@ public: private: // Accessed from both GUI and video threads + std::recursive_mutex m_mutex; // True if video thread should send data - volatile bool m_IsRecording = false; + bool m_IsRecording = false; // True if m_IsRecording was true during last frame - volatile bool m_WasRecording = false; - volatile bool m_RequestedRecordingEnd = false; - volatile s32 m_RecordFramesRemaining = 0; - volatile CallbackFunc m_FinishedCb = nullptr; - - FifoDataFile* volatile m_File = nullptr; + bool m_WasRecording = false; + bool m_RequestedRecordingEnd = false; + s32 m_RecordFramesRemaining = 0; + CallbackFunc m_FinishedCb = nullptr; + std::unique_ptr m_File; // Accessed only from video thread