From 545ac81d81b92bba22dbc3fe8fde8de7f9590d94 Mon Sep 17 00:00:00 2001 From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com> Date: Mon, 2 Dec 2024 19:41:51 +0200 Subject: [PATCH 1/2] Qt: Add SkyEmu duck icon (#657) --- CMakeLists.txt | 2 +- docs/img/skyemu_icon.png | Bin 0 -> 15327 bytes include/frontend_settings.hpp | 1 + src/frontend_settings.cpp | 7 +++---- src/panda_qt/config_window.cpp | 2 ++ 5 files changed, 7 insertions(+), 5 deletions(-) create mode 100644 docs/img/skyemu_icon.png diff --git a/CMakeLists.txt b/CMakeLists.txt index 33faba5f..224fea7c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -698,7 +698,7 @@ if(NOT BUILD_HYDRA_CORE AND NOT BUILD_LIBRETRO_CORE) docs/img/rsob_icon.png docs/img/rstarstruck_icon.png docs/img/rpog_icon.png docs/img/rsyn_icon.png docs/img/settings_icon.png docs/img/display_icon.png docs/img/speaker_icon.png docs/img/sparkling_icon.png docs/img/battery_icon.png docs/img/sdcard_icon.png - docs/img/rnap_icon.png docs/img/rcow_icon.png + docs/img/rnap_icon.png docs/img/rcow_icon.png docs/img/skyemu_icon.png ) else() set(FRONTEND_SOURCE_FILES src/panda_sdl/main.cpp src/panda_sdl/frontend_sdl.cpp src/panda_sdl/mappings.cpp) diff --git a/docs/img/skyemu_icon.png b/docs/img/skyemu_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f3b9d4ca4f285e0b79f0c859514efb4e6de977 GIT binary patch literal 15327 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 UExbyGfq{X+)78&qol`;+0DC_-Z2$lO literal 0 HcmV?d00001 diff --git a/include/frontend_settings.hpp b/include/frontend_settings.hpp index aaf9eaf0..1a78ab66 100644 --- a/include/frontend_settings.hpp +++ b/include/frontend_settings.hpp @@ -19,6 +19,7 @@ struct FrontendSettings { Rsyn = 1, Rnap = 2, Rcow = 3, + SkyEmu = 4, }; Theme theme = Theme::Dark; diff --git a/src/frontend_settings.cpp b/src/frontend_settings.cpp index 16bae361..498ba500 100644 --- a/src/frontend_settings.cpp +++ b/src/frontend_settings.cpp @@ -38,10 +38,8 @@ FrontendSettings::WindowIcon FrontendSettings::iconFromString(std::string inStri std::transform(inString.begin(), inString.end(), inString.begin(), [](unsigned char c) { return std::tolower(c); }); static const std::unordered_map map = { - {"rpog", WindowIcon::Rpog}, - {"rsyn", WindowIcon::Rsyn}, - {"rcow", WindowIcon::Rcow}, - {"rnap", WindowIcon::Rnap}, + {"rpog", WindowIcon::Rpog}, {"rsyn", WindowIcon::Rsyn}, {"rcow", WindowIcon::Rcow}, + {"rnap", WindowIcon::Rnap}, {"skyemu", WindowIcon::SkyEmu}, }; if (auto search = map.find(inString); search != map.end()) { @@ -57,6 +55,7 @@ const char* FrontendSettings::iconToString(WindowIcon icon) { case WindowIcon::Rsyn: return "rsyn"; case WindowIcon::Rcow: return "rcow"; case WindowIcon::Rnap: return "rnap"; + case WindowIcon::SkyEmu: return "skyemu"; case WindowIcon::Rpog: default: return "rpog"; diff --git a/src/panda_qt/config_window.cpp b/src/panda_qt/config_window.cpp index 92fa0741..60ec3ed2 100644 --- a/src/panda_qt/config_window.cpp +++ b/src/panda_qt/config_window.cpp @@ -85,6 +85,7 @@ ConfigWindow::ConfigWindow(ConfigCallback configCallback, MainWindowCallback win iconSelect->addItem(tr("Happy panda (colourful)")); iconSelect->addItem(tr("Sleepy panda")); iconSelect->addItem(tr("Cow panda")); + iconSelect->addItem(tr("The penguin from SkyEmu")); iconSelect->setCurrentIndex(static_cast(config.frontendSettings.icon)); connect(iconSelect, &QComboBox::currentIndexChanged, this, [&](int index) { @@ -398,6 +399,7 @@ void ConfigWindow::setIcon(WindowIcon icon) { case WindowIcon::Rsyn: updateIcon(":/docs/img/rsyn_icon.png"); break; case WindowIcon::Rnap: updateIcon(":/docs/img/rnap_icon.png"); break; case WindowIcon::Rcow: updateIcon(":/docs/img/rcow_icon.png"); break; + case WindowIcon::SkyEmu: updateIcon(":/docs/img/skyemu_icon.png"); break; case WindowIcon::Rpog: default: updateIcon(":/docs/img/rpog_icon.png"); break; From 5f822b32d501b3ec3a9c66a188feccdbf32c46cd Mon Sep 17 00:00:00 2001 From: wheremyfoodat <44909372+wheremyfoodat@users.noreply.github.com> Date: Tue, 3 Dec 2024 14:16:57 +0200 Subject: [PATCH 2/2] Add volume curve setting (#658) * Add volume curve setting * Qt: Add missing translations --- include/config.hpp | 14 +++++++++++++- src/config.cpp | 27 +++++++++++++++++++++++++++ src/core/audio/miniaudio_device.cpp | 6 ++++++ src/panda_qt/cheats_window.cpp | 4 ++-- src/panda_qt/config_window.cpp | 10 ++++++++++ src/panda_qt/patch_window.cpp | 2 +- src/panda_qt/text_editor.cpp | 2 +- 7 files changed, 60 insertions(+), 5 deletions(-) diff --git a/include/config.hpp b/include/config.hpp index 7361a40d..6041286d 100644 --- a/include/config.hpp +++ b/include/config.hpp @@ -1,12 +1,21 @@ #pragma once #include +#include #include "audio/dsp_core.hpp" -#include "renderer.hpp" #include "frontend_settings.hpp" +#include "renderer.hpp" struct AudioDeviceConfig { + // Audio curve to use for volumes between 0-100 + enum class VolumeCurve : int { + Cubic = 0, // Samples are scaled by volume ^ 3 + Linear = 1, // Samples are scaled by volume + }; + float volumeRaw = 1.0f; + VolumeCurve volumeCurve = VolumeCurve::Cubic; + bool muteAudio = false; float getVolume() const { @@ -16,6 +25,9 @@ struct AudioDeviceConfig { return volumeRaw; } + + static VolumeCurve volumeCurveFromString(std::string inString); + static const char* volumeCurveToString(VolumeCurve curve); }; // Remember to initialize every field here to its default value otherwise bad things will happen diff --git a/src/config.cpp b/src/config.cpp index a8c88a68..fd4d969d 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -1,5 +1,7 @@ #include "config.hpp" +#include +#include #include #include #include @@ -105,6 +107,7 @@ void EmulatorConfig::load() { // Our volume ranges from 0.0 (muted) to 2.0 (boosted, using a logarithmic scale). 1.0 is the "default" volume, ie we don't adjust the PCM // samples at all. audioDeviceConfig.volumeRaw = float(std::clamp(toml::find_or(audio, "AudioVolume", 1.0), 0.0, 2.0)); + audioDeviceConfig.volumeCurve = AudioDeviceConfig::volumeCurveFromString(toml::find_or(audio, "VolumeCurve", "cubic")); } } @@ -188,6 +191,7 @@ void EmulatorConfig::save() { data["Audio"]["EnableAACAudio"] = aacEnabled; data["Audio"]["MuteAudio"] = audioDeviceConfig.muteAudio; data["Audio"]["AudioVolume"] = double(audioDeviceConfig.volumeRaw); + data["Audio"]["VolumeCurve"] = std::string(AudioDeviceConfig::volumeCurveToString(audioDeviceConfig.volumeCurve)); data["Audio"]["PrintDSPFirmware"] = printDSPFirmware; data["Battery"]["ChargerPlugged"] = chargerPlugged; @@ -203,3 +207,26 @@ void EmulatorConfig::save() { file << data; file.close(); } + +AudioDeviceConfig::VolumeCurve AudioDeviceConfig::volumeCurveFromString(std::string inString) { + // Transform to lower-case to make the setting case-insensitive + std::transform(inString.begin(), inString.end(), inString.begin(), [](unsigned char c) { return std::tolower(c); }); + + if (inString == "cubic") { + return VolumeCurve::Cubic; + } else if (inString == "linear") { + return VolumeCurve::Linear; + } + + // Default to cubic curve + return VolumeCurve::Cubic; +} + +const char* AudioDeviceConfig::volumeCurveToString(AudioDeviceConfig::VolumeCurve curve) { + switch (curve) { + case VolumeCurve::Linear: return "linear"; + + case VolumeCurve::Cubic: + default: return "cubic"; + } +} \ No newline at end of file diff --git a/src/core/audio/miniaudio_device.cpp b/src/core/audio/miniaudio_device.cpp index b513450e..550fb039 100644 --- a/src/core/audio/miniaudio_device.cpp +++ b/src/core/audio/miniaudio_device.cpp @@ -134,6 +134,12 @@ void MiniAudioDevice::init(Samples& samples, bool safe) { } else { // If our volume is in [0.0, 1.0) then just multiply by the volume. No need to clamp, since there is no danger of our samples wrapping // around due to overflow + + // If we're applying cubic volume curve, raise volume to the power of 3 + if (self->audioSettings.volumeCurve == AudioDeviceConfig::VolumeCurve::Cubic) { + audioVolume = audioVolume * audioVolume * audioVolume; + } + for (usize i = 0; i < samplesWritten; i += 2) { s16 l = s16(float(sample[0]) * audioVolume); s16 r = s16(float(sample[1]) * audioVolume); diff --git a/src/panda_qt/cheats_window.cpp b/src/panda_qt/cheats_window.cpp index 2d7e6b4c..2485c677 100644 --- a/src/panda_qt/cheats_window.cpp +++ b/src/panda_qt/cheats_window.cpp @@ -69,7 +69,7 @@ void CheatEntryWidget::editClicked() { } CheatEditDialog::CheatEditDialog(Emulator* emu, CheatEntryWidget& cheatEntry) : QDialog(), emu(emu), cheatEntry(cheatEntry) { - setWindowTitle("Edit Cheat"); + setWindowTitle(tr("Edit Cheat")); setAttribute(Qt::WA_DeleteOnClose); setModal(true); @@ -161,7 +161,7 @@ void CheatEditDialog::rejected() { CheatsWindow::CheatsWindow(Emulator* emu, const std::filesystem::path& cheatPath, QWidget* parent) : QWidget(parent, Qt::Window), emu(emu), cheatPath(cheatPath) { - setWindowTitle("Cheats"); + setWindowTitle(tr("Cheats")); mainWindow = static_cast(parent); QVBoxLayout* layout = new QVBoxLayout; diff --git a/src/panda_qt/config_window.cpp b/src/panda_qt/config_window.cpp index 60ec3ed2..99b38b24 100644 --- a/src/panda_qt/config_window.cpp +++ b/src/panda_qt/config_window.cpp @@ -240,6 +240,16 @@ ConfigWindow::ConfigWindow(ConfigCallback configCallback, MainWindowCallback win connectCheckbox(muteAudio, config.audioDeviceConfig.muteAudio); audioLayout->addRow(muteAudio); + QComboBox* volumeCurveType = new QComboBox; + volumeCurveType->addItem(tr("Cubic")); + volumeCurveType->addItem(tr("Linear")); + volumeCurveType->setCurrentIndex(static_cast(config.audioDeviceConfig.volumeCurve)); + connect(volumeCurveType, &QComboBox::currentIndexChanged, this, [&](int index) { + config.audioDeviceConfig.volumeCurve = static_cast(index); + updateConfig(); + }); + audioLayout->addRow(tr("Volume curve"), volumeCurveType); + QSpinBox* volumeRaw = new QSpinBox(); volumeRaw->setRange(0, 200); volumeRaw->setValue(config.audioDeviceConfig.volumeRaw * 100); diff --git a/src/panda_qt/patch_window.cpp b/src/panda_qt/patch_window.cpp index 6ba73e84..6096d89a 100644 --- a/src/panda_qt/patch_window.cpp +++ b/src/panda_qt/patch_window.cpp @@ -12,7 +12,7 @@ #include "io_file.hpp" PatchWindow::PatchWindow(QWidget* parent) : QWidget(parent, Qt::Window) { - setWindowTitle("ROM patcher"); + setWindowTitle(tr("ROM patcher")); QVBoxLayout* layout = new QVBoxLayout; layout->setContentsMargins(6, 6, 6, 6); diff --git a/src/panda_qt/text_editor.cpp b/src/panda_qt/text_editor.cpp index 24febd0d..7ac1d5f2 100644 --- a/src/panda_qt/text_editor.cpp +++ b/src/panda_qt/text_editor.cpp @@ -9,7 +9,7 @@ using namespace Zep; TextEditorWindow::TextEditorWindow(QWidget* parent, const std::string& filename, const std::string& initialText) : QDialog(parent), zepWidget(this, qApp->applicationDirPath().toStdString(), fontSize) { - setWindowTitle("Lua Editor"); + setWindowTitle(tr("Lua Editor")); resize(600, 600); // Register our extensions