From 3aa5f3f46d4c6ba450ae105a33856a2d47c5ab2d Mon Sep 17 00:00:00 2001 From: Michael Gregorius Date: Fri, 23 Feb 2024 18:14:22 +0100 Subject: [PATCH 1/2] 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 43882222f41..d16b1d019a1 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 f130ca41c21..5a71084f953 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 713064580e5..3e6d1e9f51a 100644 --- a/plugins/AudioFileProcessor/AudioFileProcessorWaveView.h +++ b/plugins/AudioFileProcessor/AudioFileProcessorWaveView.h @@ -146,8 +146,8 @@ public slots: 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 @@ public slots: void reverse(); void updateCursor(QMouseEvent* me = nullptr); + void configureKnobRelationsAndWaveViews(); + static bool isCloseTo(int a, int b) { return qAbs(a - b) < 4; From f14fb88838bcc8c4cd909961b3bba6777839016f Mon Sep 17 00:00:00 2001 From: Michael Gregorius Date: Fri, 23 Feb 2024 18:28:57 +0100 Subject: [PATCH 2/2] Fix code formatting --- plugins/AudioFileProcessor/AudioFileProcessorWaveView.cpp | 4 ++-- plugins/AudioFileProcessor/AudioFileProcessorWaveView.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/AudioFileProcessor/AudioFileProcessorWaveView.cpp b/plugins/AudioFileProcessor/AudioFileProcessorWaveView.cpp index 5a71084f953..507c4e7c0ee 100644 --- a/plugins/AudioFileProcessor/AudioFileProcessorWaveView.cpp +++ b/plugins/AudioFileProcessor/AudioFileProcessorWaveView.cpp @@ -65,8 +65,8 @@ f_cnt_t AudioFileProcessorWaveView::range() const return m_to - m_from; } -AudioFileProcessorWaveView::AudioFileProcessorWaveView(QWidget * parent, int w, int h, Sample const * buf, - knob * start, knob * end, knob * loop) : +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)), diff --git a/plugins/AudioFileProcessor/AudioFileProcessorWaveView.h b/plugins/AudioFileProcessor/AudioFileProcessorWaveView.h index 3e6d1e9f51a..f40b69d121f 100644 --- a/plugins/AudioFileProcessor/AudioFileProcessorWaveView.h +++ b/plugins/AudioFileProcessor/AudioFileProcessorWaveView.h @@ -147,7 +147,7 @@ public slots: public: AudioFileProcessorWaveView(QWidget* parent, int w, int h, Sample const* buf, - knob * start, knob * end, knob * loop); + knob* start, knob* end, knob* loop); void updateSampleRange();