summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorJMC47 <JMC4789@gmail.com>2026-03-12 16:33:07 -0400
committerGitHub <noreply@github.com>2026-03-12 16:33:07 -0400
commit9143c4cc9549bb6eadeff5078643b4ef05671fbd (patch)
treeff5e239ed9ebe373a8137b8f091f43bd9131b2c8 /Source/Core
parente550e1ff7cb509550070bfd6d615898bfd9c3432 (diff)
parentb05a7e20595dcab308596e8eba8aa236be140bbc (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.cpp19
-rw-r--r--Source/Core/Core/IOS/USB/Common.h5
-rw-r--r--Source/Core/Core/IOS/USB/Emulated/LogitechMic.cpp6
-rw-r--r--Source/Core/Core/IOS/USB/Emulated/WiiSpeak.cpp6
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;
}