SDL: Fixed 8BitDo Ultimate 2 Wireless controller on macOS

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];