diff --git a/src/joystick/hidapi/SDL_hidapi_ps4.c b/src/joystick/hidapi/SDL_hidapi_ps4.c index bef553689..e589b8b98 100644 --- a/src/joystick/hidapi/SDL_hidapi_ps4.c +++ b/src/joystick/hidapi/SDL_hidapi_ps4.c @@ -147,6 +147,7 @@ typedef struct Uint8 led_blue; Uint64 sensor_ticks; Uint16 last_tick; + Uint16 valid_crc_packets; /* wrapping counter */ PS4StatePacket_t last_state; } SDL_DriverPS4_Context; @@ -1026,7 +1027,18 @@ static SDL_bool HIDAPI_DriverPS4_IsPacketValid(SDL_DriverPS4_Context *ctx, Uint8 case k_EPS4ReportIdBluetoothState8: case k_EPS4ReportIdBluetoothState9: /* Bluetooth state packets have two additional bytes at the beginning, the first notes if HID data is present */ - if (size >= 78 && (data[1] & 0x80) && VerifyCRC(data, 78)) { + if (size >= 78 && (data[1] & 0x80)) { + if (VerifyCRC(data, 78)) { + ++ctx->valid_crc_packets; + } else { + if (ctx->valid_crc_packets > 0) { + --ctx->valid_crc_packets; + } + if (ctx->valid_crc_packets >= 3) { + /* We're generally getting valid CRC, but failed one */ + return SDL_FALSE; + } + } return SDL_TRUE; } break;