diff --git a/src/frontend/qt_sdl/EmuThread.cpp b/src/frontend/qt_sdl/EmuThread.cpp index c6ac80d7cd..9a7ea6cb72 100644 --- a/src/frontend/qt_sdl/EmuThread.cpp +++ b/src/frontend/qt_sdl/EmuThread.cpp @@ -541,7 +541,8 @@ void EmuThread::handleMessages() break; case msg_EmuStop: - if (msg.stopExternal) emuInstance->nds->Stop(); + if (msg.param.value()) + emuInstance->nds->Stop(); emuStatus = emuStatus_Paused; emuActive = false; @@ -574,6 +575,26 @@ void EmuThread::handleMessages() emuInstance->deinitOpenGL(); useOpenGL = false; break; + + case msg_BootROM: + bootResult = 0; + if (!emuInstance->loadROM(msg.param.value(), true)) + break; + + assert(emuInstance->nds != nullptr); + emuInstance->nds->Start(); + bootResult = 1; + break; + + case msg_BootFirmware: + bootResult = 0; + if (!emuInstance->bootToMenu()) + break; + + assert(emuInstance->nds != nullptr); + emuInstance->nds->Start(); + bootResult = 1; + break; } msgSemaphore.release(); @@ -626,7 +647,7 @@ void EmuThread::emuTogglePause() void EmuThread::emuStop(bool external) { - sendMessage({.type = msg_EmuStop, .stopExternal = external}); + sendMessage({.type = msg_EmuStop, .param = external}); waitMessage(); } @@ -660,6 +681,32 @@ bool EmuThread::emuIsActive() return emuActive; } +int EmuThread::bootROM(QStringList filename) +{ + sendMessage(msg_EmuPause); + sendMessage({.type = msg_BootROM, .param = filename}); + waitMessage(2); + if (!bootResult) + return bootResult; + + sendMessage(msg_EmuRun); + waitMessage(); + return bootResult; +} + +int EmuThread::bootFirmware() +{ + sendMessage(msg_EmuPause); + sendMessage(msg_BootFirmware); + waitMessage(2); + if (!bootResult) + return bootResult; + + sendMessage(msg_EmuRun); + waitMessage(); + return bootResult; +} + void EmuThread::updateRenderer() { if (videoRenderer != lastVideoRenderer) diff --git a/src/frontend/qt_sdl/EmuThread.h b/src/frontend/qt_sdl/EmuThread.h index f728788b6c..612f79208c 100644 --- a/src/frontend/qt_sdl/EmuThread.h +++ b/src/frontend/qt_sdl/EmuThread.h @@ -68,15 +68,15 @@ class EmuThread : public QThread msg_InitGL, msg_DeInitGL, + + msg_BootROM, + msg_BootFirmware, }; struct Message { MessageType type; - union - { - bool stopExternal; - }; + QVariant param; }; void sendMessage(Message msg); @@ -100,6 +100,9 @@ class EmuThread : public QThread void emuFrameStep(); void emuReset(); + int bootROM(QStringList filename); + int bootFirmware(); + bool emuIsRunning(); bool emuIsActive(); @@ -153,6 +156,8 @@ class EmuThread : public QThread constexpr static int emuPauseStackPauseThreshold = 1; int emuPauseStack; + int bootResult = 0; + QMutex msgMutex; QSemaphore msgSemaphore; QQueue msgQueue; diff --git a/src/frontend/qt_sdl/Window.cpp b/src/frontend/qt_sdl/Window.cpp index 0280e7612d..6f2f86a954 100644 --- a/src/frontend/qt_sdl/Window.cpp +++ b/src/frontend/qt_sdl/Window.cpp @@ -1211,24 +1211,15 @@ void MainWindow::updateCartInserted(bool gba) void MainWindow::onOpenFile() { - emuThread->emuPause(); - if (!verifySetup()) - { - emuThread->emuUnpause(); return; - } QStringList file = pickROM(false); if (file.isEmpty()) - { - emuThread->emuUnpause(); return; - } - - if (!emuInstance->loadROM(file, true)) + + if (!emuThread->bootROM(file)) { - emuThread->emuUnpause(); return; } @@ -1237,10 +1228,6 @@ void MainWindow::onOpenFile() recentFileList.prepend(filename); updateRecentFilesMenu(); - assert(emuInstance->nds != nullptr); - emuInstance->nds->Start(); - emuThread->emuRun(); - updateCartInserted(false); } @@ -1310,24 +1297,15 @@ void MainWindow::onClickRecentFile() QAction *act = (QAction *)sender(); QString filename = act->data().toString(); - emuThread->emuPause(); - if (!verifySetup()) - { - emuThread->emuUnpause(); return; - } const QStringList file = splitArchivePath(filename, true); if (file.isEmpty()) - { - emuThread->emuUnpause(); return; - } - - if (!emuInstance->loadROM(file, true)) + + if (!emuThread->bootROM(file)) { - emuThread->emuUnpause(); return; } @@ -1335,34 +1313,19 @@ void MainWindow::onClickRecentFile() recentFileList.prepend(filename); updateRecentFilesMenu(); - assert(emuInstance->nds != nullptr); - emuInstance->nds->Start(); - emuThread->emuRun(); - updateCartInserted(false); } void MainWindow::onBootFirmware() { - emuThread->emuPause(); - if (!verifySetup()) - { - emuThread->emuUnpause(); return; - } - if (!emuInstance->bootToMenu()) + if (!emuThread->bootFirmware()) { - // TODO: better error reporting? QMessageBox::critical(this, "melonDS", "This firmware is not bootable."); - emuThread->emuUnpause(); return; } - - assert(emuInstance->nds != nullptr); - emuInstance->nds->Start(); - emuThread->emuRun(); } void MainWindow::onInsertCart()