diff options
author | Jan Holthuis <jan.holthuis@ruhr-uni-bochum.de> | 2021-04-02 13:23:23 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-02 13:23:23 +0200 |
commit | 8ff946c223281932ef9a017e6c6590a9ad161ada (patch) | |
tree | 85be05d841324fae46a11930f293fe9cf67fdbc2 | |
parent | 6da0449448b58958c4ce8fba1e34621591bc9a67 (diff) | |
parent | b552bcddc08c0d82a48fa44ee90b047ad5e521cc (diff) |
Merge pull request #3760 from daschuer/lp1921962
Adjust half/double sync theshold.
-rw-r--r-- | src/engine/sync/synccontrol.cpp | 31 | ||||
-rw-r--r-- | src/test/enginesynctest.cpp | 50 |
2 files changed, 64 insertions, 17 deletions
diff --git a/src/engine/sync/synccontrol.cpp b/src/engine/sync/synccontrol.cpp index dbbf5c6e7c..0921421653 100644 --- a/src/engine/sync/synccontrol.cpp +++ b/src/engine/sync/synccontrol.cpp @@ -242,6 +242,8 @@ void SyncControl::setMasterBpm(double bpm) { void SyncControl::setMasterParams( double beatDistance, double baseBpm, double bpm) { + // Calculate the factor for the file bpm. That gives the best + // result at any rate slider position. double masterBpmAdjustFactor = determineBpmMultiplier(fileBpm(), baseBpm); if (isMaster(getSyncMode())) { // In Master mode we adjust the incoming Bpm for the initial sync. @@ -256,24 +258,19 @@ void SyncControl::setMasterParams( } double SyncControl::determineBpmMultiplier(double myBpm, double targetBpm) const { - double multiplier = kBpmUnity; if (myBpm == 0.0 || targetBpm == 0.0) { - return multiplier; - } - double best_margin = fabs((targetBpm / myBpm) - 1.0); - - double try_margin = fabs((targetBpm * kBpmHalve / myBpm) - 1.0); - // We really want to prefer unity, so use a float compare with high tolerance. - if (best_margin - try_margin > .0001) { - multiplier = kBpmHalve; - best_margin = try_margin; - } - - try_margin = fabs((targetBpm * kBpmDouble / myBpm) - 1.0); - if (best_margin - try_margin > .0001) { - multiplier = kBpmDouble; - } - return multiplier; + return kBpmUnity; + } + double unityRatio = myBpm / targetBpm; + // the square root of 2 (1.414) is the + // rate threshold that works vice versa for this and the target. + double unityRatioSquare = unityRatio * unityRatio; + if (unityRatioSquare > kBpmDouble) { + return kBpmDouble; + } else if (unityRatioSquare < kBpmHalve) { + return kBpmHalve; + } + return kBpmUnity; } void SyncControl::updateTargetBeatDistance() { diff --git a/src/test/enginesynctest.cpp b/src/test/enginesynctest.cpp index b34cafc1b2..78615e418d 100644 --- a/src/test/enginesynctest.cpp +++ b/src/test/enginesynctest.cpp @@ -1821,6 +1821,56 @@ TEST_F(EngineSyncTest, HalfDoubleConsistency) { ControlObject::getControl(ConfigKey(m_sGroup2, "bpm"))->get()); } +TEST_F(EngineSyncTest, HalfDoubleEachOther) { + // Confirm that repeated sync with both decks leads to the same + // Half/Double decision. + // This test demonstrates https://bugs.launchpad.net/mixxx/+bug/1921962 + mixxx::BeatsPointer pBeats1 = BeatFactory::makeBeatGrid(m_pTrack1->getSampleRate(), 144, 0.0); + m_pTrack1->trySetBeats(pBeats1); + mixxx::BeatsPointer pBeats2 = BeatFactory::makeBeatGrid(m_pTrack2->getSampleRate(), 105, 0.0); + m_pTrack2->trySetBeats(pBeats2); + + // Threshold 1.414 sqrt(2); + // 144 / 105 = 1.37 + // 105 / 72 = 1.46 + // expect 144 BPM + + ControlObject::getControl(ConfigKey(m_sGroup2, "sync_enabled"))->set(1.0); + ControlObject::getControl(ConfigKey(m_sGroup2, "sync_enabled"))->set(0.0); + + EXPECT_DOUBLE_EQ(144.0, + ControlObject::getControl(ConfigKey(m_sGroup2, "bpm"))->get()); + + ControlObject::getControl(ConfigKey(m_sGroup1, "sync_enabled"))->set(1.0); + ControlObject::getControl(ConfigKey(m_sGroup1, "sync_enabled"))->set(0.0); + + EXPECT_DOUBLE_EQ(144.0, + ControlObject::getControl(ConfigKey(m_sGroup1, "bpm"))->get()); + + // Threshold 1.414 sqrt(2); + // 150 / 105 = 1.43 + // 105 / 75 = 1.40 + // expect 75 BPM + + mixxx::BeatsPointer pBeats1b = BeatFactory::makeBeatGrid(m_pTrack1->getSampleRate(), 150, 0.0); + m_pTrack1->trySetBeats(pBeats1b); + + EXPECT_DOUBLE_EQ(150.0, + ControlObject::getControl(ConfigKey(m_sGroup1, "bpm"))->get()); + + ControlObject::getControl(ConfigKey(m_sGroup2, "sync_enabled"))->set(1.0); + ControlObject::getControl(ConfigKey(m_sGroup2, "sync_enabled"))->set(0.0); + + EXPECT_DOUBLE_EQ(75.0, + ControlObject::getControl(ConfigKey(m_sGroup2, "bpm"))->get()); + + ControlObject::getControl(ConfigKey(m_sGroup1, "sync_enabled"))->set(1.0); + ControlObject::getControl(ConfigKey(m_sGroup1, "sync_enabled"))->set(0.0); + + EXPECT_DOUBLE_EQ(150.0, + ControlObject::getControl(ConfigKey(m_sGroup1, "bpm"))->get()); +} + TEST_F(EngineSyncTest, SetFileBpmUpdatesLocalBpm) { ControlObject::getControl(ConfigKey(m_sGroup1, "beat_distance"))->set(0.2); mixxx::BeatsPointer pBeats1 = BeatFactory::makeBeatGrid(m_pTrack1->getSampleRate(), 130, 0.0); |