mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-01-10 08:09:26 +01:00
nJoy and PluginManager:
1. Avoided LoadLibrary() and FreeLibrary() in favor of using an existing LoadLibrary() because of an unresolved crash related to LoadLibrary() and nJoy. After several times of LoadLibrary() and FreeLibrary() of nJoy these seems to be some kind of memory corruption that brings up several error boxes from different places (not just nJoy) and then cause a crash. 2. Slowed down the moving of the pad initialization to InputCommon. I'm not against InputCommon at all, but I have to spend some more time with it before it works on Windows 3. Partly fixed a somewhat frequent failure of nJoy with SDL 1.3 that would give a strange DirectInput error message and cause the pads to not function. It's still present before the nJoy config windows is opened. It's only fixed on booting a game. git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@1991 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
parent
d450e054a4
commit
63ad74f9e8
@ -37,8 +37,10 @@ CPlugin::~CPlugin()
|
||||
|
||||
CPlugin::CPlugin(const char* _szName) : valid(false)
|
||||
{
|
||||
if (m_hInstLib.Load(_szName)) {
|
||||
if (m_hInstLib.Load(_szName))
|
||||
{
|
||||
|
||||
// Create pointers to the DLL functions
|
||||
m_GetDllInfo = reinterpret_cast<TGetDllInfo>
|
||||
(m_hInstLib.Get("GetDllInfo"));
|
||||
m_DllConfig = reinterpret_cast<TDllConfig>
|
||||
@ -56,24 +58,28 @@ CPlugin::CPlugin(const char* _szName) : valid(false)
|
||||
}
|
||||
|
||||
if (m_GetDllInfo != 0 &&
|
||||
m_DllConfig != 0 &&
|
||||
m_DllDebugger != 0 &&
|
||||
m_SetDllGlobals != 0 &&
|
||||
m_Initialize != 0 &&
|
||||
m_Shutdown != 0 &&
|
||||
m_DoState != 0)
|
||||
m_DllConfig != 0 &&
|
||||
m_DllDebugger != 0 &&
|
||||
m_SetDllGlobals != 0 &&
|
||||
m_Initialize != 0 &&
|
||||
m_Shutdown != 0 &&
|
||||
m_DoState != 0)
|
||||
valid = true;
|
||||
|
||||
// Save the filename for this plugin
|
||||
Filename = _szName;
|
||||
}
|
||||
|
||||
void *CPlugin::LoadSymbol(const char *sym) {
|
||||
void *CPlugin::LoadSymbol(const char *sym)
|
||||
{
|
||||
return m_hInstLib.Get(sym);
|
||||
}
|
||||
|
||||
|
||||
// ______________________________________________________________________________________
|
||||
// GetInfo: Get DLL info
|
||||
bool CPlugin::GetInfo(PLUGIN_INFO& _pluginInfo) {
|
||||
bool CPlugin::GetInfo(PLUGIN_INFO& _pluginInfo)
|
||||
{
|
||||
if (m_GetDllInfo != 0)
|
||||
{
|
||||
m_GetDllInfo(&_pluginInfo);
|
||||
|
@ -36,35 +36,37 @@ class CPlugin
|
||||
{
|
||||
public:
|
||||
|
||||
CPlugin(const char* _szName);
|
||||
~CPlugin();
|
||||
CPlugin(const char* _szName);
|
||||
~CPlugin();
|
||||
|
||||
virtual bool IsValid() {return valid;};
|
||||
virtual bool IsValid() {return valid;};
|
||||
virtual std::string GetFilename() {return Filename;};
|
||||
|
||||
bool GetInfo(PLUGIN_INFO& _pluginInfo);
|
||||
void SetGlobals(PLUGIN_GLOBALS* _PluginGlobals);
|
||||
void *LoadSymbol(const char *sym);
|
||||
bool GetInfo(PLUGIN_INFO& _pluginInfo);
|
||||
void SetGlobals(PLUGIN_GLOBALS* _PluginGlobals);
|
||||
void *LoadSymbol(const char *sym);
|
||||
|
||||
void Config(HWND _hwnd);
|
||||
void About(HWND _hwnd);
|
||||
void Debug(HWND _hwnd, bool Show);
|
||||
void DoState(unsigned char **ptr, int mode);
|
||||
void Initialize(void *init);
|
||||
void Shutdown();
|
||||
void Config(HWND _hwnd);
|
||||
void About(HWND _hwnd);
|
||||
void Debug(HWND _hwnd, bool Show);
|
||||
void DoState(unsigned char **ptr, int mode);
|
||||
void Initialize(void *init);
|
||||
void Shutdown();
|
||||
|
||||
private:
|
||||
|
||||
DynamicLibrary m_hInstLib;
|
||||
bool valid;
|
||||
DynamicLibrary m_hInstLib;
|
||||
bool valid;
|
||||
std::string Filename;
|
||||
|
||||
// Functions
|
||||
TGetDllInfo m_GetDllInfo;
|
||||
TDllConfig m_DllConfig;
|
||||
TDllDebugger m_DllDebugger;
|
||||
TSetDllGlobals m_SetDllGlobals;
|
||||
TInitialize m_Initialize;
|
||||
TShutdown m_Shutdown;
|
||||
TDoState m_DoState;
|
||||
// Functions
|
||||
TGetDllInfo m_GetDllInfo;
|
||||
TDllConfig m_DllConfig;
|
||||
TDllDebugger m_DllDebugger;
|
||||
TSetDllGlobals m_SetDllGlobals;
|
||||
TInitialize m_Initialize;
|
||||
TShutdown m_Shutdown;
|
||||
TDoState m_DoState;
|
||||
};
|
||||
} // end of namespace Common
|
||||
|
||||
|
@ -4,25 +4,27 @@
|
||||
#include "pluginspecs_pad.h"
|
||||
#include "Plugin.h"
|
||||
|
||||
namespace Common {
|
||||
namespace Common
|
||||
{
|
||||
typedef void (__cdecl* TPAD_GetStatus)(u8, SPADStatus*);
|
||||
typedef void (__cdecl* TPAD_Input)(u16, u8);
|
||||
typedef void (__cdecl* TPAD_Rumble)(u8, unsigned int, unsigned int);
|
||||
typedef unsigned int (__cdecl* TPAD_GetAttachedPads)();
|
||||
|
||||
class PluginPAD : public CPlugin {
|
||||
class PluginPAD : public CPlugin
|
||||
{
|
||||
public:
|
||||
PluginPAD(const char *_Filename);
|
||||
~PluginPAD();
|
||||
virtual bool IsValid() {return validPAD;};
|
||||
PluginPAD(const char *_Filename);
|
||||
~PluginPAD();
|
||||
virtual bool IsValid() {return validPAD;};
|
||||
|
||||
TPAD_GetStatus PAD_GetStatus;
|
||||
TPAD_Input PAD_Input;
|
||||
TPAD_Rumble PAD_Rumble;
|
||||
TPAD_GetAttachedPads PAD_GetAttachedPads;
|
||||
TPAD_GetStatus PAD_GetStatus;
|
||||
TPAD_Input PAD_Input;
|
||||
TPAD_Rumble PAD_Rumble;
|
||||
TPAD_GetAttachedPads PAD_GetAttachedPads;
|
||||
|
||||
private:
|
||||
bool validPAD;
|
||||
bool validPAD;
|
||||
|
||||
};
|
||||
}
|
||||
|
@ -1,7 +1,11 @@
|
||||
#include "PluginVideo.h"
|
||||
|
||||
namespace Common {
|
||||
PluginVideo::PluginVideo(const char *_Filename) : CPlugin(_Filename), validVideo(false) {
|
||||
namespace Common
|
||||
{
|
||||
PluginVideo::PluginVideo(const char *_Filename) :
|
||||
CPlugin(_Filename),
|
||||
validVideo(false)
|
||||
{
|
||||
|
||||
Video_Prepare = reinterpret_cast<TVideo_Prepare>
|
||||
(LoadSymbol("Video_Prepare"));
|
||||
|
@ -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 {
|
||||
public:
|
||||
PluginVideo(const char *_Filename);
|
||||
~PluginVideo();
|
||||
virtual bool IsValid() {return validVideo;};
|
||||
class PluginVideo : public CPlugin
|
||||
{
|
||||
public:
|
||||
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;
|
||||
|
||||
};
|
||||
}
|
||||
|
@ -191,7 +191,7 @@
|
||||
FavorSizeOrSpeed="1"
|
||||
OmitFramePointers="true"
|
||||
EnableFiberSafeOptimizations="false"
|
||||
AdditionalIncludeDirectories=".\Core\Core\Src\Debugger;..\Common\Src;..\DiscIO\Src;..\..\Core\InputCommon\Src;..\..\PluginSpecs;..\..\..\Externals\LZO;..\..\..\Externals\Bochs_disasm;..\..\..\Externals\zlib"
|
||||
AdditionalIncludeDirectories="..\..\..\Externals\SDL\Include;.\Core\Core\Src\Debugger;..\Common\Src;..\DiscIO\Src;..\..\Core\InputCommon\Src;..\..\PluginSpecs;..\..\..\Externals\LZO;..\..\..\Externals\Bochs_disasm;..\..\..\Externals\zlib"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_DEPRECATE;_SECURE_SCL=0"
|
||||
StringPooling="true"
|
||||
RuntimeLibrary="0"
|
||||
|
@ -155,8 +155,6 @@ bool GetRealWiimote()
|
||||
// -----------------
|
||||
bool Init()
|
||||
{
|
||||
//Console::Open();
|
||||
|
||||
if (g_pThread != NULL)
|
||||
{
|
||||
PanicAlert("ERROR: Emu Thread already running. Report this bug.");
|
||||
@ -347,7 +345,18 @@ THREAD_RETURN EmuThread(void *pArg)
|
||||
PADInitialize.pLog = Callback_PADLog;
|
||||
PADInitialize.padNumber = i;
|
||||
// Check if we should init the plugin
|
||||
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
|
||||
|
@ -254,9 +254,8 @@ void Init()
|
||||
g_Channel[i].m_InHi.Hex = 0;
|
||||
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);
|
||||
// Access the pap
|
||||
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)))
|
||||
|
@ -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)
|
||||
|
@ -15,20 +15,31 @@
|
||||
// Official SVN repository and contact information can be found at
|
||||
// http://code.google.com/p/dolphin-emu/
|
||||
|
||||
#include <string>
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Include
|
||||
// ¯¯¯¯¯¯¯¯¯¯¯¯
|
||||
#include <string> // System
|
||||
#include <vector>
|
||||
|
||||
//#include "Globals.h"
|
||||
#include "FileSearch.h"
|
||||
#include "FileUtil.h"
|
||||
//#include "Globals.h" // Local
|
||||
#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)
|
||||
{
|
||||
@ -37,113 +48,189 @@ CPluginManager::CPluginManager() :
|
||||
m_PluginGlobals->config = (void *)&SConfig::GetInstance();
|
||||
m_PluginGlobals->messageLogger = NULL;
|
||||
|
||||
m_InputManager = new InputManager();
|
||||
m_PluginGlobals->inputManager = m_InputManager;
|
||||
}
|
||||
|
||||
|
||||
// Function: FreeLibrary()
|
||||
// Called from: This will be called when Dolphin is closed, not when we Stop a game
|
||||
CPluginManager::~CPluginManager()
|
||||
{
|
||||
if (m_PluginGlobals)
|
||||
delete m_PluginGlobals;
|
||||
Console::Print("Delete CPluginManager\n");
|
||||
|
||||
ShutdownPlugins();
|
||||
if (m_PluginGlobals) delete m_PluginGlobals;
|
||||
|
||||
delete m_InputManager;
|
||||
if (m_dsp) delete m_dsp;
|
||||
|
||||
if (m_video) delete m_video;
|
||||
|
||||
/**/
|
||||
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() {
|
||||
|
||||
if (! GetVideo()) {
|
||||
PanicAlert("Can't init Video Plugin");
|
||||
return false;
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// 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 (! GetDSP()) {
|
||||
PanicAlert("Can't init DSP Plugin");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (! m_InputManager->Init()) {
|
||||
PanicAlert("Can't init input manager");
|
||||
return false;
|
||||
if (! GetDSP())
|
||||
{
|
||||
PanicAlert("Can't init DSP Plugin");
|
||||
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 (! 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.bWii) {
|
||||
for (int i = 0; i < MAXWIIMOTES; i++)
|
||||
if (! pad)
|
||||
{
|
||||
if (! m_params.m_strWiimotePlugin[i].empty())
|
||||
GetWiimote(i);
|
||||
PanicAlert("Can't init any PAD Plugins");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (m_wiimote[i] != NULL)
|
||||
wiimote = true;
|
||||
}
|
||||
// Init wiimote
|
||||
if (m_params.bWii)
|
||||
{
|
||||
for (int i = 0; i < MAXWIIMOTES; i++)
|
||||
{
|
||||
if (! m_params.m_strWiimotePlugin[i].empty())
|
||||
GetWiimote(i);
|
||||
|
||||
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()
|
||||
{
|
||||
for (int i = 0; i < MAXPADS; i++) {
|
||||
if (m_pad[i]) {
|
||||
m_pad[i]->Shutdown();
|
||||
delete m_pad[i];
|
||||
m_pad[i] = NULL;
|
||||
{
|
||||
// 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 < MAXWIIMOTES; i++)
|
||||
if (m_wiimote[i]) m_wiimote[i]->Shutdown();
|
||||
|
||||
if (m_video)
|
||||
m_video->Shutdown();
|
||||
|
||||
if (m_dsp)
|
||||
m_dsp->Shutdown();
|
||||
}
|
||||
//////////////////////////////////////////
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Supporting functions
|
||||
// ¯¯¯¯¯¯¯¯¯¯¯¯
|
||||
// Called from: Get__() functions in this file only (not from anywhere else)
|
||||
void *CPluginManager::LoadPlugin(const char *_rFilename, int Number)//, PLUGIN_TYPE type)
|
||||
{
|
||||
CPluginInfo info(_rFilename);
|
||||
PLUGIN_TYPE type = info.GetPluginInfo().Type;
|
||||
//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_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:
|
||||
PanicAlert("Trying to load unsupported type %d", type);
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
if (!plugin->IsValid())
|
||||
{
|
||||
PanicAlert("Can't open %s", _rFilename);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
plugin->SetGlobals(m_PluginGlobals);
|
||||
return plugin;
|
||||
}
|
||||
|
||||
PLUGIN_GLOBALS* CPluginManager::GetGlobals() {
|
||||
// ----------------------------------------
|
||||
/* 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)
|
||||
{
|
||||
// Compare it to the earlier plugins
|
||||
for(int i = 0; i < Plugin; i++)
|
||||
if (m_params.m_strPadPlugin[Plugin] == m_params.m_strPadPlugin[i])
|
||||
return i;
|
||||
|
||||
// No there is no duplicate plugin
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
PLUGIN_GLOBALS* CPluginManager::GetGlobals()
|
||||
{
|
||||
return m_PluginGlobals;
|
||||
}
|
||||
|
||||
|
||||
// ----------------------------------------
|
||||
// Create list of available plugins
|
||||
// -------------
|
||||
@ -181,88 +268,102 @@ void CPluginManager::ScanForPlugins()
|
||||
}
|
||||
}
|
||||
}
|
||||
/////////////////////////////////////////////////
|
||||
|
||||
Common::PluginPAD *CPluginManager::GetPAD(int controller)
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
/* Create or return the already created plugin pointers. This will be called often for the
|
||||
Pad and Wiimote from the SI_.cpp files. */
|
||||
// ¯¯¯¯¯¯¯¯¯¯¯¯
|
||||
Common::PluginPAD *CPluginManager::GetPad(int controller)
|
||||
{
|
||||
if (m_pad[controller] == NULL)
|
||||
m_pad[controller] = (Common::PluginPAD*)LoadPlugin(m_params.m_strPadPlugin[controller].c_str());
|
||||
|
||||
return m_pad[controller];
|
||||
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)
|
||||
{
|
||||
m_pad[controller] = (Common::PluginPAD*)LoadPlugin(m_params.m_strPadPlugin[controller].c_str(), controller);
|
||||
Console::Print("LoadPlugin: %i\n", 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_pad[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;
|
||||
}
|
||||
|
||||
void *CPluginManager::LoadPlugin(const char *_rFilename)//, PLUGIN_TYPE type)
|
||||
Common::PluginPAD *CPluginManager::FreePad()
|
||||
{
|
||||
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;
|
||||
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];
|
||||
}
|
||||
///////////////////////////////////////////
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Call DLL functions
|
||||
// ¯¯¯¯¯¯¯¯¯¯¯¯
|
||||
|
||||
// ----------------------------------------
|
||||
// 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)
|
||||
{
|
||||
//m_InputManager->Init();
|
||||
|
||||
Common::CPlugin *plugin = new Common::CPlugin(_rFilename);
|
||||
m_InputManager->Init();
|
||||
plugin->SetGlobals(m_PluginGlobals);
|
||||
plugin->Config((HWND)_Parent);
|
||||
delete plugin;
|
||||
m_InputManager->Shutdown();
|
||||
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;
|
||||
}
|
||||
|
||||
//m_InputManager->Shutdown();
|
||||
}
|
||||
|
||||
// ----------------------------------------
|
||||
@ -270,10 +371,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) {
|
||||
GetVideo()->Debug((HWND)_Parent, Show);
|
||||
} else if (Type == PLUGIN_TYPE_DSP) {
|
||||
GetDSP()->Debug((HWND)_Parent, Show);
|
||||
switch(Type)
|
||||
{
|
||||
case PLUGIN_TYPE_VIDEO:
|
||||
GetVideo()->Debug((HWND)_Parent, Show);
|
||||
break;
|
||||
case PLUGIN_TYPE_DSP:
|
||||
GetDSP()->Debug((HWND)_Parent, Show);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -285,13 +390,15 @@ 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;
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////////
|
||||
|
||||
|
@ -47,20 +47,23 @@ 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();
|
||||
|
||||
private:
|
||||
|
||||
static CPluginManager m_Instance;
|
||||
bool m_Initialized;
|
||||
|
||||
@ -75,7 +78,7 @@ private:
|
||||
SCoreStartupParameter& m_params;
|
||||
CPluginManager();
|
||||
~CPluginManager();
|
||||
void *LoadPlugin(const char *_rFilename);
|
||||
void *LoadPlugin(const char *_rFilename, int Number = 0);
|
||||
|
||||
};
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
<?xml version="1.0" encoding="Windows-1252"?>
|
||||
<VisualStudioProject
|
||||
ProjectType="Visual C++"
|
||||
Version="9.00"
|
||||
Version="9,00"
|
||||
Name="DebuggerWX"
|
||||
ProjectGUID="{4D3CD4C5-412B-4B49-9B1B-A68A2A129C77}"
|
||||
RootNamespace="DebuggerWX"
|
||||
@ -179,7 +179,7 @@
|
||||
<Tool
|
||||
Name="VCCLCompilerTool"
|
||||
WholeProgramOptimization="false"
|
||||
AdditionalIncludeDirectories="..\Common\Src;..\Core\Src;..\InputCommon\Src;..\..\PluginSpecs;..\..\..\Externals\Bochs_disasm;..\..\..\Externals\wxWidgets\Include;..\..\..\Externals\wxWidgets\Include\msvc"
|
||||
AdditionalIncludeDirectories="..\..\..\Externals\SDL\Include;..\Common\Src;..\Core\Src;..\InputCommon\Src;..\..\PluginSpecs;..\..\..\Externals\Bochs_disasm;..\..\..\Externals\wxWidgets\Include;..\..\..\Externals\wxWidgets\Include\msvc"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_LIB;__WXMSW__;_SECURE_SCL=0;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE"
|
||||
RuntimeLibrary="0"
|
||||
BufferSecurityCheck="false"
|
||||
|
@ -22,6 +22,7 @@
|
||||
#include <vector>
|
||||
|
||||
#include "Core.h" // Core
|
||||
#include "ConsoleWindow.h" // Core
|
||||
|
||||
#include "Globals.h" // Local
|
||||
#include "ConfigMain.h"
|
||||
@ -681,18 +682,23 @@ 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 +722,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<CPluginInfo*>(_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 +766,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<CPluginInfo*>(_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<CPluginInfo*>(_pChoice->GetClientData(Index));
|
||||
_rFilename = pInfo->GetFileName();
|
||||
printf("%s\n", _rFilename.c_str());
|
||||
Console::Print("GetFilename: %i %s\n", Index, _rFilename.c_str());
|
||||
return(true);
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
@ -453,7 +453,7 @@ void CFrame::OnKeyUp(wxKeyEvent& event)
|
||||
double GetDoubleTime()
|
||||
{
|
||||
wxDateTime datetime = wxDateTime::UNow(); // Get timestamp
|
||||
u64 TmpSeconds = Common::Timer::GetTimeSinceJan1970(); // Get continous timestamp
|
||||
u64 TmpSeconds = Common::Timer::GetTimeSinceJan1970(); // Get continuous timestamp
|
||||
|
||||
/* Remove a few years. We only really want enough seconds to make sure that we are
|
||||
detecting actual actions, perhaps 60 seconds is enough really, but I leave a
|
||||
|
@ -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
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -175,7 +175,7 @@
|
||||
Name="VCCLCompilerTool"
|
||||
Optimization="2"
|
||||
EnableIntrinsicFunctions="true"
|
||||
AdditionalIncludeDirectories="../../Core/Common/Src;../../PluginSpecs;..\..\..\Externals\wxWidgets\include;..\..\..\Externals\wxWidgets\lib\vc_lib\msw;..\..\..\Externals\wxWidgets\include\msvc;"$(SolutionDir)..\Externals\SDL\Include""
|
||||
AdditionalIncludeDirectories="../../Core/Common/Src;../../PluginSpecs;..\..\..\Externals\wxWidgets\include;..\..\..\Externals\wxWidgets\lib\vc_lib\msw;..\..\..\Externals\wxWidgets\include\msvc;..\..\..\Externals\SDL\Include"
|
||||
PreprocessorDefinitions="WIN32;NDEBUG;_LIB;_SECURE_SCL=0;_CRT_SECURE_NO_WARNINGS;_CRT_SECURE_NO_DEPRECATE"
|
||||
StringPooling="true"
|
||||
RuntimeLibrary="0"
|
||||
|
@ -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
|
||||
|
@ -35,7 +35,7 @@ typedef struct
|
||||
{
|
||||
HWND hWnd;
|
||||
TLog pLog;
|
||||
int padNumber;
|
||||
int padNumber;
|
||||
} SPADInitialize;
|
||||
|
||||
typedef struct
|
||||
|
@ -181,11 +181,12 @@ 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)
|
||||
{
|
||||
@ -196,11 +197,32 @@ void DllConfig(HWND _hParent)
|
||||
emulator_running = false; // Set it back to false
|
||||
}
|
||||
|
||||
#if defined(HAVE_WX) && HAVE_WX
|
||||
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);
|
||||
|
||||
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) {
|
||||
@ -218,19 +240,30 @@ void Initialize(void *init)
|
||||
{
|
||||
// Debugging
|
||||
//Console::Open();
|
||||
|
||||
//Console::Print("Initialize: %i\n", SDL_WasInit(0));
|
||||
|
||||
SPADInitialize _PADInitialize = *(SPADInitialize*)init;
|
||||
SPADInitialize *_PADInitialize = (SPADInitialize*)init;
|
||||
Console::Print("Initialize: %i, %i\n", _PADInitialize->padNumber, SDL_WasInit(0));
|
||||
|
||||
emulator_running = true;
|
||||
#ifdef _DEBUG
|
||||
DEBUG_INIT();
|
||||
#endif
|
||||
|
||||
#ifdef _WIN32
|
||||
m_hWnd = (HWND)_PADInitialize.hWnd;
|
||||
#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_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;
|
||||
#endif
|
||||
Search_Devices(); // Populate joyinfo for all attached devices
|
||||
g_Config.Load(); // Load joystick mapping, PadMapping[].ID etc
|
||||
if (PadMapping[0].enabled)
|
||||
@ -241,6 +274,18 @@ void Initialize(void *init)
|
||||
joystate[2].joy = SDL_JoystickOpen(PadMapping[2].ID);
|
||||
if (PadMapping[3].enabled)
|
||||
joystate[3].joy = SDL_JoystickOpen(PadMapping[3].ID);
|
||||
|
||||
//_PADInitialize->padNumber = 55;
|
||||
/* 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());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -258,15 +303,22 @@ int Search_Devices()
|
||||
if (joyinfo)
|
||||
{
|
||||
delete [] joyinfo;
|
||||
joyinfo = new CONTROLLER_INFO [numjoy];
|
||||
}
|
||||
else
|
||||
{
|
||||
joyinfo = new CONTROLLER_INFO [numjoy];
|
||||
}
|
||||
|
||||
joyinfo = new CONTROLLER_INFO [numjoy];
|
||||
|
||||
// Warn the user if no PadMapping are detected
|
||||
if (numjoy == 0)
|
||||
{
|
||||
PanicAlert("No Joystick detected!\n");
|
||||
return 0;
|
||||
#ifdef _WIN32
|
||||
//MessageBox(NULL, "No Joystick detected!", NULL, MB_ICONWARNING);
|
||||
#else
|
||||
printf("No Joystick detected!\n");
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef _DEBUG
|
||||
@ -309,35 +361,35 @@ int Search_Devices()
|
||||
Called from: The Dolphin Core, ConfigBox::OnClose() */
|
||||
void Shutdown()
|
||||
{
|
||||
//Console::Print("Shutdown: %i\n", SDL_WasInit(0));
|
||||
|
||||
if (PadMapping[0].enabled && SDL_JoystickOpened(PadMapping[0].ID))
|
||||
SDL_JoystickClose(joystate[0].joy);
|
||||
if (PadMapping[1].enabled && SDL_JoystickOpened(PadMapping[1].ID))
|
||||
SDL_JoystickClose(joystate[1].joy);
|
||||
if (PadMapping[2].enabled && SDL_JoystickOpened(PadMapping[2].ID))
|
||||
SDL_JoystickClose(joystate[2].joy);
|
||||
if (PadMapping[3].enabled && SDL_JoystickOpened(PadMapping[3].ID))
|
||||
SDL_JoystickClose(joystate[3].joy);
|
||||
|
||||
#ifdef _DEBUG
|
||||
DEBUG_QUIT();
|
||||
#endif
|
||||
|
||||
if(joyinfo) {
|
||||
Console::Print("Shutdown: %i\n", SDL_WasInit(0));
|
||||
|
||||
if (PadMapping[0].enabled && SDL_JoystickOpened(PadMapping[0].ID))
|
||||
SDL_JoystickClose(joystate[0].joy);
|
||||
if (PadMapping[1].enabled && SDL_JoystickOpened(PadMapping[1].ID))
|
||||
SDL_JoystickClose(joystate[1].joy);
|
||||
if (PadMapping[2].enabled && SDL_JoystickOpened(PadMapping[2].ID))
|
||||
SDL_JoystickClose(joystate[2].joy);
|
||||
if (PadMapping[3].enabled && SDL_JoystickOpened(PadMapping[3].ID))
|
||||
SDL_JoystickClose(joystate[3].joy);
|
||||
|
||||
SDL_Quit();
|
||||
|
||||
#ifdef _DEBUG
|
||||
DEBUG_QUIT();
|
||||
#endif
|
||||
|
||||
delete [] joyinfo;
|
||||
joyinfo = NULL;
|
||||
}
|
||||
|
||||
emulator_running = false;
|
||||
|
||||
#ifdef _WIN32
|
||||
#ifdef USE_RUMBLE_DINPUT_HACK
|
||||
FreeDirectInput();
|
||||
#endif
|
||||
#elif defined(__linux__)
|
||||
close(fd);
|
||||
#endif
|
||||
|
||||
emulator_running = false;
|
||||
|
||||
#ifdef _WIN32
|
||||
#ifdef USE_RUMBLE_DINPUT_HACK
|
||||
FreeDirectInput();
|
||||
#endif
|
||||
#elif defined(__linux__)
|
||||
close(fd);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@ -512,11 +564,14 @@ void PAD_GetStatus(u8 _numPAD, SPADStatus* _pPADStatus)
|
||||
Console::ClearScreen();
|
||||
Console::Print(
|
||||
"Trigger type: %s Left:%04x Right:%04x Value:%i\n"
|
||||
"D-Pad type: %s L:%i R:%i U:%i D:%i",
|
||||
"D-Pad type: %s L:%i R:%i U:%i D:%i"
|
||||
"Main stick x, y: %i %i",
|
||||
|
||||
(PadMapping[_numPAD].triggertype ? "CTL_TRIGGER_XINPUT" : "CTL_TRIGGER_SDL"),
|
||||
TriggerLeft, TriggerRight, TriggerValue,
|
||||
(PadMapping[_numPAD].controllertype ? "CTL_DPAD_CUSTOM" : "CTL_DPAD_HAT"),
|
||||
0, 0, 0, 0
|
||||
0, 0, 0, 0,
|
||||
main_stick_x, main_stick_y
|
||||
);*/
|
||||
}
|
||||
|
||||
@ -731,7 +786,7 @@ void GetJoyState(int controller)
|
||||
ReadButton(controller, CTL_START);
|
||||
|
||||
//
|
||||
if (PadMapping[controller].halfpress < joyinfo[controller].NumButtons)
|
||||
if (PadMapping[controller].halfpress < Buttons)
|
||||
joystate[controller].halfpress = SDL_JoystickGetButton(joystate[controller].joy, PadMapping[controller].halfpress);
|
||||
|
||||
// Check if we have an analog or digital joypad
|
||||
|
Loading…
x
Reference in New Issue
Block a user