diff options
| author | JosJuice <josjuice@gmail.com> | 2026-04-18 16:56:25 +0200 |
|---|---|---|
| committer | JosJuice <josjuice@gmail.com> | 2026-04-18 19:40:25 +0200 |
| commit | cc01a603474b66053a2cf5a6104ff637ed144cfe (patch) | |
| tree | 09f18b525b86d4d80ffba4a6ccf2bebd2e782976 /Source/Core/InputCommon | |
| parent | 42175d4e75de1e31c44c734862da698703c92270 (diff) | |
GCAdapter: Automatically start and stop thread
This keeps the logic encapsulated inside GCAdapter.cpp so callers don't
have to think about it.
Diffstat (limited to 'Source/Core/InputCommon')
| -rw-r--r-- | Source/Core/InputCommon/GCAdapter.cpp | 63 | ||||
| -rw-r--r-- | Source/Core/InputCommon/GCAdapter.h | 3 |
2 files changed, 30 insertions, 36 deletions
diff --git a/Source/Core/InputCommon/GCAdapter.cpp b/Source/Core/InputCommon/GCAdapter.cpp index 986480227d..d208edb6a6 100644 --- a/Source/Core/InputCommon/GCAdapter.cpp +++ b/Source/Core/InputCommon/GCAdapter.cpp @@ -460,7 +460,7 @@ static void ScanThreadFunc() while (s_adapter_detect_thread_running.IsSet()) { - if (!s_detected && UseAdapter() && + if (!s_detected && s_is_adapter_wanted && env->CallStaticBooleanMethod(s_adapter_class, is_usb_device_available_func)) { std::lock_guard lk(s_init_mutex); @@ -481,6 +481,27 @@ void SetAdapterCallback(std::function<void(void)> func) #endif } +static void StartScanThread() +{ + if (s_adapter_detect_thread_running.IsSet()) + return; +#if GCADAPTER_USE_LIBUSB_IMPLEMENTATION + if (!s_libusb_context->IsValid()) + return; +#endif + s_adapter_detect_thread_running.Set(true); + s_adapter_detect_thread = std::thread(ScanThreadFunc); +} + +static void StopScanThread() +{ + if (s_adapter_detect_thread_running.TestAndClear()) + { + s_hotplug_event.Set(); + s_adapter_detect_thread.join(); + } +} + static void RefreshConfig() { s_is_adapter_wanted = false; @@ -491,6 +512,11 @@ static void RefreshConfig() SerialInterface::SIDevices::SIDEVICE_WIIU_ADAPTER; s_config_rumble_enabled[i] = Config::Get(Config::GetInfoForAdapterRumble(i)); } + + if (s_is_adapter_wanted) + StartScanThread(); + else + StopScanThread(); } void Init() @@ -529,30 +555,6 @@ void Init() if (!s_config_callback_id) s_config_callback_id = Config::AddConfigChangedCallback(RefreshConfig); RefreshConfig(); - - if (UseAdapter()) - StartScanThread(); -} - -void StartScanThread() -{ - if (s_adapter_detect_thread_running.IsSet()) - return; -#if GCADAPTER_USE_LIBUSB_IMPLEMENTATION - if (!s_libusb_context->IsValid()) - return; -#endif - s_adapter_detect_thread_running.Set(true); - s_adapter_detect_thread = std::thread(ScanThreadFunc); -} - -void StopScanThread() -{ - if (s_adapter_detect_thread_running.TestAndClear()) - { - s_hotplug_event.Set(); - s_adapter_detect_thread.join(); - } } static void Setup() @@ -826,7 +828,7 @@ static void Reset() GCPadStatus Input(int chan) { - if (!UseAdapter()) + if (!s_is_adapter_wanted) return {}; #if GCADAPTER_USE_LIBUSB_IMPLEMENTATION @@ -964,11 +966,6 @@ void ResetDeviceType(int chan) s_port_states[chan].controller_type = ControllerType::None; } -bool UseAdapter() -{ - return s_is_adapter_wanted; -} - void ResetRumble() { #if GCADAPTER_USE_LIBUSB_IMPLEMENTATION @@ -992,7 +989,7 @@ void ResetRumble() // being called while the libusb state is being reset static void ResetRumbleLockNeeded() { - if (!UseAdapter() || (s_handle == nullptr || s_status != AdapterStatus::Detected)) + if (!s_is_adapter_wanted || s_handle == nullptr || s_status != AdapterStatus::Detected) { return; } @@ -1019,7 +1016,7 @@ static void ResetRumbleLockNeeded() void Output(int chan, u8 rumble_command) { - if (!UseAdapter() || !s_config_rumble_enabled[chan]) + if (!s_is_adapter_wanted || !s_config_rumble_enabled[chan]) return; #if GCADAPTER_USE_LIBUSB_IMPLEMENTATION diff --git a/Source/Core/InputCommon/GCAdapter.h b/Source/Core/InputCommon/GCAdapter.h index 50e24ae940..5e6d844059 100644 --- a/Source/Core/InputCommon/GCAdapter.h +++ b/Source/Core/InputCommon/GCAdapter.h @@ -15,8 +15,6 @@ void Init(); void ResetRumble(); void Shutdown(); void SetAdapterCallback(std::function<void(void)> func); -void StartScanThread(); -void StopScanThread(); // Buttons have PAD_GET_ORIGIN set on new connection // Netplay and CSIDevice_GCAdapter make use of this. @@ -26,7 +24,6 @@ void Output(int chan, u8 rumble_command); bool IsDetected(const char** error_message); bool DeviceConnected(int chan); void ResetDeviceType(int chan); -bool UseAdapter(); // Callable from any thread. Returns 0 when the adapter is not detected. double GetCurrentPollRate(); |
