summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Liam2024-02-20 20:02:36 -0500
committerGravatar Liam2024-02-20 22:15:37 -0500
commit6012c9fe3af1c649e5ac6392dc4b74bd3cfd0c4f (patch)
tree0c4925aa6e1c67ab3f91723c690ebfce90089356 /src
parentaudio: split IHardwarweOpusDecoder, move IHardwareOpusDecoderManager (diff)
downloadyuzu-6012c9fe3af1c649e5ac6392dc4b74bd3cfd0c4f.tar.gz
yuzu-6012c9fe3af1c649e5ac6392dc4b74bd3cfd0c4f.tar.xz
yuzu-6012c9fe3af1c649e5ac6392dc4b74bd3cfd0c4f.zip
audio: rewrite IAudioRendererManager
Diffstat (limited to 'src')
-rw-r--r--src/audio_core/renderer/audio_renderer.cpp7
-rw-r--r--src/audio_core/renderer/audio_renderer.h4
-rw-r--r--src/audio_core/renderer/behavior/info_updater.cpp9
-rw-r--r--src/audio_core/renderer/behavior/info_updater.h10
-rw-r--r--src/audio_core/renderer/memory/pool_mapper.cpp22
-rw-r--r--src/audio_core/renderer/memory/pool_mapper.h14
-rw-r--r--src/audio_core/renderer/system.cpp10
-rw-r--r--src/audio_core/renderer/system.h8
-rw-r--r--src/core/hle/service/audio/audio_renderer.cpp13
-rw-r--r--src/core/hle/service/audio/audio_renderer.h6
-rw-r--r--src/core/hle/service/audio/audio_renderer_manager.cpp115
-rw-r--r--src/core/hle/service/audio/audio_renderer_manager.h25
12 files changed, 107 insertions, 136 deletions
diff --git a/src/audio_core/renderer/audio_renderer.cpp b/src/audio_core/renderer/audio_renderer.cpp
index df03d03aa..7c728cb86 100644
--- a/src/audio_core/renderer/audio_renderer.cpp
+++ b/src/audio_core/renderer/audio_renderer.cpp
@@ -17,9 +17,8 @@ Renderer::Renderer(Core::System& system_, Manager& manager_, Kernel::KEvent* ren
17 17
18Result Renderer::Initialize(const AudioRendererParameterInternal& params, 18Result Renderer::Initialize(const AudioRendererParameterInternal& params,
19 Kernel::KTransferMemory* transfer_memory, 19 Kernel::KTransferMemory* transfer_memory,
20 const u64 transfer_memory_size, const u32 process_handle, 20 const u64 transfer_memory_size, Kernel::KProcess* process_handle,
21 Kernel::KProcess& process, const u64 applet_resource_user_id, 21 const u64 applet_resource_user_id, const s32 session_id) {
22 const s32 session_id) {
23 if (params.execution_mode == ExecutionMode::Auto) { 22 if (params.execution_mode == ExecutionMode::Auto) {
24 if (!manager.AddSystem(system)) { 23 if (!manager.AddSystem(system)) {
25 LOG_ERROR(Service_Audio, 24 LOG_ERROR(Service_Audio,
@@ -30,7 +29,7 @@ Result Renderer::Initialize(const AudioRendererParameterInternal& params,
30 } 29 }
31 30
32 initialized = true; 31 initialized = true;
33 system.Initialize(params, transfer_memory, transfer_memory_size, process_handle, process, 32 system.Initialize(params, transfer_memory, transfer_memory_size, process_handle,
34 applet_resource_user_id, session_id); 33 applet_resource_user_id, session_id);
35 34
36 return ResultSuccess; 35 return ResultSuccess;
diff --git a/src/audio_core/renderer/audio_renderer.h b/src/audio_core/renderer/audio_renderer.h
index 1219f74ca..f16adeda7 100644
--- a/src/audio_core/renderer/audio_renderer.h
+++ b/src/audio_core/renderer/audio_renderer.h
@@ -38,14 +38,14 @@ public:
38 * @param params - Input parameters to initialize the system with. 38 * @param params - Input parameters to initialize the system with.
39 * @param transfer_memory - Game-supplied memory for all workbuffers. Unused. 39 * @param transfer_memory - Game-supplied memory for all workbuffers. Unused.
40 * @param transfer_memory_size - Size of the transfer memory. Unused. 40 * @param transfer_memory_size - Size of the transfer memory. Unused.
41 * @param process_handle - Process handle, also used for memory. Unused. 41 * @param process_handle - Process handle, also used for memory.
42 * @param applet_resource_user_id - Applet id for this renderer. Unused. 42 * @param applet_resource_user_id - Applet id for this renderer. Unused.
43 * @param session_id - Session id of this renderer. 43 * @param session_id - Session id of this renderer.
44 * @return Result code. 44 * @return Result code.
45 */ 45 */
46 Result Initialize(const AudioRendererParameterInternal& params, 46 Result Initialize(const AudioRendererParameterInternal& params,
47 Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size, 47 Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size,
48 u32 process_handle, Kernel::KProcess& process, u64 applet_resource_user_id, 48 Kernel::KProcess* process_handle, u64 applet_resource_user_id,
49 s32 session_id); 49 s32 session_id);
50 50
51 /** 51 /**
diff --git a/src/audio_core/renderer/behavior/info_updater.cpp b/src/audio_core/renderer/behavior/info_updater.cpp
index 667711e17..163127789 100644
--- a/src/audio_core/renderer/behavior/info_updater.cpp
+++ b/src/audio_core/renderer/behavior/info_updater.cpp
@@ -18,11 +18,10 @@
18namespace AudioCore::Renderer { 18namespace AudioCore::Renderer {
19 19
20InfoUpdater::InfoUpdater(std::span<const u8> input_, std::span<u8> output_, 20InfoUpdater::InfoUpdater(std::span<const u8> input_, std::span<u8> output_,
21 const u32 process_handle_, BehaviorInfo& behaviour_) 21 Kernel::KProcess* process_handle_, BehaviorInfo& behaviour_)
22 : input{input_.data() + sizeof(UpdateDataHeader)}, 22 : input{input_.data() + sizeof(UpdateDataHeader)}, input_origin{input_},
23 input_origin{input_}, output{output_.data() + sizeof(UpdateDataHeader)}, 23 output{output_.data() + sizeof(UpdateDataHeader)}, output_origin{output_},
24 output_origin{output_}, in_header{reinterpret_cast<const UpdateDataHeader*>( 24 in_header{reinterpret_cast<const UpdateDataHeader*>(input_origin.data())},
25 input_origin.data())},
26 out_header{reinterpret_cast<UpdateDataHeader*>(output_origin.data())}, 25 out_header{reinterpret_cast<UpdateDataHeader*>(output_origin.data())},
27 expected_input_size{input_.size()}, expected_output_size{output_.size()}, 26 expected_input_size{input_.size()}, expected_output_size{output_.size()},
28 process_handle{process_handle_}, behaviour{behaviour_} { 27 process_handle{process_handle_}, behaviour{behaviour_} {
diff --git a/src/audio_core/renderer/behavior/info_updater.h b/src/audio_core/renderer/behavior/info_updater.h
index fb4b7d25a..4f27a817e 100644
--- a/src/audio_core/renderer/behavior/info_updater.h
+++ b/src/audio_core/renderer/behavior/info_updater.h
@@ -8,6 +8,10 @@
8#include "common/common_types.h" 8#include "common/common_types.h"
9#include "core/hle/service/audio/errors.h" 9#include "core/hle/service/audio/errors.h"
10 10
11namespace Kernel {
12class KProcess;
13}
14
11namespace AudioCore::Renderer { 15namespace AudioCore::Renderer {
12class BehaviorInfo; 16class BehaviorInfo;
13class VoiceContext; 17class VoiceContext;
@@ -39,8 +43,8 @@ class InfoUpdater {
39 static_assert(sizeof(UpdateDataHeader) == 0x40, "UpdateDataHeader has the wrong size!"); 43 static_assert(sizeof(UpdateDataHeader) == 0x40, "UpdateDataHeader has the wrong size!");
40 44
41public: 45public:
42 explicit InfoUpdater(std::span<const u8> input, std::span<u8> output, u32 process_handle, 46 explicit InfoUpdater(std::span<const u8> input, std::span<u8> output,
43 BehaviorInfo& behaviour); 47 Kernel::KProcess* process_handle, BehaviorInfo& behaviour);
44 48
45 /** 49 /**
46 * Update the voice channel resources. 50 * Update the voice channel resources.
@@ -197,7 +201,7 @@ private:
197 /// Expected output size, see CheckConsumedSize 201 /// Expected output size, see CheckConsumedSize
198 u64 expected_output_size; 202 u64 expected_output_size;
199 /// Unused 203 /// Unused
200 u32 process_handle; 204 Kernel::KProcess* process_handle;
201 /// Behaviour 205 /// Behaviour
202 BehaviorInfo& behaviour; 206 BehaviorInfo& behaviour;
203}; 207};
diff --git a/src/audio_core/renderer/memory/pool_mapper.cpp b/src/audio_core/renderer/memory/pool_mapper.cpp
index 999bb746b..1df786feb 100644
--- a/src/audio_core/renderer/memory/pool_mapper.cpp
+++ b/src/audio_core/renderer/memory/pool_mapper.cpp
@@ -8,13 +8,13 @@
8 8
9namespace AudioCore::Renderer { 9namespace AudioCore::Renderer {
10 10
11PoolMapper::PoolMapper(u32 process_handle_, bool force_map_) 11PoolMapper::PoolMapper(Kernel::KProcess* process_handle_, bool force_map_)
12 : process_handle{process_handle_}, force_map{force_map_} {} 12 : process_handle{process_handle_}, force_map{force_map_} {}
13 13
14PoolMapper::PoolMapper(u32 process_handle_, std::span<MemoryPoolInfo> pool_infos_, u32 pool_count_, 14PoolMapper::PoolMapper(Kernel::KProcess* process_handle_, std::span<MemoryPoolInfo> pool_infos_,
15 bool force_map_) 15 u32 pool_count_, bool force_map_)
16 : process_handle{process_handle_}, pool_infos{pool_infos_.data()}, 16 : process_handle{process_handle_}, pool_infos{pool_infos_.data()}, pool_count{pool_count_},
17 pool_count{pool_count_}, force_map{force_map_} {} 17 force_map{force_map_} {}
18 18
19void PoolMapper::ClearUseState(std::span<MemoryPoolInfo> pools, const u32 count) { 19void PoolMapper::ClearUseState(std::span<MemoryPoolInfo> pools, const u32 count) {
20 for (u32 i = 0; i < count; i++) { 20 for (u32 i = 0; i < count; i++) {
@@ -106,15 +106,17 @@ bool PoolMapper::IsForceMapEnabled() const {
106 return force_map; 106 return force_map;
107} 107}
108 108
109u32 PoolMapper::GetProcessHandle(const MemoryPoolInfo* pool) const { 109Kernel::KProcess* PoolMapper::GetProcessHandle(const MemoryPoolInfo* pool) const {
110 switch (pool->GetLocation()) { 110 switch (pool->GetLocation()) {
111 case MemoryPoolInfo::Location::CPU: 111 case MemoryPoolInfo::Location::CPU:
112 return process_handle; 112 return process_handle;
113 case MemoryPoolInfo::Location::DSP: 113 case MemoryPoolInfo::Location::DSP:
114 return Kernel::Svc::CurrentProcess; 114 // return Kernel::Svc::CurrentProcess;
115 return nullptr;
115 } 116 }
116 LOG_WARNING(Service_Audio, "Invalid MemoryPoolInfo location!"); 117 LOG_WARNING(Service_Audio, "Invalid MemoryPoolInfo location!");
117 return Kernel::Svc::CurrentProcess; 118 // return Kernel::Svc::CurrentProcess;
119 return nullptr;
118} 120}
119 121
120bool PoolMapper::Map([[maybe_unused]] const u32 handle, [[maybe_unused]] const CpuAddr cpu_addr, 122bool PoolMapper::Map([[maybe_unused]] const u32 handle, [[maybe_unused]] const CpuAddr cpu_addr,
@@ -147,14 +149,14 @@ bool PoolMapper::Unmap([[maybe_unused]] const u32 handle, [[maybe_unused]] const
147} 149}
148 150
149bool PoolMapper::Unmap(MemoryPoolInfo& pool) const { 151bool PoolMapper::Unmap(MemoryPoolInfo& pool) const {
150 [[maybe_unused]] u32 handle{0}; 152 [[maybe_unused]] Kernel::KProcess* handle{};
151 153
152 switch (pool.GetLocation()) { 154 switch (pool.GetLocation()) {
153 case MemoryPoolInfo::Location::CPU: 155 case MemoryPoolInfo::Location::CPU:
154 handle = process_handle; 156 handle = process_handle;
155 break; 157 break;
156 case MemoryPoolInfo::Location::DSP: 158 case MemoryPoolInfo::Location::DSP:
157 handle = Kernel::Svc::CurrentProcess; 159 // handle = Kernel::Svc::CurrentProcess;
158 break; 160 break;
159 } 161 }
160 // nn::audio::dsp::UnmapUserPointer(handle, pool->cpu_address, pool->size); 162 // nn::audio::dsp::UnmapUserPointer(handle, pool->cpu_address, pool->size);
diff --git a/src/audio_core/renderer/memory/pool_mapper.h b/src/audio_core/renderer/memory/pool_mapper.h
index 95ae5d8ea..fb5122b73 100644
--- a/src/audio_core/renderer/memory/pool_mapper.h
+++ b/src/audio_core/renderer/memory/pool_mapper.h
@@ -10,6 +10,10 @@
10#include "common/common_types.h" 10#include "common/common_types.h"
11#include "core/hle/service/audio/errors.h" 11#include "core/hle/service/audio/errors.h"
12 12
13namespace Kernel {
14class KProcess;
15}
16
13namespace AudioCore::Renderer { 17namespace AudioCore::Renderer {
14class AddressInfo; 18class AddressInfo;
15 19
@@ -18,9 +22,9 @@ class AddressInfo;
18 */ 22 */
19class PoolMapper { 23class PoolMapper {
20public: 24public:
21 explicit PoolMapper(u32 process_handle, bool force_map); 25 explicit PoolMapper(Kernel::KProcess* process_handle, bool force_map);
22 explicit PoolMapper(u32 process_handle, std::span<MemoryPoolInfo> pool_infos, u32 pool_count, 26 explicit PoolMapper(Kernel::KProcess* process_handle, std::span<MemoryPoolInfo> pool_infos,
23 bool force_map); 27 u32 pool_count, bool force_map);
24 28
25 /** 29 /**
26 * Clear the usage state for all given pools. 30 * Clear the usage state for all given pools.
@@ -98,7 +102,7 @@ public:
98 * @return CurrentProcessHandle if location == DSP, 102 * @return CurrentProcessHandle if location == DSP,
99 * the PoolMapper's process_handle if location == CPU 103 * the PoolMapper's process_handle if location == CPU
100 */ 104 */
101 u32 GetProcessHandle(const MemoryPoolInfo* pool) const; 105 Kernel::KProcess* GetProcessHandle(const MemoryPoolInfo* pool) const;
102 106
103 /** 107 /**
104 * Map the given region with the given handle. This is a no-op. 108 * Map the given region with the given handle. This is a no-op.
@@ -167,7 +171,7 @@ public:
167 171
168private: 172private:
169 /// Process handle for this mapper, used when location == CPU 173 /// Process handle for this mapper, used when location == CPU
170 u32 process_handle; 174 Kernel::KProcess* process_handle{};
171 /// List of memory pools assigned to this mapper 175 /// List of memory pools assigned to this mapper
172 MemoryPoolInfo* pool_infos{}; 176 MemoryPoolInfo* pool_infos{};
173 /// The number of pools 177 /// The number of pools
diff --git a/src/audio_core/renderer/system.cpp b/src/audio_core/renderer/system.cpp
index ca656edae..c30d68426 100644
--- a/src/audio_core/renderer/system.cpp
+++ b/src/audio_core/renderer/system.cpp
@@ -102,8 +102,8 @@ System::System(Core::System& core_, Kernel::KEvent* adsp_rendered_event_)
102 102
103Result System::Initialize(const AudioRendererParameterInternal& params, 103Result System::Initialize(const AudioRendererParameterInternal& params,
104 Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size, 104 Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size,
105 u32 process_handle_, Kernel::KProcess& process_, 105 Kernel::KProcess* process_handle_, u64 applet_resource_user_id_,
106 u64 applet_resource_user_id_, s32 session_id_) { 106 s32 session_id_) {
107 if (!CheckValidRevision(params.revision)) { 107 if (!CheckValidRevision(params.revision)) {
108 return Service::Audio::ResultInvalidRevision; 108 return Service::Audio::ResultInvalidRevision;
109 } 109 }
@@ -119,7 +119,6 @@ Result System::Initialize(const AudioRendererParameterInternal& params,
119 behavior.SetUserLibRevision(params.revision); 119 behavior.SetUserLibRevision(params.revision);
120 120
121 process_handle = process_handle_; 121 process_handle = process_handle_;
122 process = &process_;
123 applet_resource_user_id = applet_resource_user_id_; 122 applet_resource_user_id = applet_resource_user_id_;
124 session_id = session_id_; 123 session_id = session_id_;
125 124
@@ -132,7 +131,8 @@ Result System::Initialize(const AudioRendererParameterInternal& params,
132 render_device = params.rendering_device; 131 render_device = params.rendering_device;
133 execution_mode = params.execution_mode; 132 execution_mode = params.execution_mode;
134 133
135 process->GetMemory().ZeroBlock(transfer_memory->GetSourceAddress(), transfer_memory_size); 134 process_handle->GetMemory().ZeroBlock(transfer_memory->GetSourceAddress(),
135 transfer_memory_size);
136 136
137 // Note: We're not actually using the transfer memory because it's a pain to code for. 137 // Note: We're not actually using the transfer memory because it's a pain to code for.
138 // Allocate the memory normally instead and hope the game doesn't try to read anything back 138 // Allocate the memory normally instead and hope the game doesn't try to read anything back
@@ -616,7 +616,7 @@ void System::SendCommandToDsp() {
616 static_cast<u64>((time_limit_percent / 100) * 2'880'000.0 * 616 static_cast<u64>((time_limit_percent / 100) * 2'880'000.0 *
617 (static_cast<f32>(render_time_limit_percent) / 100.0f))}; 617 (static_cast<f32>(render_time_limit_percent) / 100.0f))};
618 audio_renderer.SetCommandBuffer(session_id, translated_addr, command_size, time_limit, 618 audio_renderer.SetCommandBuffer(session_id, translated_addr, command_size, time_limit,
619 applet_resource_user_id, process, 619 applet_resource_user_id, process_handle,
620 reset_command_buffers); 620 reset_command_buffers);
621 reset_command_buffers = false; 621 reset_command_buffers = false;
622 command_buffer_size = command_size; 622 command_buffer_size = command_size;
diff --git a/src/audio_core/renderer/system.h b/src/audio_core/renderer/system.h
index 753a0b796..3533a74ef 100644
--- a/src/audio_core/renderer/system.h
+++ b/src/audio_core/renderer/system.h
@@ -74,14 +74,14 @@ public:
74 * @param params - Input parameters to initialize the system with. 74 * @param params - Input parameters to initialize the system with.
75 * @param transfer_memory - Game-supplied memory for all workbuffers. Unused. 75 * @param transfer_memory - Game-supplied memory for all workbuffers. Unused.
76 * @param transfer_memory_size - Size of the transfer memory. Unused. 76 * @param transfer_memory_size - Size of the transfer memory. Unused.
77 * @param process_handle - Process handle, also used for memory. Unused. 77 * @param process_handle - Process handle, also used for memory.
78 * @param applet_resource_user_id - Applet id for this renderer. Unused. 78 * @param applet_resource_user_id - Applet id for this renderer. Unused.
79 * @param session_id - Session id of this renderer. 79 * @param session_id - Session id of this renderer.
80 * @return Result code. 80 * @return Result code.
81 */ 81 */
82 Result Initialize(const AudioRendererParameterInternal& params, 82 Result Initialize(const AudioRendererParameterInternal& params,
83 Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size, 83 Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size,
84 u32 process_handle, Kernel::KProcess& process, u64 applet_resource_user_id, 84 Kernel::KProcess* process_handle, u64 applet_resource_user_id,
85 s32 session_id); 85 s32 session_id);
86 86
87 /** 87 /**
@@ -278,9 +278,7 @@ private:
278 /// Does what locks do 278 /// Does what locks do
279 std::mutex lock{}; 279 std::mutex lock{};
280 /// Process this audio render is operating within, used for memory reads/writes. 280 /// Process this audio render is operating within, used for memory reads/writes.
281 Kernel::KProcess* process{}; 281 Kernel::KProcess* process_handle{};
282 /// Handle for the process for this system, unused
283 u32 process_handle{};
284 /// Applet resource id for this system, unused 282 /// Applet resource id for this system, unused
285 u64 applet_resource_user_id{}; 283 u64 applet_resource_user_id{};
286 /// Controls performance input and output 284 /// Controls performance input and output
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;
10IAudioRenderer::IAudioRenderer(Core::System& system_, Manager& manager_, 10IAudioRenderer::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
43IAudioRenderer::~IAudioRenderer() { 44IAudioRenderer::~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
49void IAudioRenderer::GetSampleRate(HLERequestContext& ctx) { 50void 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
21private: 21private:
@@ -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
13namespace Service::Audio { 13namespace Service::Audio {
14 14
15using namespace AudioCore::Renderer; 15using namespace AudioCore::Renderer;
16 16
17IAudioRendererManager::IAudioRendererManager(Core::System& system_) 17IAudioRendererManager::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
33IAudioRendererManager::~IAudioRendererManager() = default; 32IAudioRendererManager::~IAudioRendererManager() = default;
34 33
35void IAudioRendererManager::OpenAudioRenderer(HLERequestContext& ctx) { 34Result 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
74void IAudioRendererManager::GetWorkBufferSize(HLERequestContext& ctx) { 61Result 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
105void 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
119void IAudioRendererManager::OpenAudioRendererForManualExecution(HLERequestContext& ctx) { 86Result 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
123void IAudioRendererManager::GetAudioDeviceServiceWithRevisionInfo(HLERequestContext& ctx) { 94Result 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
10namespace Core {
11class System;
12}
13
14namespace Service::Audio { 10namespace Service::Audio {
11
12class IAudioDevice;
15class IAudioRenderer; 13class IAudioRenderer;
16 14
17class IAudioRendererManager final : public ServiceFramework<IAudioRendererManager> { 15class IAudioRendererManager final : public ServiceFramework<IAudioRendererManager> {
@@ -20,13 +18,18 @@ public:
20 ~IAudioRendererManager() override; 18 ~IAudioRendererManager() override;
21 19
22private: 20private:
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};