From e3a8d32e4ad9ccd0894383d8c6dc17f574b53756 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 5 Apr 2020 13:29:04 +1000 Subject: [PATCH] audiorenderer: fill destination buffer with zeroes before copying samples over Ensures no uninitialized values end up in the audio cache. --- app/codec/samplebuffer.cpp | 43 ++++++++++++++++++++++++ app/codec/samplebuffer.h | 7 ++++ app/render/backend/audiorenderworker.cpp | 34 ++++++------------- 3 files changed, 61 insertions(+), 23 deletions(-) diff --git a/app/codec/samplebuffer.cpp b/app/codec/samplebuffer.cpp index 944649862..54306e8cf 100644 --- a/app/codec/samplebuffer.cpp +++ b/app/codec/samplebuffer.cpp @@ -86,6 +86,11 @@ float **SampleBuffer::data() return data_; } +const float **SampleBuffer::const_data() const +{ + return const_cast(data_); +} + float *SampleBuffer::channel_data(int channel) { return data_[channel]; @@ -166,6 +171,44 @@ void SampleBuffer::speed(double speed) data_ = output_data; } +void SampleBuffer::fill(const float &f) +{ + fill(f, 0, sample_count_per_channel_); +} + +void SampleBuffer::fill(const float &f, int start_sample, int end_sample) +{ + if (!is_allocated()) { + qWarning() << "Tried to fill an unallocated sample buffer"; + return; + } + + for (int i=0;ifill(0); NodeValueTable merged_table; @@ -44,17 +45,17 @@ NodeValueTable AudioRenderWorker::RenderBlock(const TrackOutput *track, const Ti TimeRange range_for_block(qMax(b->in(), range.in()), qMin(b->out(), range.out())); + int destination_offset = audio_params_.time_to_samples(range_for_block.in() - range.in()); + int max_dest_sz = audio_params_.time_to_samples(range_for_block.length()); + // Destination buffer NodeValueTable table = ProcessNode(NodeDependency(b, range_for_block)); QVariant sample_val = table.Take(NodeParam::kSamples); + SampleBufferPtr samples_from_this_block; - if (sample_val.isNull()) { - continue; - } - - SampleBufferPtr samples_from_this_block = sample_val.value(); - - if (!samples_from_this_block) { + if (sample_val.isNull() + || !(samples_from_this_block = sample_val.value())) { + // If we retrieved no samples from this block, do nothing continue; } @@ -70,23 +71,10 @@ NodeValueTable AudioRenderWorker::RenderBlock(const TrackOutput *track, const Ti samples_from_this_block->reverse(); } - 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 actual_copy_size = qMin(max_dest_sz, static_cast(samples_from_this_block->sample_count_per_channel() * sizeof(float))); + int copy_length = qMin(max_dest_sz, samples_from_this_block->sample_count_per_channel()); - for (int i=0;i(block_range_buffer->data()[i]) + destination_offset; - - if (actual_copy_size > 0) { - memcpy(dst_ptr, - samples_from_this_block->data()[i], - actual_copy_size); - } - - if (actual_copy_size < max_dest_sz) { - memset(dst_ptr + actual_copy_size, 0, max_dest_sz - actual_copy_size); - } - } + // Copy samples into destination buffer + block_range_buffer->set(samples_from_this_block->const_data(), destination_offset, copy_length); { // Save waveform to file