diff --git a/src/common/config.cpp b/src/common/config.cpp index 6f8563377..898aa72c4 100644 --- a/src/common/config.cpp +++ b/src/common/config.cpp @@ -54,6 +54,7 @@ static bool useSpecialPad = false; static int specialPadClass = 1; static bool isMotionControlsEnabled = true; static bool useUnifiedInputConfig = true; +static std::string micDevice = "Default Device"; // These two entries aren't stored in the config static bool overrideControllerColor = false; @@ -193,6 +194,10 @@ int getCursorHideTimeout() { return cursorHideTimeout; } +std::string getMicDevice() { + return micDevice; +} + double getTrophyNotificationDuration() { return trophyNotificationDuration; } @@ -445,6 +450,10 @@ void setCursorHideTimeout(int newcursorHideTimeout) { cursorHideTimeout = newcursorHideTimeout; } +void setMicDevice(std::string device) { + micDevice = device; +} + void setTrophyNotificationDuration(double newTrophyNotificationDuration) { trophyNotificationDuration = newTrophyNotificationDuration; } @@ -643,6 +652,7 @@ void load(const std::filesystem::path& path) { toml::find_or(input, "isMotionControlsEnabled", isMotionControlsEnabled); useUnifiedInputConfig = toml::find_or(input, "useUnifiedInputConfig", useUnifiedInputConfig); + micDevice = toml::find_or(input, "micDevice", micDevice); entry_count += input.size(); } @@ -826,6 +836,7 @@ void save(const std::filesystem::path& path) { data["Input"]["specialPadClass"] = specialPadClass; data["Input"]["isMotionControlsEnabled"] = isMotionControlsEnabled; data["Input"]["useUnifiedInputConfig"] = useUnifiedInputConfig; + data["Input"]["micDevice"] = micDevice; data["GPU"]["screenWidth"] = windowWidth; data["GPU"]["screenHeight"] = windowHeight; data["GPU"]["internalScreenWidth"] = internalScreenWidth; @@ -927,6 +938,7 @@ void setDefaultValues() { controllerCustomColorRGB[0] = 0; controllerCustomColorRGB[1] = 0; controllerCustomColorRGB[2] = 255; + micDevice = "Default Device"; // GPU windowWidth = 1280; diff --git a/src/common/config.h b/src/common/config.h index e54425676..c683dd1f2 100644 --- a/src/common/config.h +++ b/src/common/config.h @@ -83,7 +83,9 @@ void setLogFilter(const std::string& type); double getTrophyNotificationDuration(); void setTrophyNotificationDuration(double newTrophyNotificationDuration); int getCursorHideTimeout(); +std::string getMicDevice(); void setCursorHideTimeout(int newcursorHideTimeout); +void setMicDevice(std::string device); void setSeparateLogFilesEnabled(bool enabled); bool getSeparateLogFilesEnabled(); u32 GetLanguage(); diff --git a/src/core/libraries/audio/sdl_in.cpp b/src/core/libraries/audio/sdl_in.cpp index 0f2484c74..0ea34ecfa 100644 --- a/src/core/libraries/audio/sdl_in.cpp +++ b/src/core/libraries/audio/sdl_in.cpp @@ -2,6 +2,7 @@ // SPDX-License-Identifier: GPL-2.0-or-later #include +#include #include "sdl_in.h" int SDLAudioIn::AudioInit() { @@ -43,8 +44,23 @@ int SDLAudioIn::AudioInOpen(int type, uint32_t samples_num, uint32_t freq, uint3 fmt.channels = port.channels_num; fmt.freq = port.freq; - port.stream = SDL_OpenAudioDeviceStream(SDL_AUDIO_DEVICE_DEFAULT_RECORDING, &fmt, - nullptr, nullptr); + std::string micDevStr = Config::getMicDevice(); + uint32_t devId; + + if (micDevStr == "None") { + return ORBIS_AUDIO_IN_ERROR_INVALID_PORT; + } else if (micDevStr == "Default Device") { + devId = SDL_AUDIO_DEVICE_DEFAULT_RECORDING; + } else { + try { + devId = static_cast(std::stoul(micDevStr)); + } catch (const std::exception& e) { + return ORBIS_AUDIO_IN_ERROR_INVALID_PORT; + } + } + + port.stream = SDL_OpenAudioDeviceStream(devId, &fmt, nullptr, nullptr); + if (!port.stream) { port.isOpen = false; return ORBIS_AUDIO_IN_ERROR_INVALID_PORT; diff --git a/src/qt_gui/settings_dialog.cpp b/src/qt_gui/settings_dialog.cpp index ed2a17e25..f47bcd700 100644 --- a/src/qt_gui/settings_dialog.cpp +++ b/src/qt_gui/settings_dialog.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include "common/config.h" @@ -27,6 +28,7 @@ #include "settings_dialog.h" #include "ui_settings_dialog.h" #include "video_core/renderer_vulkan/vk_instance.h" + QStringList languageNames = {"Arabic", "Czech", "Danish", @@ -65,6 +67,7 @@ QMap channelMap; QMap logTypeMap; QMap screenModeMap; QMap chooseHomeTabMap; +QMap micMap; int backgroundImageOpacitySlider_backup; int bgm_volume_backup; @@ -92,6 +95,7 @@ SettingsDialog::SettingsDialog(std::shared_ptr gui_settings, {tr("Graphics"), "Graphics"}, {tr("User"), "User"}, {tr("Input"), "Input"}, {tr("Paths"), "Paths"}, {tr("Debug"), "Debug"}}; + micMap = {{tr("None"), "None"}, {tr("Default Device"), "Default Device"}}; if (m_physical_devices.empty()) { // Populate cache of physical devices. @@ -123,6 +127,25 @@ SettingsDialog::SettingsDialog(std::shared_ptr gui_settings, ui->hideCursorComboBox->addItem(tr("Idle")); ui->hideCursorComboBox->addItem(tr("Always")); + ui->micComboBox->addItem(micMap.key("None"), "None"); + ui->micComboBox->addItem(micMap.key("Default Device"), "Default Device"); + SDL_InitSubSystem(SDL_INIT_AUDIO); + int count = 0; + SDL_AudioDeviceID* devices = SDL_GetAudioRecordingDevices(&count); + if (devices) { + for (int i = 0; i < count; ++i) { + SDL_AudioDeviceID devId = devices[i]; + const char* name = SDL_GetAudioDeviceName(devId); + if (name) { + QString qname = QString::fromUtf8(name); + ui->micComboBox->addItem(qname, QString::number(devId)); + } + } + SDL_free(devices); + } else { + qDebug() << "Erro SDL_GetAudioRecordingDevices:" << SDL_GetError(); + } + InitializeEmulatorLanguages(); LoadValuesFromConfig(); @@ -441,6 +464,14 @@ void SettingsDialog::LoadValuesFromConfig() { ui->hideCursorComboBox->setCurrentIndex(toml::find_or(data, "Input", "cursorState", 1)); OnCursorStateChanged(toml::find_or(data, "Input", "cursorState", 1)); ui->idleTimeoutSpinBox->setValue(toml::find_or(data, "Input", "cursorHideTimeout", 5)); + + QString micValue = QString::fromStdString(Config::getMicDevice()); + int micIndex = ui->micComboBox->findData(micValue); + if (micIndex != -1) { + ui->micComboBox->setCurrentIndex(micIndex); + } else { + ui->micComboBox->setCurrentIndex(0); + } // First options is auto selection -1, so gpuId on the GUI will always have to subtract 1 // when setting and add 1 when getting to select the correct gpu in Qt ui->graphicsAdapterBox->setCurrentIndex(toml::find_or(data, "Vulkan", "gpuId", -1) + 1); @@ -753,6 +784,7 @@ void SettingsDialog::UpdateSettings() { m_gui_settings->SetValue(gui::gl_playBackgroundMusic, ui->playBGMCheckBox->isChecked()); Config::setAllowHDR(ui->enableHDRCheckBox->isChecked()); Config::setLogType(logTypeMap.value(ui->logTypeComboBox->currentText()).toStdString()); + Config::setMicDevice(ui->micComboBox->currentData().toString().toStdString()); Config::setLogFilter(ui->logFilterLineEdit->text().toStdString()); Config::setUserName(ui->userNameLineEdit->text().toStdString()); Config::setTrophyKey(ui->trophyKeyLineEdit->text().toStdString()); diff --git a/src/qt_gui/settings_dialog.ui b/src/qt_gui/settings_dialog.ui index 8d239b58c..cfd330e90 100644 --- a/src/qt_gui/settings_dialog.ui +++ b/src/qt_gui/settings_dialog.ui @@ -59,7 +59,7 @@ - 5 + 4 @@ -149,6 +149,19 @@ + + + + Qt::Orientation::Vertical + + + + 20 + 40 + + + + @@ -309,6 +322,32 @@ 80 + + + + + 0 + 0 + + + + + 11 + false + + + + Check for Updates at Startup + + + + + + + Always Show Changelog + + + @@ -396,32 +435,6 @@ - - - - - 0 - 0 - - - - - 11 - false - - - - Check for Updates at Startup - - - - - - - Always Show Changelog - - - @@ -1440,7 +1453,7 @@ - 7 + 6 0 @@ -1603,6 +1616,12 @@ Controller + + Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop + + + false + 0 @@ -1615,27 +1634,14 @@ - - Enable Motion Controls - - - - - - - true - - + 0 0 - - - 0 - 0 - + + Enable Motion Controls @@ -1652,20 +1658,38 @@ 0 - - - Qt::Orientation::Vertical - - - QSizePolicy::Policy::MinimumExpanding - - - - 20 - 20 - - - + + + + + Microphone + + + + + 14 + 33 + 431 + 31 + + + + + + + + + Qt::Orientation::Vertical + + + + 0 + 40 + + + + + diff --git a/src/qt_gui/translations/en_US.ts b/src/qt_gui/translations/en_US.ts index c2e35f4ee..99a72589f 100644 --- a/src/qt_gui/translations/en_US.ts +++ b/src/qt_gui/translations/en_US.ts @@ -1582,6 +1582,18 @@ Hide Cursor Idle Timeout Hide Cursor Idle Timeout + + Microphone + Microphone + + + None + None + + + Default Device + Default Device + s s