From 6b2a8eff15bffc1dc6831d236032c751f426eb13 Mon Sep 17 00:00:00 2001 From: Dentomologist Date: Sat, 21 Mar 2026 13:37:22 -0700 Subject: [PATCH] AudioPane: Fix WASAPI default device combo selection Set the default value of `Config::MAIN_WASAPI_DEVICE` to `default` instead of `Default`. This fixes an issue where `AudioPane`'s `Output Device` combo would be blank if `WASAPI` was selected and the user had never changed the value of `Output Device`. We don't have to worry about backward compatibility with users who have `Default` in their config because config values aren't written unless they've been changed at some point from the default, and the combo has always saved `default` instead of `Default`. Audio still worked during emulation in this situation because the fallback for an unrecognized device name is the default device. To help prevent similar situations in the future references to `MAIN_WASAPI_DEVICE`'s default value now call `GetDefaultValue` instead of hardcoding the expected default, or use the new helper function `Config::IsDefaultValue`. --- Source/Core/AudioCommon/WASAPIStream.cpp | 2 +- Source/Core/Common/Config/Config.h | 6 ++++++ Source/Core/Core/Config/MainSettings.cpp | 2 +- Source/Core/DolphinQt/Settings/AudioPane.cpp | 5 +++-- Source/Core/UICommon/DiscordPresence.cpp | 2 +- 5 files changed, 12 insertions(+), 5 deletions(-) diff --git a/Source/Core/AudioCommon/WASAPIStream.cpp b/Source/Core/AudioCommon/WASAPIStream.cpp index afd5531ae8..9cbf915e82 100644 --- a/Source/Core/AudioCommon/WASAPIStream.cpp +++ b/Source/Core/AudioCommon/WASAPIStream.cpp @@ -176,7 +176,7 @@ bool WASAPIStream::SetRunning(bool running) HRESULT result; - if (Config::Get(Config::MAIN_WASAPI_DEVICE) == "default") + if (Config::IsDefaultValue(Config::MAIN_WASAPI_DEVICE)) { result = m_enumerator->GetDefaultAudioEndpoint(eRender, eConsole, &device); } diff --git a/Source/Core/Common/Config/Config.h b/Source/Core/Common/Config/Config.h index d8a2a9a691..b749986f7e 100644 --- a/Source/Core/Common/Config/Config.h +++ b/Source/Core/Common/Config/Config.h @@ -135,6 +135,12 @@ void DeleteKey(LayerType layer, const Info& info) OnConfigChanged(); } +template +bool IsDefaultValue(const Info& info) +{ + return Get(info) == info.GetDefaultValue(); +} + // Used to defer OnConfigChanged until after the completion of many config changes. class ConfigChangeCallbackGuard { diff --git a/Source/Core/Core/Config/MainSettings.cpp b/Source/Core/Core/Config/MainSettings.cpp index 3d46d756bf..147aeedf50 100644 --- a/Source/Core/Core/Config/MainSettings.cpp +++ b/Source/Core/Core/Config/MainSettings.cpp @@ -319,7 +319,7 @@ const Info MAIN_AUDIO_MUTED{{System::Main, "DSP", "Muted"}, false}; const Info MAIN_AUDIO_MUTE_ON_DISABLED_SPEED_LIMIT{ {System::Main, "DSP", "MuteOnDisabledSpeedLimit"}, false}; #ifdef _WIN32 -const Info MAIN_WASAPI_DEVICE{{System::Main, "DSP", "WASAPIDevice"}, "Default"}; +const Info MAIN_WASAPI_DEVICE{{System::Main, "DSP", "WASAPIDevice"}, "default"}; #endif bool ShouldUseDPL2Decoder() diff --git a/Source/Core/DolphinQt/Settings/AudioPane.cpp b/Source/Core/DolphinQt/Settings/AudioPane.cpp index 435e8f24d5..e48faa7c01 100644 --- a/Source/Core/DolphinQt/Settings/AudioPane.cpp +++ b/Source/Core/DolphinQt/Settings/AudioPane.cpp @@ -123,8 +123,9 @@ void AudioPane::CreateWidgets() #ifdef _WIN32 std::vector> wasapi_options; - wasapi_options.push_back( - std::pair{tr("Default Device"), QStringLiteral("default")}); + const auto default_device_config_value = + QString::fromStdString(Config::MAIN_WASAPI_DEVICE.GetDefaultValue()); + wasapi_options.emplace_back(tr("Default Device"), default_device_config_value); for (auto string : WASAPIStream::GetAvailableDevices()) { diff --git a/Source/Core/UICommon/DiscordPresence.cpp b/Source/Core/UICommon/DiscordPresence.cpp index 80436f6439..1be073a4ca 100644 --- a/Source/Core/UICommon/DiscordPresence.cpp +++ b/Source/Core/UICommon/DiscordPresence.cpp @@ -55,7 +55,7 @@ void HandleDiscordJoin(const char* join_secret) if (event_handler == nullptr) return; - if (Config::Get(Config::NETPLAY_NICKNAME) == Config::NETPLAY_NICKNAME.GetDefaultValue()) + if (Config::IsDefaultValue(Config::NETPLAY_NICKNAME)) Config::SetCurrent(Config::NETPLAY_NICKNAME, username); std::string secret(join_secret);