From ffebe70a6568e2a2d2d900525b02cbb139b31e63 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Fri, 12 Jun 2020 03:27:00 +1000 Subject: [PATCH] audiovisualwaveform: fixed bug that would make all channels the same --- app/audio/audiovisualwaveform.cpp | 84 +++++++++++++------------------ app/audio/audiovisualwaveform.h | 7 +-- 2 files changed, 37 insertions(+), 54 deletions(-) diff --git a/app/audio/audiovisualwaveform.cpp b/app/audio/audiovisualwaveform.cpp index bbad71e74..3beeb2cbb 100644 --- a/app/audio/audiovisualwaveform.cpp +++ b/app/audio/audiovisualwaveform.cpp @@ -28,15 +28,6 @@ OLIVE_NAMESPACE_ENTER const int AudioVisualWaveform::kSumSampleRate = 200; -void AudioVisualWaveform::AddSamples(SampleBufferPtr samples, int sample_rate) -{ - if (!channels_) { - qWarning() << "Failed to write samples - channel count is zero"; - } - - overwrite_samples_internal(samples, sample_rate, 0); -} - void AudioVisualWaveform::AddSum(const float *samples, int nb_samples, int nb_channels) { data_.append(SumSamples(samples, nb_samples, nb_channels)); @@ -48,7 +39,27 @@ void AudioVisualWaveform::OverwriteSamples(SampleBufferPtr samples, int sample_r qWarning() << "Failed to write samples - channel count is zero"; } - overwrite_samples_internal(samples, sample_rate, time_to_samples(start)); + int start_index = time_to_samples(start); + int samples_length = time_to_samples(static_cast(samples->sample_count()) / static_cast(sample_rate)); + + int end_index = start_index + samples_length; + if (data_.size() < end_index) { + data_.resize(end_index); + } + + int chunk_size = sample_rate / kSumSampleRate; + + for (int i=0; i summary = SumSamples(samples, + src_index, + qMin(chunk_size, samples->sample_count() - src_index)); + + memcpy(&data_.data()[i + start_index], + summary.constData(), + summary.size() * sizeof(SamplePerChannel)); + } } void AudioVisualWaveform::OverwriteSums(const AudioVisualWaveform &sums, const rational &dest, const rational& offset, const rational& length) @@ -182,9 +193,9 @@ QVector AudioVisualWaveform::SumSamples(S int end_index = start_index + length; - for (int i=start_index;iaudio_params().channel_count();channel++) { - ClampMinMax(summed_samples[channel], samples->data()[channel][i]); + for (int i=start_index; iaudio_params().channel_count(); channel++) { + ExpandMinMax(summed_samples[channel], samples->data()[channel][i]); } } @@ -197,17 +208,17 @@ QVector AudioVisualWaveform::ReSumSamples { QVector summed_samples(nb_channels); - for (int i=0;i summed_samples[channel].max) { - summed_samples[channel].max = sample.max; + if (sample.max > summed_samples[j].max) { + summed_samples[j].max = sample.max; + } } } @@ -281,31 +292,6 @@ void AudioVisualWaveform::DrawWaveform(QPainter *painter, const QRect& rect, con } } -void AudioVisualWaveform::overwrite_samples_internal(SampleBufferPtr samples, int sample_rate, int start_index) -{ - int samples_length = time_to_samples(static_cast(samples->sample_count()) / static_cast(sample_rate)); - - int end_index = start_index + samples_length; - if (data_.size() < end_index) { - data_.resize(end_index); - } - - int chunk_size = sample_rate / kSumSampleRate; - - for (int i=0; i summary = SumSamples(samples, - src_index, - qMin(chunk_size, samples->sample_count() - src_index)); - - memcpy(&data_.data()[i + start_index], - summary.constData(), - summary.size() * sizeof(SamplePerChannel)); - } -} - int AudioVisualWaveform::time_to_samples(const rational &time) const { return time_to_samples(time.toDouble()); @@ -322,14 +308,14 @@ QVector AudioVisualWaveform::SumSamplesIn QVector summed_samples(nb_channels); for (int i=0;i(summed_samples[i%nb_channels], samples[i]); + ExpandMinMax(summed_samples[i%nb_channels], samples[i]); } return summed_samples; } template -void AudioVisualWaveform::ClampMinMax(AudioVisualWaveform::SamplePerChannel &sum, T value) +void AudioVisualWaveform::ExpandMinMax(AudioVisualWaveform::SamplePerChannel &sum, T value) { if (value < sum.min) { sum.min = value; diff --git a/app/audio/audiovisualwaveform.h b/app/audio/audiovisualwaveform.h index 27b240efe..1273c576d 100644 --- a/app/audio/audiovisualwaveform.h +++ b/app/audio/audiovisualwaveform.h @@ -66,10 +66,9 @@ public: return data_.constData(); } - void AddSamples(SampleBufferPtr samples, int sample_rate); void AddSum(const float* samples, int nb_samples, int nb_channels); - void OverwriteSamples(SampleBufferPtr samples, int sample_rate, const rational& start); + void OverwriteSamples(SampleBufferPtr samples, int sample_rate, const rational& start = rational()); void OverwriteSums(const AudioVisualWaveform& sums, const rational& dest, const rational& offset = rational(), const rational &length = rational()); AudioVisualWaveform Mid(const rational& time) const; @@ -98,9 +97,7 @@ private: static QVector SumSamplesInternal(const T* samples, int nb_samples, int nb_channels); template - static void ClampMinMax(SamplePerChannel &sum, T value); - - void overwrite_samples_internal(SampleBufferPtr samples, int sample_rate, int start_index); + static void ExpandMinMax(SamplePerChannel &sum, T value); int time_to_samples(const rational& time) const; int time_to_samples(const double& time) const;