void CueControl::updateIndicators() { // No need for mutex lock because we are only touching COs. double cueMode = m_pCueMode->get(); if (cueMode == CUE_MODE_DENON || cueMode == CUE_MODE_NUMARK) { // Cue button is only lit at cue point bool playing = m_pPlay->toBool(); if (isTrackAtCue()) { // at cue point if (!playing) { m_pCueIndicator->setBlinkValue(ControlIndicator::ON); m_pPlayIndicator->setBlinkValue(ControlIndicator::OFF); } } else { m_pCueIndicator->setBlinkValue(ControlIndicator::OFF); if (!playing) { if (!atEndPosition() && cueMode != CUE_MODE_NUMARK) { // Play will move cue point m_pPlayIndicator->setBlinkValue(ControlIndicator::RATIO1TO1_500MS); } else { // At track end m_pPlayIndicator->setBlinkValue(ControlIndicator::OFF); } } } } else { // Here we have CUE_MODE_PIONEER or CUE_MODE_MIXXX // default to Pioneer mode if (!m_bPreviewing) { const auto freely_playing = m_pPlay->toBool() && !getEngineBuffer()->getScratching(); if (!freely_playing) { if (!isTrackAtCue()) { if (!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 { // At track end m_pCueIndicator->setBlinkValue(ControlIndicator::OFF); } } else if (m_pCuePoint->get() != -1) { // Next Press is preview m_pCueIndicator->setBlinkValue(ControlIndicator::ON); } } else { // Cue indicator should be off when freely playing m_pCueIndicator->setBlinkValue(ControlIndicator::OFF); } } } }
void CueControl::updateIndicators() { // No need for mutex lock because we are only touching COs. double cueMode = m_pCueMode->get(); if (cueMode == CUE_MODE_DENON || cueMode == CUE_MODE_NUMARK) { // Cue button is only lit at cue point bool playing = m_pPlayButton->get() > 0; if (isTrackAtCue()) { // at cue point if (!playing) { m_pCueIndicator->setBlinkValue(ControlIndicator::ON); m_pPlayIndicator->setBlinkValue(ControlIndicator::OFF); } } else { m_pCueIndicator->setBlinkValue(ControlIndicator::OFF); if (!playing) { if (getCurrentSample() < getTotalSamples() && cueMode != CUE_MODE_NUMARK) { // Play will move cue point m_pPlayIndicator->setBlinkValue(ControlIndicator::RATIO1TO1_500MS); } else { // At track end m_pPlayIndicator->setBlinkValue(ControlIndicator::OFF); } } } } else { // Here we have CUE_MODE_PIONEER or CUE_MODE_MIXXX // default to Pioneer mode if (!m_bPreviewing) { bool playing = m_pPlayButton->get() > 0; if (!playing) { if (!isTrackAtCue()) { if (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 { // At track end m_pCueIndicator->setBlinkValue(ControlIndicator::OFF); } } else if (m_pCuePoint->get() != -1) { // Next Press is preview m_pCueIndicator->setBlinkValue(ControlIndicator::ON); } } } } }
void CueControl::cueDenon(double v) { // This is how Denon DN-S 3700 cue buttons work: // If pressed go to cue and stop. // If pressed while stopped and at cue, play while pressed. // Cue Point is moved by play from pause QMutexLocker lock(&m_mutex); bool playing = (m_pPlayButton->get() == 1.0); if (v) { if (!playing && isTrackAtCue()) { // pause at cue point m_bPreviewing = true; m_pPlayButton->set(1.0); } else { // 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 (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()); } }
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::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); } }