diff --git a/Source/Core/Core/HW/WiimoteReal/IOdarwin.h b/Source/Core/Core/HW/WiimoteReal/IOdarwin.h index 315b414d9d53..2c862e5511b5 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 deafb5120312..d650ea0105d5 100644 --- a/Source/Core/Core/HW/WiimoteReal/IOdarwin.mm +++ b/Source/Core/Core/HW/WiimoteReal/IOdarwin.mm @@ -21,27 +21,40 @@ @interface ConnectBT : NSObject 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 @@ @interface ConnectBT : NSObject if ([bti start] != kIOReturnSuccess) { ERROR_LOG_FMT(WIIMOTE, "Unable to do Bluetooth discovery"); - [bth release]; [sbt release]; return; @@ -86,16 +98,14 @@ @interface ConnectBT : NSObject 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)