diff options
| author | Dentomologist <dentomologist@gmail.com> | 2026-04-24 19:51:51 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-04-24 19:51:51 -0700 |
| commit | a94854309b36980f302a502303a50aa356688bd4 (patch) | |
| tree | 48081d0e46c4cc5261edb310cf8a625ebe513cd5 /Source/Core/InputCommon/GCAdapter.cpp | |
| parent | d7b7c47453711b99341ae76b1a7346d58b7f40ab (diff) | |
| parent | cc01a603474b66053a2cf5a6104ff637ed144cfe (diff) | |
Merge pull request #14608 from JosJuice/gcadapter-auto-start
GCAdapter: Automatically start and stop thread
Diffstat (limited to 'Source/Core/InputCommon/GCAdapter.cpp')
| -rw-r--r-- | Source/Core/InputCommon/GCAdapter.cpp | 63 |
1 files changed, 30 insertions, 33 deletions
diff --git a/Source/Core/InputCommon/GCAdapter.cpp b/Source/Core/InputCommon/GCAdapter.cpp index c8b686a8b3..8438146c34 100644 --- a/Source/Core/InputCommon/GCAdapter.cpp +++ b/Source/Core/InputCommon/GCAdapter.cpp @@ -462,7 +462,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); @@ -483,6 +483,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; @@ -493,6 +514,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() @@ -531,30 +557,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() @@ -828,7 +830,7 @@ static void Reset() GCPadStatus Input(int chan) { - if (!UseAdapter()) + if (!s_is_adapter_wanted) return {}; #if GCADAPTER_USE_LIBUSB_IMPLEMENTATION @@ -966,11 +968,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 @@ -994,7 +991,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; } @@ -1021,7 +1018,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 |
