summaryrefslogtreecommitdiff
path: root/Source/Core/InputCommon/ControllerInterface
diff options
context:
space:
mode:
authorRyan Houdek <Sonicadvance1@gmail.com>2014-12-07 01:22:03 -0600
committerRyan Houdek <Sonicadvance1@gmail.com>2014-12-07 01:22:03 -0600
commitd9d0e285c94b205d3b59b55b4d0dfec9d78b2683 (patch)
tree166e75747843fc652a39cc683b4aa399c30e2c17 /Source/Core/InputCommon/ControllerInterface
parent4e98078dafe0075a02c371ae463a4b933ca04d6d (diff)
parent854f6b8688063544310edbc0fc27a8c42f517d9b (diff)
Merge pull request #1560 from magcius/pad-cleanup-1
Pad cleanup 1
Diffstat (limited to 'Source/Core/InputCommon/ControllerInterface')
-rw-r--r--Source/Core/InputCommon/ControllerInterface/Android/Android.h3
-rw-r--r--Source/Core/InputCommon/ControllerInterface/ControllerInterface.cpp53
-rw-r--r--Source/Core/InputCommon/ControllerInterface/ControllerInterface.h3
-rw-r--r--Source/Core/InputCommon/ControllerInterface/DInput/DInputJoystick.cpp17
-rw-r--r--Source/Core/InputCommon/ControllerInterface/DInput/DInputJoystick.h4
-rw-r--r--Source/Core/InputCommon/ControllerInterface/DInput/DInputKeyboardMouse.cpp71
-rw-r--r--Source/Core/InputCommon/ControllerInterface/DInput/DInputKeyboardMouse.h15
-rw-r--r--Source/Core/InputCommon/ControllerInterface/Device.cpp14
-rw-r--r--Source/Core/InputCommon/ControllerInterface/Device.h5
-rw-r--r--Source/Core/InputCommon/ControllerInterface/ForceFeedback/ForceFeedbackDevice.cpp115
-rw-r--r--Source/Core/InputCommon/ControllerInterface/ForceFeedback/ForceFeedbackDevice.h21
-rw-r--r--Source/Core/InputCommon/ControllerInterface/OSX/OSXJoystick.h2
-rw-r--r--Source/Core/InputCommon/ControllerInterface/OSX/OSXJoystick.mm5
-rw-r--r--Source/Core/InputCommon/ControllerInterface/OSX/OSXKeyboard.h3
-rw-r--r--Source/Core/InputCommon/ControllerInterface/OSX/OSXKeyboard.mm9
-rw-r--r--Source/Core/InputCommon/ControllerInterface/SDL/SDL.cpp176
-rw-r--r--Source/Core/InputCommon/ControllerInterface/SDL/SDL.h59
-rw-r--r--Source/Core/InputCommon/ControllerInterface/XInput/XInput.cpp27
-rw-r--r--Source/Core/InputCommon/ControllerInterface/XInput/XInput.h12
-rw-r--r--Source/Core/InputCommon/ControllerInterface/Xlib/XInput2.cpp9
-rw-r--r--Source/Core/InputCommon/ControllerInterface/Xlib/XInput2.h3
-rw-r--r--Source/Core/InputCommon/ControllerInterface/Xlib/Xlib.cpp10
-rw-r--r--Source/Core/InputCommon/ControllerInterface/Xlib/Xlib.h3
23 files changed, 168 insertions, 471 deletions
diff --git a/Source/Core/InputCommon/ControllerInterface/Android/Android.h b/Source/Core/InputCommon/ControllerInterface/Android/Android.h
index 309f42e604..5d6767aa03 100644
--- a/Source/Core/InputCommon/ControllerInterface/Android/Android.h
+++ b/Source/Core/InputCommon/ControllerInterface/Android/Android.h
@@ -39,9 +39,6 @@ private:
};
public:
- bool UpdateInput() { return true; }
- bool UpdateOutput() { return true; }
-
Touchscreen(int padID);
~Touchscreen() {}
diff --git a/Source/Core/InputCommon/ControllerInterface/ControllerInterface.cpp b/Source/Core/InputCommon/ControllerInterface/ControllerInterface.cpp
index e75df76a36..3eb1b95ff2 100644
--- a/Source/Core/InputCommon/ControllerInterface/ControllerInterface.cpp
+++ b/Source/Core/InputCommon/ControllerInterface/ControllerInterface.cpp
@@ -98,9 +98,6 @@ void ControllerInterface::Shutdown()
for (ciface::Core::Device::Output* o : d->Outputs())
o->SetState(0);
- // Update output
- d->UpdateOutput();
-
// Delete device
delete d;
}
@@ -135,52 +132,15 @@ void ControllerInterface::Shutdown()
//
// Update input for all devices, return true if all devices returned successful
//
-bool ControllerInterface::UpdateInput(const bool force)
-{
- std::unique_lock<std::recursive_mutex> lk(update_lock, std::defer_lock);
-
- if (force)
- lk.lock();
- else if (!lk.try_lock())
- return false;
-
- size_t ok_count = 0;
-
- for (ciface::Core::Device* d : m_devices)
- {
- if (d->UpdateInput())
- ++ok_count;
- //else
- // disabled. it might be causing problems
- //(*d)->ClearInputState();
- }
-
- return (m_devices.size() == ok_count);
-}
-
-//
-// UpdateOutput
-//
-// Update output for all devices, return true if all devices returned successful
-//
-bool ControllerInterface::UpdateOutput(const bool force)
+void ControllerInterface::UpdateInput()
{
std::unique_lock<std::recursive_mutex> lk(update_lock, std::defer_lock);
- if (force)
- lk.lock();
- else if (!lk.try_lock())
- return false;
-
- size_t ok_count = 0;
+ if (!lk.try_lock())
+ return;
for (ciface::Core::Device* d : m_devices)
- {
- if (d->UpdateOutput())
- ++ok_count;
- }
-
- return (m_devices.size() == ok_count);
+ d->UpdateInput();
}
//
@@ -299,14 +259,9 @@ ciface::Core::Device::Control* ControllerInterface::OutputReference::Detect(cons
// this loop is to make stuff like flashing keyboard LEDs work
while (ms > (slept += 10))
- {
- // TODO: improve this to update more than just the default device's output
- device->UpdateOutput();
Common::SleepCurrentThread(10);
- }
State(0);
- device->UpdateOutput();
}
return nullptr;
}
diff --git a/Source/Core/InputCommon/ControllerInterface/ControllerInterface.h b/Source/Core/InputCommon/ControllerInterface/ControllerInterface.h
index 2420b65ed7..9ab8427ad2 100644
--- a/Source/Core/InputCommon/ControllerInterface/ControllerInterface.h
+++ b/Source/Core/InputCommon/ControllerInterface/ControllerInterface.h
@@ -120,8 +120,7 @@ public:
bool IsInit() const { return m_is_init; }
void UpdateReference(ControlReference* control, const ciface::Core::DeviceQualifier& default_device) const;
- bool UpdateInput(const bool force = false);
- bool UpdateOutput(const bool force = false);
+ void UpdateInput();
std::recursive_mutex update_lock;
diff --git a/Source/Core/InputCommon/ControllerInterface/DInput/DInputJoystick.cpp b/Source/Core/InputCommon/ControllerInterface/DInput/DInputJoystick.cpp
index ecd5db838c..bc8638293e 100644
--- a/Source/Core/InputCommon/ControllerInterface/DInput/DInputJoystick.cpp
+++ b/Source/Core/InputCommon/ControllerInterface/DInput/DInputJoystick.cpp
@@ -149,7 +149,9 @@ Joystick::Joystick( /*const LPCDIDEVICEINSTANCE lpddi, */const LPDIRECTINPUTDEVI
InitForceFeedback(m_device, (int)objects.size());
}
- ClearInputState();
+ ZeroMemory(&m_state_in, sizeof(m_state_in));
+ // set hats to center
+ memset(m_state_in.rgdwPOV, 0xFF, sizeof(m_state_in.rgdwPOV));
}
Joystick::~Joystick()
@@ -158,13 +160,6 @@ Joystick::~Joystick()
m_device->Release();
}
-void Joystick::ClearInputState()
-{
- ZeroMemory(&m_state_in, sizeof(m_state_in));
- // set hats to center
- memset(m_state_in.rgdwPOV, 0xFF, sizeof(m_state_in.rgdwPOV));
-}
-
std::string Joystick::GetName() const
{
return GetDeviceName(m_device);
@@ -182,7 +177,7 @@ std::string Joystick::GetSource() const
// update IO
-bool Joystick::UpdateInput()
+void Joystick::UpdateInput()
{
HRESULT hr = 0;
@@ -220,9 +215,7 @@ bool Joystick::UpdateInput()
// try reacquire if input lost
if (DIERR_INPUTLOST == hr || DIERR_NOTACQUIRED == hr)
- hr = m_device->Acquire();
-
- return SUCCEEDED(hr);
+ m_device->Acquire();
}
// get name
diff --git a/Source/Core/InputCommon/ControllerInterface/DInput/DInputJoystick.h b/Source/Core/InputCommon/ControllerInterface/DInput/DInputJoystick.h
index 0ac535cdfe..f1af8102cd 100644
--- a/Source/Core/InputCommon/ControllerInterface/DInput/DInputJoystick.h
+++ b/Source/Core/InputCommon/ControllerInterface/DInput/DInputJoystick.h
@@ -52,9 +52,7 @@ private:
};
public:
- bool UpdateInput();
-
- void ClearInputState();
+ void UpdateInput() override;
Joystick(const LPDIRECTINPUTDEVICE8 device, const unsigned int index);
~Joystick();
diff --git a/Source/Core/InputCommon/ControllerInterface/DInput/DInputKeyboardMouse.cpp b/Source/Core/InputCommon/ControllerInterface/DInput/DInputKeyboardMouse.cpp
index 05f28c79ae..c96e51a830 100644
--- a/Source/Core/InputCommon/ControllerInterface/DInput/DInputKeyboardMouse.cpp
+++ b/Source/Core/InputCommon/ControllerInterface/DInput/DInputKeyboardMouse.cpp
@@ -30,17 +30,6 @@ static const struct
#include "InputCommon/ControllerInterface/DInput/NamedKeys.h" // NOLINT
};
-static const struct
-{
- const BYTE code;
- const char* const name;
-} named_lights[] =
-{
- { VK_NUMLOCK, "NUM LOCK" },
- { VK_CAPITAL, "CAPS LOCK" },
- { VK_SCROLL, "SCROLL LOCK" }
-};
-
// lil silly
static HWND hwnd;
@@ -102,16 +91,11 @@ KeyboardMouse::KeyboardMouse(const LPDIRECTINPUTDEVICE8 kb_device, const LPDIREC
m_last_update = GetTickCount();
ZeroMemory(&m_state_in, sizeof(m_state_in));
- ZeroMemory(m_state_out, sizeof(m_state_out));
- ZeroMemory(&m_current_state_out, sizeof(m_current_state_out));
// KEYBOARD
// add keys
for (u8 i = 0; i < sizeof(named_keys)/sizeof(*named_keys); ++i)
AddInput(new Key(i, m_state_in.keyboard[named_keys[i].code]));
- // add lights
- for (u8 i = 0; i < sizeof(named_lights)/sizeof(*named_lights); ++i)
- AddOutput(new Light(i));
// MOUSE
// get caps
@@ -155,7 +139,7 @@ void GetMousePos(ControlState* const x, ControlState* const y)
*y = (ControlState)point.y / (ControlState)win_height * 2 - 1;
}
-bool KeyboardMouse::UpdateInput()
+void KeyboardMouse::UpdateInput()
{
DIMOUSESTATE2 tmp_mouse;
@@ -191,50 +175,7 @@ bool KeyboardMouse::UpdateInput()
// update mouse cursor
GetMousePos(&m_state_in.cursor.x, &m_state_in.cursor.y);
-
- return true;
- }
-
- return false;
-}
-
-bool KeyboardMouse::UpdateOutput()
-{
- class KInput : public INPUT
- {
- public:
- KInput( const unsigned char key, const bool up = false )
- {
- memset( this, 0, sizeof(*this) );
- type = INPUT_KEYBOARD;
- ki.wVk = key;
-
- if (up)
- ki.dwFlags = KEYEVENTF_KEYUP;
- }
- };
-
- std::vector< KInput > kbinputs;
- for (unsigned int i = 0; i < sizeof(m_state_out)/sizeof(*m_state_out); ++i)
- {
- bool want_on = false;
- if (m_state_out[i])
- want_on = m_state_out[i] > GetTickCount() % 255 ; // light should flash when output is 0.5
-
- // lights are set to their original state when output is zero
- if (want_on ^ m_current_state_out[i])
- {
- kbinputs.push_back(KInput(named_lights[i].code)); // press
- kbinputs.push_back(KInput(named_lights[i].code, true)); // release
-
- m_current_state_out[i] ^= 1;
- }
}
-
- if (kbinputs.size())
- return ( kbinputs.size() == SendInput( (UINT)kbinputs.size(), &kbinputs[0], sizeof( kbinputs[0] ) ) );
- else
- return true;
}
std::string KeyboardMouse::GetName() const
@@ -280,11 +221,6 @@ std::string KeyboardMouse::Cursor::GetName() const
return tmpstr;
}
-std::string KeyboardMouse::Light::GetName() const
-{
- return named_lights[m_index].name;
-}
-
// get/set state
ControlState KeyboardMouse::Key::GetState() const
{
@@ -306,10 +242,5 @@ ControlState KeyboardMouse::Cursor::GetState() const
return std::max(0.0, ControlState(m_axis) / (m_positive ? 1.0 : -1.0));
}
-void KeyboardMouse::Light::SetState(const ControlState state)
-{
- //state_out[m_index] = (unsigned char)(state * 255);
-}
-
}
}
diff --git a/Source/Core/InputCommon/ControllerInterface/DInput/DInputKeyboardMouse.h b/Source/Core/InputCommon/ControllerInterface/DInput/DInputKeyboardMouse.h
index f4ad99db2d..704635057e 100644
--- a/Source/Core/InputCommon/ControllerInterface/DInput/DInputKeyboardMouse.h
+++ b/Source/Core/InputCommon/ControllerInterface/DInput/DInputKeyboardMouse.h
@@ -76,19 +76,8 @@ private:
const bool m_positive;
};
- class Light : public Output
- {
- public:
- std::string GetName() const;
- Light(u8 index) : m_index(index) {}
- void SetState(ControlState state);
- private:
- const u8 m_index;
- };
-
public:
- bool UpdateInput();
- bool UpdateOutput();
+ void UpdateInput() override;
KeyboardMouse(const LPDIRECTINPUTDEVICE8 kb_device, const LPDIRECTINPUTDEVICE8 mo_device);
~KeyboardMouse();
@@ -103,8 +92,6 @@ private:
DWORD m_last_update;
State m_state_in;
- unsigned char m_state_out[3]; // NUM CAPS SCROLL
- bool m_current_state_out[3]; // NUM CAPS SCROLL
};
}
diff --git a/Source/Core/InputCommon/ControllerInterface/Device.cpp b/Source/Core/InputCommon/ControllerInterface/Device.cpp
index 84af8649a8..f96c637426 100644
--- a/Source/Core/InputCommon/ControllerInterface/Device.cpp
+++ b/Source/Core/InputCommon/ControllerInterface/Device.cpp
@@ -66,20 +66,6 @@ Device::Output* Device::FindOutput(const std::string &name) const
return nullptr;
}
-//
-// Device :: ClearInputState
-//
-// Device classes should override this function
-// ControllerInterface will call this when the device returns failure during UpdateInput
-// used to try to set all buttons and axes to their default state when user unplugs a gamepad during play
-// buttons/axes that were held down at the time of unplugging should be seen as not pressed after unplugging
-//
-void Device::ClearInputState()
-{
- // this is going to be called for every UpdateInput call that fails
- // kinda slow but, w/e, should only happen when user unplugs a device while playing
-}
-
bool Device::Control::InputGateOn()
{
if (SConfig::GetInstance().m_BackgroundInput)
diff --git a/Source/Core/InputCommon/ControllerInterface/Device.h b/Source/Core/InputCommon/ControllerInterface/Device.h
index c23c0d29bf..fa536e4116 100644
--- a/Source/Core/InputCommon/ControllerInterface/Device.h
+++ b/Source/Core/InputCommon/ControllerInterface/Device.h
@@ -100,10 +100,7 @@ public:
virtual std::string GetName() const = 0;
virtual int GetId() const = 0;
virtual std::string GetSource() const = 0;
- virtual bool UpdateInput() = 0;
- virtual bool UpdateOutput() = 0;
-
- virtual void ClearInputState();
+ virtual void UpdateInput() {}
const std::vector<Input*>& Inputs() const { return m_inputs; }
const std::vector<Output*>& Outputs() const { return m_outputs; }
diff --git a/Source/Core/InputCommon/ControllerInterface/ForceFeedback/ForceFeedbackDevice.cpp b/Source/Core/InputCommon/ControllerInterface/ForceFeedback/ForceFeedbackDevice.cpp
index 4350444492..c6b1974a89 100644
--- a/Source/Core/InputCommon/ControllerInterface/ForceFeedback/ForceFeedbackDevice.cpp
+++ b/Source/Core/InputCommon/ControllerInterface/ForceFeedback/ForceFeedbackDevice.cpp
@@ -38,17 +38,6 @@ static const ForceType force_type_names[] =
//{GUID_Friction, "Friction"},
};
-ForceFeedbackDevice::~ForceFeedbackDevice()
-{
- // release the ff effect iface's
- for (EffectState& state : m_state_out)
- {
- state.iface->Stop();
- state.iface->Unload();
- state.iface->Release();
- }
-}
-
bool ForceFeedbackDevice::InitForceFeedback(const LPDIRECTINPUTDEVICE8 device, int cAxes)
{
if (cAxes == 0)
@@ -107,14 +96,12 @@ bool ForceFeedbackDevice::InitForceFeedback(const LPDIRECTINPUTDEVICE8 device, i
LPDIRECTINPUTEFFECT pEffect;
if (SUCCEEDED(device->CreateEffect(f.guid, &eff, &pEffect, nullptr)))
{
- m_state_out.push_back(EffectState(pEffect));
-
if (f.guid == GUID_ConstantForce)
- AddOutput(new ForceConstant(f.name, m_state_out.back()));
+ AddOutput(new ForceConstant(f.name, pEffect));
else if (f.guid == GUID_RampForce)
- AddOutput(new ForceRamp(f.name, m_state_out.back()));
+ AddOutput(new ForceRamp(f.name, pEffect));
else
- AddOutput(new ForcePeriodic(f.name, m_state_out.back()));
+ AddOutput(new ForcePeriodic(f.name, pEffect));
}
}
@@ -133,40 +120,32 @@ bool ForceFeedbackDevice::InitForceFeedback(const LPDIRECTINPUTDEVICE8 device, i
return true;
}
-bool ForceFeedbackDevice::UpdateOutput()
+template<typename P>
+ForceFeedbackDevice::Force<P>::~Force()
{
- size_t ok_count = 0;
+ m_iface->Stop();
+ m_iface->Unload();
+ m_iface->Release();
+}
- DIEFFECT eff;
- memset(&eff, 0, sizeof(eff));
+template<typename P>
+void ForceFeedbackDevice::Force<P>::Update()
+{
+ DIEFFECT eff = {};
eff.dwSize = sizeof(DIEFFECT);
eff.dwFlags = DIEFF_CARTESIAN | DIEFF_OBJECTOFFSETS;
- for (EffectState& state : m_state_out)
- {
- if (state.params)
- {
- if (state.size)
- {
- eff.cbTypeSpecificParams = state.size;
- eff.lpvTypeSpecificParams = state.params;
- // set params and start effect
- ok_count += SUCCEEDED(state.iface->SetParameters(&eff, DIEP_TYPESPECIFICPARAMS | DIEP_START));
- }
- else
- {
- ok_count += SUCCEEDED(state.iface->Stop());
- }
+ eff.cbTypeSpecificParams = sizeof(P);
+ eff.lpvTypeSpecificParams = &params;
- state.params = nullptr;
- }
- else
- {
- ++ok_count;
- }
- }
+ // set params and start effect
+ m_iface->SetParameters(&eff, DIEP_TYPESPECIFICPARAMS | DIEP_START);
+}
- return (m_state_out.size() == ok_count);
+template<typename P>
+void ForceFeedbackDevice::Force<P>::Stop()
+{
+ m_iface->Stop();
}
template<>
@@ -174,15 +153,14 @@ void ForceFeedbackDevice::ForceConstant::SetState(const ControlState state)
{
const LONG new_val = LONG(10000 * state);
- LONG &val = params.lMagnitude;
- if (val != new_val)
- {
- val = new_val;
- m_state.params = &params; // tells UpdateOutput the state has changed
+ if (params.lMagnitude == new_val)
+ return;
- // tells UpdateOutput to either start or stop the force
- m_state.size = new_val ? sizeof(params) : 0;
- }
+ params.lMagnitude = new_val;
+ if (new_val)
+ Update();
+ else
+ Stop();
}
template<>
@@ -190,14 +168,14 @@ void ForceFeedbackDevice::ForceRamp::SetState(const ControlState state)
{
const LONG new_val = LONG(10000 * state);
- if (params.lStart != new_val)
- {
- params.lStart = params.lEnd = new_val;
- m_state.params = &params; // tells UpdateOutput the state has changed
+ if (params.lStart == new_val)
+ return;
- // tells UpdateOutput to either start or stop the force
- m_state.size = new_val ? sizeof(params) : 0;
- }
+ params.lStart = params.lEnd = new_val;
+ if (new_val)
+ Update();
+ else
+ Stop();
}
template<>
@@ -205,22 +183,19 @@ void ForceFeedbackDevice::ForcePeriodic::SetState(const ControlState state)
{
const DWORD new_val = DWORD(10000 * state);
- DWORD &val = params.dwMagnitude;
- if (val != new_val)
- {
- val = new_val;
- //params.dwPeriod = 0;//DWORD(0.05 * DI_SECONDS); // zero is working fine for me
-
- m_state.params = &params; // tells UpdateOutput the state has changed
+ if (params.dwMagnitude == new_val)
+ return;
- // tells UpdateOutput to either start or stop the force
- m_state.size = new_val ? sizeof(params) : 0;
- }
+ params.dwMagnitude = new_val;
+ if (new_val)
+ Update();
+ else
+ Stop();
}
template <typename P>
-ForceFeedbackDevice::Force<P>::Force(const std::string& name, EffectState& state)
-: m_name(name), m_state(state)
+ForceFeedbackDevice::Force<P>::Force(const std::string& name, LPDIRECTINPUTEFFECT iface)
+: m_name(name), m_iface(iface)
{
memset(&params, 0, sizeof(params));
}
diff --git a/Source/Core/InputCommon/ControllerInterface/ForceFeedback/ForceFeedbackDevice.h b/Source/Core/InputCommon/ControllerInterface/ForceFeedback/ForceFeedbackDevice.h
index 31a1884aae..c42f0d41f7 100644
--- a/Source/Core/InputCommon/ControllerInterface/ForceFeedback/ForceFeedbackDevice.h
+++ b/Source/Core/InputCommon/ControllerInterface/ForceFeedback/ForceFeedbackDevice.h
@@ -25,25 +25,19 @@ namespace ForceFeedback
class ForceFeedbackDevice : public Core::Device
{
private:
- struct EffectState
- {
- EffectState(LPDIRECTINPUTEFFECT eff) : iface(eff), params(nullptr), size(0) {}
-
- LPDIRECTINPUTEFFECT iface;
- void* params; // null when force hasn't changed
- u8 size; // zero when force should stop
- };
-
template <typename P>
class Force : public Output
{
public:
std::string GetName() const;
- Force(const std::string& name, EffectState& state);
+ Force(const std::string& name, LPDIRECTINPUTEFFECT iface);
+ ~Force();
void SetState(ControlState state);
+ void Update();
+ void Stop();
private:
const std::string m_name;
- EffectState& m_state;
+ LPDIRECTINPUTEFFECT m_iface;
P params;
};
typedef Force<DICONSTANTFORCE> ForceConstant;
@@ -52,11 +46,6 @@ private:
public:
bool InitForceFeedback(const LPDIRECTINPUTDEVICE8, int cAxes);
- bool UpdateOutput();
-
- virtual ~ForceFeedbackDevice();
-private:
- std::list<EffectState> m_state_out;
};
diff --git a/Source/Core/InputCommon/ControllerInterface/OSX/OSXJoystick.h b/Source/Core/InputCommon/ControllerInterface/OSX/OSXJoystick.h
index ffbe475840..728d55dde8 100644
--- a/Source/Core/InputCommon/ControllerInterface/OSX/OSXJoystick.h
+++ b/Source/Core/InputCommon/ControllerInterface/OSX/OSXJoystick.h
@@ -72,8 +72,6 @@ private:
};
public:
- bool UpdateInput();
-
Joystick(IOHIDDeviceRef device, std::string name, int index);
~Joystick();
diff --git a/Source/Core/InputCommon/ControllerInterface/OSX/OSXJoystick.mm b/Source/Core/InputCommon/ControllerInterface/OSX/OSXJoystick.mm
index 93dea13c28..bdba40c410 100644
--- a/Source/Core/InputCommon/ControllerInterface/OSX/OSXJoystick.mm
+++ b/Source/Core/InputCommon/ControllerInterface/OSX/OSXJoystick.mm
@@ -90,11 +90,6 @@ Joystick::~Joystick()
m_ff_device->Release();
}
-bool Joystick::UpdateInput()
-{
- return true;
-}
-
std::string Joystick::GetName() const
{
return m_device_name;
diff --git a/Source/Core/InputCommon/ControllerInterface/OSX/OSXKeyboard.h b/Source/Core/InputCommon/ControllerInterface/OSX/OSXKeyboard.h
index 36705075ee..06e686fc6a 100644
--- a/Source/Core/InputCommon/ControllerInterface/OSX/OSXKeyboard.h
+++ b/Source/Core/InputCommon/ControllerInterface/OSX/OSXKeyboard.h
@@ -53,8 +53,7 @@ private:
};
public:
- bool UpdateInput();
- bool UpdateOutput();
+ void UpdateInput() override;
Keyboard(IOHIDDeviceRef device, std::string name, int index, void *window);
diff --git a/Source/Core/InputCommon/ControllerInterface/OSX/OSXKeyboard.mm b/Source/Core/InputCommon/ControllerInterface/OSX/OSXKeyboard.mm
index 1294346e1b..0e876f4173 100644
--- a/Source/Core/InputCommon/ControllerInterface/OSX/OSXKeyboard.mm
+++ b/Source/Core/InputCommon/ControllerInterface/OSX/OSXKeyboard.mm
@@ -54,7 +54,7 @@ Keyboard::Keyboard(IOHIDDeviceRef device, std::string name, int index, void *win
AddInput(new Button(i, m_mousebuttons[i]));
}
-bool Keyboard::UpdateInput()
+void Keyboard::UpdateInput()
{
CGRect bounds = CGRectZero;
uint32_t windowid[1] = { m_windowid };
@@ -85,13 +85,6 @@ bool Keyboard::UpdateInput()
m_mousebuttons[0] = CGEventSourceButtonState(kCGEventSourceStateHIDSystemState, kCGMouseButtonLeft);
m_mousebuttons[1] = CGEventSourceButtonState(kCGEventSourceStateHIDSystemState, kCGMouseButtonRight);
m_mousebuttons[2] = CGEventSourceButtonState(kCGEventSourceStateHIDSystemState, kCGMouseButtonCenter);
-
- return true;
-}
-
-bool Keyboard::UpdateOutput()
-{
- return true;
}
std::string Keyboard::GetName() const
diff --git a/Source/Core/InputCommon/ControllerInterface/SDL/SDL.cpp b/Source/Core/InputCommon/ControllerInterface/SDL/SDL.cpp
index b745f7b2d4..a46a08100d 100644
--- a/Source/Core/InputCommon/ControllerInterface/SDL/SDL.cpp
+++ b/Source/Core/InputCommon/ControllerInterface/SDL/SDL.cpp
@@ -121,40 +121,26 @@ Joystick::Joystick(SDL_Joystick* const joystick, const int sdl_index, const unsi
// constant effect
if (supported_effects & SDL_HAPTIC_CONSTANT)
- {
- m_state_out.push_back(EffectIDState());
- AddOutput(new ConstantEffect(m_state_out.back()));
- }
+ AddOutput(new ConstantEffect(m_haptic));
// ramp effect
if (supported_effects & SDL_HAPTIC_RAMP)
- {
- m_state_out.push_back(EffectIDState());
- AddOutput(new RampEffect(m_state_out.back()));
- }
+ AddOutput(new RampEffect(m_haptic));
// sine effect
if (supported_effects & SDL_HAPTIC_SINE)
- {
- m_state_out.push_back(EffectIDState());
- AddOutput(new SineEffect(m_state_out.back()));
- }
+ AddOutput(new SineEffect(m_haptic));
#ifdef SDL_HAPTIC_SQUARE
// square effect
if (supported_effects & SDL_HAPTIC_SQUARE)
- {
- m_state_out.push_back(EffectIDState());
- AddOutput(new SquareEffect(m_state_out.back()));
- }
+ AddOutput(new SquareEffect(m_haptic));
+
#endif // defined(SDL_HAPTIC_SQUARE)
// triangle effect
if (supported_effects & SDL_HAPTIC_TRIANGLE)
- {
- m_state_out.push_back(EffectIDState());
- AddOutput(new TriangleEffect(m_state_out.back()));
- }
+ AddOutput(new TriangleEffect(m_haptic));
}
#endif
@@ -167,13 +153,6 @@ Joystick::~Joystick()
{
// stop/destroy all effects
SDL_HapticStopAll(m_haptic);
- for (auto &i : m_state_out)
- {
- if (i.id != -1)
- {
- SDL_HapticDestroyEffect(m_haptic, i.id);
- }
- }
// close haptic first
SDL_HapticClose(m_haptic);
}
@@ -184,6 +163,26 @@ Joystick::~Joystick()
}
#ifdef USE_SDL_HAPTIC
+void Joystick::HapticEffect::Update()
+{
+ if (m_id == -1 && m_effect.type > 0)
+ {
+ m_id = SDL_HapticNewEffect(m_haptic, &m_effect);
+ if (m_id > -1)
+ SDL_HapticRunEffect(m_haptic, m_id, 1);
+ }
+ else if (m_id > -1 && m_effect.type == 0)
+ {
+ SDL_HapticStopEffect(m_haptic, m_id);
+ SDL_HapticDestroyEffect(m_haptic, m_id);
+ m_id = -1;
+ }
+ else if (m_id > -1)
+ {
+ SDL_HapticUpdateEffect(m_haptic, m_id, &m_effect);
+ }
+}
+
std::string Joystick::ConstantEffect::GetName() const
{
return "Constant";
@@ -215,58 +214,51 @@ void Joystick::ConstantEffect::SetState(ControlState state)
{
if (state)
{
- m_effect.effect.type = SDL_HAPTIC_CONSTANT;
- m_effect.effect.constant.length = SDL_HAPTIC_INFINITY;
+ m_effect.type = SDL_HAPTIC_CONSTANT;
+ m_effect.constant.length = SDL_HAPTIC_INFINITY;
}
else
{
- m_effect.effect.type = 0;
+ m_effect.type = 0;
}
- const Sint16 old = m_effect.effect.constant.level;
- m_effect.effect.constant.level = (Sint16)(state * 0x7FFF);
- if (old != m_effect.effect.constant.level)
- m_effect.changed = true;
+ m_effect.constant.level = (Sint16)(state * 0x7FFF);
+ Update();
}
void Joystick::RampEffect::SetState(ControlState state)
{
if (state)
{
- m_effect.effect.type = SDL_HAPTIC_RAMP;
- m_effect.effect.ramp.length = SDL_HAPTIC_INFINITY;
+ m_effect.type = SDL_HAPTIC_RAMP;
+ m_effect.ramp.length = SDL_HAPTIC_INFINITY;
}
else
{
- m_effect.effect.type = 0;
+ m_effect.type = 0;
}
- const Sint16 old = m_effect.effect.ramp.start;
- m_effect.effect.ramp.start = (Sint16)(state * 0x7FFF);
- if (old != m_effect.effect.ramp.start)
- m_effect.changed = true;
+ m_effect.ramp.start = (Sint16)(state * 0x7FFF);
+ Update();
}
void Joystick::SineEffect::SetState(ControlState state)
{
if (state)
{
- m_effect.effect.type = SDL_HAPTIC_SINE;
- m_effect.effect.periodic.length = 250;
+ m_effect.type = SDL_HAPTIC_SINE;
+ m_effect.periodic.length = 250;
}
else
{
- m_effect.effect.type = 0;
+ m_effect.type = 0;
}
- const Sint16 old = m_effect.effect.periodic.magnitude;
- m_effect.effect.periodic.period = 5;
- m_effect.effect.periodic.magnitude = (Sint16)(state * 0x5000);
- m_effect.effect.periodic.attack_length = 0;
- m_effect.effect.periodic.fade_length = 500;
-
- if (old != m_effect.effect.periodic.magnitude)
- m_effect.changed = true;
+ m_effect.periodic.period = 5;
+ m_effect.periodic.magnitude = (Sint16)(state * 0x5000);
+ m_effect.periodic.attack_length = 0;
+ m_effect.periodic.fade_length = 500;
+ Update();
}
#ifdef SDL_HAPTIC_SQUARE
@@ -274,22 +266,19 @@ void Joystick::SquareEffect::SetState(ControlState state)
{
if (state)
{
- m_effect.effect.type = SDL_HAPTIC_SQUARE;
- m_effect.effect.periodic.length = 250;
+ m_effect.type = SDL_HAPTIC_SQUARE;
+ m_effect.periodic.length = 250;
}
else
{
- m_effect.effect.type = 0;
+ m_effect.type = 0;
}
- const Sint16 old = m_effect.effect.periodic.magnitude;
- m_effect.effect.periodic.period = 5;
- m_effect.effect.periodic.magnitude = state * 0x5000;
- m_effect.effect.periodic.attack_length = 0;
- m_effect.effect.periodic.fade_length = 100;
-
- if (old != m_effect.effect.periodic.magnitude)
- m_effect.changed = true;
+ m_effect.periodic.period = 5;
+ m_effect.periodic.magnitude = state * 0x5000;
+ m_effect.periodic.attack_length = 0;
+ m_effect.periodic.fade_length = 100;
+ Update();
}
#endif // defined(SDL_HAPTIC_SQUARE)
@@ -297,69 +286,26 @@ void Joystick::TriangleEffect::SetState(ControlState state)
{
if (state)
{
- m_effect.effect.type = SDL_HAPTIC_TRIANGLE;
- m_effect.effect.periodic.length = 250;
+ m_effect.type = SDL_HAPTIC_TRIANGLE;
+ m_effect.periodic.length = 250;
}
else
{
- m_effect.effect.type = 0;
+ m_effect.type = 0;
}
- const Sint16 old = m_effect.effect.periodic.magnitude;
- m_effect.effect.periodic.period = 5;
- m_effect.effect.periodic.magnitude = (Sint16)(state * 0x5000);
- m_effect.effect.periodic.attack_length = 0;
- m_effect.effect.periodic.fade_length = 100;
-
- if (old != m_effect.effect.periodic.magnitude)
- m_effect.changed = true;
+ m_effect.periodic.period = 5;
+ m_effect.periodic.magnitude = (Sint16)(state * 0x5000);
+ m_effect.periodic.attack_length = 0;
+ m_effect.periodic.fade_length = 100;
+ Update();
}
#endif
-bool Joystick::UpdateInput()
+void Joystick::UpdateInput()
{
// each joystick is doin this, o well
SDL_JoystickUpdate();
-
- return true;
-}
-
-bool Joystick::UpdateOutput()
-{
-#ifdef USE_SDL_HAPTIC
- for (auto &i : m_state_out)
- {
- if (i.changed) // if SetState was called on this output
- {
- if (-1 == i.id) // effect isn't currently uploaded
- {
- if (i.effect.type) // if outputstate is >0 this would be true
- {
- if ((i.id = SDL_HapticNewEffect(m_haptic, &i.effect)) > -1) // upload the effect
- {
- SDL_HapticRunEffect(m_haptic, i.id, 1); // run the effect
- }
- }
- }
- else // effect is already uploaded
- {
- if (i.effect.type) // if ouputstate >0
- {
- SDL_HapticUpdateEffect(m_haptic, i.id, &i.effect); // update the effect
- }
- else
- {
- SDL_HapticStopEffect(m_haptic, i.id); // else, stop and remove the effect
- SDL_HapticDestroyEffect(m_haptic, i.id);
- i.id = -1; // mark it as not uploaded
- }
- }
-
- i.changed = false;
- }
- }
-#endif
- return true;
}
std::string Joystick::GetName() const
diff --git a/Source/Core/InputCommon/ControllerInterface/SDL/SDL.h b/Source/Core/InputCommon/ControllerInterface/SDL/SDL.h
index 76fc028ec9..dc4c52063f 100644
--- a/Source/Core/InputCommon/ControllerInterface/SDL/SDL.h
+++ b/Source/Core/InputCommon/ControllerInterface/SDL/SDL.h
@@ -33,17 +33,6 @@ class Joystick : public Core::Device
{
private:
-#ifdef USE_SDL_HAPTIC
- struct EffectIDState
- {
- EffectIDState() : effect(SDL_HapticEffect()), id(-1), changed(false) {}
-
- SDL_HapticEffect effect;
- int id;
- bool changed;
- };
-#endif
-
class Button : public Core::Device::Input
{
public:
@@ -80,62 +69,65 @@ private:
};
#ifdef USE_SDL_HAPTIC
- class ConstantEffect : public Output
+ class HapticEffect : public Output
{
public:
+ HapticEffect(SDL_Haptic* haptic) : m_haptic(haptic), m_id(-1) {}
+ ~HapticEffect() { m_effect.type = 0; Update(); }
+
+ protected:
+ void Update();
+
+ SDL_HapticEffect m_effect;
+ SDL_Haptic* m_haptic;
+ int m_id;
+ };
+
+ class ConstantEffect : public HapticEffect
+ {
+ public:
+ ConstantEffect(SDL_Haptic* haptic) : HapticEffect(haptic) {}
std::string GetName() const override;
- ConstantEffect(EffectIDState& effect) : m_effect(effect) {}
void SetState(ControlState state) override;
- private:
- EffectIDState& m_effect;
};
- class RampEffect : public Output
+ class RampEffect : public HapticEffect
{
public:
+ RampEffect(SDL_Haptic* haptic) : HapticEffect(haptic) {}
std::string GetName() const override;
- RampEffect(EffectIDState& effect) : m_effect(effect) {}
void SetState(ControlState state) override;
- private:
- EffectIDState& m_effect;
};
- class SineEffect : public Output
+ class SineEffect : public HapticEffect
{
public:
+ SineEffect(SDL_Haptic* haptic) : HapticEffect(haptic) {}
std::string GetName() const override;
- SineEffect(EffectIDState& effect) : m_effect(effect) {}
void SetState(ControlState state) override;
- private:
- EffectIDState& m_effect;
};
#ifdef SDL_HAPTIC_SQUARE
- class SquareEffect : public Output
+ class SquareEffect : public HapticEffect
{
public:
+ SquareEffect(SDL_Haptic* haptic) : HapticEffect(haptic) {}
std::string GetName() const;
- SquareEffect(EffectIDState& effect) : m_effect(effect) {}
void SetState(ControlState state);
- private:
- EffectIDState& m_effect;
};
#endif // defined(SDL_HAPTIC_SQUARE)
- class TriangleEffect : public Output
+ class TriangleEffect : public HapticEffect
{
public:
+ TriangleEffect(SDL_Haptic* haptic) : HapticEffect(haptic) {}
std::string GetName() const override;
- TriangleEffect(EffectIDState& effect) : m_effect(effect) {}
void SetState(ControlState state) override;
- private:
- EffectIDState& m_effect;
};
#endif
public:
- bool UpdateInput() override;
- bool UpdateOutput() override;
+ void UpdateInput() override;
Joystick(SDL_Joystick* const joystick, const int sdl_index, const unsigned int index);
~Joystick();
@@ -150,7 +142,6 @@ private:
const unsigned int m_index;
#ifdef USE_SDL_HAPTIC
- std::list<EffectIDState> m_state_out;
SDL_Haptic* m_haptic;
#endif
};
diff --git a/Source/Core/InputCommon/ControllerInterface/XInput/XInput.cpp b/Source/Core/InputCommon/ControllerInterface/XInput/XInput.cpp
index 37949e03ac..2bf98bb0b3 100644
--- a/Source/Core/InputCommon/ControllerInterface/XInput/XInput.cpp
+++ b/Source/Core/InputCommon/ControllerInterface/XInput/XInput.cpp
@@ -121,7 +121,6 @@ Device::Device(const XINPUT_CAPABILITIES& caps, u8 index)
: m_index(index), m_subtype(caps.SubType)
{
ZeroMemory(&m_state_out, sizeof(m_state_out));
- ZeroMemory(&m_current_state_out, sizeof(m_current_state_out));
// XInputGetCaps seems to always claim all capabilities are supported
// but I will leave all this stuff in, incase m$ fixes xinput up a bit
@@ -162,14 +161,9 @@ Device::Device(const XINPUT_CAPABILITIES& caps, u8 index)
{
//WORD val = (&caps.Vibration.wLeftMotorSpeed)[i]; // should be max value / nope, more lies
if ((&caps.Vibration.wLeftMotorSpeed)[i])
- AddOutput(new Motor(i, (&m_state_out.wLeftMotorSpeed)[i], 65535));
+ AddOutput(new Motor(i, this, (&m_state_out.wLeftMotorSpeed)[i], 65535));
}
- ClearInputState();
-}
-
-void Device::ClearInputState()
-{
ZeroMemory(&m_state_in, sizeof(m_state_in));
}
@@ -208,24 +202,14 @@ std::string Device::GetSource() const
// Update I/O
-bool Device::UpdateInput()
+void Device::UpdateInput()
{
- return (ERROR_SUCCESS == PXInputGetState(m_index, &m_state_in));
+ PXInputGetState(m_index, &m_state_in);
}
-bool Device::UpdateOutput()
+void Device::UpdateMotors()
{
- // this if statement is to make rumble work better when multiple ControllerInterfaces are using the device
- // only calls XInputSetState if the state changed
- if (memcmp(&m_state_out, &m_current_state_out, sizeof(m_state_out)))
- {
- m_current_state_out = m_state_out;
- return (ERROR_SUCCESS == PXInputSetState(m_index, &m_state_out));
- }
- else
- {
- return true;
- }
+ PXInputSetState(m_index, &m_state_out);
}
// GET name/source/id
@@ -270,6 +254,7 @@ ControlState Device::Axis::GetState() const
void Device::Motor::SetState(ControlState state)
{
m_motor = (WORD)(state * m_range);
+ m_parent->UpdateMotors();
}
}
diff --git a/Source/Core/InputCommon/ControllerInterface/XInput/XInput.h b/Source/Core/InputCommon/ControllerInterface/XInput/XInput.h
index 3c9eadc395..94c1549a53 100644
--- a/Source/Core/InputCommon/ControllerInterface/XInput/XInput.h
+++ b/Source/Core/InputCommon/ControllerInterface/XInput/XInput.h
@@ -64,19 +64,17 @@ private:
{
public:
std::string GetName() const;
- Motor(u8 index, WORD& motor, WORD range) : m_index(index), m_motor(motor), m_range(range) {}
+ Motor(u8 index, Device* parent, WORD &motor, WORD range) : m_index(index), m_parent(parent), m_motor(motor), m_range(range) {}
void SetState(ControlState state);
private:
WORD& m_motor;
const WORD m_range;
const u8 m_index;
+ Device* m_parent;
};
public:
- bool UpdateInput();
- bool UpdateOutput();
-
- void ClearInputState();
+ void UpdateInput() override;
Device(const XINPUT_CAPABILITIES& capabilities, u8 index);
@@ -84,9 +82,11 @@ public:
int GetId() const;
std::string GetSource() const;
+ void UpdateMotors();
+
private:
XINPUT_STATE m_state_in;
- XINPUT_VIBRATION m_state_out, m_current_state_out;
+ XINPUT_VIBRATION m_state_out;
const BYTE m_subtype;
const u8 m_index;
};
diff --git a/Source/Core/InputCommon/ControllerInterface/Xlib/XInput2.cpp b/Source/Core/InputCommon/ControllerInterface/Xlib/XInput2.cpp
index 13ace15997..1d7d080d7e 100644
--- a/Source/Core/InputCommon/ControllerInterface/Xlib/XInput2.cpp
+++ b/Source/Core/InputCommon/ControllerInterface/Xlib/XInput2.cpp
@@ -208,7 +208,7 @@ void KeyboardMouse::UpdateCursor()
m_state.cursor.y = win_y / (float)win_attribs.height * 2 - 1;
}
-bool KeyboardMouse::UpdateInput()
+void KeyboardMouse::UpdateInput()
{
XFlush(m_display);
@@ -282,13 +282,6 @@ bool KeyboardMouse::UpdateInput()
m_state.axis.y *= MOUSE_AXIS_SMOOTHING;
m_state.axis.y += delta_y;
m_state.axis.y /= MOUSE_AXIS_SMOOTHING+1.0f;
-
- return true;
-}
-
-bool KeyboardMouse::UpdateOutput()
-{
- return true;
}
std::string KeyboardMouse::GetName() const
diff --git a/Source/Core/InputCommon/ControllerInterface/Xlib/XInput2.h b/Source/Core/InputCommon/ControllerInterface/Xlib/XInput2.h
index a75c74bba5..3f31aa50f2 100644
--- a/Source/Core/InputCommon/ControllerInterface/Xlib/XInput2.h
+++ b/Source/Core/InputCommon/ControllerInterface/Xlib/XInput2.h
@@ -98,8 +98,7 @@ private:
void UpdateCursor();
public:
- bool UpdateInput() override;
- bool UpdateOutput() override;
+ void UpdateInput() override;
KeyboardMouse(Window window, int opcode, int pointer_deviceid, int keyboard_deviceid);
~KeyboardMouse();
diff --git a/Source/Core/InputCommon/ControllerInterface/Xlib/Xlib.cpp b/Source/Core/InputCommon/ControllerInterface/Xlib/Xlib.cpp
index 973368a78e..9a700a9c99 100644
--- a/Source/Core/InputCommon/ControllerInterface/Xlib/Xlib.cpp
+++ b/Source/Core/InputCommon/ControllerInterface/Xlib/Xlib.cpp
@@ -49,7 +49,7 @@ KeyboardMouse::~KeyboardMouse()
XCloseDisplay(m_display);
}
-bool KeyboardMouse::UpdateInput()
+void KeyboardMouse::UpdateInput()
{
XQueryKeymap(m_display, m_state.keyboard);
@@ -64,16 +64,8 @@ bool KeyboardMouse::UpdateInput()
// the mouse position as a range from -1 to 1
m_state.cursor.x = (float)win_x / (float)win_attribs.width * 2 - 1;
m_state.cursor.y = (float)win_y / (float)win_attribs.height * 2 - 1;
-
- return true;
}
-bool KeyboardMouse::UpdateOutput()
-{
- return true;
-}
-
-
std::string KeyboardMouse::GetName() const
{
return "Keyboard Mouse";
diff --git a/Source/Core/InputCommon/ControllerInterface/Xlib/Xlib.h b/Source/Core/InputCommon/ControllerInterface/Xlib/Xlib.h
index 237b3a484e..0c2f79c8b3 100644
--- a/Source/Core/InputCommon/ControllerInterface/Xlib/Xlib.h
+++ b/Source/Core/InputCommon/ControllerInterface/Xlib/Xlib.h
@@ -70,8 +70,7 @@ private:
};
public:
- bool UpdateInput() override;
- bool UpdateOutput() override;
+ void UpdateInput() override;
KeyboardMouse(Window window);
~KeyboardMouse();