From 0363ee6d16a87f6997eb0add12c6162dcb3da5ba Mon Sep 17 00:00:00 2001 From: Lisa Magdalena Riedler Date: Sun, 6 Oct 2024 11:26:57 +0200 Subject: [PATCH] fix various AudioFileProcessor bugs (#7533) * fix out-of-bounds crash in AudioFileProcessor by correctly setting m_from and m_to without them interfering with each other * fixed flattened wave caused by inaccurate math see PR for before/after * simply stop drawing AFP waveform when there's no more data this fixes the single point at the end of waveforms that sometimes shows up * fixed seemingly insignificant type confusion (?) execution seemed fine but my debugger started freaking out, and if gdb is telling me I got a negative-sized vector, I'd rather fix this issue than speculate "it's probably fine" * fixed data offset for AFP waveform vis the data itself isn't reversed, so we have to account for that --- .../AudioFileProcessor/AudioFileProcessorWaveView.cpp | 8 ++++++-- src/gui/SampleWaveform.cpp | 11 ++++------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/plugins/AudioFileProcessor/AudioFileProcessorWaveView.cpp b/plugins/AudioFileProcessor/AudioFileProcessorWaveView.cpp index 7c5f9387eec..b41af33e016 100644 --- a/plugins/AudioFileProcessor/AudioFileProcessorWaveView.cpp +++ b/plugins/AudioFileProcessor/AudioFileProcessorWaveView.cpp @@ -338,10 +338,12 @@ void AudioFileProcessorWaveView::updateGraph() m_graph.fill(Qt::transparent); QPainter p(&m_graph); p.setPen(QColor(255, 255, 255)); + + const auto dataOffset = m_reversed ? m_sample->sampleSize() - m_to : m_from; const auto rect = QRect{0, 0, m_graph.width(), m_graph.height()}; const auto waveform = SampleWaveform::Parameters{ - m_sample->data() + m_from, static_cast(range()), m_sample->amplification(), m_sample->reversed()}; + m_sample->data() + dataOffset, static_cast(range()), m_sample->amplification(), m_sample->reversed()}; SampleWaveform::visualize(waveform, p, rect); } @@ -467,9 +469,11 @@ void AudioFileProcessorWaveView::reverse() - m_sample->endFrame() - m_sample->startFrame() ); + + const int fromTmp = m_from; setFrom(m_sample->sampleSize() - m_to); - setTo(m_sample->sampleSize() - m_from); + setTo(m_sample->sampleSize() - fromTmp); m_reversed = ! m_reversed; } diff --git a/src/gui/SampleWaveform.cpp b/src/gui/SampleWaveform.cpp index ca356e72713..165ede4ee89 100644 --- a/src/gui/SampleWaveform.cpp +++ b/src/gui/SampleWaveform.cpp @@ -44,12 +44,12 @@ void SampleWaveform::visualize(Parameters parameters, QPainter& painter, const Q const float resolution = std::max(1.0f, framesPerPixel / maxFramesPerPixel); const float framesPerResolution = framesPerPixel / resolution; - const size_t numPixels = std::min(parameters.size, width); + size_t numPixels = std::min(parameters.size, static_cast(width)); auto min = std::vector(numPixels, 1); auto max = std::vector(numPixels, -1); auto squared = std::vector(numPixels, 0); - const size_t maxFrames = numPixels * static_cast(framesPerPixel); + const size_t maxFrames = static_cast(numPixels * framesPerPixel); auto pixelIndex = std::size_t{0}; @@ -67,12 +67,9 @@ void SampleWaveform::visualize(Parameters parameters, QPainter& painter, const Q squared[pixelIndex] += value * value; } - while (pixelIndex < numPixels) + if (pixelIndex < numPixels) { - max[pixelIndex] = 0.0; - min[pixelIndex] = 0.0; - - pixelIndex++; + numPixels = pixelIndex; } for (auto i = std::size_t{0}; i < numPixels; i++)