forked from chromium/chromium
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add haptics for XInput gamepads on Windows
BUG=749295 Change-Id: I033a299bbd6c405fdb9fedefd18f36c21d3b8043 Reviewed-on: https://chromium-review.googlesource.com/764428 Commit-Queue: Matt Reynolds <mattreynolds@chromium.org> Reviewed-by: Brandon Jones <bajones@chromium.org> Cr-Commit-Position: refs/heads/master@{#528488}
- Loading branch information
Matt Reynolds
authored and
Commit Bot
committed
Jan 10, 2018
1 parent
fb4c31f
commit cff883a
Showing
5 changed files
with
144 additions
and
7 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
// Copyright 2018 The Chromium Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style license that can be | ||
// found in the LICENSE file. | ||
|
||
#include "device/gamepad/xinput_haptic_gamepad_win.h" | ||
|
||
namespace { | ||
const long kRumbleMagnitudeMax = 0xffff; | ||
} // namespace | ||
|
||
namespace device { | ||
|
||
XInputHapticGamepadWin::XInputHapticGamepadWin( | ||
int pad_id, | ||
XInputSetStateFunc xinput_set_state) | ||
: pad_id_(pad_id), xinput_set_state_(xinput_set_state) {} | ||
|
||
XInputHapticGamepadWin::~XInputHapticGamepadWin() = default; | ||
|
||
void XInputHapticGamepadWin::SetVibration(double strong_magnitude, | ||
double weak_magnitude) { | ||
if (pad_id_ < 0 || pad_id_ > XUSER_MAX_COUNT || xinput_set_state_ == nullptr) | ||
return; | ||
XINPUT_VIBRATION vibration; | ||
vibration.wLeftMotorSpeed = | ||
static_cast<long>(strong_magnitude * kRumbleMagnitudeMax); | ||
vibration.wRightMotorSpeed = | ||
static_cast<long>(weak_magnitude * kRumbleMagnitudeMax); | ||
|
||
TRACE_EVENT_BEGIN1("GAMEPAD", "XInputSetState", "id", pad_id_); | ||
xinput_set_state_(pad_id_, &vibration); | ||
TRACE_EVENT_END1("GAMEPAD", "XInputSetState", "id", pad_id_); | ||
} | ||
|
||
} // namespace device |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
// Copyright 2018 The Chromium Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style license that can be | ||
// found in the LICENSE file. | ||
|
||
#ifndef DEVICE_GAMEPAD_XINPUT_HAPTIC_GAMEPAD_WIN_ | ||
#define DEVICE_GAMEPAD_XINPUT_HAPTIC_GAMEPAD_WIN_ | ||
|
||
#include <Unknwn.h> | ||
#include <XInput.h> | ||
|
||
#include "device/gamepad/abstract_haptic_gamepad.h" | ||
|
||
namespace device { | ||
|
||
class XInputHapticGamepadWin : public AbstractHapticGamepad { | ||
public: | ||
typedef DWORD(WINAPI* XInputSetStateFunc)(DWORD dwUserIndex, | ||
XINPUT_VIBRATION* pVibration); | ||
|
||
XInputHapticGamepadWin(int pad_id, XInputSetStateFunc xinput_set_state); | ||
~XInputHapticGamepadWin() override; | ||
|
||
void SetVibration(double strong_magnitude, double weak_magnitude) override; | ||
|
||
private: | ||
int pad_id_; | ||
XInputSetStateFunc xinput_set_state_; | ||
}; | ||
|
||
} // namespace device | ||
|
||
#endif // DEVICE_GAMEPAD_EVDEV_HAPTIC_GAMEPAD_WIN_ |