From 03d067b10574a0e61d38036f56f0d7c2564808f5 Mon Sep 17 00:00:00 2001 From: Michael Gregorius Date: Sat, 24 Feb 2024 11:05:54 +0100 Subject: [PATCH] Fix crash in Audio File Processor (#7124) * Fix crash in Audio File Processor Fix a crash in the Audio File Processor that occurs when an Audio File Processor with a reversed sample is loaded from a save file and then the plugin window is opened. The problem was caused by a call to `AudioFileProcessorWaveView::slideSampleByFrames` during the execution of constructor of `AudioFileProcessorWaveView`. In that situation the three `knob` members were all `nullptr` because for some reason there was an explicit setter for them which was only called after construction. This is fixed by passing and setting the knobs in the constructor. Another question is if it's not a problem in the first place that the knobs are given to the `AudioFileProcessorWaveView` instead of their underlying models. --- .../AudioFileProcessorView.cpp | 6 +-- .../AudioFileProcessorWaveView.cpp | 37 +++++++++---------- .../AudioFileProcessorWaveView.h | 6 ++- 3 files changed, 25 insertions(+), 24 deletions(-) diff --git a/plugins/AudioFileProcessor/AudioFileProcessorView.cpp b/plugins/AudioFileProcessor/AudioFileProcessorView.cpp index 43882222f..d16b1d019 100644 --- a/plugins/AudioFileProcessor/AudioFileProcessorView.cpp +++ b/plugins/AudioFileProcessor/AudioFileProcessorView.cpp @@ -184,12 +184,12 @@ void AudioFileProcessorView::newWaveView() delete m_waveView; m_waveView = 0; } - m_waveView = new AudioFileProcessorWaveView(this, 245, 75, &castModel()->sample()); - m_waveView->move(2, 172); - m_waveView->setKnobs( + m_waveView = new AudioFileProcessorWaveView(this, 245, 75, &castModel()->sample(), dynamic_cast(m_startKnob), dynamic_cast(m_endKnob), dynamic_cast(m_loopKnob)); + m_waveView->move(2, 172); + m_waveView->show(); } diff --git a/plugins/AudioFileProcessor/AudioFileProcessorWaveView.cpp b/plugins/AudioFileProcessor/AudioFileProcessorWaveView.cpp index f130ca41c..507c4e7c0 100644 --- a/plugins/AudioFileProcessor/AudioFileProcessorWaveView.cpp +++ b/plugins/AudioFileProcessor/AudioFileProcessorWaveView.cpp @@ -65,7 +65,8 @@ f_cnt_t AudioFileProcessorWaveView::range() const return m_to - m_from; } -AudioFileProcessorWaveView::AudioFileProcessorWaveView(QWidget * parent, int w, int h, Sample const * buf) : +AudioFileProcessorWaveView::AudioFileProcessorWaveView(QWidget* parent, int w, int h, Sample const* buf, + knob* start, knob* end, knob* loop) : QWidget(parent), m_sample(buf), m_graph(QPixmap(w - 2 * s_padding, h - 2 * s_padding)), @@ -74,9 +75,9 @@ AudioFileProcessorWaveView::AudioFileProcessorWaveView(QWidget * parent, int w, m_last_from(0), m_last_to(0), m_last_amp(0), - m_startKnob(0), - m_endKnob(0), - m_loopKnob(0), + m_startKnob(start), + m_endKnob(end), + m_loopKnob(loop), m_isDragging(false), m_reversed(false), m_framesPlayed(0), @@ -85,6 +86,8 @@ AudioFileProcessorWaveView::AudioFileProcessorWaveView(QWidget * parent, int w, setFixedSize(w, h); setMouseTracking(true); + configureKnobRelationsAndWaveViews(); + updateSampleRange(); m_graph.fill(Qt::transparent); @@ -399,21 +402,6 @@ void AudioFileProcessorWaveView::slide(int px) slideSampleByFrames(step); } -void AudioFileProcessorWaveView::setKnobs(knob * start, knob * end, knob * loop) -{ - m_startKnob = start; - m_endKnob = end; - m_loopKnob = loop; - - m_startKnob->setWaveView(this); - m_startKnob->setRelatedKnob(m_endKnob); - - m_endKnob->setWaveView(this); - m_endKnob->setRelatedKnob(m_startKnob); - - m_loopKnob->setWaveView(this); -} - void AudioFileProcessorWaveView::slideSamplePointByPx(Point point, int px) { slideSamplePointByFrames( @@ -511,6 +499,17 @@ void AudioFileProcessorWaveView::updateCursor(QMouseEvent * me) setCursor(Qt::OpenHandCursor); } +void AudioFileProcessorWaveView::configureKnobRelationsAndWaveViews() +{ + m_startKnob->setWaveView(this); + m_startKnob->setRelatedKnob(m_endKnob); + + m_endKnob->setWaveView(this); + m_endKnob->setRelatedKnob(m_startKnob); + + m_loopKnob->setWaveView(this); +} + void AudioFileProcessorWaveView::knob::slideTo(double v, bool check_bound) { if (check_bound && ! checkBound(v)) diff --git a/plugins/AudioFileProcessor/AudioFileProcessorWaveView.h b/plugins/AudioFileProcessor/AudioFileProcessorWaveView.h index 713064580..f40b69d12 100644 --- a/plugins/AudioFileProcessor/AudioFileProcessorWaveView.h +++ b/plugins/AudioFileProcessor/AudioFileProcessorWaveView.h @@ -146,8 +146,8 @@ private: friend class AudioFileProcessorView; public: - AudioFileProcessorWaveView(QWidget* parent, int w, int h, Sample const* buf); - void setKnobs(knob* start, knob* end, knob* loop); + AudioFileProcessorWaveView(QWidget* parent, int w, int h, Sample const* buf, + knob* start, knob* end, knob* loop); void updateSampleRange(); @@ -170,6 +170,8 @@ private: void reverse(); void updateCursor(QMouseEvent* me = nullptr); + void configureKnobRelationsAndWaveViews(); + static bool isCloseTo(int a, int b) { return qAbs(a - b) < 4;