From 46bb91ec312d38607111ccef3acf705bf8af4b02 Mon Sep 17 00:00:00 2001 From: Simone Date: Tue, 23 Jan 2024 13:03:34 +0100 Subject: [PATCH] Settings work --- src/frontend/AudioSettings.cpp | 48 +++++++++++++++++++++++++++++++++ src/frontend/AudioSettings.hpp | 16 +++++++++++ src/frontend/CMakeLists.txt | 4 ++- src/frontend/EmuThread.cpp | 2 +- src/frontend/EmuThread.hpp | 2 ++ src/frontend/JSONUtils.hpp | 10 ++++--- src/frontend/KaizenQt.cpp | 1 + src/frontend/SettingsWindow.cpp | 7 ++++- src/frontend/SettingsWindow.hpp | 4 +++ 9 files changed, 87 insertions(+), 7 deletions(-) create mode 100644 src/frontend/AudioSettings.cpp create mode 100644 src/frontend/AudioSettings.hpp diff --git a/src/frontend/AudioSettings.cpp b/src/frontend/AudioSettings.cpp new file mode 100644 index 00000000..86b96fe1 --- /dev/null +++ b/src/frontend/AudioSettings.cpp @@ -0,0 +1,48 @@ +#include +#include +#include + +AudioSettings::AudioSettings(nlohmann::json& settings) : settings(settings), QWidget(nullptr) { + lockChannels->setChecked(JSONGetField(settings, "audio", "lock")); + volumeL->setValue(JSONGetField(settings, "audio", "volumeL") * 100); + volumeR->setValue(JSONGetField(settings, "audio", "volumeR") * 100); + volumeL->setRange(0, 100); + volumeR->setRange(0, 100); + + connect(lockChannels, &QCheckBox::stateChanged, this, [&]() { + JSONSetField(settings, "audio", "lock", lockChannels->isChecked()); + emit modified(); + }); + + connect(volumeL, &QSlider::valueChanged, this, [&]() { + JSONSetField(settings, "audio", "volumeL", float(volumeL->value()) / 100.f); + if (lockChannels->isChecked()) { + volumeR->setValue(volumeL->value()); + JSONSetField(settings, "audio", "volumeR", float(volumeL->value()) / 100.f); + } + emit modified(); + }); + + connect(volumeR, &QSlider::valueChanged, this, [&]() { + if (!lockChannels->isChecked()) { + JSONSetField(settings, "audio", "volumeR", float(volumeR->value()) / 100.f); + } + emit modified(); + }); + + QLabel* labelLock = new QLabel("Lock channels:"); + QLabel* labelL = new QLabel("Volume L"); + QLabel* labelR = new QLabel("Volume R"); + + QVBoxLayout* mainLayout = new QVBoxLayout; + QHBoxLayout* volLayout = new QHBoxLayout; + mainLayout->addWidget(labelLock); + mainLayout->addWidget(lockChannels); + volLayout->addWidget(labelL); + volLayout->addWidget(volumeL); + volLayout->addWidget(labelR); + volLayout->addWidget(volumeR); + mainLayout->addLayout(volLayout); + mainLayout->addStretch(); + setLayout(mainLayout); +} \ No newline at end of file diff --git a/src/frontend/AudioSettings.hpp b/src/frontend/AudioSettings.hpp new file mode 100644 index 00000000..84a7eee6 --- /dev/null +++ b/src/frontend/AudioSettings.hpp @@ -0,0 +1,16 @@ +#pragma once +#include +#include +#include +#include + +class AudioSettings : public QWidget { + QCheckBox* lockChannels = new QCheckBox; + Q_OBJECT +public: + QSlider* volumeL = new QSlider(Qt::Horizontal), * volumeR = new QSlider(Qt::Horizontal); + AudioSettings(nlohmann::json&); + nlohmann::json& settings; +Q_SIGNALS: + void modified(); +}; \ No newline at end of file diff --git a/src/frontend/CMakeLists.txt b/src/frontend/CMakeLists.txt index d423cca5..d546110b 100644 --- a/src/frontend/CMakeLists.txt +++ b/src/frontend/CMakeLists.txt @@ -64,7 +64,9 @@ add_executable(kaizen-qt SettingsWindow.cpp CPUSettings.hpp CPUSettings.cpp - JSONUtils.hpp) + JSONUtils.hpp + AudioSettings.hpp + AudioSettings.cpp) target_link_libraries(kaizen-qt PUBLIC Qt6::Core Qt6::Gui Qt6::Widgets fmt mio nlohmann_json nfd parallel-rdp backend) diff --git a/src/frontend/EmuThread.cpp b/src/frontend/EmuThread.cpp index 55a637a5..2d439b50 100644 --- a/src/frontend/EmuThread.cpp +++ b/src/frontend/EmuThread.cpp @@ -12,7 +12,7 @@ EmuThread::EmuThread(std::unique_ptr&& instance, std::unique_ n64::InitAudio(); while (true) { if (!core->pause) { - core->Run(0.5, 0.5); + core->Run(settings->getVolumeL(), settings->getVolumeR()); if(core->render) { UpdateScreenParallelRdp(core->cpu->mem.mmio.vi); } diff --git a/src/frontend/EmuThread.hpp b/src/frontend/EmuThread.hpp index f225abb9..8f30183d 100644 --- a/src/frontend/EmuThread.hpp +++ b/src/frontend/EmuThread.hpp @@ -1,6 +1,7 @@ #pragma once #include #include +#include struct QtInstanceFactory; struct ParallelRdpWindowInfo; @@ -20,6 +21,7 @@ public: [[noreturn]] void run() noexcept override; n64::Core* core; + SettingsWindow* settings; bool running = false; void TogglePause() diff --git a/src/frontend/JSONUtils.hpp b/src/frontend/JSONUtils.hpp index 6158f156..9ec9e71d 100644 --- a/src/frontend/JSONUtils.hpp +++ b/src/frontend/JSONUtils.hpp @@ -16,8 +16,10 @@ static inline nlohmann::json JSONOpenOrCreate(const std::string& path) { } else { auto file = std::fstream(path, std::fstream::in | std::fstream::out | std::fstream::trunc); nlohmann::json json; - json["audio"]["volume"] = 0.5; - json["cpu"]["type"] = std::string("interpreter"); + json["audio"]["volumeL"] = 0.5; + json["audio"]["volumeR"] = 0.5; + json["audio"]["lock"] = true; + json["cpu"]["type"] = "interpreter"; file << json; file.close(); @@ -32,6 +34,6 @@ static inline void JSONSetField(nlohmann::json& json, const std::string& field1, } template -static inline const T& JSONGetField(nlohmann::json& json, const std::string& field1, const std::string& field2) { - return json[field1][field2]; +static inline T JSONGetField(nlohmann::json& json, const std::string& field1, const std::string& field2) { + return json[field1][field2].get(); } \ No newline at end of file diff --git a/src/frontend/KaizenQt.cpp b/src/frontend/KaizenQt.cpp index 53ce8073..bb1b2048 100644 --- a/src/frontend/KaizenQt.cpp +++ b/src/frontend/KaizenQt.cpp @@ -22,6 +22,7 @@ KaizenQt::KaizenQt() noexcept : QWidget(nullptr) { settingsWindow = new SettingsWindow; settingsWindow->hide(); emuThread->core = new n64::Core(); + emuThread->settings = settingsWindow; } void KaizenQt::ConnectMainWindowSignalsToSlots() noexcept { diff --git a/src/frontend/SettingsWindow.cpp b/src/frontend/SettingsWindow.cpp index 220b01f4..6799f868 100644 --- a/src/frontend/SettingsWindow.cpp +++ b/src/frontend/SettingsWindow.cpp @@ -13,10 +13,11 @@ SettingsWindow::SettingsWindow() : QWidget(nullptr) { setWindowTitle("Settings"); cpuSettings = new CPUSettings(settings); + audioSettings = new AudioSettings(settings); auto* tabs = new QTabWidget; tabs->addTab(cpuSettings, tr("CPU")); - //tabs->addTab(new PermissionsTab, tr("Audio")); + tabs->addTab(audioSettings, tr("Audio")); apply->setEnabled(false); @@ -24,6 +25,10 @@ SettingsWindow::SettingsWindow() : QWidget(nullptr) { apply->setEnabled(true); }); + connect(audioSettings, &AudioSettings::modified, this, [&]() { + apply->setEnabled(true); + }); + connect(apply, &QPushButton::pressed, this, [&]() { apply->setEnabled(false); std::ofstream file("resources/settings.json"); diff --git a/src/frontend/SettingsWindow.hpp b/src/frontend/SettingsWindow.hpp index 005d25a9..b0e9b8b3 100644 --- a/src/frontend/SettingsWindow.hpp +++ b/src/frontend/SettingsWindow.hpp @@ -3,13 +3,17 @@ #include #include #include +#include class SettingsWindow : public QWidget { QPushButton* cancel = new QPushButton("Cancel"); QPushButton* apply = new QPushButton("Apply"); Q_OBJECT public: + float getVolumeL() { return float(audioSettings->volumeL->value()) / 100.f; } + float getVolumeR() { return float(audioSettings->volumeR->value()) / 100.f; } SettingsWindow(); nlohmann::json settings; CPUSettings* cpuSettings; + AudioSettings* audioSettings; }; \ No newline at end of file