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(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 ae9d753c74..e9c01891f4 100644 --- a/Source/Core/Core/IOS/USB/Common.h +++ b/Source/Core/Core/IOS/USB/Common.h @@ -156,6 +156,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 df16180345..4d5983ff30 100644 --- a/Source/Core/Core/IOS/USB/Emulated/LogitechMic.cpp +++ b/Source/Core/Core/IOS/USB/Emulated/LogitechMic.cpp @@ -716,10 +716,10 @@ int LogitechMic::SubmitTransfer(std::unique_ptr 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 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; }