summaryrefslogtreecommitdiffstats
path: root/src/engine/controls/ratecontrol.cpp
diff options
context:
space:
mode:
authorDaniel Schürmann <daschuer@mixxx.org>2019-01-12 23:14:20 +0100
committerDaniel Schürmann <daschuer@mixxx.org>2019-01-12 23:14:20 +0100
commit5c0261a9c3cf23cc164f259a131f59f25b87cb03 (patch)
tree01f8f05f48c56bbf7a6570f17ab9ca60849ed34b /src/engine/controls/ratecontrol.cpp
parentdd5de6b1ab592910e1f06f1b66fe170da94cf271 (diff)
parent1f6d795252d0454962d1ae4dd284d100e6f4180f (diff)
Merge remote-tracking branch 'upstream/2.2'
Conflicts: CHANGELOG.md LICENSE build/wix/LICENSE.rtf src/defs_version.h src/engine/controls/ratecontrol.cpp
Diffstat (limited to 'src/engine/controls/ratecontrol.cpp')
-rw-r--r--src/engine/controls/ratecontrol.cpp357
1 files changed, 126 insertions, 231 deletions
diff --git a/src/engine/controls/ratecontrol.cpp b/src/engine/controls/ratecontrol.cpp
index e51ec0a69d..9faa6422a5 100644
--- a/src/engine/controls/ratecontrol.cpp
+++ b/src/engine/controls/ratecontrol.cpp
@@ -32,12 +32,9 @@ RateControl::RateControl(QString group,
UserSettingsPointer pConfig)
: EngineControl(group, pConfig),
m_pBpmControl(NULL),
- m_ePbCurrent(0),
- m_ePbPressed(0),
m_bTempStarted(false),
- m_dRateTemp(0.0),
- m_eRampBackMode(RATERAMP_RAMPBACK_NONE),
- m_dRateTempRampbackChange(0.0) {
+ m_tempRateRatio(0.0),
+ m_dRateTempRampChange(0.0) {
m_pScratchController = new PositionScratchController(group);
m_pRateDir = new ControlObject(ConfigKey(group, "rate_dir"));
@@ -81,54 +78,39 @@ RateControl::RateControl(QString group,
m_pVCMode = ControlObject::getControl(ConfigKey(getGroup(), "vinylcontrol_mode"));
// Permanent rate-change buttons
- buttonRatePermDown =
+ m_pButtonRatePermDown =
new ControlPushButton(ConfigKey(group,"rate_perm_down"));
- connect(buttonRatePermDown, &ControlObject::valueChanged,
+ connect(m_pButtonRatePermDown, &ControlObject::valueChanged,
this, &RateControl::slotControlRatePermDown,
Qt::DirectConnection);
- buttonRatePermDownSmall =
+ m_pButtonRatePermDownSmall =
new ControlPushButton(ConfigKey(group,"rate_perm_down_small"));
- connect(buttonRatePermDownSmall, &ControlObject::valueChanged,
+ connect(m_pButtonRatePermDownSmall, &ControlObject::valueChanged,
this, &RateControl::slotControlRatePermDownSmall,
Qt::DirectConnection);
- buttonRatePermUp =
+ m_pButtonRatePermUp =
new ControlPushButton(ConfigKey(group,"rate_perm_up"));
- connect(buttonRatePermUp, &ControlObject::valueChanged,
+ connect(m_pButtonRatePermUp, &ControlObject::valueChanged,
this, &RateControl::slotControlRatePermUp,
Qt::DirectConnection);
- buttonRatePermUpSmall =
+ m_pButtonRatePermUpSmall =
new ControlPushButton(ConfigKey(group,"rate_perm_up_small"));
- connect(buttonRatePermUpSmall, &ControlObject::valueChanged,
+ connect(m_pButtonRatePermUpSmall, &ControlObject::valueChanged,
this, &RateControl::slotControlRatePermUpSmall,
Qt::DirectConnection);
// Temporary rate-change buttons
- buttonRateTempDown =
+ m_pButtonRateTempDown =
new ControlPushButton(ConfigKey(group,"rate_temp_down"));
- connect(buttonRateTempDown, &ControlObject::valueChanged,
- this, &RateControl::slotControlRateTempDown,
- Qt::DirectConnection);
-
- buttonRateTempDownSmall =
+ m_pButtonRateTempDownSmall =
new ControlPushButton(ConfigKey(group,"rate_temp_down_small"));
- connect(buttonRateTempDownSmall, &ControlObject::valueChanged,
- this, &RateControl::slotControlRateTempDownSmall,
- Qt::DirectConnection);
-
- buttonRateTempUp =
+ m_pButtonRateTempUp =
new ControlPushButton(ConfigKey(group,"rate_temp_up"));
- connect(buttonRateTempUp, &ControlObject::valueChanged,
- this, &RateControl::slotControlRateTempUp,
- Qt::DirectConnection);
-
- buttonRateTempUpSmall =
+ m_pButtonRateTempUpSmall =
new ControlPushButton(ConfigKey(group,"rate_temp_up_small"));
- connect(buttonRateTempUpSmall, &ControlObject::valueChanged,
- this, &RateControl::slotControlRateTempUpSmall,
- Qt::DirectConnection);
// We need the sample rate so we can guesstimate something close
// what latency is.
@@ -184,14 +166,14 @@ RateControl::~RateControl() {
delete m_pForwardButton;
delete m_pBackButton;
- delete buttonRateTempDown;
- delete buttonRateTempDownSmall;
- delete buttonRateTempUp;
- delete buttonRateTempUpSmall;
- delete buttonRatePermDown;
- delete buttonRatePermDownSmall;
- delete buttonRatePermUp;
- delete buttonRatePermUpSmall;
+ delete m_pButtonRateTempDown;
+ delete m_pButtonRateTempDownSmall;
+ delete m_pButtonRateTempUp;
+ delete m_pButtonRateTempUpSmall;
+ delete m_pButtonRatePermDown;
+ delete m_pButtonRatePermDownSmall;
+ delete m_pButtonRatePermUp;
+ delete m_pButtonRatePermUpSmall;
delete m_pWheel;
delete m_pScratch2;
@@ -280,111 +262,53 @@ void RateControl::slotReverseRollActivate(double v) {
}
}
-void RateControl::slotControlFastForward(double v)
-{
+void RateControl::slotControlFastForward(double v) {
//qDebug() << "slotControlFastForward(" << v << ")";
- if (v==0.)
- m_pRateSearch->set(0.);
- else
- m_pRateSearch->set(4.);
+ if (v > 0.0) {
+ m_pRateSearch->set(4.0);
+ } else {
+ m_pRateSearch->set(0.0);
+ }
}
-void RateControl::slotControlFastBack(double v)
-{
+void RateControl::slotControlFastBack(double v) {
//qDebug() << "slotControlFastBack(" << v << ")";
- if (v==0.)
- m_pRateSearch->set(0.);
- else
- m_pRateSearch->set(-4.);
+ if (v > 0.0) {
+ m_pRateSearch->set(-4.0);
+ } else {
+ m_pRateSearch->set(0.0);
+ }
}
-void RateControl::slotControlRatePermDown(double)
-{
+void RateControl::slotControlRatePermDown(double v) {
// Adjusts temp rate down if button pressed
- if (buttonRatePermDown->get()) {
+ if (v > 0.0) {
m_pRateSlider->set(m_pRateSlider->get() -
- m_pRateDir->get() * m_dPermanentRateChangeCoarse.getValue() / (100 * m_pRateRange->get()));
+ m_pRateDir->get() * m_dPermanentRateChangeCoarse.getValue() / (100 * m_pRateRange->get()));
}
}
-void RateControl::slotControlRatePermDownSmall(double)
-{
+void RateControl::slotControlRatePermDownSmall(double v) {
// Adjusts temp rate down if button pressed
- if (buttonRatePermDownSmall->get())
+ if (v > 0.0) {
m_pRateSlider->set(m_pRateSlider->get() -
- m_pRateDir->get() * m_dPermanentRateChangeFine.getValue() / (100. * m_pRateRange->get()));
+ m_pRateDir->get() * m_dPermanentRateChangeFine.getValue() / (100. * m_pRateRange->get()));
+ }
}
-void RateControl::slotControlRatePermUp(double)
-{
+void RateControl::slotControlRatePermUp(double v) {
// Adjusts temp rate up if button pressed
- if (buttonRatePermUp->get()) {
+ if (v > 0.0) {
m_pRateSlider->set(m_pRateSlider->get() +
- m_pRateDir->get() * m_dPermanentRateChangeCoarse.getValue() / (100. * m_pRateRange->get()));
+ m_pRateDir->get() * m_dPermanentRateChangeCoarse.getValue() / (100. * m_pRateRange->get()));
}
}
-void RateControl::slotControlRatePermUpSmall(double)
-{
+void RateControl::slotControlRatePermUpSmall(double v) {
// Adjusts temp rate up if button pressed
- if (buttonRatePermUpSmall->get())
+ if (v > 0.0) {
m_pRateSlider->set(m_pRateSlider->get() +
- m_pRateDir->get() * m_dPermanentRateChangeFine.getValue() / (100. * m_pRateRange->get()));
-}
-
-void RateControl::slotControlRateTempDown(double)
-{
- // Set the state of the Temporary button. Logic is handled in ::process()
- if (buttonRateTempDown->get() && !(m_ePbPressed & RateControl::RATERAMP_DOWN))
- {
- m_ePbPressed |= RateControl::RATERAMP_DOWN;
- m_ePbCurrent = RateControl::RATERAMP_DOWN;
- }
- else if (!buttonRateTempDown->get())
- {
- m_ePbPressed &= ~RateControl::RATERAMP_DOWN;
- m_ePbCurrent = m_ePbPressed;
- }
-}
-
-void RateControl::slotControlRateTempDownSmall(double)
-{
- // Set the state of the Temporary button. Logic is handled in ::process()
- if (buttonRateTempDownSmall->get() && !(m_ePbPressed & RateControl::RATERAMP_DOWN))
- {
- m_ePbPressed |= RateControl::RATERAMP_DOWN;
- m_ePbCurrent = RateControl::RATERAMP_DOWN;
- }
- else if (!buttonRateTempDownSmall->get())
- {
- m_ePbPressed &= ~RateControl::RATERAMP_DOWN;
- m_ePbCurrent = m_ePbPressed;
- }
-}
-
-void RateControl::slotControlRateTempUp(double)
-{
- // Set the state of the Temporary button. Logic is handled in ::process()
- if (buttonRateTempUp->get() && !(m_ePbPressed & RateControl::RATERAMP_UP))
- {
- m_ePbPressed |= RateControl::RATERAMP_UP;
- m_ePbCurrent = RateControl::RATERAMP_UP;
- }
- else if (!buttonRateTempUp->get())
- {
- m_ePbPressed &= ~RateControl::RATERAMP_UP;
- m_ePbCurrent = m_ePbPressed;
- }
-}
-
-void RateControl::slotControlRateTempUpSmall(double) {
- // Set the state of the Temporary button. Logic is handled in ::process()
- if (buttonRateTempUpSmall->get() && !(m_ePbPressed & RateControl::RATERAMP_UP)){
- m_ePbPressed |= RateControl::RATERAMP_UP;
- m_ePbCurrent = RateControl::RATERAMP_UP;
- } else if (!buttonRateTempUpSmall->get()) {
- m_ePbPressed &= ~RateControl::RATERAMP_UP;
- m_ePbCurrent = m_ePbPressed;
+ m_pRateDir->get() * m_dPermanentRateChangeFine.getValue() / (100. * m_pRateRange->get()));
}
}
@@ -427,6 +351,9 @@ double RateControl::calculateSpeed(double baserate, double speed, bool paused,
bool* pReportReverse) {
*pReportScratching = false;
*pReportReverse = false;
+
+ processTempRate(iSamplesPerBuffer);
+
double rate = (paused ? 0 : 1.0);
double searching = m_pRateSearch->get();
if (searching) {
@@ -477,7 +404,8 @@ double RateControl::calculateSpeed(double baserate, double speed, bool paused,
if (useScratch2Value) {
rate = scratchFactor;
} else {
- rate = speed + getTempRate();
+ // add temp rate, but don't go backwards
+ rate = math_max(speed + getTempRate(), 0.0);
rate += wheelFactor;
}
rate += jogFactor;
@@ -523,134 +451,101 @@ double RateControl::calculateSpeed(double baserate, double speed, bool paused,
return rate;
}
-void RateControl::process(const double rate,
- const double currentSample,
- const int bufferSamples)
-{
- Q_UNUSED(rate);
- Q_UNUSED(currentSample);
- /*
- * Code to handle temporary rate change buttons.
- *
- * We support two behaviors, the standard ramped pitch bending
- * and pitch shift stepping, which is the old behavior.
- */
-
- /*
- * Initialize certain values necessary for pitchbending. Most of this
- * code should be handled inside a slot, but we'd need to connect to
- * the troublesome Latency ControlObject... Either the Master or Soundcard
- * one.
- */
-
- double latrate = ((double)bufferSamples / (double)m_pSampleRate->get());
-
-
- if ((m_ePbPressed) && (!m_bTempStarted)) {
- m_bTempStarted = true;
+void RateControl::processTempRate(const int bufferSamples) {
+ // Code to handle temporary rate change buttons.
+ // We support two behaviors, the standard ramped pitch bending
+ // and pitch shift stepping, which is the old behavior.
+
+ RampDirection rampDirection = RampDirection::None;
+ if (m_pButtonRateTempUp->toBool()) {
+ rampDirection = RampDirection::Up;
+ } else if (m_pButtonRateTempDown->toBool()) {
+ rampDirection = RampDirection::Down;
+ } else if (m_pButtonRateTempUpSmall->toBool()) {
+ rampDirection = RampDirection::UpSmall;
+ } else if (m_pButtonRateTempDownSmall->toBool()) {
+ rampDirection = RampDirection::DownSmall;
+ }
+ if (rampDirection != RampDirection::None) {
if (m_eRateRampMode == RampMode::Stepping) {
- // old temporary pitch shift behavior
- double range = m_pRateRange->get();
-
- // Avoid Division by Zero
- if (range == 0) {
- qDebug() << "Avoiding a Division by Zero in RATERAMP_STEP code";
- return;
+ if (!m_bTempStarted) {
+ m_bTempStarted = true;
+ // old temporary pitch shift behavior
+ double change = m_dTemporaryRateChangeCoarse.getValue() / 100.0;
+ double csmall = m_dTemporaryRateChangeFine.getValue() / 100.0;
+
+ switch (rampDirection) {
+ case RampDirection::Up:
+ setRateTemp(change);
+ break;
+ case RampDirection::Down:
+ setRateTemp(-change);
+ break;
+ case RampDirection::UpSmall:
+ setRateTemp(csmall);
+ break;
+ case RampDirection::DownSmall:
+ setRateTemp(-csmall);
+ break;
+ case RampDirection::None:
+ default:
+ DEBUG_ASSERT(false);
+ }
}
-
- double change = m_pRateDir->get() * m_dTemporaryRateChangeCoarse.getValue() /
- (100. * range);
- double csmall = m_pRateDir->get() * m_dTemporaryRateChangeFine.getValue() /
- (100. * range);
-
- if (buttonRateTempUp->get())
- addRateTemp(change);
- else if (buttonRateTempDown->get())
- subRateTemp(change);
- else if (buttonRateTempUpSmall->get())
- addRateTemp(csmall);
- else if (buttonRateTempDownSmall->get())
- subRateTemp(csmall);
} else if (m_eRateRampMode == RampMode::Linear) {
- m_dTemporaryRateChangeCoarse.setValue(
- ((double)latrate / ((double)m_iRateRampSensitivity / 100.)));
-
- if (m_eRampBackMode == RATERAMP_RAMPBACK_PERIOD)
- m_dRateTempRampbackChange = 0.0;
- }
-
- }
+ if (rampDirection != RampDirection::None) {
+ if (!m_bTempStarted) {
+ m_bTempStarted = true;
+ double latrate = ((double)bufferSamples / (double)m_pSampleRate->get());
+ m_dRateTempRampChange = (latrate / ((double)m_iRateRampSensitivity / 100.));
+ }
- if (m_eRateRampMode == RampMode::Linear) {
- if (m_ePbCurrent) {
- // apply ramped pitchbending
- if (m_ePbCurrent == RateControl::RATERAMP_UP) {
- addRateTemp(m_dTemporaryRateChangeCoarse.getValue());
- } else if (m_ePbCurrent == RateControl::RATERAMP_DOWN) {
- subRateTemp(m_dTemporaryRateChangeCoarse.getValue());
- }
- } else if ((m_bTempStarted)
- || ((m_eRampBackMode != RATERAMP_RAMPBACK_NONE)
- && (m_dRateTemp != 0.0))) {
- // No buttons pressed, so time to deinitialize
- m_bTempStarted = false;
-
- if ((m_eRampBackMode == RATERAMP_RAMPBACK_PERIOD)
- && (m_dRateTempRampbackChange == 0.0)) {
- int period = 2;
- m_dRateTempRampbackChange = fabs(
- m_dRateTemp / period);
- } else if ((m_eRampBackMode != RATERAMP_RAMPBACK_NONE)
- && (m_dRateTempRampbackChange == 0.0)) {
- if (fabs(m_dRateTemp) < m_dRateTempRampbackChange) {
- resetRateTemp();
- } else if (m_dRateTemp > 0) {
- subRateTemp(m_dRateTempRampbackChange);
- } else {
- addRateTemp(m_dRateTempRampbackChange);
+ switch (rampDirection) {
+ case RampDirection::Up:
+ case RampDirection::UpSmall:
+ addRateTemp(m_dRateTempRampChange * m_pRateRange->get());
+ break;
+ case RampDirection::Down:
+ case RampDirection::DownSmall:
+ subRateTemp(m_dRateTempRampChange * m_pRateRange->get());
+ break;
+ case RampDirection::None:
+ default:
+ DEBUG_ASSERT(false);
}
- } else {
- resetRateTemp();
}
}
- } else if ((m_eRateRampMode == RampMode::Stepping) && (m_bTempStarted)) {
- if (!m_ePbCurrent) {
- m_bTempStarted = false;
- resetRateTemp();
- }
+ } else if (m_bTempStarted) {
+ m_bTempStarted = false;
+ resetRateTemp();
}
}
double RateControl::getTempRate() {
- return (m_pRateDir->get() * (m_dRateTemp * m_pRateRange->get()));
-}
-
-void RateControl::setRateTemp(double v)
-{
- // Do not go backwards
- if ((calcRateRatio() + v) < 0) {
- return;
- }
-
- m_dRateTemp = v;
- if (m_dRateTemp < -1.0) {
- m_dRateTemp = -1.0;
- } else if (m_dRateTemp > 1.0) {
- m_dRateTemp = 1.0;
- } else if (isnan(m_dRateTemp)) {
- m_dRateTemp = 0;
+ // qDebug() << m_tempRateRatio;
+ return m_tempRateRatio;
+}
+
+void RateControl::setRateTemp(double v) {
+ m_tempRateRatio = v;
+ if (m_tempRateRatio < -1.0) {
+ m_tempRateRatio = -1.0;
+ } else if (m_tempRateRatio > 1.0) {
+ m_tempRateRatio = 1.0;
+ } else if (isnan(m_tempRateRatio)) {
+ m_tempRateRatio = 0;
}
}
void RateControl::addRateTemp(double v)
{
- setRateTemp(m_dRateTemp + v);
+ setRateTemp(m_tempRateRatio + v);
}
void RateControl::subRateTemp(double v)
{
- setRateTemp(m_dRateTemp - v);
+ setRateTemp(m_tempRateRatio - v);
}
void RateControl::resetRateTemp(void)