From 207428b4443e1453a40af4386521ab95b406f0b1 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Wed, 29 Aug 2018 20:23:39 -0700 Subject: [PATCH] Don't rumble Bluetooth PS4 controllers by default, as that switches the controller into extended input report mode, which breaks games that use DirectInput. --- include/SDL_hints.h | 15 +++++++++++++++ src/joystick/hidapi/SDL_hidapi_ps4.c | 13 ++++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/include/SDL_hints.h b/include/SDL_hints.h index 7b159767d6159..07a911338928c 100644 --- a/include/SDL_hints.h +++ b/include/SDL_hints.h @@ -487,6 +487,21 @@ extern "C" { */ #define SDL_HINT_JOYSTICK_HIDAPI_PS4 "SDL_JOYSTICK_HIDAPI_PS4" +/** + * \brief A variable controlling whether extended input reports should be used for PS4 controllers when using the HIDAPI driver. + * + * This variable can be set to the following values: + * "0" - extended reports are not enabled (the default) + * "1" - extended reports + * + * Extended input reports allow rumble on Bluetooth PS4 controllers, but + * break DirectInput handling for applications that don't use SDL. + * + * Once extended reports are enabled, they can not be disabled without + * power cycling the controller. + */ +#define SDL_HINT_JOYSTICK_HIDAPI_PS4_RUMBLE "SDL_JOYSTICK_HIDAPI_PS4_RUMBLE" + /** * \brief A variable controlling whether the HIDAPI driver for Steam Controllers should be used. * diff --git a/src/joystick/hidapi/SDL_hidapi_ps4.c b/src/joystick/hidapi/SDL_hidapi_ps4.c index 8f9337c9f6650..6dcdb6481ddc7 100644 --- a/src/joystick/hidapi/SDL_hidapi_ps4.c +++ b/src/joystick/hidapi/SDL_hidapi_ps4.c @@ -107,6 +107,7 @@ typedef struct { SDL_bool is_dongle; SDL_bool is_bluetooth; SDL_bool audio_supported; + SDL_bool rumble_supported; Uint8 volume; Uint32 last_volume_check; Uint32 rumble_expiration; @@ -297,6 +298,12 @@ HIDAPI_DriverPS4_Init(SDL_Joystick *joystick, hid_device *dev, Uint16 vendor_id, ctx->audio_supported = SDL_TRUE; } + if (ctx->is_bluetooth) { + ctx->rumble_supported = SDL_GetHintBoolean(SDL_HINT_JOYSTICK_HIDAPI_PS4_RUMBLE, SDL_FALSE); + } else { + ctx->rumble_supported = SDL_TRUE; + } + /* Initialize LED and effect state */ HIDAPI_DriverPS4_Rumble(joystick, dev, ctx, 0, 0, 0); @@ -316,6 +323,10 @@ HIDAPI_DriverPS4_Rumble(SDL_Joystick *joystick, hid_device *dev, void *context, Uint8 data[78]; int report_size, offset; + if (!ctx->rumble_supported) { + return SDL_Unsupported(); + } + /* In order to send rumble, we have to send a complete effect packet */ SDL_memset(data, 0, sizeof(data)); @@ -517,7 +528,7 @@ HIDAPI_DriverPS4_Update(SDL_Joystick *joystick, hid_device *dev, void *context) } } - return (size >= 0); + return (size >= 0); } static void