all repos — mgba @ 25cc40f3e16871faf2950bd9e524e5a2d4923501

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 <pthread.h>
 5
 6struct GBAThread;
 7typedef void (*ThreadCallback)(struct GBAThread* threadContext);
 8
 9struct GBAThread {
10	// Output
11	int started;
12	int useDebugger;
13	struct GBA* gba;
14	struct ARMDebugger* debugger;
15
16	// Input
17	struct GBAVideoRenderer* renderer;
18	int fd;
19	const char* fname;
20	int activeKeys;
21	int frameskip;
22
23	// Threading state
24	pthread_t thread;
25
26	pthread_mutex_t startMutex;
27	pthread_cond_t startCond;
28
29	ThreadCallback startCallback;
30	ThreadCallback cleanCallback;
31	void* userData;
32
33	struct GBASync {
34		int videoFramePending;
35		int videoFrameWait;
36		int videoFrameSkip;
37		pthread_mutex_t videoFrameMutex;
38		pthread_cond_t videoFrameAvailableCond;
39		pthread_cond_t videoFrameRequiredCond;
40
41		int audioWait;
42		pthread_cond_t audioRequiredCond;
43	} sync;
44};
45
46int GBAThreadStart(struct GBAThread* threadContext);
47void GBAThreadJoin(struct GBAThread* threadContext);
48struct GBAThread* GBAThreadGetContext(void);
49
50void GBASyncPostFrame(struct GBASync* sync);
51void GBASyncWaitFrameStart(struct GBASync* sync, int frameskip);
52void GBASyncWaitFrameEnd(struct GBASync* sync);
53int GBASyncDrawingFrame(struct GBASync* sync);
54
55void GBASyncProduceAudio(struct GBASync* sync, pthread_mutex_t* mutex);
56void GBASyncConsumeAudio(struct GBASync* sync);
57
58#endif