From 3dc6ae115f558b2e818706409cd9e3c8cd264238 Mon Sep 17 00:00:00 2001 From: Connor McLaughlin Date: Fri, 25 Mar 2022 19:24:27 +1000 Subject: [PATCH] Qt: Implement (partial) audio settings --- pcsx2-qt/Settings/AudioSettingsWidget.cpp | 83 ++++- pcsx2-qt/Settings/AudioSettingsWidget.h | 8 + pcsx2-qt/Settings/AudioSettingsWidget.ui | 412 +++++++++++++++++++++- pcsx2-qt/Settings/SettingsDialog.cpp | 3 +- 4 files changed, 502 insertions(+), 4 deletions(-) diff --git a/pcsx2-qt/Settings/AudioSettingsWidget.cpp b/pcsx2-qt/Settings/AudioSettingsWidget.cpp index 80d54281d9..1846405743 100644 --- a/pcsx2-qt/Settings/AudioSettingsWidget.cpp +++ b/pcsx2-qt/Settings/AudioSettingsWidget.cpp @@ -24,12 +24,93 @@ #include "SettingWidgetBinder.h" #include "SettingsDialog.h" +static constexpr s32 DEFAULT_INTERPOLATION_MODE = 5; +static constexpr s32 DEFAULT_SYNCHRONIZATION_MODE = 0; +static constexpr s32 DEFAULT_EXPANSION_MODE = 0; +static const char* DEFAULT_OUTPUT_MODULE = "cubeb"; +static constexpr s32 DEFAULT_OUTPUT_LATENCY = 100; +static constexpr s32 DEFAULT_VOLUME = 100; +static constexpr s32 DEFAULT_SOUNDTOUCH_SEQUENCE_LENGTH = 30; +static constexpr s32 DEFAULT_SOUNDTOUCH_SEEK_WINDOW = 20; +static constexpr s32 DEFAULT_SOUNDTOUCH_OVERLAP = 10; + +static const char* s_output_module_entries[] = { + QT_TRANSLATE_NOOP("AudioSettingsWidget", "No Sound (Emulate SPU2 only)"), + QT_TRANSLATE_NOOP("AudioSettingsWidget", "Cubeb (Cross-platform)"), +#ifdef _WIN32 + QT_TRANSLATE_NOOP("AudioSettingsWidget", "XAudio2"), +#endif +}; +static const char* s_output_module_values[] = { + "nullout", + "cubeb", +#ifdef _WIN32 + "xaudio2", +#endif +}; + AudioSettingsWidget::AudioSettingsWidget(SettingsDialog* dialog, QWidget* parent) : QWidget(parent) { - // SettingsInterface* sif = dialog->getSettingsInterface(); + SettingsInterface* sif = dialog->getSettingsInterface(); m_ui.setupUi(this); + + SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.interpolation, "SPU2/Mixing", "Interpolation", DEFAULT_INTERPOLATION_MODE); + SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.syncMode, "SPU2/Output", "SynchMode", DEFAULT_SYNCHRONIZATION_MODE); + SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.expansionMode, "SPU2/Output", "SpeakerConfiguration", DEFAULT_EXPANSION_MODE); + + SettingWidgetBinder::BindWidgetToEnumSetting(sif, m_ui.outputModule, "SPU2/Output", "OutputModule", s_output_module_entries, s_output_module_values, DEFAULT_OUTPUT_MODULE); + SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.latency, "SPU2/Output", "Latency", DEFAULT_OUTPUT_LATENCY); + connect(m_ui.latency, &QSlider::valueChanged, this, &AudioSettingsWidget::updateLatencyLabel); + + SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.volume, "SPU2/Mixing", "FinalVolume", DEFAULT_VOLUME); + connect(m_ui.volume, &QSlider::valueChanged, this, &AudioSettingsWidget::updateVolumeLabel); + + SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.sequenceLength, "Soundtouch", "SequenceLengthMS", DEFAULT_SOUNDTOUCH_SEQUENCE_LENGTH); + connect(m_ui.sequenceLength, &QSlider::valueChanged, this, &AudioSettingsWidget::updateTimestretchSequenceLengthLabel); + SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.seekWindowSize, "Soundtouch", "SeekWindowMS", DEFAULT_SOUNDTOUCH_SEEK_WINDOW); + connect(m_ui.seekWindowSize, &QSlider::valueChanged, this, &AudioSettingsWidget::updateTimestretchSeekwindowLengthLabel); + SettingWidgetBinder::BindWidgetToIntSetting(sif, m_ui.overlap, "Soundtouch", "OverlapMS", DEFAULT_SOUNDTOUCH_OVERLAP); + connect(m_ui.overlap, &QSlider::valueChanged, this, &AudioSettingsWidget::updateTimestretchOverlapLabel); + + updateVolumeLabel(); + updateLatencyLabel(); + updateTimestretchSequenceLengthLabel(); + updateTimestretchSeekwindowLengthLabel(); + updateTimestretchOverlapLabel(); } AudioSettingsWidget::~AudioSettingsWidget() = default; + +void AudioSettingsWidget::updateVolumeLabel() +{ + m_ui.volumeLabel->setText(tr("%1%").arg(m_ui.volume->value())); +} + +void AudioSettingsWidget::updateLatencyLabel() +{ + m_ui.latencyLabel->setText(tr("%1 ms (avg)").arg(m_ui.latency->value())); +} + +void AudioSettingsWidget::updateTimestretchSequenceLengthLabel() +{ + m_ui.sequenceLengthLabel->setText(tr("%1 ms").arg(m_ui.sequenceLength->value())); +} + +void AudioSettingsWidget::updateTimestretchSeekwindowLengthLabel() +{ + m_ui.seekWindowSizeLabel->setText(tr("%1 ms").arg(m_ui.seekWindowSize->value())); +} + +void AudioSettingsWidget::updateTimestretchOverlapLabel() +{ + m_ui.overlapLabel->setText(tr("%1 ms").arg(m_ui.overlap->value())); +} + +void AudioSettingsWidget::resetTimestretchDefaults() +{ + m_ui.sequenceLength->setValue(DEFAULT_SOUNDTOUCH_SEQUENCE_LENGTH); + m_ui.seekWindowSize->setValue(DEFAULT_SOUNDTOUCH_SEEK_WINDOW); + m_ui.overlap->setValue(DEFAULT_SOUNDTOUCH_OVERLAP); +} diff --git a/pcsx2-qt/Settings/AudioSettingsWidget.h b/pcsx2-qt/Settings/AudioSettingsWidget.h index 206adf15bd..0f96df8658 100644 --- a/pcsx2-qt/Settings/AudioSettingsWidget.h +++ b/pcsx2-qt/Settings/AudioSettingsWidget.h @@ -29,6 +29,14 @@ public: AudioSettingsWidget(SettingsDialog* dialog, QWidget* parent); ~AudioSettingsWidget(); +private Q_SLOTS: + void updateVolumeLabel(); + void updateLatencyLabel(); + void updateTimestretchSequenceLengthLabel(); + void updateTimestretchSeekwindowLengthLabel(); + void updateTimestretchOverlapLabel(); + void resetTimestretchDefaults(); + private: Ui::AudioSettingsWidget m_ui; }; diff --git a/pcsx2-qt/Settings/AudioSettingsWidget.ui b/pcsx2-qt/Settings/AudioSettingsWidget.ui index c77b0aae97..74942abb64 100644 --- a/pcsx2-qt/Settings/AudioSettingsWidget.ui +++ b/pcsx2-qt/Settings/AudioSettingsWidget.ui @@ -6,13 +6,421 @@ 0 0 - 400 - 300 + 752 + 430 Form + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Mixing Settings + + + + + + Interpolation: + + + + + + + + Nearest (Fastest / worst quality) + + + + + Linear (Simple / okay sound) + + + + + Cubic (Fake highs / okay sound) + + + + + Hermite (Better highs / okay sound) + + + + + Catmull-Rom (PS2-like / good sound) + + + + + Gaussian (PS2-like / great sound) + + + + + + + + Synchronization: + + + + + + + + TimeStretch (Recommended) + + + + + Async Mix (Breaks some games!) + + + + + None (Audio can skip.) + + + + + + + + Expansion: + + + + + + + + Stereo (None, Default) + + + + + Quadrafonic + + + + + Surround 5.1 + + + + + Surround 7.1 + + + + + + + + + + + Output Settings + + + + + + Output Module: + + + + + + + + No Sound (Emulate SPU2 only) + + + + + Cubeb (Cross-platform) + + + + + XAudio2 + + + + + + + + Latency: + + + + + + + + + 15 + + + 3000 + + + 100 + + + Qt::Horizontal + + + QSlider::TicksBelow + + + 200 + + + + + + + 100 ms (avg) + + + + + + + + + + + + Timestretch Settings + + + + + + Sequence Length: + + + + + + + + + 20 + + + 100 + + + Qt::Horizontal + + + QSlider::TicksBelow + + + 10 + + + + + + + 100 + + + + + + + + + Seekwindow Size: + + + + + + + + + 10 + + + 30 + + + Qt::Horizontal + + + QSlider::TicksBelow + + + 2 + + + + + + + 100 + + + + + + + + + Overlap: + + + + + + + + + 5 + + + 15 + + + Qt::Horizontal + + + QSlider::TicksBelow + + + 1 + + + + + + + 100 + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 120 + 0 + + + + Reset Defaults + + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + Volume + + + + + + 100 + + + Qt::Vertical + + + QSlider::TicksBothSides + + + 10 + + + + + + + 100% + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + diff --git a/pcsx2-qt/Settings/SettingsDialog.cpp b/pcsx2-qt/Settings/SettingsDialog.cpp index dae3ceaa5f..d20d767e5c 100644 --- a/pcsx2-qt/Settings/SettingsDialog.cpp +++ b/pcsx2-qt/Settings/SettingsDialog.cpp @@ -26,6 +26,7 @@ #include "SettingsDialog.h" #include "AdvancedSystemSettingsWidget.h" +#include "AudioSettingsWidget.h" #include "BIOSSettingsWidget.h" #include "EmulationSettingsWidget.h" #include "GameSummaryWidget.h" @@ -114,7 +115,7 @@ void SettingsDialog::setupUi(const GameList::Entry* game) addWidget(m_graphics_settings = new GraphicsSettingsWidget(this, m_ui.settingsContainer), tr("Graphics"), QStringLiteral("brush-line"), tr("Graphics Settings
")); - addWidget(new QWidget(m_ui.settingsContainer), tr("Audio"), QStringLiteral("volume-up-line"), + addWidget(m_audio_settings = new AudioSettingsWidget(this, m_ui.settingsContainer), tr("Audio"), QStringLiteral("volume-up-line"), tr("Audio Settings
These options control the audio output of the console. Mouse over an option for additional " "information.")); addWidget(