diff options
| author | 2020-04-21 12:57:30 +1000 | |
|---|---|---|
| committer | 2020-04-20 22:57:30 -0400 | |
| commit | 11c63ca969f39481ccf75c204e21948f4fb41efa (patch) | |
| tree | edd0a3efd2515e42c9f6a820888fcd77df29460b /src/audio_core/audio_renderer.cpp | |
| parent | Merge pull request #3695 from ReinUsesLisp/default-attributes (diff) | |
| download | yuzu-11c63ca969f39481ccf75c204e21948f4fb41efa.tar.gz yuzu-11c63ca969f39481ccf75c204e21948f4fb41efa.tar.xz yuzu-11c63ca969f39481ccf75c204e21948f4fb41efa.zip | |
audio_renderer: Preliminary BehaviorInfo (#3736)
* audio_renderer: Preliminary BehaviorInfo
* clang format
* Fixed IsRevisionSupported
* fixed IsValidRevision
* Fixed logic error & spelling errors & crash
* Addressed issues
Diffstat (limited to 'src/audio_core/audio_renderer.cpp')
| -rw-r--r-- | src/audio_core/audio_renderer.cpp | 32 |
1 files changed, 22 insertions, 10 deletions
diff --git a/src/audio_core/audio_renderer.cpp b/src/audio_core/audio_renderer.cpp index 7a9dc61d4..d18ef6940 100644 --- a/src/audio_core/audio_renderer.cpp +++ b/src/audio_core/audio_renderer.cpp | |||
| @@ -6,6 +6,7 @@ | |||
| 6 | #include "audio_core/audio_out.h" | 6 | #include "audio_core/audio_out.h" |
| 7 | #include "audio_core/audio_renderer.h" | 7 | #include "audio_core/audio_renderer.h" |
| 8 | #include "audio_core/codec.h" | 8 | #include "audio_core/codec.h" |
| 9 | #include "audio_core/common.h" | ||
| 9 | #include "common/assert.h" | 10 | #include "common/assert.h" |
| 10 | #include "common/logging/log.h" | 11 | #include "common/logging/log.h" |
| 11 | #include "core/core.h" | 12 | #include "core/core.h" |
| @@ -79,7 +80,7 @@ AudioRenderer::AudioRenderer(Core::Timing::CoreTiming& core_timing, Core::Memory | |||
| 79 | std::size_t instance_number) | 80 | std::size_t instance_number) |
| 80 | : worker_params{params}, buffer_event{buffer_event}, voices(params.voice_count), | 81 | : worker_params{params}, buffer_event{buffer_event}, voices(params.voice_count), |
| 81 | effects(params.effect_count), memory{memory_} { | 82 | effects(params.effect_count), memory{memory_} { |
| 82 | 83 | behavior_info.SetUserRevision(params.revision); | |
| 83 | audio_out = std::make_unique<AudioCore::AudioOut>(); | 84 | audio_out = std::make_unique<AudioCore::AudioOut>(); |
| 84 | stream = audio_out->OpenStream(core_timing, STREAM_SAMPLE_RATE, STREAM_NUM_CHANNELS, | 85 | stream = audio_out->OpenStream(core_timing, STREAM_SAMPLE_RATE, STREAM_NUM_CHANNELS, |
| 85 | fmt::format("AudioRenderer-Instance{}", instance_number), | 86 | fmt::format("AudioRenderer-Instance{}", instance_number), |
| @@ -109,17 +110,17 @@ Stream::State AudioRenderer::GetStreamState() const { | |||
| 109 | return stream->GetState(); | 110 | return stream->GetState(); |
| 110 | } | 111 | } |
| 111 | 112 | ||
| 112 | static constexpr u32 VersionFromRevision(u32_le rev) { | 113 | ResultVal<std::vector<u8>> AudioRenderer::UpdateAudioRenderer(const std::vector<u8>& input_params) { |
| 113 | // "REV7" -> 7 | ||
| 114 | return ((rev >> 24) & 0xff) - 0x30; | ||
| 115 | } | ||
| 116 | |||
| 117 | std::vector<u8> AudioRenderer::UpdateAudioRenderer(const std::vector<u8>& input_params) { | ||
| 118 | // Copy UpdateDataHeader struct | 114 | // Copy UpdateDataHeader struct |
| 119 | UpdateDataHeader config{}; | 115 | UpdateDataHeader config{}; |
| 120 | std::memcpy(&config, input_params.data(), sizeof(UpdateDataHeader)); | 116 | std::memcpy(&config, input_params.data(), sizeof(UpdateDataHeader)); |
| 121 | u32 memory_pool_count = worker_params.effect_count + (worker_params.voice_count * 4); | 117 | u32 memory_pool_count = worker_params.effect_count + (worker_params.voice_count * 4); |
| 122 | 118 | ||
| 119 | if (!behavior_info.UpdateInput(input_params, sizeof(UpdateDataHeader))) { | ||
| 120 | LOG_ERROR(Audio, "Failed to update behavior info input parameters"); | ||
| 121 | return Audren::ERR_INVALID_PARAMETERS; | ||
| 122 | } | ||
| 123 | |||
| 123 | // Copy MemoryPoolInfo structs | 124 | // Copy MemoryPoolInfo structs |
| 124 | std::vector<MemoryPoolInfo> mem_pool_info(memory_pool_count); | 125 | std::vector<MemoryPoolInfo> mem_pool_info(memory_pool_count); |
| 125 | std::memcpy(mem_pool_info.data(), | 126 | std::memcpy(mem_pool_info.data(), |
| @@ -173,8 +174,7 @@ std::vector<u8> AudioRenderer::UpdateAudioRenderer(const std::vector<u8>& input_ | |||
| 173 | // Copy output header | 174 | // Copy output header |
| 174 | UpdateDataHeader response_data{worker_params}; | 175 | UpdateDataHeader response_data{worker_params}; |
| 175 | std::vector<u8> output_params(response_data.total_size); | 176 | std::vector<u8> output_params(response_data.total_size); |
| 176 | const auto audren_revision = VersionFromRevision(config.revision); | 177 | if (behavior_info.IsElapsedFrameCountSupported()) { |
| 177 | if (audren_revision >= 5) { | ||
| 178 | response_data.frame_count = 0x10; | 178 | response_data.frame_count = 0x10; |
| 179 | response_data.total_size += 0x10; | 179 | response_data.total_size += 0x10; |
| 180 | } | 180 | } |
| @@ -200,7 +200,19 @@ std::vector<u8> AudioRenderer::UpdateAudioRenderer(const std::vector<u8>& input_ | |||
| 200 | sizeof(EffectOutStatus)); | 200 | sizeof(EffectOutStatus)); |
| 201 | effect_out_status_offset += sizeof(EffectOutStatus); | 201 | effect_out_status_offset += sizeof(EffectOutStatus); |
| 202 | } | 202 | } |
| 203 | return output_params; | 203 | |
| 204 | // Update behavior info output | ||
| 205 | const std::size_t behavior_out_status_offset{ | ||
| 206 | sizeof(UpdateDataHeader) + response_data.memory_pools_size + response_data.voices_size + | ||
| 207 | response_data.effects_size + response_data.sinks_size + | ||
| 208 | response_data.performance_manager_size}; | ||
| 209 | |||
| 210 | if (!behavior_info.UpdateOutput(output_params, behavior_out_status_offset)) { | ||
| 211 | LOG_ERROR(Audio, "Failed to update behavior info output parameters"); | ||
| 212 | return Audren::ERR_INVALID_PARAMETERS; | ||
| 213 | } | ||
| 214 | |||
| 215 | return MakeResult(output_params); | ||
| 204 | } | 216 | } |
| 205 | 217 | ||
| 206 | void AudioRenderer::VoiceState::SetWaveIndex(std::size_t index) { | 218 | void AudioRenderer::VoiceState::SetWaveIndex(std::size_t index) { |