diff options
| -rw-r--r-- | src/audio_core/audio_renderer.cpp | 19 | ||||
| -rw-r--r-- | src/audio_core/audio_renderer.h | 13 |
2 files changed, 26 insertions, 6 deletions
diff --git a/src/audio_core/audio_renderer.cpp b/src/audio_core/audio_renderer.cpp index 50846a854..d64452617 100644 --- a/src/audio_core/audio_renderer.cpp +++ b/src/audio_core/audio_renderer.cpp | |||
| @@ -180,11 +180,12 @@ ResultVal<std::vector<u8>> AudioRenderer::UpdateAudioRenderer(const std::vector< | |||
| 180 | 180 | ||
| 181 | // Copy output header | 181 | // Copy output header |
| 182 | UpdateDataHeader response_data{worker_params}; | 182 | UpdateDataHeader response_data{worker_params}; |
| 183 | std::vector<u8> output_params(response_data.total_size); | ||
| 184 | if (behavior_info.IsElapsedFrameCountSupported()) { | 183 | if (behavior_info.IsElapsedFrameCountSupported()) { |
| 185 | response_data.frame_count = 0x10; | 184 | response_data.render_info = sizeof(RendererInfo); |
| 186 | response_data.total_size += 0x10; | 185 | response_data.total_size += sizeof(RendererInfo); |
| 187 | } | 186 | } |
| 187 | |||
| 188 | std::vector<u8> output_params(response_data.total_size); | ||
| 188 | std::memcpy(output_params.data(), &response_data, sizeof(UpdateDataHeader)); | 189 | std::memcpy(output_params.data(), &response_data, sizeof(UpdateDataHeader)); |
| 189 | 190 | ||
| 190 | // Copy output memory pool entries | 191 | // Copy output memory pool entries |
| @@ -219,6 +220,17 @@ ResultVal<std::vector<u8>> AudioRenderer::UpdateAudioRenderer(const std::vector< | |||
| 219 | return Audren::ERR_INVALID_PARAMETERS; | 220 | return Audren::ERR_INVALID_PARAMETERS; |
| 220 | } | 221 | } |
| 221 | 222 | ||
| 223 | if (behavior_info.IsElapsedFrameCountSupported()) { | ||
| 224 | const std::size_t renderer_info_offset{ | ||
| 225 | sizeof(UpdateDataHeader) + response_data.memory_pools_size + response_data.voices_size + | ||
| 226 | response_data.effects_size + response_data.sinks_size + | ||
| 227 | response_data.performance_manager_size + response_data.behavior_size}; | ||
| 228 | RendererInfo renderer_info{}; | ||
| 229 | renderer_info.elasped_frame_count = elapsed_frame_count; | ||
| 230 | std::memcpy(output_params.data() + renderer_info_offset, &renderer_info, | ||
| 231 | sizeof(RendererInfo)); | ||
| 232 | } | ||
| 233 | |||
| 222 | return MakeResult(output_params); | 234 | return MakeResult(output_params); |
| 223 | } | 235 | } |
| 224 | 236 | ||
| @@ -447,6 +459,7 @@ void AudioRenderer::QueueMixedBuffer(Buffer::Tag tag) { | |||
| 447 | } | 459 | } |
| 448 | } | 460 | } |
| 449 | audio_out->QueueBuffer(stream, tag, std::move(buffer)); | 461 | audio_out->QueueBuffer(stream, tag, std::move(buffer)); |
| 462 | elapsed_frame_count++; | ||
| 450 | } | 463 | } |
| 451 | 464 | ||
| 452 | void AudioRenderer::ReleaseAndQueueBuffers() { | 465 | void AudioRenderer::ReleaseAndQueueBuffers() { |
diff --git a/src/audio_core/audio_renderer.h b/src/audio_core/audio_renderer.h index 1f9114c07..f0b691a86 100644 --- a/src/audio_core/audio_renderer.h +++ b/src/audio_core/audio_renderer.h | |||
| @@ -196,6 +196,12 @@ struct EffectOutStatus { | |||
| 196 | }; | 196 | }; |
| 197 | static_assert(sizeof(EffectOutStatus) == 0x10, "EffectOutStatus is an invalid size"); | 197 | static_assert(sizeof(EffectOutStatus) == 0x10, "EffectOutStatus is an invalid size"); |
| 198 | 198 | ||
| 199 | struct RendererInfo { | ||
| 200 | u64_le elasped_frame_count{}; | ||
| 201 | INSERT_PADDING_WORDS(2); | ||
| 202 | }; | ||
| 203 | static_assert(sizeof(RendererInfo) == 0x10, "RendererInfo is an invalid size"); | ||
| 204 | |||
| 199 | struct UpdateDataHeader { | 205 | struct UpdateDataHeader { |
| 200 | UpdateDataHeader() {} | 206 | UpdateDataHeader() {} |
| 201 | 207 | ||
| @@ -209,7 +215,7 @@ struct UpdateDataHeader { | |||
| 209 | mixes_size = 0x0; | 215 | mixes_size = 0x0; |
| 210 | sinks_size = config.sink_count * 0x20; | 216 | sinks_size = config.sink_count * 0x20; |
| 211 | performance_manager_size = 0x10; | 217 | performance_manager_size = 0x10; |
| 212 | frame_count = 0; | 218 | render_info = 0; |
| 213 | total_size = sizeof(UpdateDataHeader) + behavior_size + memory_pools_size + voices_size + | 219 | total_size = sizeof(UpdateDataHeader) + behavior_size + memory_pools_size + voices_size + |
| 214 | effects_size + sinks_size + performance_manager_size; | 220 | effects_size + sinks_size + performance_manager_size; |
| 215 | } | 221 | } |
| @@ -223,8 +229,8 @@ struct UpdateDataHeader { | |||
| 223 | u32_le mixes_size{}; | 229 | u32_le mixes_size{}; |
| 224 | u32_le sinks_size{}; | 230 | u32_le sinks_size{}; |
| 225 | u32_le performance_manager_size{}; | 231 | u32_le performance_manager_size{}; |
| 226 | INSERT_PADDING_WORDS(1); | 232 | u32_le splitter_size{}; |
| 227 | u32_le frame_count{}; | 233 | u32_le render_info{}; |
| 228 | INSERT_PADDING_WORDS(4); | 234 | INSERT_PADDING_WORDS(4); |
| 229 | u32_le total_size{}; | 235 | u32_le total_size{}; |
| 230 | }; | 236 | }; |
| @@ -258,6 +264,7 @@ private: | |||
| 258 | std::unique_ptr<AudioOut> audio_out; | 264 | std::unique_ptr<AudioOut> audio_out; |
| 259 | StreamPtr stream; | 265 | StreamPtr stream; |
| 260 | Core::Memory::Memory& memory; | 266 | Core::Memory::Memory& memory; |
| 267 | std::size_t elapsed_frame_count{}; | ||
| 261 | }; | 268 | }; |
| 262 | 269 | ||
| 263 | } // namespace AudioCore | 270 | } // namespace AudioCore |