src/joystick/hidapi/SDL_hidapijoystick_c.h
author Sam Lantinga
Mon, 16 Dec 2019 10:20:03 -0800
changeset 13348 448528dc13da
parent 13330 c88765bcf1da
child 13354 8c22865bd138
permissions -rw-r--r--
Fixed bug 4898 - No rumble because of integer overflow in SDL_JoystickRumble

meyraud705

On a Dualshock 4 controller using hidapi driver, calling SDL_JoystickRumble with a duration too long (SDL_HAPTIC_INFINITY for example) causes the rumble to stop immediately.

This happens because of integer overflow on line 301 of SDL_hidapi_ps4.c
(https://hg.libsdl.org/SDL/file/99ecd178999f/src/joystick/hidapi/SDL_hidapi_ps4.c#l301), which sets expiration time in the past.
slouken@12088
     1
/*
slouken@12088
     2
  Simple DirectMedia Layer
slouken@12503
     3
  Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>
slouken@12088
     4
slouken@12088
     5
  This software is provided 'as-is', without any express or implied
slouken@12088
     6
  warranty.  In no event will the authors be held liable for any damages
slouken@12088
     7
  arising from the use of this software.
slouken@12088
     8
slouken@12088
     9
  Permission is granted to anyone to use this software for any purpose,
slouken@12088
    10
  including commercial applications, and to alter it and redistribute it
slouken@12088
    11
  freely, subject to the following restrictions:
slouken@12088
    12
slouken@12088
    13
  1. The origin of this software must not be misrepresented; you must not
slouken@12088
    14
     claim that you wrote the original software. If you use this software
slouken@12088
    15
     in a product, an acknowledgment in the product documentation would be
slouken@12088
    16
     appreciated but is not required.
slouken@12088
    17
  2. Altered source versions must be plainly marked as such, and must not be
slouken@12088
    18
     misrepresented as being the original software.
slouken@12088
    19
  3. This notice may not be removed or altered from any source distribution.
slouken@12088
    20
*/
slouken@12088
    21
#include "../../SDL_internal.h"
slouken@12088
    22
slouken@12088
    23
#ifndef SDL_JOYSTICK_HIDAPI_H
slouken@12088
    24
#define SDL_JOYSTICK_HIDAPI_H
slouken@12088
    25
slouken@12088
    26
#include "../../hidapi/hidapi/hidapi.h"
slouken@12088
    27
slouken@12088
    28
/* This is the full set of HIDAPI drivers available */
slouken@12088
    29
#define SDL_JOYSTICK_HIDAPI_PS4
slouken@12088
    30
#define SDL_JOYSTICK_HIDAPI_SWITCH
slouken@12088
    31
#define SDL_JOYSTICK_HIDAPI_XBOX360
slouken@12088
    32
#define SDL_JOYSTICK_HIDAPI_XBOXONE
slouken@12088
    33
slouken@12088
    34
#ifdef __WINDOWS__
slouken@12118
    35
/* On Windows, Xbox One controllers are handled by the Xbox 360 driver */
slouken@12088
    36
#undef SDL_JOYSTICK_HIDAPI_XBOXONE
slouken@12296
    37
/* It turns out HIDAPI for Xbox controllers doesn't allow background input */
slouken@12296
    38
#undef SDL_JOYSTICK_HIDAPI_XBOX360
slouken@12088
    39
#endif
slouken@12088
    40
slouken@12088
    41
#ifdef __MACOSX__
slouken@12088
    42
/* On Mac OS X, Xbox One controllers are handled by the Xbox 360 driver */
slouken@12088
    43
#undef SDL_JOYSTICK_HIDAPI_XBOXONE
slouken@12088
    44
#endif
slouken@12088
    45
slouken@13348
    46
/* Prevent rumble duration overflow */
slouken@13348
    47
#define SDL_MAX_RUMBLE_DURATION_MS  0x0fffffff
slouken@13348
    48
slouken@12088
    49
typedef struct _SDL_HIDAPI_DeviceDriver
slouken@12088
    50
{
slouken@12088
    51
    const char *hint;
slouken@12088
    52
    SDL_bool enabled;
slouken@13160
    53
    SDL_bool (*IsSupportedDevice)(Uint16 vendor_id, Uint16 product_id, Uint16 version, int interface_number, const char *name);
slouken@12088
    54
    const char *(*GetDeviceName)(Uint16 vendor_id, Uint16 product_id);
slouken@12896
    55
    SDL_bool (*Init)(SDL_Joystick *joystick, hid_device *dev, Uint16 vendor_id, Uint16 product_id, void **context);
slouken@12896
    56
    int (*Rumble)(SDL_Joystick *joystick, hid_device *dev, void *context, Uint16 low_frequency_rumble, Uint16 high_frequency_rumble, Uint32 duration_ms);
slouken@12896
    57
    SDL_bool (*Update)(SDL_Joystick *joystick, hid_device *dev, void *context);
slouken@12896
    58
    void (*Quit)(SDL_Joystick *joystick, hid_device *dev, void *context);
slouken@12088
    59
slouken@12088
    60
} SDL_HIDAPI_DeviceDriver;
slouken@12088
    61
slouken@12088
    62
/* HIDAPI device support */
slouken@12088
    63
extern SDL_HIDAPI_DeviceDriver SDL_HIDAPI_DriverPS4;
slouken@12088
    64
extern SDL_HIDAPI_DeviceDriver SDL_HIDAPI_DriverSteam;
slouken@12088
    65
extern SDL_HIDAPI_DeviceDriver SDL_HIDAPI_DriverSwitch;
slouken@12088
    66
extern SDL_HIDAPI_DeviceDriver SDL_HIDAPI_DriverXbox360;
slouken@12088
    67
extern SDL_HIDAPI_DeviceDriver SDL_HIDAPI_DriverXboxOne;
slouken@12088
    68
slouken@12088
    69
/* Return true if a HID device is present and supported as a joystick */
slouken@13160
    70
extern SDL_bool HIDAPI_IsDevicePresent(Uint16 vendor_id, Uint16 product_id, Uint16 version, const char *name);
slouken@12088
    71
slouken@12088
    72
#endif /* SDL_JOYSTICK_HIDAPI_H */
slouken@12088
    73
slouken@12088
    74
/* vi: set ts=4 sw=4 expandtab: */