1 #pragma once 2 #include "stdafx.h" 3 #include <deque> 4 #include "INotificationListener.h" 5 #include "RewindData.h" 6 #include "IInputProvider.h" 7 #include "IInputRecorder.h" 8 9 class Console; 10 class HistoryViewer; 11 12 enum class RewindState 13 { 14 Stopped = 0, 15 Stopping = 1, 16 Starting = 2, 17 Started = 3, 18 Debugging = 4 19 }; 20 21 class RewindManager : public INotificationListener, public IInputProvider, public IInputRecorder 22 { 23 private: 24 static constexpr int32_t BufferSize = 30; //Number of frames between each save state 25 26 shared_ptr<Console> _console; 27 EmulationSettings* _settings; 28 29 bool _hasHistory; 30 31 std::deque<RewindData> _history; 32 std::deque<RewindData> _historyBackup; 33 RewindData _currentHistory; 34 35 RewindState _rewindState; 36 int32_t _framesToFastForward; 37 38 std::deque<vector<uint32_t>> _videoHistory; 39 vector<vector<uint32_t>> _videoHistoryBuilder; 40 std::deque<int16_t> _audioHistory; 41 vector<int16_t> _audioHistoryBuilder; 42 43 void AddHistoryBlock(); 44 void PopHistory(); 45 46 void Start(bool forDebugger); 47 void Stop(); 48 void ForceStop(); 49 50 void ProcessFrame(void *frameBuffer, uint32_t width, uint32_t height, bool forRewind); 51 bool ProcessAudio(int16_t *soundBuffer, uint32_t sampleCount, uint32_t sampleRate); 52 53 void ClearBuffer(); 54 55 public: 56 RewindManager(shared_ptr<Console> console); 57 virtual ~RewindManager(); 58 59 void ProcessNotification(ConsoleNotificationType type, void* parameter) override; 60 void ProcessEndOfFrame(); 61 62 void RecordInput(vector<shared_ptr<BaseControlDevice>> devices) override; 63 bool SetInput(BaseControlDevice *device) override; 64 65 void StartRewinding(bool forDebugger = false); 66 void StopRewinding(bool forDebugger = false); 67 bool IsRewinding(); 68 bool IsStepBack(); 69 void RewindSeconds(uint32_t seconds); 70 71 bool HasHistory(); 72 void CopyHistory(shared_ptr<HistoryViewer> destHistoryViewer); 73 74 void SendFrame(void *frameBuffer, uint32_t width, uint32_t height, bool forRewind); 75 bool SendAudio(int16_t *soundBuffer, uint32_t sampleCount, uint32_t sampleRate); 76 };