src/gba/gba-thread.h (view raw)
1#ifndef GBA_THREAD_H
2#define GBA_THREAD_H
3
4#include "util/common.h"
5
6#include "gba.h"
7#include "gba-input.h"
8
9#include "util/threading.h"
10
11struct GBAThread;
12struct GBAArguments;
13struct GBAOptions;
14typedef void (*ThreadCallback)(struct GBAThread* threadContext);
15typedef void (*LogHandler)(struct GBAThread*, enum GBALogLevel, const char* format, va_list args);
16
17enum ThreadState {
18 THREAD_INITIALIZED = -1,
19 THREAD_RUNNING = 0,
20 THREAD_INTERRUPTED,
21 THREAD_INTERRUPTING,
22 THREAD_PAUSED,
23 THREAD_PAUSING,
24 THREAD_RESETING,
25 THREAD_EXITING,
26 THREAD_SHUTDOWN
27};
28
29struct GBASync {
30 int videoFramePending;
31 bool videoFrameWait;
32 int videoFrameSkip;
33 bool videoFrameOn;
34 Mutex videoFrameMutex;
35 Condition videoFrameAvailableCond;
36 Condition videoFrameRequiredCond;
37
38 bool audioWait;
39 Condition audioRequiredCond;
40 Mutex audioBufferMutex;
41};
42
43struct GBAAVStream {
44 void (*postVideoFrame)(struct GBAAVStream*, struct GBAVideoRenderer* renderer);
45 void (*postAudioFrame)(struct GBAAVStream*, int32_t left, int32_t right);
46};
47
48struct GBAThread {
49 // Output
50 enum ThreadState state;
51 struct GBA* gba;
52 struct ARMCore* cpu;
53
54 // Input
55 struct GBAVideoRenderer* renderer;
56 struct GBASIODriverSet sioDrivers;
57 struct ARMDebugger* debugger;
58 struct VDir* gameDir;
59 struct VDir* stateDir;
60 struct VFile* rom;
61 struct VFile* save;
62 struct VFile* bios;
63 struct VFile* patch;
64 const char* fname;
65 int activeKeys;
66 struct GBAAVStream* stream;
67
68 // Run-time options
69 int frameskip;
70 float fpsTarget;
71 size_t audioBuffers;
72
73 // Threading state
74 Thread thread;
75
76 Mutex stateMutex;
77 Condition stateCond;
78 enum ThreadState savedState;
79
80 LogHandler logHandler;
81 int logLevel;
82 ThreadCallback startCallback;
83 ThreadCallback cleanCallback;
84 ThreadCallback frameCallback;
85 void* userData;
86
87 struct GBASync sync;
88
89 int rewindBufferSize;
90 int rewindBufferCapacity;
91 int rewindBufferInterval;
92 int rewindBufferNext;
93 struct GBASerializedState** rewindBuffer;
94 int rewindBufferWriteOffset;
95};
96
97void GBAMapOptionsToContext(const struct GBAOptions*, struct GBAThread*);
98void GBAMapArgumentsToContext(const struct GBAArguments*, struct GBAThread*);
99
100bool GBAThreadStart(struct GBAThread* threadContext);
101bool GBAThreadHasStarted(struct GBAThread* threadContext);
102void GBAThreadEnd(struct GBAThread* threadContext);
103void GBAThreadReset(struct GBAThread* threadContext);
104void GBAThreadJoin(struct GBAThread* threadContext);
105
106void GBAThreadInterrupt(struct GBAThread* threadContext);
107void GBAThreadContinue(struct GBAThread* threadContext);
108
109void GBAThreadPause(struct GBAThread* threadContext);
110void GBAThreadUnpause(struct GBAThread* threadContext);
111bool GBAThreadIsPaused(struct GBAThread* threadContext);
112void GBAThreadTogglePause(struct GBAThread* threadContext);
113void GBAThreadPauseFromThread(struct GBAThread* threadContext);
114struct GBAThread* GBAThreadGetContext(void);
115
116#ifdef USE_PNG
117void GBAThreadTakeScreenshot(struct GBAThread* threadContext);
118#endif
119
120void GBASyncPostFrame(struct GBASync* sync);
121bool GBASyncWaitFrameStart(struct GBASync* sync, int frameskip);
122void GBASyncWaitFrameEnd(struct GBASync* sync);
123bool GBASyncDrawingFrame(struct GBASync* sync);
124
125void GBASyncSuspendDrawing(struct GBASync* sync);
126void GBASyncResumeDrawing(struct GBASync* sync);
127
128void GBASyncProduceAudio(struct GBASync* sync, bool wait);
129void GBASyncLockAudio(struct GBASync* sync);
130void GBASyncUnlockAudio(struct GBASync* sync);
131void GBASyncConsumeAudio(struct GBASync* sync);
132
133#endif