Skip to content

Commit

Permalink
Merge pull request #10944 from mbacarella/keep-deck-playing-on-track-…
Browse files Browse the repository at this point in the history
…load

Option to keep deck playing on track load
  • Loading branch information
daschuer authored Oct 19, 2022
2 parents a701f80 + ed7001e commit 8cd8908
Show file tree
Hide file tree
Showing 10 changed files with 151 additions and 64 deletions.
27 changes: 24 additions & 3 deletions src/mixer/playermanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -686,16 +686,37 @@ void PlayerManager::slotLoadLocationToPlayer(
emit loadLocationToPlayer(location, group, play);
}

void PlayerManager::slotLoadLocationToPlayerMaybePlay(
const QString& location, const QString& group) {
bool play = false;
LoadWhenDeckPlaying loadWhenDeckPlaying =
static_cast<LoadWhenDeckPlaying>(
m_pConfig->getValue(kConfigKeyLoadWhenDeckPlaying,
static_cast<int>(kDefaultLoadWhenDeckPlaying)));
switch (loadWhenDeckPlaying) {
case LoadWhenDeckPlaying::AllowButStopDeck:
case LoadWhenDeckPlaying::Reject:
break;
case LoadWhenDeckPlaying::Allow:
if (ControlObject::get(ConfigKey(group, "play")) > 0.0) {
// deck is currently playing, so immediately play new track
play = true;
}
break;
}
slotLoadLocationToPlayer(location, group, play);
}

void PlayerManager::slotLoadToDeck(const QString& location, int deck) {
slotLoadLocationToPlayer(location, groupForDeck(deck - 1));
slotLoadLocationToPlayer(location, groupForDeck(deck - 1), false);
}

void PlayerManager::slotLoadToPreviewDeck(const QString& location, int previewDeck) {
slotLoadLocationToPlayer(location, groupForPreviewDeck(previewDeck - 1));
slotLoadLocationToPlayer(location, groupForPreviewDeck(previewDeck - 1), false);
}

void PlayerManager::slotLoadToSampler(const QString& location, int sampler) {
slotLoadLocationToPlayer(location, groupForSampler(sampler - 1));
slotLoadLocationToPlayer(location, groupForSampler(sampler - 1), false);
}

void PlayerManager::slotLoadTrackIntoNextAvailableDeck(TrackPointer pTrack) {
Expand Down
9 changes: 4 additions & 5 deletions src/mixer/playermanager.h
Original file line number Diff line number Diff line change
Expand Up @@ -186,11 +186,10 @@ class PlayerManager : public QObject, public PlayerManagerInterface {

public slots:
// Slots for loading tracks into a Player, which is either a Sampler or a Deck
void slotLoadTrackToPlayer(TrackPointer pTrack, const QString& group, bool play = false);
void slotLoadLocationToPlayer(const QString& location, const QString& group, bool play = false);
void slotLoadLocationToPlayerStopped(const QString& location, const QString& group) {
slotLoadLocationToPlayer(location, group, false);
};
void slotLoadTrackToPlayer(TrackPointer pTrack, const QString& group, bool play);
void slotLoadLocationToPlayer(const QString& location, const QString& group, bool play);
void slotLoadLocationToPlayerMaybePlay(const QString& location, const QString& group);

void slotCloneDeck(const QString& source_group, const QString& target_group);

// Slots for loading tracks to decks
Expand Down
4 changes: 2 additions & 2 deletions src/mixer/samplerbank.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -214,9 +214,9 @@ bool SamplerBank::loadSamplerBankFromPath(const QString& samplerBankPath) {
}

if (location.isEmpty()) {
m_pPlayerManager->slotLoadTrackToPlayer(TrackPointer(), group);
m_pPlayerManager->slotLoadTrackToPlayer(TrackPointer(), group, false);
} else {
m_pPlayerManager->slotLoadLocationToPlayer(location, group);
m_pPlayerManager->slotLoadLocationToPlayer(location, group, false);
}
}

Expand Down
57 changes: 35 additions & 22 deletions src/preferences/dialog/dlgprefdeck.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -153,16 +153,6 @@ DlgPrefDeck::DlgPrefDeck(QWidget* parent,
comboBoxTimeFormat->setCurrentIndex(
comboBoxTimeFormat->findData(time_format));

// Override Playing Track on Track Load
// The check box reflects the opposite of the config value
m_bDisallowTrackLoadToPlayingDeck = !m_pConfig->getValue(
ConfigKey("[Controls]", "AllowTrackLoadToPlayingDeck"), false);
checkBoxDisallowLoadToPlayingDeck->setChecked(m_bDisallowTrackLoadToPlayingDeck);
connect(checkBoxDisallowLoadToPlayingDeck,
&QCheckBox::toggled,
this,
&DlgPrefDeck::slotDisallowTrackLoadToPlayingDeckCheckbox);

comboBoxLoadPoint->addItem(tr("Intro start"), static_cast<int>(SeekOnLoadMode::IntroStart));
comboBoxLoadPoint->addItem(tr("Main cue"), static_cast<int>(SeekOnLoadMode::MainCue));
comboBoxLoadPoint->addItem(tr("First sound (skip silence)"), static_cast<int>(SeekOnLoadMode::FirstSound));
Expand All @@ -178,6 +168,31 @@ DlgPrefDeck::DlgPrefDeck(QWidget* parent,
this,
&DlgPrefDeck::slotSetTrackLoadMode);

comboBoxLoadWhenDeckPlaying->addItem(
tr("Reject"), static_cast<int>(LoadWhenDeckPlaying::Reject));
comboBoxLoadWhenDeckPlaying->addItem(tr("Allow, but stop deck"),
static_cast<int>(LoadWhenDeckPlaying::AllowButStopDeck));
comboBoxLoadWhenDeckPlaying->addItem(tr("Allow, play from load point"),
static_cast<int>(LoadWhenDeckPlaying::Allow));
int loadWhenDeckPlaying;
if (m_pConfig->exists(kConfigKeyLoadWhenDeckPlaying)) {
loadWhenDeckPlaying = m_pConfig->getValueString(kConfigKeyLoadWhenDeckPlaying).toInt();
} else {
// upgrade from older versions
if (m_pConfig->getValue(kConfigKeyAllowTrackLoadToPlayingDeck, false)) {
loadWhenDeckPlaying = static_cast<int>(LoadWhenDeckPlaying::Allow);
} else {
loadWhenDeckPlaying = static_cast<int>(kDefaultLoadWhenDeckPlaying);
}
}
comboBoxLoadWhenDeckPlaying->setCurrentIndex(
comboBoxLoadWhenDeckPlaying->findData(loadWhenDeckPlaying));
m_loadWhenDeckPlaying = static_cast<LoadWhenDeckPlaying>(loadWhenDeckPlaying);
connect(comboBoxLoadWhenDeckPlaying,
QOverload<int>::of(&QComboBox::currentIndexChanged),
this,
&DlgPrefDeck::slotLoadWhenDeckPlayingIndexChanged);

// This option was introduced in Mixxx 2.3 with the intro & outro cues.
// If the user has set main cue points with the intention of starting tracks
// from those points, enable this option. With Denon and Numark CueModes,
Expand Down Expand Up @@ -432,9 +447,6 @@ void DlgPrefDeck::slotUpdate() {

slotSetTrackTimeDisplay(m_pControlTrackTimeDisplay->get());

checkBoxDisallowLoadToPlayingDeck->setChecked(!m_pConfig->getValue(
ConfigKey("[Controls]", "AllowTrackLoadToPlayingDeck"), false));

checkBoxCloneDeckOnLoadDoubleTap->setChecked(m_pConfig->getValue(
ConfigKey("[Controls]", "CloneDeckOnLoadDoubleTap"), true));

Expand Down Expand Up @@ -511,14 +523,15 @@ void DlgPrefDeck::slotResetToDefaults() {
// 8% Rate Range
ComboBoxRateRange->setCurrentIndex(ComboBoxRateRange->findData(kDefaultRateRangePercent));

// Don't load tracks into playing decks.
checkBoxDisallowLoadToPlayingDeck->setChecked(true);

// Clone decks by double-tapping Load button.
checkBoxCloneDeckOnLoadDoubleTap->setChecked(kDefaultCloneDeckOnLoad);

// Mixxx cue mode
ComboBoxCueMode->setCurrentIndex(0);

// What to do if someone loads into a playing deck
comboBoxLoadWhenDeckPlaying->setCurrentIndex(static_cast<int>(kDefaultLoadWhenDeckPlaying));

// Load at intro start
comboBoxLoadPoint->setCurrentIndex(
comboBoxLoadPoint->findData(static_cast<int>(SeekOnLoadMode::IntroStart)));
Expand Down Expand Up @@ -594,10 +607,6 @@ void DlgPrefDeck::slotKeyUnlockModeSelected(QAbstractButton* pressedButton) {
}
}

void DlgPrefDeck::slotDisallowTrackLoadToPlayingDeckCheckbox(bool checked) {
m_bDisallowTrackLoadToPlayingDeck = checked;
}

void DlgPrefDeck::slotCueModeCombobox(int index) {
m_cueMode = static_cast<CueMode>(ComboBoxCueMode->itemData(index).toInt());
}
Expand Down Expand Up @@ -668,6 +677,11 @@ void DlgPrefDeck::slotSetTrackLoadMode(int comboboxIndex) {
comboBoxLoadPoint->itemData(comboboxIndex).toInt());
}

void DlgPrefDeck::slotLoadWhenDeckPlayingIndexChanged(int comboboxIndex) {
m_loadWhenDeckPlaying = static_cast<LoadWhenDeckPlaying>(
comboBoxLoadWhenDeckPlaying->itemData(comboboxIndex).toInt());
}

void DlgPrefDeck::slotApply() {
m_pConfig->set(ConfigKey("[Controls]", "SetIntroStartAtMainCue"),
ConfigValue(m_bSetIntroStartAtMainCue));
Expand All @@ -687,8 +701,7 @@ void DlgPrefDeck::slotApply() {
}
m_pConfig->setValue(ConfigKey("[Controls]", "CueDefault"), static_cast<int>(m_cueMode));

m_pConfig->setValue(ConfigKey("[Controls]", "AllowTrackLoadToPlayingDeck"),
!m_bDisallowTrackLoadToPlayingDeck);
m_pConfig->setValue(kConfigKeyLoadWhenDeckPlaying, static_cast<int>(m_loadWhenDeckPlaying));

m_pConfig->setValue(ConfigKey("[Controls]", "CueRecall"), static_cast<int>(m_seekOnLoadMode));
m_pConfig->setValue(ConfigKey("[Controls]", "CloneDeckOnLoadDoubleTap"),
Expand Down
17 changes: 15 additions & 2 deletions src/preferences/dialog/dlgprefdeck.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,19 @@ enum class KeyunlockMode {
KeepLockedKey
};

enum class LoadWhenDeckPlaying {
Reject,
Allow,
AllowButStopDeck
};

namespace {
const ConfigKey kConfigKeyLoadWhenDeckPlaying = ConfigKey("[Controls]", "LoadWhenDeckPlaying");
const ConfigKey kConfigKeyAllowTrackLoadToPlayingDeck =
ConfigKey("[Controls]", "AllowTrackLoadToPlayingDeck");
constexpr LoadWhenDeckPlaying kDefaultLoadWhenDeckPlaying = LoadWhenDeckPlaying::Reject;
} // namespace

class DlgPrefDeck : public DlgPreferencePage, public Ui::DlgPrefDeckDlg {
Q_OBJECT
public:
Expand All @@ -68,9 +81,9 @@ class DlgPrefDeck : public DlgPreferencePage, public Ui::DlgPrefDeckDlg {
void slotRatePermFineSpinbox(double);
void slotSetTrackTimeDisplay(QAbstractButton*);
void slotSetTrackTimeDisplay(double);
void slotDisallowTrackLoadToPlayingDeckCheckbox(bool);
void slotCueModeCombobox(int);
void slotSetTrackLoadMode(int comboboxIndex);
void slotLoadWhenDeckPlayingIndexChanged(int comboboxIndex);
void slotCloneDeckOnLoadDoubleTapCheckbox(bool);
void slotRateRampingModeLinearButton(bool);
void slotRateRampSensitivitySlider(int);
Expand Down Expand Up @@ -116,7 +129,6 @@ class DlgPrefDeck : public DlgPreferencePage, public Ui::DlgPrefDeckDlg {
CueMode m_cueMode;

bool m_bSetIntroStartAtMainCue;
bool m_bDisallowTrackLoadToPlayingDeck;
bool m_bCloneDeckOnLoadDoubleTap;

int m_iRateRangePercent;
Expand All @@ -127,6 +139,7 @@ class DlgPrefDeck : public DlgPreferencePage, public Ui::DlgPrefDeckDlg {
KeylockMode m_keylockMode;
KeyunlockMode m_keyunlockMode;
SeekOnLoadMode m_seekOnLoadMode;
LoadWhenDeckPlaying m_loadWhenDeckPlaying;

RateControl::RampMode m_bRateRamping;
int m_iRateRampSensitivity;
Expand Down
14 changes: 5 additions & 9 deletions src/preferences/dialog/dlgprefdeckdlg.ui
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,12 @@
<number>10</number>
</property>
<item row="5" column="0">
<widget class="QLabel" name="labelPlayingTrackProtection">
<widget class="QLabel" name="labelLoadWhenDeckPlaying">
<property name="text">
<string>Playing track protection</string>
<string>Loading a track, when deck is playing</string>
</property>
<property name="buddy">
<cstring>checkBoxDisallowLoadToPlayingDeck</cstring>
<cstring>comboBoxLoadWhenDeckPlaying</cstring>
</property>
</widget>
</item>
Expand Down Expand Up @@ -145,11 +145,7 @@ CUP mode:
</widget>
</item>
<item row="5" column="1" colspan="2">
<widget class="QCheckBox" name="checkBoxDisallowLoadToPlayingDeck">
<property name="text">
<string>Do not load tracks into playing decks</string>
</property>
</widget>
<widget class="QComboBox" name="comboBoxLoadWhenDeckPlaying"/>
</item>
<item row="2" column="1" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout">
Expand Down Expand Up @@ -661,7 +657,7 @@ You can always drag-and-drop tracks on screen to clone a deck.</string>
<tabstop>radioButtonElapsedAndRemaining</tabstop>
<tabstop>comboBoxTimeFormat</tabstop>
<tabstop>comboBoxLoadPoint</tabstop>
<tabstop>checkBoxDisallowLoadToPlayingDeck</tabstop>
<tabstop>comboBoxLoadWhenDeckPlaying</tabstop>
<tabstop>checkBoxCloneDeckOnLoadDoubleTap</tabstop>
<tabstop>ComboBoxRateRange</tabstop>
<tabstop>checkBoxInvertSpeedSlider</tabstop>
Expand Down
14 changes: 7 additions & 7 deletions src/skin/legacy/legacyskinparser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -972,7 +972,7 @@ QWidget* LegacySkinParser::parseOverview(const QDomElement& node) {
connect(overviewWidget,
&WOverview::trackDropped,
m_pPlayerManager,
&PlayerManager::slotLoadLocationToPlayerStopped);
&PlayerManager::slotLoadLocationToPlayerMaybePlay);
connect(overviewWidget, &WOverview::cloneDeck,
m_pPlayerManager, &PlayerManager::slotCloneDeck);

Expand Down Expand Up @@ -1033,7 +1033,7 @@ QWidget* LegacySkinParser::parseVisual(const QDomElement& node) {
connect(viewer,
&WWaveformViewer::trackDropped,
m_pPlayerManager,
&PlayerManager::slotLoadLocationToPlayerStopped);
&PlayerManager::slotLoadLocationToPlayerMaybePlay);
connect(viewer, &WWaveformViewer::cloneDeck,
m_pPlayerManager, &PlayerManager::slotCloneDeck);

Expand Down Expand Up @@ -1063,7 +1063,7 @@ QWidget* LegacySkinParser::parseText(const QDomElement& node) {
connect(pTrackText,
&WTrackText::trackDropped,
m_pPlayerManager,
&PlayerManager::slotLoadLocationToPlayerStopped);
&PlayerManager::slotLoadLocationToPlayerMaybePlay);
connect(pTrackText, &WTrackText::cloneDeck, m_pPlayerManager, &PlayerManager::slotCloneDeck);

TrackPointer pTrack = pPlayer->getLoadedTrack();
Expand Down Expand Up @@ -1100,7 +1100,7 @@ QWidget* LegacySkinParser::parseTrackProperty(const QDomElement& node) {
connect(pTrackProperty,
&WTrackProperty::trackDropped,
m_pPlayerManager,
&PlayerManager::slotLoadLocationToPlayerStopped);
&PlayerManager::slotLoadLocationToPlayerMaybePlay);
connect(pTrackProperty,
&WTrackProperty::cloneDeck,
m_pPlayerManager,
Expand Down Expand Up @@ -1143,7 +1143,7 @@ QWidget* LegacySkinParser::parseTrackWidgetGroup(const QDomElement& node) {
connect(pGroup,
&WTrackWidgetGroup::trackDropped,
m_pPlayerManager,
&PlayerManager::slotLoadLocationToPlayerStopped);
&PlayerManager::slotLoadLocationToPlayerMaybePlay);
connect(pGroup,
&WTrackWidgetGroup::cloneDeck,
m_pPlayerManager,
Expand Down Expand Up @@ -1319,7 +1319,7 @@ QWidget* LegacySkinParser::parseSpinny(const QDomElement& node) {
connect(pSpinny,
&WSpinny::trackDropped,
m_pPlayerManager,
&PlayerManager::slotLoadLocationToPlayerStopped);
&PlayerManager::slotLoadLocationToPlayerMaybePlay);
connect(pSpinny, &WSpinny::cloneDeck, m_pPlayerManager, &PlayerManager::slotCloneDeck);

ControlObject* showCoverControl = controlFromConfigNode(node.toElement(), "ShowCoverControl");
Expand Down Expand Up @@ -1436,7 +1436,7 @@ QWidget* LegacySkinParser::parseCoverArt(const QDomElement& node) {
connect(pCoverArt,
&WCoverArt::trackDropped,
m_pPlayerManager,
&PlayerManager::slotLoadLocationToPlayerStopped);
&PlayerManager::slotLoadLocationToPlayerMaybePlay);
connect(pCoverArt, &WCoverArt::cloneDeck,
m_pPlayerManager, &PlayerManager::slotCloneDeck);
}
Expand Down
23 changes: 19 additions & 4 deletions src/util/dnd.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
#include "library/parserm3u.h"
#include "library/parserpls.h"
#include "mixer/playermanager.h"
#include "preferences/dialog/dlgprefdeck.h"
#include "sources/soundsourceproxy.h"
#include "track/track.h"

Expand Down Expand Up @@ -80,10 +81,24 @@ bool allowLoadToPlayer(
return true;
}

return pConfig->getValueString(
ConfigKey("[Controls]",
"AllowTrackLoadToPlayingDeck"))
.toInt();
bool allowLoadTrackIntoPlayingDeck = false;
if (pConfig->exists(kConfigKeyLoadWhenDeckPlaying)) {
int loadWhenDeckPlaying =
pConfig->getValueString(kConfigKeyLoadWhenDeckPlaying).toInt();
switch (static_cast<LoadWhenDeckPlaying>(loadWhenDeckPlaying)) {
case LoadWhenDeckPlaying::Allow:
case LoadWhenDeckPlaying::AllowButStopDeck:
allowLoadTrackIntoPlayingDeck = true;
break;
case LoadWhenDeckPlaying::Reject:
break;
}
} else {
// support older version of this flag
allowLoadTrackIntoPlayingDeck =
pConfig->getValue<bool>(kConfigKeyAllowTrackLoadToPlayingDeck);
}
return allowLoadTrackIntoPlayingDeck;
}

} // anonymous namespace
Expand Down
Loading

0 comments on commit 8cd8908

Please sign in to comment.