all repos — mgba @ eb81fc3c65f918c16f0e9ddeeb6cbea662155731

mGBA Game Boy Advance Emulator

src/gba/gba-thread.h (view raw)

  1/* Copyright (c) 2013-2014 Jeffrey Pfau
  2 *
  3 * This Source Code Form is subject to the terms of the Mozilla Public
  4 * License, v. 2.0. If a copy of the MPL was not distributed with this
  5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
  6#ifndef GBA_THREAD_H
  7#define GBA_THREAD_H
  8
  9#include "util/common.h"
 10
 11#include "gba.h"
 12#include "gba-input.h"
 13
 14#include "util/threading.h"
 15
 16struct GBAThread;
 17struct GBAArguments;
 18struct GBAOptions;
 19typedef void (*ThreadCallback)(struct GBAThread* threadContext);
 20typedef void (*LogHandler)(struct GBAThread*, enum GBALogLevel, const char* format, va_list args);
 21
 22enum ThreadState {
 23	THREAD_INITIALIZED = -1,
 24	THREAD_RUNNING = 0,
 25	THREAD_INTERRUPTED,
 26	THREAD_INTERRUPTING,
 27	THREAD_PAUSED,
 28	THREAD_PAUSING,
 29	THREAD_RESETING,
 30	THREAD_EXITING,
 31	THREAD_SHUTDOWN,
 32	THREAD_CRASHED
 33};
 34
 35struct GBASync {
 36	int videoFramePending;
 37	bool videoFrameWait;
 38	int videoFrameSkip;
 39	bool videoFrameOn;
 40	Mutex videoFrameMutex;
 41	Condition videoFrameAvailableCond;
 42	Condition videoFrameRequiredCond;
 43
 44	bool audioWait;
 45	Condition audioRequiredCond;
 46	Mutex audioBufferMutex;
 47};
 48
 49struct GBAAVStream {
 50	void (*postVideoFrame)(struct GBAAVStream*, struct GBAVideoRenderer* renderer);
 51	void (*postAudioFrame)(struct GBAAVStream*, int32_t left, int32_t right);
 52};
 53
 54struct GBAThread {
 55	// Output
 56	enum ThreadState state;
 57	struct GBA* gba;
 58	struct ARMCore* cpu;
 59
 60	// Input
 61	struct GBAVideoRenderer* renderer;
 62	struct GBASIODriverSet sioDrivers;
 63	struct ARMDebugger* debugger;
 64	struct VDir* gameDir;
 65	struct VDir* stateDir;
 66	struct VFile* rom;
 67	struct VFile* save;
 68	struct VFile* bios;
 69	struct VFile* patch;
 70	const char* fname;
 71	int activeKeys;
 72	struct GBAAVStream* stream;
 73	struct Configuration* overrides;
 74	enum GBAIdleLoopOptimization idleOptimization;
 75
 76	// Run-time options
 77	int frameskip;
 78	float fpsTarget;
 79	size_t audioBuffers;
 80
 81	// Threading state
 82	Thread thread;
 83
 84	Mutex stateMutex;
 85	Condition stateCond;
 86	enum ThreadState savedState;
 87	int interruptDepth;
 88
 89	LogHandler logHandler;
 90	int logLevel;
 91	ThreadCallback startCallback;
 92	ThreadCallback cleanCallback;
 93	ThreadCallback frameCallback;
 94	void* userData;
 95
 96	struct GBASync sync;
 97
 98	int rewindBufferSize;
 99	int rewindBufferCapacity;
100	int rewindBufferInterval;
101	int rewindBufferNext;
102	struct GBASerializedState** rewindBuffer;
103	int rewindBufferWriteOffset;
104
105	bool skipBios;
106};
107
108void GBAMapOptionsToContext(const struct GBAOptions*, struct GBAThread*);
109void GBAMapArgumentsToContext(const struct GBAArguments*, struct GBAThread*);
110
111bool GBAThreadStart(struct GBAThread* threadContext);
112bool GBAThreadHasStarted(struct GBAThread* threadContext);
113bool GBAThreadHasExited(struct GBAThread* threadContext);
114bool GBAThreadHasCrashed(struct GBAThread* threadContext);
115void GBAThreadEnd(struct GBAThread* threadContext);
116void GBAThreadReset(struct GBAThread* threadContext);
117void GBAThreadJoin(struct GBAThread* threadContext);
118
119bool GBAThreadIsActive(struct GBAThread* threadContext);
120void GBAThreadInterrupt(struct GBAThread* threadContext);
121void GBAThreadContinue(struct GBAThread* threadContext);
122
123void GBAThreadPause(struct GBAThread* threadContext);
124void GBAThreadUnpause(struct GBAThread* threadContext);
125bool GBAThreadIsPaused(struct GBAThread* threadContext);
126void GBAThreadTogglePause(struct GBAThread* threadContext);
127void GBAThreadPauseFromThread(struct GBAThread* threadContext);
128struct GBAThread* GBAThreadGetContext(void);
129
130#ifdef USE_PNG
131void GBAThreadTakeScreenshot(struct GBAThread* threadContext);
132#endif
133
134void GBASyncPostFrame(struct GBASync* sync);
135bool GBASyncWaitFrameStart(struct GBASync* sync, int frameskip);
136void GBASyncWaitFrameEnd(struct GBASync* sync);
137bool GBASyncDrawingFrame(struct GBASync* sync);
138
139void GBASyncSuspendDrawing(struct GBASync* sync);
140void GBASyncResumeDrawing(struct GBASync* sync);
141
142void GBASyncProduceAudio(struct GBASync* sync, bool wait);
143void GBASyncLockAudio(struct GBASync* sync);
144void GBASyncUnlockAudio(struct GBASync* sync);
145void GBASyncConsumeAudio(struct GBASync* sync);
146
147#endif