xbmc
ReversiblePlayback.h
1 /*
2  * Copyright (C) 2016-2018 Team Kodi
3  * This file is part of Kodi - https://kodi.tv
4  *
5  * SPDX-License-Identifier: GPL-2.0-or-later
6  * See LICENSES/README.md for more information.
7  */
8 
9 #pragma once
10 
11 #include "GameLoop.h"
12 #include "IPlayback.h"
13 #include "threads/CriticalSection.h"
14 #include "utils/Observer.h"
15 
16 #include <future>
17 #include <memory>
18 #include <stddef.h>
19 #include <stdint.h>
20 
21 class CDateTime;
22 
23 namespace KODI
24 {
25 namespace GAME
26 {
27 class CGameClient;
28 }
29 
30 namespace RETRO
31 {
32 class CCheevos;
33 class CGUIGameMessenger;
34 class CRPRenderManager;
35 class CSavestateDatabase;
36 class IMemoryStream;
37 
39 {
40 public:
42  CRPRenderManager& renderManager,
43  CCheevos* cheevos,
44  CGUIGameMessenger& guiMessenger,
45  double fps,
46  size_t serializeSize);
47 
48  ~CReversiblePlayback() override;
49 
50  // implementation of IPlayback
51  void Initialize() override;
52  void Deinitialize() override;
53  bool CanPause() const override { return true; }
54  bool CanSeek() const override { return true; }
55  unsigned int GetTimeMs() const override { return m_playTimeMs; }
56  unsigned int GetTotalTimeMs() const override { return m_totalTimeMs; }
57  unsigned int GetCacheTimeMs() const override { return m_cacheTimeMs; }
58  void SeekTimeMs(unsigned int timeMs) override;
59  double GetSpeed() const override;
60  void SetSpeed(double speedFactor) override;
61  void PauseAsync() override;
62  std::string CreateSavestate(bool autosave, const std::string& savestatePath = "") override;
63  bool LoadSavestate(const std::string& savestatePath) override;
64 
65  // implementation of IGameLoopCallback
66  void FrameEvent() override;
67  void RewindEvent() override;
68 
69  // implementation of Observer
70  void Notify(const Observable& obs, const ObservableMessage msg) override;
71 
72 private:
73  void AddFrame();
74  void RewindFrames(uint64_t frames);
75  void AdvanceFrames(uint64_t frames);
76  void UpdatePlaybackStats();
77  void UpdateMemoryStream();
78  void CommitSavestate(bool autosave,
79  const std::string& savePath,
80  const CDateTime& nowUTC,
81  uint64_t timestampFrames);
82 
83  // Construction parameter
84  GAME::CGameClient* const m_gameClient;
85  CRPRenderManager& m_renderManager;
86  CCheevos* const m_cheevos;
87  CGUIGameMessenger& m_guiMessenger;
88 
89  // Gameplay functionality
90  CGameLoop m_gameLoop;
91  std::unique_ptr<IMemoryStream> m_memoryStream;
92  CCriticalSection m_mutex;
93 
94  // Savestate functionality
95  std::unique_ptr<CSavestateDatabase> m_savestateDatabase;
96  std::string m_autosavePath{};
97  std::vector<std::future<void>> m_savestateThreads;
98  CCriticalSection m_savestateMutex;
99 
100  // Playback stats
101  uint64_t m_totalFrameCount;
102  uint64_t m_pastFrameCount;
103  uint64_t m_futureFrameCount;
104  unsigned int m_playTimeMs;
105  unsigned int m_totalTimeMs;
106  unsigned int m_cacheTimeMs;
107 };
108 } // namespace RETRO
109 } // namespace KODI
Renders video frames provided by the game loop.
Definition: RPRenderManager.h:67
Class to send messages to the GUI, if a GUI is present.
Definition: GUIGameMessenger.h:25
Definition: Cheevos.h:26
Definition: IPlayback.h:17
Interface between Kodi and Game add-ons.
Definition: GameClient.h:115
Definition: GameLoop.h:20
Controller configuration window.
Definition: AudioDecoder.h:18
Definition: Observer.h:31
DateTime class, which uses FileTime as it&#39;s base.
Definition: XBDateTime.h:63
Definition: GameLoop.h:36
Definition: Observer.h:44
Definition: ReversiblePlayback.h:38