diff options
| author | 2024-02-20 20:02:36 -0500 | |
|---|---|---|
| committer | 2024-02-20 22:15:37 -0500 | |
| commit | 6012c9fe3af1c649e5ac6392dc4b74bd3cfd0c4f (patch) | |
| tree | 0c4925aa6e1c67ab3f91723c690ebfce90089356 /src | |
| 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')
| -rw-r--r-- | src/audio_core/renderer/audio_renderer.cpp | 7 | ||||
| -rw-r--r-- | src/audio_core/renderer/audio_renderer.h | 4 | ||||
| -rw-r--r-- | src/audio_core/renderer/behavior/info_updater.cpp | 9 | ||||
| -rw-r--r-- | src/audio_core/renderer/behavior/info_updater.h | 10 | ||||
| -rw-r--r-- | src/audio_core/renderer/memory/pool_mapper.cpp | 22 | ||||
| -rw-r--r-- | src/audio_core/renderer/memory/pool_mapper.h | 14 | ||||
| -rw-r--r-- | src/audio_core/renderer/system.cpp | 10 | ||||
| -rw-r--r-- | src/audio_core/renderer/system.h | 8 | ||||
| -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 |
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 | ||
| 18 | Result Renderer::Initialize(const AudioRendererParameterInternal& params, | 18 | Result 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 @@ | |||
| 18 | namespace AudioCore::Renderer { | 18 | namespace AudioCore::Renderer { |
| 19 | 19 | ||
| 20 | InfoUpdater::InfoUpdater(std::span<const u8> input_, std::span<u8> output_, | 20 | InfoUpdater::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 | ||
| 11 | namespace Kernel { | ||
| 12 | class KProcess; | ||
| 13 | } | ||
| 14 | |||
| 11 | namespace AudioCore::Renderer { | 15 | namespace AudioCore::Renderer { |
| 12 | class BehaviorInfo; | 16 | class BehaviorInfo; |
| 13 | class VoiceContext; | 17 | class 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 | ||
| 41 | public: | 45 | public: |
| 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 | ||
| 9 | namespace AudioCore::Renderer { | 9 | namespace AudioCore::Renderer { |
| 10 | 10 | ||
| 11 | PoolMapper::PoolMapper(u32 process_handle_, bool force_map_) | 11 | PoolMapper::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 | ||
| 14 | PoolMapper::PoolMapper(u32 process_handle_, std::span<MemoryPoolInfo> pool_infos_, u32 pool_count_, | 14 | PoolMapper::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 | ||
| 19 | void PoolMapper::ClearUseState(std::span<MemoryPoolInfo> pools, const u32 count) { | 19 | void 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 | ||
| 109 | u32 PoolMapper::GetProcessHandle(const MemoryPoolInfo* pool) const { | 109 | Kernel::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 | ||
| 120 | bool PoolMapper::Map([[maybe_unused]] const u32 handle, [[maybe_unused]] const CpuAddr cpu_addr, | 122 | bool 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 | ||
| 149 | bool PoolMapper::Unmap(MemoryPoolInfo& pool) const { | 151 | bool 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 | ||
| 13 | namespace Kernel { | ||
| 14 | class KProcess; | ||
| 15 | } | ||
| 16 | |||
| 13 | namespace AudioCore::Renderer { | 17 | namespace AudioCore::Renderer { |
| 14 | class AddressInfo; | 18 | class AddressInfo; |
| 15 | 19 | ||
| @@ -18,9 +22,9 @@ class AddressInfo; | |||
| 18 | */ | 22 | */ |
| 19 | class PoolMapper { | 23 | class PoolMapper { |
| 20 | public: | 24 | public: |
| 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 | ||
| 168 | private: | 172 | private: |
| 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 | ||
| 103 | Result System::Initialize(const AudioRendererParameterInternal& params, | 103 | Result 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; | |||
| 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 | }; |