Merge pull request #14172 from sepalani/usb-iso-ret
IOS/USB: Add helper to set return values of IsoMessage's packets
This commit is contained in:
4 files changed
+30
-6
No files matched your search
@@ -54,9 +54,28 @@ void IsoMessage::SetPacketReturnValue(const size_t packet_num, const u16 return_
|
|||||||
{
|
{
|
||||||
auto& system = m_ios.GetSystem();
|
auto& system = m_ios.GetSystem();
|
||||||
auto& memory = system.GetMemory();
|
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)));
|
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;
|
Device::~Device() = default;
|
||||||
|
|
||||||
u64 Device::GetId() const
|
u64 Device::GetId() const
|
||||||
|
|||||||
@@ -155,6 +155,11 @@ struct IsoMessage : TransferCommand
|
|||||||
u8 endpoint = 0;
|
u8 endpoint = 0;
|
||||||
using TransferCommand::TransferCommand;
|
using TransferCommand::TransferCommand;
|
||||||
void SetPacketReturnValue(size_t packet_num, u16 return_value) const;
|
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
|
class Device
|
||||||
|
|||||||
@@ -717,10 +717,10 @@ int LogitechMic::SubmitTransfer(std::unique_ptr<IsoMessage> cmd)
|
|||||||
u16 size = 0;
|
u16 size = 0;
|
||||||
if (m_microphone && m_microphone->HasData(cmd->length / sizeof(s16)))
|
if (m_microphone && m_microphone->HasData(cmd->length / sizeof(s16)))
|
||||||
size = m_microphone->ReadIntoBuffer(packets, cmd->length);
|
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]));
|
WARN_LOG_FMT(IOS_USB, "Microphone data truncated, {} byte(s) lost in isochronous message",
|
||||||
size = (size > cmd->packet_sizes[i]) ? (size - cmd->packet_sizes[i]) : 0;
|
remainder);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -241,10 +241,10 @@ int WiiSpeak::SubmitTransfer(std::unique_ptr<IsoMessage> cmd)
|
|||||||
u16 size = 0;
|
u16 size = 0;
|
||||||
if (m_microphone && m_microphone->HasData(cmd->length / sizeof(s16)))
|
if (m_microphone && m_microphone->HasData(cmd->length / sizeof(s16)))
|
||||||
size = m_microphone->ReadIntoBuffer(packets, cmd->length);
|
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]));
|
WARN_LOG_FMT(IOS_USB, "Wii Speak data truncated, {} byte(s) lost in isochronous message",
|
||||||
size = (size > cmd->packet_sizes[i]) ? (size - cmd->packet_sizes[i]) : 0;
|
remainder);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user