summaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
authorJordan Woyak <jordan.woyak@gmail.com>2025-04-23 23:25:34 -0500
committerGitHub <noreply@github.com>2025-04-23 23:25:34 -0500
commit3025cd472ce86edf26cd2894718ab6901d1fd920 (patch)
treef54ebd102508e93a444275e17ef857fc7a850b57 /Source
parent879a8889aacd3be6707e6b663f1dac8de09c9941 (diff)
parentbda1f379b7cefa4bdc4c3b4d6210003018d0f4b4 (diff)
Merge pull request #13491 from JosJuice/oh0-removed-opened
IOS: Remove from m_opened_devices in OH0::OnDeviceChange
Diffstat (limited to 'Source')
-rw-r--r--Source/Core/Core/IOS/USB/OH0/OH0.cpp16
1 files changed, 13 insertions, 3 deletions
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<USB::Device> 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 <typename T>
@@ -286,6 +295,7 @@ std::pair<ReturnCode, u64> 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);
}