all repos — mgba @ 5ca6888840e010552b9f38501fc5594f8ccdbd73

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