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