summaryrefslogtreecommitdiffstats
path: root/src/engine/controls
diff options
context:
space:
mode:
authorOwen Williams <owilliams@mixxx.org>2020-04-12 23:47:36 -0400
committerOwen Williams <owilliams@mixxx.org>2020-04-12 23:47:36 -0400
commitf052b1d9ac328c6ee75b39c0792ff0cf64261aee (patch)
treeaedac725190313ad92c5aeab2705fa4f1f57e976 /src/engine/controls
parent49e61d6627eb60324984297932b5dec469e52d91 (diff)
parent53498cbd39f96bae2ede984ce88a2ce6ca2887c9 (diff)
Merge branch 'master' into mastersync-onemaster
Diffstat (limited to 'src/engine/controls')
-rw-r--r--src/engine/controls/cuecontrol.cpp90
-rw-r--r--src/engine/controls/cuecontrol.h3
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;