Merge pull request #788 from CookiePLMonster/xinput-improvements

Xinput improvements
This commit is contained in:
Connor McLaughlin 2020-08-24 00:19:37 +10:00 committed by GitHub
commit 419259bda0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 13 additions and 26 deletions

View File

@ -23,15 +23,19 @@ ControllerInterface::Backend XInputControllerInterface::GetBackend() const
bool XInputControllerInterface::Initialize(CommonHostInterface* host_interface)
{
m_xinput_module = LoadLibraryA("xinput1_4.dll");
m_xinput_module = LoadLibraryW(L"xinput1_4");
if (!m_xinput_module)
{
m_xinput_module = LoadLibraryA("xinput9_1_0.dll");
if (!m_xinput_module)
{
Log_ErrorPrintf("Failed to load XInput module.");
return false;
}
m_xinput_module = LoadLibraryW(L"xinput1_3");
}
if (!m_xinput_module)
{
m_xinput_module = LoadLibraryW(L"xinput9_1_0");
}
if (!m_xinput_module)
{
Log_ErrorPrintf("Failed to load XInput module.");
return false;
}
// Try the hidden version of XInputGetState(), which lets us query the guide button.
@ -39,11 +43,9 @@ bool XInputControllerInterface::Initialize(CommonHostInterface* host_interface)
reinterpret_cast<decltype(m_xinput_get_state)>(GetProcAddress(m_xinput_module, reinterpret_cast<LPCSTR>(100)));
if (!m_xinput_get_state)
reinterpret_cast<decltype(m_xinput_get_state)>(GetProcAddress(m_xinput_module, "XInputGetState"));
m_xinput_get_capabilities =
reinterpret_cast<decltype(m_xinput_get_capabilities)>(GetProcAddress(m_xinput_module, "XInputGetCapabilities"));
m_xinput_set_state =
reinterpret_cast<decltype(m_xinput_set_state)>(GetProcAddress(m_xinput_module, "XInputSetState"));
if (!m_xinput_get_state || !m_xinput_get_capabilities || !m_xinput_set_state)
if (!m_xinput_get_state || !m_xinput_set_state)
{
Log_ErrorPrintf("Failed to get XInput function pointers.");
return false;
@ -72,7 +74,6 @@ void XInputControllerInterface::PollEvents()
if (!cd.connected)
{
cd.connected = true;
UpdateCapabilities(i);
OnControllerConnected(static_cast<int>(i));
}
@ -155,17 +156,6 @@ void XInputControllerInterface::CheckForStateChanges(u32 index, const XINPUT_STA
}
}
void XInputControllerInterface::UpdateCapabilities(u32 index)
{
ControllerData& cd = m_controllers[index];
XINPUT_CAPABILITIES caps = {};
m_xinput_get_capabilities(index, 0, &caps);
cd.supports_rumble = (caps.Flags & 0x0001 /* XINPUT_CAPS_FFB_SUPPORTED */);
Log_InfoPrintf("Controller %u: Rumble is %s", index, cd.supports_rumble ? "supported" : "not supported");
}
void XInputControllerInterface::ClearBindings()
{
for (auto& it : m_controllers)
@ -277,7 +267,7 @@ u32 XInputControllerInterface::GetControllerRumbleMotorCount(int controller_inde
if (static_cast<u32>(controller_index) >= XUSER_MAX_COUNT || !m_controllers[controller_index].connected)
return 0;
return m_controllers[controller_index].supports_rumble ? NUM_RUMBLE_MOTORS : 0;
return NUM_RUMBLE_MOTORS;
}
void XInputControllerInterface::SetControllerRumbleStrength(int controller_index, const float* strengths,

View File

@ -60,7 +60,6 @@ private:
{
XINPUT_STATE last_state = {};
bool connected = false;
bool supports_rumble = false;
// Scaling value of 1.30f to 1.40f recommended when using recent controllers
float axis_scale = 1.00f;
@ -74,7 +73,6 @@ private:
using ControllerDataArray = std::array<ControllerData, XUSER_MAX_COUNT>;
void CheckForStateChanges(u32 index, const XINPUT_STATE& new_state);
void UpdateCapabilities(u32 index);
bool HandleAxisEvent(u32 index, Axis axis, s32 value);
bool HandleButtonEvent(u32 index, u32 button, bool pressed);
@ -82,7 +80,6 @@ private:
HMODULE m_xinput_module{};
DWORD(WINAPI* m_xinput_get_state)(DWORD, XINPUT_STATE*);
DWORD(WINAPI* m_xinput_get_capabilities)(DWORD, DWORD, XINPUT_CAPABILITIES*);
DWORD(WINAPI* m_xinput_set_state)(DWORD, XINPUT_VIBRATION*);
std::mutex m_event_intercept_mutex;
Hook::Callback m_event_intercept_callback;