diff options
| -rw-r--r-- | src/core/hle/service/audio/audren_u.cpp | 51 | ||||
| -rw-r--r-- | src/core/hle/service/audio/audren_u.h | 4 |
2 files changed, 21 insertions, 34 deletions
diff --git a/src/core/hle/service/audio/audren_u.cpp b/src/core/hle/service/audio/audren_u.cpp index 653ded8e9..2188b5625 100644 --- a/src/core/hle/service/audio/audren_u.cpp +++ b/src/core/hle/service/audio/audren_u.cpp | |||
| @@ -17,7 +17,7 @@ constexpr u64 audio_ticks{static_cast<u64>(CoreTiming::BASE_CLOCK_RATE / 200)}; | |||
| 17 | 17 | ||
| 18 | class IAudioRenderer final : public ServiceFramework<IAudioRenderer> { | 18 | class IAudioRenderer final : public ServiceFramework<IAudioRenderer> { |
| 19 | public: | 19 | public: |
| 20 | IAudioRenderer(AudioRendererParameters audren_params) | 20 | IAudioRenderer(AudioRendererParameter audren_params) |
| 21 | : ServiceFramework("IAudioRenderer"), worker_params(audren_params) { | 21 | : ServiceFramework("IAudioRenderer"), worker_params(audren_params) { |
| 22 | static const FunctionInfo functions[] = { | 22 | static const FunctionInfo functions[] = { |
| 23 | {0, nullptr, "GetAudioRendererSampleRate"}, | 23 | {0, nullptr, "GetAudioRendererSampleRate"}, |
| @@ -58,22 +58,22 @@ private: | |||
| 58 | } | 58 | } |
| 59 | 59 | ||
| 60 | void RequestUpdateAudioRenderer(Kernel::HLERequestContext& ctx) { | 60 | void RequestUpdateAudioRenderer(Kernel::HLERequestContext& ctx) { |
| 61 | AudioRendererConfig config; | 61 | UpdateDataHeader config{}; |
| 62 | auto buf = ctx.ReadBuffer(); | 62 | auto buf = ctx.ReadBuffer(); |
| 63 | std::memcpy(&config, buf.data(), sizeof(AudioRendererConfig)); | 63 | std::memcpy(&config, buf.data(), sizeof(UpdateDataHeader)); |
| 64 | u32 memory_pool_count = worker_params.effect_count + (worker_params.voice_count * 4); | 64 | u32 memory_pool_count = worker_params.effect_count + (worker_params.voice_count * 4); |
| 65 | 65 | ||
| 66 | std::vector<MemoryPoolInfo> mem_pool_info(memory_pool_count); | 66 | std::vector<MemoryPoolInfo> mem_pool_info(memory_pool_count); |
| 67 | std::memcpy(mem_pool_info.data(), | 67 | std::memcpy(mem_pool_info.data(), |
| 68 | buf.data() + sizeof(AudioRendererConfig) + config.behavior_size, | 68 | buf.data() + sizeof(UpdateDataHeader) + config.behavior_size, |
| 69 | memory_pool_count * sizeof(MemoryPoolInfo)); | 69 | memory_pool_count * sizeof(MemoryPoolInfo)); |
| 70 | 70 | ||
| 71 | AudioRendererResponse response_data{worker_params}; | 71 | UpdateDataHeader response_data{worker_params}; |
| 72 | 72 | ||
| 73 | ASSERT(ctx.GetWriteBufferSize() == response_data.total_size); | 73 | ASSERT(ctx.GetWriteBufferSize() == response_data.total_size); |
| 74 | 74 | ||
| 75 | std::vector<u8> output(response_data.total_size); | 75 | std::vector<u8> output(response_data.total_size); |
| 76 | std::memcpy(output.data(), &response_data, sizeof(AudioRendererResponse)); | 76 | std::memcpy(output.data(), &response_data, sizeof(UpdateDataHeader)); |
| 77 | std::vector<MemoryPoolEntry> memory_pool(memory_pool_count); | 77 | std::vector<MemoryPoolEntry> memory_pool(memory_pool_count); |
| 78 | for (unsigned i = 0; i < memory_pool.size(); i++) { | 78 | for (unsigned i = 0; i < memory_pool.size(); i++) { |
| 79 | if (mem_pool_info[i].pool_state == MemoryPoolStates::RequestAttach) | 79 | if (mem_pool_info[i].pool_state == MemoryPoolStates::RequestAttach) |
| @@ -83,7 +83,7 @@ private: | |||
| 83 | else | 83 | else |
| 84 | memory_pool[i].state = mem_pool_info[i].pool_state; | 84 | memory_pool[i].state = mem_pool_info[i].pool_state; |
| 85 | } | 85 | } |
| 86 | std::memcpy(output.data() + sizeof(AudioRendererResponse), memory_pool.data(), | 86 | std::memcpy(output.data() + sizeof(UpdateDataHeader), memory_pool.data(), |
| 87 | response_data.memory_pools_size); | 87 | response_data.memory_pools_size); |
| 88 | 88 | ||
| 89 | ctx.WriteBuffer(output); | 89 | ctx.WriteBuffer(output); |
| @@ -146,53 +146,40 @@ private: | |||
| 146 | }; | 146 | }; |
| 147 | static_assert(sizeof(MemoryPoolInfo) == 0x20, "MemoryPoolInfo has wrong size"); | 147 | static_assert(sizeof(MemoryPoolInfo) == 0x20, "MemoryPoolInfo has wrong size"); |
| 148 | 148 | ||
| 149 | struct AudioRendererConfig { | 149 | struct UpdateDataHeader { |
| 150 | u32 revision; | 150 | UpdateDataHeader() {} |
| 151 | u32 behavior_size; | ||
| 152 | u32 memory_pools_size; | ||
| 153 | u32 voices_size; | ||
| 154 | u32 voice_resource_size; | ||
| 155 | u32 effects_size; | ||
| 156 | u32 mixes_size; | ||
| 157 | u32 sinks_size; | ||
| 158 | u32 performance_buffer_size; | ||
| 159 | INSERT_PADDING_WORDS(6); | ||
| 160 | u32 total_size; | ||
| 161 | }; | ||
| 162 | static_assert(sizeof(AudioRendererConfig) == 0x40, "AudioRendererConfig has wrong size"); | ||
| 163 | 151 | ||
| 164 | struct AudioRendererResponse { | 152 | UpdateDataHeader(const AudioRendererParameter& config) { |
| 165 | AudioRendererResponse(const AudioRendererParameters& config) { | ||
| 166 | revision = config.revision; | 153 | revision = config.revision; |
| 167 | error_info_size = 0xb0; | 154 | behavior_size = 0xb0; |
| 168 | memory_pools_size = (config.effect_count + (config.voice_count * 4)) * 0x10; | 155 | memory_pools_size = (config.effect_count + (config.voice_count * 4)) * 0x10; |
| 169 | voices_size = config.voice_count * 0x10; | 156 | voices_size = config.voice_count * 0x10; |
| 170 | effects_size = config.effect_count * 0x10; | 157 | effects_size = config.effect_count * 0x10; |
| 171 | sinks_size = config.sink_count * 0x20; | 158 | sinks_size = config.sink_count * 0x20; |
| 172 | performance_manager_size = 0x10; | 159 | performance_manager_size = 0x10; |
| 173 | total_size = sizeof(AudioRendererResponse) + error_info_size + memory_pools_size + | 160 | total_size = sizeof(UpdateDataHeader) + behavior_size + memory_pools_size + |
| 174 | voices_size + effects_size + sinks_size + performance_manager_size; | 161 | voices_size + effects_size + sinks_size + performance_manager_size; |
| 175 | } | 162 | } |
| 176 | 163 | ||
| 177 | u32_le revision; | 164 | u32_le revision; |
| 178 | u32_le error_info_size; | 165 | u32_le behavior_size; |
| 179 | u32_le memory_pools_size; | 166 | u32_le memory_pools_size; |
| 180 | u32_le voices_size; | 167 | u32_le voices_size; |
| 181 | u32_le unknown_10; | 168 | u32_le voice_resource_size; |
| 182 | u32_le effects_size; | 169 | u32_le effects_size; |
| 183 | u32_le unknown_18; | 170 | u32_le mixes_size; |
| 184 | u32_le sinks_size; | 171 | u32_le sinks_size; |
| 185 | u32_le performance_manager_size; | 172 | u32_le performance_manager_size; |
| 186 | INSERT_PADDING_WORDS(6); | 173 | INSERT_PADDING_WORDS(6); |
| 187 | u32_le total_size; | 174 | u32_le total_size; |
| 188 | }; | 175 | }; |
| 189 | static_assert(sizeof(AudioRendererResponse) == 0x40, "AudioRendererResponse has wrong size"); | 176 | static_assert(sizeof(UpdateDataHeader) == 0x40, "UpdateDataHeader has wrong size"); |
| 190 | 177 | ||
| 191 | /// This is used to trigger the audio event callback. | 178 | /// This is used to trigger the audio event callback. |
| 192 | CoreTiming::EventType* audio_event; | 179 | CoreTiming::EventType* audio_event; |
| 193 | 180 | ||
| 194 | Kernel::SharedPtr<Kernel::Event> system_event; | 181 | Kernel::SharedPtr<Kernel::Event> system_event; |
| 195 | AudioRendererParameters worker_params; | 182 | AudioRendererParameter worker_params; |
| 196 | }; | 183 | }; |
| 197 | 184 | ||
| 198 | class IAudioDevice final : public ServiceFramework<IAudioDevice> { | 185 | class IAudioDevice final : public ServiceFramework<IAudioDevice> { |
| @@ -291,7 +278,7 @@ AudRenU::AudRenU() : ServiceFramework("audren:u") { | |||
| 291 | 278 | ||
| 292 | void AudRenU::OpenAudioRenderer(Kernel::HLERequestContext& ctx) { | 279 | void AudRenU::OpenAudioRenderer(Kernel::HLERequestContext& ctx) { |
| 293 | IPC::RequestParser rp{ctx}; | 280 | IPC::RequestParser rp{ctx}; |
| 294 | auto params = rp.PopRaw<AudioRendererParameters>(); | 281 | auto params = rp.PopRaw<AudioRendererParameter>(); |
| 295 | IPC::ResponseBuilder rb{ctx, 2, 0, 1}; | 282 | IPC::ResponseBuilder rb{ctx, 2, 0, 1}; |
| 296 | 283 | ||
| 297 | rb.Push(RESULT_SUCCESS); | 284 | rb.Push(RESULT_SUCCESS); |
| @@ -302,7 +289,7 @@ void AudRenU::OpenAudioRenderer(Kernel::HLERequestContext& ctx) { | |||
| 302 | 289 | ||
| 303 | void AudRenU::GetAudioRendererWorkBufferSize(Kernel::HLERequestContext& ctx) { | 290 | void AudRenU::GetAudioRendererWorkBufferSize(Kernel::HLERequestContext& ctx) { |
| 304 | IPC::RequestParser rp{ctx}; | 291 | IPC::RequestParser rp{ctx}; |
| 305 | auto params = rp.PopRaw<AudioRendererParameters>(); | 292 | auto params = rp.PopRaw<AudioRendererParameter>(); |
| 306 | 293 | ||
| 307 | u64 buffer_sz = Common::AlignUp(4 * params.unknown_8, 0x40); | 294 | u64 buffer_sz = Common::AlignUp(4 * params.unknown_8, 0x40); |
| 308 | buffer_sz += params.unknown_c * 1024; | 295 | buffer_sz += params.unknown_c * 1024; |
diff --git a/src/core/hle/service/audio/audren_u.h b/src/core/hle/service/audio/audren_u.h index e8baf99ee..b9b81db4f 100644 --- a/src/core/hle/service/audio/audren_u.h +++ b/src/core/hle/service/audio/audren_u.h | |||
| @@ -12,7 +12,7 @@ class HLERequestContext; | |||
| 12 | 12 | ||
| 13 | namespace Service::Audio { | 13 | namespace Service::Audio { |
| 14 | 14 | ||
| 15 | struct AudioRendererParameters { | 15 | struct AudioRendererParameter { |
| 16 | u32_le sample_rate; | 16 | u32_le sample_rate; |
| 17 | u32_le sample_count; | 17 | u32_le sample_count; |
| 18 | u32_le unknown_8; | 18 | u32_le unknown_8; |
| @@ -28,7 +28,7 @@ struct AudioRendererParameters { | |||
| 28 | INSERT_PADDING_WORDS(1); | 28 | INSERT_PADDING_WORDS(1); |
| 29 | u32_le revision; | 29 | u32_le revision; |
| 30 | }; | 30 | }; |
| 31 | static_assert(sizeof(AudioRendererParameters) == 52, "AudioRendererParameters is an invalid size"); | 31 | static_assert(sizeof(AudioRendererParameter) == 52, "AudioRendererParameter is an invalid size"); |
| 32 | 32 | ||
| 33 | class AudRenU final : public ServiceFramework<AudRenU> { | 33 | class AudRenU final : public ServiceFramework<AudRenU> { |
| 34 | public: | 34 | public: |