From 214d5daa3c741d7672e53dd741a78b3dc61c4848 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Wed, 21 Jun 2023 12:14:50 -0700 Subject: [PATCH] Removed 100 ms hitch when querying third party Nintendo Switch controllers that don't respond to request for info Also take advantage of the fact that we know whether the device is connected over Bluetooth now. --- src/joystick/hidapi/SDL_hidapi_switch.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/joystick/hidapi/SDL_hidapi_switch.c b/src/joystick/hidapi/SDL_hidapi_switch.c index dd42968d06..377e0593e1 100644 --- a/src/joystick/hidapi/SDL_hidapi_switch.c +++ b/src/joystick/hidapi/SDL_hidapi_switch.c @@ -992,26 +992,27 @@ static ESwitchDeviceInfoControllerType ReadJoyConControllerType(SDL_HIDAPI_Devic ctx->m_bSyncWrite = SDL_TRUE; ctx->m_nMaxWriteAttempts = GetMaxWriteAttempts(device); - for (attempts = 0; attempts < MAX_ATTEMPTS; ++attempts) { - if (WriteProprietary(ctx, k_eSwitchProprietaryCommandIDs_Status, NULL, 0, SDL_TRUE)) { - SwitchProprietaryStatusPacket_t *status = (SwitchProprietaryStatusPacket_t *)&ctx->m_rgucReadBuffer[0]; - - eControllerType = CalculateControllerType(ctx, (ESwitchDeviceInfoControllerType)status->ucDeviceType); - } else { + for ( ; ; ) { + ++attempts; + if (device->is_bluetooth) { SwitchSubcommandInputPacket_t *reply = NULL; - device->is_bluetooth = SDL_TRUE; if (WriteSubcommand(ctx, k_eSwitchSubcommandIDs_RequestDeviceInfo, NULL, 0, &reply)) { eControllerType = CalculateControllerType(ctx, (ESwitchDeviceInfoControllerType)reply->deviceInfo.ucDeviceType); } + } else { + if (WriteProprietary(ctx, k_eSwitchProprietaryCommandIDs_Status, NULL, 0, SDL_TRUE)) { + SwitchProprietaryStatusPacket_t *status = (SwitchProprietaryStatusPacket_t *)&ctx->m_rgucReadBuffer[0]; + + eControllerType = CalculateControllerType(ctx, (ESwitchDeviceInfoControllerType)status->ucDeviceType); + } } - if (eControllerType == k_eSwitchDeviceInfoControllerType_Unknown) { + if (eControllerType == k_eSwitchDeviceInfoControllerType_Unknown && attempts < MAX_ATTEMPTS) { /* Wait a bit and try again */ SDL_Delay(100); continue; - } else { - break; } + break; } SDL_free(ctx); }