From f43f3a0bfdf78805b9e212f864bb282a112eefde Mon Sep 17 00:00:00 2001 From: Sketch <75850871+SketchMaster2001@users.noreply.github.com> Date: Sat, 15 Jul 2023 19:55:22 -0400 Subject: [PATCH] Config stuff --- Source/Core/Core/Config/MainSettings.cpp | 3 +++ Source/Core/Core/Config/MainSettings.h | 1 + .../Core/Core/IOS/USB/Emulated/WiiSpeak.cpp | 21 +++++++++++++++++-- Source/Core/Core/IOS/USB/Emulated/WiiSpeak.h | 1 + 4 files changed, 24 insertions(+), 2 deletions(-) diff --git a/Source/Core/Core/Config/MainSettings.cpp b/Source/Core/Core/Config/MainSettings.cpp index 2ae286cff0..818707ca8d 100644 --- a/Source/Core/Core/Config/MainSettings.cpp +++ b/Source/Core/Core/Config/MainSettings.cpp @@ -569,6 +569,9 @@ const Info MAIN_EMULATE_INFINITY_BASE{ const Info MAIN_EMULATE_WII_SPEAK{{System::Main, "EmulatedUSBDevices", "EmulateWiiSpeak"}, false}; +const Info MAIN_WII_SPEAK_MICROPHONE{{System::Main, "General", "WiiSpeakMicrophone"}, + ""}; + // The reason we need this function is because some memory card code // expects to get a non-NTSC-K region even if we're emulating an NTSC-K Wii. DiscIO::Region ToGameCubeRegion(DiscIO::Region region) diff --git a/Source/Core/Core/Config/MainSettings.h b/Source/Core/Core/Config/MainSettings.h index 226325f960..7e6754bff0 100644 --- a/Source/Core/Core/Config/MainSettings.h +++ b/Source/Core/Core/Config/MainSettings.h @@ -352,6 +352,7 @@ void SetUSBDeviceWhitelist(const std::set>& devices); extern const Info MAIN_EMULATE_SKYLANDER_PORTAL; extern const Info MAIN_EMULATE_INFINITY_BASE; extern const Info MAIN_EMULATE_WII_SPEAK; +extern const Info MAIN_WII_SPEAK_MICROPHONE; // GameCube path utility functions diff --git a/Source/Core/Core/IOS/USB/Emulated/WiiSpeak.cpp b/Source/Core/Core/IOS/USB/Emulated/WiiSpeak.cpp index ad3427ad64..4e763585c3 100644 --- a/Source/Core/Core/IOS/USB/Emulated/WiiSpeak.cpp +++ b/Source/Core/Core/IOS/USB/Emulated/WiiSpeak.cpp @@ -24,8 +24,19 @@ WiiSpeak::WiiSpeak(IOS::HLE::EmulationKernel& ios, const std::string& device_nam m_endpoint_descriptor.emplace_back(EndpointDescriptor{0x7, 0x5, 0x3, 0x1, 0x0040, 1}); m_microphone = Microphone(); - m_microphone.OpenMicrophone(); - m_microphone.StartCapture(); + if (m_microphone.OpenMicrophone() != 0) + { + ERROR_LOG_FMT(IOS_USB, "Error opening the microphone."); + b_is_mic_connected = false; + return; + } + + if (m_microphone.StartCapture() != 0) + { + ERROR_LOG_FMT(IOS_USB, "Error starting captures."); + b_is_mic_connected = false; + return; + } m_microphone_thread = std::thread([this] { u64 timeout{}; @@ -135,6 +146,9 @@ int WiiSpeak::SubmitTransfer(std::unique_ptr cmd) m_vid, m_pid, m_active_interface, cmd->request_type, cmd->request, cmd->value, cmd->index, cmd->length); + if (!b_is_mic_connected) + return IPC_ENOENT; + switch (cmd->request_type << 8 | cmd->request) { case USBHDR(DIR_DEVICE2HOST, TYPE_STANDARD, REC_INTERFACE, REQUEST_GET_INTERFACE): @@ -195,6 +209,9 @@ int WiiSpeak::SubmitTransfer(std::unique_ptr cmd) int WiiSpeak::SubmitTransfer(std::unique_ptr cmd) { + if (!b_is_mic_connected) + return IPC_ENOENT; + auto& system = m_ios.GetSystem(); auto& memory = system.GetMemory(); diff --git a/Source/Core/Core/IOS/USB/Emulated/WiiSpeak.h b/Source/Core/Core/IOS/USB/Emulated/WiiSpeak.h index e3e1ed776f..2b9d468bf8 100644 --- a/Source/Core/Core/IOS/USB/Emulated/WiiSpeak.h +++ b/Source/Core/Core/IOS/USB/Emulated/WiiSpeak.h @@ -83,6 +83,7 @@ private: u8 m_active_interface = 0; bool m_device_attached = false; bool init = false; + bool b_is_mic_connected = true; Microphone m_microphone; DeviceDescriptor m_device_descriptor{}; std::vector m_config_descriptor;