diff --git a/Source/Core/Core/FifoPlayer/FifoRecorder.cpp b/Source/Core/Core/FifoPlayer/FifoRecorder.cpp index 3473b4deb4..274b4c1cd0 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,9 +59,15 @@ void FifoRecorder::StartRecording(s32 numFrames, CallbackFunc finishedCb) void FifoRecorder::StopRecording() { + std::lock_guard lk(m_mutex); m_RequestedRecordingEnd = true; } +FifoDataFile* FifoRecorder::GetRecordedFile() const +{ + return m_File.get(); +} + void FifoRecorder::WriteGPCommand(const u8* data, u32 size) { if (!m_SkipNextData) @@ -95,7 +92,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 +150,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 +193,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) { @@ -213,6 +210,11 @@ void FifoRecorder::SetVideoMemory(const u32* bpMem, const u32* cpMem, const u32* FifoRecordAnalyzer::Initialize(cpMem); } +bool FifoRecorder::IsRecording() const +{ + return m_IsRecording; +} + FifoRecorder& FifoRecorder::GetInstance() { return instance; diff --git a/Source/Core/Core/FifoPlayer/FifoRecorder.h b/Source/Core/Core/FifoPlayer/FifoRecorder.h index ba0ab38fa6..7389d3014d 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; // Called from video thread // Must write one full GP command at a time @@ -40,21 +41,21 @@ public: u32 xfRegsSize, const u8* texMem); // Checked once per frame prior to callng EndFrame() - bool IsRecording() const { return m_IsRecording; } + bool IsRecording() const; static FifoRecorder& GetInstance(); 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