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