From b8c6085e5ab02a497b7bb5401acf0c8bf355dc4c Mon Sep 17 00:00:00 2001 From: lizzie Date: Mon, 29 Jun 2026 04:12:57 +0000 Subject: [PATCH] [audio_core] remove dangling Core::System& references Signed-off-by: lizzie --- src/audio_core/audio_core.cpp | 2 +- src/audio_core/audio_in_manager.cpp | 27 +++++------- src/audio_core/audio_in_manager.h | 21 +++++---- src/audio_core/audio_manager.cpp | 6 +-- src/audio_core/audio_manager.h | 9 ++-- src/audio_core/audio_out_manager.cpp | 25 +++++------ src/audio_core/audio_out_manager.h | 23 ++++------ src/audio_core/audio_render_manager.cpp | 11 +++-- src/audio_core/audio_render_manager.h | 9 ++-- src/audio_core/in/audio_in.cpp | 44 ++++++++++--------- src/audio_core/in/audio_in.h | 7 ++- src/audio_core/out/audio_out.cpp | 44 ++++++++++--------- src/audio_core/out/audio_out.h | 7 ++- src/audio_core/renderer/audio_renderer.cpp | 41 ++++++++--------- src/audio_core/renderer/audio_renderer.h | 7 ++- src/audio_core/renderer/system.cpp | 2 +- src/core/hle/service/audio/audio_in.cpp | 2 +- .../hle/service/audio/audio_in_manager.cpp | 9 ++-- src/core/hle/service/audio/audio_out.cpp | 2 +- .../hle/service/audio/audio_out_manager.cpp | 4 +- 20 files changed, 155 insertions(+), 147 deletions(-) diff --git a/src/audio_core/audio_core.cpp b/src/audio_core/audio_core.cpp index 234c831ac0..e897fdea9b 100644 --- a/src/audio_core/audio_core.cpp +++ b/src/audio_core/audio_core.cpp @@ -12,7 +12,7 @@ namespace AudioCore { AudioCore::AudioCore(Core::System& system) { - audio_manager.emplace(); + audio_manager.emplace(system); CreateSinks(); // Must be created after the sinks adsp.emplace(system, *output_sink); diff --git a/src/audio_core/audio_in_manager.cpp b/src/audio_core/audio_in_manager.cpp index 6b528e9db0..52caae654d 100644 --- a/src/audio_core/audio_in_manager.cpp +++ b/src/audio_core/audio_in_manager.cpp @@ -15,12 +15,12 @@ namespace AudioCore::AudioIn { -Manager::Manager(Core::System& system_) : system{system_} { +Manager::Manager(Core::System& system) { std::iota(session_ids.begin(), session_ids.end(), 0); num_free_sessions = MaxInSessions; } -Result Manager::AcquireSessionId(size_t& session_id) { +Result Manager::AcquireSessionId(Core::System& system, size_t& session_id) { if (num_free_sessions == 0) { LOG_ERROR(Service_Audio, "All 4 AudioIn sessions are in use, cannot create any more"); return Service::Audio::ResultOutOfSessions; @@ -31,7 +31,7 @@ Result Manager::AcquireSessionId(size_t& session_id) { return ResultSuccess; } -void Manager::ReleaseSessionId(const size_t session_id) { +void Manager::ReleaseSessionId(Core::System& system, const size_t session_id) { std::scoped_lock l{mutex}; LOG_DEBUG(Service_Audio, "Freeing AudioIn session {}", session_id); session_ids[free_session_id] = session_id; @@ -41,21 +41,20 @@ void Manager::ReleaseSessionId(const size_t session_id) { applet_resource_user_ids[session_id] = 0; } -Result Manager::LinkToManager() { +Result Manager::LinkToManager(Core::System& system) { std::scoped_lock l{mutex}; if (!linked_to_manager) { - system.AudioCore().GetAudioManager().SetInManager(std::bind(&Manager::BufferReleaseAndRegister, this)); + system.AudioCore().GetAudioManager().SetInManager(&Manager::BufferReleaseAndRegister); linked_to_manager = true; } return ResultSuccess; } -void Manager::Start() { +void Manager::Start(Core::System& system) { if (sessions_started) { return; } - std::scoped_lock l{mutex}; for (auto& session : sessions) { if (session) { @@ -66,21 +65,19 @@ void Manager::Start() { sessions_started = true; } -void Manager::BufferReleaseAndRegister() { - std::scoped_lock l{mutex}; - for (auto& session : sessions) { +void Manager::BufferReleaseAndRegister(void *data, Core::System& system) noexcept { + Manager* this_ = (Manager*)data; + std::scoped_lock l{this_->mutex}; + for (auto& session : this_->sessions) { if (session != nullptr) { session->ReleaseAndRegisterBuffers(); } } } -u32 Manager::GetDeviceNames(std::span names, - [[maybe_unused]] const bool filter) { +u32 Manager::GetDeviceNames(Core::System& system, std::span names, [[maybe_unused]] const bool filter) { std::scoped_lock l{mutex}; - - LinkToManager(); - + LinkToManager(system); auto input_devices{Sink::GetDeviceListForSink(Settings::values.sink_id.GetValue(), true)}; if (!input_devices.empty() && !names.empty()) { names[0] = Renderer::AudioDevice::AudioDeviceName("Uac"); diff --git a/src/audio_core/audio_in_manager.h b/src/audio_core/audio_in_manager.h index 2179990e0d..bbb1f347dd 100644 --- a/src/audio_core/audio_in_manager.h +++ b/src/audio_core/audio_in_manager.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -30,31 +33,29 @@ public: * @param session_id - Output session_id. * @return Result code. */ - Result AcquireSessionId(size_t& session_id); + Result AcquireSessionId(Core::System& system, size_t& session_id); /** * Release a session id on close. * * @param session_id - Session id to free. */ - void ReleaseSessionId(size_t session_id); + void ReleaseSessionId(Core::System& system, const size_t session_id); /** * Link the audio in manager to the main audio manager. * * @return Result code. */ - Result LinkToManager(); + Result LinkToManager(Core::System& system); /** * Start the audio in manager. */ - void Start(); + void Start(Core::System& system); - /** - * Callback function, called by the audio manager when the audio in event is signalled. - */ - void BufferReleaseAndRegister(); + /// @brief Callback function, called by the audio manager when the audio in event is signalled. + static void BufferReleaseAndRegister(void *data, Core::System& system) noexcept; /** * Get a list of audio in device names. @@ -64,10 +65,8 @@ public: * * @return Number of names written. */ - u32 GetDeviceNames(std::span names, bool filter); + u32 GetDeviceNames(Core::System& system, std::span names, bool filter); - /// Core system - Core::System& system; /// Array of session ids std::array session_ids{}; /// Array of resource user ids diff --git a/src/audio_core/audio_manager.cpp b/src/audio_core/audio_manager.cpp index 93142a53fb..f64943ef7b 100644 --- a/src/audio_core/audio_manager.cpp +++ b/src/audio_core/audio_manager.cpp @@ -11,8 +11,8 @@ namespace AudioCore { -AudioManager::AudioManager() { - thread = std::jthread([this](std::stop_token stop_token) { +AudioManager::AudioManager(Core::System& system) { + thread = std::jthread([&](std::stop_token stop_token) { Common::SetCurrentThreadName("AudioManager"); std::unique_lock l{events.GetAudioEventLock()}; events.ClearEvents(); @@ -25,7 +25,7 @@ AudioManager::AudioManager() { const auto event_type = Event::Type(i); if (events.CheckAudioEventSet(event_type) || timed_out) { if (buffer_events[i]) { - buffer_events[i](); + buffer_events[i](this, system); } } events.SetAudioEvent(event_type, false); diff --git a/src/audio_core/audio_manager.h b/src/audio_core/audio_manager.h index 0194aa16db..6a7fdb230e 100644 --- a/src/audio_core/audio_manager.h +++ b/src/audio_core/audio_manager.h @@ -16,6 +16,10 @@ #include "audio_core/audio_event.h" +namespace Core { +class System; +} + union Result; namespace AudioCore { @@ -34,10 +38,9 @@ namespace AudioCore { * This is only used by audio in and audio out. */ class AudioManager { - using BufferEventFunc = std::function; - + using BufferEventFunc = void (*)(void *data, Core::System& system) noexcept; public: - explicit AudioManager(); + explicit AudioManager(Core::System& system); /** * Shutdown the audio manager. diff --git a/src/audio_core/audio_out_manager.cpp b/src/audio_core/audio_out_manager.cpp index 569df8d1e0..138d3d80ec 100644 --- a/src/audio_core/audio_out_manager.cpp +++ b/src/audio_core/audio_out_manager.cpp @@ -14,12 +14,12 @@ namespace AudioCore::AudioOut { -Manager::Manager(Core::System& system_) : system{system_} { +Manager::Manager(Core::System& system) { std::iota(session_ids.begin(), session_ids.end(), 0); num_free_sessions = MaxOutSessions; } -Result Manager::AcquireSessionId(size_t& session_id) { +Result Manager::AcquireSessionId(Core::System& system, size_t& session_id) { if (num_free_sessions == 0) { LOG_ERROR(Service_Audio, "All 12 Audio Out sessions are in use, cannot create any more"); return Service::Audio::ResultOutOfSessions; @@ -30,7 +30,7 @@ Result Manager::AcquireSessionId(size_t& session_id) { return ResultSuccess; } -void Manager::ReleaseSessionId(const size_t session_id) { +void Manager::ReleaseSessionId(Core::System& system, const size_t session_id) { std::scoped_lock l{mutex}; LOG_DEBUG(Service_Audio, "Freeing AudioOut session {}", session_id); session_ids[free_session_id] = session_id; @@ -40,17 +40,17 @@ void Manager::ReleaseSessionId(const size_t session_id) { applet_resource_user_ids[session_id] = 0; } -Result Manager::LinkToManager() { +Result Manager::LinkToManager(Core::System& system) { std::scoped_lock l{mutex}; if (!linked_to_manager) { - system.AudioCore().GetAudioManager().SetOutManager(std::bind(&Manager::BufferReleaseAndRegister, this)); + system.AudioCore().GetAudioManager().SetOutManager(&Manager::BufferReleaseAndRegister); linked_to_manager = true; } return ResultSuccess; } -void Manager::Start() { +void Manager::Start(Core::System& system) { if (sessions_started) { return; } @@ -65,19 +65,14 @@ void Manager::Start() { sessions_started = true; } -void Manager::BufferReleaseAndRegister() { - std::scoped_lock l{mutex}; - for (auto& session : sessions) { +void Manager::BufferReleaseAndRegister(void *data, Core::System& system) noexcept { + Manager* this_ = (Manager*)data; + std::scoped_lock l{this_->mutex}; + for (auto& session : this_->sessions) { if (session != nullptr) { session->ReleaseAndRegisterBuffers(); } } } -u32 Manager::GetAudioOutDeviceNames( - std::vector& names) const { - names.emplace_back("DeviceOut"); - return 1; -} - } // namespace AudioCore::AudioOut diff --git a/src/audio_core/audio_out_manager.h b/src/audio_core/audio_out_manager.h index c3e445d5d3..b51b374e89 100644 --- a/src/audio_core/audio_out_manager.h +++ b/src/audio_core/audio_out_manager.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -29,42 +32,32 @@ public: * @param session_id - Output session_id. * @return Result code. */ - Result AcquireSessionId(size_t& session_id); + Result AcquireSessionId(Core::System& system, size_t& session_id); /** * Release a session id on close. * * @param session_id - Session id to free. */ - void ReleaseSessionId(size_t session_id); + void ReleaseSessionId(Core::System& system, const size_t session_id); /** * Link this manager to the main audio manager. * * @return Result code. */ - Result LinkToManager(); + Result LinkToManager(Core::System& system); /** * Start the audio out manager. */ - void Start(); + void Start(Core::System& system); /** * Callback function, called by the audio manager when the audio out event is signalled. */ - void BufferReleaseAndRegister(); - - /** - * Get a list of audio out device names. - * - * @param names - Output container to write names to. - * @return Number of names written. - */ - u32 GetAudioOutDeviceNames(std::vector& names) const; + static void BufferReleaseAndRegister(void* data, Core::System& system) noexcept; - /// Core system - Core::System& system; /// Array of session ids std::array session_ids{}; /// Array of resource user ids diff --git a/src/audio_core/audio_render_manager.cpp b/src/audio_core/audio_render_manager.cpp index 3c53e3afde..5178ae93f6 100644 --- a/src/audio_core/audio_render_manager.cpp +++ b/src/audio_core/audio_render_manager.cpp @@ -1,15 +1,20 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include "audio_core/audio_render_manager.h" #include "audio_core/common/audio_renderer_parameter.h" +#include "audio_core/renderer/system_manager.h" #include "audio_core/common/feature_support.h" #include "core/core.h" namespace AudioCore::Renderer { Manager::Manager(Core::System& system_) - : system{system_}, system_manager{std::make_unique(system)} { + : system_manager{std::make_unique(system_)} +{ std::iota(session_ids.begin(), session_ids.end(), 0); } @@ -59,11 +64,11 @@ u32 Manager::GetSessionCount() const { return session_count; } -bool Manager::AddSystem(System& system_) { +bool Manager::AddSystem(Renderer::System& system_) { return system_manager->Add(system_); } -bool Manager::RemoveSystem(System& system_) { +bool Manager::RemoveSystem(Renderer::System& system_) { return system_manager->Remove(system_); } diff --git a/src/audio_core/audio_render_manager.h b/src/audio_core/audio_render_manager.h index 45537b2704..6fbfa53a42 100644 --- a/src/audio_core/audio_render_manager.h +++ b/src/audio_core/audio_render_manager.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -71,7 +74,7 @@ public: * @param system - The system to add. * @return True if the system was successfully added, otherwise false. */ - bool AddSystem(System& system); + bool AddSystem(Renderer::System& system); /** * Remove a renderer system from the manager. @@ -79,7 +82,7 @@ public: * @param system - The system to remove. * @return True if the system was successfully removed, otherwise false. */ - bool RemoveSystem(System& system); + bool RemoveSystem(Renderer::System& system); /** * Free a session id when the system wants to shut down. @@ -89,8 +92,6 @@ public: void ReleaseSessionId(s32 session_id); private: - /// Core system - Core::System& system; /// Session ids, -1 when in use std::array session_ids{}; /// Number of active renderers diff --git a/src/audio_core/in/audio_in.cpp b/src/audio_core/in/audio_in.cpp index df8c44d1f2..d0fb9ba71f 100644 --- a/src/audio_core/in/audio_in.cpp +++ b/src/audio_core/in/audio_in.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -8,42 +11,43 @@ namespace AudioCore::AudioIn { In::In(Core::System& system_, Manager& manager_, Kernel::KEvent* event_, size_t session_id_) - : manager{manager_}, parent_mutex{manager.mutex}, event{event_}, system{system_, event, - session_id_} {} + : manager{manager_}, parent_mutex{manager.mutex}, event{event_} + , audio_system{system_, event, session_id_} +{} -void In::Free() { +void In::Free(Core::System& system) { std::scoped_lock l{parent_mutex}; - manager.ReleaseSessionId(system.GetSessionId()); + manager.ReleaseSessionId(system, audio_system.GetSessionId()); } System& In::GetSystem() { - return system; + return audio_system; } AudioIn::State In::GetState() { std::scoped_lock l{parent_mutex}; - return system.GetState(); + return audio_system.GetState(); } Result In::StartSystem() { std::scoped_lock l{parent_mutex}; - return system.Start(); + return audio_system.Start(); } void In::StartSession() { std::scoped_lock l{parent_mutex}; - system.StartSession(); + audio_system.StartSession(); } Result In::StopSystem() { std::scoped_lock l{parent_mutex}; - return system.Stop(); + return audio_system.Stop(); } Result In::AppendBuffer(const AudioInBuffer& buffer, u64 tag) { std::scoped_lock l{parent_mutex}; - if (system.AppendBuffer(buffer, tag)) { + if (audio_system.AppendBuffer(buffer, tag)) { return ResultSuccess; } return Service::Audio::ResultBufferCountReached; @@ -51,20 +55,20 @@ Result In::AppendBuffer(const AudioInBuffer& buffer, u64 tag) { void In::ReleaseAndRegisterBuffers() { std::scoped_lock l{parent_mutex}; - if (system.GetState() == State::Started) { - system.ReleaseBuffers(); - system.RegisterBuffers(); + if (audio_system.GetState() == State::Started) { + audio_system.ReleaseBuffers(); + audio_system.RegisterBuffers(); } } bool In::FlushAudioInBuffers() { std::scoped_lock l{parent_mutex}; - return system.FlushAudioInBuffers(); + return audio_system.FlushAudioInBuffers(); } u32 In::GetReleasedBuffers(std::span tags) { std::scoped_lock l{parent_mutex}; - return system.GetReleasedBuffers(tags); + return audio_system.GetReleasedBuffers(tags); } Kernel::KReadableEvent& In::GetBufferEvent() { @@ -74,27 +78,27 @@ Kernel::KReadableEvent& In::GetBufferEvent() { f32 In::GetVolume() const { std::scoped_lock l{parent_mutex}; - return system.GetVolume(); + return audio_system.GetVolume(); } void In::SetVolume(f32 volume) { std::scoped_lock l{parent_mutex}; - system.SetVolume(volume); + audio_system.SetVolume(volume); } bool In::ContainsAudioBuffer(u64 tag) const { std::scoped_lock l{parent_mutex}; - return system.ContainsAudioBuffer(tag); + return audio_system.ContainsAudioBuffer(tag); } u32 In::GetBufferCount() const { std::scoped_lock l{parent_mutex}; - return system.GetBufferCount(); + return audio_system.GetBufferCount(); } u64 In::GetPlayedSampleCount() const { std::scoped_lock l{parent_mutex}; - return system.GetPlayedSampleCount(); + return audio_system.GetPlayedSampleCount(); } } // namespace AudioCore::AudioIn diff --git a/src/audio_core/in/audio_in.h b/src/audio_core/in/audio_in.h index 092ab72369..b2c0bc0d1f 100644 --- a/src/audio_core/in/audio_in.h +++ b/src/audio_core/in/audio_in.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -30,7 +33,7 @@ public: /** * Free this audio in from the audio in manager. */ - void Free(); + void Free(Core::System& system); /** * Get this audio in's system. @@ -141,7 +144,7 @@ private: /// Buffer event, signalled when buffers are ready to be released Kernel::KEvent* event; /// Main audio in system - System system; + System audio_system; }; } // namespace AudioCore::AudioIn diff --git a/src/audio_core/out/audio_out.cpp b/src/audio_core/out/audio_out.cpp index b7ea134055..4eca221388 100644 --- a/src/audio_core/out/audio_out.cpp +++ b/src/audio_core/out/audio_out.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -8,42 +11,43 @@ namespace AudioCore::AudioOut { Out::Out(Core::System& system_, Manager& manager_, Kernel::KEvent* event_, size_t session_id_) - : manager{manager_}, parent_mutex{manager.mutex}, event{event_}, system{system_, event, - session_id_} {} + : manager{manager_}, parent_mutex{manager.mutex}, event{event_} + , audio_system{system_, event, session_id_} +{} -void Out::Free() { +void Out::Free(Core::System& system) { std::scoped_lock l{parent_mutex}; - manager.ReleaseSessionId(system.GetSessionId()); + manager.ReleaseSessionId(system, audio_system.GetSessionId()); } System& Out::GetSystem() { - return system; + return audio_system; } AudioOut::State Out::GetState() { std::scoped_lock l{parent_mutex}; - return system.GetState(); + return audio_system.GetState(); } Result Out::StartSystem() { std::scoped_lock l{parent_mutex}; - return system.Start(); + return audio_system.Start(); } void Out::StartSession() { std::scoped_lock l{parent_mutex}; - system.StartSession(); + audio_system.StartSession(); } Result Out::StopSystem() { std::scoped_lock l{parent_mutex}; - return system.Stop(); + return audio_system.Stop(); } Result Out::AppendBuffer(const AudioOutBuffer& buffer, const u64 tag) { std::scoped_lock l{parent_mutex}; - if (system.AppendBuffer(buffer, tag)) { + if (audio_system.AppendBuffer(buffer, tag)) { return ResultSuccess; } return Service::Audio::ResultBufferCountReached; @@ -51,20 +55,20 @@ Result Out::AppendBuffer(const AudioOutBuffer& buffer, const u64 tag) { void Out::ReleaseAndRegisterBuffers() { std::scoped_lock l{parent_mutex}; - if (system.GetState() == State::Started) { - system.ReleaseBuffers(); - system.RegisterBuffers(); + if (audio_system.GetState() == State::Started) { + audio_system.ReleaseBuffers(); + audio_system.RegisterBuffers(); } } bool Out::FlushAudioOutBuffers() { std::scoped_lock l{parent_mutex}; - return system.FlushAudioOutBuffers(); + return audio_system.FlushAudioOutBuffers(); } u32 Out::GetReleasedBuffers(std::span tags) { std::scoped_lock l{parent_mutex}; - return system.GetReleasedBuffers(tags); + return audio_system.GetReleasedBuffers(tags); } Kernel::KReadableEvent& Out::GetBufferEvent() { @@ -74,27 +78,27 @@ Kernel::KReadableEvent& Out::GetBufferEvent() { f32 Out::GetVolume() const { std::scoped_lock l{parent_mutex}; - return system.GetVolume(); + return audio_system.GetVolume(); } void Out::SetVolume(const f32 volume) { std::scoped_lock l{parent_mutex}; - system.SetVolume(volume); + audio_system.SetVolume(volume); } bool Out::ContainsAudioBuffer(const u64 tag) const { std::scoped_lock l{parent_mutex}; - return system.ContainsAudioBuffer(tag); + return audio_system.ContainsAudioBuffer(tag); } u32 Out::GetBufferCount() const { std::scoped_lock l{parent_mutex}; - return system.GetBufferCount(); + return audio_system.GetBufferCount(); } u64 Out::GetPlayedSampleCount() const { std::scoped_lock l{parent_mutex}; - return system.GetPlayedSampleCount(); + return audio_system.GetPlayedSampleCount(); } } // namespace AudioCore::AudioOut diff --git a/src/audio_core/out/audio_out.h b/src/audio_core/out/audio_out.h index 946f345c61..722a595b60 100644 --- a/src/audio_core/out/audio_out.h +++ b/src/audio_core/out/audio_out.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -30,7 +33,7 @@ public: /** * Free this audio out from the audio out manager. */ - void Free(); + void Free(Core::System& system); /** * Get this audio out's system. @@ -141,7 +144,7 @@ private: /// Buffer event, signalled when buffers are ready to be released Kernel::KEvent* event; /// Main audio out system - System system; + System audio_system; }; } // namespace AudioCore::AudioOut diff --git a/src/audio_core/renderer/audio_renderer.cpp b/src/audio_core/renderer/audio_renderer.cpp index 7c728cb862..e5c541f5de 100644 --- a/src/audio_core/renderer/audio_renderer.cpp +++ b/src/audio_core/renderer/audio_renderer.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -13,56 +16,48 @@ namespace AudioCore::Renderer { Renderer::Renderer(Core::System& system_, Manager& manager_, Kernel::KEvent* rendered_event) - : core{system_}, manager{manager_}, system{system_, rendered_event} {} + : system{system_}, manager{manager_} + , audio_system{system_, rendered_event} +{} -Result Renderer::Initialize(const AudioRendererParameterInternal& params, - Kernel::KTransferMemory* transfer_memory, - const u64 transfer_memory_size, Kernel::KProcess* process_handle, - const u64 applet_resource_user_id, const s32 session_id) { +Result Renderer::Initialize(const AudioRendererParameterInternal& params, Kernel::KTransferMemory* transfer_memory, const u64 transfer_memory_size, Kernel::KProcess* process_handle, const u64 applet_resource_user_id, const s32 session_id) { if (params.execution_mode == ExecutionMode::Auto) { - if (!manager.AddSystem(system)) { - LOG_ERROR(Service_Audio, - "Both Audio Render sessions are in use, cannot create any more"); + if (!manager.AddSystem(audio_system)) { + LOG_ERROR(Service_Audio, "Both Audio Render sessions are in use, cannot create any more"); return Service::Audio::ResultOutOfSessions; } system_registered = true; } initialized = true; - system.Initialize(params, transfer_memory, transfer_memory_size, process_handle, - applet_resource_user_id, session_id); - + audio_system.Initialize(params, transfer_memory, transfer_memory_size, process_handle, applet_resource_user_id, session_id); return ResultSuccess; } void Renderer::Finalize() { - auto session_id{system.GetSessionId()}; - - system.Finalize(); - + auto const session_id{audio_system.GetSessionId()}; + audio_system.Finalize(); if (system_registered) { - manager.RemoveSystem(system); + manager.RemoveSystem(audio_system); system_registered = false; } - manager.ReleaseSessionId(session_id); } System& Renderer::GetSystem() { - return system; + return audio_system; } void Renderer::Start() { - system.Start(); + audio_system.Start(); } void Renderer::Stop() { - system.Stop(); + audio_system.Stop(); } -Result Renderer::RequestUpdate(std::span input, std::span performance, - std::span output) { - return system.Update(input, performance, output); +Result Renderer::RequestUpdate(std::span input, std::span performance, std::span output) { + return audio_system.Update(input, performance, output); } } // namespace AudioCore::Renderer diff --git a/src/audio_core/renderer/audio_renderer.h b/src/audio_core/renderer/audio_renderer.h index f16adeda78..abac8dfe1b 100644 --- a/src/audio_core/renderer/audio_renderer.h +++ b/src/audio_core/renderer/audio_renderer.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -84,7 +87,7 @@ public: private: /// System core - Core::System& core; + Core::System& system; /// Manager this renderer is registered with Manager& manager; /// Is the audio renderer initialized? @@ -92,7 +95,7 @@ private: /// Is the system registered with the manager? bool system_registered{}; /// Audio render system, main driver of audio rendering - System system; + System audio_system; }; } // namespace Renderer diff --git a/src/audio_core/renderer/system.cpp b/src/audio_core/renderer/system.cpp index b7675ff5de..3efe45d9d9 100644 --- a/src/audio_core/renderer/system.cpp +++ b/src/audio_core/renderer/system.cpp @@ -145,7 +145,7 @@ Result System::Initialize(const AudioRendererParameterInternal& params, PoolMapper pool_mapper(process_handle, false); pool_mapper.InitializeSystemPool(memory_pool_info, workbuffer.get(), workbuffer_size); - WorkbufferAllocator allocator({workbuffer.get(), workbuffer_size}, workbuffer_size); + WorkbufferAllocator allocator({workbuffer.get(), workbuffer_size}); samples_workbuffer = allocator.Allocate((voice_channels + mix_buffer_count) * sample_count, 0x10); diff --git a/src/core/hle/service/audio/audio_in.cpp b/src/core/hle/service/audio/audio_in.cpp index 6208c2d104..d89ccdbc54 100644 --- a/src/core/hle/service/audio/audio_in.cpp +++ b/src/core/hle/service/audio/audio_in.cpp @@ -50,7 +50,7 @@ IAudioIn::IAudioIn(Core::System& system_, Manager& manager, size_t session_id, } IAudioIn::~IAudioIn() { - impl->Free(); + impl->Free(system); service_context.CloseEvent(event); process->Close(system.Kernel()); } diff --git a/src/core/hle/service/audio/audio_in_manager.cpp b/src/core/hle/service/audio/audio_in_manager.cpp index 2675a57735..efa02a6458 100644 --- a/src/core/hle/service/audio/audio_in_manager.cpp +++ b/src/core/hle/service/audio/audio_in_manager.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later @@ -65,7 +68,7 @@ Result IAudioInManager::OpenAudioInAuto( Result IAudioInManager::ListAudioInsAutoFiltered( OutArray out_audio_ins, Out out_count) { LOG_DEBUG(Service_Audio, "called"); - *out_count = impl->GetDeviceNames(out_audio_ins, true); + *out_count = impl->GetDeviceNames(system, out_audio_ins, true); R_SUCCEED(); } @@ -90,8 +93,8 @@ Result IAudioInManager::OpenAudioInProtocolSpecified( size_t new_session_id{}; - R_TRY(impl->LinkToManager()); - R_TRY(impl->AcquireSessionId(new_session_id)); + R_TRY(impl->LinkToManager(system)); + R_TRY(impl->AcquireSessionId(system, new_session_id)); LOG_DEBUG(Service_Audio, "Opening new AudioIn, session_id={}, free sessions={}", new_session_id, impl->num_free_sessions); diff --git a/src/core/hle/service/audio/audio_out.cpp b/src/core/hle/service/audio/audio_out.cpp index 996eeede58..0cef3bb038 100644 --- a/src/core/hle/service/audio/audio_out.cpp +++ b/src/core/hle/service/audio/audio_out.cpp @@ -46,7 +46,7 @@ IAudioOut::IAudioOut(Core::System& system_, Manager& manager, size_t session_id, } IAudioOut::~IAudioOut() { - impl->Free(); + impl->Free(system); service_context.CloseEvent(event); process->Close(system.Kernel()); } diff --git a/src/core/hle/service/audio/audio_out_manager.cpp b/src/core/hle/service/audio/audio_out_manager.cpp index 3b2087932c..463ffd7ea4 100644 --- a/src/core/hle/service/audio/audio_out_manager.cpp +++ b/src/core/hle/service/audio/audio_out_manager.cpp @@ -77,8 +77,8 @@ Result IAudioOutManager::OpenAudioOutAuto( } size_t new_session_id{}; - R_TRY(impl->LinkToManager()); - R_TRY(impl->AcquireSessionId(new_session_id)); + R_TRY(impl->LinkToManager(system)); + R_TRY(impl->AcquireSessionId(system, new_session_id)); const auto device_name = Common::StringFromBuffer(name[0].name); LOG_DEBUG(Service_Audio, "Opening new AudioOut, sessionid={}, free sessions={}", new_session_id,