diff options
author | Daniel Schürmann <daschuer@mixxx.org> | 2018-07-25 23:11:48 +0200 |
---|---|---|
committer | Daniel Schürmann <daschuer@mixxx.org> | 2018-09-14 23:50:09 +0200 |
commit | 657bf7a37b09b1945d9c681cd7cf1c02afe29a27 (patch) | |
tree | 9329ad1442a1a5a96d9dcfa5a2ef8448617a621a | |
parent | 6bb06b736ef1be7204732c81c551e1dc6e31ec88 (diff) |
Switch all code to the new rate_ratio control
-rw-r--r-- | src/engine/bpmcontrol.cpp | 34 | ||||
-rw-r--r-- | src/engine/bpmcontrol.h | 4 | ||||
-rw-r--r-- | src/engine/ratecontrol.cpp | 152 | ||||
-rw-r--r-- | src/engine/ratecontrol.h | 11 | ||||
-rw-r--r-- | src/vinylcontrol/vinylcontrol.cpp | 3 | ||||
-rw-r--r-- | src/vinylcontrol/vinylcontrol.h | 8 | ||||
-rw-r--r-- | src/vinylcontrol/vinylcontrolxwax.cpp | 32 | ||||
-rw-r--r-- | src/vinylcontrol/vinylcontrolxwax.h | 1 | ||||
-rw-r--r-- | src/waveform/renderers/waveformwidgetrenderer.cpp | 34 | ||||
-rw-r--r-- | src/waveform/renderers/waveformwidgetrenderer.h | 10 | ||||
-rw-r--r-- | src/widget/wnumberrate.cpp | 12 | ||||
-rw-r--r-- | src/widget/wnumberrate.h | 5 |
12 files changed, 111 insertions, 195 deletions
diff --git a/src/engine/bpmcontrol.cpp b/src/engine/bpmcontrol.cpp index c3877c4d63..42c7f20e59 100644 --- a/src/engine/bpmcontrol.cpp +++ b/src/engine/bpmcontrol.cpp @@ -35,16 +35,10 @@ BpmControl::BpmControl(QString group, m_pPlayButton = new ControlProxy(group, "play", this); m_pReverseButton = new ControlProxy(group, "reverse", this); m_pRateRatio = new ControlProxy(group, "rate_ratio", this); - m_pRateSlider = new ControlProxy(group, "rate", this); - m_pRateSlider->connectValueChanged(SLOT(slotUpdateEngineBpm()), + m_pRateRatio->connectValueChanged(SLOT(slotUpdateEngineBpm()), Qt::DirectConnection); + m_pQuantize = ControlObject::getControl(group, "quantize"); - m_pRateRange = new ControlProxy(group, "rateRange", this); - m_pRateRange->connectValueChanged(SLOT(slotUpdateRateSlider()), - Qt::DirectConnection); - m_pRateDir = new ControlProxy(group, "rate_dir", this); - m_pRateDir->connectValueChanged(SLOT(slotUpdateEngineBpm()), - Qt::DirectConnection); m_pPrevBeat.reset(new ControlProxy(group, "beat_prev")); m_pNextBeat.reset(new ControlProxy(group, "beat_next")); @@ -219,7 +213,7 @@ void BpmControl::slotTapFilter(double averageLength, int numSamples) { // (60 seconds per minute) * (1000 milliseconds per second) / (X millis per // beat) = Y beats/minute - double averageBpm = 60.0 * 1000.0 / averageLength / calcRateRatio(); + double averageBpm = 60.0 * 1000.0 / averageLength / m_pRateRatio->get(); m_pBeats->setBpm(averageBpm); } @@ -706,9 +700,8 @@ double BpmControl::getPhaseOffset(double dThisPosition) { } void BpmControl::slotUpdateEngineBpm() { - // Adjust playback bpm in response to a change in the rate slider. - double dRate = calcRateRatio(); - m_pRateRatio->set(dRate); + // Adjust playback bpm in response to a rate_ration update + double dRate = m_pRateRatio->get(); m_pEngineBpm->set(m_pLocalBpm->get() * dRate); } @@ -722,14 +715,6 @@ void BpmControl::slotUpdateRateSlider() { double dRateRatio = m_pEngineBpm->get() / localBpm; m_pRateRatio->set(dRateRatio); - - double rateScale = m_pRateDir->get() * m_pRateRange->get(); - if (rateScale == 0.0) { - return; - } - - double dRateSlider = (dRateRatio - 1.0) / rateScale; - m_pRateSlider->set(dRateSlider); } void BpmControl::trackLoaded(TrackPointer pNewTrack, TrackPointer pOldTrack) { @@ -844,15 +829,10 @@ void BpmControl::collectFeatures(GroupFeatureState* pGroupFeatures) const { &dThisBeatLength, &dThisBeatFraction)) { pGroupFeatures->has_beat_length_sec = true; // Note: dThisBeatLength is fractional frames count * 2 (stereo samples) - pGroupFeatures->beat_length_sec = dThisBeatLength / m_pTrack->getSampleRate() / 2 * calcRateRatio(); + pGroupFeatures->beat_length_sec = dThisBeatLength + / m_pTrack->getSampleRate() / 2 * m_pRateRatio->get(); pGroupFeatures->has_beat_fraction = true; pGroupFeatures->beat_fraction = dThisBeatFraction; } } - -double BpmControl::calcRateRatio() const { - double rateRatio = 1.0 + m_pRateDir->get() * m_pRateRange->get() * - m_pRateSlider->get(); - return rateRatio; -} diff --git a/src/engine/bpmcontrol.h b/src/engine/bpmcontrol.h index 8611457820..afb1256720 100644 --- a/src/engine/bpmcontrol.h +++ b/src/engine/bpmcontrol.h @@ -97,7 +97,6 @@ class BpmControl : public EngineControl { } bool syncTempo(); double calcSyncAdjustment(double my_percentage, bool userTweakingSync); - double calcRateRatio() const; friend class SyncControl; @@ -106,10 +105,7 @@ class BpmControl : public EngineControl { QAtomicInt m_oldPlayButton; ControlProxy* m_pReverseButton; ControlProxy* m_pRateRatio; - ControlProxy* m_pRateSlider; ControlObject* m_pQuantize; - ControlProxy* m_pRateRange; - ControlProxy* m_pRateDir; // ControlObjects that come from QuantizeControl QScopedPointer<ControlProxy> m_pNextBeat; diff --git a/src/engine/ratecontrol.cpp b/src/engine/ratecontrol.cpp index f184e6010c..7ccd51096e 100644 --- a/src/engine/ratecontrol.cpp +++ b/src/engine/ratecontrol.cpp @@ -18,10 +18,10 @@ #include <QtDebug> // Static default values for rate buttons (percents) -double RateControl::m_dTemporaryRateChangeCoarse; -double RateControl::m_dTemporaryRateChangeFine; -double RateControl::m_dPermanentRateChangeCoarse; -double RateControl::m_dPermanentRateChangeFine; +double RateControl::m_sTemporaryRateChangeCoarse; +double RateControl::m_sTemporaryRateChangeFine; +double RateControl::m_sPermanentRateChangeCoarse; +double RateControl::m_sPermanentRateChangeFine; int RateControl::m_iRateRampSensitivity; RateControl::RampMode RateControl::m_eRateRampMode; @@ -49,11 +49,22 @@ RateControl::RateControl(QString group, Qt::DirectConnection); m_pRateDir = new ControlObject(ConfigKey(group, "rate_dir")); - m_pRateRange = new ControlPotmeter(ConfigKey(group, "rateRange"), 0.01, 0.90); + connect(m_pRateDir, SIGNAL(valueChanged(double)), + this, SLOT(slotRateRangeChanged(double)), + Qt::DirectConnection); + m_pRateRange = new ControlPotmeter( + ConfigKey(group, "rateRange"), 0.01, 0.90); + connect(m_pRateRange, SIGNAL(valueChanged(double)), + this, SLOT(slotRateRangeChanged(double)), + Qt::DirectConnection); + // Allow rate slider to go out of bounds so that master sync rate // adjustments are not capped. - m_pRateSlider = new ControlPotmeter(ConfigKey(group, "rate"), - -1.0, 1.0, true); + m_pRateSlider = new ControlPotmeter( + ConfigKey(group, "rate"), -1.0, 1.0, true); + connect(m_pRateSlider, SIGNAL(valueChanged(double)), + this, SLOT(slotRateSliderChanged(double)), + Qt::DirectConnection); // Search rate. Rate used when searching in sound. This overrules the // playback rate @@ -241,42 +252,52 @@ void RateControl::setRateRampSensitivity(int sense) { //static void RateControl::setTemporaryRateChangeCoarseAmount(double v) { - m_dTemporaryRateChangeCoarse = v; + m_sTemporaryRateChangeCoarse = v; } //static void RateControl::setTemporaryRateChangeFineAmount(double v) { - m_dTemporaryRateChangeFine = v; + m_sTemporaryRateChangeFine = v; } //static void RateControl::setPermanentRateChangeCoarseAmount(double v) { - m_dPermanentRateChangeCoarse = v; + m_sPermanentRateChangeCoarse = v; } //static void RateControl::setPermanentRateChangeFineAmount(double v) { - m_dPermanentRateChangeFine = v; + m_sPermanentRateChangeFine = v; } //static double RateControl::getTemporaryRateChangeCoarseAmount() { - return m_dTemporaryRateChangeCoarse; + return m_sTemporaryRateChangeCoarse; } //static double RateControl::getTemporaryRateChangeFineAmount() { - return m_dTemporaryRateChangeFine; + return m_sTemporaryRateChangeFine; } //static double RateControl::getPermanentRateChangeCoarseAmount() { - return m_dPermanentRateChangeCoarse; + return m_sPermanentRateChangeCoarse; } //static double RateControl::getPermanentRateChangeFineAmount() { - return m_dPermanentRateChangeFine; + return m_sPermanentRateChangeFine; +} + +void RateControl::slotRateRangeChanged(double) { + // update RateSlider with the new Range value butdo not change m_pRateRatio + slotRateRatioChanged(m_pRateRatio->get()); +} + +void RateControl::slotRateSliderChanged(double v) { + double rateRatio = 1.0 + m_pRateDir->get() * m_pRateRange->get() * v; + m_pRateRatio->set(rateRatio); } void RateControl::slotRateRatioChanged(double v) { @@ -317,95 +338,72 @@ void RateControl::slotControlFastBack(double v) m_pRateSearch->set(-4.); } -void RateControl::slotControlRatePermDown(double) -{ +void RateControl::slotControlRatePermDown(double v) { // Adjusts temp rate down if button pressed - if (buttonRatePermDown->get()) { - m_pRateSlider->set(m_pRateSlider->get() - - m_pRateDir->get() * m_dPermanentRateChangeCoarse / (100 * m_pRateRange->get())); + if (v > 0.0) { + m_pRateRatio->set(m_pRateRatio->get() - (m_sPermanentRateChangeCoarse / 100)); } } -void RateControl::slotControlRatePermDownSmall(double) -{ +void RateControl::slotControlRatePermDownSmall(double v) { // Adjusts temp rate down if button pressed - if (buttonRatePermDownSmall->get()) - m_pRateSlider->set(m_pRateSlider->get() - - m_pRateDir->get() * m_dPermanentRateChangeFine / (100. * m_pRateRange->get())); + if (v > 0.0) + m_pRateRatio->set(m_pRateRatio->get() - (m_sPermanentRateChangeFine / 100)); } -void RateControl::slotControlRatePermUp(double) -{ +void RateControl::slotControlRatePermUp(double v) { // Adjusts temp rate up if button pressed - if (buttonRatePermUp->get()) { - m_pRateSlider->set(m_pRateSlider->get() + - m_pRateDir->get() * m_dPermanentRateChangeCoarse / (100. * m_pRateRange->get())); + if (v > 0.0) { + m_pRateRatio->set(m_pRateRatio->get() - (m_sPermanentRateChangeCoarse / 100)); } } -void RateControl::slotControlRatePermUpSmall(double) -{ +void RateControl::slotControlRatePermUpSmall(double v) { // Adjusts temp rate up if button pressed - if (buttonRatePermUpSmall->get()) - m_pRateSlider->set(m_pRateSlider->get() + - m_pRateDir->get() * m_dPermanentRateChangeFine / (100. * m_pRateRange->get())); + if (v > 0.0) { + m_pRateRatio->set(m_pRateRatio->get() - (m_sPermanentRateChangeFine / 100)); + } } -void RateControl::slotControlRateTempDown(double) -{ +void RateControl::slotControlRateTempDown(double v) { // Set the state of the Temporary button. Logic is handled in ::process() - if (buttonRateTempDown->get() && !(m_ePbPressed & RateControl::RATERAMP_DOWN)) - { + if (v > 0.0 && !(m_ePbPressed & RateControl::RATERAMP_DOWN)) { m_ePbPressed |= RateControl::RATERAMP_DOWN; m_ePbCurrent = RateControl::RATERAMP_DOWN; - } - else if (!buttonRateTempDown->get()) - { + } else if (v <= 0.0) { m_ePbPressed &= ~RateControl::RATERAMP_DOWN; m_ePbCurrent = m_ePbPressed; } } -void RateControl::slotControlRateTempDownSmall(double) -{ +void RateControl::slotControlRateTempDownSmall(double v) { // Set the state of the Temporary button. Logic is handled in ::process() - if (buttonRateTempDownSmall->get() && !(m_ePbPressed & RateControl::RATERAMP_DOWN)) - { + if (v > 0.0 && !(m_ePbPressed & RateControl::RATERAMP_DOWN)) { m_ePbPressed |= RateControl::RATERAMP_DOWN; m_ePbCurrent = RateControl::RATERAMP_DOWN; - } - else if (!buttonRateTempDownSmall->get()) - { + } else if (v <= 0.0) { m_ePbPressed &= ~RateControl::RATERAMP_DOWN; m_ePbCurrent = m_ePbPressed; } } -void RateControl::slotControlRateTempUp(double) -{ +void RateControl::slotControlRateTempUp(double v) { // Set the state of the Temporary button. Logic is handled in ::process() - if (buttonRateTempUp->get() && !(m_ePbPressed & RateControl::RATERAMP_UP)) - { + if (v > 0.0 && !(m_ePbPressed & RateControl::RATERAMP_UP)) { m_ePbPressed |= RateControl::RATERAMP_UP; m_ePbCurrent = RateControl::RATERAMP_UP; - } - else if (!buttonRateTempUp->get()) - { + } else if (v <= 0.0) { m_ePbPressed &= ~RateControl::RATERAMP_UP; m_ePbCurrent = m_ePbPressed; } } -void RateControl::slotControlRateTempUpSmall(double) -{ +void RateControl::slotControlRateTempUpSmall(double v) { // Set the state of the Temporary button. Logic is handled in ::process() - if (buttonRateTempUpSmall->get() && !(m_ePbPressed & RateControl::RATERAMP_UP)) - { + if (v > 0.0 && !(m_ePbPressed & RateControl::RATERAMP_UP)) { m_ePbPressed |= RateControl::RATERAMP_UP; m_ePbCurrent = RateControl::RATERAMP_UP; - } - else if (!buttonRateTempUpSmall->get()) - { + } else if (v <= 0.0) { m_ePbPressed &= ~RateControl::RATERAMP_UP; m_ePbCurrent = m_ePbPressed; } @@ -416,12 +414,6 @@ void RateControl::trackLoaded(TrackPointer pNewTrack, TrackPointer pOldTrack) { m_pTrack = pNewTrack; } -double RateControl::calcRateRatio() const { - double rateRatio = 1.0 + m_pRateDir->get() * m_pRateRange->get() * - m_pRateSlider->get(); - return rateRatio; -} - double RateControl::getWheelFactor() const { return m_pWheel->get(); } @@ -552,10 +544,9 @@ double RateControl::calculateSpeed(double baserate, double speed, bool paused, } void RateControl::process(const double rate, - const double currentSample, - const double totalSamples, - const int bufferSamples) -{ + const double currentSample, + const double totalSamples, + const int bufferSamples) { Q_UNUSED(rate); Q_UNUSED(currentSample); Q_UNUSED(totalSamples); @@ -589,9 +580,9 @@ void RateControl::process(const double rate, return; } - double change = m_pRateDir->get() * m_dTemporaryRateChangeCoarse / + double change = m_pRateDir->get() * m_sTemporaryRateChangeCoarse / (100. * range); - double csmall = m_pRateDir->get() * m_dTemporaryRateChangeFine / + double csmall = m_pRateDir->get() * m_sTemporaryRateChangeFine / (100. * range); if (buttonRateTempUp->get()) @@ -603,7 +594,7 @@ void RateControl::process(const double rate, else if (buttonRateTempDownSmall->get()) subRateTemp(csmall); } else if (m_eRateRampMode == RampMode::Linear) { - m_dTemporaryRateChangeCoarse = ((double)latrate / ((double)m_iRateRampSensitivity / 100.)); + m_sTemporaryRateChangeCoarse = ((double)latrate / ((double)m_iRateRampSensitivity / 100.)); if (m_eRampBackMode == RATERAMP_RAMPBACK_PERIOD) m_dRateTempRampbackChange = 0.0; @@ -615,9 +606,9 @@ void RateControl::process(const double rate, if (m_ePbCurrent) { // apply ramped pitchbending if (m_ePbCurrent == RateControl::RATERAMP_UP) { - addRateTemp(m_dTemporaryRateChangeCoarse); + addRateTemp(m_sTemporaryRateChangeCoarse); } else if (m_ePbCurrent == RateControl::RATERAMP_DOWN) { - subRateTemp(m_dTemporaryRateChangeCoarse); + subRateTemp(m_sTemporaryRateChangeCoarse); } } else if ((m_bTempStarted) || ((m_eRampBackMode != RATERAMP_RAMPBACK_NONE) @@ -655,10 +646,9 @@ double RateControl::getTempRate() { return (m_pRateDir->get() * (m_dRateTemp * m_pRateRange->get())); } -void RateControl::setRateTemp(double v) -{ +void RateControl::setRateTemp(double v) { // Do not go backwards - if ((calcRateRatio() + v) < 0) { + if ((m_pRateRatio->get() + v) < 0) { return; } diff --git a/src/engine/ratecontrol.h b/src/engine/ratecontrol.h index 9a5e04c091..0a0311bb86 100644 --- a/src/engine/ratecontrol.h +++ b/src/engine/ratecontrol.h @@ -72,7 +72,6 @@ public: double calculateSpeed(double baserate, double speed, bool paused, int iSamplesPerBuffer, bool* pReportScratching, bool* pReportReverse); - double calcRateRatio() const; // Set rate change when temp rate button is pressed static void setTemporaryRateChangeCoarseAmount(double v); @@ -95,6 +94,8 @@ public: void notifySeek(double dNewPlaypos, bool adjustingPhase) override; public slots: + void slotRateRangeChanged(double); + void slotRateSliderChanged(double); void slotRateRatioChanged(double); void slotReverseRollActivate(double); void slotControlRatePermDown(double); @@ -126,10 +127,10 @@ public: double getTempRate(void); // Values used when temp and perm rate buttons are pressed - static double m_dTemporaryRateChangeCoarse; - static double m_dTemporaryRateChangeFine; - static double m_dPermanentRateChangeCoarse; - static double m_dPermanentRateChangeFine; + static double m_sTemporaryRateChangeCoarse; + static double m_sTemporaryRateChangeFine; + static double m_sPermanentRateChangeCoarse; + static double m_sPermanentRateChangeFine; ControlPushButton* buttonRateTempDown; ControlPushButton* buttonRateTempDownSmall; diff --git a/src/vinylcontrol/vinylcontrol.cpp b/src/vinylcontrol/vinylcontrol.cpp index 7ee315b2eb..878bfab54f 100644 --- a/src/vinylcontrol/vinylcontrol.cpp +++ b/src/vinylcontrol/vinylcontrol.cpp @@ -24,7 +24,6 @@ VinylControl::VinylControl(UserSettingsPointer pConfig, QString group) vinylSeek = new ControlProxy(group, "vinylcontrol_seek", this); m_pVCRate = new ControlProxy(group, "vinylcontrol_rate", this); m_pRateRatio = new ControlProxy(group, "rate_ratio", this); - m_pRateSlider = new ControlProxy(group, "rate", this); playButton = new ControlProxy(group, "play", this); duration = new ControlProxy(group, "duration", this); mode = new ControlProxy(group, "vinylcontrol_mode", this); @@ -33,9 +32,7 @@ VinylControl::VinylControl(UserSettingsPointer pConfig, QString group) group, "vinylcontrol_wantenabled", this); cueing = new ControlProxy(group, "vinylcontrol_cueing", this); scratching = new ControlProxy(group, "vinylcontrol_scratching", this); - m_pRateRange = new ControlProxy(group, "rateRange", this); vinylStatus = new ControlProxy(group, "vinylcontrol_status", this); - m_pRateDir = new ControlProxy(group, "rate_dir", this); loopEnabled = new ControlProxy(group, "loop_enabled", this); signalenabled = new ControlProxy( group, "vinylcontrol_signal_enabled", this); diff --git a/src/vinylcontrol/vinylcontrol.h b/src/vinylcontrol/vinylcontrol.h index 8506bf69d8..5cd1370c23 100644 --- a/src/vinylcontrol/vinylcontrol.h +++ b/src/vinylcontrol/vinylcontrol.h @@ -43,10 +43,6 @@ class VinylControl : public QObject { // VC and and is used to change the speed/pitch of the song without VC // 1.0 = original rate ControlProxy* m_pRateRatio; - // Reflects the mean value (filtered for display) used of m_pVCRate during - // VC and and is used to change the speed/pitch of the song without VC - // 0.0 = original rate - ControlProxy* m_pRateSlider; // The ControlObject used to get the duration of the current song. ControlProxy* duration; // The ControlObject used to get the vinyl control mode @@ -62,11 +58,7 @@ class VinylControl : public QObject { ControlProxy* cueing; // Is pitch changing very quickly? ControlProxy* scratching; - // The ControlObject used to the get the pitch range from the prefs. - ControlProxy* m_pRateRange; ControlProxy* vinylStatus; - // direction of rate - ControlProxy* m_pRateDir; // looping enabled? ControlProxy* loopEnabled; // show the signal in the skin? diff --git a/src/vinylcontrol/vinylcontrolxwax.cpp b/src/vinylcontrol/vinylcontrolxwax.cpp index 3aa0e9cf96..f080e09340 100644 --- a/src/vinylcontrol/vinylcontrolxwax.cpp +++ b/src/vinylcontrol/vinylcontrolxwax.cpp @@ -444,7 +444,7 @@ void VinylControlXwax::analyzeSamples(CSAMPLE* pSamples, size_t nFrames) { // now we just either set scratch val to 0 (stops playback) // or 1 (plays back at that rate) - double newScratch = reportedPlayButton ? calcRateRatio() : 0.0; + double newScratch = reportedPlayButton ? m_pRateRatio->get() : 0.0; m_pVCRate->set(newScratch); // is there any reason we'd need to do anything else? @@ -496,7 +496,7 @@ void VinylControlXwax::analyzeSamples(CSAMPLE* pSamples, size_t nFrames) { syncPosition(); resetSteadyPitch(dVinylPitch, m_dVinylPosition); if (uiUpdateTime(filePosition)) { - m_pRateSlider->set(m_pRateDir->get() * (fabs(dVinylPitch) - 1.0) / m_pRateRange->get()); + m_pRateRatio->set(fabs(dVinylPitch)); } } else if (m_iVCMode == MIXXX_VCMODE_ABSOLUTE && (fabs(m_dVinylPosition - m_dVinylPositionOld) >= 5.0)) { @@ -614,11 +614,10 @@ void VinylControlXwax::analyzeSamples(CSAMPLE* pSamples, size_t nFrames) { } // Don't show extremely high or low speeds in the UI. if (reportedPlayButton && !scratching->get() && - m_dDisplayPitch < 1.9 && m_dDisplayPitch > 0.2) { - m_pRateSlider->set(m_pRateDir->get() * - (m_dDisplayPitch - 1.0) / m_pRateRange->get()); + m_dDisplayPitch < 1.9 && m_dDisplayPitch > 0.2) { + m_pRateRatio->set(m_dDisplayPitch); } else { - m_pRateSlider->set(0.0); + m_pRateRatio->set(1.0); } m_dUiUpdateTime = filePosition; } @@ -633,7 +632,7 @@ void VinylControlXwax::analyzeSamples(CSAMPLE* pSamples, size_t nFrames) { //if it hasn't been long, //let the track play a wee bit more before deciding we've stopped - m_pRateSlider->set(0.0); + m_pRateRatio->set(0.0); if (m_iVCMode == MIXXX_VCMODE_ABSOLUTE && fabs(m_dVinylPosition - filePosition) >= 0.1) { @@ -780,17 +779,18 @@ bool VinylControlXwax::checkEnabled(bool was, bool is) { } if (was != is) { - //we reset the scratch value, but we don't reset the rate slider. - //This means if we are playing, and we disable vinyl control, - //the track will keep playing at the previous rate. - //This allows for single-deck control, dj handoffs, etc. + // we reset the scratch value, but we don't reset the rate slider. + // This means if we are playing, and we disable vinyl control, + // the track will keep playing at the previous rate. + // This allows for single-deck control, dj handoffs, etc. togglePlayButton(playButton->get() || fabs(m_pVCRate->get()) > 0.05); - m_pVCRate->set(calcRateRatio()); + m_pVCRate->set(m_pRateRatio->get()); resetSteadyPitch(0.0, 0.0); m_bForceResync = true; - if (!was) + if (!was) { m_dOldFilePos = 0.0; + } m_iVCMode = mode->get(); m_bAtRecordEnd = false; } @@ -840,9 +840,3 @@ float VinylControlXwax::getAngle() { // Invert angle to make vinyl spin direction correct. return 360 - (static_cast<int>(pos / 1000.0 * 360.0 * rps) % 360); } - -double VinylControlXwax::calcRateRatio() const { - double rateRatio = 1.0 + m_pRateDir->get() * m_pRateRange->get() * - m_pRateSlider->get(); - return rateRatio; -} diff --git a/src/vinylcontrol/vinylcontrolxwax.h b/src/vinylcontrol/vinylcontrolxwax.h index 861627f1b8..f0b3be6907 100644 --- a/src/vinylcontrol/vinylcontrolxwax.h +++ b/src/vinylcontrol/vinylcontrolxwax.h @@ -46,7 +46,6 @@ class VinylControlXwax : public VinylControl { void enableConstantMode(double rate); bool uiUpdateTime(double time); void establishQuality(bool quality_sample); - double calcRateRatio() const; // Cache the position of the end of record unsigned int m_uiSafeZone; diff --git a/src/waveform/renderers/waveformwidgetrenderer.cpp b/src/waveform/renderers/waveformwidgetrenderer.cpp index d82e2629bc..6a2dab5df2 100644 --- a/src/waveform/renderers/waveformwidgetrenderer.cpp +++ b/src/waveform/renderers/waveformwidgetrenderer.cpp @@ -26,7 +26,6 @@ WaveformWidgetRenderer::WaveformWidgetRenderer(const char* group) m_trackPixelCount(0.0), m_zoomFactor(1.0), - m_rateAdjust(0.0), m_visualSamplePerPixel(1.0), m_audioSamplePerPixel(1.0), m_alphaBeatGrid(90), @@ -34,12 +33,8 @@ WaveformWidgetRenderer::WaveformWidgetRenderer(const char* group) m_visualPlayPosition(NULL), m_playPos(-1), m_playPosVSample(0), - m_pRateSliderCO(NULL), - m_rate(0.0), - m_pRateRangeControlObject(NULL), - m_rateRange(0.0), - m_pRateDirControlObject(NULL), - m_rateDir(0.0), + m_pRateRatioCO(NULL), + m_rateRatio(1.0), m_pGainControlObject(NULL), m_gain(1.0), m_pTrackSamplesControlObject(NULL), @@ -69,9 +64,7 @@ WaveformWidgetRenderer::~WaveformWidgetRenderer() { for (int i = 0; i < m_rendererStack.size(); ++i) delete m_rendererStack[i]; - delete m_pRateSliderCO; - delete m_pRateRangeControlObject; - delete m_pRateDirControlObject; + delete m_pRateRatioCO; delete m_pGainControlObject; delete m_pTrackSamplesControlObject; @@ -86,12 +79,8 @@ bool WaveformWidgetRenderer::init() { m_visualPlayPosition = VisualPlayPosition::getVisualPlayPosition(m_group); - m_pRateSliderCO = new ControlProxy( - m_group, "rate"); - m_pRateRangeControlObject = new ControlProxy( - m_group, "rateRange"); - m_pRateDirControlObject = new ControlProxy( - m_group, "rate_dir"); + m_pRateRatioCO = new ControlProxy( + m_group, "rate_ratio"); m_pGainControlObject = new ControlProxy( m_group, "total_gain"); m_pTrackSamplesControlObject = new ControlProxy( @@ -113,22 +102,17 @@ void WaveformWidgetRenderer::onPreRender(VSyncThread* vsyncThread) { } //Fetch parameters before rendering in order the display all sub-renderers with the same values - m_rate = m_pRateSliderCO->get(); - m_rateDir = m_pRateDirControlObject->get(); - m_rateRange = m_pRateRangeControlObject->get(); + m_rateRatio = m_pRateRatioCO->get(); // This gain adjustment compensates for an arbitrary /2 gain chop in // EnginePregain. See the comment there. m_gain = m_pGainControlObject->get() * 2; - //Legacy stuff (Ryan it that OK?) -> Limit our rate adjustment to < 99%, "Bad Things" might happen otherwise. - m_rateAdjust = m_rateDir * math_min(0.99, m_rate * m_rateRange); - // Compute visual sample to pixel ratio // Allow waveform to spread one visual sample across a hundred pixels // NOTE: The hundred pixel limit is totally arbitrary. Theoretically, // there should be no limit to how far the waveforms can be zoomed in. - double visualSamplePerPixel = m_zoomFactor * (1.0 + m_rateAdjust) / m_scaleFactor; + double visualSamplePerPixel = m_zoomFactor * m_rateRatio / m_scaleFactor; m_visualSamplePerPixel = math_max(0.01, visualSamplePerPixel); TrackPointer pTrack(m_pTrack); @@ -175,9 +159,7 @@ void WaveformWidgetRenderer::onPreRender(VSyncThread* vsyncThread) { // "m_group" << m_group << // "m_trackSamples" << m_trackSamples << // "m_playPos" << m_playPos << - // "m_rate" << m_rate << - // "m_rateDir" << m_rateDir << - // "m_rateRange" << m_rateRange << + // "m_rateRatio" << m_rate << // "m_gain" << m_gain; } diff --git a/src/waveform/renderers/waveformwidgetrenderer.h b/src/waveform/renderers/waveformwidgetrenderer.h index ce4b875b52..f87ccfb868 100644 --- a/src/waveform/renderers/waveformwidgetrenderer.h +++ b/src/waveform/renderers/waveformwidgetrenderer.h @@ -71,7 +71,6 @@ class WaveformWidgetRenderer { double getPlayPos() const { return m_playPos;} double getPlayPosVSample() const { return m_playPosVSample;} double getZoomFactor() const { return m_zoomFactor;} - double getRateAdjust() const { return m_rateAdjust;} double getGain() const { return m_gain;} int getTrackSamples() const { return m_trackSamples;} @@ -121,7 +120,6 @@ class WaveformWidgetRenderer { double m_trackPixelCount; double m_zoomFactor; - double m_rateAdjust; double m_visualSamplePerPixel; double m_audioSamplePerPixel; @@ -132,12 +130,8 @@ class WaveformWidgetRenderer { QSharedPointer<VisualPlayPosition> m_visualPlayPosition; double m_playPos; int m_playPosVSample; - ControlProxy* m_pRateSliderCO; - double m_rate; - ControlProxy* m_pRateRangeControlObject; - double m_rateRange; - ControlProxy* m_pRateDirControlObject; - double m_rateDir; + ControlProxy* m_pRateRatioCO; + double m_rateRatio; ControlProxy* m_pGainControlObject; double m_gain; ControlProxy* m_pTrackSamplesControlObject; diff --git a/src/widget/wnumberrate.cpp b/src/widget/wnumberrate.cpp index 34a65d159c..1dde594512 100644 --- a/src/widget/wnumberrate.cpp +++ b/src/widget/wnumberrate.cpp @@ -18,20 +18,14 @@ WNumberRate::WNumberRate(const char * group, QWidget * parent) : WNumber(parent) { - m_pRateRangeControl = new ControlProxy(group, "rateRange", this); - m_pRateRangeControl->connectValueChanged(SLOT(setValue(double))); - m_pRateDirControl = new ControlProxy(group, "rate_dir", this); - m_pRateDirControl->connectValueChanged(SLOT(setValue(double))); - m_pRateControl = new ControlProxy(group, "rate", this); - m_pRateControl->connectValueChanged(SLOT(setValue(double))); + m_pRateRatio = new ControlProxy(group, "rate_ratio", this); + m_pRateRatio->connectValueChanged(SLOT(setValue(double))); // Initialize the widget. setValue(0); } void WNumberRate::setValue(double /*dValue*/) { - double vsign = m_pRateControl->get() * - m_pRateRangeControl->get() * - m_pRateDirControl->get(); + double vsign = m_pRateRatio->get() - 1; char sign = '+'; if (vsign < -0.00000001) { diff --git a/src/widget/wnumberrate.h b/src/widget/wnumberrate.h index 4aeae4ead9..da038404ca 100644 --- a/src/widget/wnumberrate.h +++ b/src/widget/wnumberrate.h @@ -25,10 +25,7 @@ class WNumberRate : public WNumber { void setValue(double dValue) override; private: - // Pointer to control objects for rate. - ControlProxy* m_pRateControl; - ControlProxy* m_pRateRangeControl; - ControlProxy* m_pRateDirControl; + ControlProxy* m_pRateRatio; }; #endif |