From 1868c5b5210636530d6945c0ec16b11e3506248d Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Thu, 17 Mar 2022 18:25:50 -0700
Subject: [PATCH] Start rumbling once a raw input controller has been
correlated
Fixes https://github.com/libsdl-org/SDL/issues/5351
---
src/joystick/SDL_joystick.c | 40 +++++++++++----------
src/joystick/windows/SDL_rawinputjoystick.c | 7 ++++
2 files changed, 28 insertions(+), 19 deletions(-)
diff --git a/src/joystick/SDL_joystick.c b/src/joystick/SDL_joystick.c
index 6a285c32c11..3f3482b7d90 100644
--- a/src/joystick/SDL_joystick.c
+++ b/src/joystick/SDL_joystick.c
@@ -886,17 +886,18 @@ SDL_JoystickRumble(SDL_Joystick *joystick, Uint16 low_frequency_rumble, Uint16 h
result = joystick->driver->Rumble(joystick, low_frequency_rumble, high_frequency_rumble);
}
- /* Save the rumble value regardless of success, so we don't spam the driver */
- joystick->low_frequency_rumble = low_frequency_rumble;
- joystick->high_frequency_rumble = high_frequency_rumble;
-
- if ((low_frequency_rumble || high_frequency_rumble) && duration_ms) {
- joystick->rumble_expiration = SDL_GetTicks() + SDL_min(duration_ms, SDL_MAX_RUMBLE_DURATION_MS);
- if (!joystick->rumble_expiration) {
- joystick->rumble_expiration = 1;
+ if (result == 0) {
+ joystick->low_frequency_rumble = low_frequency_rumble;
+ joystick->high_frequency_rumble = high_frequency_rumble;
+
+ if ((low_frequency_rumble || high_frequency_rumble) && duration_ms) {
+ joystick->rumble_expiration = SDL_GetTicks() + SDL_min(duration_ms, SDL_MAX_RUMBLE_DURATION_MS);
+ if (!joystick->rumble_expiration) {
+ joystick->rumble_expiration = 1;
+ }
+ } else {
+ joystick->rumble_expiration = 0;
}
- } else {
- joystick->rumble_expiration = 0;
}
SDL_UnlockJoysticks();
@@ -920,17 +921,18 @@ SDL_JoystickRumbleTriggers(SDL_Joystick *joystick, Uint16 left_rumble, Uint16 ri
result = joystick->driver->RumbleTriggers(joystick, left_rumble, right_rumble);
}
- /* Save the rumble value regardless of success, so we don't spam the driver */
- joystick->left_trigger_rumble = left_rumble;
- joystick->right_trigger_rumble = right_rumble;
+ if (result == 0) {
+ joystick->left_trigger_rumble = left_rumble;
+ joystick->right_trigger_rumble = right_rumble;
- if ((left_rumble || right_rumble) && duration_ms) {
- joystick->trigger_rumble_expiration = SDL_GetTicks() + SDL_min(duration_ms, SDL_MAX_RUMBLE_DURATION_MS);
- if (!joystick->trigger_rumble_expiration) {
- joystick->trigger_rumble_expiration = 1;
+ if ((left_rumble || right_rumble) && duration_ms) {
+ joystick->trigger_rumble_expiration = SDL_GetTicks() + SDL_min(duration_ms, SDL_MAX_RUMBLE_DURATION_MS);
+ if (!joystick->trigger_rumble_expiration) {
+ joystick->trigger_rumble_expiration = 1;
+ }
+ } else {
+ joystick->trigger_rumble_expiration = 0;
}
- } else {
- joystick->trigger_rumble_expiration = 0;
}
SDL_UnlockJoysticks();
diff --git a/src/joystick/windows/SDL_rawinputjoystick.c b/src/joystick/windows/SDL_rawinputjoystick.c
index 1fe99a4bf31..32b63782735 100644
--- a/src/joystick/windows/SDL_rawinputjoystick.c
+++ b/src/joystick/windows/SDL_rawinputjoystick.c
@@ -1295,6 +1295,13 @@ RAWINPUT_JoystickRumble(SDL_Joystick *joystick, Uint16 low_frequency_rumble, Uin
}
#endif /* SDL_JOYSTICK_RAWINPUT_XINPUT */
+ if (!rumbled) {
+#if defined(SDL_JOYSTICK_RAWINPUT_WGI) || defined(SDL_JOYSTICK_RAWINPUT_XINPUT)
+ return SDL_SetError("Controller isn't correlated yet, try hitting a button first");
+#else
+ return SDL_Unsupported();
+#endif
+ }
return 0;
}