|
|
|
@ -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;
|
|
|
|
|