From e9bfd97c7fcf2fb15ba46b29847bb5ff9d979eb3 Mon Sep 17 00:00:00 2001 From: lizzie Date: Wed, 23 Sep 2026 09:25:56 +0000 Subject: [PATCH] 2026-09-23 09:25:56 Signed-off-by: lizzie --- src/audio_core/renderer/system.cpp | 22 ++++++------ src/audio_core/renderer/system.h | 4 --- src/audio_core/renderer/system_manager.cpp | 40 +++++++++------------- src/audio_core/renderer/system_manager.h | 10 ++---- 4 files changed, 28 insertions(+), 48 deletions(-) diff --git a/src/audio_core/renderer/system.cpp b/src/audio_core/renderer/system.cpp index b7675ff5de..fe619f4012 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,8 +479,7 @@ Result System::Update(std::span input, std::span performance, std: return result; } - result = info_updater.UpdateEffects(effect_context, active, memory_pool_workbuffer, - memory_pool_count); + result = info_updater.UpdateEffects(effect_context, IsActive(), memory_pool_workbuffer, memory_pool_count); if (result.IsError()) { LOG_ERROR(Service_Audio, "Failed to update Effects!"); return result; @@ -582,16 +580,16 @@ u32 System::GetRenderingDevice() const { } bool System::IsActive() const { - return active; + return state == State::Started; } void System::SendCommandToDsp() { std::scoped_lock l{lock}; - + auto& audio_renderer = core.AudioCore().ADSP().AudioRenderer(); if (initialized) { - if (active) { + if (IsActive()) { terminate_event.Reset(); - const auto remaining_command_count{audio_renderer.GetRemainCommandCount(session_id)}; + const auto remaining_command_count = audio_renderer.GetRemainCommandCount(session_id); u64 command_size{0}; if (remaining_command_count) { @@ -738,7 +736,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..8c78383ea4 100644 --- a/src/audio_core/renderer/system.h +++ b/src/audio_core/renderer/system.h @@ -219,12 +219,8 @@ 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? - std::atomic active{}; /// State of the system State state{State::Stopped}; /// Sample rate for the system diff --git a/src/audio_core/renderer/system_manager.cpp b/src/audio_core/renderer/system_manager.cpp index d2c924fdf2..dce118e3a0 100644 --- a/src/audio_core/renderer/system_manager.cpp +++ b/src/audio_core/renderer/system_manager.cpp @@ -16,22 +16,22 @@ namespace AudioCore::Renderer { SystemManager::SystemManager(Core::System& core_) - : core{core_}, audio_renderer{core.AudioCore().ADSP().AudioRenderer()} {} + : core{core_} +{} SystemManager::~SystemManager() { Stop(); } void SystemManager::InitializeUnsafe() { - if (!active) { - active = true; - audio_renderer.Start(); + if (!thread.joinable()) { + core.AudioCore().ADSP().AudioRenderer().Start(); thread = std::jthread([this](std::stop_token stop_token) { Common::SetCurrentThreadName("AudioRenderSystemManager"); - Common::SetCurrentThreadPriority(Common::ThreadPriority::High); - while (active && !stop_token.stop_requested()) { + auto& audio_renderer = core.AudioCore().ADSP().AudioRenderer(); + while (!stop_token.stop_requested()) { { - std::scoped_lock l{mutex1}; + std::scoped_lock lk{mutex}; for (auto system : systems) system->SendCommandToDsp(); } @@ -43,39 +43,31 @@ void SystemManager::InitializeUnsafe() { } void SystemManager::Stop() { - if (active) { - active = false; + if (thread.joinable()) { thread.request_stop(); thread.join(); - audio_renderer.Stop(); + core.AudioCore().ADSP().AudioRenderer().Stop(); } } bool SystemManager::Add(System& system_) { - std::scoped_lock l2{mutex2}; + std::scoped_lock lk{mutex}; if (systems.size() + 1 > MaxRendererSessions) { LOG_ERROR(Service_Audio, "Maximum AudioRenderer Systems active, cannot add more!"); return false; } - { - std::scoped_lock l{mutex1}; - if (systems.empty()) - InitializeUnsafe(); - } + if (systems.empty()) + InitializeUnsafe(); systems.push_back(&system_); return true; } bool SystemManager::Remove(System& system_) { - std::scoped_lock l2{mutex2}; - { - std::scoped_lock l{mutex1}; - if (systems.remove(&system_) == 0) { - LOG_ERROR(Service_Audio, "Failed to remove a render system, it was not found in the list!"); - return false; - } + std::scoped_lock lk{mutex}; + if (systems.remove(&system_) == 0) { + LOG_ERROR(Service_Audio, "Failed to remove a render system, it was not found in the list!"); + return false; } - if (systems.empty()) Stop(); return true; diff --git a/src/audio_core/renderer/system_manager.h b/src/audio_core/renderer/system_manager.h index ac66e033d9..38cf12d899 100644 --- a/src/audio_core/renderer/system_manager.h +++ b/src/audio_core/renderer/system_manager.h @@ -75,14 +75,8 @@ private: std::list systems{}; /// Main worker thread for generating command lists std::jthread thread; - /// Mutex for the systems - std::mutex mutex1{}; - /// Mutex for adding/removing systems - std::mutex mutex2{}; - /// Is the system manager thread active? - std::atomic active{}; - /// Reference to the ADSP's AudioRenderer for communication - ::AudioCore::ADSP::AudioRenderer::AudioRenderer& audio_renderer; + /// Mutex for the systems list + std::mutex mutex{}; }; } // namespace AudioCore::Renderer