From fb410e7c960483ad0f6bf2818a47d0fe4c1c6d8a Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Wed, 17 Mar 2021 11:54:14 +1100 Subject: [PATCH] use vectors for sample buffers rather than raw ptr arrays --- app/audio/audiovisualwaveform.cpp | 2 +- app/codec/samplebuffer.cpp | 86 ++++--------------- app/codec/samplebuffer.h | 27 +++--- app/node/audio/pan/pan.cpp | 6 +- .../crossdissolve/crossdissolvetransition.cpp | 6 +- app/node/math/math/mathbase.cpp | 10 +-- app/render/renderprocessor.cpp | 4 +- 7 files changed, 48 insertions(+), 93 deletions(-) diff --git a/app/audio/audiovisualwaveform.cpp b/app/audio/audiovisualwaveform.cpp index ec99aed9d..4063d413a 100644 --- a/app/audio/audiovisualwaveform.cpp +++ b/app/audio/audiovisualwaveform.cpp @@ -200,7 +200,7 @@ QVector AudioVisualWaveform::SumSamples(S for (int i=start_index; iaudio_params().channel_count(); channel++) { - ExpandMinMax(summed_samples[channel], samples->data()[channel][i]); + ExpandMinMax(summed_samples[channel], samples->data(channel)[i]); } } diff --git a/app/codec/samplebuffer.cpp b/app/codec/samplebuffer.cpp index dc5f3ffb8..22c2088cf 100644 --- a/app/codec/samplebuffer.cpp +++ b/app/codec/samplebuffer.cpp @@ -23,16 +23,10 @@ namespace olive { SampleBuffer::SampleBuffer() : - sample_count_per_channel_(0), - data_(nullptr) + sample_count_per_channel_(0) { } -SampleBuffer::~SampleBuffer() -{ - destroy(); -} - SampleBufferPtr SampleBuffer::Create() { return std::make_shared(); @@ -85,7 +79,7 @@ const AudioParams &SampleBuffer::audio_params() const void SampleBuffer::set_audio_params(const AudioParams ¶ms) { - if (data_) { + if (is_allocated()) { qWarning() << "Tried to set parameters on allocated sample buffer"; return; } @@ -100,7 +94,7 @@ const int &SampleBuffer::sample_count() const void SampleBuffer::set_sample_count(const int &sample_count) { - if (data_) { + if (is_allocated()) { qWarning() << "Tried to set sample count on allocated sample buffer"; return; } @@ -108,24 +102,9 @@ void SampleBuffer::set_sample_count(const int &sample_count) sample_count_per_channel_ = sample_count; } -float **SampleBuffer::data() -{ - return data_; -} - -const float **SampleBuffer::const_data() const -{ - return const_cast(data_); -} - -float *SampleBuffer::channel_data(int channel) -{ - return data_[channel]; -} - bool SampleBuffer::is_allocated() const { - return data_; + return !data_.isEmpty(); } void SampleBuffer::allocate() @@ -140,17 +119,20 @@ void SampleBuffer::allocate() return; } - if (data_) { + if (is_allocated()) { qWarning() << "Tried to allocate already allocated sample buffer"; return; } - allocate_sample_buffer(&data_, audio_params_.channel_count(), sample_count_per_channel_); + data_.resize(audio_params_.channel_count()); + for (int i=0; i(sample_count_per_channel_) / speed); - float** input_data = data_; - float** output_data; + QVector< QVector > output_data; - allocate_sample_buffer(&output_data, audio_params_.channel_count(), sample_count_per_channel_); + output_data.resize(audio_params_.channel_count()); + for (int i=0; i(i) * speed); for (int j=0;j 0); - - *data = new float* [nb_channels]; - - for (int i=0;i > data_; }; diff --git a/app/node/audio/pan/pan.cpp b/app/node/audio/pan/pan.cpp index ab8256df2..fe13b6e40 100644 --- a/app/node/audio/pan/pan.cpp +++ b/app/node/audio/pan/pan.cpp @@ -103,13 +103,13 @@ void PanNode::ProcessSamples(NodeValueDatabase &values, const SampleBufferPtr in float pan_val = values[kPanningInput].Get(NodeValue::kFloat).toFloat(); for (int i=0;iaudio_params().channel_count();i++) { - output->data()[i][index] = input->data()[i][index]; + output->data(i)[index] = input->data(i)[index]; } if (pan_val > 0) { - output->data()[0][index] *= (1.0F - pan_val); + output->data(0)[index] *= (1.0F - pan_val); } else if (pan_val < 0) { - output->data()[1][index] *= (1.0F - qAbs(pan_val)); + output->data(1)[index] *= (1.0F - qAbs(pan_val)); } } diff --git a/app/node/block/transition/crossdissolve/crossdissolvetransition.cpp b/app/node/block/transition/crossdissolve/crossdissolvetransition.cpp index 55f823e5b..9ae2d02e2 100644 --- a/app/node/block/transition/crossdissolve/crossdissolvetransition.cpp +++ b/app/node/block/transition/crossdissolve/crossdissolvetransition.cpp @@ -73,11 +73,11 @@ void CrossDissolveTransition::SampleJobEvent(SampleBufferPtr from_samples, Sampl double progress = GetTotalProgress(this_sample_time); for (int j=0; jaudio_params().channel_count(); j++) { - out_samples->data()[j][i] = 0; + out_samples->data(j)[i] = 0; if (from_samples) { if (i < from_samples->sample_count()) { - out_samples->data()[j][i] += from_samples->data()[j][i] * TransformCurve(1.0 - progress); + out_samples->data(j)[i] += from_samples->data(j)[i] * TransformCurve(1.0 - progress); } } @@ -86,7 +86,7 @@ void CrossDissolveTransition::SampleJobEvent(SampleBufferPtr from_samples, Sampl int in_index = i - (out_samples->sample_count() - to_samples->sample_count()); if (in_index >= 0) { - out_samples->data()[j][i] += to_samples->data()[j][in_index] * TransformCurve(progress); + out_samples->data(j)[i] += to_samples->data(j)[in_index] * TransformCurve(progress); } } } diff --git a/app/node/math/math/mathbase.cpp b/app/node/math/math/mathbase.cpp index 172b17db7..6b5ff658e 100644 --- a/app/node/math/math/mathbase.cpp +++ b/app/node/math/math/mathbase.cpp @@ -260,7 +260,7 @@ NodeValueTable MathNodeBase::ValueInternal(NodeValueDatabase &value, Operation o for (int i=0;iaudio_params().channel_count();i++) { // Mix samples that are in both buffers for (int j=0;jdata()[i][j] = PerformAll(operation, samples_a->data()[i][j], samples_b->data()[i][j]); + mixed_samples->data(i)[j] = PerformAll(operation, samples_a->data(i)[j], samples_b->data(i)[j]); } } @@ -271,8 +271,8 @@ NodeValueTable MathNodeBase::ValueInternal(NodeValueDatabase &value, Operation o SampleBufferPtr larger_buffer = (max_samples == samples_a->sample_count()) ? samples_a : samples_b; for (int i=0;iaudio_params().channel_count();i++) { - memcpy(&mixed_samples->data()[i][min_samples], - &larger_buffer->data()[i][min_samples], + memcpy(&mixed_samples->data(i)[min_samples], + &larger_buffer->data(i)[min_samples], remainder * sizeof(float)); } } @@ -354,7 +354,7 @@ NodeValueTable MathNodeBase::ValueInternal(NodeValueDatabase &value, Operation o if (!NumberIsNoOp(operation, number)) { for (int i=0;iaudio_params().channel_count();i++) { for (int j=0;jsample_count();j++) { - job.samples()->data()[i][j] = PerformAll(operation, job.samples()->data()[i][j], number); + job.samples()->data(i)[j] = PerformAll(operation, job.samples()->data(i)[j], number); } } } @@ -391,7 +391,7 @@ void MathNodeBase::ProcessSamplesInternal(NodeValueDatabase &values, MathNodeBas float number_flt = RetrieveNumber(number_val); for (int i=0;iaudio_params().channel_count();i++) { - output->data()[i][index] = PerformAll(operation, input->data()[i][index], number_flt); + output->data(i)[index] = PerformAll(operation, input->data(i)[index], number_flt); } } diff --git a/app/render/renderprocessor.cpp b/app/render/renderprocessor.cpp index 994faac6a..a5b08019d 100644 --- a/app/render/renderprocessor.cpp +++ b/app/render/renderprocessor.cpp @@ -236,7 +236,9 @@ NodeValueTable RenderProcessor::GenerateBlockTable(const Track *track, const Tim int copy_length = qMin(max_dest_sz, samples_from_this_block->sample_count()); // Copy samples into destination buffer - block_range_buffer->set(samples_from_this_block->const_data(), destination_offset, copy_length); + for (int i=0; iaudio_params().channel_count(); i++) { + block_range_buffer->set(i, samples_from_this_block->data(i), destination_offset, copy_length); + } NodeValueTable::Merge({merged_table, table}); }