From 65a09924d9e6f47cfc31de9d5c85cf095f76db92 Mon Sep 17 00:00:00 2001 From: Sepalani Date: Sun, 29 Sep 2024 00:16:49 +0400 Subject: [PATCH] IOS/USB: Implement Wii Speak REQUEST_SET_INTERFACE command Based on LibusbDevice::SubmitTransfer code --- .../Core/Core/IOS/USB/Emulated/WiiSpeak.cpp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/Source/Core/Core/IOS/USB/Emulated/WiiSpeak.cpp b/Source/Core/Core/IOS/USB/Emulated/WiiSpeak.cpp index 3252c47061..58eb297f3e 100644 --- a/Source/Core/Core/IOS/USB/Emulated/WiiSpeak.cpp +++ b/Source/Core/Core/IOS/USB/Emulated/WiiSpeak.cpp @@ -103,6 +103,25 @@ int WiiSpeak::SubmitTransfer(std::unique_ptr cmd) cmd->ScheduleTransferCompletion(1, 100); break; } + case USBHDR(DIR_HOST2DEVICE, TYPE_STANDARD, REC_INTERFACE, REQUEST_SET_INTERFACE): + { + INFO_LOG_FMT(IOS_USB, "[{:04x}:{:04x} {}] REQUEST_SET_INTERFACE index={:04x} value={:04x}", + m_vid, m_pid, m_active_interface, cmd->index, cmd->value); + if (static_cast(cmd->index) != m_active_interface) + { + const int ret = ChangeInterface(static_cast(cmd->index)); + if (ret < 0) + { + ERROR_LOG_FMT(IOS_USB, "[{:04x}:{:04x} {}] Failed to change interface to {}", m_vid, m_pid, + m_active_interface, cmd->index); + return ret; + } + } + const int ret = SetAltSetting(static_cast(cmd->value)); + if (ret == 0) + cmd->GetEmulationKernel().EnqueueIPCReply(cmd->ios_request, cmd->length); + return ret; + } case USBHDR(DIR_HOST2DEVICE, TYPE_VENDOR, REC_INTERFACE, 0): { init = false;