src/platform/qt/GameController.h (view raw)
1/* Copyright (c) 2013-2015 Jeffrey Pfau
2 *
3 * This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6#ifndef QGBA_GAME_CONTROLLER
7#define QGBA_GAME_CONTROLLER
8
9#include <QFile>
10#include <QImage>
11#include <QObject>
12#include <QMutex>
13#include <QString>
14
15#include <memory>
16
17extern "C" {
18#include "gba/cheats.h"
19#include "gba/hardware.h"
20#include "gba/supervisor/thread.h"
21#ifdef BUILD_SDL
22#include "sdl-events.h"
23#endif
24}
25
26struct GBAAudio;
27struct GBAOptions;
28struct GBAVideoSoftwareRenderer;
29struct Configuration;
30
31class QThread;
32
33namespace QGBA {
34
35class AudioProcessor;
36class InputController;
37class MultiplayerController;
38
39class GameController : public QObject {
40Q_OBJECT
41
42public:
43 static const bool VIDEO_SYNC = false;
44 static const bool AUDIO_SYNC = true;
45
46 GameController(QObject* parent = nullptr);
47 ~GameController();
48
49 const uint32_t* drawContext() const { return m_drawContext; }
50 GBAThread* thread() { return &m_threadContext; }
51 GBACheatDevice* cheatDevice() { return &m_cheatDevice; }
52
53 void threadInterrupt();
54 void threadContinue();
55
56 bool isPaused();
57 bool isLoaded() { return m_gameOpen; }
58
59 bool audioSync() const { return m_audioSync; }
60 bool videoSync() const { return m_videoSync; }
61
62 void setInputController(InputController* controller) { m_inputController = controller; }
63 void setOverrides(Configuration* overrides) { m_threadContext.overrides = overrides; }
64
65 void setMultiplayerController(std::shared_ptr<MultiplayerController> controller);
66 std::shared_ptr<MultiplayerController> multiplayerController() { return m_multiplayer; }
67 void clearMultiplayerController();
68
69 void setOverride(const GBACartridgeOverride& override);
70 void clearOverride() { m_threadContext.hasOverride = false; }
71
72 void setOptions(const GBAOptions*);
73
74#ifdef USE_GDB_STUB
75 ARMDebugger* debugger();
76 void setDebugger(ARMDebugger*);
77#endif
78
79signals:
80 void frameAvailable(const uint32_t*);
81 void gameStarted(GBAThread*);
82 void gameStopped(GBAThread*);
83 void gamePaused(GBAThread*);
84 void gameUnpaused(GBAThread*);
85 void gameCrashed(const QString& errorMessage);
86 void gameFailed();
87 void stateLoaded(GBAThread*);
88 void rewound(GBAThread*);
89 void unimplementedBiosCall(int);
90
91 void luminanceValueChanged(int);
92
93 void statusPosted(const QString& message);
94 void postLog(int level, const QString& log);
95
96public slots:
97 void loadGame(const QString& path, bool dirmode = false);
98 void loadBIOS(const QString& path);
99 void setSkipBIOS(bool);
100 void setUseBIOS(bool);
101 void loadPatch(const QString& path);
102 void importSharkport(const QString& path);
103 void exportSharkport(const QString& path);
104 void openGame();
105 void closeGame();
106 void setPaused(bool paused);
107 void reset();
108 void frameAdvance();
109 void setRewind(bool enable, int capacity, int interval);
110 void rewind(int states = 0);
111 void keyPressed(int key);
112 void keyReleased(int key);
113 void clearKeys();
114 void setAudioBufferSamples(int samples);
115 void setFPSTarget(float fps);
116 void loadState(int slot = 0);
117 void saveState(int slot = 0);
118 void setVideoSync(bool);
119 void setAudioSync(bool);
120 void setFrameskip(int);
121 void setVolume(int);
122 void setMute(bool);
123 void setTurbo(bool, bool forced = true);
124 void setTurboSpeed(float ratio = -1);
125 void setAVStream(GBAAVStream*);
126 void clearAVStream();
127 void reloadAudioDriver();
128
129#ifdef USE_PNG
130 void screenshot();
131#endif
132
133 void setLuminanceValue(uint8_t value);
134 uint8_t luminanceValue() const { return m_luxValue; }
135 void setLuminanceLevel(int level);
136 void increaseLuminanceLevel() { setLuminanceLevel(m_luxLevel + 1); }
137 void decreaseLuminanceLevel() { setLuminanceLevel(m_luxLevel - 1); }
138
139 void setRealTime();
140 void setFixedTime(const QDateTime& time);
141 void setFakeEpoch(const QDateTime& time);
142
143 void setLogLevel(int);
144 void enableLogLevel(int);
145 void disableLogLevel(int);
146
147private slots:
148 void crashGame(const QString& crashMessage);
149
150 void pollEvents();
151
152private:
153 void updateKeys();
154 void redoSamples(int samples);
155 void enableTurbo();
156
157 uint32_t* m_drawContext;
158 GBAThread m_threadContext;
159 GBAVideoSoftwareRenderer* m_renderer;
160 GBACheatDevice m_cheatDevice;
161 int m_activeKeys;
162 int m_activeButtons;
163 int m_inactiveKeys;
164 int m_logLevels;
165
166 bool m_gameOpen;
167 bool m_dirmode;
168
169 QString m_fname;
170 QString m_bios;
171 bool m_useBios;
172 QString m_patch;
173
174 QThread* m_audioThread;
175 AudioProcessor* m_audioProcessor;
176
177 QMutex m_pauseMutex;
178 bool m_pauseAfterFrame;
179
180 bool m_videoSync;
181 bool m_audioSync;
182 float m_fpsTarget;
183 bool m_turbo;
184 bool m_turboForced;
185 float m_turboSpeed;
186
187 int m_stateSlot;
188
189 InputController* m_inputController;
190 std::shared_ptr<MultiplayerController> m_multiplayer;
191
192 struct GameControllerLux : GBALuminanceSource {
193 GameController* p;
194 uint8_t value;
195 } m_lux;
196 uint8_t m_luxValue;
197 int m_luxLevel;
198
199 static const int LUX_LEVELS[10];
200
201 struct GameControllerRTC : GBARTCSource {
202 GameController* p;
203 enum {
204 NO_OVERRIDE,
205 FIXED,
206 FAKE_EPOCH
207 } override;
208 int64_t value;
209 } m_rtc;
210};
211
212}
213
214#endif