diff --git a/Source/Core/Common/Src/Plugin.cpp b/Source/Core/Common/Src/Plugin.cpp index 15bd184bcf..35c5026086 100644 --- a/Source/Core/Common/Src/Plugin.cpp +++ b/Source/Core/Common/Src/Plugin.cpp @@ -64,6 +64,8 @@ CPlugin::CPlugin(const char* _szName) : valid(false) m_DoState != 0) valid = true; + // Save the filename for this plugin + Filename = _szName; } void *CPlugin::LoadSymbol(const char *sym) { diff --git a/Source/Core/Common/Src/Plugin.h b/Source/Core/Common/Src/Plugin.h index 0be36eeb24..d896c41690 100644 --- a/Source/Core/Common/Src/Plugin.h +++ b/Source/Core/Common/Src/Plugin.h @@ -40,6 +40,7 @@ class CPlugin ~CPlugin(); virtual bool IsValid() {return valid;}; + virtual std::string GetFilename() {return Filename;}; bool GetInfo(PLUGIN_INFO& _pluginInfo); void SetGlobals(PLUGIN_GLOBALS* _PluginGlobals); @@ -56,6 +57,7 @@ class CPlugin DynamicLibrary m_hInstLib; bool valid; + std::string Filename; // Functions TGetDllInfo m_GetDllInfo; diff --git a/Source/Core/Common/Src/PluginPAD.cpp b/Source/Core/Common/Src/PluginPAD.cpp index b5a0d072e0..a85e74cfa0 100644 --- a/Source/Core/Common/Src/PluginPAD.cpp +++ b/Source/Core/Common/Src/PluginPAD.cpp @@ -1,24 +1,24 @@ #include "PluginPAD.h" -namespace Common { - PluginPAD::PluginPAD(const char *_Filename) : CPlugin(_Filename), validPAD(false) { - - PAD_GetStatus = reinterpret_cast - (LoadSymbol("PAD_GetStatus")); - PAD_Input = reinterpret_cast - (LoadSymbol("PAD_Input")); - PAD_Rumble = reinterpret_cast - (LoadSymbol("PAD_Rumble")); - PAD_GetAttachedPads = reinterpret_cast - (LoadSymbol("PAD_GetAttachedPads")); +namespace Common +{ + PluginPAD::PluginPAD(const char *_Filename) : CPlugin(_Filename), validPAD(false) + { + PAD_GetStatus = reinterpret_cast + (LoadSymbol("PAD_GetStatus")); + PAD_Input = reinterpret_cast + (LoadSymbol("PAD_Input")); + PAD_Rumble = reinterpret_cast + (LoadSymbol("PAD_Rumble")); + PAD_GetAttachedPads = reinterpret_cast + (LoadSymbol("PAD_GetAttachedPads")); - if ((PAD_GetStatus != 0) && - (PAD_Input != 0) && - (PAD_Rumble != 0) && - (PAD_GetAttachedPads != 0)) - validPAD = true; + if ((PAD_GetStatus != 0) && + (PAD_Input != 0) && + (PAD_Rumble != 0) && + (PAD_GetAttachedPads != 0)) + validPAD = true; } - PluginPAD::~PluginPAD() { - } + PluginPAD::~PluginPAD() {} } diff --git a/Source/Core/Common/Src/PluginVideo.h b/Source/Core/Common/Src/PluginVideo.h index f679191177..fae20d434f 100644 --- a/Source/Core/Common/Src/PluginVideo.h +++ b/Source/Core/Common/Src/PluginVideo.h @@ -13,22 +13,23 @@ namespace Common { typedef void (__cdecl* TVideo_AddMessage)(const char* pstr, unsigned int milliseconds); typedef void (__cdecl* TVideo_Stop)(); - class PluginVideo : public CPlugin { + class PluginVideo : public CPlugin + { public: - PluginVideo(const char *_Filename); - ~PluginVideo(); - virtual bool IsValid() {return validVideo;}; + PluginVideo(const char *_Filename); + ~PluginVideo(); + virtual bool IsValid() {return validVideo;}; - TVideo_Prepare Video_Prepare; - TVideo_SendFifoData Video_SendFifoData; - TVideo_UpdateXFB Video_UpdateXFB; - TVideo_Screenshot Video_Screenshot; - TVideo_EnterLoop Video_EnterLoop; - TVideo_AddMessage Video_AddMessage; - TVideo_Stop Video_Stop; + TVideo_Prepare Video_Prepare; + TVideo_SendFifoData Video_SendFifoData; + TVideo_UpdateXFB Video_UpdateXFB; + TVideo_Screenshot Video_Screenshot; + TVideo_EnterLoop Video_EnterLoop; + TVideo_AddMessage Video_AddMessage; + TVideo_Stop Video_Stop; private: - bool validVideo; + bool validVideo; }; } diff --git a/Source/Core/Core/Src/Core.cpp b/Source/Core/Core/Src/Core.cpp index a3c2985c8a..d7e1ca8aea 100644 --- a/Source/Core/Core/Src/Core.cpp +++ b/Source/Core/Core/Src/Core.cpp @@ -347,7 +347,18 @@ THREAD_RETURN EmuThread(void *pArg) PADInitialize.pLog = Callback_PADLog; PADInitialize.padNumber = i; // Check if we should init the plugin - if(Plugins.OkayToInitPlugin(i)) Plugins.GetPAD(i)->Initialize((void *)&PADInitialize); + if(Plugins.OkayToInitPlugin(i)) + { + Plugins.GetPad(i)->Initialize(&PADInitialize); + + // Check if joypad open failed, in that case try again + if(PADInitialize.padNumber == -1) + { + Plugins.GetPad(i)->Shutdown(); + Plugins.FreePad(); + Plugins.GetPad(i)->Initialize(&PADInitialize); + } + } } // Load and Init WiimotePlugin - only if we are booting in wii mode diff --git a/Source/Core/Core/Src/HW/SI.cpp b/Source/Core/Core/Src/HW/SI.cpp index 88bfbd59a9..76ac6b4c13 100644 --- a/Source/Core/Core/Src/HW/SI.cpp +++ b/Source/Core/Core/Src/HW/SI.cpp @@ -255,8 +255,7 @@ void Init() g_Channel[i].m_InLo.Hex = 0; // Access the pad and check the MAXPADS limit - Common::PluginPAD* pad = CPluginManager::GetInstance().GetPAD((i >= MAXPADS) ? (MAXPADS - 1): i); - //Common::PluginPAD* pad = CPluginManager::GetInstance().GetPAD(i); + Common::PluginPAD* pad = CPluginManager::GetInstance().GetPad(i); // Check if this pad is attached for the current plugin if (pad != NULL && (pad->PAD_GetAttachedPads() & (1 << i))) diff --git a/Source/Core/Core/Src/HW/SI_DeviceGCController.cpp b/Source/Core/Core/Src/HW/SI_DeviceGCController.cpp index f133bb247a..a9bab50773 100644 --- a/Source/Core/Core/Src/HW/SI_DeviceGCController.cpp +++ b/Source/Core/Core/Src/HW/SI_DeviceGCController.cpp @@ -120,8 +120,7 @@ CSIDevice_GCController::GetData(u32& _Hi, u32& _Low) SPADStatus PadStatus; memset(&PadStatus, 0 ,sizeof(PadStatus)); Common::PluginPAD* pad = - //CPluginManager::GetInstance().GetPAD(ISIDevice::m_iDeviceNumber); - CPluginManager::GetInstance().GetPAD((ISIDevice::m_iDeviceNumber >= MAXPADS) ? (MAXPADS - 1): ISIDevice::m_iDeviceNumber); + CPluginManager::GetInstance().GetPad(ISIDevice::m_iDeviceNumber); pad->PAD_GetStatus(ISIDevice::m_iDeviceNumber, &PadStatus); _Hi = (u32)((u8)PadStatus.stickY); @@ -148,7 +147,7 @@ CSIDevice_GCController::GetData(u32& _Hi, u32& _Low) void CSIDevice_GCController::SendCommand(u32 _Cmd) { - Common::PluginPAD* pad = CPluginManager::GetInstance().GetPAD(0); + Common::PluginPAD* pad = CPluginManager::GetInstance().GetPad(0); UCommand command(_Cmd); switch(command.Command) diff --git a/Source/Core/Core/Src/PluginManager.cpp b/Source/Core/Core/Src/PluginManager.cpp index b6d8159a4e..86599d8a9b 100644 --- a/Source/Core/Core/Src/PluginManager.cpp +++ b/Source/Core/Core/Src/PluginManager.cpp @@ -34,6 +34,8 @@ #include "ConsoleWindow.h" CPluginManager CPluginManager::m_Instance; + +//#define INPUTCOMMON ////////////////////////////////////////////// @@ -44,14 +46,26 @@ CPluginManager::CPluginManager() : m_params(SConfig::GetInstance().m_LocalCoreStartupParameter) { m_PluginGlobals = new PLUGIN_GLOBALS; + + m_PluginGlobals->eventHandler = EventHandler::GetInstance(); m_PluginGlobals->config = (void *)&SConfig::GetInstance(); m_PluginGlobals->messageLogger = NULL; + #ifdef INPUTCOMMON + m_InputManager = new InputManager(); + m_PluginGlobals->inputManager = m_InputManager; + #endif } -// Function: FreeLibrary() -// Called from: This will be called when Dolphin is closed, not when we Stop a game +/* Function: FreeLibrary() + Called from: In an attempt to avoid the crash that occurs when the use LoadLibrary() and + FreeLibrary() often (every game a game is stopped and started) these functions will only + be used when + 1. Dolphin is started + 2. A plugin is changed + 3. Dolphin is closed + it will not be used when we Start and Stop games. */ CPluginManager::~CPluginManager() { Console::Print("Delete CPluginManager\n"); @@ -108,7 +122,7 @@ bool CPluginManager::InitPlugins() for (int i = 0; i < MAXPADS; i++) { if (! m_params.m_strPadPlugin[i].empty()) - GetPAD(i); + GetPad(i); if (m_pad[i] != NULL) pad = true; } @@ -148,8 +162,8 @@ void CPluginManager::ShutdownPlugins() { //Console::Print("Shutdown: %i\n", i); m_pad[i]->Shutdown(); - } - //delete m_pad[i]; + //delete m_pad[i]; + } //m_pad[i] = NULL; } @@ -157,10 +171,10 @@ void CPluginManager::ShutdownPlugins() if (m_wiimote[i]) m_wiimote[i]->Shutdown(); if (m_video) - m_video->Shutdown(); + m_video->Shutdown(); if (m_dsp) - m_dsp->Shutdown(); + m_dsp->Shutdown(); } ////////////////////////////////////////// @@ -168,31 +182,35 @@ void CPluginManager::ShutdownPlugins() ////////////////////////////////////////////////////////////////////////////////////////// // Supporting functions // ŻŻŻŻŻŻŻŻŻŻŻŻ - - -void *CPluginManager::LoadPlugin(const char *_rFilename)//, PLUGIN_TYPE type) +/* Called from: Get__() functions in this file only (not from anywhere else), therefore we + can leave all condition checks in the Get__() functions below. */ +void *CPluginManager::LoadPlugin(const char *_rFilename, int Number)//, PLUGIN_TYPE type) { CPluginInfo info(_rFilename); PLUGIN_TYPE type = info.GetPluginInfo().Type; - Common::CPlugin *plugin = NULL; + //std::string Filename = info.GetPluginInfo().Filename; + std::string Filename = _rFilename; + Common::CPlugin *plugin = NULL; + switch (type) { case PLUGIN_TYPE_VIDEO: plugin = new Common::PluginVideo(_rFilename); break; - case PLUGIN_TYPE_PAD: - plugin = new Common::PluginPAD(_rFilename); - break; - case PLUGIN_TYPE_DSP: plugin = new Common::PluginDSP(_rFilename); break; + case PLUGIN_TYPE_PAD: + plugin = new Common::PluginPAD(_rFilename); + break; + case PLUGIN_TYPE_WIIMOTE: plugin = new Common::PluginWiimote(_rFilename); break; - default: + + default: PanicAlert("Trying to load unsupported type %d", type); } @@ -212,15 +230,13 @@ void *CPluginManager::LoadPlugin(const char *_rFilename)//, PLUGIN_TYPE type) // ------------- int CPluginManager::OkayToInitPlugin(int Plugin) { - //Console::Print("OkayToInitShutdown: %i", Plugin); // Compare it to the earlier plugins for(int i = 0; i < Plugin; i++) if (m_params.m_strPadPlugin[Plugin] == m_params.m_strPadPlugin[i]) - { - //Console::Print("(%i %i) %s\n", Plugin, i, g_CoreStartupParameter.m_strPadPlugin[Plugin].c_str()); return i; - } - return -1; + + // No there is no duplicate plugin + return -1; } @@ -271,52 +287,68 @@ void CPluginManager::ScanForPlugins() ////////////////////////////////////////////////////////////////////////////////////////// -// Create or return the already created plugin pointers +/* Create or return the already created plugin pointers. This will be called often for the + Pad and Wiimote from the SI_.cpp files. And often for the DSP from the DSP files. */ // ŻŻŻŻŻŻŻŻŻŻŻŻ -Common::PluginPAD *CPluginManager::GetPAD(int controller) +Common::PluginPAD *CPluginManager::GetPad(int controller) { - if (m_pad[controller] == NULL) + if (m_pad[controller] != NULL) + if (m_pad[controller]->GetFilename() == m_params.m_strPadPlugin[controller]) + return m_pad[controller]; + + // Else do this + if(OkayToInitPlugin(controller) == -1) { - if(OkayToInitPlugin(controller) == -1) - { - m_pad[controller] = (Common::PluginPAD*)LoadPlugin(m_params.m_strPadPlugin[controller].c_str()); - Console::Print("LoadPlugin: %i\n", controller); - } - else - { - Console::Print("Pointed: %i to %i\n", controller, OkayToInitPlugin(controller)); - m_pad[controller] = m_pad[OkayToInitPlugin(controller)]; - } + m_pad[controller] = (Common::PluginPAD*)LoadPlugin(m_params.m_strPadPlugin[controller].c_str(), controller); + Console::Print("LoadPlugin: %i\n", controller); } - - //Console::Print("Returned: %i\n", controller); - return m_pad[controller]; + else + { + Console::Print("Pointed: %i to %i\n", controller, OkayToInitPlugin(controller)); + m_pad[controller] = m_pad[OkayToInitPlugin(controller)]; + } + return m_pad[controller]; } Common::PluginWiimote *CPluginManager::GetWiimote(int controller) { - if (m_wiimote[controller] == NULL) - m_wiimote[controller] = (Common::PluginWiimote*)LoadPlugin - (m_params.m_strWiimotePlugin[controller].c_str()); + if (m_wiimote[controller] != NULL) + if (m_wiimote[controller]->GetFilename() == m_params.m_strWiimotePlugin[controller]) + return m_wiimote[controller]; + // Else load a new plugin + m_wiimote[controller] = (Common::PluginWiimote*)LoadPlugin(m_params.m_strWiimotePlugin[controller].c_str()); return m_wiimote[controller]; } Common::PluginDSP *CPluginManager::GetDSP() { - if (m_dsp == NULL) + if (m_dsp != NULL) + if (m_dsp->GetFilename() == m_params.m_strDSPPlugin) + return m_dsp; + // Else load a new plugin m_dsp = (Common::PluginDSP*)LoadPlugin(m_params.m_strDSPPlugin.c_str()); - return m_dsp; } -Common::PluginVideo *CPluginManager::GetVideo() { +Common::PluginVideo *CPluginManager::GetVideo() +{ + if (m_video != NULL) + if (m_video->GetFilename() == m_params.m_strVideoPlugin) + return m_video; - if (m_video == NULL) + // Else load a new plugin m_video = (Common::PluginVideo*)LoadPlugin(m_params.m_strVideoPlugin.c_str()); - return m_video; } + +Common::PluginPAD *CPluginManager::FreePad() +{ + delete m_pad[0]; + m_pad[0] = NULL; m_pad[1] = NULL; m_pad[2] = NULL; m_pad[3] = NULL; + m_pad[0] = (Common::PluginPAD*)LoadPlugin(m_params.m_strPadPlugin[0].c_str(), 0); + return m_pad[0]; +} /////////////////////////////////////////// @@ -325,15 +357,33 @@ Common::PluginVideo *CPluginManager::GetVideo() { // ŻŻŻŻŻŻŻŻŻŻŻŻ // ---------------------------------------- -// Open config window. _rFilename = plugin filename , ret = the dll slot number +// Open config window. Input: _rFilename = Plugin filename , Type = Plugin type // ------------- -void CPluginManager::OpenConfig(void* _Parent, const char *_rFilename) +void CPluginManager::OpenConfig(void* _Parent, const char *_rFilename, PLUGIN_TYPE Type) { + #ifdef INPUTCOMMON + m_InputManager->Init(); + #endif - Common::CPlugin *plugin = new Common::CPlugin(_rFilename); - plugin->SetGlobals(m_PluginGlobals); - plugin->Config((HWND)_Parent); - delete plugin; + switch(Type) + { + case PLUGIN_TYPE_VIDEO: + GetVideo()->Config((HWND)_Parent); + break; + case PLUGIN_TYPE_DSP: + GetDSP()->Config((HWND)_Parent); + break; + case PLUGIN_TYPE_PAD: + GetPad(0)->Config((HWND)_Parent); + break; + case PLUGIN_TYPE_WIIMOTE: + GetWiimote(0)->Config((HWND)_Parent); + break; + } + + #ifdef INPUTCOMMON + m_InputManager->Shutdown(); + #endif } // ---------------------------------------- @@ -341,10 +391,14 @@ void CPluginManager::OpenConfig(void* _Parent, const char *_rFilename) // ------------- void CPluginManager::OpenDebug(void* _Parent, const char *_rFilename, PLUGIN_TYPE Type, bool Show) { - if (Type == PLUGIN_TYPE_VIDEO) { + switch(Type) + { + case PLUGIN_TYPE_VIDEO: GetVideo()->Debug((HWND)_Parent, Show); - } else if (Type == PLUGIN_TYPE_DSP) { + break; + case PLUGIN_TYPE_DSP: GetDSP()->Debug((HWND)_Parent, Show); + break; } } diff --git a/Source/Core/Core/Src/PluginManager.h b/Source/Core/Core/Src/PluginManager.h index f71c92cce0..4eb39a8ff5 100644 --- a/Source/Core/Core/Src/PluginManager.h +++ b/Source/Core/Core/Src/PluginManager.h @@ -46,16 +46,17 @@ class CPluginManager { public: static CPluginManager& GetInstance() {return(m_Instance);} - Common::PluginPAD *GetPAD(int controller); + Common::PluginPAD *GetPad(int controller); Common::PluginWiimote *GetWiimote(int controller); Common::PluginDSP *GetDSP(); Common::PluginVideo *GetVideo(); + Common::PluginPAD *FreePad(); bool InitPlugins(); void ShutdownPlugins(); int OkayToInitPlugin(int Plugin); void ScanForPlugins(); - void OpenConfig(void* _Parent, const char *_rFilename); + void OpenConfig(void* _Parent, const char *_rFilename, PLUGIN_TYPE Type); void OpenDebug(void* _Parent, const char *_rFilename, PLUGIN_TYPE Type, bool Show); const CPluginInfos& GetPluginInfos() {return(m_PluginInfos);} PLUGIN_GLOBALS* GetGlobals(); @@ -73,7 +74,7 @@ private: SCoreStartupParameter& m_params; CPluginManager(); ~CPluginManager(); - void *LoadPlugin(const char *_rFilename); + void *LoadPlugin(const char *_rFilename, int Number = 0); }; diff --git a/Source/Core/DolphinWX/Src/ConfigMain.cpp b/Source/Core/DolphinWX/Src/ConfigMain.cpp index cbe147539e..aae229516f 100644 --- a/Source/Core/DolphinWX/Src/ConfigMain.cpp +++ b/Source/Core/DolphinWX/Src/ConfigMain.cpp @@ -22,6 +22,7 @@ #include #include "Core.h" // Core +#include "ConsoleWindow.h" #include "Globals.h" // Local #include "ConfigMain.h" @@ -682,17 +683,20 @@ void CConfigMain::DVDRootChanged(wxFileDirPickerEvent& WXUNUSED (event)) SConfig::GetInstance().m_LocalCoreStartupParameter.m_strDVDRoot = DVDRoot->GetPath().ToAscii(); } + +// ======================================================= +// Plugins settings +// ------------- + +// Update plugin filenames void CConfigMain::OnSelectionChanged(wxCommandEvent& WXUNUSED (event)) { GetFilename(GraphicSelection, SConfig::GetInstance().m_LocalCoreStartupParameter.m_strVideoPlugin); GetFilename(DSPSelection, SConfig::GetInstance().m_LocalCoreStartupParameter.m_strDSPPlugin); - for (int i = 0; i < MAXPADS; i++) - GetFilename(PADSelection, SConfig::GetInstance().m_LocalCoreStartupParameter.m_strPadPlugin[i]); - + GetFilename(PADSelection, SConfig::GetInstance().m_LocalCoreStartupParameter.m_strPadPlugin[i]); for (int i = 0; i < MAXWIIMOTES; i++) GetFilename(WiimoteSelection, SConfig::GetInstance().m_LocalCoreStartupParameter.m_strWiimotePlugin[i]); - } void CConfigMain::OnConfig(wxCommandEvent& event) @@ -716,15 +720,25 @@ void CConfigMain::OnConfig(wxCommandEvent& event) break; } } -// ========================== +void CConfigMain::CallConfig(wxChoice* _pChoice) +{ + int Index = _pChoice->GetSelection(); + Console::Print("CallConfig: %i\n", Index); + if (Index >= 0) + { + const CPluginInfo* pInfo = static_cast(_pChoice->GetClientData(Index)); + + if (pInfo != NULL) + CPluginManager::GetInstance().OpenConfig((HWND) this->GetHandle(), pInfo->GetFileName().c_str(), pInfo->GetPluginInfo().Type); + } +} -// ======================================================= -// Plugins settings -// ------------- void CConfigMain::FillChoiceBox(wxChoice* _pChoice, int _PluginType, const std::string& _SelectFilename) { + Console::Print("FillChoiceBox\n"); + _pChoice->Clear(); int Index = -1; @@ -750,31 +764,16 @@ void CConfigMain::FillChoiceBox(wxChoice* _pChoice, int _PluginType, const std:: _pChoice->Select(Index); } -void CConfigMain::CallConfig(wxChoice* _pChoice) -{ - int Index = _pChoice->GetSelection(); - - if (Index >= 0) - { - const CPluginInfo* pInfo = static_cast(_pChoice->GetClientData(Index)); - - if (pInfo != NULL) - CPluginManager::GetInstance().OpenConfig((HWND) this->GetHandle(), pInfo->GetFileName().c_str()); - } -} - bool CConfigMain::GetFilename(wxChoice* _pChoice, std::string& _rFilename) -{ +{ _rFilename.clear(); - int Index = _pChoice->GetSelection(); - printf("%i\n", Index); if (Index >= 0) { const CPluginInfo* pInfo = static_cast(_pChoice->GetClientData(Index)); _rFilename = pInfo->GetFileName(); - printf("%s\n", _rFilename.c_str()); + Console::Print("GetFilename: %i %s\n", Index, _rFilename.c_str()); return(true); } diff --git a/Source/Core/DolphinWX/Src/Frame.cpp b/Source/Core/DolphinWX/Src/Frame.cpp index af08c306c1..ab188cae5e 100644 --- a/Source/Core/DolphinWX/Src/Frame.cpp +++ b/Source/Core/DolphinWX/Src/Frame.cpp @@ -435,7 +435,7 @@ void CFrame::OnKeyDown(wxKeyEvent& event) else { if(Core::GetState() != Core::CORE_UNINITIALIZED) - CPluginManager::GetInstance().GetPAD(0)->PAD_Input(event.GetKeyCode(), 1); // 1 = Down + CPluginManager::GetInstance().GetPad(0)->PAD_Input(event.GetKeyCode(), 1); // 1 = Down event.Skip(); } } @@ -443,7 +443,7 @@ void CFrame::OnKeyDown(wxKeyEvent& event) void CFrame::OnKeyUp(wxKeyEvent& event) { if(Core::GetState() != Core::CORE_UNINITIALIZED) - CPluginManager::GetInstance().GetPAD(0)->PAD_Input(event.GetKeyCode(), 0); // 0 = Up + CPluginManager::GetInstance().GetPad(0)->PAD_Input(event.GetKeyCode(), 0); // 0 = Up event.Skip(); } diff --git a/Source/Core/DolphinWX/Src/FrameTools.cpp b/Source/Core/DolphinWX/Src/FrameTools.cpp index d25dafc9e8..ef5eb3e6f8 100644 --- a/Source/Core/DolphinWX/Src/FrameTools.cpp +++ b/Source/Core/DolphinWX/Src/FrameTools.cpp @@ -539,7 +539,8 @@ void CFrame::OnPluginGFX(wxCommandEvent& WXUNUSED (event)) { CPluginManager::GetInstance().OpenConfig( GetHandle(), - SConfig::GetInstance().m_LocalCoreStartupParameter.m_strVideoPlugin.c_str() + SConfig::GetInstance().m_LocalCoreStartupParameter.m_strVideoPlugin.c_str(), + PLUGIN_TYPE_VIDEO ); } @@ -548,7 +549,8 @@ void CFrame::OnPluginDSP(wxCommandEvent& WXUNUSED (event)) { CPluginManager::GetInstance().OpenConfig( GetHandle(), - SConfig::GetInstance().m_LocalCoreStartupParameter.m_strDSPPlugin.c_str() + SConfig::GetInstance().m_LocalCoreStartupParameter.m_strDSPPlugin.c_str(), + PLUGIN_TYPE_DSP ); } @@ -556,14 +558,16 @@ void CFrame::OnPluginPAD(wxCommandEvent& WXUNUSED (event)) { CPluginManager::GetInstance().OpenConfig( GetHandle(), - SConfig::GetInstance().m_LocalCoreStartupParameter.m_strPadPlugin[0].c_str() + SConfig::GetInstance().m_LocalCoreStartupParameter.m_strPadPlugin[0].c_str(), + PLUGIN_TYPE_PAD ); } void CFrame::OnPluginWiimote(wxCommandEvent& WXUNUSED (event)) { CPluginManager::GetInstance().OpenConfig( GetHandle(), - SConfig::GetInstance().m_LocalCoreStartupParameter.m_strWiimotePlugin[0].c_str() + SConfig::GetInstance().m_LocalCoreStartupParameter.m_strWiimotePlugin[0].c_str(), + PLUGIN_TYPE_WIIMOTE ); } diff --git a/Source/MusicMod.sln b/Source/MusicMod.sln index f1579fa39a..3cd69edccf 100644 --- a/Source/MusicMod.sln +++ b/Source/MusicMod.sln @@ -146,6 +146,9 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Main", "..\Branches\MusicMo EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Player", "..\Branches\MusicMod\Player\Player.vcproj", "{0B72B5D6-5D72-4391-84A7-9CCA5392668A}" + ProjectSection(ProjectDependencies) = postProject + {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} = {C573CAF7-EE6A-458E-8049-16C0BF34C2E9} + EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TestPlayer", "..\Branches\MusicMod\TestPlayer\TestPlayer.vcproj", "{0D14F1E9-490B-4A2D-A4EF-0535E8B3C718}" EndProject diff --git a/Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.cpp b/Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.cpp index 143a56eb86..8f136a2b32 100644 --- a/Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.cpp +++ b/Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.cpp @@ -243,7 +243,7 @@ void Initialize(void *init) //Console::Print("Initialize: %i\n", SDL_WasInit(0)); - SPADInitialize _PADInitialize = *(SPADInitialize*)init; + SPADInitialize *_PADInitialize = (SPADInitialize*)init; emulator_running = true; #ifdef _DEBUG DEBUG_INIT(); @@ -251,18 +251,19 @@ void Initialize(void *init) /* SDL 1.3 use DirectInput instead of the old Microsoft Multimeda API, and with this we need the SDL_INIT_VIDEO flag to */ - if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK) < 0) - { - #ifdef _WIN32 - MessageBox(NULL, SDL_GetError(), "Could not initialize SDL!", MB_ICONERROR); - #else - printf("Could not initialize SDL! (%s)\n", SDL_GetError()); - #endif - return; - } + if (!SDL_WasInit(0)) + if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK) < 0) + { + #ifdef _WIN32 + MessageBox(NULL, SDL_GetError(), "Could not initialize SDL!", MB_ICONERROR); + #else + printf("Could not initialize SDL! (%s)\n", SDL_GetError()); + #endif + return; + } #ifdef _WIN32 - m_hWnd = (HWND)_PADInitialize.hWnd; + m_hWnd = (HWND)_PADInitialize->hWnd; #endif Search_Devices(); // Populate joyinfo for all attached devices @@ -275,6 +276,17 @@ void Initialize(void *init) joystate[2].joy = SDL_JoystickOpen(PadMapping[2].ID); if (PadMapping[3].enabled) joystate[3].joy = SDL_JoystickOpen(PadMapping[3].ID); + + /* Check if any of the pads failed to open. In Windows there is a strange "IDirectInputDevice2:: + SetDataFormat() DirectX error -2147024809" after a few Open and Close */ + if( (PadMapping[0].enabled && joystate[0].joy == NULL) + || (PadMapping[1].enabled && joystate[1].joy == NULL) + || (PadMapping[2].enabled && joystate[2].joy == NULL) + || (PadMapping[3].enabled && joystate[3].joy == NULL)) + { + _PADInitialize->padNumber = -1; + Console::Print("%s\n", SDL_GetError()); + } }