Skip to content

Commit

Permalink
Add track color control object
Browse files Browse the repository at this point in the history
  • Loading branch information
Holzhaus committed Apr 14, 2020
1 parent 84f7398 commit 809fb92
Show file tree
Hide file tree
Showing 4 changed files with 103 additions and 39 deletions.
135 changes: 96 additions & 39 deletions src/mixer/basetrackplayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
}
Expand Down Expand Up @@ -78,34 +84,49 @@ BaseTrackPlayerImpl::BaseTrackPlayerImpl(QObject* pParent,
m_pDuration = std::make_unique<ControlObject>(
ConfigKey(getGroup(), "duration"));

// Track color of the current track
m_pTrackColor = std::make_unique<ControlObject>(
ConfigKey(getGroup(), "track_color"));
connect(m_pTrackColor.get(),
&ControlObject::valueChanged,
this,
&BaseTrackPlayerImpl::slotTrackColorChanged);

// Deck cloning
m_pCloneFromDeck = std::make_unique<ControlObject>(
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<ControlObject>(
ConfigKey(group, "waveform_zoom"));
m_pWaveformZoom->connectValueChangeRequest(
this, &BaseTrackPlayerImpl::slotWaveformZoomValueChangeRequest,
Qt::DirectConnection);
m_pWaveformZoom =
std::make_unique<ControlObject>(ConfigKey(group, "waveform_zoom"));
m_pWaveformZoom->connectValueChangeRequest(this,
&BaseTrackPlayerImpl::slotWaveformZoomValueChangeRequest,
Qt::DirectConnection);
m_pWaveformZoom->set(1.0);
m_pWaveformZoomUp = std::make_unique<ControlPushButton>(
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<ControlPushButton>(
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<ControlPushButton>(
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<ControlProxy>(group, "pregain", this);
// BPM of the current song
Expand All @@ -125,8 +146,7 @@ BaseTrackPlayerImpl::~BaseTrackPlayerImpl() {

TrackPointer BaseTrackPlayerImpl::loadFakeTrack(bool bPlay, double filebpm) {
TrackPointer pTrack(Track::newTemporary());
pTrack->setAudioProperties(
mixxx::kEngineChannelCount,
pTrack->setAudioProperties(mixxx::kEngineChannelCount,
mixxx::audio::SampleRate(44100),
mixxx::audio::Bitrate(),
mixxx::Duration::fromSeconds(10));
Expand All @@ -138,15 +158,21 @@ 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(),
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(keyUpdated(double)),
m_pKey.get(),
SLOT(set(double)));

// 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(),
SIGNAL(ReplayGainUpdated(mixxx::ReplayGain)),
this,
SLOT(slotSetReplayGain(mixxx::ReplayGain)));
}

// Request a new track from EngineBuffer
Expand Down Expand Up @@ -185,7 +211,8 @@ void BaseTrackPlayerImpl::loadTrack(TrackPointer pTrack) {
if (pCue->getType() == mixxx::CueType::Loop) {
double loopStart = pCue->getPosition();
double loopEnd = loopStart + pCue->getLength();
if (loopStart != kNoTrigger && loopEnd != kNoTrigger && loopStart <= loopEnd) {
if (loopStart != kNoTrigger && loopEnd != kNoTrigger &&
loopStart <= loopEnd) {
m_pLoopInPoint->set(loopStart);
m_pLoopOutPoint->set(loopEnd);
break;
Expand All @@ -195,13 +222,12 @@ void BaseTrackPlayerImpl::loadTrack(TrackPointer pTrack) {
} else {
// copy loop in and out points from other deck because any new loops
// won't be saved yet
m_pLoopInPoint->set(ControlObject::get(
ConfigKey(m_pChannelToCloneFrom->getGroup(), "loop_start_position")));
m_pLoopOutPoint->set(ControlObject::get(
ConfigKey(m_pChannelToCloneFrom->getGroup(), "loop_end_position")));
m_pLoopInPoint->set(ControlObject::get(ConfigKey(
m_pChannelToCloneFrom->getGroup(), "loop_start_position")));
m_pLoopOutPoint->set(ControlObject::get(ConfigKey(
m_pChannelToCloneFrom->getGroup(), "loop_end_position")));
}


connectLoadedTrack();
}

Expand All @@ -215,7 +241,8 @@ TrackPointer BaseTrackPlayerImpl::unloadTrack() {
// currently on the track, then create a new one.
double loopStart = m_pLoopInPoint->get();
double loopEnd = m_pLoopOutPoint->get();
if (loopStart != kNoTrigger && loopEnd != kNoTrigger && loopStart <= loopEnd) {
if (loopStart != kNoTrigger && loopEnd != kNoTrigger &&
loopStart <= loopEnd) {
CuePointer pLoopCue;
QList<CuePointer> cuePoints(m_pLoadedTrack->getCuePoints());
QListIterator<CuePointer> it(cuePoints);
Expand Down Expand Up @@ -246,12 +273,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() {
Expand Down Expand Up @@ -478,6 +515,26 @@ void BaseTrackPlayerImpl::slotSetReplayGain(mixxx::ReplayGain replayGain) {
}
}

void BaseTrackPlayerImpl::slotSetTrackColor(mixxx::RgbColor::optional_t color) {
m_pTrackColor->set(color ? static_cast<double>(*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<mixxx::RgbColor::code_t>(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());
Expand Down
5 changes: 5 additions & 0 deletions src/mixer/basetrackplayer.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -110,6 +112,9 @@ class BaseTrackPlayerImpl : public BaseTrackPlayer {
// Deck clone control
std::unique_ptr<ControlObject> m_pCloneFromDeck;

// Track color control
std::unique_ptr<ControlObject> m_pTrackColor;

// Waveform display related controls
std::unique_ptr<ControlObject> m_pWaveformZoom;
std::unique_ptr<ControlPushButton> m_pWaveformZoomUp;
Expand Down
1 change: 1 addition & 0 deletions src/track/track.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}

Expand Down
1 change: 1 addition & 0 deletions src/track/track.h
Original file line number Diff line number Diff line change
Expand Up @@ -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();

Expand Down

0 comments on commit 809fb92

Please sign in to comment.