From 870417d46eaef714f88e89bd6a1594895d0f7a0c Mon Sep 17 00:00:00 2001 From: Jeffrey Pfau Date: Sun, 7 Jun 2015 14:26:43 -0700 Subject: [PATCH] GBA Thread: Fix uses of videoFrameOn being overridden --- src/gba/supervisor/thread.c | 11 ++++++++--- src/gba/supervisor/thread.h | 1 + 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/gba/supervisor/thread.c b/src/gba/supervisor/thread.c index f300a9543..6367d0cd0 100644 --- a/src/gba/supervisor/thread.c +++ b/src/gba/supervisor/thread.c @@ -619,11 +619,12 @@ void GBARunOnThread(struct GBAThread* threadContext, void (*run)(struct GBAThrea } void GBAThreadPause(struct GBAThread* threadContext) { - bool frameOn = true; + bool frameOn = threadContext->sync.videoFrameOn; MutexLock(&threadContext->stateMutex); _waitOnInterrupt(threadContext); if (threadContext->state == THREAD_RUNNING) { _pauseThread(threadContext, false); + threadContext->frameWasOn = frameOn; frameOn = false; } MutexUnlock(&threadContext->stateMutex); @@ -632,15 +633,17 @@ void GBAThreadPause(struct GBAThread* threadContext) { } void GBAThreadUnpause(struct GBAThread* threadContext) { + bool frameOn = threadContext->sync.videoFrameOn; MutexLock(&threadContext->stateMutex); _waitOnInterrupt(threadContext); if (threadContext->state == THREAD_PAUSED || threadContext->state == THREAD_PAUSING) { threadContext->state = THREAD_RUNNING; ConditionWake(&threadContext->stateCond); + frameOn = threadContext->frameWasOn; } MutexUnlock(&threadContext->stateMutex); - _changeVideoSync(&threadContext->sync, true); + _changeVideoSync(&threadContext->sync, frameOn); } bool GBAThreadIsPaused(struct GBAThread* threadContext) { @@ -653,14 +656,16 @@ bool GBAThreadIsPaused(struct GBAThread* threadContext) { } void GBAThreadTogglePause(struct GBAThread* threadContext) { - bool frameOn = true; + bool frameOn = threadContext->sync.videoFrameOn; MutexLock(&threadContext->stateMutex); _waitOnInterrupt(threadContext); if (threadContext->state == THREAD_PAUSED || threadContext->state == THREAD_PAUSING) { threadContext->state = THREAD_RUNNING; ConditionWake(&threadContext->stateCond); + frameOn = threadContext->frameWasOn; } else if (threadContext->state == THREAD_RUNNING) { _pauseThread(threadContext, false); + threadContext->frameWasOn = frameOn; frameOn = false; } MutexUnlock(&threadContext->stateMutex); diff --git a/src/gba/supervisor/thread.h b/src/gba/supervisor/thread.h index 6a66babe9..4f4bc55b7 100644 --- a/src/gba/supervisor/thread.h +++ b/src/gba/supervisor/thread.h @@ -91,6 +91,7 @@ struct GBAThread { Condition stateCond; enum ThreadState savedState; int interruptDepth; + bool frameWasOn; GBALogHandler logHandler; int logLevel;