From 3cbf687b24b7a66ffe679151d0a7ea489e482490 Mon Sep 17 00:00:00 2001 From: Jan Holthuis Date: Tue, 14 Apr 2020 21:07:14 +0200 Subject: [PATCH 1/4] Add track color control object --- src/mixer/basetrackplayer.cpp | 128 ++++++++++++++++++++++++++-------- src/mixer/basetrackplayer.h | 5 ++ src/track/track.cpp | 1 + src/track/track.h | 1 + 4 files changed, 104 insertions(+), 31 deletions(-) diff --git a/src/mixer/basetrackplayer.cpp b/src/mixer/basetrackplayer.cpp index 2759b7aae5a..2d087d6d524 100644 --- a/src/mixer/basetrackplayer.cpp +++ b/src/mixer/basetrackplayer.cpp @@ -22,6 +22,12 @@ #include "vinylcontrol/defs_vinylcontrol.h" #include "engine/sync/enginesync.h" +namespace { + +const double kNoTrackColor = -1; + +} + BaseTrackPlayer::BaseTrackPlayer(QObject* pParent, const QString& group) : BasePlayer(pParent, group) { } @@ -78,34 +84,52 @@ BaseTrackPlayerImpl::BaseTrackPlayerImpl(QObject* pParent, m_pDuration = std::make_unique( ConfigKey(getGroup(), "duration")); + // Track color of the current track + m_pTrackColor = std::make_unique( + ConfigKey(getGroup(), "track_color")); + + m_pTrackColor->set(kNoTrackColor); + connect(m_pTrackColor.get(), + &ControlObject::valueChanged, + this, + &BaseTrackPlayerImpl::slotTrackColorChanged); + // Deck cloning m_pCloneFromDeck = std::make_unique( - ConfigKey(getGroup(), "CloneFromDeck"), - false); - connect(m_pCloneFromDeck.get(), &ControlObject::valueChanged, - this, &BaseTrackPlayerImpl::slotCloneFromDeck); + ConfigKey(getGroup(), "CloneFromDeck"), + false); + connect(m_pCloneFromDeck.get(), + &ControlObject::valueChanged, + this, + &BaseTrackPlayerImpl::slotCloneFromDeck); // Waveform controls // This acts somewhat like a ControlPotmeter, but the normal _up/_down methods // do not work properly with this CO. - m_pWaveformZoom = std::make_unique( - ConfigKey(group, "waveform_zoom")); - m_pWaveformZoom->connectValueChangeRequest( - this, &BaseTrackPlayerImpl::slotWaveformZoomValueChangeRequest, - Qt::DirectConnection); + m_pWaveformZoom = + std::make_unique(ConfigKey(group, "waveform_zoom")); + m_pWaveformZoom->connectValueChangeRequest(this, + &BaseTrackPlayerImpl::slotWaveformZoomValueChangeRequest, + Qt::DirectConnection); m_pWaveformZoom->set(1.0); m_pWaveformZoomUp = std::make_unique( - ConfigKey(group, "waveform_zoom_up")); - connect(m_pWaveformZoomUp.get(), SIGNAL(valueChanged(double)), - this, SLOT(slotWaveformZoomUp(double))); + ConfigKey(group, "waveform_zoom_up")); + connect(m_pWaveformZoomUp.get(), + SIGNAL(valueChanged(double)), + this, + SLOT(slotWaveformZoomUp(double))); m_pWaveformZoomDown = std::make_unique( - ConfigKey(group, "waveform_zoom_down")); - connect(m_pWaveformZoomDown.get(), SIGNAL(valueChanged(double)), - this, SLOT(slotWaveformZoomDown(double))); + ConfigKey(group, "waveform_zoom_down")); + connect(m_pWaveformZoomDown.get(), + SIGNAL(valueChanged(double)), + this, + SLOT(slotWaveformZoomDown(double))); m_pWaveformZoomSetDefault = std::make_unique( - ConfigKey(group, "waveform_zoom_set_default")); - connect(m_pWaveformZoomSetDefault.get(), SIGNAL(valueChanged(double)), - this, SLOT(slotWaveformZoomSetDefault(double))); + ConfigKey(group, "waveform_zoom_set_default")); + connect(m_pWaveformZoomSetDefault.get(), + SIGNAL(valueChanged(double)), + this, + SLOT(slotWaveformZoomSetDefault(double))); m_pPreGain = std::make_unique(group, "pregain", this); // BPM of the current song @@ -138,15 +162,26 @@ TrackPointer BaseTrackPlayerImpl::loadFakeTrack(bool bPlay, double filebpm) { m_pLoadedTrack = pTrack; if (m_pLoadedTrack) { // Listen for updates to the file's BPM - connect(m_pLoadedTrack.get(), SIGNAL(bpmUpdated(double)), - m_pFileBPM.get(), SLOT(set(double))); + connect(m_pLoadedTrack.get(), + &Track::bpmUpdated, + m_pFileBPM.get(), + &ControlProxy::set); - connect(m_pLoadedTrack.get(), SIGNAL(keyUpdated(double)), - m_pKey.get(), SLOT(set(double))); + connect(m_pLoadedTrack.get(), + &Track::keyUpdated, + m_pKey.get(), + &ControlProxy::set); // Listen for updates to the file's Replay Gain - connect(m_pLoadedTrack.get(), SIGNAL(ReplayGainUpdated(mixxx::ReplayGain)), - this, SLOT(slotSetReplayGain(mixxx::ReplayGain))); + connect(m_pLoadedTrack.get(), + &Track::ReplayGainUpdated, + this, + &BaseTrackPlayerImpl::slotSetReplayGain); + + connect(m_pLoadedTrack.get(), + &Track::colorUpdated, + this, + &BaseTrackPlayerImpl::slotSetTrackColor); } // Request a new track from EngineBuffer @@ -201,7 +236,6 @@ void BaseTrackPlayerImpl::loadTrack(TrackPointer pTrack) { ConfigKey(m_pChannelToCloneFrom->getGroup(), "loop_end_position"))); } - connectLoadedTrack(); } @@ -246,12 +280,22 @@ TrackPointer BaseTrackPlayerImpl::unloadTrack() { } void BaseTrackPlayerImpl::connectLoadedTrack() { - connect(m_pLoadedTrack.get(), SIGNAL(bpmUpdated(double)), - m_pFileBPM.get(), SLOT(set(double))); - connect(m_pLoadedTrack.get(), SIGNAL(keyUpdated(double)), - m_pKey.get(), SLOT(set(double))); - connect(m_pLoadedTrack.get(), SIGNAL(ReplayGainUpdated(mixxx::ReplayGain)), - this, SLOT(slotSetReplayGain(mixxx::ReplayGain))); + connect(m_pLoadedTrack.get(), + &Track::bpmUpdated, + m_pFileBPM.get(), + &ControlProxy::set); + connect(m_pLoadedTrack.get(), + &Track::keyUpdated, + m_pKey.get(), + &ControlProxy::set); + connect(m_pLoadedTrack.get(), + &Track::ReplayGainUpdated, + this, + &BaseTrackPlayerImpl::slotSetReplayGain); + connect(m_pLoadedTrack.get(), + &Track::colorUpdated, + this, + &BaseTrackPlayerImpl::slotSetTrackColor); } void BaseTrackPlayerImpl::disconnectLoadedTrack() { @@ -319,6 +363,7 @@ void BaseTrackPlayerImpl::slotTrackLoaded(TrackPointer pNewTrack, m_pFileBPM->set(0); m_pKey->set(0); setReplayGain(0); + slotSetTrackColor(std::nullopt); m_pLoopInPoint->set(kNoTrigger); m_pLoopOutPoint->set(kNoTrigger); m_pLoadedTrack.reset(); @@ -337,6 +382,7 @@ void BaseTrackPlayerImpl::slotTrackLoaded(TrackPointer pNewTrack, m_pFileBPM->set(m_pLoadedTrack->getBpm()); m_pKey->set(m_pLoadedTrack->getKey()); setReplayGain(m_pLoadedTrack->getReplayGain().getRatio()); + slotSetTrackColor(m_pLoadedTrack->getColor()); if(m_pConfig->getValue( ConfigKey("[Mixer Profile]", "EqAutoReset"), false)) { @@ -478,6 +524,26 @@ void BaseTrackPlayerImpl::slotSetReplayGain(mixxx::ReplayGain replayGain) { } } +void BaseTrackPlayerImpl::slotSetTrackColor(mixxx::RgbColor::optional_t color) { + m_pTrackColor->set(color ? static_cast(*color) : kNoTrackColor); +} + +void BaseTrackPlayerImpl::slotTrackColorChanged(double v) { + if (!m_pLoadedTrack) { + return; + } + + mixxx::RgbColor::optional_t color = std::nullopt; + if (v != kNoTrackColor) { + auto colorCode = static_cast(v); + if (v != mixxx::RgbColor::validateCode(colorCode)) { + return; + } + color = mixxx::RgbColor::optional(colorCode); + } + m_pLoadedTrack->setColor(color); +} + void BaseTrackPlayerImpl::slotPlayToggled(double v) { if (!v && m_replaygainPending) { setReplayGain(m_pLoadedTrack->getReplayGain().getRatio()); diff --git a/src/mixer/basetrackplayer.h b/src/mixer/basetrackplayer.h index 8dbc31abc66..d2990b7736b 100644 --- a/src/mixer/basetrackplayer.h +++ b/src/mixer/basetrackplayer.h @@ -80,11 +80,13 @@ class BaseTrackPlayerImpl : public BaseTrackPlayer { void slotTrackLoaded(TrackPointer pNewTrack, TrackPointer pOldTrack); void slotLoadFailed(TrackPointer pTrack, QString reason); void slotSetReplayGain(mixxx::ReplayGain replayGain); + void slotSetTrackColor(mixxx::RgbColor::optional_t color); void slotPlayToggled(double); private slots: void slotCloneChannel(EngineChannel* pChannel); void slotCloneFromDeck(double deck); + void slotTrackColorChanged(double value); void slotVinylControlEnabled(double v); void slotWaveformZoomValueChangeRequest(double pressed); void slotWaveformZoomUp(double pressed); @@ -110,6 +112,9 @@ class BaseTrackPlayerImpl : public BaseTrackPlayer { // Deck clone control std::unique_ptr m_pCloneFromDeck; + // Track color control + std::unique_ptr m_pTrackColor; + // Waveform display related controls std::unique_ptr m_pWaveformZoom; std::unique_ptr m_pWaveformZoomUp; diff --git a/src/track/track.cpp b/src/track/track.cpp index f1db38873a6..fc62f2f444d 100644 --- a/src/track/track.cpp +++ b/src/track/track.cpp @@ -574,6 +574,7 @@ void Track::setColor(mixxx::RgbColor::optional_t color) { QMutexLocker lock(&m_qMutex); if (compareAndSet(m_record.ptrColor(), color)) { markDirtyAndUnlock(&lock); + emit colorUpdated(color); } } diff --git a/src/track/track.h b/src/track/track.h index e3247b5b0f2..084cccb2368 100644 --- a/src/track/track.h +++ b/src/track/track.h @@ -330,6 +330,7 @@ class Track : public QObject { void keyUpdated(double key); void keysUpdated(); void ReplayGainUpdated(mixxx::ReplayGain replayGain); + void colorUpdated(mixxx::RgbColor::optional_t color); void cuesUpdated(); void analyzed(); From b63ede871542cf00530e0971ddb57c06f25d937f Mon Sep 17 00:00:00 2001 From: Jan Holthuis Date: Wed, 15 Apr 2020 10:45:33 +0200 Subject: [PATCH 2/4] track/track: Fix naming of Track::replayGainUpdated signal --- src/mixer/basetrackplayer.cpp | 4 ++-- src/track/track.cpp | 4 ++-- src/track/track.h | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/mixer/basetrackplayer.cpp b/src/mixer/basetrackplayer.cpp index 2d087d6d524..d476b31e04c 100644 --- a/src/mixer/basetrackplayer.cpp +++ b/src/mixer/basetrackplayer.cpp @@ -174,7 +174,7 @@ TrackPointer BaseTrackPlayerImpl::loadFakeTrack(bool bPlay, double filebpm) { // Listen for updates to the file's Replay Gain connect(m_pLoadedTrack.get(), - &Track::ReplayGainUpdated, + &Track::replayGainUpdated, this, &BaseTrackPlayerImpl::slotSetReplayGain); @@ -289,7 +289,7 @@ void BaseTrackPlayerImpl::connectLoadedTrack() { m_pKey.get(), &ControlProxy::set); connect(m_pLoadedTrack.get(), - &Track::ReplayGainUpdated, + &Track::replayGainUpdated, this, &BaseTrackPlayerImpl::slotSetReplayGain); connect(m_pLoadedTrack.get(), diff --git a/src/track/track.cpp b/src/track/track.cpp index fc62f2f444d..ae118da2c0f 100644 --- a/src/track/track.cpp +++ b/src/track/track.cpp @@ -161,7 +161,7 @@ void Track::importMetadata( // explicitly unlock before emitting signals markDirtyAndUnlock(&lock); if (modifiedReplayGain) { - emit ReplayGainUpdated(newReplayGain); + emit replayGainUpdated(newReplayGain); } } @@ -230,7 +230,7 @@ void Track::setReplayGain(const mixxx::ReplayGain& replayGain) { QMutexLocker lock(&m_qMutex); if (compareAndSet(m_record.refMetadata().refTrackInfo().ptrReplayGain(), replayGain)) { markDirtyAndUnlock(&lock); - emit ReplayGainUpdated(replayGain); + emit replayGainUpdated(replayGain); } } diff --git a/src/track/track.h b/src/track/track.h index 084cccb2368..b04ba91feee 100644 --- a/src/track/track.h +++ b/src/track/track.h @@ -329,7 +329,7 @@ class Track : public QObject { void beatsUpdated(); void keyUpdated(double key); void keysUpdated(); - void ReplayGainUpdated(mixxx::ReplayGain replayGain); + void replayGainUpdated(mixxx::ReplayGain replayGain); void colorUpdated(mixxx::RgbColor::optional_t color); void cuesUpdated(); void analyzed(); From e0882a86267edade72bede6a33226869c9689a03 Mon Sep 17 00:00:00 2001 From: Jan Holthuis Date: Wed, 15 Apr 2020 14:46:58 +0200 Subject: [PATCH 3/4] mixer/basetrackplayer: Validate track color using RgbColor::isValidCode --- src/mixer/basetrackplayer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mixer/basetrackplayer.cpp b/src/mixer/basetrackplayer.cpp index d476b31e04c..ed7079008e9 100644 --- a/src/mixer/basetrackplayer.cpp +++ b/src/mixer/basetrackplayer.cpp @@ -536,7 +536,7 @@ void BaseTrackPlayerImpl::slotTrackColorChanged(double v) { mixxx::RgbColor::optional_t color = std::nullopt; if (v != kNoTrackColor) { auto colorCode = static_cast(v); - if (v != mixxx::RgbColor::validateCode(colorCode)) { + if (!mixxx::RgbColor::isValidCode(colorCode)) { return; } color = mixxx::RgbColor::optional(colorCode); From ed6c8fd7851738cb455b117e0381eaadc850a841 Mon Sep 17 00:00:00 2001 From: Jan Holthuis Date: Wed, 15 Apr 2020 15:18:12 +0200 Subject: [PATCH 4/4] mixer/basetrackplayer: Move track color validation to CO change request --- src/mixer/basetrackplayer.cpp | 14 ++++++++------ src/mixer/basetrackplayer.h | 2 +- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/mixer/basetrackplayer.cpp b/src/mixer/basetrackplayer.cpp index ed7079008e9..729b1704929 100644 --- a/src/mixer/basetrackplayer.cpp +++ b/src/mixer/basetrackplayer.cpp @@ -26,6 +26,9 @@ namespace { const double kNoTrackColor = -1; +inline double trackColorToDouble(mixxx::RgbColor::optional_t color) { + return (color ? static_cast(*color) : kNoTrackColor); +} } BaseTrackPlayer::BaseTrackPlayer(QObject* pParent, const QString& group) @@ -89,10 +92,8 @@ BaseTrackPlayerImpl::BaseTrackPlayerImpl(QObject* pParent, ConfigKey(getGroup(), "track_color")); m_pTrackColor->set(kNoTrackColor); - connect(m_pTrackColor.get(), - &ControlObject::valueChanged, - this, - &BaseTrackPlayerImpl::slotTrackColorChanged); + m_pTrackColor->connectValueChangeRequest( + this, &BaseTrackPlayerImpl::slotTrackColorChangeRequest); // Deck cloning m_pCloneFromDeck = std::make_unique( @@ -525,10 +526,10 @@ void BaseTrackPlayerImpl::slotSetReplayGain(mixxx::ReplayGain replayGain) { } void BaseTrackPlayerImpl::slotSetTrackColor(mixxx::RgbColor::optional_t color) { - m_pTrackColor->set(color ? static_cast(*color) : kNoTrackColor); + m_pTrackColor->forceSet(trackColorToDouble(color)); } -void BaseTrackPlayerImpl::slotTrackColorChanged(double v) { +void BaseTrackPlayerImpl::slotTrackColorChangeRequest(double v) { if (!m_pLoadedTrack) { return; } @@ -541,6 +542,7 @@ void BaseTrackPlayerImpl::slotTrackColorChanged(double v) { } color = mixxx::RgbColor::optional(colorCode); } + m_pTrackColor->setAndConfirm(trackColorToDouble(color)); m_pLoadedTrack->setColor(color); } diff --git a/src/mixer/basetrackplayer.h b/src/mixer/basetrackplayer.h index d2990b7736b..df52a590610 100644 --- a/src/mixer/basetrackplayer.h +++ b/src/mixer/basetrackplayer.h @@ -86,7 +86,7 @@ class BaseTrackPlayerImpl : public BaseTrackPlayer { private slots: void slotCloneChannel(EngineChannel* pChannel); void slotCloneFromDeck(double deck); - void slotTrackColorChanged(double value); + void slotTrackColorChangeRequest(double value); void slotVinylControlEnabled(double v); void slotWaveformZoomValueChangeRequest(double pressed); void slotWaveformZoomUp(double pressed);