OS X' IOBluetooth class requires that device discovery and device

connection establishment be done in the same thread, which caused
problems when the now persistent device connections could be
initiated by either opening the wiimote config dialog or starting
the emulation.

This same thread doesn't necessarily have to be the main (GUI)
thread, but it fits with the current other init case in the wiimote
config dialog and doing it in the main thread and would be required
if we should want to use the IOBluetoothUI framework in the future
for having the user input a pairing key for permanent syncing.

Also move a few other bits of code from the emu thread function
into Init() and Shutdown() so it only does those things that need
to be in that thread's context. I am not sure about video setup
so I have left that in EmuThread() for now.


git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@7188 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
Soren Jorvang 2011-02-17 17:51:18 +00:00
parent fbcd2dbd5c
commit fa80f4074d
2 changed files with 58 additions and 57 deletions

View File

@ -27,10 +27,10 @@ Usage: Dolphin [-h] [-d] [-l] [-e <str>] [-b] [-V <str>] [-A <str>]
-h, --help Show this help message
-d, --debugger Opens the debugger
-l, --logger Opens the logger
-e, --exec=<str> Loads the specified file (DOL, ELF, WAD, GCM, ISO)
-e, --exec=<str> Loads the specified file (DOL,ELF,WAD,GCM,ISO)
-b, --batch Exit Dolphin with emulator
-V, --video_backend=<str> Specify a video plugin
-A, --audio_emulation=<str> Specify low level (LLE) or high level (HLE) audio emulation
-A, --audio_emulation=<str> Low level (LLE) or high level (HLE) audio
[Libraries]
Cg: Cg Shading API (http://developer.nvidia.com/object/cg_toolkit.html)

View File

@ -182,19 +182,56 @@ bool IsCPUThread()
// BootManager.cpp
bool Init()
{
const SCoreStartupParameter& _CoreParameter =
SConfig::GetInstance().m_LocalCoreStartupParameter;
if (g_EmuThread.joinable())
{
PanicAlertT("Emu Thread already running");
return false;
}
g_CoreStartupParameter = SConfig::GetInstance().m_LocalCoreStartupParameter;
g_CoreStartupParameter = _CoreParameter;
INFO_LOG(OSREPORT, "Starting core = %s mode",
g_CoreStartupParameter.bWii ? "Wii" : "Gamecube");
INFO_LOG(OSREPORT, "CPU Thread separate = %s",
g_CoreStartupParameter.bCPUThread ? "Yes" : "No");
// FIXME DEBUG_LOG(BOOT, dump_params());
Host_SetWaitCursor(true);
Host_UpdateMainFrame(); // Disable any menus or buttons at boot
emuThreadGoing.Init();
g_aspect_wide = _CoreParameter.bWii;
if (g_aspect_wide)
{
IniFile gameIni;
gameIni.Load(_CoreParameter.m_strGameIni.c_str());
gameIni.Get("Wii", "Widescreen", &g_aspect_wide,
!!SConfig::GetInstance().m_SYSCONF->
GetData<u8>("IPL.AR"));
}
HW::Init();
DSP::GetDSPEmulator()->Initialize(g_pWindowHandle,
_CoreParameter.bWii, _CoreParameter.bDSPThread);
Pad::Initialize(g_pWindowHandle);
// Load and Init Wiimotes - only if we are booting in wii mode
if (g_CoreStartupParameter.bWii)
{
Wiimote::Initialize(g_pWindowHandle);
// Activate wiimotes which don't have source set to "None"
for (unsigned int i = 0; i != MAX_WIIMOTES; ++i)
if (g_wiimote_sources[i])
GetUsbPointer()->AccessWiiMote(i | 0x100)->
Activate(true);
}
// The hardware is initialized.
g_bHwInit = true;
// Start the emu thread
g_EmuThread = std::thread(EmuThread);
@ -203,6 +240,7 @@ bool Init()
emuThreadGoing.Shutdown();
Host_SetWaitCursor(false);
return true;
}
@ -247,6 +285,22 @@ void Stop() // - Hammertime!
INFO_LOG(CONSOLE, "%s", StopMessage(true, "Stopping Emu thread ...").c_str());
g_EmuThread.join(); // Wait for emuthread to close.
INFO_LOG(CONSOLE, "%s", StopMessage(true, "Main thread stopped").c_str());
// Stop audio thread - Actually this does nothing when using HLE emulation.
// But stops the DSP Interpreter when using LLE emulation.
DSP::GetDSPEmulator()->DSP_StopSoundStream();
// We must set up this flag before executing HW::Shutdown()
g_bHwInit = false;
INFO_LOG(CONSOLE, "%s", StopMessage(false, "Shutting down HW").c_str());
HW::Shutdown();
INFO_LOG(CONSOLE, "%s", StopMessage(false, "HW shutdown").c_str());
Pad::Shutdown();
Wiimote::Shutdown();
INFO_LOG(CONSOLE, "Stop [Main Thread]\t\t---- Shutdown complete ----");
}
// Create the CPU thread. which would be a CPU + Video thread in Single Core mode.
@ -301,8 +355,6 @@ void CpuThread()
// Call browser: Init():g_EmuThread(). See the BootManager.cpp file description for a complete call schedule.
void EmuThread()
{
Host_UpdateMainFrame(); // Disable any menus or buttons at boot
cpuRunloopQuit.Init();
Common::SetCurrentThreadName("Emuthread - starting");
@ -316,45 +368,14 @@ void EmuThread()
Common::SetCurrentThreadAffinity(2); // Force to second core
}
INFO_LOG(OSREPORT, "Starting core = %s mode", _CoreParameter.bWii ? "Wii" : "Gamecube");
INFO_LOG(OSREPORT, "CPU Thread separate = %s", _CoreParameter.bCPUThread ? "Yes" : "No");
HW::Init();
emuThreadGoing.Set();
g_aspect_wide = _CoreParameter.bWii;
if (g_aspect_wide)
{
IniFile gameIni;
gameIni.Load(_CoreParameter.m_strGameIni.c_str());
gameIni.Get("Wii", "Widescreen", &g_aspect_wide, !!SConfig::GetInstance().m_SYSCONF->GetData<u8>("IPL.AR"));
}
// _CoreParameter.hMainWindow is first the m_Panel handle, then it is updated to have the new window handle,
// within g_video_backend->Initialize()
// TODO: that's ugly, change Initialize() to take m_Panel and return the new window handle
g_video_backend->Initialize();
g_pWindowHandle = _CoreParameter.hMainWindow;
DSP::GetDSPEmulator()->Initialize(g_pWindowHandle, _CoreParameter.bWii, _CoreParameter.bDSPThread);
Pad::Initialize(g_pWindowHandle);
// Load and Init Wiimotes - only if we are booting in wii mode
if (_CoreParameter.bWii)
{
Wiimote::Initialize(g_pWindowHandle);
// activate wiimotes which don't have source set to "None"
for (unsigned int i = 0; i != MAX_WIIMOTES; ++i)
if (g_wiimote_sources[i])
GetUsbPointer()->AccessWiiMote(i | 0x100)->Activate(true);
}
// The hardware is initialized.
g_bHwInit = true;
DisplayMessage("CPU: " + cpu_info.Summarize(), 8000);
DisplayMessage(_CoreParameter.m_strFilename, 3000);
@ -412,10 +433,6 @@ void EmuThread()
INFO_LOG(CONSOLE, "%s", StopMessage(true, "Stopping CPU-GPU thread ...").c_str());
cpuRunloopQuit.Wait();
INFO_LOG(CONSOLE, "%s", StopMessage(true, "CPU thread stopped.").c_str());
// On unix platforms, the Emulation main thread IS the CPU & video
// thread So there's only one thread, imho, that's much better than on
// windows :P
//CpuThread(pArg);
}
// We have now exited the Video Loop
@ -432,26 +449,10 @@ void EmuThread()
VolumeHandler::EjectVolume();
FileMon::Close();
// Stop audio thread - Actually this does nothing when using HLE emulation.
// But stops the DSP Interpreter when using LLE emulation.
DSP::GetDSPEmulator()->DSP_StopSoundStream();
// We must set up this flag before executing HW::Shutdown()
g_bHwInit = false;
INFO_LOG(CONSOLE, "%s", StopMessage(false, "Shutting down HW").c_str());
HW::Shutdown();
INFO_LOG(CONSOLE, "%s", StopMessage(false, "HW shutdown").c_str());
// In single core mode, this has already been called.
if (_CoreParameter.bCPUThread)
g_video_backend->Shutdown();
Pad::Shutdown();
Wiimote::Shutdown();
INFO_LOG(CONSOLE, "%s", StopMessage(true, "Main thread stopped").c_str());
INFO_LOG(CONSOLE, "Stop [Main Thread]\t\t---- Shutdown complete ----");
cpuRunloopQuit.Shutdown();
g_bStopping = false;
}