Files
eden/src/audio_core/renderer/system_manager.cpp
T

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

78 lines
2.1 KiB
C++
Raw Normal View History

2025-08-06 07:48:11 +02:00
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
2022-07-16 23:48:45 +01:00
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#include <chrono>
2023-08-31 15:09:15 +01:00
#include "audio_core/adsp/adsp.h"
2022-07-16 23:48:45 +01:00
#include "audio_core/audio_core.h"
#include "audio_core/renderer/system_manager.h"
#include "common/thread.h"
#include "core/core.h"
2026-09-23 02:07:39 +00:00
#include "core/hle/kernel/kernel.h"
2022-07-16 23:48:45 +01:00
#include "core/core_timing.h"
2023-08-31 15:09:15 +01:00
namespace AudioCore::Renderer {
2022-07-16 23:48:45 +01:00
SystemManager::SystemManager(Core::System& core_)
2026-09-23 02:07:39 +00:00
: core{core_}
{}
2022-07-16 23:48:45 +01:00
SystemManager::~SystemManager() {
Stop();
}
2023-08-31 15:09:15 +01:00
void SystemManager::InitializeUnsafe() {
2026-09-23 02:07:39 +00:00
if (!thread.joinable()) {
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()) {
{
2026-09-23 02:07:39 +00:00
std::scoped_lock lk{mutex};
for (auto system : systems)
system->SendCommandToDsp();
}
audio_renderer.Signal();
2026-09-23 01:28:59 +00:00
audio_renderer.Wait(stop_token);
}
2026-09-23 02:07:39 +00:00
audio_renderer.Stop();
});
2022-07-16 23:48:45 +01:00
}
}
void SystemManager::Stop() {
2026-09-23 02:07:39 +00:00
if (thread.joinable()) {
thread.request_stop();
thread.join();
2022-07-16 23:48:45 +01:00
}
}
bool SystemManager::Add(System& system_) {
2026-09-23 02:07:39 +00:00
std::scoped_lock lk{mutex};
if (systems.size() >= MaxRendererSessions) {
2022-07-16 23:48:45 +01:00
LOG_ERROR(Service_Audio, "Maximum AudioRenderer Systems active, cannot add more!");
return false;
}
2026-09-23 02:07:39 +00:00
if (systems.empty())
InitializeUnsafe();
2022-07-16 23:48:45 +01:00
systems.push_back(&system_);
return true;
}
bool SystemManager::Remove(System& system_) {
2026-09-23 02:07:39 +00:00
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;
2022-07-16 23:48:45 +01:00
}
if (systems.empty())
2022-07-16 23:48:45 +01:00
Stop();
return true;
}
2023-08-31 15:09:15 +01:00
} // namespace AudioCore::Renderer