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 };