|
|
@@ -114,6 +114,20 @@ public:
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
+
|
|
|
+ void EnableVibration(bool is_enabled) {
|
|
|
+ has_vibration = is_enabled;
|
|
|
+ is_vibration_tested = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ bool HasVibration() const {
|
|
|
+ return has_vibration;
|
|
|
+ }
|
|
|
+
|
|
|
+ bool IsVibrationTested() const {
|
|
|
+ return is_vibration_tested;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* The Pad identifier of the joystick
|
|
|
*/
|
|
|
@@ -236,6 +250,8 @@ private:
|
|
|
u64 last_motion_update{};
|
|
|
bool has_gyro{false};
|
|
|
bool has_accel{false};
|
|
|
+ bool has_vibration{false};
|
|
|
+ bool is_vibration_tested{false};
|
|
|
BasicMotion motion;
|
|
|
};
|
|
|
|
|
|
@@ -517,7 +533,7 @@ std::vector<Common::ParamPackage> SDLDriver::GetInputDevices() const {
|
|
|
return devices;
|
|
|
}
|
|
|
|
|
|
-Common::Input::VibrationError SDLDriver::SetRumble(
|
|
|
+Common::Input::VibrationError SDLDriver::SetVibration(
|
|
|
const PadIdentifier& identifier, const Common::Input::VibrationStatus& vibration) {
|
|
|
const auto joystick =
|
|
|
GetSDLJoystickByGUID(identifier.guid.RawString(), static_cast<int>(identifier.port));
|
|
|
@@ -546,13 +562,6 @@ Common::Input::VibrationError SDLDriver::SetRumble(
|
|
|
.type = Common::Input::VibrationAmplificationType::Exponential,
|
|
|
};
|
|
|
|
|
|
- if (vibration.type == Common::Input::VibrationAmplificationType::Test) {
|
|
|
- if (!joystick->RumblePlay(new_vibration)) {
|
|
|
- return Common::Input::VibrationError::Unknown;
|
|
|
- }
|
|
|
- return Common::Input::VibrationError::None;
|
|
|
- }
|
|
|
-
|
|
|
vibration_queue.Push(VibrationRequest{
|
|
|
.identifier = identifier,
|
|
|
.vibration = new_vibration,
|
|
|
@@ -561,6 +570,45 @@ Common::Input::VibrationError SDLDriver::SetRumble(
|
|
|
return Common::Input::VibrationError::None;
|
|
|
}
|
|
|
|
|
|
+bool SDLDriver::IsVibrationEnabled(const PadIdentifier& identifier) {
|
|
|
+ const auto joystick =
|
|
|
+ GetSDLJoystickByGUID(identifier.guid.RawString(), static_cast<int>(identifier.port));
|
|
|
+
|
|
|
+ constexpr Common::Input::VibrationStatus test_vibration{
|
|
|
+ .low_amplitude = 1,
|
|
|
+ .low_frequency = 160.0f,
|
|
|
+ .high_amplitude = 1,
|
|
|
+ .high_frequency = 320.0f,
|
|
|
+ .type = Common::Input::VibrationAmplificationType::Exponential,
|
|
|
+ };
|
|
|
+
|
|
|
+ constexpr Common::Input::VibrationStatus zero_vibration{
|
|
|
+ .low_amplitude = 0,
|
|
|
+ .low_frequency = 160.0f,
|
|
|
+ .high_amplitude = 0,
|
|
|
+ .high_frequency = 320.0f,
|
|
|
+ .type = Common::Input::VibrationAmplificationType::Exponential,
|
|
|
+ };
|
|
|
+
|
|
|
+ if (joystick->IsVibrationTested()) {
|
|
|
+ return joystick->HasVibration();
|
|
|
+ }
|
|
|
+
|
|
|
+ // First vibration might fail
|
|
|
+ joystick->RumblePlay(test_vibration);
|
|
|
+
|
|
|
+ // Wait for about 15ms to ensure the controller is ready for the stop command
|
|
|
+ std::this_thread::sleep_for(std::chrono::milliseconds(15));
|
|
|
+
|
|
|
+ if (!joystick->RumblePlay(zero_vibration)) {
|
|
|
+ joystick->EnableVibration(false);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ joystick->EnableVibration(true);
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
void SDLDriver::SendVibrations() {
|
|
|
while (!vibration_queue.Empty()) {
|
|
|
VibrationRequest request;
|