summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar liamwhite2022-11-25 12:53:29 -0500
committerGravatar GitHub2022-11-25 12:53:29 -0500
commite16d1b85f1ba52955e67f6832f15499f230f3f31 (patch)
tree3c864bce66d9f37bea092a72204ab737fbc80b67
parentMerge pull request #9302 from liamwhite/why-are-we-still-using-ado (diff)
parentUse the maximum input index for samples buffer span size, not just the input ... (diff)
downloadyuzu-e16d1b85f1ba52955e67f6832f15499f230f3f31.tar.gz
yuzu-e16d1b85f1ba52955e67f6832f15499f230f3f31.tar.xz
yuzu-e16d1b85f1ba52955e67f6832f15499f230f3f31.zip
Merge pull request #9297 from Kelebek1/sink_oob
[audio_core] Fix an OoB with sample sinking
-rw-r--r--src/audio_core/renderer/command/command_buffer.cpp14
1 files changed, 8 insertions, 6 deletions
diff --git a/src/audio_core/renderer/command/command_buffer.cpp b/src/audio_core/renderer/command/command_buffer.cpp
index 2ef879ee1..8c6fe97e7 100644
--- a/src/audio_core/renderer/command/command_buffer.cpp
+++ b/src/audio_core/renderer/command/command_buffer.cpp
@@ -460,21 +460,23 @@ void CommandBuffer::GenerateDeviceSinkCommand(const s32 node_id, const s16 buffe
460 460
461 cmd.session_id = session_id; 461 cmd.session_id = session_id;
462 462
463 cmd.input_count = parameter.input_count;
464 s16 max_input{0};
465 for (u32 i = 0; i < parameter.input_count; i++) {
466 cmd.inputs[i] = buffer_offset + parameter.inputs[i];
467 max_input = std::max(max_input, cmd.inputs[i]);
468 }
469
463 if (state.upsampler_info != nullptr) { 470 if (state.upsampler_info != nullptr) {
464 const auto size_{state.upsampler_info->sample_count * parameter.input_count}; 471 const auto size_{state.upsampler_info->sample_count * parameter.input_count};
465 const auto size_bytes{size_ * sizeof(s32)}; 472 const auto size_bytes{size_ * sizeof(s32)};
466 const auto addr{memory_pool->Translate(state.upsampler_info->samples_pos, size_bytes)}; 473 const auto addr{memory_pool->Translate(state.upsampler_info->samples_pos, size_bytes)};
467 cmd.sample_buffer = {reinterpret_cast<s32*>(addr), 474 cmd.sample_buffer = {reinterpret_cast<s32*>(addr),
468 parameter.input_count * state.upsampler_info->sample_count}; 475 (max_input + 1) * state.upsampler_info->sample_count};
469 } else { 476 } else {
470 cmd.sample_buffer = samples_buffer; 477 cmd.sample_buffer = samples_buffer;
471 } 478 }
472 479
473 cmd.input_count = parameter.input_count;
474 for (u32 i = 0; i < parameter.input_count; i++) {
475 cmd.inputs[i] = buffer_offset + parameter.inputs[i];
476 }
477
478 GenerateEnd<DeviceSinkCommand>(cmd); 480 GenerateEnd<DeviceSinkCommand>(cmd);
479} 481}
480 482