diff --git a/src/joystick/hidapi/SDL_hidapi_gamecube.c b/src/joystick/hidapi/SDL_hidapi_gamecube.c index 40314f2e2..d5f513233 100644 --- a/src/joystick/hidapi/SDL_hidapi_gamecube.c +++ b/src/joystick/hidapi/SDL_hidapi_gamecube.c @@ -37,6 +37,7 @@ typedef struct { SDL_JoystickID joysticks[4]; + Uint8 rumbleAllowed[4]; Uint8 rumble[5]; Uint32 rumbleExpiration[4]; /* Without this variable, hid_write starts to lag a TON */ @@ -99,6 +100,9 @@ HIDAPI_DriverGameCube_InitDriver(SDL_HIDAPI_DriverData *context, Uint16 vendor_i /* Go through all 4 slots */ curSlot = packet + 1; for (i = 0; i < 4; i += 1, curSlot += 9) { + /* Only allow rumble if the adapter's second USB cable is connected */ + ctx->rumbleAllowed[i] = (curSlot[0] & 0x04) != 0; + if (curSlot[0] & 0x30) { /* 0x10 - Wired, 0x20 - Wireless */ if (ctx->joysticks[i] == -1) { ctx->joysticks[i] = SDL_GetNextJoystickInstanceID(); @@ -168,6 +172,9 @@ HIDAPI_DriverGameCube_UpdateDriver(SDL_HIDAPI_DriverData *context, int *num_joys /* Go through all 4 slots */ curSlot = packet + 1; for (i = 0; i < 4; i += 1, curSlot += 9) { + /* Only allow rumble if the adapter's second USB cable is connected */ + ctx->rumbleAllowed[i] = (curSlot[0] & 0x04) != 0; + if (curSlot[0] & 0x30) { /* 0x10 - Wired, 0x20 - Wireless */ if (ctx->joysticks[i] == -1) { ctx->joysticks[i] = SDL_GetNextJoystickInstanceID(); @@ -238,7 +245,7 @@ HIDAPI_DriverGameCube_UpdateDriver(SDL_HIDAPI_DriverData *context, int *num_joys now = SDL_GetTicks(); for (i = 0; i < 4; i += 1) { if (ctx->rumbleExpiration[i] > 0) { - if (SDL_TICKS_PASSED(now, ctx->rumbleExpiration[i])) { + if (SDL_TICKS_PASSED(now, ctx->rumbleExpiration[i]) || !ctx->rumbleAllowed[i]) { ctx->rumble[i + 1] = 0; ctx->rumbleExpiration[i] = 0; ctx->rumbleUpdate = 1; @@ -325,6 +332,9 @@ HIDAPI_DriverGameCube_Rumble(SDL_HIDAPI_DriverData *context, SDL_Joystick *joyst Uint8 i, val; for (i = 0; i < 4; i += 1) { if (instance == ctx->joysticks[i]) { + if (!ctx->rumbleAllowed[i]) { + return SDL_SetError("Second USB cable for WUP-028 not connected"); + } val = (low_frequency_rumble > 0 || high_frequency_rumble > 0); if (val != ctx->rumble[i + 1]) { ctx->rumble[i + 1] = val; @@ -338,7 +348,7 @@ HIDAPI_DriverGameCube_Rumble(SDL_HIDAPI_DriverData *context, SDL_Joystick *joyst return 0; } } - return -1; + return -1; /* Should never get here! */ } SDL_HIDAPI_DeviceDriver SDL_HIDAPI_DriverGameCube =