From c2475f852e3a3b77db22e91d25fc913cd75dda32 Mon Sep 17 00:00:00 2001 From: Glenn Rice Date: Sat, 18 Jun 2011 04:04:48 +0000 Subject: [PATCH] If hardware fails to initialize when emulation starts, die gracefully. This should fix issue 4602. Also don't try to save and load states when the emulator is not running. This should fix most of issu 4600. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@7607 8ced0084-cf51-0410-be5f-012b33b47a6e --- Source/Core/Core/Src/Core.cpp | 6 +++++ Source/Core/DolphinWX/Src/Frame.cpp | 2 +- Source/Core/DolphinWX/Src/FrameTools.cpp | 30 ++++++++++++++++-------- 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/Source/Core/Core/Src/Core.cpp b/Source/Core/Core/Src/Core.cpp index 263b1a4f81..cc86c4385d 100644 --- a/Source/Core/Core/Src/Core.cpp +++ b/Source/Core/Core/Src/Core.cpp @@ -208,7 +208,11 @@ bool Init() void Stop() // - Hammertime! { if (PowerPC::GetState() == PowerPC::CPU_POWERDOWN) + { + if (g_EmuThread.joinable()) + g_EmuThread.join(); return; + } const SCoreStartupParameter& _CoreParameter = SConfig::GetInstance().m_LocalCoreStartupParameter; @@ -346,6 +350,7 @@ void EmuThread() if (!g_video_backend->Initialize(g_pWindowHandle)) { PanicAlert("Failed to initialize video backend!"); + Host_Message(WM_USER_STOP); return; } @@ -357,6 +362,7 @@ void EmuThread() HW::Shutdown(); g_video_backend->Shutdown(); PanicAlert("Failed to initialize DSP emulator!"); + Host_Message(WM_USER_STOP); return; } diff --git a/Source/Core/DolphinWX/Src/Frame.cpp b/Source/Core/DolphinWX/Src/Frame.cpp index 51c1f83f9b..a0081384e0 100644 --- a/Source/Core/DolphinWX/Src/Frame.cpp +++ b/Source/Core/DolphinWX/Src/Frame.cpp @@ -983,7 +983,7 @@ void CFrame::OnKeyUp(wxKeyEvent& event) void CFrame::OnMouse(wxMouseEvent& event) { #if defined(HAVE_X11) && HAVE_X11 - if(Core::GetState() != Core::CORE_UNINITIALIZED) + if (Core::GetState() != Core::CORE_UNINITIALIZED) { if(event.Dragging()) X11Utils::SendMotionEvent(X11Utils::XDisplayFromHandle(GetHandle()), diff --git a/Source/Core/DolphinWX/Src/FrameTools.cpp b/Source/Core/DolphinWX/Src/FrameTools.cpp index e8ba372f55..ab986f6b85 100644 --- a/Source/Core/DolphinWX/Src/FrameTools.cpp +++ b/Source/Core/DolphinWX/Src/FrameTools.cpp @@ -1021,7 +1021,8 @@ void CFrame::DoPause() // Stop the emulation void CFrame::DoStop() { - if (Core::GetState() != Core::CORE_UNINITIALIZED) + if (Core::GetState() != Core::CORE_UNINITIALIZED || + m_RenderParent != NULL) { #if defined __WXGTK__ wxMutexGuiLeave(); @@ -1466,32 +1467,41 @@ void CFrame::OnSaveStateToFile(wxCommandEvent& WXUNUSED (event)) void CFrame::OnLoadLastState(wxCommandEvent& WXUNUSED (event)) { - State::LoadLastSaved(); + if (Core::GetState() != Core::CORE_UNINITIALIZED) + State::LoadLastSaved(); } void CFrame::OnUndoLoadState(wxCommandEvent& WXUNUSED (event)) { - State::UndoLoadState(); + if (Core::GetState() != Core::CORE_UNINITIALIZED) + State::UndoLoadState(); } void CFrame::OnUndoSaveState(wxCommandEvent& WXUNUSED (event)) { - State::UndoSaveState(); + if (Core::GetState() != Core::CORE_UNINITIALIZED) + State::UndoSaveState(); } void CFrame::OnLoadState(wxCommandEvent& event) { - int id = event.GetId(); - int slot = id - IDM_LOADSLOT1 + 1; - State::Load(slot); + if (Core::GetState() != Core::CORE_UNINITIALIZED) + { + int id = event.GetId(); + int slot = id - IDM_LOADSLOT1 + 1; + State::Load(slot); + } } void CFrame::OnSaveState(wxCommandEvent& event) { - int id = event.GetId(); - int slot = id - IDM_SAVESLOT1 + 1; - State::Save(slot); + if (Core::GetState() != Core::CORE_UNINITIALIZED) + { + int id = event.GetId(); + int slot = id - IDM_SAVESLOT1 + 1; + State::Save(slot); + } } void CFrame::OnFrameSkip(wxCommandEvent& event)