From b494d109d473d613b61158029bfd33ecf49bd01b Mon Sep 17 00:00:00 2001 From: OatmealDome Date: Wed, 23 Jun 2021 23:09:01 -0400 Subject: [PATCH] WiimoteScannerBackend: Allow StopThreads to request that any Wiimote searching stops Used by WiimoteScannerDarwin to know when to exit its runloop. --- Source/Core/Core/HW/WiimoteReal/IOAndroid.h | 1 + Source/Core/Core/HW/WiimoteReal/IODummy.h | 1 + Source/Core/Core/HW/WiimoteReal/IOLinux.h | 1 + Source/Core/Core/HW/WiimoteReal/IOWin.h | 1 + Source/Core/Core/HW/WiimoteReal/IOdarwin.h | 1 + Source/Core/Core/HW/WiimoteReal/IOhidapi.h | 1 + Source/Core/Core/HW/WiimoteReal/WiimoteReal.cpp | 6 ++++++ Source/Core/Core/HW/WiimoteReal/WiimoteReal.h | 4 +++- 8 files changed, 15 insertions(+), 1 deletion(-) diff --git a/Source/Core/Core/HW/WiimoteReal/IOAndroid.h b/Source/Core/Core/HW/WiimoteReal/IOAndroid.h index 1802002a42..4447d6ba3e 100644 --- a/Source/Core/Core/HW/WiimoteReal/IOAndroid.h +++ b/Source/Core/Core/HW/WiimoteReal/IOAndroid.h @@ -48,6 +48,7 @@ public: bool IsReady() const override { return true; } void FindWiimotes(std::vector&, Wiimote*&) override; void Update() override {} + void RequestStopSearching() override {} }; } // namespace WiimoteReal diff --git a/Source/Core/Core/HW/WiimoteReal/IODummy.h b/Source/Core/Core/HW/WiimoteReal/IODummy.h index 3d85fb94c9..9e4423ece6 100644 --- a/Source/Core/Core/HW/WiimoteReal/IODummy.h +++ b/Source/Core/Core/HW/WiimoteReal/IODummy.h @@ -16,5 +16,6 @@ public: bool IsReady() const override { return false; } void FindWiimotes(std::vector&, Wiimote*&) override {} void Update() override {} + void RequestStopSearching() override {} }; } // namespace WiimoteReal diff --git a/Source/Core/Core/HW/WiimoteReal/IOLinux.h b/Source/Core/Core/HW/WiimoteReal/IOLinux.h index 665e91bd4d..ba7b3d3224 100644 --- a/Source/Core/Core/HW/WiimoteReal/IOLinux.h +++ b/Source/Core/Core/HW/WiimoteReal/IOLinux.h @@ -47,6 +47,7 @@ public: bool IsReady() const override; void FindWiimotes(std::vector&, Wiimote*&) override; void Update() override {} // not needed on Linux + void RequestStopSearching() override {} // not needed on Linux private: int m_device_id; int m_device_sock; diff --git a/Source/Core/Core/HW/WiimoteReal/IOWin.h b/Source/Core/Core/HW/WiimoteReal/IOWin.h index bdca060553..fdad972f74 100644 --- a/Source/Core/Core/HW/WiimoteReal/IOWin.h +++ b/Source/Core/Core/HW/WiimoteReal/IOWin.h @@ -52,6 +52,7 @@ public: bool IsReady() const override; void FindWiimotes(std::vector&, Wiimote*&) override; void Update() override; + void RequestStopSearching() override {} }; } // namespace WiimoteReal diff --git a/Source/Core/Core/HW/WiimoteReal/IOdarwin.h b/Source/Core/Core/HW/WiimoteReal/IOdarwin.h index 2c862e5511..0521dbcc89 100644 --- a/Source/Core/Core/HW/WiimoteReal/IOdarwin.h +++ b/Source/Core/Core/HW/WiimoteReal/IOdarwin.h @@ -24,6 +24,7 @@ public: bool IsReady() const override; void FindWiimotes(std::vector&, Wiimote*&) override; void Update() override {} // not needed + void RequestStopSearching() override { m_stop_scanning = true; } private: IOBluetoothHostController* m_host_controller; bool m_stop_scanning = false; diff --git a/Source/Core/Core/HW/WiimoteReal/IOhidapi.h b/Source/Core/Core/HW/WiimoteReal/IOhidapi.h index d414acdf8a..1214e852e2 100644 --- a/Source/Core/Core/HW/WiimoteReal/IOhidapi.h +++ b/Source/Core/Core/HW/WiimoteReal/IOhidapi.h @@ -39,6 +39,7 @@ public: bool IsReady() const override; void FindWiimotes(std::vector&, Wiimote*&) override; void Update() override {} // not needed for hidapi + void RequestStopSearching() override {} // not needed for hidapi }; } // namespace WiimoteReal diff --git a/Source/Core/Core/HW/WiimoteReal/WiimoteReal.cpp b/Source/Core/Core/HW/WiimoteReal/WiimoteReal.cpp index 83d262ebeb..f95af96833 100644 --- a/Source/Core/Core/HW/WiimoteReal/WiimoteReal.cpp +++ b/Source/Core/Core/HW/WiimoteReal/WiimoteReal.cpp @@ -545,6 +545,12 @@ void WiimoteScanner::StopThread() if (m_scan_thread_running.TestAndClear()) { SetScanMode(WiimoteScanMode::DO_NOT_SCAN); + + for (const auto& backend : m_backends) + { + backend->RequestStopSearching(); + } + m_scan_thread.join(); } } diff --git a/Source/Core/Core/HW/WiimoteReal/WiimoteReal.h b/Source/Core/Core/HW/WiimoteReal/WiimoteReal.h index 701371d4bd..9756ff6204 100644 --- a/Source/Core/Core/HW/WiimoteReal/WiimoteReal.h +++ b/Source/Core/Core/HW/WiimoteReal/WiimoteReal.h @@ -1,4 +1,4 @@ -// Copyright 2008 Dolphin Emulator Project +// Copyright 2008 Dolphin Emulator Project // Licensed under GPLv2+ // Refer to the license.txt file included. @@ -155,6 +155,8 @@ public: virtual void FindWiimotes(std::vector&, Wiimote*&) = 0; // function called when not looking for more Wiimotes virtual void Update() = 0; + // requests the backend to stop scanning if FindWiimotes is blocking + virtual void RequestStopSearching() = 0; }; enum class WiimoteScanMode