1. Proper shutdown, hopefully no crash anymore (Continuation of skidau's work)

2. Connect/Disconnect Wiimote on the fly, no need to pause game

PS: Toggling full screen by ESC in DX9 doesn't work yet, it will close Dolphin instead at the time.

git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4754 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
ayuanx
2009-12-30 09:00:43 +00:00
parent f97b782551
commit 97779ea295
7 changed files with 125 additions and 112 deletions

View File

@ -102,9 +102,7 @@ SCoreStartupParameter g_CoreStartupParameter;
// This event is set when the emuthread starts.
Common::Event emuThreadGoing;
Common::Event cpuRunloopQuit;
Common::Event gpuShutdownCall;
// Display messages and return values
// Formatted stop message
@ -300,16 +298,6 @@ THREAD_RETURN CpuThread(void *pArg)
CCPU::Run();
cpuRunloopQuit.Set();
#ifdef _WIN32
gpuShutdownCall.Wait();
// Call video shutdown from the video thread in single core mode, which is the cpuThread
if (!_CoreParameter.bCPUThread)
Plugins.ShutdownVideoPlugin();
#endif
gpuShutdownCall.Shutdown();
return 0;
}
@ -319,7 +307,6 @@ THREAD_RETURN CpuThread(void *pArg)
THREAD_RETURN EmuThread(void *pArg)
{
cpuRunloopQuit.Init();
gpuShutdownCall.Init();
Common::SetCurrentThreadName("Emuthread - starting");
const SCoreStartupParameter& _CoreParameter = SConfig::GetInstance().m_LocalCoreStartupParameter;
@ -472,6 +459,7 @@ THREAD_RETURN EmuThread(void *pArg)
// then we lose the powerdown check. ... unless powerdown sends a message :P
while (PowerPC::GetState() != PowerPC::CPU_POWERDOWN)
{
Host_UpdateMainFrame();
if (Callback_PeekMessages)
Callback_PeekMessages();
Common::SleepCurrentThread(20);
@ -483,33 +471,9 @@ THREAD_RETURN EmuThread(void *pArg)
#endif
}
NOTICE_LOG(CONSOLE, "%s", StopMessage(false, "Stop() and Video Loop Ended").c_str());
WARN_LOG(CONSOLE, "%s", StopMessage(false, "Shutting down HW").c_str());
// We have now exited the Video Loop and will shut down
// Write message
if (g_pUpdateFPSDisplay != NULL) g_pUpdateFPSDisplay("Stopping...");
HW::Shutdown();
NOTICE_LOG(CONSOLE, "%s", StopMessage(false, "HW shutdown").c_str());
WARN_LOG(CONSOLE, "%s", StopMessage(false, "Shutting down plugins").c_str());
Plugins.ShutdownPlugins();
NOTICE_LOG(CONSOLE, "%s", StopMessage(false, "Plugins shutdown").c_str());
#ifdef _WIN32
gpuShutdownCall.Set();
// Call video shutdown from the video thread, in dual core mode it's the EmuThread
// Or set an event in Single Core mode, to call the shutdown from the cpuThread
if (_CoreParameter.bCPUThread)
Plugins.ShutdownVideoPlugin();
#else
// On unix platforms, the EmuThread is ALWAYS the video thread
Plugins.ShutdownVideoPlugin();
#endif
if (cpuThread)
{
WARN_LOG(CONSOLE, "%s", StopMessage(true, "Stopping CPU thread ...").c_str());
@ -539,13 +503,25 @@ THREAD_RETURN EmuThread(void *pArg)
cpuThread = NULL;
}
// The hardware is uninitialized
NOTICE_LOG(CONSOLE, "%s", StopMessage(false, "Stop() and Video Loop Ended").c_str());
// We have now exited the Video Loop and will shut down
g_bHwInit = false;
g_bStopping = false;
WARN_LOG(CONSOLE, "%s", StopMessage(false, "Shutting down plugins").c_str());
Plugins.ShutdownVideoPlugin();
Plugins.ShutdownPlugins();
NOTICE_LOG(CONSOLE, "%s", StopMessage(false, "Plugins shutdown").c_str());
NOTICE_LOG(CONSOLE, "%s", StopMessage(false, "Shutting down HW").c_str());
HW::Shutdown();
NOTICE_LOG(CONSOLE, "%s", StopMessage(false, "HW shutdown").c_str());
NOTICE_LOG(CONSOLE, "%s", StopMessage(true, "Main thread stopped").c_str());
NOTICE_LOG(CONSOLE, "Stop [Main Thread]\t\t---- Shutdown complete ----");
g_bStopping = false;
Host_UpdateMainFrame();
return 0;

View File

@ -260,6 +260,7 @@ EVT_MENU_RANGE(IDM_FRAMESKIP0, IDM_FRAMESKIP9, CFrame::OnFrameSkip)
EVT_MENU_RANGE(IDM_DRIVE1, IDM_DRIVE24, CFrame::OnBootDrive)
// Other
EVT_ACTIVATE(CFrame::OnActive)
EVT_CLOSE(CFrame::OnClose)
EVT_SIZE(CFrame::OnResize)
EVT_LIST_ITEM_ACTIVATED(LIST_CTRL, CFrame::OnGameListCtrl_ItemActivated)
@ -493,6 +494,12 @@ void CFrame::OnQuit(wxCommandEvent& WXUNUSED (event))
// --------
// Events
void CFrame::OnActive(wxActivateEvent& event)
{
event.Skip();
if (event.GetActive())
UpdateGUI();
}
void CFrame::OnClose(wxCloseEvent& event)
{

View File

@ -267,6 +267,7 @@ class CFrame : public wxFrame
void OnPlayRecording(wxCommandEvent& event);
void OnChangeDisc(wxCommandEvent& event);
void OnScreenshot(wxCommandEvent& event);
void OnActive(wxActivateEvent& event);
void OnClose(wxCloseEvent &event);
void OnLoadState(wxCommandEvent& event);
void OnSaveState(wxCommandEvent& event);

View File

@ -807,8 +807,11 @@ void CFrame::OnLoadWiiMenu(wxCommandEvent& WXUNUSED (event))
void CFrame::OnConnectWiimote(wxCommandEvent& event)
{
int Id = event.GetId() - IDM_CONNECT_WIIMOTE1;
GetUsbPointer()->AccessWiiMote(Id | 0x100)->Activate(event.IsChecked());
if (Core::isRunning() && Core::GetStartupParameter().bWii)
{
int Id = event.GetId() - IDM_CONNECT_WIIMOTE1;
GetUsbPointer()->AccessWiiMote(Id | 0x100)->Activate(event.IsChecked());
}
}
// Toogle fullscreen. In Windows the fullscreen mode is accomplished by expanding the m_Panel to cover
@ -949,23 +952,16 @@ void CFrame::UpdateGUI()
if (DiscIO::CNANDContentManager::Access().GetNANDLoader(FULL_WII_MENU_DIR).IsValid())
GetMenuBar()->FindItem(IDM_LOAD_WII_MENU)->Enable(!Initialized);
GetMenuBar()->FindItem(IDM_CONNECT_WIIMOTE1)->Enable(Paused && Core::GetStartupParameter().bWii);
GetMenuBar()->FindItem(IDM_CONNECT_WIIMOTE2)->Enable(Paused && Core::GetStartupParameter().bWii);
GetMenuBar()->FindItem(IDM_CONNECT_WIIMOTE3)->Enable(Paused && Core::GetStartupParameter().bWii);
GetMenuBar()->FindItem(IDM_CONNECT_WIIMOTE4)->Enable(Paused && Core::GetStartupParameter().bWii);
GetMenuBar()->FindItem(IDM_CONNECT_WIIMOTE1)->Enable(Initialized && Core::GetStartupParameter().bWii);
GetMenuBar()->FindItem(IDM_CONNECT_WIIMOTE2)->Enable(Initialized && Core::GetStartupParameter().bWii);
GetMenuBar()->FindItem(IDM_CONNECT_WIIMOTE3)->Enable(Initialized && Core::GetStartupParameter().bWii);
GetMenuBar()->FindItem(IDM_CONNECT_WIIMOTE4)->Enable(Initialized && Core::GetStartupParameter().bWii);
if (Initialized && Core::GetStartupParameter().bWii)
{
if (GetUsbPointer()->AccessWiiMote(0x0100) != NULL)
GetMenuBar()->FindItem(IDM_CONNECT_WIIMOTE1)->Check(GetUsbPointer()->AccessWiiMote(0x0100)->IsConnected() == 3);
if (GetUsbPointer()->AccessWiiMote(0x0101) != NULL)
GetMenuBar()->FindItem(IDM_CONNECT_WIIMOTE2)->Check(GetUsbPointer()->AccessWiiMote(0x0101)->IsConnected() == 3);
if (GetUsbPointer()->AccessWiiMote(0x0102) != NULL)
GetMenuBar()->FindItem(IDM_CONNECT_WIIMOTE3)->Check(GetUsbPointer()->AccessWiiMote(0x0102)->IsConnected() == 3);
if (GetUsbPointer()->AccessWiiMote(0x0103) != NULL)
GetMenuBar()->FindItem(IDM_CONNECT_WIIMOTE4)->Check(GetUsbPointer()->AccessWiiMote(0x0103)->IsConnected() == 3);
GetMenuBar()->FindItem(IDM_CONNECT_WIIMOTE1)->Check(GetUsbPointer()->AccessWiiMote(0x0100)->IsConnected() == 3);
GetMenuBar()->FindItem(IDM_CONNECT_WIIMOTE2)->Check(GetUsbPointer()->AccessWiiMote(0x0101)->IsConnected() == 3);
GetMenuBar()->FindItem(IDM_CONNECT_WIIMOTE3)->Check(GetUsbPointer()->AccessWiiMote(0x0102)->IsConnected() == 3);
GetMenuBar()->FindItem(IDM_CONNECT_WIIMOTE4)->Check(GetUsbPointer()->AccessWiiMote(0x0103)->IsConnected() == 3);
}
if (Running)