From 87bfe821eb7be447929321d8bd1589fa76129cce Mon Sep 17 00:00:00 2001 From: nakeee Date: Thu, 22 Jan 2009 22:32:57 +0000 Subject: [PATCH] Added input manager handles the sdl init/quit for now git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@1984 8ced0084-cf51-0410-be5f-012b33b47a6e --- Source/Core/Common/Src/Common.h | 1 + Source/Core/Core/Core.vcproj | 8 + Source/Core/Core/Src/InputManager.cpp | 27 ++ Source/Core/Core/Src/InputManager.h | 16 + Source/Core/Core/Src/PluginManager.cpp | 314 +++++++----------- Source/Core/Core/Src/PluginManager.h | 2 + Source/Core/Core/Src/SConscript | 3 +- Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.cpp | 50 +-- .../Plugins/Plugin_nJoy_Testing/Src/nJoy.cpp | 57 +--- 9 files changed, 193 insertions(+), 285 deletions(-) create mode 100644 Source/Core/Core/Src/InputManager.cpp create mode 100644 Source/Core/Core/Src/InputManager.h diff --git a/Source/Core/Common/Src/Common.h b/Source/Core/Common/Src/Common.h index 7df31f7cb7..712006c1d2 100644 --- a/Source/Core/Common/Src/Common.h +++ b/Source/Core/Common/Src/Common.h @@ -38,6 +38,7 @@ #include "../../../PluginSpecs/CommonTypes.h" #define HAVE_WIIUSE 1 + #define HAVE_SDL 1 #define HAVE_WX 1 #else #include "CommonTypes.h" diff --git a/Source/Core/Core/Core.vcproj b/Source/Core/Core/Core.vcproj index af0d405876..f4352351fd 100644 --- a/Source/Core/Core/Core.vcproj +++ b/Source/Core/Core/Core.vcproj @@ -1244,6 +1244,14 @@ RelativePath=".\Src\PluginManager.h" > + + + + diff --git a/Source/Core/Core/Src/InputManager.cpp b/Source/Core/Core/Src/InputManager.cpp new file mode 100644 index 0000000000..14ed63ee8c --- /dev/null +++ b/Source/Core/Core/Src/InputManager.cpp @@ -0,0 +1,27 @@ +#include "InputManager.h" + +bool InputManager::Init() { +#ifdef HAVE_SDL + // Move also joystick opening code here. + if (! sdlInit) { + /* SDL 1.3 use DirectInput instead of the old Microsoft Multimeda API, + and with this we need the SDL_INIT_VIDEO flag as well */ + if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK) < 0) { + PanicAlert("Could not initialize SDL! (%s)\n", SDL_GetError()); + } else { + sdlInit = true; + } + } +#endif + + return true; +} + +bool InputManager::Shutdown() { +#ifdef HAVE_SDL + SDL_Quit(); + sdlInit = false; +#endif + + return true; +} diff --git a/Source/Core/Core/Src/InputManager.h b/Source/Core/Core/Src/InputManager.h new file mode 100644 index 0000000000..2d800ad7f6 --- /dev/null +++ b/Source/Core/Core/Src/InputManager.h @@ -0,0 +1,16 @@ +#ifndef INPUTMANAGER_H +#define INPUTMANAGER_H + +class InputManager { + +public: + bool Init(); + bool Shutdown(); + + InputManager(): sdlInit(false) {} + ~InputManager() {} + +private: + bool sdlInit; +}; +#endif diff --git a/Source/Core/Core/Src/PluginManager.cpp b/Source/Core/Core/Src/PluginManager.cpp index b6d8159a4e..e31d6593a0 100644 --- a/Source/Core/Core/Src/PluginManager.cpp +++ b/Source/Core/Core/Src/PluginManager.cpp @@ -15,31 +15,20 @@ // Official SVN repository and contact information can be found at // http://code.google.com/p/dolphin-emu/ - -////////////////////////////////////////////////////////////////////////////////////////// -// Include -// ŻŻŻŻŻŻŻŻŻŻŻŻ -#include // System +#include #include -//#include "Globals.h" // Local +//#include "Globals.h" +#include "FileSearch.h" +#include "FileUtil.h" #include "PluginManager.h" #include "ConfigManager.h" #include "LogManager.h" -#include "Core.h" - -#include "FileSearch.h" // Common -#include "FileUtil.h" #include "StringUtil.h" -#include "ConsoleWindow.h" CPluginManager CPluginManager::m_Instance; -////////////////////////////////////////////// -////////////////////////////////////////////////////////////////////////////////////////// -// The Plugin Manager Class -// ŻŻŻŻŻŻŻŻŻŻŻŻ CPluginManager::CPluginManager() : m_params(SConfig::GetInstance().m_LocalCoreStartupParameter) { @@ -47,189 +36,113 @@ CPluginManager::CPluginManager() : m_PluginGlobals->eventHandler = EventHandler::GetInstance(); m_PluginGlobals->config = (void *)&SConfig::GetInstance(); m_PluginGlobals->messageLogger = NULL; + m_InputManager = new InputManager(); } -// Function: FreeLibrary() -// Called from: This will be called when Dolphin is closed, not when we Stop a game + CPluginManager::~CPluginManager() { - Console::Print("Delete CPluginManager\n"); + if (m_PluginGlobals) + delete m_PluginGlobals; - if (m_PluginGlobals) delete m_PluginGlobals; + ShutdownPlugins(); - if (m_dsp) delete m_dsp; - - if (m_video) delete m_video; + delete m_InputManager; - /**/ - for (int i = 0; i < MAXPADS; i++) - { - if (m_pad[i] && OkayToInitPlugin(i)) - { - Console::Print("Delete: %i\n", i); - delete m_pad[i]; - } - m_pad[i] = NULL; - } - - - for (int i = 0; i < MAXWIIMOTES; i++) - if (m_wiimote[i]) delete m_wiimote[i]; } -////////////////////////////////////////////// +bool CPluginManager::InitPlugins() { -////////////////////////////////////////////////////////////////////////////////////////// -// Init and ShutDown Plugins -// ŻŻŻŻŻŻŻŻŻŻŻŻ - -// Point the m_pad[] and other variables to a certain plugin -bool CPluginManager::InitPlugins() -{ - - if (! GetVideo()) - { - PanicAlert("Can't init Video Plugin"); - return false; + if (! GetVideo()) { + PanicAlert("Can't init Video Plugin"); + return false; } - if (! GetDSP()) - { - PanicAlert("Can't init DSP Plugin"); - return false; + if (! GetDSP()) { + PanicAlert("Can't init DSP Plugin"); + return false; + } + + if (! m_InputManager->Init()) { + PanicAlert("Can't init input manager"); + return false; } - // Check if we get at least one pad or wiimote bool pad = false; bool wiimote = false; - // Init pad for (int i = 0; i < MAXPADS; i++) { - if (! m_params.m_strPadPlugin[i].empty()) - GetPAD(i); - if (m_pad[i] != NULL) - pad = true; - } - if (! pad) - { - PanicAlert("Can't init any PAD Plugins"); - return false; + if (! m_params.m_strPadPlugin[i].empty()) + GetPAD(i); + + if (m_pad[i] != NULL) + pad = true; } - // Init wiimote - if (m_params.bWii) + if (! pad) { + PanicAlert("Can't init any PAD Plugins"); + return false; + } + if (m_params.bWii) { + for (int i = 0; i < MAXWIIMOTES; i++) { - for (int i = 0; i < MAXWIIMOTES; i++) - { - if (! m_params.m_strWiimotePlugin[i].empty()) - GetWiimote(i); + if (! m_params.m_strWiimotePlugin[i].empty()) + GetWiimote(i); - if (m_wiimote[i] != NULL) - wiimote = true; - } - if (! wiimote) - { - PanicAlert("Can't init any Wiimote Plugins"); - return false; - } + if (m_wiimote[i] != NULL) + wiimote = true; + } + + if (! wiimote) { + PanicAlert("Can't init any Wiimote Plugins"); + return false; + } } return true; } void CPluginManager::ShutdownPlugins() -{ - // Check if we can shutdown the plugin - for (int i = 0; i < MAXPADS; i++) - { - if (m_pad[i] && OkayToInitPlugin(i)) - { - //Console::Print("Shutdown: %i\n", i); - m_pad[i]->Shutdown(); - } - //delete m_pad[i]; - //m_pad[i] = NULL; +{ + for (int i = 0; i < MAXPADS; i++) { + if (m_pad[i]) { + m_pad[i]->Shutdown(); + delete m_pad[i]; + m_pad[i] = NULL; } - - for (int i = 0; i < MAXWIIMOTES; i++) - if (m_wiimote[i]) m_wiimote[i]->Shutdown(); - - if (m_video) - m_video->Shutdown(); - - if (m_dsp) - m_dsp->Shutdown(); -} -////////////////////////////////////////// - - -////////////////////////////////////////////////////////////////////////////////////////// -// Supporting functions -// ŻŻŻŻŻŻŻŻŻŻŻŻ - - -void *CPluginManager::LoadPlugin(const char *_rFilename)//, PLUGIN_TYPE type) -{ - CPluginInfo info(_rFilename); - PLUGIN_TYPE type = info.GetPluginInfo().Type; - 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_WIIMOTE: - plugin = new Common::PluginWiimote(_rFilename); - break; - default: - PanicAlert("Trying to load unsupported type %d", type); } - if (!plugin->IsValid()) - { - PanicAlert("Can't open %s", _rFilename); - return NULL; - } - - plugin->SetGlobals(m_PluginGlobals); - return plugin; + if (! m_InputManager->Shutdown()) { + PanicAlert("Error cleaning after input manager"); + } + + for (int i = 0; i < MAXWIIMOTES; i++) { + if (m_wiimote[i]) { + m_wiimote[i]->Shutdown(); + delete m_wiimote[i]; + m_wiimote[i] = NULL; + } + } + + if (m_video) { + m_video->Shutdown(); + delete m_video; + m_video = NULL; + } + + if (m_dsp) { + m_dsp->Shutdown(); + delete m_dsp; + m_dsp = NULL; + } } -// ---------------------------------------- -/* Check if the plugin has already been initialized. If so, return the Id of the duplicate pad - so we can point the new m_pad[] to that */ -// ------------- -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; -} - - -PLUGIN_GLOBALS* CPluginManager::GetGlobals() -{ +PLUGIN_GLOBALS* CPluginManager::GetGlobals() { return m_PluginGlobals; } - // ---------------------------------------- // Create list of available plugins // ------------- @@ -267,29 +180,12 @@ void CPluginManager::ScanForPlugins() } } } -///////////////////////////////////////////////// - -////////////////////////////////////////////////////////////////////////////////////////// -// Create or return the already created plugin pointers -// ŻŻŻŻŻŻŻŻŻŻŻŻ Common::PluginPAD *CPluginManager::GetPAD(int controller) { if (m_pad[controller] == NULL) - { - 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()); - //Console::Print("Returned: %i\n", controller); return m_pad[controller]; } @@ -317,15 +213,45 @@ Common::PluginVideo *CPluginManager::GetVideo() { return m_video; } -/////////////////////////////////////////// + +void *CPluginManager::LoadPlugin(const char *_rFilename)//, PLUGIN_TYPE type) +{ + CPluginInfo info(_rFilename); + PLUGIN_TYPE type = info.GetPluginInfo().Type; + 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_WIIMOTE: + plugin = new Common::PluginWiimote(_rFilename); + break; + default: + PanicAlert("Trying to load unsupported type %d", type); + } + + if (!plugin->IsValid()) { + PanicAlert("Can't open %s", _rFilename); + return NULL; + } + + plugin->SetGlobals(m_PluginGlobals); -////////////////////////////////////////////////////////////////////////////////////////// -// Call DLL functions -// ŻŻŻŻŻŻŻŻŻŻŻŻ + return plugin; +} // ---------------------------------------- -// Open config window. _rFilename = plugin filename , ret = the dll slot number +// Open config window. _rFilename = plugin filename ,ret = the dll slot number // ------------- void CPluginManager::OpenConfig(void* _Parent, const char *_rFilename) { @@ -342,9 +268,9 @@ 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) { - GetVideo()->Debug((HWND)_Parent, Show); + GetVideo()->Debug((HWND)_Parent, Show); } else if (Type == PLUGIN_TYPE_DSP) { - GetDSP()->Debug((HWND)_Parent, Show); + GetDSP()->Debug((HWND)_Parent, Show); } } @@ -356,15 +282,13 @@ CPluginInfo::CPluginInfo(const char *_rFileName) , m_Valid(false) { Common::CPlugin *plugin = new Common::CPlugin(_rFileName); - if (plugin->IsValid()) - { - if (plugin->GetInfo(m_PluginInfo)) - m_Valid = true; - else - PanicAlert("Could not get info about plugin %s", _rFileName); - - delete plugin; - } + if (plugin->IsValid()) { + if (plugin->GetInfo(m_PluginInfo)) + m_Valid = true; + else + PanicAlert("Could not get info about plugin %s", _rFileName); + delete plugin; + } } -/////////////////////////////////////////// + diff --git a/Source/Core/Core/Src/PluginManager.h b/Source/Core/Core/Src/PluginManager.h index f71c92cce0..c0f5fce28b 100644 --- a/Source/Core/Core/Src/PluginManager.h +++ b/Source/Core/Core/Src/PluginManager.h @@ -25,6 +25,7 @@ #include "PluginWiimote.h" #include "EventHandler.h" #include "CoreParameter.h" +#include "InputManager.h" class CPluginInfo { @@ -70,6 +71,7 @@ private: Common::PluginWiimote *m_wiimote[4]; Common::PluginDSP *m_dsp; + InputManager *m_InputManager; SCoreStartupParameter& m_params; CPluginManager(); ~CPluginManager(); diff --git a/Source/Core/Core/Src/SConscript b/Source/Core/Core/Src/SConscript index 9838f39e16..a926baaa45 100644 --- a/Source/Core/Core/Src/SConscript +++ b/Source/Core/Core/Src/SConscript @@ -15,7 +15,8 @@ files = ["Console.cpp", "PatchEngine.cpp", "State.cpp", "Tracer.cpp", - 'PluginManager.cpp', + "PluginManager.cpp", + "InputManager.cpp", "VolumeHandler.cpp", "Boot/Boot.cpp", "Boot/Boot_BIOSEmu.cpp", diff --git a/Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.cpp b/Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.cpp index d4ae404180..f93e2e32d4 100644 --- a/Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.cpp +++ b/Source/Plugins/Plugin_nJoy_SDL/Src/nJoy.cpp @@ -181,12 +181,11 @@ void GetDllInfo(PLUGIN_INFO* _PluginInfo) void SetDllGlobals(PLUGIN_GLOBALS* _pPluginGlobals) { } + // Call config dialog // ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ void DllConfig(HWND _hParent) { - #ifdef _WIN32 - // Start the pads so we can use them in the configuration and advanced controls if(!emulator_running) { @@ -197,32 +196,11 @@ void DllConfig(HWND _hParent) emulator_running = false; // Set it back to false } - g_Config.Load(); // Load settings - - // We don't need a parent for this wxDialog - //wxWindow win; - //win.SetHWND(_hParent); - //ConfigBox frame(&win); - //win.SetHWND(0); - +#if defined(HAVE_WX) && HAVE_WX m_frame = new ConfigBox(NULL); m_frame->ShowModal(); +#endif - #else - if (SDL_Init(SDL_INIT_JOYSTICK ) < 0) - { - printf("Could not initialize SDL! (%s)\n", SDL_GetError()); - return; - } - - g_Config.Load(); // load settings - - #if defined(HAVE_WX) && HAVE_WX - ConfigBox frame(NULL); - frame.ShowModal(); - #endif - - #endif } void DllDebugger(HWND _hParent, bool Show) { @@ -249,18 +227,6 @@ void Initialize(void *init) DEBUG_INIT(); #endif - /* 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; - } - #ifdef _WIN32 m_hWnd = (HWND)_PADInitialize.hWnd; #endif @@ -302,12 +268,8 @@ int Search_Devices() // Warn the user if no PadMapping are detected if (numjoy == 0) { - #ifdef _WIN32 - //MessageBox(NULL, "No Joystick detected!", NULL, MB_ICONWARNING); - #else - printf("No Joystick detected!\n"); - #endif - return 0; + PanicAlert("No Joystick detected!\n"); + return 0; } #ifdef _DEBUG @@ -361,8 +323,6 @@ void Shutdown() if (PadMapping[3].enabled && SDL_JoystickOpened(PadMapping[3].ID)) SDL_JoystickClose(joystate[3].joy); - SDL_Quit(); - #ifdef _DEBUG DEBUG_QUIT(); #endif diff --git a/Source/Plugins/Plugin_nJoy_Testing/Src/nJoy.cpp b/Source/Plugins/Plugin_nJoy_Testing/Src/nJoy.cpp index 2d1746b608..b50dd2b8db 100644 --- a/Source/Plugins/Plugin_nJoy_Testing/Src/nJoy.cpp +++ b/Source/Plugins/Plugin_nJoy_Testing/Src/nJoy.cpp @@ -164,37 +164,22 @@ void SetDllGlobals(PLUGIN_GLOBALS* _pPluginGlobals) { // Call config dialog // ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ void DllConfig(HWND _hParent) -{ - #ifdef _WIN32 - if(SDL_Init(SDL_INIT_JOYSTICK ) < 0) +{ + // Start the pads so we can use them in the configuration and advanced controls + if(!emulator_running) { - MessageBox(NULL, SDL_GetError(), "Could not initialize SDL!", MB_ICONERROR); - return; + SPADInitialize _PADInitialize; + _PADInitialize.hWnd = NULL; + _PADInitialize.pLog = NULL; + Initialize((void*)&_PADInitialize); + emulator_running = false; // Set it back to false } - LoadConfig(); // load settings - #if defined(HAVE_WX) && HAVE_WX - wxWindow win; - win.SetHWND(_hParent); - ConfigBox frame(&win); - frame.ShowModal(); - win.SetHWND(0); + m_frame = new ConfigBox(NULL); + m_frame->ShowModal(); #endif - #else - if(SDL_Init(SDL_INIT_JOYSTICK ) < 0) - { - printf("Could not initialize SDL! (%s)\n", SDL_GetError()); - return; - } - LoadConfig(); // load settings - -#if defined(HAVE_WX) && HAVE_WX - ConfigBox frame(NULL); - frame.ShowModal(); -#endif - #endif } void DllDebugger(HWND _hParent, bool Show) { @@ -210,16 +195,6 @@ void Initialize(void *init) DEBUG_INIT(); #endif - if(SDL_Init(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; #endif @@ -249,8 +224,6 @@ void Shutdown() if(joysticks[3].enabled) SDL_JoystickClose(joystate[3].joy); - SDL_Quit(); - #ifdef _DEBUG DEBUG_QUIT(); #endif @@ -700,13 +673,9 @@ int Search_Devices() int numjoy = SDL_NumJoysticks(); if(numjoy == 0) - { - #ifdef _WIN32 - MessageBox(NULL, "No Joystick detected!", NULL, MB_ICONWARNING); - #else - printf("No Joystick detected!\n"); - #endif - return 0; + { + PanicAlert("No Joystick detected!\n"); + return 0; } if(joyinfo)