void FifoRecorder::WriteGPCommand(u8* data, u32 size) { if (!m_SkipNextData) { // Assumes data contains all information for the command // Calls FifoRecorder::UseMemory u32 analyzed_size = FifoAnalyzer::AnalyzeCommand(data, FifoAnalyzer::DECODE_RECORD); // Make sure FifoPlayer's command analyzer agrees about the size of the command. if (analyzed_size != size) PanicAlert("FifoRecorder: Expected command to be %i bytes long, we were given %i bytes", analyzed_size, size); // Copy data to buffer size_t currentSize = m_FifoData.size(); m_FifoData.resize(currentSize + size); memcpy(&m_FifoData[currentSize], data, size); } if (m_FrameEnded && m_FifoData.size() > 0) { m_CurrentFrame.fifoData = m_FifoData; { std::lock_guard<std::recursive_mutex> lk(sMutex); // Copy frame to file // The file will be responsible for freeing the memory allocated for each frame's fifoData m_File->AddFrame(m_CurrentFrame); if (m_FinishedCb && m_RequestedRecordingEnd) m_FinishedCb(); } m_CurrentFrame.memoryUpdates.clear(); m_FifoData.clear(); m_FrameEnded = false; } m_SkipNextData = m_SkipFutureData; }
void FifoRecorder::WriteGPCommand(const u8 *data, u32 size) { if (!m_SkipNextData) { m_RecordAnalyzer.AnalyzeGPCommand(data); // Copy data to buffer size_t currentSize = m_FifoData.size(); m_FifoData.resize(currentSize + size); memcpy(&m_FifoData[currentSize], data, size); } if (m_FrameEnded && m_FifoData.size() > 0) { size_t dataSize = m_FifoData.size(); m_CurrentFrame.fifoDataSize = (u32)dataSize; m_CurrentFrame.fifoData = new u8[dataSize]; memcpy(m_CurrentFrame.fifoData, m_FifoData.data(), dataSize); sMutex.lock(); // Copy frame to file // The file will be responsible for freeing the memory allocated for each frame's fifoData m_File->AddFrame(m_CurrentFrame); if (m_FinishedCb && m_RequestedRecordingEnd) m_FinishedCb(); sMutex.unlock(); m_CurrentFrame.memoryUpdates.clear(); m_FifoData.clear(); m_FrameEnded = false; } m_SkipNextData = m_SkipFutureData; }