From 17fc224ec8ce37f89f192411c6b3e6e26bb019e8 Mon Sep 17 00:00:00 2001 From: yuzubot Date: Fri, 3 Apr 2020 18:43:34 +0000 Subject: [PATCH] "Merge Tagged PR 3345" --- src/audio_core/stream.cpp | 9 +++++-- src/core/perf_stats.cpp | 4 ++- src/core/perf_stats.h | 2 ++ src/core/settings.cpp | 1 + src/core/settings.h | 1 + src/core/telemetry_session.cpp | 1 + src/yuzu/configuration/config.cpp | 4 +++ src/yuzu/configuration/configure_audio.cpp | 2 ++ src/yuzu/configuration/configure_audio.ui | 30 ++++++++++++++-------- src/yuzu_cmd/config.cpp | 2 ++ src/yuzu_cmd/default_ini.h | 5 ++++ 11 files changed, 48 insertions(+), 13 deletions(-) diff --git a/src/audio_core/stream.cpp b/src/audio_core/stream.cpp index 4ca98f8ea..b89ef6649 100644 --- a/src/audio_core/stream.cpp +++ b/src/audio_core/stream.cpp @@ -11,8 +11,10 @@ #include "audio_core/stream.h" #include "common/assert.h" #include "common/logging/log.h" +#include "core/core.h" #include "core/core_timing.h" #include "core/core_timing_util.h" +#include "core/perf_stats.h" #include "core/settings.h" namespace AudioCore { @@ -61,8 +63,11 @@ Stream::State Stream::GetState() const { s64 Stream::GetBufferReleaseCycles(const Buffer& buffer) const { const std::size_t num_samples{buffer.GetSamples().size() / GetNumChannels()}; - const auto us = - std::chrono::microseconds((static_cast(num_samples) * 1000000) / sample_rate); + const double time_scale{Settings::values.enable_realtime_audio + ? Core::System::GetInstance().GetPerfStats().GetLastFrameTimeScale() + : 1.0f}; + const auto us{std::chrono::microseconds( + (static_cast(num_samples) * static_cast(1000000 / time_scale)) / sample_rate)}; return Core::Timing::usToCycles(us); } diff --git a/src/core/perf_stats.cpp b/src/core/perf_stats.cpp index f1ae9d4df..6218084ff 100644 --- a/src/core/perf_stats.cpp +++ b/src/core/perf_stats.cpp @@ -108,13 +108,15 @@ PerfStatsResults PerfStats::GetAndResetStats(microseconds current_system_time_us system_frames = 0; game_frames = 0; + target_fps = static_cast(results.game_fps / results.emulation_speed); + return results; } double PerfStats::GetLastFrameTimeScale() { std::lock_guard lock{object_mutex}; - constexpr double FRAME_LENGTH = 1.0 / 60; + double FRAME_LENGTH = 1.0 / target_fps; return duration_cast(previous_frame_length).count() / FRAME_LENGTH; } diff --git a/src/core/perf_stats.h b/src/core/perf_stats.h index d9a64f072..9c955cc24 100644 --- a/src/core/perf_stats.h +++ b/src/core/perf_stats.h @@ -81,6 +81,8 @@ private: Clock::time_point frame_begin = reset_point; /// Total visible duration (including frame-limiting, etc.) of the previous system frame Clock::duration previous_frame_length = Clock::duration::zero(); + + u32 target_fps{60}; }; class FrameLimiter { diff --git a/src/core/settings.cpp b/src/core/settings.cpp index c1282cb80..2aad00ebf 100644 --- a/src/core/settings.cpp +++ b/src/core/settings.cpp @@ -98,6 +98,7 @@ void LogSettings() { LogSetting("Renderer_UseVsync", Settings::values.use_vsync); LogSetting("Audio_OutputEngine", Settings::values.sink_id); LogSetting("Audio_EnableAudioStretching", Settings::values.enable_audio_stretching); + LogSetting("Audio_EnableRealTime", Settings::values.enable_realtime_audio); LogSetting("Audio_OutputDevice", Settings::values.audio_device_id); LogSetting("DataStorage_UseVirtualSd", Settings::values.use_virtual_sd); LogSetting("DataStorage_NandDir", FileUtil::GetUserPath(FileUtil::UserPath::NANDDir)); diff --git a/src/core/settings.h b/src/core/settings.h index 79ec01731..6521babc6 100644 --- a/src/core/settings.h +++ b/src/core/settings.h @@ -452,6 +452,7 @@ struct Values { // Audio std::string sink_id; bool enable_audio_stretching; + bool enable_realtime_audio; std::string audio_device_id; float volume; diff --git a/src/core/telemetry_session.cpp b/src/core/telemetry_session.cpp index 0f3685d1c..7472abab7 100644 --- a/src/core/telemetry_session.cpp +++ b/src/core/telemetry_session.cpp @@ -178,6 +178,7 @@ void TelemetrySession::AddInitialInfo(Loader::AppLoader& app_loader) { constexpr auto field_type = Telemetry::FieldType::UserConfig; AddField(field_type, "Audio_SinkId", Settings::values.sink_id); AddField(field_type, "Audio_EnableAudioStretching", Settings::values.enable_audio_stretching); + AddField(field_type, "Audio_EnableRealTime", Settings::values.enable_realtime_audio); AddField(field_type, "Core_UseMultiCore", Settings::values.use_multi_core); AddField(field_type, "Renderer_Backend", TranslateRenderer(Settings::values.renderer_backend)); AddField(field_type, "Renderer_ResolutionFactor", Settings::values.resolution_factor); diff --git a/src/yuzu/configuration/config.cpp b/src/yuzu/configuration/config.cpp index 3b9ab38dd..9b47306fa 100644 --- a/src/yuzu/configuration/config.cpp +++ b/src/yuzu/configuration/config.cpp @@ -407,6 +407,8 @@ void Config::ReadAudioValues() { .toStdString(); Settings::values.enable_audio_stretching = ReadSetting(QStringLiteral("enable_audio_stretching"), true).toBool(); + Settings::values.enable_realtime_audio = + ReadSetting(QStringLiteral("enable_realtime_audio"), true).toBool(); Settings::values.audio_device_id = ReadSetting(QStringLiteral("output_device"), QStringLiteral("auto")) .toString() @@ -913,6 +915,8 @@ void Config::SaveAudioValues() { QStringLiteral("auto")); WriteSetting(QStringLiteral("enable_audio_stretching"), Settings::values.enable_audio_stretching, true); + WriteSetting(QStringLiteral("enable_realtime_audio"), Settings::values.enable_realtime_audio, + true); WriteSetting(QStringLiteral("output_device"), QString::fromStdString(Settings::values.audio_device_id), QStringLiteral("auto")); WriteSetting(QStringLiteral("volume"), Settings::values.volume, 1.0f); diff --git a/src/yuzu/configuration/configure_audio.cpp b/src/yuzu/configuration/configure_audio.cpp index f370c690f..66b60f5bd 100644 --- a/src/yuzu/configuration/configure_audio.cpp +++ b/src/yuzu/configuration/configure_audio.cpp @@ -42,6 +42,7 @@ void ConfigureAudio::SetConfiguration() { SetAudioDeviceFromDeviceID(); ui->toggle_audio_stretching->setChecked(Settings::values.enable_audio_stretching); + ui->toggle_realtime_audio->setChecked(Settings::values.enable_realtime_audio); ui->volume_slider->setValue(Settings::values.volume * ui->volume_slider->maximum()); SetVolumeIndicatorText(ui->volume_slider->sliderPosition()); } @@ -84,6 +85,7 @@ void ConfigureAudio::ApplyConfiguration() { ui->output_sink_combo_box->itemText(ui->output_sink_combo_box->currentIndex()) .toStdString(); Settings::values.enable_audio_stretching = ui->toggle_audio_stretching->isChecked(); + Settings::values.enable_realtime_audio = ui->toggle_realtime_audio->isChecked(); Settings::values.audio_device_id = ui->audio_device_combo_box->itemText(ui->audio_device_combo_box->currentIndex()) .toStdString(); diff --git a/src/yuzu/configuration/configure_audio.ui b/src/yuzu/configuration/configure_audio.ui index a098b9acc..0dbb55f51 100644 --- a/src/yuzu/configuration/configure_audio.ui +++ b/src/yuzu/configuration/configure_audio.ui @@ -31,16 +31,26 @@ - - - - This post-processing effect adjusts audio speed to match emulation speed and helps prevent audio stutter. This however increases audio latency. - - - Enable audio stretching - - - + + + + This post-processing effect adjusts audio speed to match emulation speed and helps prevent audio stutter. This however increases audio latency. + + + Enable audio stretching + + + + + + + This adjusts audio timing to match real-time speed and helps prevent audio stutter. + + + Enable real-time audio + + + diff --git a/src/yuzu_cmd/config.cpp b/src/yuzu_cmd/config.cpp index f4cd905c9..1c1fc478f 100644 --- a/src/yuzu_cmd/config.cpp +++ b/src/yuzu_cmd/config.cpp @@ -404,6 +404,8 @@ void Config::ReadValues() { Settings::values.sink_id = sdl2_config->Get("Audio", "output_engine", "auto"); Settings::values.enable_audio_stretching = sdl2_config->GetBoolean("Audio", "enable_audio_stretching", true); + Settings::values.enable_realtime_audio = + sdl2_config->GetBoolean("Audio", "enable_realtime_audio", true); Settings::values.audio_device_id = sdl2_config->Get("Audio", "output_device", "auto"); Settings::values.volume = static_cast(sdl2_config->GetReal("Audio", "volume", 1)); diff --git a/src/yuzu_cmd/default_ini.h b/src/yuzu_cmd/default_ini.h index d63d7a58e..1d2a222b0 100644 --- a/src/yuzu_cmd/default_ini.h +++ b/src/yuzu_cmd/default_ini.h @@ -201,6 +201,11 @@ output_engine = # 0: No, 1 (default): Yes enable_audio_stretching = +# Whether or not to enable the real-time audio processing. +# This effect adjusts audio speed to match real-time speed and helps prevent audio stutter. +# 0: No, 1 (default): Yes +enable_realtime_audio = + # Which audio device to use. # auto (default): Auto-select output_device =