IOS/USB: Add helper to set return values of IsoMessage's packets

This commit is contained in:
Sepalani 2025-11-23 21:59:58 +04:00
parent 09a0e95efe
commit b05a7e2059
4 changed files with 30 additions and 6 deletions

View File

@ -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

View File

@ -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

View File

@ -716,10 +716,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;
}

View File

@ -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;
}