mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2026-03-19 11:53:04 +00:00
IOS/USB: Add helper to set return values of IsoMessage's packets
This commit is contained in:
parent
09a0e95efe
commit
b05a7e2059
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user