summaryrefslogtreecommitdiffstatshomepage
path: root/src/osd/modules/input/input_xinput.cpp
diff options
context:
space:
mode:
author Giuseppe Gorgoglione <gorgogsp@gmail.com>2016-05-28 04:14:15 +0200
committer Giuseppe Gorgoglione <gorgogsp@gmail.com>2016-06-11 20:14:09 +0200
commit58dc78b6eba373d88fe7ef68f9ce3c2c43e635d6 (patch)
tree90af8c2c2323070c2c336153de8376d83a3f1f44 /src/osd/modules/input/input_xinput.cpp
parentea1b66f146e4c6663e06b124f8665f878c43ce0c (diff)
Introduce dynamic_module
This is a central cross-platform facility to dynamically bind functions from shared libraries. Updated all OSD modules to use it.
Diffstat (limited to 'src/osd/modules/input/input_xinput.cpp')
-rw-r--r--src/osd/modules/input/input_xinput.cpp46
1 files changed, 12 insertions, 34 deletions
diff --git a/src/osd/modules/input/input_xinput.cpp b/src/osd/modules/input/input_xinput.cpp
index 593cf16fc28..2d01b702bd8 100644
--- a/src/osd/modules/input/input_xinput.cpp
+++ b/src/osd/modules/input/input_xinput.cpp
@@ -32,50 +32,28 @@
#include "input_windows.h"
#include "input_xinput.h"
-
-xinput_api_helper::xinput_api_helper()
#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
- : XInputGetState("XInputGetState", xinput_dll_names, ARRAY_LENGTH(xinput_dll_names))
- , XInputGetCapabilities("XInputGetCapabilities", xinput_dll_names, ARRAY_LENGTH(xinput_dll_names))
+#define XINPUT_LIBRARIES { "xinput1_4.dll", "xinput9_1_0.dll" }
+#else
+#define XINPUT_LIBRARIES { "xinput1_4.dll" }
#endif
-{
-}
int xinput_api_helper::initialize()
{
-#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
- int status;
- status = XInputGetState.initialize();
- if (status != 0)
- {
- osd_printf_verbose("Failed to initialize function pointer for %s. Error: %d\n", XInputGetState.name(), status);
- return -1;
- }
+ m_xinput_dll = osd::dynamic_module::open(XINPUT_LIBRARIES);
- status = XInputGetCapabilities.initialize();
- if (status != 0)
+ XInputGetState = m_xinput_dll->bind<xinput_get_state_fn>("XInputGetState");
+ XInputGetCapabilities = m_xinput_dll->bind<xinput_get_caps_fn>("XInputGetCapabilities");
+
+ if (!XInputGetState || !XInputGetCapabilities)
{
- osd_printf_verbose("Failed to initialize function pointer for %s. Error: %d\n", XInputGetCapabilities.name(), status);
+ osd_printf_verbose("Could not find XInput. Please try to reinstall DirectX runtime package.\n");
return -1;
}
-#endif
return 0;
}
-#if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
-// Pass-through functions for Universal Windows
-inline DWORD xinput_api_helper::XInputGetState(DWORD dwUserindex, XINPUT_STATE *pState)
-{
- return ::XInputGetState(dwUserindex, pState);
-}
-
-inline DWORD xinput_api_helper::XInputGetCapabilities(DWORD dwUserindex, DWORD dwFlags, XINPUT_CAPABILITIES* pCapabilities)
-{
- return ::XInputGetCapabilities(dwUserindex, dwFlags, pCapabilities);
-}
-#endif
-
//============================================================
// create_xinput_device
//============================================================
@@ -85,7 +63,7 @@ xinput_joystick_device * xinput_api_helper::create_xinput_device(running_machine
xinput_joystick_device *devinfo;
XINPUT_CAPABILITIES caps = { 0 };
- if (FAILED(XInputGetCapabilities(index, 0, &caps)))
+ if (FAILED(xinput_get_capabilities(index, 0, &caps)))
{
// If we can't get the capabilities skip this device
return nullptr;
@@ -125,7 +103,7 @@ void xinput_joystick_device::poll()
return;
// poll the device first
- HRESULT result = m_xinput_helper->XInputGetState(xinput_state.player_index, &xinput_state.xstate);
+ HRESULT result = m_xinput_helper->xinput_get_state(xinput_state.player_index, &xinput_state.xstate);
// If we can't poll the device, skip
if (FAILED(result))
@@ -262,7 +240,7 @@ protected:
{
XINPUT_STATE state = {0};
- if (m_xinput_helper->XInputGetState(i, &state) == ERROR_SUCCESS)
+ if (m_xinput_helper->xinput_get_state(i, &state) == ERROR_SUCCESS)
{
// allocate and link in a new device
devinfo = m_xinput_helper->create_xinput_device(machine, i, *this);