From 74755e593900e75a196590d560fc158b34be64de Mon Sep 17 00:00:00 2001 From: OatmealDome Date: Wed, 23 Jun 2021 04:01:42 -0400 Subject: [PATCH 1/6] WiimoteScannerDarwin: Rename stopScanning for code style compliance --- Source/Core/Core/HW/WiimoteReal/IOdarwin.h | 2 +- Source/Core/Core/HW/WiimoteReal/IOdarwin.mm | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/Core/Core/HW/WiimoteReal/IOdarwin.h b/Source/Core/Core/HW/WiimoteReal/IOdarwin.h index ee0b4b9273..315b414d9d 100644 --- a/Source/Core/Core/HW/WiimoteReal/IOdarwin.h +++ b/Source/Core/Core/HW/WiimoteReal/IOdarwin.h @@ -18,7 +18,7 @@ public: void FindWiimotes(std::vector&, Wiimote*&) override; void Update() override {} // not needed private: - bool stopScanning = false; + bool m_stop_scanning = false; }; } // namespace WiimoteReal diff --git a/Source/Core/Core/HW/WiimoteReal/IOdarwin.mm b/Source/Core/Core/HW/WiimoteReal/IOdarwin.mm index a5b2891a32..d73719c002 100644 --- a/Source/Core/Core/HW/WiimoteReal/IOdarwin.mm +++ b/Source/Core/Core/HW/WiimoteReal/IOdarwin.mm @@ -23,7 +23,7 @@ namespace WiimoteReal { WiimoteScannerDarwin::~WiimoteScannerDarwin() { - stopScanning = true; + m_stop_scanning = true; } void WiimoteScannerDarwin::FindWiimotes(std::vector& found_wiimotes, @@ -60,7 +60,7 @@ void WiimoteScannerDarwin::FindWiimotes(std::vector& found_wiimotes, do { CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, false); - } while (!sbt->done && !stopScanning); + } while (!sbt->done && !m_stop_scanning); int found_devices = [[bti foundDevices] count]; From 6794532abecf6c7ebfef98a46e49b7baacc0999a Mon Sep 17 00:00:00 2001 From: OatmealDome Date: Wed, 23 Jun 2021 04:03:28 -0400 Subject: [PATCH 2/6] IOdarwin_private: Remove hack for bug fixed in newer macOS SDKs --- Source/Core/Core/HW/WiimoteReal/IOdarwin_private.h | 7 ------- 1 file changed, 7 deletions(-) diff --git a/Source/Core/Core/HW/WiimoteReal/IOdarwin_private.h b/Source/Core/Core/HW/WiimoteReal/IOdarwin_private.h index 05b6503b48..cbed1752e9 100644 --- a/Source/Core/Core/HW/WiimoteReal/IOdarwin_private.h +++ b/Source/Core/Core/HW/WiimoteReal/IOdarwin_private.h @@ -4,13 +4,6 @@ #pragma once -// Work around an Apple bug: for some reason, IOBluetooth.h errors on -// inclusion in Mavericks, but only in Objective-C++ C++11 mode. I filed -// this as ; in the meantime... -#import -#undef NS_ENUM_AVAILABLE -#define NS_ENUM_AVAILABLE(...) -// end hack #import #include From eb7b70b48d7d3caa381d8431265c43142dbd220b Mon Sep 17 00:00:00 2001 From: OatmealDome Date: Wed, 23 Jun 2021 14:31:16 -0400 Subject: [PATCH 3/6] WiimoteScannerDarwin: Don't attempt to scan if inquiry doesn't start --- Source/Core/Core/HW/WiimoteReal/IOdarwin.mm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Source/Core/Core/HW/WiimoteReal/IOdarwin.mm b/Source/Core/Core/HW/WiimoteReal/IOdarwin.mm index d73719c002..deafb51203 100644 --- a/Source/Core/Core/HW/WiimoteReal/IOdarwin.mm +++ b/Source/Core/Core/HW/WiimoteReal/IOdarwin.mm @@ -54,7 +54,8 @@ void WiimoteScannerDarwin::FindWiimotes(std::vector& found_wiimotes, ERROR_LOG_FMT(WIIMOTE, "Unable to do Bluetooth discovery"); [bth release]; [sbt release]; - btFailed = true; + + return; } do From 0de30fa0bb57458726d7a5aab5eea02411b2a17f Mon Sep 17 00:00:00 2001 From: OatmealDome Date: Wed, 23 Jun 2021 22:55:15 -0400 Subject: [PATCH 4/6] WiimoteScannerDarwin: Initialize IOBluetoothHostController in constructor --- Source/Core/Core/HW/WiimoteReal/IOdarwin.h | 10 +++++- Source/Core/Core/HW/WiimoteReal/IOdarwin.mm | 40 +++++++++++++-------- 2 files changed, 34 insertions(+), 16 deletions(-) diff --git a/Source/Core/Core/HW/WiimoteReal/IOdarwin.h b/Source/Core/Core/HW/WiimoteReal/IOdarwin.h index 315b414d9d..2c862e5511 100644 --- a/Source/Core/Core/HW/WiimoteReal/IOdarwin.h +++ b/Source/Core/Core/HW/WiimoteReal/IOdarwin.h @@ -7,17 +7,25 @@ #ifdef __APPLE__ #include "Core/HW/WiimoteReal/WiimoteReal.h" +#ifdef __OBJC__ +#import +#else +// IOBluetooth's types won't be defined in pure C++ mode. +typedef void IOBluetoothHostController; +#endif + namespace WiimoteReal { class WiimoteScannerDarwin final : public WiimoteScannerBackend { public: - WiimoteScannerDarwin() = default; + WiimoteScannerDarwin(); ~WiimoteScannerDarwin() override; bool IsReady() const override; void FindWiimotes(std::vector&, Wiimote*&) override; void Update() override {} // not needed private: + IOBluetoothHostController* m_host_controller; bool m_stop_scanning = false; }; } // namespace WiimoteReal diff --git a/Source/Core/Core/HW/WiimoteReal/IOdarwin.mm b/Source/Core/Core/HW/WiimoteReal/IOdarwin.mm index deafb51203..d650ea0105 100644 --- a/Source/Core/Core/HW/WiimoteReal/IOdarwin.mm +++ b/Source/Core/Core/HW/WiimoteReal/IOdarwin.mm @@ -21,27 +21,40 @@ namespace WiimoteReal { +WiimoteScannerDarwin::WiimoteScannerDarwin() +{ + m_host_controller = [IOBluetoothHostController defaultController]; + if (![m_host_controller addressAsString]) + { + WARN_LOG_FMT(WIIMOTE, "No Bluetooth host controller"); + + [m_host_controller release]; + m_host_controller = nil; + + return; + } + + [m_host_controller retain]; +} + WiimoteScannerDarwin::~WiimoteScannerDarwin() { + [m_host_controller release]; + m_host_controller = nil; + m_stop_scanning = true; } void WiimoteScannerDarwin::FindWiimotes(std::vector& found_wiimotes, Wiimote*& found_board) { - // TODO: find the device in the constructor and save it for later - IOBluetoothHostController* bth; - IOBluetoothDeviceInquiry* bti; - found_board = nullptr; - - bth = [[IOBluetoothHostController alloc] init]; - bool btFailed = [bth addressAsString] == nil; - if (btFailed) + if (!m_host_controller) { - WARN_LOG_FMT(WIIMOTE, "No Bluetooth host controller"); - [bth release]; return; } + + IOBluetoothDeviceInquiry* bti; + found_board = nullptr; SearchBT* sbt = [[SearchBT alloc] init]; sbt->maxDevices = 32; @@ -52,7 +65,6 @@ void WiimoteScannerDarwin::FindWiimotes(std::vector& found_wiimotes, if ([bti start] != kIOReturnSuccess) { ERROR_LOG_FMT(WIIMOTE, "Unable to do Bluetooth discovery"); - [bth release]; [sbt release]; return; @@ -86,16 +98,14 @@ void WiimoteScannerDarwin::FindWiimotes(std::vector& found_wiimotes, found_wiimotes.push_back(wm); } } - - [bth release]; + [bti release]; [sbt release]; } bool WiimoteScannerDarwin::IsReady() const { - // TODO: only return true when a BT device is present - return true; + return m_host_controller != nil; } WiimoteDarwin::WiimoteDarwin(IOBluetoothDevice* device) : m_btd(device) From b494d109d473d613b61158029bfd33ecf49bd01b Mon Sep 17 00:00:00 2001 From: OatmealDome Date: Wed, 23 Jun 2021 23:09:01 -0400 Subject: [PATCH 5/6] 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 From 156ffef98c2f3b19201134b79b3db56c1478d81b Mon Sep 17 00:00:00 2001 From: OatmealDome Date: Thu, 24 Jun 2021 17:59:58 -0400 Subject: [PATCH 6/6] WiimoteScannerDarwin: Fix lint --- Source/Core/Core/HW/WiimoteReal/IOLinux.h | 4 ++-- Source/Core/Core/HW/WiimoteReal/IOdarwin.h | 1 + Source/Core/Core/HW/WiimoteReal/IOdarwin.mm | 14 +++++++------- Source/Core/Core/HW/WiimoteReal/IOhidapi.h | 4 ++-- Source/Core/Core/HW/WiimoteReal/WiimoteReal.cpp | 4 ++-- 5 files changed, 14 insertions(+), 13 deletions(-) diff --git a/Source/Core/Core/HW/WiimoteReal/IOLinux.h b/Source/Core/Core/HW/WiimoteReal/IOLinux.h index ba7b3d3224..0269991740 100644 --- a/Source/Core/Core/HW/WiimoteReal/IOLinux.h +++ b/Source/Core/Core/HW/WiimoteReal/IOLinux.h @@ -46,8 +46,8 @@ public: ~WiimoteScannerLinux() override; bool IsReady() const override; void FindWiimotes(std::vector&, Wiimote*&) override; - void Update() override {} // not needed on Linux - void RequestStopSearching() override {} // not needed on Linux + 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/IOdarwin.h b/Source/Core/Core/HW/WiimoteReal/IOdarwin.h index 0521dbcc89..fd474b6048 100644 --- a/Source/Core/Core/HW/WiimoteReal/IOdarwin.h +++ b/Source/Core/Core/HW/WiimoteReal/IOdarwin.h @@ -25,6 +25,7 @@ public: 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/IOdarwin.mm b/Source/Core/Core/HW/WiimoteReal/IOdarwin.mm index d650ea0105..34d10b083d 100644 --- a/Source/Core/Core/HW/WiimoteReal/IOdarwin.mm +++ b/Source/Core/Core/HW/WiimoteReal/IOdarwin.mm @@ -27,13 +27,13 @@ WiimoteScannerDarwin::WiimoteScannerDarwin() if (![m_host_controller addressAsString]) { WARN_LOG_FMT(WIIMOTE, "No Bluetooth host controller"); - + [m_host_controller release]; m_host_controller = nil; - + return; } - + [m_host_controller retain]; } @@ -41,7 +41,7 @@ WiimoteScannerDarwin::~WiimoteScannerDarwin() { [m_host_controller release]; m_host_controller = nil; - + m_stop_scanning = true; } @@ -52,7 +52,7 @@ void WiimoteScannerDarwin::FindWiimotes(std::vector& found_wiimotes, { return; } - + IOBluetoothDeviceInquiry* bti; found_board = nullptr; @@ -66,7 +66,7 @@ void WiimoteScannerDarwin::FindWiimotes(std::vector& found_wiimotes, { ERROR_LOG_FMT(WIIMOTE, "Unable to do Bluetooth discovery"); [sbt release]; - + return; } @@ -98,7 +98,7 @@ void WiimoteScannerDarwin::FindWiimotes(std::vector& found_wiimotes, found_wiimotes.push_back(wm); } } - + [bti release]; [sbt release]; } diff --git a/Source/Core/Core/HW/WiimoteReal/IOhidapi.h b/Source/Core/Core/HW/WiimoteReal/IOhidapi.h index 1214e852e2..2cc4505533 100644 --- a/Source/Core/Core/HW/WiimoteReal/IOhidapi.h +++ b/Source/Core/Core/HW/WiimoteReal/IOhidapi.h @@ -38,8 +38,8 @@ public: ~WiimoteScannerHidapi(); bool IsReady() const override; void FindWiimotes(std::vector&, Wiimote*&) override; - void Update() override {} // not needed for hidapi - void RequestStopSearching() override {} // not needed for hidapi + 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 f95af96833..397cc0774e 100644 --- a/Source/Core/Core/HW/WiimoteReal/WiimoteReal.cpp +++ b/Source/Core/Core/HW/WiimoteReal/WiimoteReal.cpp @@ -545,12 +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(); } }