mirror of
https://github.com/yuzu-emu/yuzu-android.git
synced 2025-06-12 10:17:56 -05:00
audio: rewrite IAudioRendererManager
This commit is contained in:
@ -10,11 +10,12 @@ using namespace AudioCore::Renderer;
|
||||
IAudioRenderer::IAudioRenderer(Core::System& system_, Manager& manager_,
|
||||
AudioCore::AudioRendererParameterInternal& params,
|
||||
Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size,
|
||||
u32 process_handle, Kernel::KProcess& process_,
|
||||
u64 applet_resource_user_id, s32 session_id)
|
||||
Kernel::KProcess* process_handle_, u64 applet_resource_user_id,
|
||||
s32 session_id)
|
||||
: ServiceFramework{system_, "IAudioRenderer"}, service_context{system_, "IAudioRenderer"},
|
||||
rendered_event{service_context.CreateEvent("IAudioRendererEvent")}, manager{manager_},
|
||||
impl{std::make_unique<Renderer>(system_, manager, rendered_event)}, process{process_} {
|
||||
impl{std::make_unique<Renderer>(system_, manager, rendered_event)},
|
||||
process_handle{process_handle_} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, &IAudioRenderer::GetSampleRate, "GetSampleRate"},
|
||||
@ -35,15 +36,15 @@ IAudioRenderer::IAudioRenderer(Core::System& system_, Manager& manager_,
|
||||
// clang-format on
|
||||
RegisterHandlers(functions);
|
||||
|
||||
process.Open();
|
||||
impl->Initialize(params, transfer_memory, transfer_memory_size, process_handle, process,
|
||||
process_handle->Open();
|
||||
impl->Initialize(params, transfer_memory, transfer_memory_size, process_handle,
|
||||
applet_resource_user_id, session_id);
|
||||
}
|
||||
|
||||
IAudioRenderer::~IAudioRenderer() {
|
||||
impl->Finalize();
|
||||
service_context.CloseEvent(rendered_event);
|
||||
process.Close();
|
||||
process_handle->Close();
|
||||
}
|
||||
|
||||
void IAudioRenderer::GetSampleRate(HLERequestContext& ctx) {
|
||||
|
@ -14,8 +14,8 @@ public:
|
||||
explicit IAudioRenderer(Core::System& system_, AudioCore::Renderer::Manager& manager_,
|
||||
AudioCore::AudioRendererParameterInternal& params,
|
||||
Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size,
|
||||
u32 process_handle, Kernel::KProcess& process_,
|
||||
u64 applet_resource_user_id, s32 session_id);
|
||||
Kernel::KProcess* process_handle_, u64 applet_resource_user_id,
|
||||
s32 session_id);
|
||||
~IAudioRenderer() override;
|
||||
|
||||
private:
|
||||
@ -37,7 +37,7 @@ private:
|
||||
Kernel::KEvent* rendered_event;
|
||||
AudioCore::Renderer::Manager& manager;
|
||||
std::unique_ptr<AudioCore::Renderer::Renderer> impl;
|
||||
Kernel::KProcess& process;
|
||||
Kernel::KProcess* process_handle;
|
||||
Common::ScratchBuffer<u8> output_buffer;
|
||||
Common::ScratchBuffer<u8> performance_buffer;
|
||||
};
|
||||
|
@ -8,22 +8,21 @@
|
||||
#include "core/hle/service/audio/audio_device.h"
|
||||
#include "core/hle/service/audio/audio_renderer.h"
|
||||
#include "core/hle/service/audio/audio_renderer_manager.h"
|
||||
#include "core/hle/service/ipc_helpers.h"
|
||||
#include "core/hle/service/cmif_serialization.h"
|
||||
|
||||
namespace Service::Audio {
|
||||
|
||||
using namespace AudioCore::Renderer;
|
||||
|
||||
IAudioRendererManager::IAudioRendererManager(Core::System& system_)
|
||||
: ServiceFramework{system_, "audren:u"}, service_context{system_, "audren:u"},
|
||||
impl{std::make_unique<Manager>(system_)} {
|
||||
: ServiceFramework{system_, "audren:u"}, impl{std::make_unique<Manager>(system_)} {
|
||||
// clang-format off
|
||||
static const FunctionInfo functions[] = {
|
||||
{0, &IAudioRendererManager::OpenAudioRenderer, "OpenAudioRenderer"},
|
||||
{1, &IAudioRendererManager::GetWorkBufferSize, "GetWorkBufferSize"},
|
||||
{2, &IAudioRendererManager::GetAudioDeviceService, "GetAudioDeviceService"},
|
||||
{0, C<&IAudioRendererManager::OpenAudioRenderer>, "OpenAudioRenderer"},
|
||||
{1, C<&IAudioRendererManager::GetWorkBufferSize>, "GetWorkBufferSize"},
|
||||
{2, C<&IAudioRendererManager::GetAudioDeviceService>, "GetAudioDeviceService"},
|
||||
{3, nullptr, "OpenAudioRendererForManualExecution"},
|
||||
{4, &IAudioRendererManager::GetAudioDeviceServiceWithRevisionInfo, "GetAudioDeviceServiceWithRevisionInfo"},
|
||||
{4, C<&IAudioRendererManager::GetAudioDeviceServiceWithRevisionInfo>, "GetAudioDeviceServiceWithRevisionInfo"},
|
||||
};
|
||||
// clang-format on
|
||||
|
||||
@ -32,53 +31,38 @@ IAudioRendererManager::IAudioRendererManager(Core::System& system_)
|
||||
|
||||
IAudioRendererManager::~IAudioRendererManager() = default;
|
||||
|
||||
void IAudioRendererManager::OpenAudioRenderer(HLERequestContext& ctx) {
|
||||
IPC::RequestParser rp{ctx};
|
||||
|
||||
AudioCore::AudioRendererParameterInternal params;
|
||||
rp.PopRaw<AudioCore::AudioRendererParameterInternal>(params);
|
||||
rp.Skip(1, false);
|
||||
auto transfer_memory_size = rp.Pop<u64>();
|
||||
auto applet_resource_user_id = rp.Pop<u64>();
|
||||
auto transfer_memory_handle = ctx.GetCopyHandle(0);
|
||||
auto process_handle = ctx.GetCopyHandle(1);
|
||||
Result IAudioRendererManager::OpenAudioRenderer(
|
||||
Out<SharedPointer<IAudioRenderer>> out_audio_renderer,
|
||||
AudioCore::AudioRendererParameterInternal parameter,
|
||||
InCopyHandle<Kernel::KTransferMemory> tmem_handle, u64 tmem_size,
|
||||
InCopyHandle<Kernel::KProcess> process_handle, ClientAppletResourceUserId aruid) {
|
||||
LOG_DEBUG(Service_Audio, "called");
|
||||
|
||||
if (impl->GetSessionCount() + 1 > AudioCore::MaxRendererSessions) {
|
||||
LOG_ERROR(Service_Audio, "Too many AudioRenderer sessions open!");
|
||||
IPC::ResponseBuilder rb{ctx, 2};
|
||||
rb.Push(Audio::ResultOutOfSessions);
|
||||
return;
|
||||
R_THROW(Audio::ResultOutOfSessions);
|
||||
}
|
||||
|
||||
auto process{ctx.GetObjectFromHandle<Kernel::KProcess>(process_handle).GetPointerUnsafe()};
|
||||
auto transfer_memory{ctx.GetObjectFromHandle<Kernel::KTransferMemory>(transfer_memory_handle)};
|
||||
|
||||
const auto session_id{impl->GetSessionId()};
|
||||
if (session_id == -1) {
|
||||
LOG_ERROR(Service_Audio, "Tried to open a session that's already in use!");
|
||||
IPC::ResponseBuilder rb{ctx, 2};
|
||||
rb.Push(Audio::ResultOutOfSessions);
|
||||
return;
|
||||
R_THROW(Audio::ResultOutOfSessions);
|
||||
}
|
||||
|
||||
LOG_DEBUG(Service_Audio, "Opened new AudioRenderer session {} sessions open {}", session_id,
|
||||
impl->GetSessionCount());
|
||||
|
||||
IPC::ResponseBuilder rb{ctx, 2, 0, 1};
|
||||
rb.Push(ResultSuccess);
|
||||
rb.PushIpcInterface<IAudioRenderer>(system, *impl, params, transfer_memory.GetPointerUnsafe(),
|
||||
transfer_memory_size, process_handle, *process,
|
||||
applet_resource_user_id, session_id);
|
||||
*out_audio_renderer =
|
||||
std::make_shared<IAudioRenderer>(system, *impl, parameter, tmem_handle.Get(), tmem_size,
|
||||
process_handle.Get(), aruid.pid, session_id);
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
void IAudioRendererManager::GetWorkBufferSize(HLERequestContext& ctx) {
|
||||
AudioCore::AudioRendererParameterInternal params;
|
||||
Result IAudioRendererManager::GetWorkBufferSize(Out<u64> out_size,
|
||||
AudioCore::AudioRendererParameterInternal params) {
|
||||
LOG_DEBUG(Service_Audio, "called");
|
||||
|
||||
IPC::RequestParser rp{ctx};
|
||||
rp.PopRaw<AudioCore::AudioRendererParameterInternal>(params);
|
||||
|
||||
u64 size{0};
|
||||
auto result = impl->GetWorkBufferSize(params, size);
|
||||
R_TRY(impl->GetWorkBufferSize(params, *out_size))
|
||||
|
||||
std::string output_info{};
|
||||
output_info += fmt::format("\tRevision {}", AudioCore::GetRevisionNum(params.revision));
|
||||
@ -95,49 +79,26 @@ void IAudioRendererManager::GetWorkBufferSize(HLERequestContext& ctx) {
|
||||
params.external_context_size);
|
||||
|
||||
LOG_DEBUG(Service_Audio, "called.\nInput params:\n{}\nOutput params:\n\tWorkbuffer size {:08X}",
|
||||
output_info, size);
|
||||
|
||||
IPC::ResponseBuilder rb{ctx, 4};
|
||||
rb.Push(result);
|
||||
rb.Push<u64>(size);
|
||||
output_info, *out_size);
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
void IAudioRendererManager::GetAudioDeviceService(HLERequestContext& ctx) {
|
||||
IPC::RequestParser rp{ctx};
|
||||
|
||||
const auto applet_resource_user_id = rp.Pop<u64>();
|
||||
|
||||
LOG_DEBUG(Service_Audio, "called. Applet resource id {}", applet_resource_user_id);
|
||||
|
||||
IPC::ResponseBuilder rb{ctx, 2, 0, 1};
|
||||
|
||||
rb.Push(ResultSuccess);
|
||||
rb.PushIpcInterface<IAudioDevice>(system, applet_resource_user_id,
|
||||
::Common::MakeMagic('R', 'E', 'V', '1'), num_audio_devices++);
|
||||
Result IAudioRendererManager::GetAudioDeviceService(
|
||||
Out<SharedPointer<IAudioDevice>> out_audio_device, ClientAppletResourceUserId aruid) {
|
||||
LOG_DEBUG(Service_Audio, "called, aruid={:#x}", aruid.pid);
|
||||
*out_audio_device = std::make_shared<IAudioDevice>(
|
||||
system, aruid.pid, Common::MakeMagic('R', 'E', 'V', '1'), num_audio_devices++);
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
void IAudioRendererManager::OpenAudioRendererForManualExecution(HLERequestContext& ctx) {
|
||||
LOG_ERROR(Service_Audio, "called. Implement me!");
|
||||
}
|
||||
|
||||
void IAudioRendererManager::GetAudioDeviceServiceWithRevisionInfo(HLERequestContext& ctx) {
|
||||
struct Parameters {
|
||||
u32 revision;
|
||||
u64 applet_resource_user_id;
|
||||
};
|
||||
|
||||
IPC::RequestParser rp{ctx};
|
||||
|
||||
const auto [revision, applet_resource_user_id] = rp.PopRaw<Parameters>();
|
||||
|
||||
LOG_DEBUG(Service_Audio, "called. Revision {} Applet resource id {}",
|
||||
AudioCore::GetRevisionNum(revision), applet_resource_user_id);
|
||||
|
||||
IPC::ResponseBuilder rb{ctx, 2, 0, 1};
|
||||
|
||||
rb.Push(ResultSuccess);
|
||||
rb.PushIpcInterface<IAudioDevice>(system, applet_resource_user_id, revision,
|
||||
num_audio_devices++);
|
||||
Result IAudioRendererManager::GetAudioDeviceServiceWithRevisionInfo(
|
||||
Out<SharedPointer<IAudioDevice>> out_audio_device, u32 revision,
|
||||
ClientAppletResourceUserId aruid) {
|
||||
LOG_DEBUG(Service_Audio, "called, revision={} aruid={:#x}", AudioCore::GetRevisionNum(revision),
|
||||
aruid.pid);
|
||||
*out_audio_device =
|
||||
std::make_shared<IAudioDevice>(system, aruid.pid, revision, num_audio_devices++);
|
||||
R_SUCCEED();
|
||||
}
|
||||
|
||||
} // namespace Service::Audio
|
||||
|
@ -4,14 +4,12 @@
|
||||
#pragma once
|
||||
|
||||
#include "audio_core/audio_render_manager.h"
|
||||
#include "core/hle/service/kernel_helpers.h"
|
||||
#include "core/hle/service/cmif_types.h"
|
||||
#include "core/hle/service/service.h"
|
||||
|
||||
namespace Core {
|
||||
class System;
|
||||
}
|
||||
|
||||
namespace Service::Audio {
|
||||
|
||||
class IAudioDevice;
|
||||
class IAudioRenderer;
|
||||
|
||||
class IAudioRendererManager final : public ServiceFramework<IAudioRendererManager> {
|
||||
@ -20,13 +18,18 @@ public:
|
||||
~IAudioRendererManager() override;
|
||||
|
||||
private:
|
||||
void OpenAudioRenderer(HLERequestContext& ctx);
|
||||
void GetWorkBufferSize(HLERequestContext& ctx);
|
||||
void GetAudioDeviceService(HLERequestContext& ctx);
|
||||
void OpenAudioRendererForManualExecution(HLERequestContext& ctx);
|
||||
void GetAudioDeviceServiceWithRevisionInfo(HLERequestContext& ctx);
|
||||
Result OpenAudioRenderer(Out<SharedPointer<IAudioRenderer>> out_audio_renderer,
|
||||
AudioCore::AudioRendererParameterInternal parameter,
|
||||
InCopyHandle<Kernel::KTransferMemory> tmem_handle, u64 tmem_size,
|
||||
InCopyHandle<Kernel::KProcess> process_handle,
|
||||
ClientAppletResourceUserId aruid);
|
||||
Result GetWorkBufferSize(Out<u64> out_size,
|
||||
AudioCore::AudioRendererParameterInternal parameter);
|
||||
Result GetAudioDeviceService(Out<SharedPointer<IAudioDevice>> out_audio_device,
|
||||
ClientAppletResourceUserId aruid);
|
||||
Result GetAudioDeviceServiceWithRevisionInfo(Out<SharedPointer<IAudioDevice>> out_audio_device,
|
||||
u32 revision, ClientAppletResourceUserId aruid);
|
||||
|
||||
KernelHelpers::ServiceContext service_context;
|
||||
std::unique_ptr<AudioCore::Renderer::Manager> impl;
|
||||
u32 num_audio_devices{0};
|
||||
};
|
||||
|
Reference in New Issue
Block a user