From 224569246490262efb0e2b4b79e7456e86d1164f Mon Sep 17 00:00:00 2001 From: shbhmexe Date: Sat, 27 Dec 2025 15:42:47 +0530 Subject: [PATCH 1/4] Fix BPM validation checks in beatutils and bpmcontrol Add missing BPM validity checks before calling value() method to prevent debug assertions and potential undefined behavior when BPM is invalid. Signed-off-by: shbhmexe --- src/engine/controls/bpmcontrol.cpp | 5 ++++- src/track/beatutils.cpp | 14 ++++++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/engine/controls/bpmcontrol.cpp b/src/engine/controls/bpmcontrol.cpp index 44b27f968503..b4b1782411ee 100644 --- a/src/engine/controls/bpmcontrol.cpp +++ b/src/engine/controls/bpmcontrol.cpp @@ -283,7 +283,10 @@ void BpmControl::adjustBeatsBpm(double deltaBpm) { const mixxx::Bpm bpm = pBeats->getBpmInRange( mixxx::audio::kStartFramePos, frameInfo().trackEndPosition); - // FIXME: calling bpm.value() without checking bpm.isValid() + // Validate BPM before using it + if (!bpm.isValid()) { + return; + } const auto centerBpm = mixxx::Bpm(math_max(kBpmAdjustMin, bpm.value() + deltaBpm)); mixxx::Bpm adjustedBpm = BeatUtils::roundBpmWithinRange( centerBpm - kBpmAdjustStep / 2, centerBpm, centerBpm + kBpmAdjustStep / 2); diff --git a/src/track/beatutils.cpp b/src/track/beatutils.cpp index c828e500c7f0..b8718bf60f32 100644 --- a/src/track/beatutils.cpp +++ b/src/track/beatutils.cpp @@ -336,8 +336,13 @@ std::optional BeatUtils::trySnap(mixxx::Bpm minBpm, // static mixxx::Bpm BeatUtils::roundBpmWithinRange( mixxx::Bpm minBpm, mixxx::Bpm centerBpm, mixxx::Bpm maxBpm) { + // First validate all BPM values + if (!minBpm.isValid() || !centerBpm.isValid() || !maxBpm.isValid()) { + // If any BPM is invalid, return the centerBpm as-is + return centerBpm; + } + // First try to snap to a full integer BPM - // FIXME: calling bpm.value() without checking bpm.isValid() std::optional snapBpm = trySnap(minBpm, centerBpm, maxBpm, 1.0); if (snapBpm) { return *snapBpm; @@ -405,7 +410,12 @@ mixxx::audio::FramePos BeatUtils::adjustPhase( mixxx::Bpm bpm, mixxx::audio::SampleRate sampleRate, const QVector& beats) { - // FIXME: calling bpm.value() without checking bpm.isValid() + // Validate BPM before using it + if (!bpm.isValid()) { + // If BPM is invalid, return firstBeat without adjustment + return firstBeat; + } + const double beatLength = 60 * sampleRate / bpm.value(); const mixxx::audio::FramePos startOffset = mixxx::audio::FramePos(fmod(firstBeat.value(), beatLength)); From d56d72cb2d44df884309a084640a4fd1aebb33a0 Mon Sep 17 00:00:00 2001 From: Shubham shukla Date: Sun, 11 Jan 2026 14:44:38 +0530 Subject: [PATCH 2/4] Update src/engine/controls/bpmcontrol.cpp MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Daniel Schürmann --- src/engine/controls/bpmcontrol.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/engine/controls/bpmcontrol.cpp b/src/engine/controls/bpmcontrol.cpp index b4b1782411ee..f1226c834e8a 100644 --- a/src/engine/controls/bpmcontrol.cpp +++ b/src/engine/controls/bpmcontrol.cpp @@ -283,7 +283,6 @@ void BpmControl::adjustBeatsBpm(double deltaBpm) { const mixxx::Bpm bpm = pBeats->getBpmInRange( mixxx::audio::kStartFramePos, frameInfo().trackEndPosition); - // Validate BPM before using it if (!bpm.isValid()) { return; } From a8e3cefafeff6971698fc9744aad56615c6222e8 Mon Sep 17 00:00:00 2001 From: Shubham shukla Date: Sun, 11 Jan 2026 14:44:47 +0530 Subject: [PATCH 3/4] Update src/track/beatutils.cpp MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Daniel Schürmann --- src/track/beatutils.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/track/beatutils.cpp b/src/track/beatutils.cpp index b8718bf60f32..645f7156541f 100644 --- a/src/track/beatutils.cpp +++ b/src/track/beatutils.cpp @@ -336,9 +336,9 @@ std::optional BeatUtils::trySnap(mixxx::Bpm minBpm, // static mixxx::Bpm BeatUtils::roundBpmWithinRange( mixxx::Bpm minBpm, mixxx::Bpm centerBpm, mixxx::Bpm maxBpm) { - // First validate all BPM values + // If any BPM is invalid, return the centerBpm as-is to avoid + // unexpected results in the following calculations if (!minBpm.isValid() || !centerBpm.isValid() || !maxBpm.isValid()) { - // If any BPM is invalid, return the centerBpm as-is return centerBpm; } From 8eebd7a3c9a6a3415452f57c5294a921e4353a2e Mon Sep 17 00:00:00 2001 From: Shubham shukla Date: Sun, 11 Jan 2026 14:44:56 +0530 Subject: [PATCH 4/4] Update src/track/beatutils.cpp MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Daniel Schürmann --- src/track/beatutils.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/track/beatutils.cpp b/src/track/beatutils.cpp index 645f7156541f..941bb4036ab5 100644 --- a/src/track/beatutils.cpp +++ b/src/track/beatutils.cpp @@ -410,9 +410,7 @@ mixxx::audio::FramePos BeatUtils::adjustPhase( mixxx::Bpm bpm, mixxx::audio::SampleRate sampleRate, const QVector& beats) { - // Validate BPM before using it if (!bpm.isValid()) { - // If BPM is invalid, return firstBeat without adjustment return firstBeat; }