From 6b043565fcdb5f16e95e8a1a1790c7f9629b29c2 Mon Sep 17 00:00:00 2001 From: Uwe Klotz Date: Tue, 7 Jun 2022 12:15:19 +0200 Subject: [PATCH 1/3] Fix typo --- src/engine/controls/enginecontrol.cpp | 2 +- src/engine/enginebuffer.cpp | 4 ++-- src/engine/enginebuffer.h | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/engine/controls/enginecontrol.cpp b/src/engine/controls/enginecontrol.cpp index 0e0f32c270d..cefc99b5c44 100644 --- a/src/engine/controls/enginecontrol.cpp +++ b/src/engine/controls/enginecontrol.cpp @@ -12,7 +12,7 @@ EngineControl::EngineControl(const QString& group, m_pConfig(pConfig), m_pEngineMaster(nullptr), m_pEngineBuffer(nullptr) { - setCurrentSample(EngineBuffer::kInitalSamplePosition, 0.0, 0.0); + setCurrentSample(EngineBuffer::kInitialSamplePosition, 0.0, 0.0); } EngineControl::~EngineControl() { diff --git a/src/engine/enginebuffer.cpp b/src/engine/enginebuffer.cpp index ff8cbe498f1..144443a2370 100644 --- a/src/engine/enginebuffer.cpp +++ b/src/engine/enginebuffer.cpp @@ -70,7 +70,7 @@ EngineBuffer::EngineBuffer(const QString& group, m_pKeyControl(nullptr), m_pReadAheadManager(nullptr), m_pReader(nullptr), - m_filepos_play(kInitalSamplePosition), + m_filepos_play(kInitialSamplePosition), m_speed_old(0), m_tempo_ratio_old(1.), m_scratching_old(false), @@ -513,7 +513,7 @@ void EngineBuffer::slotTrackLoaded(TrackPointer pTrack, m_pause.lock(); m_visualPlayPos->setInvalid(); - m_filepos_play = kInitalSamplePosition; // for execute seeks to 0.0 + m_filepos_play = kInitialSamplePosition; // for execute seeks to 0.0 m_pCurrentTrack = pTrack; m_pTrackSamples->set(iTrackNumSamples); m_pTrackSampleRate->set(iTrackSampleRate); diff --git a/src/engine/enginebuffer.h b/src/engine/enginebuffer.h index a4bdf51304c..cfe65ffc093 100644 --- a/src/engine/enginebuffer.h +++ b/src/engine/enginebuffer.h @@ -85,7 +85,7 @@ class EngineBuffer : public EngineObject { // This value is used to make sure the initial seek after loading a track is // not omitted. Therefore this value must be different for 0.0 or any likely // value for the main cue - static constexpr double kInitalSamplePosition = -DBL_MAX; + static constexpr double kInitialSamplePosition = -DBL_MAX; EngineBuffer(const QString& group, UserSettingsPointer pConfig, EngineChannel* pChannel, EngineMaster* pMixingEngine); From d3d47fcebfc6f46b47845f43ace45ecb1033f0d4 Mon Sep 17 00:00:00 2001 From: Uwe Klotz Date: Tue, 7 Jun 2022 10:31:27 +0200 Subject: [PATCH 2/3] Fix std::bad_alloc() in WaveformRenderBeat::draw() https://bugs.launchpad.net/mixxx/+bug/1977731 https://bugs.launchpad.net/mixxx/+bug/1716235 --- src/engine/enginebuffer.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/engine/enginebuffer.cpp b/src/engine/enginebuffer.cpp index 144443a2370..24675f1279e 100644 --- a/src/engine/enginebuffer.cpp +++ b/src/engine/enginebuffer.cpp @@ -1242,9 +1242,13 @@ void EngineBuffer::postProcess(const int iBufferSize) { } void EngineBuffer::updateIndicators(double speed, int iBufferSize) { - if (m_trackSampleRateOld == 0) { - // This happens if Deck Passthrough is active but no track is loaded. - // We skip indicator updates. + if (m_filepos_play == kInitialSamplePosition || m_trackSampleRateOld == 0) { + // Skip indicator updates with invalid values to prevent undefined behavior, + // e.g. in WaveformRenderBeat::draw(). + // + // This is known to happen if Deck Passthrough is active, when either no + // track is loaded or a track was loaded but processSeek() has not been + // called yet. return; } From 9360294068a795b87d6cc812ef1c0995aabd7b94 Mon Sep 17 00:00:00 2001 From: Uwe Klotz Date: Tue, 7 Jun 2022 22:07:19 +0200 Subject: [PATCH 3/3] Add debug assertion to detect division-by-zero before it happens --- src/engine/enginebuffer.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/engine/enginebuffer.cpp b/src/engine/enginebuffer.cpp index 24675f1279e..4cb9b934f35 100644 --- a/src/engine/enginebuffer.cpp +++ b/src/engine/enginebuffer.cpp @@ -1251,6 +1251,7 @@ void EngineBuffer::updateIndicators(double speed, int iBufferSize) { // called yet. return; } + DEBUG_ASSERT(m_tempo_ratio_old != 0); // Increase samplesCalculated by the buffer size m_iSamplesSinceLastIndicatorUpdate += iBufferSize;