From 558d849d277d0e485560aca09693d0ddc08a5451 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 8 Jul 2021 11:55:35 -0700 Subject: [PATCH 1/3] waveform: flip Y axis Fixes #1666 --- app/audio/audiovisualwaveform.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/audio/audiovisualwaveform.cpp b/app/audio/audiovisualwaveform.cpp index 277fa1c04..8905934ee 100644 --- a/app/audio/audiovisualwaveform.cpp +++ b/app/audio/audiovisualwaveform.cpp @@ -318,10 +318,12 @@ void AudioVisualWaveform::DrawSample(QPainter *painter, const Sample& sample, in } else { int channel_mid = y + channel_height * i + channel_half_height; + // We subtract the sample so that positive Y values go up on the screen rather than down, + // which is how waveforms are usually rendered painter->drawLine(x, - channel_mid + qRound(min * static_cast(channel_half_height)), + channel_mid - qRound(min * static_cast(channel_half_height)), x, - channel_mid + qRound(max * static_cast(channel_half_height))); + channel_mid - qRound(max * static_cast(channel_half_height))); } } } From 1f0de6c5bb725b3e07358a8666c6cb849b0797ce Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 8 Jul 2021 12:08:05 -0700 Subject: [PATCH 2/3] waveform: fixed precision issue when generating from sample data Fixes #1664 --- app/audio/audiovisualwaveform.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/app/audio/audiovisualwaveform.cpp b/app/audio/audiovisualwaveform.cpp index 8905934ee..e53d0edd8 100644 --- a/app/audio/audiovisualwaveform.cpp +++ b/app/audio/audiovisualwaveform.cpp @@ -49,14 +49,15 @@ void AudioVisualWaveform::OverwriteSamplesFromBuffer(SampleBufferPtr samples, in data.resize(end_index); } - int chunk_size = sample_rate / target_rate; + double chunk_size = double(sample_rate) / double(target_rate); for (int i=0; isample_count()); Sample summary = SumSamples(samples, - src_index, - qMin(chunk_size, samples->sample_count() - src_index)); + src_start, + src_end - src_start); memcpy(&data.data()[i + start_index], summary.constData(), From 75c102d351e84ed92d75d874e608d6958c2e1037 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 8 Jul 2021 12:19:27 -0700 Subject: [PATCH 3/3] waveform: minor corrections --- app/audio/audiovisualwaveform.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/audio/audiovisualwaveform.cpp b/app/audio/audiovisualwaveform.cpp index e53d0edd8..24a735fc5 100644 --- a/app/audio/audiovisualwaveform.cpp +++ b/app/audio/audiovisualwaveform.cpp @@ -52,8 +52,8 @@ void AudioVisualWaveform::OverwriteSamplesFromBuffer(SampleBufferPtr samples, in double chunk_size = double(sample_rate) / double(target_rate); for (int i=0; isample_count()); + int src_start = qRound((double(i) * chunk_size)) / channels_; + int src_end = qMin(qRound((double(i + channels_) * chunk_size)) / channels_, samples->sample_count()); Sample summary = SumSamples(samples, src_start, @@ -75,6 +75,7 @@ void AudioVisualWaveform::OverwriteSamplesFromMipmap(const AudioVisualWaveform:: output_data.resize(end_index); } + // We guarantee mipmaps are powers of two so integer division should be perfectly accurate here int chunk_size = input_sample_rate / output_rate; for (int i=0; i