diff --git a/src/audio_core/cubeb_input.cpp b/src/audio_core/cubeb_input.cpp index 13d8ce399..794c367ab 100644 --- a/src/audio_core/cubeb_input.cpp +++ b/src/audio_core/cubeb_input.cpp @@ -2,6 +2,7 @@ // Licensed under GPLv2 or any later version // Refer to the license.txt file included. +#include #include #include #include "audio_core/cubeb_input.h" @@ -23,7 +24,8 @@ struct CubebInput::Impl { static void StateCallback(cubeb_stream* stream, void* user_data, cubeb_state state); }; -CubebInput::CubebInput() : impl(std::make_unique()) { +CubebInput::CubebInput(std::string device_id) + : impl(std::make_unique()), device_id(std::move(device_id)) { if (cubeb_init(&impl->ctx, "Citra Input", nullptr) != CUBEB_OK) { LOG_ERROR(Audio, "cubeb_init failed! Mic will not work properly"); return; @@ -56,6 +58,23 @@ void CubebInput::StartSampling(const Frontend::Mic::Parameters& params) { is_sampling = true; cubeb_devid input_device = nullptr; + if (device_id != Frontend::Mic::default_device_name && !device_id.empty()) { + cubeb_device_collection collection; + if (cubeb_enumerate_devices(impl->ctx, CUBEB_DEVICE_TYPE_INPUT, &collection) != CUBEB_OK) { + LOG_WARNING(Audio, "Audio input device enumeration not supported"); + } else { + const auto collection_end = collection.device + collection.count; + const auto device = std::find_if( + collection.device, collection_end, [this](const cubeb_device_info& info) { + return info.friendly_name != nullptr && device_id == info.friendly_name; + }); + if (device != collection_end) { + input_device = device->devid; + } + cubeb_device_collection_destroy(impl->ctx, &collection); + } + } + cubeb_stream_params input_params; input_params.channels = 1; input_params.layout = CUBEB_LAYOUT_UNDEFINED; diff --git a/src/audio_core/cubeb_input.h b/src/audio_core/cubeb_input.h index a38737849..2e752da7a 100644 --- a/src/audio_core/cubeb_input.h +++ b/src/audio_core/cubeb_input.h @@ -12,7 +12,7 @@ namespace AudioCore { class CubebInput final : public Frontend::Mic::Interface { public: - CubebInput(); + explicit CubebInput(std::string device_id); ~CubebInput() override; void StartSampling(const Frontend::Mic::Parameters& params) override; @@ -26,6 +26,7 @@ public: private: struct Impl; std::unique_ptr impl; + std::string device_id; }; std::vector ListCubebInputDevices(); diff --git a/src/citra/config.cpp b/src/citra/config.cpp index 1b18f4536..9b0b1a8c1 100644 --- a/src/citra/config.cpp +++ b/src/citra/config.cpp @@ -13,6 +13,7 @@ #include "common/file_util.h" #include "common/logging/log.h" #include "common/param_package.h" +#include "core/frontend/mic.h" #include "core/hle/service/service.h" #include "core/settings.h" #include "input_common/main.h" @@ -178,7 +179,7 @@ void Config::ReadValues() { Settings::values.audio_device_id = sdl2_config->GetString("Audio", "output_device", "auto"); Settings::values.volume = static_cast(sdl2_config->GetReal("Audio", "volume", 1)); Settings::values.mic_input_device = - sdl2_config->GetString("Audio", "mic_input_device", "Default"); + sdl2_config->GetString("Audio", "mic_input_device", Frontend::Mic::default_device_name); Settings::values.mic_input_type = static_cast(sdl2_config->GetInteger("Audio", "mic_input_type", 0)); diff --git a/src/citra_qt/configuration/config.cpp b/src/citra_qt/configuration/config.cpp index 2e4932b28..2114a9c7e 100644 --- a/src/citra_qt/configuration/config.cpp +++ b/src/citra_qt/configuration/config.cpp @@ -10,6 +10,7 @@ #include "citra_qt/configuration/config.h" #include "citra_qt/uisettings.h" #include "common/file_util.h" +#include "core/frontend/mic.h" #include "core/hle/service/service.h" #include "input_common/main.h" #include "input_common/udp/client.h" @@ -114,7 +115,7 @@ void Config::ReadAudioValues() { Settings::values.mic_input_type = static_cast( ReadSetting(QStringLiteral("mic_input_type"), 0).toInt()); Settings::values.mic_input_device = - ReadSetting(QStringLiteral("mic_input_device"), QStringLiteral("Default")) + ReadSetting(QStringLiteral("mic_input_device"), Frontend::Mic::default_device_name) .toString() .toStdString(); @@ -628,7 +629,7 @@ void Config::SaveAudioValues() { WriteSetting(QStringLiteral("volume"), Settings::values.volume, 1.0f); WriteSetting(QStringLiteral("mic_input_device"), QString::fromStdString(Settings::values.mic_input_device), - QStringLiteral("Default")); + Frontend::Mic::default_device_name); WriteSetting(QStringLiteral("mic_input_type"), static_cast(Settings::values.mic_input_type), 0); diff --git a/src/citra_qt/configuration/configure_audio.cpp b/src/citra_qt/configuration/configure_audio.cpp index 8b120761b..e84c1c4a8 100644 --- a/src/citra_qt/configuration/configure_audio.cpp +++ b/src/citra_qt/configuration/configure_audio.cpp @@ -11,9 +11,12 @@ #include "audio_core/sink_details.h" #include "citra_qt/configuration/configure_audio.h" #include "core/core.h" +#include "core/frontend/mic.h" #include "core/settings.h" #include "ui_configure_audio.h" +constexpr int DEFAULT_INPUT_DEVICE_INDEX = 0; + ConfigureAudio::ConfigureAudio(QWidget* parent) : QWidget(parent), ui(std::make_unique()) { ui->setupUi(this); @@ -75,8 +78,7 @@ void ConfigureAudio::SetConfiguration() { int index = static_cast(Settings::values.mic_input_type); ui->input_type_combo_box->setCurrentIndex(index); - ui->input_device_combo_box->setCurrentText( - QString::fromStdString(Settings::values.mic_input_device)); + UpdateAudioInputDevices(index); } @@ -126,7 +128,12 @@ void ConfigureAudio::ApplyConfiguration() { Settings::values.enable_dsp_lle_multithread = ui->emulation_combo_box->currentIndex() == 2; Settings::values.mic_input_type = static_cast(ui->input_type_combo_box->currentIndex()); - Settings::values.mic_input_device = ui->input_device_combo_box->currentText().toStdString(); + + if (ui->input_device_combo_box->currentIndex() == DEFAULT_INPUT_DEVICE_INDEX) { + Settings::values.mic_input_device = Frontend::Mic::default_device_name; + } else { + Settings::values.mic_input_device = ui->input_device_combo_box->currentText().toStdString(); + } } void ConfigureAudio::UpdateAudioOutputDevices(int sink_index) { @@ -139,7 +146,12 @@ void ConfigureAudio::UpdateAudioOutputDevices(int sink_index) { } } -void ConfigureAudio::UpdateAudioInputDevices(int index) {} +void ConfigureAudio::UpdateAudioInputDevices(int index) { + if (Settings::values.mic_input_device != Frontend::Mic::default_device_name) { + ui->input_device_combo_box->setCurrentText( + QString::fromStdString(Settings::values.mic_input_device)); + } +} void ConfigureAudio::RetranslateUI() { ui->retranslateUi(this); diff --git a/src/core/frontend/mic.h b/src/core/frontend/mic.h index 1605e77c0..1504ad3ca 100644 --- a/src/core/frontend/mic.h +++ b/src/core/frontend/mic.h @@ -11,6 +11,8 @@ namespace Frontend::Mic { +constexpr char default_device_name[] = "Default"; + enum class Signedness : u8 { Signed, Unsigned, diff --git a/src/core/hle/service/mic_u.cpp b/src/core/hle/service/mic_u.cpp index 42b3e6763..ba3e97807 100644 --- a/src/core/hle/service/mic_u.cpp +++ b/src/core/hle/service/mic_u.cpp @@ -326,7 +326,7 @@ struct MIC_U::Impl { break; case Settings::MicInputType::Real: #if HAVE_CUBEB - new_mic = std::make_unique(); + new_mic = std::make_unique(Settings::values.mic_input_device); #else new_mic = std::make_unique(); #endif