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