diff --git a/src/platform/qt/GameController.cpp b/src/platform/qt/GameController.cpp index 98ac7ace2..6493372f9 100644 --- a/src/platform/qt/GameController.cpp +++ b/src/platform/qt/GameController.cpp @@ -32,6 +32,12 @@ GameController::GameController(QObject* parent) }; m_threadContext.frameCallback = [] (GBAThread* context) { GameController* controller = static_cast(context->userData); + controller->m_pauseMutex.lock(); + if (controller->m_pauseAfterFrame) { + GBAThreadPause(context); + controller->m_pauseAfterFrame = false; + } + controller->m_pauseMutex.unlock(); controller->frameAvailable(controller->m_drawContext); }; } @@ -48,6 +54,9 @@ void GameController::loadGame(const QString& path) { delete m_rom; m_rom = 0; } + + m_pauseAfterFrame = false; + m_threadContext.fd = m_rom->handle(); m_threadContext.fname = path.toLocal8Bit().constData(); GBAThreadStart(&m_threadContext); @@ -65,6 +74,13 @@ void GameController::setPaused(bool paused) { } } +void GameController::frameAdvance() { + m_pauseMutex.lock(); + m_pauseAfterFrame = true; + setPaused(false); + m_pauseMutex.unlock(); +} + void GameController::keyPressed(int key) { int mappedKey = 1 << key; m_threadContext.activeKeys |= mappedKey; diff --git a/src/platform/qt/GameController.h b/src/platform/qt/GameController.h index 31bbd642e..e21bcd88c 100644 --- a/src/platform/qt/GameController.h +++ b/src/platform/qt/GameController.h @@ -4,6 +4,7 @@ #include #include #include +#include #include #include "AudioDevice.h" @@ -32,6 +33,7 @@ signals: public slots: void loadGame(const QString& path); void setPaused(bool paused); + void frameAdvance(); void keyPressed(int key); void keyReleased(int key); @@ -45,6 +47,9 @@ private: QFile* m_rom; QFile* m_bios; + + QMutex m_pauseMutex; + bool m_pauseAfterFrame; }; } diff --git a/src/platform/qt/Window.cpp b/src/platform/qt/Window.cpp index aeeaa6a15..45e831fd8 100644 --- a/src/platform/qt/Window.cpp +++ b/src/platform/qt/Window.cpp @@ -119,4 +119,11 @@ void Window::setupMenu(QMenuBar* menubar) { connect(pause, SIGNAL(triggered(bool)), m_controller, SLOT(setPaused(bool))); m_gameActions.append(pause); emulationMenu->addAction(pause); + + QAction* frameAdvance = new QAction(tr("&Next frame"), 0); + frameAdvance->setShortcut(tr("Ctrl+N")); + frameAdvance->setDisabled(true); + connect(frameAdvance, SIGNAL(triggered()), m_controller, SLOT(frameAdvance())); + m_gameActions.append(frameAdvance); + emulationMenu->addAction(frameAdvance); }