diff options
Diffstat (limited to 'src/input_common/drivers')
| -rw-r--r-- | src/input_common/drivers/gc_adapter.cpp | 6 | ||||
| -rw-r--r-- | src/input_common/drivers/gc_adapter.h | 4 | ||||
| -rw-r--r-- | src/input_common/drivers/sdl_driver.cpp | 64 | ||||
| -rw-r--r-- | src/input_common/drivers/sdl_driver.h | 4 | 
4 files changed, 67 insertions, 11 deletions
| diff --git a/src/input_common/drivers/gc_adapter.cpp b/src/input_common/drivers/gc_adapter.cpp index f4dd24e7d..826fa2109 100644 --- a/src/input_common/drivers/gc_adapter.cpp +++ b/src/input_common/drivers/gc_adapter.cpp @@ -324,7 +324,7 @@ bool GCAdapter::GetGCEndpoint(libusb_device* device) {      return true;  } -Common::Input::VibrationError GCAdapter::SetRumble( +Common::Input::VibrationError GCAdapter::SetVibration(      const PadIdentifier& identifier, const Common::Input::VibrationStatus& vibration) {      const auto mean_amplitude = (vibration.low_amplitude + vibration.high_amplitude) * 0.5f;      const auto processed_amplitude = @@ -338,6 +338,10 @@ Common::Input::VibrationError GCAdapter::SetRumble(      return Common::Input::VibrationError::None;  } +bool GCAdapter::IsVibrationEnabled([[maybe_unused]] const PadIdentifier& identifier) { +    return rumble_enabled; +} +  void GCAdapter::UpdateVibrations() {      // Use 8 states to keep the switching between on/off fast enough for      // a human to feel different vibration strenght diff --git a/src/input_common/drivers/gc_adapter.h b/src/input_common/drivers/gc_adapter.h index 8682da847..7f81767f7 100644 --- a/src/input_common/drivers/gc_adapter.h +++ b/src/input_common/drivers/gc_adapter.h @@ -25,9 +25,11 @@ public:      explicit GCAdapter(std::string input_engine_);      ~GCAdapter() override; -    Common::Input::VibrationError SetRumble( +    Common::Input::VibrationError SetVibration(          const PadIdentifier& identifier, const Common::Input::VibrationStatus& vibration) override; +    bool IsVibrationEnabled(const PadIdentifier& identifier) override; +      /// Used for automapping features      std::vector<Common::ParamPackage> GetInputDevices() const override;      ButtonMapping GetButtonMappingForDevice(const Common::ParamPackage& params) override; diff --git a/src/input_common/drivers/sdl_driver.cpp b/src/input_common/drivers/sdl_driver.cpp index c175a8853..45ce588f0 100644 --- a/src/input_common/drivers/sdl_driver.cpp +++ b/src/input_common/drivers/sdl_driver.cpp @@ -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; diff --git a/src/input_common/drivers/sdl_driver.h b/src/input_common/drivers/sdl_driver.h index fc3a44572..d1b4471cf 100644 --- a/src/input_common/drivers/sdl_driver.h +++ b/src/input_common/drivers/sdl_driver.h @@ -61,9 +61,11 @@ public:      bool IsStickInverted(const Common::ParamPackage& params) override; -    Common::Input::VibrationError SetRumble( +    Common::Input::VibrationError SetVibration(          const PadIdentifier& identifier, const Common::Input::VibrationStatus& vibration) override; +    bool IsVibrationEnabled(const PadIdentifier& identifier) override; +  private:      struct VibrationRequest {          PadIdentifier identifier; | 
