From 74e36bc99db375f96462b95d6e627d805af59f8d Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Wed, 1 Apr 2020 05:20:56 +1100 Subject: [PATCH] audiorenderworker: fixed segfault in audiorenderworker Switches memset/memcpy pointers to a char* pointer specifically to work on the byte level rather than the float* level. --- app/render/backend/audiorenderworker.cpp | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/app/render/backend/audiorenderworker.cpp b/app/render/backend/audiorenderworker.cpp index d251f6054..967eac51b 100644 --- a/app/render/backend/audiorenderworker.cpp +++ b/app/render/backend/audiorenderworker.cpp @@ -54,6 +54,10 @@ NodeValueTable AudioRenderWorker::RenderBlock(const TrackOutput *track, const Ti SampleBufferPtr samples_from_this_block = sample_val.value(); + if (!samples_from_this_block) { + continue; + } + // Stretch samples here rational abs_speed = qAbs(b->speed()); @@ -68,16 +72,17 @@ NodeValueTable AudioRenderWorker::RenderBlock(const TrackOutput *track, const Ti int destination_offset = audio_params_.time_to_samples(range_for_block.in() - range.in()) * sizeof(float); int max_dest_sz = audio_params_.time_to_samples(range_for_block.length()) * sizeof(float); - int input_sz = samples_from_this_block->sample_count_per_channel() * sizeof(float); - int actual_copy_size = qMin(max_dest_sz, input_sz); + int actual_copy_size = qMin(max_dest_sz, static_cast(samples_from_this_block->sample_count_per_channel() * sizeof(float))); for (int i=0;idata()[i] + destination_offset, + char* dst_ptr = reinterpret_cast(block_range_buffer->data()[i]) + destination_offset; + + memcpy(dst_ptr, samples_from_this_block->data()[i], actual_copy_size); - if (input_sz < max_dest_sz) { - memset(block_range_buffer->data()[i] + destination_offset + input_sz, 0, max_dest_sz - input_sz); + if (actual_copy_size < max_dest_sz) { + memset(dst_ptr + actual_copy_size, 0, max_dest_sz - actual_copy_size); } }