2026-09-23 07:42:01

Signed-off-by: lizzie <lizzie@eden-emu.dev>
This commit is contained in:
lizzie
2026-09-23 07:42:01 +00:00
parent cb85810ffd
commit f307a0331d
4 changed files with 26 additions and 28 deletions
+14 -14
View File
@@ -100,8 +100,9 @@ u64 System::GetWorkBufferSize(const AudioRendererParameterInternal& params) {
} }
System::System(Core::System& core_, Kernel::KEvent* adsp_rendered_event_) System::System(Core::System& core_, Kernel::KEvent* adsp_rendered_event_)
: core{core_}, audio_renderer{core.AudioCore().ADSP().AudioRenderer()}, : core{core_}
adsp_rendered_event{adsp_rendered_event_} {} , adsp_rendered_event{adsp_rendered_event_}
{}
Result System::Initialize(const AudioRendererParameterInternal& params, Result System::Initialize(const AudioRendererParameterInternal& params,
Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size, Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size,
@@ -406,7 +407,7 @@ void System::Finalize() {
return; return;
} }
if (active) { if (IsActive()) {
Stop(); Stop();
} }
@@ -433,14 +434,12 @@ void System::Start() {
std::scoped_lock l{lock}; std::scoped_lock l{lock};
frames_elapsed = 0; frames_elapsed = 0;
state = State::Started; state = State::Started;
active = true;
} }
void System::Stop() { void System::Stop() {
{ {
std::scoped_lock l{lock}; std::scoped_lock l{lock};
state = State::Stopped; state = State::Stopped;
active = false;
} }
if (execution_mode == ExecutionMode::Auto) { if (execution_mode == ExecutionMode::Auto) {
@@ -480,7 +479,7 @@ Result System::Update(std::span<const u8> input, std::span<u8> performance, std:
return result; 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); memory_pool_count);
if (result.IsError()) { if (result.IsError()) {
LOG_ERROR(Service_Audio, "Failed to update Effects!"); LOG_ERROR(Service_Audio, "Failed to update Effects!");
@@ -582,16 +581,16 @@ u32 System::GetRenderingDevice() const {
} }
bool System::IsActive() const { bool System::IsActive() const {
return active; return state == State::Started;
} }
void System::SendCommandToDsp() { void System::SendCommandToDsp() {
std::scoped_lock l{lock}; std::scoped_lock l{lock};
if (initialized) { if (initialized) {
if (active) { if (IsActive()) {
terminate_event.Reset(); 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}; u64 command_size{0};
if (remaining_command_count) { if (remaining_command_count) {
@@ -618,16 +617,17 @@ void System::SendCommandToDsp() {
auto time_limit{ auto time_limit{
static_cast<u64>((time_limit_percent / 100) * 2'880'000.0 * static_cast<u64>((time_limit_percent / 100) * 2'880'000.0 *
(static_cast<f32>(render_time_limit_percent) / 100.0f))}; (static_cast<f32>(render_time_limit_percent) / 100.0f))};
audio_renderer.SetCommandBuffer(session_id, translated_addr, command_size, time_limit, core.AudioCore().ADSP().AudioRenderer().SetCommandBuffer(session_id,
applet_resource_user_id, process_handle, translated_addr, command_size,
reset_command_buffers); time_limit, applet_resource_user_id,
process_handle, reset_command_buffers);
reset_command_buffers = false; reset_command_buffers = false;
command_buffer_size = command_size; command_buffer_size = command_size;
if (remaining_command_count == 0) { if (remaining_command_count == 0) {
adsp_rendered_event->Signal(core.Kernel()); adsp_rendered_event->Signal(core.Kernel());
} }
} else { } else {
audio_renderer.ClearRemainCommandCount(session_id); core.AudioCore().ADSP().AudioRenderer().ClearRemainCommandCount(session_id);
terminate_event.Set(); terminate_event.Set();
} }
} }
@@ -738,7 +738,7 @@ u64 System::GenerateCommand(std::span<u8> in_command_buffer,
const auto end_time{core.CoreTiming().GetGlobalTimeNs().count()}; const auto end_time{core.CoreTiming().GetGlobalTimeNs().count()};
total_ticks_elapsed += end_time - start_time; total_ticks_elapsed += end_time - start_time;
num_command_lists_generated++; num_command_lists_generated++;
render_start_tick = audio_renderer.GetRenderingStartTick(session_id); render_start_tick = core.AudioCore().ADSP().AudioRenderer().GetRenderingStartTick(session_id);
frames_elapsed++; frames_elapsed++;
return command_buffer.size; return command_buffer.size;
-2
View File
@@ -219,8 +219,6 @@ public:
private: private:
/// Core system /// Core system
Core::System& core; Core::System& core;
/// Reference to the ADSP's AudioRenderer for communication
::AudioCore::ADSP::AudioRenderer::AudioRenderer& audio_renderer;
/// Is this system initialized? /// Is this system initialized?
bool initialized{}; bool initialized{};
/// Is this system currently active? /// Is this system currently active?
+10 -6
View File
@@ -12,13 +12,15 @@
#include "common/thread.h" #include "common/thread.h"
#include "core/core.h" #include "core/core.h"
#include "core/hle/kernel/kernel.h" #include "core/hle/kernel/kernel.h"
#include "core/hle/kernel/k_scheduler.h"
#include "core/core_timing.h" #include "core/core_timing.h"
namespace AudioCore::Renderer { namespace AudioCore::Renderer {
SystemManager::SystemManager(Core::System& core_) SystemManager::SystemManager(Core::System& core_)
: core{core_} : core{core_}
{} {
}
SystemManager::~SystemManager() { SystemManager::~SystemManager() {
Stop(); Stop();
@@ -26,9 +28,9 @@ SystemManager::~SystemManager() {
void SystemManager::InitializeUnsafe() { void SystemManager::InitializeUnsafe() {
if (!thread.joinable()) { if (!thread.joinable()) {
core.AudioCore().ADSP().AudioRenderer().Start();
thread = core.Kernel().RunOnHostCoreThread("AudioRenderSystemManager", [this]() { thread = core.Kernel().RunOnHostCoreThread("AudioRenderSystemManager", [this]() {
auto& audio_renderer = core.AudioCore().ADSP().AudioRenderer(); auto& audio_renderer = core.AudioCore().ADSP().AudioRenderer();
audio_renderer.Start();
auto const stop_token = thread.get_stop_token(); auto const stop_token = thread.get_stop_token();
while (!stop_token.stop_requested()) { while (!stop_token.stop_requested()) {
{ {
@@ -39,12 +41,12 @@ void SystemManager::InitializeUnsafe() {
audio_renderer.Signal(); audio_renderer.Signal();
audio_renderer.Wait(stop_token); audio_renderer.Wait(stop_token);
} }
audio_renderer.Stop();
}); });
} }
} }
void SystemManager::Stop() { void SystemManager::Stop() {
core.AudioCore().ADSP().AudioRenderer().Stop();
if (thread.joinable()) { if (thread.joinable()) {
thread.request_stop(); thread.request_stop();
thread.join(); thread.join();
@@ -57,9 +59,10 @@ bool SystemManager::Add(System& system_) {
LOG_ERROR(Service_Audio, "Maximum AudioRenderer Systems active, cannot add more!"); LOG_ERROR(Service_Audio, "Maximum AudioRenderer Systems active, cannot add more!");
return false; return false;
} }
if (systems.empty())
InitializeUnsafe();
systems.push_back(&system_); systems.push_back(&system_);
if (!systems.empty()) {
InitializeUnsafe();
}
return true; 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!"); LOG_ERROR(Service_Audio, "Failed to remove a render system, it was not found in the list!");
return false; return false;
} }
if (systems.empty()) if (systems.empty()) {
Stop(); Stop();
}
return true; return true;
} }
+2 -6
View File
@@ -15,13 +15,9 @@ void LoopProcess(Core::System& system) {
WindowSystem window_system(system); WindowSystem window_system(system);
ButtonPoller button_poller(system, window_system); ButtonPoller button_poller(system, window_system);
EventObserver event_observer(system, window_system); EventObserver event_observer(system, window_system);
auto server_manager = std::make_unique<ServerManager>(system); auto server_manager = std::make_unique<ServerManager>(system);
server_manager->RegisterNamedService("appletAE", std::make_shared<IAllSystemAppletProxiesService>(system, window_system));
server_manager->RegisterNamedService( server_manager->RegisterNamedService("appletOE", std::make_shared<IApplicationProxyService>(system, window_system));
"appletAE", std::make_shared<IAllSystemAppletProxiesService>(system, window_system));
server_manager->RegisterNamedService(
"appletOE", std::make_shared<IApplicationProxyService>(system, window_system));
ServerManager::RunServer(std::move(server_manager)); ServerManager::RunServer(std::move(server_manager));
} }