Commit 82af42761e131341503789cfceaa1612e5a81b79

Zack Middleton 2019-06-08T13:36:59

hidapi: Use GameCube adapter controller port for player index The Nintendo USB GameCube adapter has four controller ports. Return the port number as 0 to 3 from SDL_JoystickGetPlayerIndex() and SDL_JoystickGetDevicePlayerIndex().

diff --git a/src/joystick/hidapi/SDL_hidapi_gamecube.c b/src/joystick/hidapi/SDL_hidapi_gamecube.c
index d1abfff..40314f2 100644
--- a/src/joystick/hidapi/SDL_hidapi_gamecube.c
+++ b/src/joystick/hidapi/SDL_hidapi_gamecube.c
@@ -267,6 +267,22 @@ HIDAPI_DriverGameCube_NumJoysticks(SDL_HIDAPI_DriverData *context)
     return joysticks;
 }
 
+static int
+HIDAPI_DriverGameCube_PlayerIndexForIndex(SDL_HIDAPI_DriverData *context, int index)
+{
+    SDL_DriverGameCube_Context *ctx = (SDL_DriverGameCube_Context *)context->context;
+    Uint8 i;
+    for (i = 0; i < 4; i += 1) {
+        if (ctx->joysticks[i] != -1) {
+            if (index == 0) {
+                return i;
+            }
+            index -= 1;
+        }
+    }
+    return -1; /* Should never get here! */
+}
+
 static SDL_JoystickID
 HIDAPI_DriverGameCube_InstanceIDForIndex(SDL_HIDAPI_DriverData *context, int index)
 {
@@ -294,6 +310,7 @@ HIDAPI_DriverGameCube_OpenJoystick(SDL_HIDAPI_DriverData *context, SDL_Joystick 
             joystick->nbuttons = 12;
             joystick->naxes = 6;
             joystick->epowerlevel = SDL_JOYSTICK_POWER_WIRED;
+            joystick->player_index = i;
             return SDL_TRUE;
         }
     }
@@ -334,6 +351,7 @@ SDL_HIDAPI_DeviceDriver SDL_HIDAPI_DriverGameCube =
     HIDAPI_DriverGameCube_QuitDriver,
     HIDAPI_DriverGameCube_UpdateDriver,
     HIDAPI_DriverGameCube_NumJoysticks,
+    HIDAPI_DriverGameCube_PlayerIndexForIndex,
     HIDAPI_DriverGameCube_InstanceIDForIndex,
     HIDAPI_DriverGameCube_OpenJoystick,
     HIDAPI_DriverGameCube_Rumble
diff --git a/src/joystick/hidapi/SDL_hidapi_ps4.c b/src/joystick/hidapi/SDL_hidapi_ps4.c
index e673200..282f94e 100644
--- a/src/joystick/hidapi/SDL_hidapi_ps4.c
+++ b/src/joystick/hidapi/SDL_hidapi_ps4.c
@@ -338,6 +338,12 @@ HIDAPI_DriverPS4_NumJoysticks(SDL_HIDAPI_DriverData *context)
     return 1;
 }
 
+static int
+HIDAPI_DriverPS4_PlayerIndexForIndex(SDL_HIDAPI_DriverData *context, int index)
+{
+    return -1;
+}
+
 static SDL_JoystickID
 HIDAPI_DriverPS4_InstanceIDForIndex(SDL_HIDAPI_DriverData *context, int index)
 {
@@ -592,6 +598,7 @@ SDL_HIDAPI_DeviceDriver SDL_HIDAPI_DriverPS4 =
     HIDAPI_DriverPS4_QuitDriver,
     HIDAPI_DriverPS4_UpdateDriver,
     HIDAPI_DriverPS4_NumJoysticks,
+    HIDAPI_DriverPS4_PlayerIndexForIndex,
     HIDAPI_DriverPS4_InstanceIDForIndex,
     HIDAPI_DriverPS4_OpenJoystick,
     HIDAPI_DriverPS4_Rumble
diff --git a/src/joystick/hidapi/SDL_hidapi_switch.c b/src/joystick/hidapi/SDL_hidapi_switch.c
index b81112b..d2f246b 100644
--- a/src/joystick/hidapi/SDL_hidapi_switch.c
+++ b/src/joystick/hidapi/SDL_hidapi_switch.c
@@ -914,6 +914,12 @@ HIDAPI_DriverSwitch_NumJoysticks(SDL_HIDAPI_DriverData *context)
     return 1;
 }
 
+static int
+HIDAPI_DriverSwitch_PlayerIndexForIndex(SDL_HIDAPI_DriverData *context, int index)
+{
+    return -1;
+}
+
 static SDL_JoystickID
 HIDAPI_DriverSwitch_InstanceIDForIndex(SDL_HIDAPI_DriverData *context, int index)
 {
@@ -931,6 +937,7 @@ SDL_HIDAPI_DeviceDriver SDL_HIDAPI_DriverSwitch =
     HIDAPI_DriverSwitch_QuitDriver,
     HIDAPI_DriverSwitch_UpdateDriver,
     HIDAPI_DriverSwitch_NumJoysticks,
+    HIDAPI_DriverSwitch_PlayerIndexForIndex,
     HIDAPI_DriverSwitch_InstanceIDForIndex,
     HIDAPI_DriverSwitch_OpenJoystick,
     HIDAPI_DriverSwitch_Rumble
diff --git a/src/joystick/hidapi/SDL_hidapi_xbox360.c b/src/joystick/hidapi/SDL_hidapi_xbox360.c
index 346b12d..eb67089 100644
--- a/src/joystick/hidapi/SDL_hidapi_xbox360.c
+++ b/src/joystick/hidapi/SDL_hidapi_xbox360.c
@@ -330,6 +330,12 @@ HIDAPI_DriverXbox360_NumJoysticks(SDL_HIDAPI_DriverData *context)
     return 1;
 }
 
+static int
+HIDAPI_DriverXbox360_PlayerIndexForIndex(SDL_HIDAPI_DriverData *context, int index)
+{
+    return -1;
+}
+
 static SDL_JoystickID
 HIDAPI_DriverXbox360_InstanceIDForIndex(SDL_HIDAPI_DriverData *context, int index)
 {
@@ -813,6 +819,7 @@ SDL_HIDAPI_DeviceDriver SDL_HIDAPI_DriverXbox360 =
     HIDAPI_DriverXbox360_QuitDriver,
     HIDAPI_DriverXbox360_UpdateDriver,
     HIDAPI_DriverXbox360_NumJoysticks,
+    HIDAPI_DriverXbox360_PlayerIndexForIndex,
     HIDAPI_DriverXbox360_InstanceIDForIndex,
     HIDAPI_DriverXbox360_OpenJoystick,
     HIDAPI_DriverXbox360_Rumble
diff --git a/src/joystick/hidapi/SDL_hidapi_xboxone.c b/src/joystick/hidapi/SDL_hidapi_xboxone.c
index 90c2aa3..734c76e 100644
--- a/src/joystick/hidapi/SDL_hidapi_xboxone.c
+++ b/src/joystick/hidapi/SDL_hidapi_xboxone.c
@@ -207,6 +207,12 @@ HIDAPI_DriverXboxOne_NumJoysticks(SDL_HIDAPI_DriverData *context)
     return 1;
 }
 
+static int
+HIDAPI_DriverXboxOne_PlayerIndexForIndex(SDL_HIDAPI_DriverData *context, int index)
+{
+    return -1;
+}
+
 static SDL_JoystickID
 HIDAPI_DriverXboxOne_InstanceIDForIndex(SDL_HIDAPI_DriverData *context, int index)
 {
@@ -350,6 +356,7 @@ SDL_HIDAPI_DeviceDriver SDL_HIDAPI_DriverXboxOne =
     HIDAPI_DriverXboxOne_QuitDriver,
     HIDAPI_DriverXboxOne_UpdateDriver,
     HIDAPI_DriverXboxOne_NumJoysticks,
+    HIDAPI_DriverXboxOne_PlayerIndexForIndex,
     HIDAPI_DriverXboxOne_InstanceIDForIndex,
     HIDAPI_DriverXboxOne_OpenJoystick,
     HIDAPI_DriverXboxOne_Rumble
diff --git a/src/joystick/hidapi/SDL_hidapijoystick.c b/src/joystick/hidapi/SDL_hidapijoystick.c
index 7cbd9f4..319cf3a 100644
--- a/src/joystick/hidapi/SDL_hidapijoystick.c
+++ b/src/joystick/hidapi/SDL_hidapijoystick.c
@@ -948,7 +948,19 @@ HIDAPI_JoystickGetDeviceName(int device_index)
 static int
 HIDAPI_JoystickGetDevicePlayerIndex(int device_index)
 {
-    return -1;
+    SDL_HIDAPI_Device *device = SDL_HIDAPI_devices;
+    int joysticks;
+    while (device) {
+        if (device->driver) {
+            joysticks = device->driver->NumJoysticks(&device->devdata);
+            if (device_index < joysticks) {
+                break;
+            }
+            device_index -= joysticks;
+        }
+        device = device->next;
+    }
+    return device->driver->PlayerIndexForIndex(&device->devdata, device_index);
 }
 
 static SDL_JoystickGUID
diff --git a/src/joystick/hidapi/SDL_hidapijoystick_c.h b/src/joystick/hidapi/SDL_hidapijoystick_c.h
index 807a301..5b2f736 100644
--- a/src/joystick/hidapi/SDL_hidapijoystick_c.h
+++ b/src/joystick/hidapi/SDL_hidapijoystick_c.h
@@ -65,6 +65,8 @@ typedef struct _SDL_HIDAPI_DeviceDriver
     SDL_bool       (*UpdateDriver)(SDL_HIDAPI_DriverData *context,
                                    int *num_joysticks);
     int            (*NumJoysticks)(SDL_HIDAPI_DriverData *context);
+    int            (*PlayerIndexForIndex)(SDL_HIDAPI_DriverData *context,
+                                          int index);
     SDL_JoystickID (*InstanceIDForIndex)(SDL_HIDAPI_DriverData *context,
                                          int index);
     SDL_bool       (*OpenJoystick)(SDL_HIDAPI_DriverData *context,