diff options
| author | JMC47 <JMC4789@gmail.com> | 2026-03-12 16:33:07 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-03-12 16:33:07 -0400 |
| commit | 9143c4cc9549bb6eadeff5078643b4ef05671fbd (patch) | |
| tree | ff5e239ed9ebe373a8137b8f091f43bd9131b2c8 /Source/Core | |
| parent | e550e1ff7cb509550070bfd6d615898bfd9c3432 (diff) | |
| parent | b05a7e20595dcab308596e8eba8aa236be140bbc (diff) | |
Merge pull request #14172 from sepalani/usb-iso-ret
IOS/USB: Add helper to set return values of IsoMessage's packets
Diffstat (limited to 'Source/Core')
| -rw-r--r-- | Source/Core/Core/IOS/USB/Common.cpp | 19 | ||||
| -rw-r--r-- | Source/Core/Core/IOS/USB/Common.h | 5 | ||||
| -rw-r--r-- | Source/Core/Core/IOS/USB/Emulated/LogitechMic.cpp | 6 | ||||
| -rw-r--r-- | Source/Core/Core/IOS/USB/Emulated/WiiSpeak.cpp | 6 |
4 files changed, 30 insertions, 6 deletions
diff --git a/Source/Core/Core/IOS/USB/Common.cpp b/Source/Core/Core/IOS/USB/Common.cpp index 3bf56f4b77..46807a9abd 100644 --- a/Source/Core/Core/IOS/USB/Common.cpp +++ b/Source/Core/Core/IOS/USB/Common.cpp @@ -54,9 +54,28 @@ void IsoMessage::SetPacketReturnValue(const size_t packet_num, const u16 return_ { auto& system = m_ios.GetSystem(); auto& memory = system.GetMemory(); + SetPacketReturnValue(packet_num, return_value, memory); +} + +inline void IsoMessage::SetPacketReturnValue(const size_t packet_num, const u16 return_value, + Memory::MemoryManager& memory) const +{ memory.Write_U16(return_value, static_cast<u32>(packet_sizes_addr + packet_num * sizeof(u16))); } +u16 IsoMessage::SetPacketsReturnValueFromSize(u16 data_size) const +{ + auto& system = m_ios.GetSystem(); + auto& memory = system.GetMemory(); + for (std::size_t i = 0; i < num_packets; i++) + { + const u16 packet_size = std::min(data_size, packet_sizes[i]); + SetPacketReturnValue(i, packet_size, memory); + data_size -= packet_size; + } + return data_size; +} + Device::~Device() = default; u64 Device::GetId() const diff --git a/Source/Core/Core/IOS/USB/Common.h b/Source/Core/Core/IOS/USB/Common.h index 84d0b31258..9f9e80951f 100644 --- a/Source/Core/Core/IOS/USB/Common.h +++ b/Source/Core/Core/IOS/USB/Common.h @@ -155,6 +155,11 @@ struct IsoMessage : TransferCommand u8 endpoint = 0; using TransferCommand::TransferCommand; void SetPacketReturnValue(size_t packet_num, u16 return_value) const; + u16 SetPacketsReturnValueFromSize(u16 data_size) const; + +private: + inline void SetPacketReturnValue(size_t packet_num, u16 return_value, + Memory::MemoryManager& memory) const; }; class Device diff --git a/Source/Core/Core/IOS/USB/Emulated/LogitechMic.cpp b/Source/Core/Core/IOS/USB/Emulated/LogitechMic.cpp index 42cc7b1602..fccdbd7939 100644 --- a/Source/Core/Core/IOS/USB/Emulated/LogitechMic.cpp +++ b/Source/Core/Core/IOS/USB/Emulated/LogitechMic.cpp @@ -717,10 +717,10 @@ int LogitechMic::SubmitTransfer(std::unique_ptr<IsoMessage> cmd) u16 size = 0; if (m_microphone && m_microphone->HasData(cmd->length / sizeof(s16))) size = m_microphone->ReadIntoBuffer(packets, cmd->length); - for (std::size_t i = 0; i < cmd->num_packets; i++) + if (const u16 remainder = cmd->SetPacketsReturnValueFromSize(size); remainder != 0) { - cmd->SetPacketReturnValue(i, std::min(size, cmd->packet_sizes[i])); - size = (size > cmd->packet_sizes[i]) ? (size - cmd->packet_sizes[i]) : 0; + WARN_LOG_FMT(IOS_USB, "Microphone data truncated, {} byte(s) lost in isochronous message", + remainder); } break; } diff --git a/Source/Core/Core/IOS/USB/Emulated/WiiSpeak.cpp b/Source/Core/Core/IOS/USB/Emulated/WiiSpeak.cpp index 3b519c4c6e..31095c4a44 100644 --- a/Source/Core/Core/IOS/USB/Emulated/WiiSpeak.cpp +++ b/Source/Core/Core/IOS/USB/Emulated/WiiSpeak.cpp @@ -241,10 +241,10 @@ int WiiSpeak::SubmitTransfer(std::unique_ptr<IsoMessage> cmd) u16 size = 0; if (m_microphone && m_microphone->HasData(cmd->length / sizeof(s16))) size = m_microphone->ReadIntoBuffer(packets, cmd->length); - for (std::size_t i = 0; i < cmd->num_packets; i++) + if (const u16 remainder = cmd->SetPacketsReturnValueFromSize(size); remainder != 0) { - cmd->SetPacketReturnValue(i, std::min(size, cmd->packet_sizes[i])); - size = (size > cmd->packet_sizes[i]) ? (size - cmd->packet_sizes[i]) : 0; + WARN_LOG_FMT(IOS_USB, "Wii Speak data truncated, {} byte(s) lost in isochronous message", + remainder); } break; } |
