summaryrefslogtreecommitdiff
path: root/Source/Core/InputCommon/Src/ControllerInterface
diff options
context:
space:
mode:
authorcomex <comexk@gmail.com>2013-10-31 16:51:56 -0400
committercomex <comexk@gmail.com>2013-10-31 16:51:56 -0400
commit82729fcc8f7eef347720052f8d10c14830b7ae8c (patch)
tree4fde688b5777f87dc0628fd93fe389fd5262d554 /Source/Core/InputCommon/Src/ControllerInterface
parent4c7bbd96e435a7516b05d3e8c791ab41505e2e0f (diff)
parent8dcd13cca7b3a6ded6ad43f77adec0852504489f (diff)
Merge remote-tracking branch 'shuffle2/vc12'
Conflicts: Source/Core/Common/Common.vcxproj Source/Core/Common/Common.vcxproj.filters
Diffstat (limited to 'Source/Core/InputCommon/Src/ControllerInterface')
-rw-r--r--Source/Core/InputCommon/Src/ControllerInterface/ControllerInterface.cpp2
-rw-r--r--Source/Core/InputCommon/Src/ControllerInterface/SDL/SDL.cpp16
-rw-r--r--Source/Core/InputCommon/Src/ControllerInterface/SDL/SDL.h10
-rw-r--r--Source/Core/InputCommon/Src/ControllerInterface/XInput/XInput.cpp72
-rw-r--r--Source/Core/InputCommon/Src/ControllerInterface/XInput/XInput.h10
5 files changed, 79 insertions, 31 deletions
diff --git a/Source/Core/InputCommon/Src/ControllerInterface/ControllerInterface.cpp b/Source/Core/InputCommon/Src/ControllerInterface/ControllerInterface.cpp
index bc1e115c17..4e38e480ff 100644
--- a/Source/Core/InputCommon/Src/ControllerInterface/ControllerInterface.cpp
+++ b/Source/Core/InputCommon/Src/ControllerInterface/ControllerInterface.cpp
@@ -99,7 +99,7 @@ void ControllerInterface::Shutdown()
m_devices.clear();
#ifdef CIFACE_USE_XINPUT
- // nothing needed
+ ciface::XInput::DeInit();
#endif
#ifdef CIFACE_USE_DINPUT
// nothing needed
diff --git a/Source/Core/InputCommon/Src/ControllerInterface/SDL/SDL.cpp b/Source/Core/InputCommon/Src/ControllerInterface/SDL/SDL.cpp
index 40c822c577..45be64e91b 100644
--- a/Source/Core/InputCommon/Src/ControllerInterface/SDL/SDL.cpp
+++ b/Source/Core/InputCommon/Src/ControllerInterface/SDL/SDL.cpp
@@ -7,11 +7,7 @@
#include <algorithm>
#ifdef _WIN32
- #if SDL_VERSION_ATLEAST(1, 3, 0)
- #pragma comment(lib, "SDL.1.3.lib")
- #else
- #pragma comment(lib, "SDL.lib")
- #endif
+#pragma comment(lib, "SDL2.lib")
#endif
namespace ciface
@@ -201,7 +197,7 @@ std::string Joystick::TriangleEffect::GetName() const
return "Triangle";
}
-void Joystick::ConstantEffect::SetState(const ControlState state)
+void Joystick::ConstantEffect::SetState(ControlState state)
{
if (state)
{
@@ -219,7 +215,7 @@ void Joystick::ConstantEffect::SetState(const ControlState state)
m_effect.changed = true;
}
-void Joystick::RampEffect::SetState(const ControlState state)
+void Joystick::RampEffect::SetState(ControlState state)
{
if (state)
{
@@ -237,7 +233,7 @@ void Joystick::RampEffect::SetState(const ControlState state)
m_effect.changed = true;
}
-void Joystick::SineEffect::SetState(const ControlState state)
+void Joystick::SineEffect::SetState(ControlState state)
{
if (state)
{
@@ -260,7 +256,7 @@ void Joystick::SineEffect::SetState(const ControlState state)
}
#ifdef SDL_HAPTIC_SQUARE
-void Joystick::SquareEffect::SetState(const ControlState state)
+void Joystick::SquareEffect::SetState(ControlState state)
{
if (state)
{
@@ -283,7 +279,7 @@ void Joystick::SquareEffect::SetState(const ControlState state)
}
#endif // defined(SDL_HAPTIC_SQUARE)
-void Joystick::TriangleEffect::SetState(const ControlState state)
+void Joystick::TriangleEffect::SetState(ControlState state)
{
if (state)
{
diff --git a/Source/Core/InputCommon/Src/ControllerInterface/SDL/SDL.h b/Source/Core/InputCommon/Src/ControllerInterface/SDL/SDL.h
index 9b9794c481..8b802540b1 100644
--- a/Source/Core/InputCommon/Src/ControllerInterface/SDL/SDL.h
+++ b/Source/Core/InputCommon/Src/ControllerInterface/SDL/SDL.h
@@ -81,7 +81,7 @@ private:
public:
std::string GetName() const;
ConstantEffect(EffectIDState& effect) : m_effect(effect) {}
- void SetState(const ControlState state);
+ void SetState(ControlState state);
private:
EffectIDState& m_effect;
};
@@ -91,7 +91,7 @@ private:
public:
std::string GetName() const;
RampEffect(EffectIDState& effect) : m_effect(effect) {}
- void SetState(const ControlState state);
+ void SetState(ControlState state);
private:
EffectIDState& m_effect;
};
@@ -101,7 +101,7 @@ private:
public:
std::string GetName() const;
SineEffect(EffectIDState& effect) : m_effect(effect) {}
- void SetState(const ControlState state);
+ void SetState(ControlState state);
private:
EffectIDState& m_effect;
};
@@ -112,7 +112,7 @@ private:
public:
std::string GetName() const;
SquareEffect(EffectIDState& effect) : m_effect(effect) {}
- void SetState(const ControlState state);
+ void SetState(ControlState state);
private:
EffectIDState& m_effect;
};
@@ -123,7 +123,7 @@ private:
public:
std::string GetName() const;
TriangleEffect(EffectIDState& effect) : m_effect(effect) {}
- void SetState(const ControlState state);
+ void SetState(ControlState state);
private:
EffectIDState& m_effect;
};
diff --git a/Source/Core/InputCommon/Src/ControllerInterface/XInput/XInput.cpp b/Source/Core/InputCommon/Src/ControllerInterface/XInput/XInput.cpp
index c687bef856..2bc924bf41 100644
--- a/Source/Core/InputCommon/Src/ControllerInterface/XInput/XInput.cpp
+++ b/Source/Core/InputCommon/Src/ControllerInterface/XInput/XInput.cpp
@@ -48,14 +48,60 @@ static const char* const named_motors[] =
"Motor R"
};
+static HMODULE hXInput = nullptr;
+
+typedef decltype(&XInputGetCapabilities) XInputGetCapabilities_t;
+typedef decltype(&XInputSetState) XInputSetState_t;
+typedef decltype(&XInputGetState) XInputGetState_t;
+
+static XInputGetCapabilities_t PXInputGetCapabilities = nullptr;
+static XInputSetState_t PXInputSetState = nullptr;
+static XInputGetState_t PXInputGetState = nullptr;
+
void Init(std::vector<Core::Device*>& devices)
{
+ if (!hXInput)
+ {
+ // Try for the most recent version we were compiled against (will only work if running on Win8+)
+ hXInput = ::LoadLibrary(XINPUT_DLL);
+ if (!hXInput)
+ {
+ // Drop back to DXSDK June 2010 version. Requires DX June 2010 redist.
+ hXInput = ::LoadLibrary(TEXT("xinput1_3.dll"));
+ if (!hXInput)
+ {
+ return;
+ }
+ }
+
+ PXInputGetCapabilities = (XInputGetCapabilities_t)::GetProcAddress(hXInput, "XInputGetCapabilities");
+ PXInputSetState = (XInputSetState_t)::GetProcAddress(hXInput, "XInputSetState");
+ PXInputGetState = (XInputGetState_t)::GetProcAddress(hXInput, "XInputGetState");
+ if (!PXInputGetCapabilities ||
+ !PXInputSetState ||
+ !PXInputGetState)
+ {
+ ::FreeLibrary(hXInput);
+ hXInput = nullptr;
+ return;
+ }
+ }
+
XINPUT_CAPABILITIES caps;
for (int i = 0; i != 4; ++i)
- if (ERROR_SUCCESS == XInputGetCapabilities(i, 0, &caps))
+ if (ERROR_SUCCESS == PXInputGetCapabilities(i, 0, &caps))
devices.push_back(new Device(caps, i));
}
+void DeInit()
+{
+ if (hXInput)
+ {
+ ::FreeLibrary(hXInput);
+ hXInput = nullptr;
+ }
+}
+
Device::Device(const XINPUT_CAPABILITIES& caps, u8 index)
: m_index(index), m_subtype(caps.SubType)
{
@@ -112,20 +158,16 @@ void Device::ClearInputState()
std::string Device::GetName() const
{
- // why aren't these defined
- // subtype doesn't seem to work, I tested with 2 different arcade sticks, both were shown as gamepad
- // I'll leave it in anyway, maybe m$ will fix it
-
switch (m_subtype)
{
- case XINPUT_DEVSUBTYPE_GAMEPAD : return "Gamepad"; break;
- case 0x02 /*XINPUT_DEVSUBTYPE_WHEEL*/ : return "Wheel"; break;
- case 0x03 /*XINPUT_DEVSUBTYPE_ARCADE_STICK*/ : return "Arcade Stick"; break;
- case 0x04 /*XINPUT_DEVSUBTYPE_FLIGHT_STICK*/ : return "Flight Stick"; break;
- case 0x05 /*XINPUT_DEVSUBTYPE_DANCE_PAD*/ : return "Dance Pad"; break;
- case 0x06 /*XINPUT_DEVSUBTYPE_GUITAR*/ : return "Guitar"; break;
- case 0x08 /*XINPUT_DEVSUBTYPE_DRUM_KIT*/ : return "Drum Kit"; break;
- default : return "Device"; break;
+ case XINPUT_DEVSUBTYPE_GAMEPAD: return "Gamepad"; break;
+ case XINPUT_DEVSUBTYPE_WHEEL: return "Wheel"; break;
+ case XINPUT_DEVSUBTYPE_ARCADE_STICK: return "Arcade Stick"; break;
+ case XINPUT_DEVSUBTYPE_FLIGHT_STICK: return "Flight Stick"; break;
+ case XINPUT_DEVSUBTYPE_DANCE_PAD: return "Dance Pad"; break;
+ case XINPUT_DEVSUBTYPE_GUITAR: return "Guitar"; break;
+ case XINPUT_DEVSUBTYPE_DRUM_KIT: return "Drum Kit"; break;
+ default: return "Device"; break;
}
}
@@ -143,7 +185,7 @@ std::string Device::GetSource() const
bool Device::UpdateInput()
{
- return (ERROR_SUCCESS == XInputGetState(m_index, &m_state_in));
+ return (ERROR_SUCCESS == PXInputGetState(m_index, &m_state_in));
}
bool Device::UpdateOutput()
@@ -153,7 +195,7 @@ bool Device::UpdateOutput()
if (memcmp(&m_state_out, &m_current_state_out, sizeof(m_state_out)))
{
m_current_state_out = m_state_out;
- return (ERROR_SUCCESS == XInputSetState(m_index, &m_state_out));
+ return (ERROR_SUCCESS == PXInputSetState(m_index, &m_state_out));
}
else
{
diff --git a/Source/Core/InputCommon/Src/ControllerInterface/XInput/XInput.h b/Source/Core/InputCommon/Src/ControllerInterface/XInput/XInput.h
index 8fe6dd1dee..17e49e5e2b 100644
--- a/Source/Core/InputCommon/Src/ControllerInterface/XInput/XInput.h
+++ b/Source/Core/InputCommon/Src/ControllerInterface/XInput/XInput.h
@@ -1,3 +1,8 @@
+// XInput suffers a similar issue as XAudio2. Since Win8, it is part of the OS.
+// However, unlike XAudio2 they have not made the API incompatible - so we just
+// compile against the latest version and fall back to dynamically loading the
+// old DLL.
+
#ifndef _CIFACE_XINPUT_H_
#define _CIFACE_XINPUT_H_
@@ -7,12 +12,17 @@
#include <Windows.h>
#include <XInput.h>
+#ifndef XINPUT_DEVSUBTYPE_FLIGHT_STICK
+#error You are building this module against the wrong version of DirectX. You probably need to remove DXSDK_DIR from your include path and/or _WIN32_WINNT is wrong.
+#endif
+
namespace ciface
{
namespace XInput
{
void Init(std::vector<Core::Device*>& devices);
+void DeInit();
class Device : public Core::Device
{