From 96985317020741eb19ae5c734b4fa533a1588ea6 Mon Sep 17 00:00:00 2001 From: Jeffrey Pfau Date: Wed, 9 Oct 2013 00:44:31 -0700 Subject: [PATCH] Clean up thread starting, stopping and sound --- src/gba/gba-thread.c | 12 ++++++++++++ src/gba/gba-thread.h | 7 +++++++ src/gba/gba.c | 1 + src/gl-main.c | 16 +++++++++++++++- src/sdl/sdl-audio.c | 1 + 5 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/gba/gba-thread.c b/src/gba/gba-thread.c index 80b4f2c79..a0bf95d00 100644 --- a/src/gba/gba-thread.c +++ b/src/gba/gba-thread.c @@ -65,6 +65,10 @@ static void* _GBAThreadRun(void* context) { } gba.keySource = &threadContext->activeKeys; + if (threadContext->startCallback) { + threadContext->startCallback(threadContext); + } + threadContext->started = 1; pthread_mutex_lock(&threadContext->startMutex); pthread_cond_broadcast(&threadContext->startCond); @@ -78,7 +82,15 @@ static void* _GBAThreadRun(void* context) { ARMRun(&gba.cpu); } } + + if (threadContext->cleanCallback) { + threadContext->cleanCallback(threadContext); + } + GBADeinit(&gba); + + pthread_cond_broadcast(&threadContext->sync.videoFrameAvailableCond); + pthread_cond_broadcast(&threadContext->sync.audioRequiredCond); free(savedata); return 0; diff --git a/src/gba/gba-thread.h b/src/gba/gba-thread.h index c532aaff3..a058b7daa 100644 --- a/src/gba/gba-thread.h +++ b/src/gba/gba-thread.h @@ -3,6 +3,9 @@ #include +struct GBAThread; +typedef void (*ThreadCallback)(struct GBAThread* threadContext); + struct GBAThread { // Output int started; @@ -23,6 +26,10 @@ struct GBAThread { pthread_mutex_t startMutex; pthread_cond_t startCond; + ThreadCallback startCallback; + ThreadCallback cleanCallback; + void* userData; + struct GBASync { int videoFramePending; int videoFrameWait; diff --git a/src/gba/gba.c b/src/gba/gba.c index 996de0327..a9574f72d 100644 --- a/src/gba/gba.c +++ b/src/gba/gba.c @@ -61,6 +61,7 @@ void GBAInit(struct GBA* gba) { void GBADeinit(struct GBA* gba) { GBAMemoryDeinit(&gba->memory); GBAVideoDeinit(&gba->video); + GBAAudioDeinit(&gba->audio); } void GBABoardInit(struct GBABoard* board) { diff --git a/src/gl-main.c b/src/gl-main.c index 96277f610..23871ce8e 100644 --- a/src/gl-main.c +++ b/src/gl-main.c @@ -29,6 +29,8 @@ struct GLSoftwareRenderer { static int _GBASDLInit(struct GLSoftwareRenderer* renderer); static void _GBASDLDeinit(struct GLSoftwareRenderer* renderer); static void _GBASDLRunloop(struct GBAThread* context, struct GLSoftwareRenderer* renderer); +static void _GBASDLStart(struct GBAThread* context); +static void _GBASDLClean(struct GBAThread* context); static const GLint _glVertices[] = { 0, 0, @@ -74,8 +76,10 @@ int main(int argc, char** argv) { context.frameskip = 0; context.sync.videoFrameWait = 0; context.sync.audioWait = 1; + context.startCallback = _GBASDLStart; + context.cleanCallback = _GBASDLClean; + context.userData = &renderer; GBAThreadStart(&context); - renderer.audio.audio = &context.gba->audio; _GBASDLRunloop(&context, &renderer); @@ -158,3 +162,13 @@ static void _GBASDLDeinit(struct GLSoftwareRenderer* renderer) { GBASDLDeinitAudio(&renderer->audio); SDL_Quit(); } + +static void _GBASDLStart(struct GBAThread* threadContext) { + struct GLSoftwareRenderer* renderer = threadContext->userData; + renderer->audio.audio = &threadContext->gba->audio; +} + +static void _GBASDLClean(struct GBAThread* threadContext) { + struct GLSoftwareRenderer* renderer = threadContext->userData; + renderer->audio.audio = 0; +} diff --git a/src/sdl/sdl-audio.c b/src/sdl/sdl-audio.c index 1cabc8e18..057aef45b 100644 --- a/src/sdl/sdl-audio.c +++ b/src/sdl/sdl-audio.c @@ -29,6 +29,7 @@ int GBASDLInitAudio(struct GBASDLAudio* context) { void GBASDLDeinitAudio(struct GBASDLAudio* context) { (void)(context); + SDL_PauseAudio(1); SDL_CloseAudio(); SDL_QuitSubSystem(SDL_INIT_AUDIO); }