all repos — mgba @ b8ecabbaa9657fc496277379fad017a09b79f952

mGBA Game Boy Advance Emulator

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