audiovisualwaveform: fixed bug that would make all channels the same

This commit is contained in:
itsmattkc
2020-06-12 03:27:00 +10:00
parent bad60fc5f0
commit ffebe70a65
2 changed files with 37 additions and 54 deletions
+35 -49
View File
@@ -28,15 +28,6 @@ OLIVE_NAMESPACE_ENTER
const int AudioVisualWaveform::kSumSampleRate = 200; 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) void AudioVisualWaveform::AddSum(const float *samples, int nb_samples, int nb_channels)
{ {
data_.append(SumSamples(samples, nb_samples, 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"; 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<double>(samples->sample_count()) / static_cast<double>(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<samples_length; i+=channels_) {
int src_index = (i * chunk_size) / channels_;
QVector<SamplePerChannel> 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) void AudioVisualWaveform::OverwriteSums(const AudioVisualWaveform &sums, const rational &dest, const rational& offset, const rational& length)
@@ -182,9 +193,9 @@ QVector<AudioVisualWaveform::SamplePerChannel> AudioVisualWaveform::SumSamples(S
int end_index = start_index + length; int end_index = start_index + length;
for (int i=start_index;i<end_index;i++) { for (int i=start_index; i<end_index; i++) {
for (int channel=0;channel<samples->audio_params().channel_count();channel++) { for (int channel=0; channel<samples->audio_params().channel_count(); channel++) {
ClampMinMax<float>(summed_samples[channel], samples->data()[channel][i]); ExpandMinMax<float>(summed_samples[channel], samples->data()[channel][i]);
} }
} }
@@ -197,17 +208,17 @@ QVector<AudioVisualWaveform::SamplePerChannel> AudioVisualWaveform::ReSumSamples
{ {
QVector<AudioVisualWaveform::SamplePerChannel> summed_samples(nb_channels); QVector<AudioVisualWaveform::SamplePerChannel> summed_samples(nb_channels);
for (int i=0;i<nb_samples;i++) { for (int i=0;i<nb_samples;i+=nb_channels) {
int channel = i%nb_channels; for (int j=0;j<nb_channels;j++) {
const AudioVisualWaveform::SamplePerChannel& sample = samples[i + j];
const AudioVisualWaveform::SamplePerChannel& sample = samples[i]; if (sample.min < summed_samples[j].min) {
summed_samples[j].min = sample.min;
}
if (sample.min < summed_samples[channel].min) { if (sample.max > summed_samples[j].max) {
summed_samples[channel].min = sample.min; summed_samples[j].max = sample.max;
} }
if (sample.max > summed_samples[channel].max) {
summed_samples[channel].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<double>(samples->sample_count()) / static_cast<double>(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<samples_length; i++) {
int src_index = (i * chunk_size) / channels_;
QVector<SamplePerChannel> 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 int AudioVisualWaveform::time_to_samples(const rational &time) const
{ {
return time_to_samples(time.toDouble()); return time_to_samples(time.toDouble());
@@ -322,14 +308,14 @@ QVector<AudioVisualWaveform::SamplePerChannel> AudioVisualWaveform::SumSamplesIn
QVector<AudioVisualWaveform::SamplePerChannel> summed_samples(nb_channels); QVector<AudioVisualWaveform::SamplePerChannel> summed_samples(nb_channels);
for (int i=0;i<nb_samples;i++) { for (int i=0;i<nb_samples;i++) {
ClampMinMax<T>(summed_samples[i%nb_channels], samples[i]); ExpandMinMax<T>(summed_samples[i%nb_channels], samples[i]);
} }
return summed_samples; return summed_samples;
} }
template<typename T> template<typename T>
void AudioVisualWaveform::ClampMinMax(AudioVisualWaveform::SamplePerChannel &sum, T value) void AudioVisualWaveform::ExpandMinMax(AudioVisualWaveform::SamplePerChannel &sum, T value)
{ {
if (value < sum.min) { if (value < sum.min) {
sum.min = value; sum.min = value;
+2 -5
View File
@@ -66,10 +66,9 @@ public:
return data_.constData(); return data_.constData();
} }
void AddSamples(SampleBufferPtr samples, int sample_rate);
void AddSum(const float* samples, int nb_samples, int nb_channels); 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()); void OverwriteSums(const AudioVisualWaveform& sums, const rational& dest, const rational& offset = rational(), const rational &length = rational());
AudioVisualWaveform Mid(const rational& time) const; AudioVisualWaveform Mid(const rational& time) const;
@@ -98,9 +97,7 @@ private:
static QVector<SamplePerChannel> SumSamplesInternal(const T* samples, int nb_samples, int nb_channels); static QVector<SamplePerChannel> SumSamplesInternal(const T* samples, int nb_samples, int nb_channels);
template <typename T> template <typename T>
static void ClampMinMax(SamplePerChannel &sum, T value); static void ExpandMinMax(SamplePerChannel &sum, T value);
void overwrite_samples_internal(SampleBufferPtr samples, int sample_rate, int start_index);
int time_to_samples(const rational& time) const; int time_to_samples(const rational& time) const;
int time_to_samples(const double& time) const; int time_to_samples(const double& time) const;