Merge pull request #111191 from Nintorch/fix-joy-vibration

Fix weak and strong joypad vibration being swapped
This commit is contained in:
Thaddeus Crews 2025-10-03 12:01:04 -05:00
commit 1566eec9cf
No known key found for this signature in database
GPG key ID: 8C6E5FEB5FC03CCC

View file

@ -122,13 +122,19 @@ void JoypadSDL::process_events() {
SDL_Joystick *sdl_joy = SDL_GetJoystickFromID(joypads[i].sdl_instance_idx); SDL_Joystick *sdl_joy = SDL_GetJoystickFromID(joypads[i].sdl_instance_idx);
Vector2 strength = Input::get_singleton()->get_joy_vibration_strength(i); Vector2 strength = Input::get_singleton()->get_joy_vibration_strength(i);
// If the vibration was requested to start, SDL_RumbleJoystick will start it. /*
// If the vibration was requested to stop, strength and duration will be 0, so SDL will stop the rumble. If the vibration was requested to start, SDL_RumbleJoystick will start it.
If the vibration was requested to stop, strength and duration will be 0, so SDL will stop the rumble.
Here strength.y goes first and then strength.x, because Input.get_joy_vibration_strength().x
is vibration's weak magnitude (high frequency rumble), and .y is strong magnitude (low frequency rumble),
SDL_RumbleJoystick takes low frequency rumble first and then high frequency rumble.
*/
SDL_RumbleJoystick( SDL_RumbleJoystick(
sdl_joy, sdl_joy,
// Rumble strength goes from 0 to 0xFFFF // Rumble strength goes from 0 to 0xFFFF
strength.x * UINT16_MAX,
strength.y * UINT16_MAX, strength.y * UINT16_MAX,
strength.x * UINT16_MAX,
Input::get_singleton()->get_joy_vibration_duration(i) * 1000); Input::get_singleton()->get_joy_vibration_duration(i) * 1000);
} }
} }