diff options
| author | 2024-02-20 20:02:36 -0500 | |
|---|---|---|
| committer | 2024-02-20 22:15:37 -0500 | |
| commit | 6012c9fe3af1c649e5ac6392dc4b74bd3cfd0c4f (patch) | |
| tree | 0c4925aa6e1c67ab3f91723c690ebfce90089356 /src/core/hle/service/audio | |
| parent | audio: split IHardwarweOpusDecoder, move IHardwareOpusDecoderManager (diff) | |
| download | yuzu-6012c9fe3af1c649e5ac6392dc4b74bd3cfd0c4f.tar.gz yuzu-6012c9fe3af1c649e5ac6392dc4b74bd3cfd0c4f.tar.xz yuzu-6012c9fe3af1c649e5ac6392dc4b74bd3cfd0c4f.zip | |
audio: rewrite IAudioRendererManager
Diffstat (limited to 'src/core/hle/service/audio')
| -rw-r--r-- | src/core/hle/service/audio/audio_renderer.cpp | 13 | ||||
| -rw-r--r-- | src/core/hle/service/audio/audio_renderer.h | 6 | ||||
| -rw-r--r-- | src/core/hle/service/audio/audio_renderer_manager.cpp | 115 | ||||
| -rw-r--r-- | src/core/hle/service/audio/audio_renderer_manager.h | 25 |
4 files changed, 62 insertions, 97 deletions
diff --git a/src/core/hle/service/audio/audio_renderer.cpp b/src/core/hle/service/audio/audio_renderer.cpp index 68415eb8f..a408fc3cf 100644 --- a/src/core/hle/service/audio/audio_renderer.cpp +++ b/src/core/hle/service/audio/audio_renderer.cpp | |||
| @@ -10,11 +10,12 @@ using namespace AudioCore::Renderer; | |||
| 10 | IAudioRenderer::IAudioRenderer(Core::System& system_, Manager& manager_, | 10 | IAudioRenderer::IAudioRenderer(Core::System& system_, Manager& manager_, |
| 11 | AudioCore::AudioRendererParameterInternal& params, | 11 | AudioCore::AudioRendererParameterInternal& params, |
| 12 | Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size, | 12 | Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size, |
| 13 | u32 process_handle, Kernel::KProcess& process_, | 13 | Kernel::KProcess* process_handle_, u64 applet_resource_user_id, |
| 14 | u64 applet_resource_user_id, s32 session_id) | 14 | s32 session_id) |
| 15 | : ServiceFramework{system_, "IAudioRenderer"}, service_context{system_, "IAudioRenderer"}, | 15 | : ServiceFramework{system_, "IAudioRenderer"}, service_context{system_, "IAudioRenderer"}, |
| 16 | rendered_event{service_context.CreateEvent("IAudioRendererEvent")}, manager{manager_}, | 16 | rendered_event{service_context.CreateEvent("IAudioRendererEvent")}, manager{manager_}, |
| 17 | impl{std::make_unique<Renderer>(system_, manager, rendered_event)}, process{process_} { | 17 | impl{std::make_unique<Renderer>(system_, manager, rendered_event)}, |
| 18 | process_handle{process_handle_} { | ||
| 18 | // clang-format off | 19 | // clang-format off |
| 19 | static const FunctionInfo functions[] = { | 20 | static const FunctionInfo functions[] = { |
| 20 | {0, &IAudioRenderer::GetSampleRate, "GetSampleRate"}, | 21 | {0, &IAudioRenderer::GetSampleRate, "GetSampleRate"}, |
| @@ -35,15 +36,15 @@ IAudioRenderer::IAudioRenderer(Core::System& system_, Manager& manager_, | |||
| 35 | // clang-format on | 36 | // clang-format on |
| 36 | RegisterHandlers(functions); | 37 | RegisterHandlers(functions); |
| 37 | 38 | ||
| 38 | process.Open(); | 39 | process_handle->Open(); |
| 39 | impl->Initialize(params, transfer_memory, transfer_memory_size, process_handle, process, | 40 | impl->Initialize(params, transfer_memory, transfer_memory_size, process_handle, |
| 40 | applet_resource_user_id, session_id); | 41 | applet_resource_user_id, session_id); |
| 41 | } | 42 | } |
| 42 | 43 | ||
| 43 | IAudioRenderer::~IAudioRenderer() { | 44 | IAudioRenderer::~IAudioRenderer() { |
| 44 | impl->Finalize(); | 45 | impl->Finalize(); |
| 45 | service_context.CloseEvent(rendered_event); | 46 | service_context.CloseEvent(rendered_event); |
| 46 | process.Close(); | 47 | process_handle->Close(); |
| 47 | } | 48 | } |
| 48 | 49 | ||
| 49 | void IAudioRenderer::GetSampleRate(HLERequestContext& ctx) { | 50 | void IAudioRenderer::GetSampleRate(HLERequestContext& ctx) { |
diff --git a/src/core/hle/service/audio/audio_renderer.h b/src/core/hle/service/audio/audio_renderer.h index f8c48154b..d3e7461ef 100644 --- a/src/core/hle/service/audio/audio_renderer.h +++ b/src/core/hle/service/audio/audio_renderer.h | |||
| @@ -14,8 +14,8 @@ public: | |||
| 14 | explicit IAudioRenderer(Core::System& system_, AudioCore::Renderer::Manager& manager_, | 14 | explicit IAudioRenderer(Core::System& system_, AudioCore::Renderer::Manager& manager_, |
| 15 | AudioCore::AudioRendererParameterInternal& params, | 15 | AudioCore::AudioRendererParameterInternal& params, |
| 16 | Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size, | 16 | Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size, |
| 17 | u32 process_handle, Kernel::KProcess& process_, | 17 | Kernel::KProcess* process_handle_, u64 applet_resource_user_id, |
| 18 | u64 applet_resource_user_id, s32 session_id); | 18 | s32 session_id); |
| 19 | ~IAudioRenderer() override; | 19 | ~IAudioRenderer() override; |
| 20 | 20 | ||
| 21 | private: | 21 | private: |
| @@ -37,7 +37,7 @@ private: | |||
| 37 | Kernel::KEvent* rendered_event; | 37 | Kernel::KEvent* rendered_event; |
| 38 | AudioCore::Renderer::Manager& manager; | 38 | AudioCore::Renderer::Manager& manager; |
| 39 | std::unique_ptr<AudioCore::Renderer::Renderer> impl; | 39 | std::unique_ptr<AudioCore::Renderer::Renderer> impl; |
| 40 | Kernel::KProcess& process; | 40 | Kernel::KProcess* process_handle; |
| 41 | Common::ScratchBuffer<u8> output_buffer; | 41 | Common::ScratchBuffer<u8> output_buffer; |
| 42 | Common::ScratchBuffer<u8> performance_buffer; | 42 | Common::ScratchBuffer<u8> performance_buffer; |
| 43 | }; | 43 | }; |
diff --git a/src/core/hle/service/audio/audio_renderer_manager.cpp b/src/core/hle/service/audio/audio_renderer_manager.cpp index 7baa9d8cf..3129169a4 100644 --- a/src/core/hle/service/audio/audio_renderer_manager.cpp +++ b/src/core/hle/service/audio/audio_renderer_manager.cpp | |||
| @@ -8,22 +8,21 @@ | |||
| 8 | #include "core/hle/service/audio/audio_device.h" | 8 | #include "core/hle/service/audio/audio_device.h" |
| 9 | #include "core/hle/service/audio/audio_renderer.h" | 9 | #include "core/hle/service/audio/audio_renderer.h" |
| 10 | #include "core/hle/service/audio/audio_renderer_manager.h" | 10 | #include "core/hle/service/audio/audio_renderer_manager.h" |
| 11 | #include "core/hle/service/ipc_helpers.h" | 11 | #include "core/hle/service/cmif_serialization.h" |
| 12 | 12 | ||
| 13 | namespace Service::Audio { | 13 | namespace Service::Audio { |
| 14 | 14 | ||
| 15 | using namespace AudioCore::Renderer; | 15 | using namespace AudioCore::Renderer; |
| 16 | 16 | ||
| 17 | IAudioRendererManager::IAudioRendererManager(Core::System& system_) | 17 | IAudioRendererManager::IAudioRendererManager(Core::System& system_) |
| 18 | : ServiceFramework{system_, "audren:u"}, service_context{system_, "audren:u"}, | 18 | : ServiceFramework{system_, "audren:u"}, impl{std::make_unique<Manager>(system_)} { |
| 19 | impl{std::make_unique<Manager>(system_)} { | ||
| 20 | // clang-format off | 19 | // clang-format off |
| 21 | static const FunctionInfo functions[] = { | 20 | static const FunctionInfo functions[] = { |
| 22 | {0, &IAudioRendererManager::OpenAudioRenderer, "OpenAudioRenderer"}, | 21 | {0, C<&IAudioRendererManager::OpenAudioRenderer>, "OpenAudioRenderer"}, |
| 23 | {1, &IAudioRendererManager::GetWorkBufferSize, "GetWorkBufferSize"}, | 22 | {1, C<&IAudioRendererManager::GetWorkBufferSize>, "GetWorkBufferSize"}, |
| 24 | {2, &IAudioRendererManager::GetAudioDeviceService, "GetAudioDeviceService"}, | 23 | {2, C<&IAudioRendererManager::GetAudioDeviceService>, "GetAudioDeviceService"}, |
| 25 | {3, nullptr, "OpenAudioRendererForManualExecution"}, | 24 | {3, nullptr, "OpenAudioRendererForManualExecution"}, |
| 26 | {4, &IAudioRendererManager::GetAudioDeviceServiceWithRevisionInfo, "GetAudioDeviceServiceWithRevisionInfo"}, | 25 | {4, C<&IAudioRendererManager::GetAudioDeviceServiceWithRevisionInfo>, "GetAudioDeviceServiceWithRevisionInfo"}, |
| 27 | }; | 26 | }; |
| 28 | // clang-format on | 27 | // clang-format on |
| 29 | 28 | ||
| @@ -32,53 +31,38 @@ IAudioRendererManager::IAudioRendererManager(Core::System& system_) | |||
| 32 | 31 | ||
| 33 | IAudioRendererManager::~IAudioRendererManager() = default; | 32 | IAudioRendererManager::~IAudioRendererManager() = default; |
| 34 | 33 | ||
| 35 | void IAudioRendererManager::OpenAudioRenderer(HLERequestContext& ctx) { | 34 | Result IAudioRendererManager::OpenAudioRenderer( |
| 36 | IPC::RequestParser rp{ctx}; | 35 | Out<SharedPointer<IAudioRenderer>> out_audio_renderer, |
| 37 | 36 | AudioCore::AudioRendererParameterInternal parameter, | |
| 38 | AudioCore::AudioRendererParameterInternal params; | 37 | InCopyHandle<Kernel::KTransferMemory> tmem_handle, u64 tmem_size, |
| 39 | rp.PopRaw<AudioCore::AudioRendererParameterInternal>(params); | 38 | InCopyHandle<Kernel::KProcess> process_handle, ClientAppletResourceUserId aruid) { |
| 40 | rp.Skip(1, false); | 39 | LOG_DEBUG(Service_Audio, "called"); |
| 41 | auto transfer_memory_size = rp.Pop<u64>(); | ||
| 42 | auto applet_resource_user_id = rp.Pop<u64>(); | ||
| 43 | auto transfer_memory_handle = ctx.GetCopyHandle(0); | ||
| 44 | auto process_handle = ctx.GetCopyHandle(1); | ||
| 45 | 40 | ||
| 46 | if (impl->GetSessionCount() + 1 > AudioCore::MaxRendererSessions) { | 41 | if (impl->GetSessionCount() + 1 > AudioCore::MaxRendererSessions) { |
| 47 | LOG_ERROR(Service_Audio, "Too many AudioRenderer sessions open!"); | 42 | LOG_ERROR(Service_Audio, "Too many AudioRenderer sessions open!"); |
| 48 | IPC::ResponseBuilder rb{ctx, 2}; | 43 | R_THROW(Audio::ResultOutOfSessions); |
| 49 | rb.Push(Audio::ResultOutOfSessions); | ||
| 50 | return; | ||
| 51 | } | 44 | } |
| 52 | 45 | ||
| 53 | auto process{ctx.GetObjectFromHandle<Kernel::KProcess>(process_handle).GetPointerUnsafe()}; | ||
| 54 | auto transfer_memory{ctx.GetObjectFromHandle<Kernel::KTransferMemory>(transfer_memory_handle)}; | ||
| 55 | |||
| 56 | const auto session_id{impl->GetSessionId()}; | 46 | const auto session_id{impl->GetSessionId()}; |
| 57 | if (session_id == -1) { | 47 | if (session_id == -1) { |
| 58 | LOG_ERROR(Service_Audio, "Tried to open a session that's already in use!"); | 48 | LOG_ERROR(Service_Audio, "Tried to open a session that's already in use!"); |
| 59 | IPC::ResponseBuilder rb{ctx, 2}; | 49 | R_THROW(Audio::ResultOutOfSessions); |
| 60 | rb.Push(Audio::ResultOutOfSessions); | ||
| 61 | return; | ||
| 62 | } | 50 | } |
| 63 | 51 | ||
| 64 | LOG_DEBUG(Service_Audio, "Opened new AudioRenderer session {} sessions open {}", session_id, | 52 | LOG_DEBUG(Service_Audio, "Opened new AudioRenderer session {} sessions open {}", session_id, |
| 65 | impl->GetSessionCount()); | 53 | impl->GetSessionCount()); |
| 66 | 54 | ||
| 67 | IPC::ResponseBuilder rb{ctx, 2, 0, 1}; | 55 | *out_audio_renderer = |
| 68 | rb.Push(ResultSuccess); | 56 | std::make_shared<IAudioRenderer>(system, *impl, parameter, tmem_handle.Get(), tmem_size, |
| 69 | rb.PushIpcInterface<IAudioRenderer>(system, *impl, params, transfer_memory.GetPointerUnsafe(), | 57 | process_handle.Get(), aruid.pid, session_id); |
| 70 | transfer_memory_size, process_handle, *process, | 58 | R_SUCCEED(); |
| 71 | applet_resource_user_id, session_id); | ||
| 72 | } | 59 | } |
| 73 | 60 | ||
| 74 | void IAudioRendererManager::GetWorkBufferSize(HLERequestContext& ctx) { | 61 | Result IAudioRendererManager::GetWorkBufferSize(Out<u64> out_size, |
| 75 | AudioCore::AudioRendererParameterInternal params; | 62 | AudioCore::AudioRendererParameterInternal params) { |
| 63 | LOG_DEBUG(Service_Audio, "called"); | ||
| 76 | 64 | ||
| 77 | IPC::RequestParser rp{ctx}; | 65 | R_TRY(impl->GetWorkBufferSize(params, *out_size)) |
| 78 | rp.PopRaw<AudioCore::AudioRendererParameterInternal>(params); | ||
| 79 | |||
| 80 | u64 size{0}; | ||
| 81 | auto result = impl->GetWorkBufferSize(params, size); | ||
| 82 | 66 | ||
| 83 | std::string output_info{}; | 67 | std::string output_info{}; |
| 84 | output_info += fmt::format("\tRevision {}", AudioCore::GetRevisionNum(params.revision)); | 68 | output_info += fmt::format("\tRevision {}", AudioCore::GetRevisionNum(params.revision)); |
| @@ -95,49 +79,26 @@ void IAudioRendererManager::GetWorkBufferSize(HLERequestContext& ctx) { | |||
| 95 | params.external_context_size); | 79 | params.external_context_size); |
| 96 | 80 | ||
| 97 | LOG_DEBUG(Service_Audio, "called.\nInput params:\n{}\nOutput params:\n\tWorkbuffer size {:08X}", | 81 | LOG_DEBUG(Service_Audio, "called.\nInput params:\n{}\nOutput params:\n\tWorkbuffer size {:08X}", |
| 98 | output_info, size); | 82 | output_info, *out_size); |
| 99 | 83 | R_SUCCEED(); | |
| 100 | IPC::ResponseBuilder rb{ctx, 4}; | ||
| 101 | rb.Push(result); | ||
| 102 | rb.Push<u64>(size); | ||
| 103 | } | ||
| 104 | |||
| 105 | void IAudioRendererManager::GetAudioDeviceService(HLERequestContext& ctx) { | ||
| 106 | IPC::RequestParser rp{ctx}; | ||
| 107 | |||
| 108 | const auto applet_resource_user_id = rp.Pop<u64>(); | ||
| 109 | |||
| 110 | LOG_DEBUG(Service_Audio, "called. Applet resource id {}", applet_resource_user_id); | ||
| 111 | |||
| 112 | IPC::ResponseBuilder rb{ctx, 2, 0, 1}; | ||
| 113 | |||
| 114 | rb.Push(ResultSuccess); | ||
| 115 | rb.PushIpcInterface<IAudioDevice>(system, applet_resource_user_id, | ||
| 116 | ::Common::MakeMagic('R', 'E', 'V', '1'), num_audio_devices++); | ||
| 117 | } | 84 | } |
| 118 | 85 | ||
| 119 | void IAudioRendererManager::OpenAudioRendererForManualExecution(HLERequestContext& ctx) { | 86 | Result IAudioRendererManager::GetAudioDeviceService( |
| 120 | LOG_ERROR(Service_Audio, "called. Implement me!"); | 87 | Out<SharedPointer<IAudioDevice>> out_audio_device, ClientAppletResourceUserId aruid) { |
| 88 | LOG_DEBUG(Service_Audio, "called, aruid={:#x}", aruid.pid); | ||
| 89 | *out_audio_device = std::make_shared<IAudioDevice>( | ||
| 90 | system, aruid.pid, Common::MakeMagic('R', 'E', 'V', '1'), num_audio_devices++); | ||
| 91 | R_SUCCEED(); | ||
| 121 | } | 92 | } |
| 122 | 93 | ||
| 123 | void IAudioRendererManager::GetAudioDeviceServiceWithRevisionInfo(HLERequestContext& ctx) { | 94 | Result IAudioRendererManager::GetAudioDeviceServiceWithRevisionInfo( |
| 124 | struct Parameters { | 95 | Out<SharedPointer<IAudioDevice>> out_audio_device, u32 revision, |
| 125 | u32 revision; | 96 | ClientAppletResourceUserId aruid) { |
| 126 | u64 applet_resource_user_id; | 97 | LOG_DEBUG(Service_Audio, "called, revision={} aruid={:#x}", AudioCore::GetRevisionNum(revision), |
| 127 | }; | 98 | aruid.pid); |
| 128 | 99 | *out_audio_device = | |
| 129 | IPC::RequestParser rp{ctx}; | 100 | std::make_shared<IAudioDevice>(system, aruid.pid, revision, num_audio_devices++); |
| 130 | 101 | R_SUCCEED(); | |
| 131 | const auto [revision, applet_resource_user_id] = rp.PopRaw<Parameters>(); | ||
| 132 | |||
| 133 | LOG_DEBUG(Service_Audio, "called. Revision {} Applet resource id {}", | ||
| 134 | AudioCore::GetRevisionNum(revision), applet_resource_user_id); | ||
| 135 | |||
| 136 | IPC::ResponseBuilder rb{ctx, 2, 0, 1}; | ||
| 137 | |||
| 138 | rb.Push(ResultSuccess); | ||
| 139 | rb.PushIpcInterface<IAudioDevice>(system, applet_resource_user_id, revision, | ||
| 140 | num_audio_devices++); | ||
| 141 | } | 102 | } |
| 142 | 103 | ||
| 143 | } // namespace Service::Audio | 104 | } // namespace Service::Audio |
diff --git a/src/core/hle/service/audio/audio_renderer_manager.h b/src/core/hle/service/audio/audio_renderer_manager.h index 3623f91c6..69eee664c 100644 --- a/src/core/hle/service/audio/audio_renderer_manager.h +++ b/src/core/hle/service/audio/audio_renderer_manager.h | |||
| @@ -4,14 +4,12 @@ | |||
| 4 | #pragma once | 4 | #pragma once |
| 5 | 5 | ||
| 6 | #include "audio_core/audio_render_manager.h" | 6 | #include "audio_core/audio_render_manager.h" |
| 7 | #include "core/hle/service/kernel_helpers.h" | 7 | #include "core/hle/service/cmif_types.h" |
| 8 | #include "core/hle/service/service.h" | 8 | #include "core/hle/service/service.h" |
| 9 | 9 | ||
| 10 | namespace Core { | ||
| 11 | class System; | ||
| 12 | } | ||
| 13 | |||
| 14 | namespace Service::Audio { | 10 | namespace Service::Audio { |
| 11 | |||
| 12 | class IAudioDevice; | ||
| 15 | class IAudioRenderer; | 13 | class IAudioRenderer; |
| 16 | 14 | ||
| 17 | class IAudioRendererManager final : public ServiceFramework<IAudioRendererManager> { | 15 | class IAudioRendererManager final : public ServiceFramework<IAudioRendererManager> { |
| @@ -20,13 +18,18 @@ public: | |||
| 20 | ~IAudioRendererManager() override; | 18 | ~IAudioRendererManager() override; |
| 21 | 19 | ||
| 22 | private: | 20 | private: |
| 23 | void OpenAudioRenderer(HLERequestContext& ctx); | 21 | Result OpenAudioRenderer(Out<SharedPointer<IAudioRenderer>> out_audio_renderer, |
| 24 | void GetWorkBufferSize(HLERequestContext& ctx); | 22 | AudioCore::AudioRendererParameterInternal parameter, |
| 25 | void GetAudioDeviceService(HLERequestContext& ctx); | 23 | InCopyHandle<Kernel::KTransferMemory> tmem_handle, u64 tmem_size, |
| 26 | void OpenAudioRendererForManualExecution(HLERequestContext& ctx); | 24 | InCopyHandle<Kernel::KProcess> process_handle, |
| 27 | void GetAudioDeviceServiceWithRevisionInfo(HLERequestContext& ctx); | 25 | ClientAppletResourceUserId aruid); |
| 26 | Result GetWorkBufferSize(Out<u64> out_size, | ||
| 27 | AudioCore::AudioRendererParameterInternal parameter); | ||
| 28 | Result GetAudioDeviceService(Out<SharedPointer<IAudioDevice>> out_audio_device, | ||
| 29 | ClientAppletResourceUserId aruid); | ||
| 30 | Result GetAudioDeviceServiceWithRevisionInfo(Out<SharedPointer<IAudioDevice>> out_audio_device, | ||
| 31 | u32 revision, ClientAppletResourceUserId aruid); | ||
| 28 | 32 | ||
| 29 | KernelHelpers::ServiceContext service_context; | ||
| 30 | std::unique_ptr<AudioCore::Renderer::Manager> impl; | 33 | std::unique_ptr<AudioCore::Renderer::Manager> impl; |
| 31 | u32 num_audio_devices{0}; | 34 | u32 num_audio_devices{0}; |
| 32 | }; | 35 | }; |