summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/hle/service/audio/audren_u.cpp51
-rw-r--r--src/core/hle/service/audio/audren_u.h4
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
18class IAudioRenderer final : public ServiceFramework<IAudioRenderer> { 18class IAudioRenderer final : public ServiceFramework<IAudioRenderer> {
19public: 19public:
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
198class IAudioDevice final : public ServiceFramework<IAudioDevice> { 185class IAudioDevice final : public ServiceFramework<IAudioDevice> {
@@ -291,7 +278,7 @@ AudRenU::AudRenU() : ServiceFramework("audren:u") {
291 278
292void AudRenU::OpenAudioRenderer(Kernel::HLERequestContext& ctx) { 279void 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
303void AudRenU::GetAudioRendererWorkBufferSize(Kernel::HLERequestContext& ctx) { 290void 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
13namespace Service::Audio { 13namespace Service::Audio {
14 14
15struct AudioRendererParameters { 15struct 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};
31static_assert(sizeof(AudioRendererParameters) == 52, "AudioRendererParameters is an invalid size"); 31static_assert(sizeof(AudioRendererParameter) == 52, "AudioRendererParameter is an invalid size");
32 32
33class AudRenU final : public ServiceFramework<AudRenU> { 33class AudRenU final : public ServiceFramework<AudRenU> {
34public: 34public: