From 2aa0957081366ef8d9df96c7921f81bb64c9a47c Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Thu, 8 May 2025 10:46:53 -0700
Subject: [PATCH] Fixed 8BitDo Ultimate 2 Wireless controller on macOS
When connected for the first time over Bluetooth on macOS, the first few reads return 0, so retry a few times in that case.
---
src/joystick/hidapi/SDL_hidapi_8bitdo.c | 21 +++++++++++++++------
1 file changed, 15 insertions(+), 6 deletions(-)
diff --git a/src/joystick/hidapi/SDL_hidapi_8bitdo.c b/src/joystick/hidapi/SDL_hidapi_8bitdo.c
index 82efaf701966f..2dc5f92fdaa5f 100644
--- a/src/joystick/hidapi/SDL_hidapi_8bitdo.c
+++ b/src/joystick/hidapi/SDL_hidapi_8bitdo.c
@@ -154,12 +154,21 @@ static bool HIDAPI_Driver8BitDo_InitDevice(SDL_HIDAPI_Device *device)
if (device->product_id == USB_PRODUCT_8BITDO_ULTIMATE2_WIRELESS) {
// The Ultimate 2 Wireless v1.02 firmware has 12 byte reports, v1.03 firmware has 34 byte reports
const int ULTIMATE2_WIRELESS_V103_REPORT_SIZE = 34;
- Uint8 data[USB_PACKET_LENGTH];
- int size = SDL_hid_read_timeout(device->dev, data, sizeof(data), 80);
- if (size >= ULTIMATE2_WIRELESS_V103_REPORT_SIZE) {
- ctx->sensors_supported = true;
- ctx->rumble_supported = true;
- ctx->powerstate_supported = true;
+ const int MAX_ATTEMPTS = 3;
+
+ for (int attempt = 0; attempt < MAX_ATTEMPTS; ++attempt) {
+ Uint8 data[USB_PACKET_LENGTH];
+ int size = SDL_hid_read_timeout(device->dev, data, sizeof(data), 80);
+ if (size == 0) {
+ // Try again
+ continue;
+ }
+ if (size >= ULTIMATE2_WIRELESS_V103_REPORT_SIZE) {
+ ctx->sensors_supported = true;
+ ctx->rumble_supported = true;
+ ctx->powerstate_supported = true;
+ }
+ break;
}
} else {
Uint8 data[USB_PACKET_LENGTH];