Skip to content

Commit

Permalink
Don't rumble Bluetooth PS4 controllers by default, as that switches t…
Browse files Browse the repository at this point in the history
…he controller into extended input report mode, which breaks games that use DirectInput.
  • Loading branch information
slouken committed Aug 30, 2018
1 parent 16ccff3 commit 207428b
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 1 deletion.
15 changes: 15 additions & 0 deletions include/SDL_hints.h
Expand Up @@ -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.
*
Expand Down
13 changes: 12 additions & 1 deletion src/joystick/hidapi/SDL_hidapi_ps4.c
Expand Up @@ -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;
Expand Down Expand Up @@ -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);

Expand All @@ -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));

Expand Down Expand Up @@ -517,7 +528,7 @@ HIDAPI_DriverPS4_Update(SDL_Joystick *joystick, hid_device *dev, void *context)
}
}

return (size >= 0);
return (size >= 0);
}

static void
Expand Down

0 comments on commit 207428b

Please sign in to comment.