From 484618ca4c5f59f62a73018051ca6397472ea35e Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Sun, 9 Apr 2017 19:13:13 -0700 Subject: [PATCH] Core: Restore sleep callback --- CHANGES | 1 + include/mgba/core/interface.h | 5 +---- include/mgba/core/thread.h | 1 + include/mgba/internal/gba/gba.h | 1 - src/core/thread.c | 11 +++++++++++ src/gba/gba.c | 11 ++++++----- src/platform/qt/GameController.cpp | 10 ++++------ 7 files changed, 24 insertions(+), 16 deletions(-) diff --git a/CHANGES b/CHANGES index 4607a27b8..25720a77c 100644 --- a/CHANGES +++ b/CHANGES @@ -85,6 +85,7 @@ Misc: - FFmpeg: Return false if a file fails to open - FFmpeg: Force MP4 files to YUV420P - Qt: Make "Mute" able to be bound to a key + - Core: Restore sleep callback 0.5.2: (2016-12-31) Bugfixes: diff --git a/include/mgba/core/interface.h b/include/mgba/core/interface.h index 933e8d2d5..3a702c1f1 100644 --- a/include/mgba/core/interface.h +++ b/include/mgba/core/interface.h @@ -38,6 +38,7 @@ struct mCoreCallbacks { void (*videoFrameStarted)(void* context); void (*videoFrameEnded)(void* context); void (*coreCrashed)(void* context); + void (*sleep)(void* context); }; DECLARE_VECTOR(mCoreCallbacksList, struct mCoreCallbacks); @@ -53,10 +54,6 @@ struct mKeyCallback { uint16_t (*readKeys)(struct mKeyCallback*); }; -struct mStopCallback { - void (*stop)(struct mStopCallback*); -}; - struct mRotationSource { void (*sample)(struct mRotationSource*); diff --git a/include/mgba/core/thread.h b/include/mgba/core/thread.h index f586bfd3b..3c7a168e9 100644 --- a/include/mgba/core/thread.h +++ b/include/mgba/core/thread.h @@ -62,6 +62,7 @@ struct mCoreThread { ThreadCallback resetCallback; ThreadCallback cleanCallback; ThreadCallback frameCallback; + ThreadCallback sleepCallback; void* userData; void (*run)(struct mCoreThread*); diff --git a/include/mgba/internal/gba/gba.h b/include/mgba/internal/gba/gba.h index e5b1f8899..732a4aba6 100644 --- a/include/mgba/internal/gba/gba.h +++ b/include/mgba/internal/gba/gba.h @@ -99,7 +99,6 @@ struct GBA { struct mAVStream* stream; struct mKeyCallback* keyCallback; - struct mStopCallback* stopCallback; struct mCoreCallbacksList coreCallbacks; enum GBAIdleLoopOptimization idleOptimization; diff --git a/src/core/thread.c b/src/core/thread.c index 686330615..54f83f39f 100644 --- a/src/core/thread.c +++ b/src/core/thread.c @@ -120,6 +120,16 @@ void _crashed(void* context) { _changeState(thread, THREAD_CRASHED, true); } +void _sleep(void* context) { + struct mCoreThread* thread = context; + if (!thread) { + return; + } + if (thread->sleepCallback) { + thread->sleepCallback(thread); + } +} + static THREAD_ENTRY _mCoreThreadRun(void* context) { struct mCoreThread* threadContext = context; #ifdef USE_PTHREADS @@ -143,6 +153,7 @@ static THREAD_ENTRY _mCoreThreadRun(void* context) { .videoFrameStarted = _frameStarted, .videoFrameEnded = _frameEnded, .coreCrashed = _crashed, + .sleep = _sleep, .context = threadContext }; core->addCoreCallbacks(core, &callbacks); diff --git a/src/gba/gba.c b/src/gba/gba.c index c7059df12..25ff7670a 100644 --- a/src/gba/gba.c +++ b/src/gba/gba.c @@ -89,8 +89,6 @@ static void GBAInit(void* cpu, struct mCPUComponent* component) { gba->stream = NULL; gba->keyCallback = NULL; - gba->stopCallback = NULL; - gba->stopCallback = NULL; mCoreCallbacksListInit(&gba->coreCallbacks, 0); gba->biosChecksum = GBAChecksum(gba->memory.bios, SIZE_BIOS); @@ -450,11 +448,14 @@ void GBAHalt(struct GBA* gba) { } void GBAStop(struct GBA* gba) { - if (!gba->stopCallback) { - return; + size_t c; + for (c = 0; c < mCoreCallbacksListSize(&gba->coreCallbacks); ++c) { + struct mCoreCallbacks* callbacks = mCoreCallbacksListGetPointer(&gba->coreCallbacks, c); + if (callbacks->sleep) { + callbacks->sleep(callbacks->context); + } } gba->cpu->nextEvent = gba->cpu->cycles; - gba->stopCallback->stop(gba->stopCallback); } void GBADebug(struct GBA* gba, uint16_t flags) { diff --git a/src/platform/qt/GameController.cpp b/src/platform/qt/GameController.cpp index e64243682..72f7b75b1 100644 --- a/src/platform/qt/GameController.cpp +++ b/src/platform/qt/GameController.cpp @@ -217,18 +217,16 @@ GameController::GameController(QObject* parent) } }; - // TODO: Put back - /*m_threadContext.stopCallback = [](mCoreThread* context) { + m_threadContext.sleepCallback = [](mCoreThread* context) { if (!context) { - return false; + return; } GameController* controller = static_cast(context->userData); if (!mCoreSaveState(context->core, 0, controller->m_saveStateFlags)) { - return false; + return; } QMetaObject::invokeMethod(controller, "closeGame"); - return true; - };*/ + }; m_threadContext.logger.d.log = [](mLogger* logger, int category, enum mLogLevel level, const char* format, va_list args) { mThreadLogger* logContext = reinterpret_cast(logger);