diff --git a/src/mixer/basetrackplayer.cpp b/src/mixer/basetrackplayer.cpp index 2759b7aae5a..729b1704929 100644 --- a/src/mixer/basetrackplayer.cpp +++ b/src/mixer/basetrackplayer.cpp @@ -22,6 +22,15 @@ #include "vinylcontrol/defs_vinylcontrol.h" #include "engine/sync/enginesync.h" +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) : BasePlayer(pParent, group) { } @@ -78,34 +87,50 @@ 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); + m_pTrackColor->connectValueChangeRequest( + this, &BaseTrackPlayerImpl::slotTrackColorChangeRequest); + // 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 +163,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 +237,6 @@ void BaseTrackPlayerImpl::loadTrack(TrackPointer pTrack) { ConfigKey(m_pChannelToCloneFrom->getGroup(), "loop_end_position"))); } - connectLoadedTrack(); } @@ -246,12 +281,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 +364,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 +383,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 +525,27 @@ void BaseTrackPlayerImpl::slotSetReplayGain(mixxx::ReplayGain replayGain) { } } +void BaseTrackPlayerImpl::slotSetTrackColor(mixxx::RgbColor::optional_t color) { + m_pTrackColor->forceSet(trackColorToDouble(color)); +} + +void BaseTrackPlayerImpl::slotTrackColorChangeRequest(double v) { + if (!m_pLoadedTrack) { + return; + } + + mixxx::RgbColor::optional_t color = std::nullopt; + if (v != kNoTrackColor) { + auto colorCode = static_cast(v); + if (!mixxx::RgbColor::isValidCode(colorCode)) { + return; + } + color = mixxx::RgbColor::optional(colorCode); + } + m_pTrackColor->setAndConfirm(trackColorToDouble(color)); + 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..df52a590610 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 slotTrackColorChangeRequest(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..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); } } @@ -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..b04ba91feee 100644 --- a/src/track/track.h +++ b/src/track/track.h @@ -329,7 +329,8 @@ 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();