start moving ROM/firmware loading to the emuthread to avoid cursed bugs
This commit is contained in:
parent
1428bfb2cf
commit
82f38f0b7a
|
@ -541,7 +541,8 @@ void EmuThread::handleMessages()
|
|||
break;
|
||||
|
||||
case msg_EmuStop:
|
||||
if (msg.stopExternal) emuInstance->nds->Stop();
|
||||
if (msg.param.value<bool>())
|
||||
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<QStringList>(), 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)
|
||||
|
|
|
@ -68,15 +68,15 @@ public:
|
|||
|
||||
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 @@ public:
|
|||
void emuFrameStep();
|
||||
void emuReset();
|
||||
|
||||
int bootROM(QStringList filename);
|
||||
int bootFirmware();
|
||||
|
||||
bool emuIsRunning();
|
||||
bool emuIsActive();
|
||||
|
||||
|
@ -153,6 +156,8 @@ private:
|
|||
constexpr static int emuPauseStackPauseThreshold = 1;
|
||||
int emuPauseStack;
|
||||
|
||||
int bootResult = 0;
|
||||
|
||||
QMutex msgMutex;
|
||||
QSemaphore msgSemaphore;
|
||||
QQueue<Message> msgQueue;
|
||||
|
|
|
@ -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()
|
||||
|
|
Loading…
Reference in New Issue