Browse Source

[desktop] fix audio sink_id never saving

This issue has like 15 different causes, and I'm surprised it took this
long to pop up.

1. LoadString had a hack *specific* to the AudioEngine enum. Why?
   Solving this was easy, just use the explicit type ctor. -_-
2. The LoadString hack was abused in configure_audio.cpp to get around
   the canonicalization infrastructure that was explicitly put in to
   make this exact operation easier. Why?
3. ToString was also broken because of LoadString's garbage output.
   Technically it might work now, but it's better to just use the
   canonicalization infrastructure that was made specifically for this
   purpose.

Also did a few tiny optimizations in config/settings cuz wynaut.

Signed-off-by: crueter <crueter@eden-emu.dev>
pull/3083/head
crueter 3 months ago
parent
commit
0e18f436f2
No known key found for this signature in database GPG Key ID: 425ACD2D4830EBC6
  1. 6
      src/common/settings_setting.h
  2. 15
      src/frontend_common/config.cpp
  3. 40
      src/yuzu/configuration/configure_audio.cpp

6
src/common/settings_setting.h

@ -192,15 +192,13 @@ public:
if constexpr (std::is_same_v<Type, std::string>) {
this->SetValue(input);
} else if constexpr (std::is_same_v<Type, std::optional<u32>>) {
this->SetValue(static_cast<u32>(std::stoul(input)));
this->SetValue(u32(std::stoul(input)));
} else if constexpr (std::is_same_v<Type, bool>) {
this->SetValue(input == "true");
} else if constexpr (std::is_same_v<Type, float>) {
this->SetValue(std::stof(input));
} else if constexpr (std::is_same_v<Type, AudioEngine>) {
this->SetValue(ToEnum<AudioEngine>(input));
} else {
this->SetValue(static_cast<Type>(std::stoll(input)));
this->SetValue(Type(std::stoll(input)));
}
} catch (std::invalid_argument&) {
this->SetValue(this->GetDefault());

15
src/frontend_common/config.cpp

@ -1,23 +1,19 @@
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#include <algorithm>
#include <array>
#include "config.h"
#include "common/fs/fs.h"
#include "common/fs/path_util.h"
#include "common/logging/log.h"
#include "common/settings.h"
#include "common/settings_common.h"
#include "common/settings_enums.h"
#include "config.h"
#include "core/core.h"
#include "core/hle/service/acc/profile_manager.h"
#include "hid_core/resources/npad/npad.h"
#include "network/network.h"
#include <algorithm>
#include <array>
#include <boost/algorithm/string/replace.hpp>
#include "common/string_util.h"
#include "common/assert.h"
namespace FS = Common::FS;
@ -926,8 +922,7 @@ void Config::ReadSettingGeneric(Settings::BasicSetting* const setting) {
const bool is_default =
ReadBooleanSetting(std::string(key).append("\\default"), std::make_optional(true));
if (!is_default) {
const std::string setting_string = ReadStringSetting(key, default_value);
setting->LoadString(setting_string);
setting->LoadString(ReadStringSetting(key, default_value));
} else {
// Empty string resets the Setting to default
setting->LoadString("");

40
src/yuzu/configuration/configure_audio.cpp

@ -186,16 +186,23 @@ void ConfigureAudio::SetConfiguration() {
void ConfigureAudio::SetOutputSinkFromSinkID() {
[[maybe_unused]] const QSignalBlocker blocker(sink_combo_box);
int new_sink_index = 0;
const QString sink_id = QString::fromStdString(Settings::values.sink_id.ToString());
for (int index = 0; index < sink_combo_box->count(); index++) {
if (sink_combo_box->itemText(index) == sink_id) {
new_sink_index = index;
break;
const std::string new_sink_id = []() -> const std::string {
const Settings::AudioEngine sink_id = Settings::values.sink_id.GetValue();
const auto canonicalizations
= Settings::EnumMetadata<Settings::AudioEngine>::Canonicalizations();
for (u32 i = 0; i < canonicalizations.size(); ++i) {
const Settings::AudioEngine value = canonicalizations[i].second;
const std::string_view key = canonicalizations[i].first;
if (sink_id == value)
return std::string(key);
}
}
sink_combo_box->setCurrentIndex(new_sink_index);
return std::string("null");
}();
sink_combo_box->setCurrentText(QString::fromStdString(new_sink_id));
}
void ConfigureAudio::SetOutputDevicesFromDeviceID() {
@ -233,8 +240,21 @@ void ConfigureAudio::ApplyConfiguration() {
apply_func(is_powered_on);
}
Settings::values.sink_id.LoadString(
sink_combo_box->itemText(sink_combo_box->currentIndex()).toStdString());
const u32 new_sink_id = [this]() {
u32 new_sink_id = 0;
const std::string sink_id = sink_combo_box->currentText().toStdString();
const auto canonicalizations
= Settings::EnumMetadata<Settings::AudioEngine>::Canonicalizations();
for (u32 i = 0; i < canonicalizations.size(); ++i) {
if (sink_id == canonicalizations[i].first)
return i;
}
return u32(0);
}();
Settings::values.sink_id.SetValue(Settings::AudioEngine(new_sink_id));
Settings::values.audio_output_device_id.SetValue(
output_device_combo_box->itemText(output_device_combo_box->currentIndex()).toStdString());
Settings::values.audio_input_device_id.SetValue(

Loading…
Cancel
Save