mirror of
https://github.com/libsdl-org/SDL.git
synced 2026-05-04 23:22:48 +02:00
Fixed unaligned load in Xbox HIDAPI driver
This commit is contained in:
@@ -49,6 +49,8 @@
|
||||
#define XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE 8689
|
||||
#define XINPUT_GAMEPAD_TRIGGER_THRESHOLD -25058 // Uint8 30 scaled to Sint16 full range
|
||||
|
||||
#define LOAD16(A, B) (Sint16)((Uint16)(A) | (((Uint16)(B)) << 8))
|
||||
|
||||
enum
|
||||
{
|
||||
SDL_GAMEPAD_BUTTON_XBOX_SHARE_BUTTON = 11
|
||||
@@ -810,7 +812,7 @@ static void HIDAPI_DriverXboxOne_HandleStatePacket(SDL_Joystick *joystick, SDL_D
|
||||
}
|
||||
}
|
||||
|
||||
axis = ((int)SDL_Swap16LE(*(Sint16 *)(&data[2])) * 64) - 32768;
|
||||
axis = ((int)LOAD16(data[2], data[3]) * 64) - 32768;
|
||||
if (axis == 32704) {
|
||||
axis = 32767;
|
||||
}
|
||||
@@ -819,7 +821,7 @@ static void HIDAPI_DriverXboxOne_HandleStatePacket(SDL_Joystick *joystick, SDL_D
|
||||
}
|
||||
SDL_SendJoystickAxis(timestamp, joystick, SDL_GAMEPAD_AXIS_LEFT_TRIGGER, axis);
|
||||
|
||||
axis = ((int)SDL_Swap16LE(*(Sint16 *)(&data[4])) * 64) - 32768;
|
||||
axis = ((int)LOAD16(data[4], data[5]) * 64) - 32768;
|
||||
if (axis == -32768 && size == 26 && (data[18] & 0x40)) {
|
||||
axis = 32767;
|
||||
}
|
||||
@@ -828,13 +830,13 @@ static void HIDAPI_DriverXboxOne_HandleStatePacket(SDL_Joystick *joystick, SDL_D
|
||||
}
|
||||
SDL_SendJoystickAxis(timestamp, joystick, SDL_GAMEPAD_AXIS_RIGHT_TRIGGER, axis);
|
||||
|
||||
axis = SDL_Swap16LE(*(Sint16 *)(&data[6]));
|
||||
axis = LOAD16(data[6], data[7]);
|
||||
SDL_SendJoystickAxis(timestamp, joystick, SDL_GAMEPAD_AXIS_LEFTX, axis);
|
||||
axis = SDL_Swap16LE(*(Sint16 *)(&data[8]));
|
||||
axis = LOAD16(data[8], data[9]);
|
||||
SDL_SendJoystickAxis(timestamp, joystick, SDL_GAMEPAD_AXIS_LEFTY, ~axis);
|
||||
axis = SDL_Swap16LE(*(Sint16 *)(&data[10]));
|
||||
axis = LOAD16(data[10], data[11]);
|
||||
SDL_SendJoystickAxis(timestamp, joystick, SDL_GAMEPAD_AXIS_RIGHTX, axis);
|
||||
axis = SDL_Swap16LE(*(Sint16 *)(&data[12]));
|
||||
axis = LOAD16(data[12], data[13]);
|
||||
SDL_SendJoystickAxis(timestamp, joystick, SDL_GAMEPAD_AXIS_RIGHTY, ~axis);
|
||||
|
||||
SDL_memcpy(ctx->last_state, data, SDL_min(size, sizeof(ctx->last_state)));
|
||||
@@ -1030,25 +1032,25 @@ static void HIDAPI_DriverXboxOneBluetooth_HandleStatePacket(SDL_Joystick *joysti
|
||||
SDL_SendJoystickHat(timestamp, joystick, 0, hat);
|
||||
}
|
||||
|
||||
axis = ((int)SDL_Swap16LE(*(Sint16 *)(&data[9])) * 64) - 32768;
|
||||
axis = ((int)LOAD16(data[9], data[10]) * 64) - 32768;
|
||||
if (axis == 32704) {
|
||||
axis = 32767;
|
||||
}
|
||||
SDL_SendJoystickAxis(timestamp, joystick, SDL_GAMEPAD_AXIS_LEFT_TRIGGER, axis);
|
||||
|
||||
axis = ((int)SDL_Swap16LE(*(Sint16 *)(&data[11])) * 64) - 32768;
|
||||
axis = ((int)LOAD16(data[11], data[12]) * 64) - 32768;
|
||||
if (axis == 32704) {
|
||||
axis = 32767;
|
||||
}
|
||||
SDL_SendJoystickAxis(timestamp, joystick, SDL_GAMEPAD_AXIS_RIGHT_TRIGGER, axis);
|
||||
|
||||
axis = (int)SDL_Swap16LE(*(Uint16 *)(&data[1])) - 0x8000;
|
||||
axis = (int)(Uint16)LOAD16(data[1], data[2]) - 0x8000;
|
||||
SDL_SendJoystickAxis(timestamp, joystick, SDL_GAMEPAD_AXIS_LEFTX, axis);
|
||||
axis = (int)SDL_Swap16LE(*(Uint16 *)(&data[3])) - 0x8000;
|
||||
axis = (int)(Uint16)LOAD16(data[3], data[4]) - 0x8000;
|
||||
SDL_SendJoystickAxis(timestamp, joystick, SDL_GAMEPAD_AXIS_LEFTY, axis);
|
||||
axis = (int)SDL_Swap16LE(*(Uint16 *)(&data[5])) - 0x8000;
|
||||
axis = (int)(Uint16)LOAD16(data[5], data[6]) - 0x8000;
|
||||
SDL_SendJoystickAxis(timestamp, joystick, SDL_GAMEPAD_AXIS_RIGHTX, axis);
|
||||
axis = (int)SDL_Swap16LE(*(Uint16 *)(&data[7])) - 0x8000;
|
||||
axis = (int)(Uint16)LOAD16(data[7], data[8]) - 0x8000;
|
||||
SDL_SendJoystickAxis(timestamp, joystick, SDL_GAMEPAD_AXIS_RIGHTY, axis);
|
||||
|
||||
SDL_memcpy(ctx->last_state, data, SDL_min(size, sizeof(ctx->last_state)));
|
||||
|
||||
Reference in New Issue
Block a user