Skip to content
3 changes: 3 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1388,6 +1388,9 @@ add_library(
src/library/autodj/autodjprocessor.cpp
src/library/autodj/dlgautodj.cpp
src/library/autodj/dlgautodj.ui
src/library/autodj/track/deckattributes.cpp
src/library/autodj/track/trackattributes.cpp
src/library/autodj/track/trackordeckattributes.cpp
src/library/banshee/bansheedbconnection.cpp
src/library/banshee/bansheefeature.cpp
src/library/banshee/bansheeplaylistmodel.cpp
Expand Down
93 changes: 1 addition & 92 deletions src/library/autodj/autodjprocessor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,105 +13,14 @@ const QString kControlGroup = QStringLiteral("[AutoDJ]");
const char* kTransitionPreferenceName = "Transition";
const char* kTransitionModePreferenceName = "TransitionMode";
constexpr double kTransitionPreferenceDefault = 10.0;
constexpr double kKeepPosition = -1.0;
constexpr double kKeepPosition = TrackOrDeckAttributes::kKeepPosition;

// A track needs to be longer than two callbacks to not stop AutoDJ
constexpr double kMinimumTrackDurationSec = 0.2;

constexpr bool sDebug = false;
} // anonymous namespace

DeckAttributes::DeckAttributes(int index,
BaseTrackPlayer* pPlayer)
: index(index),
group(pPlayer->getGroup()),
startPos(kKeepPosition),
fadeBeginPos(1.0),
fadeEndPos(1.0),
isFromDeck(false),
loading(false),
m_orientation(group, "orientation"),
m_playPos(group, "playposition"),
m_play(group, "play"),
m_repeat(group, "repeat"),
m_introStartPos(group, "intro_start_position"),
m_introEndPos(group, "intro_end_position"),
m_outroStartPos(group, "outro_start_position"),
m_outroEndPos(group, "outro_end_position"),
m_trackSamples(group, "track_samples"),
m_sampleRate(group, "track_samplerate"),
m_rateRatio(group, "rate_ratio"),
m_pPlayer(pPlayer) {
connect(m_pPlayer, &BaseTrackPlayer::newTrackLoaded,
this, &DeckAttributes::slotTrackLoaded);
connect(m_pPlayer, &BaseTrackPlayer::loadingTrack,
this, &DeckAttributes::slotLoadingTrack);
connect(m_pPlayer, &BaseTrackPlayer::playerEmpty,
this, &DeckAttributes::slotPlayerEmpty);
m_playPos.connectValueChanged(this, &DeckAttributes::slotPlayPosChanged);
m_play.connectValueChanged(this, &DeckAttributes::slotPlayChanged);
m_introStartPos.connectValueChanged(this, &DeckAttributes::slotIntroStartPositionChanged);
m_introEndPos.connectValueChanged(this, &DeckAttributes::slotIntroEndPositionChanged);
m_outroStartPos.connectValueChanged(this, &DeckAttributes::slotOutroStartPositionChanged);
m_outroEndPos.connectValueChanged(this, &DeckAttributes::slotOutroEndPositionChanged);
m_rateRatio.connectValueChanged(this, &DeckAttributes::slotRateChanged);
m_orientation.connectValueChanged(this, &DeckAttributes::slotOrientationChanged);
}

DeckAttributes::~DeckAttributes() {
}

void DeckAttributes::slotPlayChanged(double v) {
emit playChanged(this, v > 0.0);
}

void DeckAttributes::slotPlayPosChanged(double v) {
emit playPositionChanged(this, v);
}

void DeckAttributes::slotIntroStartPositionChanged(double v) {
emit introStartPositionChanged(this, v);
}

void DeckAttributes::slotIntroEndPositionChanged(double v) {
emit introEndPositionChanged(this, v);
}

void DeckAttributes::slotOutroStartPositionChanged(double v) {
emit outroStartPositionChanged(this, v);
}

void DeckAttributes::slotOutroEndPositionChanged(double v) {
emit outroEndPositionChanged(this, v);
}

void DeckAttributes::slotTrackLoaded(TrackPointer pTrack) {
emit trackLoaded(this, pTrack);
}

void DeckAttributes::slotLoadingTrack(TrackPointer pNewTrack, TrackPointer pOldTrack) {
//qDebug() << "DeckAttributes::slotLoadingTrack";
emit loadingTrack(this, pNewTrack, pOldTrack);
}

void DeckAttributes::slotPlayerEmpty() {
emit playerEmpty(this);
}

void DeckAttributes::slotRateChanged(double v) {
Q_UNUSED(v);
emit rateChanged(this);
}

void DeckAttributes::slotOrientationChanged(double v) {
Q_UNUSED(v);
emit orientationChanged(this);
}

TrackPointer DeckAttributes::getLoadedTrack() const {
return m_pPlayer != nullptr ? m_pPlayer->getLoadedTrack() : TrackPointer();
}

AutoDJProcessor::AutoDJProcessor(
QObject* pParent,
UserSettingsPointer pConfig,
Expand Down
128 changes: 3 additions & 125 deletions src/library/autodj/autodjprocessor.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@
#include "control/controlproxy.h"
#include "control/controlpushbutton.h"
#include "control/pollingcontrolproxy.h"
#include "engine/channels/enginechannel.h"
#include "library/autodj/track/deckattributes.h"
#include "library/autodj/track/trackattributes.h"
#include "library/autodj/track/trackordeckattributes.h"
#include "library/playlisttablemodel.h"
#include "preferences/usersettings.h"
#include "track/track_decl.h"
Expand All @@ -18,132 +20,8 @@

class TrackCollectionManager;
class PlayerManagerInterface;
class BaseTrackPlayer;
typedef QList<QModelIndex> QModelIndexList;

class DeckAttributes : public QObject {
Q_OBJECT
public:
DeckAttributes(int index,
BaseTrackPlayer* pPlayer);
virtual ~DeckAttributes();

bool isLeft() const {
return m_orientation.get() == static_cast<double>(EngineChannel::LEFT);
}

bool isRight() const {
return m_orientation.get() == static_cast<double>(EngineChannel::RIGHT);
}

bool isPlaying() const {
return m_play.toBool();
}

void stop() {
m_play.set(0.0);
}

void play() {
m_play.set(1.0);
}

double playPosition() const {
return m_playPos.get();
}

void setPlayPosition(double playpos) {
m_playPos.set(playpos);
}

bool isRepeat() const {
return m_repeat.toBool();
}

void setRepeat(bool enabled) {
m_repeat.set(enabled ? 1.0 : 0.0);
}

mixxx::audio::FramePos introStartPosition() const {
return mixxx::audio::FramePos::fromEngineSamplePosMaybeInvalid(m_introStartPos.get());
}

mixxx::audio::FramePos introEndPosition() const {
return mixxx::audio::FramePos::fromEngineSamplePosMaybeInvalid(m_introEndPos.get());
}

mixxx::audio::FramePos outroStartPosition() const {
return mixxx::audio::FramePos::fromEngineSamplePosMaybeInvalid(m_outroStartPos.get());
}

mixxx::audio::FramePos outroEndPosition() const {
return mixxx::audio::FramePos::fromEngineSamplePosMaybeInvalid(m_outroEndPos.get());
}

mixxx::audio::SampleRate sampleRate() const {
return mixxx::audio::SampleRate::fromDouble(m_sampleRate.get());
}

mixxx::audio::FramePos trackEndPosition() const {
return mixxx::audio::FramePos::fromEngineSamplePosMaybeInvalid(m_trackSamples.get());
}

double rateRatio() const {
return m_rateRatio.get();
}

TrackPointer getLoadedTrack() const;

signals:
void playChanged(DeckAttributes* pDeck, bool playing);
void playPositionChanged(DeckAttributes* pDeck, double playPosition);
void introStartPositionChanged(DeckAttributes* pDeck, double introStartPosition);
void introEndPositionChanged(DeckAttributes* pDeck, double introEndPosition);
void outroStartPositionChanged(DeckAttributes* pDeck, double outtroStartPosition);
void outroEndPositionChanged(DeckAttributes* pDeck, double outroEndPosition);
void trackLoaded(DeckAttributes* pDeck, TrackPointer pTrack);
void loadingTrack(DeckAttributes* pDeck, TrackPointer pNewTrack, TrackPointer pOldTrack);
void playerEmpty(DeckAttributes* pDeck);
void rateChanged(DeckAttributes* pDeck);
void orientationChanged(DeckAttributes* pDeck);

private slots:
void slotPlayPosChanged(double v);
void slotPlayChanged(double v);
void slotIntroStartPositionChanged(double v);
void slotIntroEndPositionChanged(double v);
void slotOutroStartPositionChanged(double v);
void slotOutroEndPositionChanged(double v);
void slotTrackLoaded(TrackPointer pTrack);
void slotLoadingTrack(TrackPointer pNewTrack, TrackPointer pOldTrack);
void slotPlayerEmpty();
void slotRateChanged(double v);
void slotOrientationChanged(double v);

public:
int index;
QString group;
double startPos; // Set in toDeck nature
double fadeBeginPos; // set in fromDeck nature
double fadeEndPos; // set in fromDeck nature
bool isFromDeck;
bool loading; // The data is inconsistent during loading a deck

private:
ControlProxy m_orientation;
ControlProxy m_playPos;
ControlProxy m_play;
ControlProxy m_repeat;
ControlProxy m_introStartPos;
ControlProxy m_introEndPos;
ControlProxy m_outroStartPos;
ControlProxy m_outroEndPos;
ControlProxy m_trackSamples;
ControlProxy m_sampleRate;
ControlProxy m_rateRatio;
BaseTrackPlayer* m_pPlayer;
};

class AutoDJProcessor : public QObject {
Q_OBJECT
public:
Expand Down
88 changes: 88 additions & 0 deletions src/library/autodj/track/deckattributes.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
#include "library/autodj/track/deckattributes.h"

#include "mixer/basetrackplayer.h"
#include "moc_deckattributes.cpp"

DeckAttributes::DeckAttributes(int index,
BaseTrackPlayer* pPlayer)
: index(index),
group(pPlayer->getGroup()),
loading(false),
m_orientation(group, "orientation"),
m_playPos(group, "playposition"),
m_play(group, "play"),
m_repeat(group, "repeat"),
m_introStartPos(group, "intro_start_position"),
m_introEndPos(group, "intro_end_position"),
m_outroStartPos(group, "outro_start_position"),
m_outroEndPos(group, "outro_end_position"),
m_trackSamples(group, "track_samples"),
m_sampleRate(group, "track_samplerate"),
m_rateRatio(group, "rate_ratio"),
m_pPlayer(pPlayer) {
connect(m_pPlayer, &BaseTrackPlayer::newTrackLoaded, this, &DeckAttributes::slotTrackLoaded);
connect(m_pPlayer, &BaseTrackPlayer::loadingTrack, this, &DeckAttributes::slotLoadingTrack);
connect(m_pPlayer, &BaseTrackPlayer::playerEmpty, this, &DeckAttributes::slotPlayerEmpty);
m_playPos.connectValueChanged(this, &DeckAttributes::slotPlayPosChanged);
m_play.connectValueChanged(this, &DeckAttributes::slotPlayChanged);
m_introStartPos.connectValueChanged(this, &DeckAttributes::slotIntroStartPositionChanged);
m_introEndPos.connectValueChanged(this, &DeckAttributes::slotIntroEndPositionChanged);
m_outroStartPos.connectValueChanged(this, &DeckAttributes::slotOutroStartPositionChanged);
m_outroEndPos.connectValueChanged(this, &DeckAttributes::slotOutroEndPositionChanged);
m_rateRatio.connectValueChanged(this, &DeckAttributes::slotRateChanged);
m_orientation.connectValueChanged(this, &DeckAttributes::slotOrientationChanged);
}

DeckAttributes::~DeckAttributes() {
}

void DeckAttributes::slotPlayChanged(double v) {
emit playChanged(this, v > 0.0);
}

void DeckAttributes::slotPlayPosChanged(double v) {
emit playPositionChanged(this, v);
}

void DeckAttributes::slotIntroStartPositionChanged(double v) {
emit introStartPositionChanged(this, v);
}

void DeckAttributes::slotIntroEndPositionChanged(double v) {
emit introEndPositionChanged(this, v);
}

void DeckAttributes::slotOutroStartPositionChanged(double v) {
emit outroStartPositionChanged(this, v);
}

void DeckAttributes::slotOutroEndPositionChanged(double v) {
emit outroEndPositionChanged(this, v);
}

void DeckAttributes::slotTrackLoaded(TrackPointer pTrack) {
emit trackLoaded(this, pTrack);
}

void DeckAttributes::slotLoadingTrack(TrackPointer pNewTrack, TrackPointer pOldTrack) {
// qDebug() << "DeckAttributes::slotLoadingTrack";
emit loadingTrack(this, pNewTrack, pOldTrack);
}

void DeckAttributes::slotPlayerEmpty() {
emit playerEmpty(this);
}

void DeckAttributes::slotRateChanged(double v) {
Q_UNUSED(v);
emit rateChanged(this);
}

void DeckAttributes::slotOrientationChanged(double v) {
Q_UNUSED(v);
emit orientationChanged(this);
}

TrackPointer DeckAttributes::getLoadedTrack() const {
return m_pPlayer != nullptr ? m_pPlayer->getLoadedTrack() : TrackPointer();
}
Loading
Loading