From 5e3311746c8fbfc15bf38698b90691f4eefc9637 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Thu, 27 Dec 2018 00:58:27 +0100 Subject: [PATCH] Qt/settings: add new audio buffering options --- rpcs3/Json/tooltips.json | 6 ++- rpcs3/rpcs3qt/emu_settings.h | 18 +++++-- rpcs3/rpcs3qt/settings_dialog.cpp | 44 +++++++++++++++++ rpcs3/rpcs3qt/settings_dialog.h | 1 + rpcs3/rpcs3qt/settings_dialog.ui | 82 ++++++++++++++++++++++++++++++- 5 files changed, 144 insertions(+), 7 deletions(-) diff --git a/rpcs3/Json/tooltips.json b/rpcs3/Json/tooltips.json index 1ca2a90927..ea26000d9c 100644 --- a/rpcs3/Json/tooltips.json +++ b/rpcs3/Json/tooltips.json @@ -5,7 +5,11 @@ "audioDump": "Saves all audio as a raw wave file. If unsure, leave this unchecked.", "convert": "Uses 16-bit audio samples instead of default 32-bit floating point.\nUse with buggy audio drivers if you have no sound or completely broken sound.", "downmix": "Uses stereo audio output instead of default 7.1 surround sound.\nUse with stereo audio devices. Disable it only if you are using a surround sound audio system.", - "masterVolume": "Controls the overall volume of the emulation.\nValues above 100% might reduce the audio quality." + "masterVolume": "Controls the overall volume of the emulation.\nValues above 100% might reduce the audio quality.", + "enableBuffering": "Enables the new audio buffering features - if supported by the backend (XAudio2, OpenAL).", + "audioBufferDuration": "Target buffer duration in milliseconds.\nHigher values make the algorithm's job easier, but may introduce noticeable audio latency.", + "enableTimeStretching": "Enables time stretching - requires buffering to be enabled.\nReduces crackle/stutter further, but may cause a very noticeable reduction in audio quality on slower CPUs.", + "timeStretchingThreshold": "Buffer fill level (in percentage) below which time stretching will start." }, "cpu": { "PPU": { diff --git a/rpcs3/rpcs3qt/emu_settings.h b/rpcs3/rpcs3qt/emu_settings.h index 9c98e109e1..5b06c0321a 100644 --- a/rpcs3/rpcs3qt/emu_settings.h +++ b/rpcs3/rpcs3qt/emu_settings.h @@ -102,6 +102,10 @@ public: ConvertTo16Bit, DownmixStereo, MasterVolume, + EnableBuffering, + AudioBufferDuration, + EnableTimeStretching, + TimeStretchingThreshold, // Input / Output PadHandler, @@ -301,11 +305,15 @@ private: { ShaderLoadBgBlur, { "Video", "Shader Loading Dialog", "Blur effect strength" } }, // Audio - { AudioRenderer, { "Audio", "Renderer"}}, - { DumpToFile, { "Audio", "Dump to file"}}, - { ConvertTo16Bit, { "Audio", "Convert to 16 bit"}}, - { DownmixStereo, { "Audio", "Downmix to Stereo"}}, - { MasterVolume, { "Audio", "Master Volume"}}, + { AudioRenderer, { "Audio", "Renderer"}}, + { DumpToFile, { "Audio", "Dump to file"}}, + { ConvertTo16Bit, { "Audio", "Convert to 16 bit"}}, + { DownmixStereo, { "Audio", "Downmix to Stereo"}}, + { MasterVolume, { "Audio", "Master Volume"}}, + { EnableBuffering, { "Audio", "Enable Buffering"}}, + { AudioBufferDuration, { "Audio", "Desired Audio Buffer Duration"}}, + { EnableTimeStretching, { "Audio", "Enable Time Stretching"}}, + { TimeStretchingThreshold, { "Audio", "Time Stretching Threshold"}}, // Input / Output { PadHandler, { "Input/Output", "Pad"}}, diff --git a/rpcs3/rpcs3qt/settings_dialog.cpp b/rpcs3/rpcs3qt/settings_dialog.cpp index a3690a1392..5603001a26 100644 --- a/rpcs3/rpcs3qt/settings_dialog.cpp +++ b/rpcs3/rpcs3qt/settings_dialog.cpp @@ -711,6 +711,25 @@ settings_dialog::settings_dialog(std::shared_ptr guiSettings, std: // / ____ \ |_| | (_| | | (_) | | | (_| | |_) | // /_/ \_\__,_|\__,_|_|\___/ |_|\__,_|_.__/ + auto EnableTimeStretchingOptions = [this](bool enabled) + { + ui->timeStretchingThresholdLabel->setEnabled(enabled); + ui->timeStretchingThreshold->setEnabled(enabled); + }; + auto EnableBufferingOptions = [this, EnableTimeStretchingOptions](bool enabled) + { + ui->audioBufferDuration->setEnabled(enabled); + ui->audioBufferDurationLabel->setEnabled(enabled); + ui->enableTimeStretching->setEnabled(enabled); + EnableTimeStretchingOptions(enabled && ui->enableTimeStretching->isChecked()); + }; + auto EnableBuffering = [this, EnableBufferingOptions](const QString& text) + { + const bool enabled = text == "XAudio2" || text == "OpenAL"; + ui->enableBuffering->setEnabled(enabled); + EnableBufferingOptions(enabled && ui->enableBuffering->isChecked()); + }; + // Comboboxes xemu_settings->EnhanceComboBox(ui->audioOutBox, emu_settings::AudioRenderer); @@ -721,6 +740,7 @@ settings_dialog::settings_dialog(std::shared_ptr guiSettings, std: #endif // Change displayed backend names ui->audioOutBox->setItemText(ui->renderBox->findData("Null"), tr("Disable Audio Output")); + connect(ui->audioOutBox, &QComboBox::currentTextChanged, EnableBuffering); // Checkboxes @@ -733,11 +753,27 @@ settings_dialog::settings_dialog(std::shared_ptr guiSettings, std: xemu_settings->EnhanceCheckBox(ui->downmix, emu_settings::DownmixStereo); SubscribeTooltip(ui->downmix, json_audio["downmix"].toString()); + xemu_settings->EnhanceCheckBox(ui->enableBuffering, emu_settings::EnableBuffering); + SubscribeTooltip(ui->enableBuffering, json_audio["enableBuffering"].toString()); + connect(ui->enableBuffering, &QCheckBox::clicked, EnableBufferingOptions); + + xemu_settings->EnhanceCheckBox(ui->enableTimeStretching, emu_settings::EnableTimeStretching); + SubscribeTooltip(ui->enableTimeStretching, json_audio["enableTimeStretching"].toString()); + connect(ui->enableTimeStretching, &QCheckBox::clicked, EnableTimeStretchingOptions); + + EnableBuffering(ui->audioOutBox->currentText()); + // Sliders EnhanceSlider(emu_settings::MasterVolume, ui->masterVolume, ui->masterVolumeLabel, tr("Master: %0 %")); SubscribeTooltip(ui->masterVolume, json_audio["masterVolume"].toString()); + EnhanceSlider(emu_settings::AudioBufferDuration, ui->audioBufferDuration, ui->audioBufferDurationLabel, tr("Audio Buffer Duration: %0 ms")); + SubscribeTooltip({ ui->audioBufferDuration, ui->audioBufferDurationLabel }, json_audio["audioBufferDuration"].toString()); + + EnhanceSlider(emu_settings::TimeStretchingThreshold, ui->timeStretchingThreshold, ui->timeStretchingThresholdLabel, tr("Time Stretching Threshold: %0 %")); + SubscribeTooltip({ ui->timeStretchingThreshold, ui->timeStretchingThresholdLabel }, json_audio["timeStretchingThreshold"].toString()); + // _____ __ ____ _______ _ // |_ _| / / / __ \ |__ __| | | // | | / / | | | | | | __ _| |__ @@ -1435,6 +1471,14 @@ void settings_dialog::SubscribeTooltip(QObject* object, const QString& tooltip) object->installEventFilter(this); } +void settings_dialog::SubscribeTooltip(QList objects, const QString& tooltip) +{ + for (auto obj : objects) + { + SubscribeTooltip(obj, tooltip); + } +} + // Thanks Dolphin bool settings_dialog::eventFilter(QObject* object, QEvent* event) { diff --git a/rpcs3/rpcs3qt/settings_dialog.h b/rpcs3/rpcs3qt/settings_dialog.h index a917b969b3..5b92a62f71 100644 --- a/rpcs3/rpcs3qt/settings_dialog.h +++ b/rpcs3/rpcs3qt/settings_dialog.h @@ -58,5 +58,6 @@ private: QHash m_descriptions; void SubscribeDescription(QLabel* description); void SubscribeTooltip(QObject* object, const QString& tooltip); + void SubscribeTooltip(QList objects, const QString& tooltip); bool eventFilter(QObject* object, QEvent* event) override; }; diff --git a/rpcs3/rpcs3qt/settings_dialog.ui b/rpcs3/rpcs3qt/settings_dialog.ui index a631fdc463..0912ea21e4 100644 --- a/rpcs3/rpcs3qt/settings_dialog.ui +++ b/rpcs3/rpcs3qt/settings_dialog.ui @@ -823,6 +823,22 @@ + + + + Qt::Vertical + + + QSizePolicy::MinimumExpanding + + + + 0 + 0 + + + + @@ -878,7 +894,71 @@ - + + + + + Buffering + + + + + + Enable Buffering + + + + + + + Audio Buffer Duration: 0ms + + + + + + + Qt::Horizontal + + + QSlider::TicksBelow + + + 10 + + + + + + + Enable Time Stretching + + + + + + + Time Stretching Threshold: 0% + + + + + + + Qt::Horizontal + + + QSlider::TicksBelow + + + 10 + + + + + + +