From 8771cde5fc367f54db320824fd390bc4474abb7c Mon Sep 17 00:00:00 2001 From: FearlessTobi Date: Tue, 31 Mar 2020 01:58:00 +0200 Subject: [PATCH] audio_core: Add realtime audio --- src/audio_core/hle/hle.cpp | 8 +++++++- src/core/core.cpp | 4 ++++ src/core/core.h | 2 ++ src/core/settings.cpp | 1 + src/core/settings.h | 1 + src/core/telemetry_session.cpp | 2 ++ 6 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/audio_core/hle/hle.cpp b/src/audio_core/hle/hle.cpp index cba17c5ca..3185549ae 100644 --- a/src/audio_core/hle/hle.cpp +++ b/src/audio_core/hle/hle.cpp @@ -17,6 +17,7 @@ #elif HAVE_FDK #include "audio_core/hle/fdk_decoder.h" #endif +#include #include "audio_core/hle/common.h" #include "audio_core/hle/decoder.h" #include "audio_core/hle/hle.h" @@ -30,6 +31,7 @@ #include "common/logging/log.h" #include "core/core.h" #include "core/core_timing.h" +#include "core/settings.h" SERIALIZE_EXPORT_IMPL(AudioCore::DspHle) @@ -453,7 +455,11 @@ void DspHle::Impl::AudioTickCallback(s64 cycles_late) { // Reschedule recurrent event Core::Timing& timing = Core::System::GetInstance().CoreTiming(); - timing.ScheduleEvent(audio_frame_ticks - cycles_late, tick_event); + const double time_scale = + Settings::values.enable_realtime_audio + ? std::clamp(Core::System::GetInstance().GetLastFrameTimeScale(), 1.0, 3.0) + : 1.0; + timing.ScheduleEvent(audio_frame_ticks / time_scale - cycles_late, tick_event); } DspHle::DspHle(Memory::MemorySystem& memory) : impl(std::make_unique(*this, memory)) {} diff --git a/src/core/core.cpp b/src/core/core.cpp index 5f3fe8099..d08edbbdd 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -339,6 +339,10 @@ PerfStats::Results System::GetAndResetPerfStats() { : PerfStats::Results{}; } +double System::GetLastFrameTimeScale() { + return perf_stats->GetLastFrameTimeScale(); +} + void System::Reschedule() { if (!reschedule_pending) { return; diff --git a/src/core/core.h b/src/core/core.h index e7fbd8ee3..dd23cb0ab 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -168,6 +168,8 @@ public: PerfStats::Results GetAndResetPerfStats(); + double GetLastFrameTimeScale(); + /** * Gets a reference to the emulated CPU. * @returns A reference to the emulated CPU. diff --git a/src/core/settings.cpp b/src/core/settings.cpp index bcac38ca5..caccf1623 100644 --- a/src/core/settings.cpp +++ b/src/core/settings.cpp @@ -107,6 +107,7 @@ void LogSettings() { log_setting("Audio_OutputDevice", values.audio_device_id); log_setting("Audio_InputDeviceType", static_cast(values.mic_input_type)); log_setting("Audio_InputDevice", values.mic_input_device); + log_setting("Audio_EnableRealTime", Settings::values.enable_realtime_audio); using namespace Service::CAM; log_setting("Camera_OuterRightName", values.camera_name[OuterRightCamera]); log_setting("Camera_OuterRightConfig", values.camera_config[OuterRightCamera]); diff --git a/src/core/settings.h b/src/core/settings.h index 6fa68a07c..d2e0f8781 100644 --- a/src/core/settings.h +++ b/src/core/settings.h @@ -202,6 +202,7 @@ struct Values { bool enable_dsp_lle_multithread; std::string sink_id; bool enable_audio_stretching; + bool enable_realtime_audio; std::string audio_device_id; float volume; MicInputType mic_input_type; diff --git a/src/core/telemetry_session.cpp b/src/core/telemetry_session.cpp index 6189e84ee..f13543479 100644 --- a/src/core/telemetry_session.cpp +++ b/src/core/telemetry_session.cpp @@ -162,6 +162,8 @@ void TelemetrySession::AddInitialInfo(Loader::AppLoader& app_loader) { AddField(Telemetry::FieldType::UserConfig, "Audio_SinkId", Settings::values.sink_id); AddField(Telemetry::FieldType::UserConfig, "Audio_EnableAudioStretching", Settings::values.enable_audio_stretching); + AddField(Telemetry::FieldType::UserConfig, "Audio_EnableRealTime", + Settings::values.enable_realtime_audio); AddField(Telemetry::FieldType::UserConfig, "Core_UseCpuJit", Settings::values.use_cpu_jit); AddField(Telemetry::FieldType::UserConfig, "Renderer_ResolutionFactor", Settings::values.resolution_factor);