Skip to content

Commit

Permalink
eject: double click does 'un-replace', i.e. reloads the previous track
Browse files Browse the repository at this point in the history
  • Loading branch information
ronso0 committed Feb 4, 2023
1 parent 6f9b26f commit 235003c
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 1 deletion.
14 changes: 13 additions & 1 deletion src/mixer/basetrackplayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,8 @@ BaseTrackPlayerImpl::BaseTrackPlayerImpl(
ConfigKey(getGroup(), "update_replaygain_from_pregain"));
m_pUpdateReplayGainFromPregain->connectValueChangeRequest(this,
&BaseTrackPlayerImpl::slotUpdateReplayGainFromPregain);

m_ejectTimer.start();
}

BaseTrackPlayerImpl::~BaseTrackPlayerImpl() {
Expand Down Expand Up @@ -309,8 +311,18 @@ void BaseTrackPlayerImpl::slotEjectTrack(double v) {
if (v <= 0) {
return;
}

mixxx::Duration elapsed = m_ejectTimer.restart();

// With no loaded track a single click reloads the last ejected track,
// while a double click restores the last replaced track.
if (!m_pLoadedTrack) {
TrackPointer lastEjected = m_pPlayerManager->getLastEjectedTrack();
TrackPointer lastEjected;
if (elapsed < mixxx::Duration::fromSeconds(0.5)) { // double click
lastEjected = m_pPlayerManager->getSecondLastEjectedTrack();
} else {
lastEjected = m_pPlayerManager->getLastEjectedTrack();
}
if (lastEjected) {
slotLoadTrack(lastEjected, false);
}
Expand Down
2 changes: 2 additions & 0 deletions src/mixer/basetrackplayer.h
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,8 @@ class BaseTrackPlayerImpl : public BaseTrackPlayer {
bool m_replaygainPending;
EngineChannel* m_pChannelToCloneFrom;

PerformanceTimer m_ejectTimer;

std::unique_ptr<ControlPushButton> m_pEject;

// Deck clone control
Expand Down
8 changes: 8 additions & 0 deletions src/mixer/playermanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -608,6 +608,13 @@ TrackPointer PlayerManager::getLastEjectedTrack() const {
return nullptr;
}

TrackPointer PlayerManager::getSecondLastEjectedTrack() const {
if (m_pLibrary) {
return m_pLibrary->trackCollectionManager()->getTrackById(m_secondLastEjectedTrackId);
}
return nullptr;
}

Microphone* PlayerManager::getMicrophone(unsigned int microphone) const {
const auto locker = lockMutex(&m_mutex);
if (microphone < 1 || microphone >= static_cast<unsigned int>(m_microphones.size())) {
Expand Down Expand Up @@ -772,6 +779,7 @@ void PlayerManager::slotSaveEjectedTrack(TrackPointer track) {
VERIFY_OR_DEBUG_ASSERT(track) {
return;
}
m_secondLastEjectedTrackId = m_lastEjectedTrackId;
m_lastEjectedTrackId = track->getId();
}

Expand Down
2 changes: 2 additions & 0 deletions src/mixer/playermanager.h
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,7 @@ class PlayerManager : public QObject, public PlayerManagerInterface {
// Returns the track that was last ejected or unloaded. Can return nullptr or
// invalid TrackId in case of error.
TrackPointer getLastEjectedTrack() const;
TrackPointer getSecondLastEjectedTrack() const;

// Get the microphone by its number. Microphones are numbered starting with 1.
Microphone* getMicrophone(unsigned int microphone) const;
Expand Down Expand Up @@ -285,6 +286,7 @@ class PlayerManager : public QObject, public PlayerManagerInterface {

TrackAnalysisScheduler::Pointer m_pTrackAnalysisScheduler;

TrackId m_secondLastEjectedTrackId;
TrackId m_lastEjectedTrackId;

QList<Deck*> m_decks;
Expand Down

0 comments on commit 235003c

Please sign in to comment.