From f307a0331d8094487e8bcab7098d7f9e59672a06 Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 23 Sep 2026 07:42:01 +0000 Subject: [PATCH] 2026-09-23 07:42:01 Signed-off-by: lizzie --- src/audio_core/renderer/system.cpp | 28 +++++++++++----------- src/audio_core/renderer/system.h | 2 -- src/audio_core/renderer/system_manager.cpp | 16 ++++++++----- src/core/hle/service/am/am.cpp | 8 ++----- 4 files changed, 26 insertions(+), 28 deletions(-) diff --git a/src/audio_core/renderer/system.cpp b/src/audio_core/renderer/system.cpp index b7675ff5de..a16671677d 100644 --- a/src/audio_core/renderer/system.cpp +++ b/src/audio_core/renderer/system.cpp @@ -100,8 +100,9 @@ u64 System::GetWorkBufferSize(const AudioRendererParameterInternal& params) { } System::System(Core::System& core_, Kernel::KEvent* adsp_rendered_event_) - : core{core_}, audio_renderer{core.AudioCore().ADSP().AudioRenderer()}, - adsp_rendered_event{adsp_rendered_event_} {} + : core{core_} + , adsp_rendered_event{adsp_rendered_event_} +{} Result System::Initialize(const AudioRendererParameterInternal& params, Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size, @@ -406,7 +407,7 @@ void System::Finalize() { return; } - if (active) { + if (IsActive()) { Stop(); } @@ -433,14 +434,12 @@ void System::Start() { std::scoped_lock l{lock}; frames_elapsed = 0; state = State::Started; - active = true; } void System::Stop() { { std::scoped_lock l{lock}; state = State::Stopped; - active = false; } if (execution_mode == ExecutionMode::Auto) { @@ -480,7 +479,7 @@ Result System::Update(std::span input, std::span performance, std: return result; } - result = info_updater.UpdateEffects(effect_context, active, memory_pool_workbuffer, + result = info_updater.UpdateEffects(effect_context, IsActive(), memory_pool_workbuffer, memory_pool_count); if (result.IsError()) { LOG_ERROR(Service_Audio, "Failed to update Effects!"); @@ -582,16 +581,16 @@ u32 System::GetRenderingDevice() const { } bool System::IsActive() const { - return active; + return state == State::Started; } void System::SendCommandToDsp() { std::scoped_lock l{lock}; if (initialized) { - if (active) { + if (IsActive()) { terminate_event.Reset(); - const auto remaining_command_count{audio_renderer.GetRemainCommandCount(session_id)}; + const auto remaining_command_count = core.AudioCore().ADSP().AudioRenderer().GetRemainCommandCount(session_id); u64 command_size{0}; if (remaining_command_count) { @@ -618,16 +617,17 @@ void System::SendCommandToDsp() { auto time_limit{ static_cast((time_limit_percent / 100) * 2'880'000.0 * (static_cast(render_time_limit_percent) / 100.0f))}; - audio_renderer.SetCommandBuffer(session_id, translated_addr, command_size, time_limit, - applet_resource_user_id, process_handle, - reset_command_buffers); + core.AudioCore().ADSP().AudioRenderer().SetCommandBuffer(session_id, + translated_addr, command_size, + time_limit, applet_resource_user_id, + process_handle, reset_command_buffers); reset_command_buffers = false; command_buffer_size = command_size; if (remaining_command_count == 0) { adsp_rendered_event->Signal(core.Kernel()); } } else { - audio_renderer.ClearRemainCommandCount(session_id); + core.AudioCore().ADSP().AudioRenderer().ClearRemainCommandCount(session_id); terminate_event.Set(); } } @@ -738,7 +738,7 @@ u64 System::GenerateCommand(std::span in_command_buffer, const auto end_time{core.CoreTiming().GetGlobalTimeNs().count()}; total_ticks_elapsed += end_time - start_time; num_command_lists_generated++; - render_start_tick = audio_renderer.GetRenderingStartTick(session_id); + render_start_tick = core.AudioCore().ADSP().AudioRenderer().GetRenderingStartTick(session_id); frames_elapsed++; return command_buffer.size; diff --git a/src/audio_core/renderer/system.h b/src/audio_core/renderer/system.h index 3533a74efd..c56bca7556 100644 --- a/src/audio_core/renderer/system.h +++ b/src/audio_core/renderer/system.h @@ -219,8 +219,6 @@ public: private: /// Core system Core::System& core; - /// Reference to the ADSP's AudioRenderer for communication - ::AudioCore::ADSP::AudioRenderer::AudioRenderer& audio_renderer; /// Is this system initialized? bool initialized{}; /// Is this system currently active? diff --git a/src/audio_core/renderer/system_manager.cpp b/src/audio_core/renderer/system_manager.cpp index 31910db465..126a2a6e20 100644 --- a/src/audio_core/renderer/system_manager.cpp +++ b/src/audio_core/renderer/system_manager.cpp @@ -12,13 +12,15 @@ #include "common/thread.h" #include "core/core.h" #include "core/hle/kernel/kernel.h" +#include "core/hle/kernel/k_scheduler.h" #include "core/core_timing.h" namespace AudioCore::Renderer { SystemManager::SystemManager(Core::System& core_) : core{core_} -{} +{ +} SystemManager::~SystemManager() { Stop(); @@ -26,9 +28,9 @@ SystemManager::~SystemManager() { void SystemManager::InitializeUnsafe() { if (!thread.joinable()) { + core.AudioCore().ADSP().AudioRenderer().Start(); thread = core.Kernel().RunOnHostCoreThread("AudioRenderSystemManager", [this]() { auto& audio_renderer = core.AudioCore().ADSP().AudioRenderer(); - audio_renderer.Start(); auto const stop_token = thread.get_stop_token(); while (!stop_token.stop_requested()) { { @@ -39,12 +41,12 @@ void SystemManager::InitializeUnsafe() { audio_renderer.Signal(); audio_renderer.Wait(stop_token); } - audio_renderer.Stop(); }); } } void SystemManager::Stop() { + core.AudioCore().ADSP().AudioRenderer().Stop(); if (thread.joinable()) { thread.request_stop(); thread.join(); @@ -57,9 +59,10 @@ bool SystemManager::Add(System& system_) { LOG_ERROR(Service_Audio, "Maximum AudioRenderer Systems active, cannot add more!"); return false; } - if (systems.empty()) - InitializeUnsafe(); systems.push_back(&system_); + if (!systems.empty()) { + InitializeUnsafe(); + } return true; } @@ -69,8 +72,9 @@ bool SystemManager::Remove(System& system_) { LOG_ERROR(Service_Audio, "Failed to remove a render system, it was not found in the list!"); return false; } - if (systems.empty()) + if (systems.empty()) { Stop(); + } return true; } diff --git a/src/core/hle/service/am/am.cpp b/src/core/hle/service/am/am.cpp index 2ef393439b..f6dac5549d 100644 --- a/src/core/hle/service/am/am.cpp +++ b/src/core/hle/service/am/am.cpp @@ -15,13 +15,9 @@ void LoopProcess(Core::System& system) { WindowSystem window_system(system); ButtonPoller button_poller(system, window_system); EventObserver event_observer(system, window_system); - auto server_manager = std::make_unique(system); - - server_manager->RegisterNamedService( - "appletAE", std::make_shared(system, window_system)); - server_manager->RegisterNamedService( - "appletOE", std::make_shared(system, window_system)); + server_manager->RegisterNamedService("appletAE", std::make_shared(system, window_system)); + server_manager->RegisterNamedService("appletOE", std::make_shared(system, window_system)); ServerManager::RunServer(std::move(server_manager)); }