From 3dd268878570c2c48e2be4018ff4d0ea851ece60 Mon Sep 17 00:00:00 2001
From: bunnei <bunneidev@gmail.com>
Date: Mon, 27 Apr 2015 23:13:57 -0400
Subject: [PATCH] Qt: Fix loading a new game without stopping emulation.

---
 src/citra_qt/main.cpp | 39 ++++++++++++++++++++++++---------------
 src/citra_qt/main.h   |  1 +
 2 files changed, 25 insertions(+), 15 deletions(-)

diff --git a/src/citra_qt/main.cpp b/src/citra_qt/main.cpp
index fe1dac622c..5441c17f1a 100644
--- a/src/citra_qt/main.cpp
+++ b/src/citra_qt/main.cpp
@@ -199,6 +199,10 @@ void GMainWindow::OnDisplayTitleBars(bool show)
 void GMainWindow::BootGame(std::string filename) {
     LOG_INFO(Frontend, "Citra starting...\n");
 
+    // Shutdown previous session if the emu thread is still active...
+    if (emu_thread != nullptr)
+        ShutdownGame();
+
     System::Init(render_window);
 
     // Load a game or die...
@@ -217,6 +221,25 @@ void GMainWindow::BootGame(std::string filename) {
     OnStartGame();
 }
 
+void GMainWindow::ShutdownGame() {
+    emu_thread->SetCpuRunning(false);
+
+    emu_thread->ShutdownCpu();
+    emu_thread->WaitForCpuShutdown();
+    emu_thread->Stop();
+
+    delete emu_thread;
+    emu_thread = nullptr;
+
+    System::Shutdown();
+
+    ui.action_Start->setEnabled(true);
+    ui.action_Pause->setEnabled(false);
+    ui.action_Stop->setEnabled(false);
+
+    render_window->hide();
+}
+
 void GMainWindow::OnMenuLoadFile()
 {
     QString filename = QFileDialog::getOpenFileName(this, tr("Load File"), QString(), tr("3DS executable (*.3ds *.3dsx *.elf *.axf *.bin *.cci *.cxi)"));
@@ -249,21 +272,7 @@ void GMainWindow::OnPauseGame()
 }
 
 void GMainWindow::OnStopGame() {
-    emu_thread->SetCpuRunning(false);
-
-    emu_thread->ShutdownCpu();
-    emu_thread->WaitForCpuShutdown();
-    emu_thread->Stop();
-
-    delete emu_thread;
-
-    System::Shutdown();
-
-    ui.action_Start->setEnabled(true);
-    ui.action_Pause->setEnabled(false);
-    ui.action_Stop->setEnabled(false);
-
-    render_window->hide();
+    ShutdownGame();
 }
 
 void GMainWindow::OnOpenHotkeysDialog()
diff --git a/src/citra_qt/main.h b/src/citra_qt/main.h
index 5b33ea9622..1821ae35fe 100644
--- a/src/citra_qt/main.h
+++ b/src/citra_qt/main.h
@@ -41,6 +41,7 @@ public:
 
 private:
     void BootGame(std::string filename);
+    void ShutdownGame();
 
     void closeEvent(QCloseEvent* event) override;
 
-- 
GitLab