diff options
author | Owen Williams <owilliams@mixxx.org> | 2020-04-12 23:47:36 -0400 |
---|---|---|
committer | Owen Williams <owilliams@mixxx.org> | 2020-04-12 23:47:36 -0400 |
commit | f052b1d9ac328c6ee75b39c0792ff0cf64261aee (patch) | |
tree | aedac725190313ad92c5aeab2705fa4f1f57e976 /src/engine/controls | |
parent | 49e61d6627eb60324984297932b5dec469e52d91 (diff) | |
parent | 53498cbd39f96bae2ede984ce88a2ce6ca2887c9 (diff) |
Merge branch 'master' into mastersync-onemaster
Diffstat (limited to 'src/engine/controls')
-rw-r--r-- | src/engine/controls/cuecontrol.cpp | 90 | ||||
-rw-r--r-- | src/engine/controls/cuecontrol.h | 3 |
2 files changed, 57 insertions, 36 deletions
diff --git a/src/engine/controls/cuecontrol.cpp b/src/engine/controls/cuecontrol.cpp index 59bfd428f4..de3235321c 100644 --- a/src/engine/controls/cuecontrol.cpp +++ b/src/engine/controls/cuecontrol.cpp @@ -363,6 +363,8 @@ void CueControl::trackLoaded(TrackPointer pNewTrack) { } m_pLoadedTrack = pNewTrack; + connect(m_pLoadedTrack.get(), &Track::analyzed, this, &CueControl::trackAnalyzed, Qt::DirectConnection); + connect(m_pLoadedTrack.get(), &Track::cuesUpdated, this, &CueControl::trackCuesUpdated, Qt::DirectConnection); @@ -410,12 +412,6 @@ void CueControl::trackLoaded(TrackPointer pNewTrack) { // Seek track according to SeekOnLoadMode. SeekOnLoadMode seekOnLoadMode = getSeekOnLoadPreference(); - CuePointer pAudibleSound = pNewTrack->findCueByType(mixxx::CueType::AudibleSound); - double firstSound = Cue::kNoPosition; - if (pAudibleSound) { - firstSound = pAudibleSound->getPosition(); - } - switch (seekOnLoadMode) { case SeekOnLoadMode::Beginning: // This allows users to load tracks and have the needle-drop be maintained. @@ -424,20 +420,28 @@ void CueControl::trackLoaded(TrackPointer pNewTrack) { seekExact(0.0); } break; - case SeekOnLoadMode::FirstSound: - if (firstSound != Cue::kNoPosition) { - seekExact(firstSound); + case SeekOnLoadMode::FirstSound: { + CuePointer pAudibleSound = pNewTrack->findCueByType(mixxx::CueType::AudibleSound); + if (pAudibleSound && pAudibleSound->getPosition() != Cue::kNoPosition) { + seekExact(pAudibleSound->getPosition()); } else { seekExact(0.0); } break; - case SeekOnLoadMode::MainCue: - if (mainCuePoint.getPosition() != Cue::kNoPosition) { - seekExact(mainCuePoint.getPosition()); + } + case SeekOnLoadMode::MainCue: { + // Take main cue position from CO instead of cue point list because + // value in CO will be quantized if quantization is enabled + // while value in cue point list will never be quantized. + // This prevents jumps when track analysis finishes while quantization is enabled. + double cuePoint = m_pCuePoint->get(); + if (cuePoint != Cue::kNoPosition) { + seekExact(cuePoint); } else { seekExact(0.0); } break; + } case SeekOnLoadMode::IntroStart: { double introStart = m_pIntroStartPosition->get(); if (introStart != Cue::kNoPosition) { @@ -547,17 +551,15 @@ void CueControl::loadCuesFromTrack() { } } -void CueControl::reloadCuesFromTrack() { - if (!m_pLoadedTrack) +void CueControl::trackAnalyzed() { + if (!m_pLoadedTrack) { return; + } - // Determine current playing position of the track. - TrackAt trackAt = getTrackAt(); - bool wasTrackAtZeroPos = isTrackAtZeroPos(); - bool wasTrackAtIntroCue = isTrackAtIntroCue(); - - // Update COs with cues from track. - loadCuesFromTrack(); + // if we are playing (no matter what reason for) do not seek + if (m_pPlay->toBool()) { + return; + } // Retrieve current position of cues from COs. double cue = m_pCuePoint->get(); @@ -567,28 +569,48 @@ void CueControl::reloadCuesFromTrack() { SeekOnLoadMode seekOnLoadMode = getSeekOnLoadPreference(); if (seekOnLoadMode == SeekOnLoadMode::MainCue) { - if ((trackAt == TrackAt::Cue || wasTrackAtZeroPos) && cue != Cue::kNoPosition) { + if (cue != Cue::kNoPosition) { seekExact(cue); } } else if (seekOnLoadMode == SeekOnLoadMode::IntroStart) { - if ((wasTrackAtIntroCue || wasTrackAtZeroPos) && intro != Cue::kNoPosition) { + if (intro != Cue::kNoPosition) { seekExact(intro); } } } void CueControl::trackCuesUpdated() { - reloadCuesFromTrack(); + loadCuesFromTrack(); } void CueControl::trackBeatsUpdated() { - reloadCuesFromTrack(); + loadCuesFromTrack(); } void CueControl::quantizeChanged(double v) { Q_UNUSED(v); - reloadCuesFromTrack(); + // check if we were at the cue point before + bool wasTrackAtCue = getTrackAt() == TrackAt::Cue; + bool wasTrackAtIntro = isTrackAtIntroCue(); + + loadCuesFromTrack(); + + // if we are playing (no matter what reason for) do not seek + if (m_pPlay->toBool()) { + return; + } + + // Retrieve new cue pos and follow + double cue = m_pCuePoint->get(); + if (wasTrackAtCue && cue != Cue::kNoPosition) { + seekExact(cue); + } + // Retrieve new intro start pos and follow + double intro = m_pIntroStartPosition->get(); + if (wasTrackAtIntro && intro != Cue::kNoPosition) { + seekExact(intro); + } } void CueControl::hotcueSet(HotcueControl* pControl, double v) { @@ -615,12 +637,16 @@ void CueControl::hotcueSet(HotcueControl* pControl, double v) { pCue->setLabel(); pCue->setType(mixxx::CueType::HotCue); - ConfigKey autoHotcueColorsKey("[Controls]", "auto_hotcue_colors"); - if (getConfig()->getValue(autoHotcueColorsKey, false)) { - auto hotcueColorPalette = m_colorPaletteSettings.getHotcueColorPalette(); + const ColorPalette hotcueColorPalette = + m_colorPaletteSettings.getHotcueColorPalette(); + if (getConfig()->getValue(ConfigKey("[Controls]", "auto_hotcue_colors"), false)) { pCue->setColor(hotcueColorPalette.colorForHotcueIndex(hotcue)); } else { - pCue->setColor(mixxx::PredefinedColorPalettes::kDefaultCueColor); + int hotcueDefaultColorIndex = m_pConfig->getValue(ConfigKey("[Controls]", "HotcueDefaultColorIndex"), -1); + if (hotcueDefaultColorIndex < 0 || hotcueDefaultColorIndex >= hotcueColorPalette.size()) { + hotcueDefaultColorIndex = hotcueColorPalette.size() - 1; // default to last color (orange) + } + pCue->setColor(hotcueColorPalette.at(hotcueDefaultColorIndex)); } // TODO(XXX) deal with spurious signals @@ -1674,10 +1700,6 @@ double CueControl::quantizeCuePoint(double cuePos) { return cuePos; } -bool CueControl::isTrackAtZeroPos() { - return (fabs(getSampleOfTrack().current) < 1.0f); -} - bool CueControl::isTrackAtIntroCue() { return (fabs(getSampleOfTrack().current - m_pIntroStartPosition->get()) < 1.0f); } diff --git a/src/engine/controls/cuecontrol.h b/src/engine/controls/cuecontrol.h index 2d406a7d43..517a511126 100644 --- a/src/engine/controls/cuecontrol.h +++ b/src/engine/controls/cuecontrol.h @@ -126,7 +126,6 @@ class CueControl : public EngineControl { void hintReader(HintVector* pHintList) override; bool updateIndicatorsAndModifyPlay(bool newPlay, bool playPossible); void updateIndicators(); - bool isTrackAtZeroPos(); bool isTrackAtIntroCue(); void resetIndicators(); bool isPlayingByPlayButton(); @@ -138,6 +137,7 @@ class CueControl : public EngineControl { void quantizeChanged(double v); void cueUpdated(); + void trackAnalyzed(); void trackCuesUpdated(); void trackBeatsUpdated(); void hotcueSet(HotcueControl* pControl, double v); @@ -190,7 +190,6 @@ class CueControl : public EngineControl { void attachCue(CuePointer pCue, HotcueControl* pControl); void detachCue(HotcueControl* pControl); void loadCuesFromTrack(); - void reloadCuesFromTrack(); double quantizeCuePoint(double position); double getQuantizedCurrentPosition(); TrackAt getTrackAt() const; |