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 VDir* stateDir;
52 struct VFile* rom;
53 struct VFile* save;
54 struct VFile* bios;
55 struct VFile* patch;
56 const char* fname;
57 int activeKeys;
58 int frameskip;
59
60 // Threading state
61 Thread thread;
62
63 Mutex stateMutex;
64 Condition stateCond;
65 enum ThreadState savedState;
66
67 GBALogHandler logHandler;
68 int logLevel;
69 ThreadCallback startCallback;
70 ThreadCallback cleanCallback;
71 ThreadCallback frameCallback;
72 void* userData;
73
74 struct GBASync sync;
75
76 int rewindBufferSize;
77 int rewindBufferCapacity;
78 int rewindBufferInterval;
79 int rewindBufferNext;
80 struct GBASerializedState** rewindBuffer;
81 int rewindBufferWriteOffset;
82};
83
84void GBAMapOptionsToContext(struct StartupOptions*, struct GBAThread*);
85
86bool GBAThreadStart(struct GBAThread* threadContext);
87bool GBAThreadHasStarted(struct GBAThread* threadContext);
88void GBAThreadEnd(struct GBAThread* threadContext);
89void GBAThreadReset(struct GBAThread* threadContext);
90void GBAThreadJoin(struct GBAThread* threadContext);
91
92void GBAThreadInterrupt(struct GBAThread* threadContext);
93void GBAThreadContinue(struct GBAThread* threadContext);
94
95void GBAThreadPause(struct GBAThread* threadContext);
96void GBAThreadUnpause(struct GBAThread* threadContext);
97bool GBAThreadIsPaused(struct GBAThread* threadContext);
98void GBAThreadTogglePause(struct GBAThread* threadContext);
99struct GBAThread* GBAThreadGetContext(void);
100
101void GBASyncPostFrame(struct GBASync* sync);
102bool GBASyncWaitFrameStart(struct GBASync* sync, int frameskip);
103void GBASyncWaitFrameEnd(struct GBASync* sync);
104bool GBASyncDrawingFrame(struct GBASync* sync);
105
106void GBASyncProduceAudio(struct GBASync* sync, int wait);
107void GBASyncLockAudio(struct GBASync* sync);
108void GBASyncConsumeAudio(struct GBASync* sync);
109
110#endif