diff --git a/src/engine/controls/bpmcontrol.cpp b/src/engine/controls/bpmcontrol.cpp index 44b27f968503..f1226c834e8a 100644 --- a/src/engine/controls/bpmcontrol.cpp +++ b/src/engine/controls/bpmcontrol.cpp @@ -283,7 +283,9 @@ void BpmControl::adjustBeatsBpm(double deltaBpm) { const mixxx::Bpm bpm = pBeats->getBpmInRange( mixxx::audio::kStartFramePos, frameInfo().trackEndPosition); - // FIXME: calling bpm.value() without checking bpm.isValid() + 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..941bb4036ab5 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) { + // 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()) { + 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,10 @@ mixxx::audio::FramePos BeatUtils::adjustPhase( mixxx::Bpm bpm, mixxx::audio::SampleRate sampleRate, const QVector& beats) { - // FIXME: calling bpm.value() without checking bpm.isValid() + if (!bpm.isValid()) { + return firstBeat; + } + const double beatLength = 60 * sampleRate / bpm.value(); const mixxx::audio::FramePos startOffset = mixxx::audio::FramePos(fmod(firstBeat.value(), beatLength));