diff --git a/Source/Core/Core/IOS/USB/OH0/OH0.cpp b/Source/Core/Core/IOS/USB/OH0/OH0.cpp index dad3c182c9..4f5df4cf10 100644 --- a/Source/Core/Core/IOS/USB/OH0/OH0.cpp +++ b/Source/Core/Core/IOS/USB/OH0/OH0.cpp @@ -81,10 +81,10 @@ void OH0::DoState(PointerWrap& p) 5000); Core::DisplayMessage("If USB doesn't work properly, an emulation reset may be needed.", 5000); } + p.Do(m_insertion_hooks); + p.Do(m_removal_hooks); + p.Do(m_opened_devices); } - p.Do(m_insertion_hooks); - p.Do(m_removal_hooks); - p.Do(m_opened_devices); USBHost::DoState(p); } @@ -243,9 +243,18 @@ bool OH0::HasDeviceWithVidPid(const u16 vid, const u16 pid) const void OH0::OnDeviceChange(const ChangeEvent event, std::shared_ptr device) { if (event == ChangeEvent::Inserted) + { TriggerHook(m_insertion_hooks, {device->GetVid(), device->GetPid()}, IPC_SUCCESS); + } else if (event == ChangeEvent::Removed) + { TriggerHook(m_removal_hooks, device->GetId(), IPC_SUCCESS); + + // This fixes a problem where Rock Band 3 randomly fails to detect reconnected microphones. + // Real IOS behavior untested. + std::lock_guard lk(m_devices_mutex); + m_opened_devices.erase(device->GetId()); + } } template @@ -286,6 +295,7 @@ std::pair OH0::DeviceOpen(const u16 vid, const u16 pid) void OH0::DeviceClose(const u64 device_id) { TriggerHook(m_removal_hooks, device_id, IPC_ENOENT); + std::lock_guard lk(m_devices_mutex); m_opened_devices.erase(device_id); }