diff options
| author | Jordan Woyak <jordan.woyak@gmail.com> | 2025-12-22 23:18:36 -0600 |
|---|---|---|
| committer | Jordan Woyak <jordan.woyak@gmail.com> | 2025-12-23 00:16:10 -0600 |
| commit | fc4cbf9c6fa76862b153d72baddde11edb8a3958 (patch) | |
| tree | ddf6e2033e14d1ca76937ecb7bf6973eef01b444 /Source/Core | |
| parent | c55218200a05cbad8b1cfd71acab2dbb253df687 (diff) | |
HW/WiimoteReal: Cache the enumerated Wii remote HID interface list between calls to FindWiimoteHIDDevices.
Diffstat (limited to 'Source/Core')
| -rw-r--r-- | Source/Core/Core/HW/WiimoteReal/IOWin.cpp | 41 | ||||
| -rw-r--r-- | Source/Core/Core/HW/WiimoteReal/IOWin.h | 17 |
2 files changed, 46 insertions, 12 deletions
diff --git a/Source/Core/Core/HW/WiimoteReal/IOWin.cpp b/Source/Core/Core/HW/WiimoteReal/IOWin.cpp index e1cf4971e9..29a7ef2d45 100644 --- a/Source/Core/Core/HW/WiimoteReal/IOWin.cpp +++ b/Source/Core/Core/HW/WiimoteReal/IOWin.cpp @@ -24,7 +24,6 @@ #include "Common/ScopeGuard.h" #include "Common/StringUtil.h" #include "Common/Thread.h" -#include "Common/WindowsDevice.h" #include "Core/HW/WiimoteCommon/DataReport.h" #include "Core/HW/WiimoteCommon/WiimoteConstants.h" @@ -328,7 +327,12 @@ void WiimoteScannerWindows::RemoveRememberedWiimotes() NOTICE_LOG_FMT(WIIMOTE, "Removed remembered Wiimotes: {}", forget_count); } -WiimoteScannerWindows::WiimoteScannerWindows() = default; +WiimoteScannerWindows::WiimoteScannerWindows() +{ + m_device_change_notification.Register([this](Common::DeviceChangeNotification::EventType) { + m_devices_changed.store(true, std::memory_order_release); + }); +} void WiimoteScannerWindows::Update() { @@ -576,9 +580,9 @@ int WiimoteWindows::IOWrite(const u8* buf, size_t len) return write_result; } -auto WiimoteScannerWindows::FindWiimoteHIDDevices() -> FindResults +static std::vector<WiimoteScannerWindows::EnumeratedWiimoteInterface> GetAllWiimoteHIDInterfaces() { - FindResults results; + std::vector<WiimoteScannerWindows::EnumeratedWiimoteInterface> results; // Enumerate connected HID interfaces IDs. auto class_guid = GUID_DEVINTERFACE_HID; @@ -586,14 +590,6 @@ auto WiimoteScannerWindows::FindWiimoteHIDDevices() -> FindResults for (auto* hid_iface : Common::GetDeviceInterfaceList(&class_guid, nullptr, flags)) { - // TODO: WiimoteWindows::GetId() does a redundant conversion. - const auto hid_iface_utf8 = WStringToUTF8(hid_iface); - DEBUG_LOG_FMT(WIIMOTE, "Found HID interface: {}", hid_iface_utf8); - - // Are we already using this device? - if (!IsNewWiimote(hid_iface_utf8)) - continue; - // When connected via Bluetooth, this has a proper name like "Nintendo RVL-CNT-01". const auto parent_description = GetParentDeviceDescription(hid_iface); @@ -650,6 +646,27 @@ auto WiimoteScannerWindows::FindWiimoteHIDDevices() -> FindResults } // Once here, we are confident that this is a Wii device. + results.push_back({hid_iface, is_balance_board}); + } + + return results; +} + +auto WiimoteScannerWindows::FindWiimoteHIDDevices() -> FindResults +{ + if (m_devices_changed.exchange(false, std::memory_order_acquire)) + { + m_wiimote_hid_interfaces = GetAllWiimoteHIDInterfaces(); + INFO_LOG_FMT(WIIMOTE, "Found {} HID interface(s).", m_wiimote_hid_interfaces.size()); + } + + FindResults results; + + for (auto& [hid_iface, is_balance_board] : m_wiimote_hid_interfaces) + { + // Are we already using this device? + if (!IsNewWiimote(WStringToUTF8(hid_iface))) + continue; DEBUG_LOG_FMT(WIIMOTE, "Creating WiimoteWindows"); diff --git a/Source/Core/Core/HW/WiimoteReal/IOWin.h b/Source/Core/Core/HW/WiimoteReal/IOWin.h index b8bc29a86f..aa7b426288 100644 --- a/Source/Core/Core/HW/WiimoteReal/IOWin.h +++ b/Source/Core/Core/HW/WiimoteReal/IOWin.h @@ -6,7 +6,12 @@ #ifdef _WIN32 #include <windows.h> +#include <atomic> +#include <vector> + #include "Common/SocketContext.h" +#include "Common/WindowsDevice.h" + #include "Core/HW/WiimoteReal/WiimoteReal.h" #include "Core/USBUtils.h" @@ -50,6 +55,12 @@ private: class WiimoteScannerWindows final : public WiimoteScannerBackend { public: + struct EnumeratedWiimoteInterface + { + std::wstring hid_iface; + std::optional<bool> is_balance_board; + }; + WiimoteScannerWindows(); bool IsReady() const override; @@ -64,6 +75,12 @@ public: private: FindResults FindWiimoteHIDDevices(); + + // This vector is updated after we receive a device change notification. + std::vector<EnumeratedWiimoteInterface> m_wiimote_hid_interfaces; + std::atomic_bool m_devices_changed{true}; + + Common::DeviceChangeNotification m_device_change_notification; }; } // namespace WiimoteReal |
