void CueControl::cueCDJ(double v) { // This is how Pioneer cue buttons work: // If pressed while playing, stop playback and go to cue. // If pressed while stopped and at cue, play while pressed. // If pressed while stopped and not at cue, set new cue point. // If play is pressed while holding cue, the deck is now playing. (Handled in playFromCuePreview().) QMutexLocker lock(&m_mutex); bool playing = (m_pPlayButton->get() == 1.0); if (v) { if (playing || getCurrentSample() >= getTotalSamples()) { // Jump to cue when playing or when at end position // Just in case. m_bPreviewing = false; m_pPlayButton->set(0.0); // Need to unlock before emitting any signals to prevent deadlock. lock.unlock(); seekAbs(m_pCuePoint->get()); } else if (isTrackAtCue()) { // pause at cue point m_bPreviewing = true; m_pPlayButton->set(1.0); } else { // Pause not at cue point and not at end position cueSet(v); // Just in case. m_bPreviewing = false; // If quantize is enabled, jump to the cue point since it's not // necessarily where we currently are if (m_pQuantizeEnabled->get() > 0.0) { lock.unlock(); // prevent deadlock. // Enginebuffer will quantize more exactly than we can. seekAbs(m_pCuePoint->get()); } } } else if (m_bPreviewing) { m_bPreviewing = false; m_pPlayButton->set(0.0); // Need to unlock before emitting any signals to prevent deadlock. lock.unlock(); seekAbs(m_pCuePoint->get()); } // indicator may flash because the delayed adoption of seekAbs // Correct the Indicator set via play if (m_pLoadedTrack && !playing) { m_pCueIndicator->setBlinkValue(ControlIndicator::ON); } else { m_pCueIndicator->setBlinkValue(ControlIndicator::OFF); } }
void CueControl::cueCDJ(double v) { /* This is how CDJ cue buttons work: * If pressed while playing, stop playback and go to cue. * If pressed while stopped and at cue, play while pressed. * If pressed while stopped and not at cue, set new cue point. * If play is pressed while holding cue, the deck is now playing. (Handled in playFromCuePreview().) */ QMutexLocker lock(&m_mutex); bool playing = (m_pPlayButton->get() == 1.0); double cuePoint = m_pCuePoint->get(); if (v) { if (playing) { m_pPlayButton->set(0.0); // Just in case. m_bPreviewing = false; // Need to unlock before emitting any signals to prevent deadlock. lock.unlock(); seekAbs(cuePoint); } else { if (fabs(getCurrentSample() - m_pCuePoint->get()) < 1.0f) { m_pPlayButton->set(1.0); m_bPreviewing = true; } else { cueSet(v); // Just in case. m_bPreviewing = false; // If quantize is enabled, jump to the cue point since it's not // necessarily where we currently are if (m_pQuantizeEnabled->get() > 0.0) { lock.unlock(); // prevent deadlock. seekAbs(m_pCuePoint->get()); } } } } else if (m_bPreviewing) { m_pPlayButton->set(0.0); m_bPreviewing = false; // Need to unlock before emitting any signals to prevent deadlock. lock.unlock(); seekAbs(cuePoint); } else { // Re-trigger the play button value so controllers get the correct one // after playFromCuePreview() changes it. m_pPlayButton->set(m_pPlayButton->get()); } }
void CueControl::cueSimple(double v) { if (!v) return; QMutexLocker lock(&m_mutex); // Simple cueing is if the player is not playing, set the cue point -- // otherwise seek to the cue point. if (m_pPlayButton->get() == 0.0f) { return cueSet(v); } double cuePoint = m_pCuePoint->get(); // Need to unlock before emitting any signals to prevent deadlock. lock.unlock(); seekAbs(cuePoint); }
void CueControl::cuePlay(double v) { // This is how CUP button works: // If freely playing (i.e. playing and platter NOT being touched), press to go to cue and stop. // If not freely playing (i.e. stopped or platter IS being touched), press to go to cue and stop. // On release, start playing from cue point. QMutexLocker lock(&m_mutex); const auto freely_playing = m_pPlay->toBool() && !getEngineBuffer()->getScratching(); // pressed if (v) { if (freely_playing) { m_bPreviewing = false; m_pPlay->set(0.0); // Need to unlock before emitting any signals to prevent deadlock. lock.unlock(); seekAbs(m_pCuePoint->get()); } else if (!isTrackAtCue() && getCurrentSample() <= getTotalSamples()) { // Pause not at cue point and not at end position cueSet(v); // Just in case. m_bPreviewing = false; m_pPlay->set(0.0); // If quantize is enabled, jump to the cue point since it's not // necessarily where we currently are if (m_pQuantizeEnabled->get() > 0.0) { lock.unlock(); // prevent deadlock. // Enginebuffer will quantize more exactly than we can. seekAbs(m_pCuePoint->get()); } } } else if (isTrackAtCue()){ m_bPreviewing = false; m_pPlay->set(1.0); lock.unlock(); } }
double CueControl::updateIndicatorsAndModifyPlay(double play, bool playPossible) { QMutexLocker lock(&m_mutex); double cueMode = m_pCueMode->get(); if ((cueMode == CUE_MODE_DENON || cueMode == CUE_MODE_NUMARK) && play > 0.0 && playPossible && m_pPlayButton->get() == 0.0) { // in Denon mode each play from pause moves the cue point // if not previewing cueSet(1.0); } // when previewing, "play" was set by cue button, a following toggle request // (play = 0.0) is used for latching play. bool previewing = false; if (m_bPreviewing || m_bPreviewingHotcue) { if (play == 0.0) { // play latch request: stop previewing and go into normal play mode. m_bPreviewing = false; m_bHotcueCancel = true; play = 1.0; } else { previewing = true; } } if (!playPossible) { // play not possible play = 0.0; m_pPlayIndicator->setBlinkValue(ControlIndicator::OFF); m_pStopButton->set(0.0); } else if (play && !previewing) { // Play: Indicates a latched Play m_pPlayIndicator->setBlinkValue(ControlIndicator::ON); m_pStopButton->set(0.0); } else { // Pause: m_pStopButton->set(1.0); if (cueMode == CUE_MODE_DENON) { if (isTrackAtCue()) { m_pPlayIndicator->setBlinkValue(ControlIndicator::OFF); } else { // Flashing indicates that a following play would move cue point m_pPlayIndicator->setBlinkValue(ControlIndicator::RATIO1TO1_500MS); } } else if (cueMode == CUE_MODE_MIXXX || cueMode == CUE_MODE_NUMARK) { m_pPlayIndicator->setBlinkValue(ControlIndicator::OFF); } else { // Flashing indicates that play is possible in Pioneer mode m_pPlayIndicator->setBlinkValue(ControlIndicator::RATIO1TO1_500MS); } } if (cueMode != CUE_MODE_DENON && cueMode != CUE_MODE_NUMARK) { if (m_pCuePoint->get() != -1) { if (play == 0.0 && !isTrackAtCue() && getCurrentSample() < getTotalSamples()) { if (cueMode == CUE_MODE_MIXXX) { // in Mixxx mode Cue Button is flashing slow if CUE will move Cue point m_pCueIndicator->setBlinkValue(ControlIndicator::RATIO1TO1_500MS); } else { // in Pioneer mode Cue Button is flashing fast if CUE will move Cue point m_pCueIndicator->setBlinkValue(ControlIndicator::RATIO1TO1_250MS); } } else { m_pCueIndicator->setBlinkValue(ControlIndicator::OFF); } } else { m_pCueIndicator->setBlinkValue(ControlIndicator::OFF); } } m_pPlayStutter->set(play); return play; }
bool CueControl::updateIndicatorsAndModifyPlay(bool newPlay, bool playPossible) { //qDebug() << "updateIndicatorsAndModifyPlay" << newPlay << playPossible // << m_iCurrentlyPreviewingHotcues << m_bPreviewing; QMutexLocker lock(&m_mutex); double cueMode = m_pCueMode->get(); if ((cueMode == CUE_MODE_DENON || cueMode == CUE_MODE_NUMARK) && newPlay && playPossible && !m_pPlayButton->toBool() && !m_bypassCueSetByPlay) { // in Denon mode each play from pause moves the cue point // if not previewing cueSet(1.0); } m_bypassCueSetByPlay = false; // when previewing, "play" was set by cue button, a following toggle request // (play = 0.0) is used for latching play. bool previewing = false; if (m_bPreviewing || m_iCurrentlyPreviewingHotcues) { if (!newPlay) { // play latch request: stop previewing and go into normal play mode. m_bPreviewing = false; m_iCurrentlyPreviewingHotcues = 0; newPlay = true; } else { previewing = true; } } if (!playPossible) { // play not possible newPlay = false; m_pPlayIndicator->setBlinkValue(ControlIndicator::OFF); m_pStopButton->set(0.0); } else if (newPlay && !previewing) { // Play: Indicates a latched Play m_pPlayIndicator->setBlinkValue(ControlIndicator::ON); m_pStopButton->set(0.0); } else { // Pause: m_pStopButton->set(1.0); if (cueMode == CUE_MODE_DENON) { if (isTrackAtCue() || previewing) { m_pPlayIndicator->setBlinkValue(ControlIndicator::OFF); } else { // Flashing indicates that a following play would move cue point m_pPlayIndicator->setBlinkValue(ControlIndicator::RATIO1TO1_500MS); } } else if (cueMode == CUE_MODE_MIXXX || cueMode == CUE_MODE_MIXXX_NO_BLINK || cueMode == CUE_MODE_NUMARK) { m_pPlayIndicator->setBlinkValue(ControlIndicator::OFF); } else { // Flashing indicates that play is possible in Pioneer mode m_pPlayIndicator->setBlinkValue(ControlIndicator::RATIO1TO1_500MS); } } if (cueMode != CUE_MODE_DENON && cueMode != CUE_MODE_NUMARK) { if (m_pCuePoint->get() != -1) { if (newPlay == 0.0 && !isTrackAtCue() && !atEndPosition()) { if (cueMode == CUE_MODE_MIXXX) { // in Mixxx mode Cue Button is flashing slow if CUE will move Cue point m_pCueIndicator->setBlinkValue(ControlIndicator::RATIO1TO1_500MS); } else if (cueMode == CUE_MODE_MIXXX_NO_BLINK) { m_pCueIndicator->setBlinkValue(ControlIndicator::OFF); } else { // in Pioneer mode Cue Button is flashing fast if CUE will move Cue point m_pCueIndicator->setBlinkValue(ControlIndicator::RATIO1TO1_250MS); } } else { m_pCueIndicator->setBlinkValue(ControlIndicator::OFF); } } else { m_pCueIndicator->setBlinkValue(ControlIndicator::OFF); } } m_pPlayStutter->set(newPlay ? 1.0 : 0.0); return newPlay; }
void CueControl::cueCDJ(double v) { // This is how Pioneer cue buttons work: // If pressed while freely playing (i.e. playing and platter NOT being touched), stop playback and go to cue. // If pressed while NOT freely playing (i.e. stopped or playing but platter IS being touched), set new cue point. // If pressed while stopped and at cue, play while pressed. // If play is pressed while holding cue, the deck is now playing. (Handled in playFromCuePreview().) QMutexLocker lock(&m_mutex); const auto freely_playing = m_pPlay->toBool() && !getEngineBuffer()->getScratching(); if (v) { if (m_iCurrentlyPreviewingHotcues) { // we are already previewing by hotcues // just jump to cue point and continue previewing m_bPreviewing = true; lock.unlock(); seekAbs(m_pCuePoint->get()); } else if (freely_playing || atEndPosition()) { // Jump to cue when playing or when at end position // Just in case. m_bPreviewing = false; m_pPlay->set(0.0); // Need to unlock before emitting any signals to prevent deadlock. lock.unlock(); seekAbs(m_pCuePoint->get()); } else if (isTrackAtCue()) { // pause at cue point m_bPreviewing = true; m_pPlay->set(1.0); } else { // Pause not at cue point and not at end position cueSet(v); // Just in case. m_bPreviewing = false; m_pPlay->set(0.0); // If quantize is enabled, jump to the cue point since it's not // necessarily where we currently are if (m_pQuantizeEnabled->get() > 0.0) { lock.unlock(); // prevent deadlock. // Enginebuffer will quantize more exactly than we can. seekAbs(m_pCuePoint->get()); } } } else if (m_bPreviewing) { m_bPreviewing = false; if (!m_iCurrentlyPreviewingHotcues) { m_pPlay->set(0.0); // Need to unlock before emitting any signals to prevent deadlock. lock.unlock(); seekAbs(m_pCuePoint->get()); } } // indicator may flash because the delayed adoption of seekAbs // Correct the Indicator set via play if (m_pLoadedTrack && !freely_playing) { m_pCueIndicator->setBlinkValue(ControlIndicator::ON); } else { m_pCueIndicator->setBlinkValue(ControlIndicator::OFF); } }