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