Skip to content

Commit

Permalink
Re-factor effect parameter linking so that value interpolation is don…
Browse files Browse the repository at this point in the history
…e by ControlEffectKnob.
  • Loading branch information
rryan committed Mar 28, 2014
1 parent 5387f6f commit aecd024
Show file tree
Hide file tree
Showing 13 changed files with 38 additions and 99 deletions.
6 changes: 0 additions & 6 deletions src/effects/effect.cpp
Expand Up @@ -110,12 +110,6 @@ unsigned int Effect::numParameters() const {
return m_parameters.size();
}

void Effect::onChainParameterChanged(double chainParameter) {
foreach (EffectParameter* pParameter, m_parameters) {
pParameter->onChainParameterChanged(chainParameter);
}
}

EffectParameter* Effect::getParameterById(const QString& id) const {
EffectParameter* pParameter = m_parametersById.value(id, NULL);
if (pParameter == NULL) {
Expand Down
2 changes: 0 additions & 2 deletions src/effects/effect.h
Expand Up @@ -41,8 +41,6 @@ class Effect : public QObject {

EngineEffect* getEngineEffect();

void onChainParameterChanged(double chainParameter);

void addToEngine(EngineEffectChain* pChain, int iIndex);
void removeFromEngine(EngineEffectChain* pChain, int iIndex);
void updateEngineState();
Expand Down
39 changes: 0 additions & 39 deletions src/effects/effectchain.cpp
Expand Up @@ -17,7 +17,6 @@ EffectChain::EffectChain(EffectsManager* pEffectsManager, const QString& id,
m_name(""),
m_insertionType(EffectChain::INSERT),
m_dMix(0),
m_dParameter(0),
m_pEngineEffectChain(new EngineEffectChain(m_id)),
m_bAddedToEngine(false) {
}
Expand Down Expand Up @@ -88,7 +87,6 @@ EffectChainPointer EffectChain::clone(EffectChainPointer pChain) {
pChain->m_pEffectsManager, pChain->id(), pChain);
pClone->setEnabled(pChain->enabled());
pClone->setName(pChain->name());
pClone->setParameter(pChain->parameter());
pClone->setMix(pChain->mix());
foreach (const QString& group, pChain->enabledGroups()) {
pClone->enableForGroup(group);
Expand Down Expand Up @@ -171,23 +169,6 @@ void EffectChain::disableForGroup(const QString& group) {
}
}

double EffectChain::parameter() const {
return m_dParameter;
}

void EffectChain::setParameter(const double& dParameter) {
m_dParameter = dParameter;
sendParameterUpdate();

foreach (EffectPointer pEffect, m_effects) {
if (pEffect) {
pEffect->onChainParameterChanged(m_dParameter);
}
}

emit(parameterChanged(dParameter));
}

double EffectChain::mix() const {
return m_dMix;
}
Expand Down Expand Up @@ -221,7 +202,6 @@ void EffectChain::addEffect(EffectPointer pEffect) {
return;
}
m_effects.append(pEffect);
pEffect->onChainParameterChanged(m_dParameter);
if (m_bAddedToEngine) {
pEffect->addToEngine(m_pEngineEffectChain, m_effects.size() - 1);
}
Expand All @@ -244,7 +224,6 @@ void EffectChain::replaceEffect(unsigned int iEffectNumber,

m_effects.replace(iEffectNumber, pEffect);
if (pEffect) {
pEffect->onChainParameterChanged(m_dParameter);
if (m_bAddedToEngine) {
pEffect->addToEngine(m_pEngineEffectChain, iEffectNumber);
}
Expand Down Expand Up @@ -305,10 +284,6 @@ QDomElement EffectChain::toXML(QDomDocument* doc) const {
XmlParse::addElement(*doc, element, "Description", m_description);
XmlParse::addElement(*doc, element, "InsertionType",
insertionTypeToString(m_insertionType));
XmlParse::addElement(*doc, element, "Mix",
QString::number(m_dMix));
XmlParse::addElement(*doc, element, "Parameter",
QString::number(m_dParameter));

QDomElement effectsNode = doc->createElement("Effects");
foreach (EffectPointer pEffect, m_effects) {
Expand All @@ -329,8 +304,6 @@ EffectChainPointer EffectChain::fromXML(EffectsManager* pEffectsManager,
QString name = XmlParse::selectNodeQString(element, "Name");
QString description = XmlParse::selectNodeQString(element, "Description");
QString insertionTypeStr = XmlParse::selectNodeQString(element, "InsertionType");
QString mixStr = XmlParse::selectNodeQString(element, "Mix");
QString parameterStr = XmlParse::selectNodeQString(element, "ParameterStr");

EffectChain* pChain = new EffectChain(pEffectsManager, id);
pChain->setName(name);
Expand All @@ -339,20 +312,8 @@ EffectChainPointer EffectChain::fromXML(EffectsManager* pEffectsManager,
if (insertionType != NUM_INSERTION_TYPES) {
pChain->setInsertionType(insertionType);
}
bool ok = false;
double mix = mixStr.toDouble(&ok);
if (ok) {
pChain->setMix(mix);
}

ok = false;
double parameter = parameterStr.toDouble(&ok);
if (ok) {
pChain->setParameter(parameter);
}

EffectChainPointer pChainWrapped(pChain);

pEffectsManager->getEffectChainManager()->addEffectChain(pChainWrapped);

QDomElement effects = XmlParse::selectElement(element, "Effects");
Expand Down
5 changes: 0 additions & 5 deletions src/effects/effectchain.h
Expand Up @@ -52,9 +52,6 @@ class EffectChain : public QObject {
QString description() const;
void setDescription(const QString& description);

double parameter() const;
void setParameter(const double& dParameter);

double mix() const;
void setMix(const double& dMix);

Expand Down Expand Up @@ -109,7 +106,6 @@ class EffectChain : public QObject {
void descriptionChanged(const QString& name);
void enabledChanged(bool enabled);
void mixChanged(double v);
void parameterChanged(double v);
void insertionTypeChanged(EffectChain::InsertionType type);
void groupStatusChanged(const QString& group, bool enabled);

Expand All @@ -129,7 +125,6 @@ class EffectChain : public QObject {
QString m_description;
InsertionType m_insertionType;
double m_dMix;
double m_dParameter;

QSet<QString> m_enabledGroups;
QList<EffectPointer> m_effects;
Expand Down
5 changes: 2 additions & 3 deletions src/effects/effectchainslot.cpp
Expand Up @@ -191,7 +191,6 @@ void EffectChainSlot::loadEffectChain(EffectChainPointer pEffectChain) {
// Mix, parameter, and enabled channels are persistent properties of the
// chain slot, not of the chain. Propagate the current settings to the
// chain.
m_pEffectChain->setParameter(m_pControlChainParameter->get());
m_pEffectChain->setMix(m_pControlChainMix->get());
m_pEffectChain->setEnabled(m_pControlChainEnabled->get() > 0.0);
for (QMap<QString, ControlObject*>::iterator it = m_groupEnableControls.begin();
Expand Down Expand Up @@ -358,8 +357,8 @@ void EffectChainSlot::slotControlChainParameter(double v) {
v = math_clamp(v, 0.0, 1.0);
m_pControlChainParameter->set(v);
}
if (m_pEffectChain) {
m_pEffectChain->setParameter(v);
for (int i = 0; i < m_slots.size(); ++i) {
m_slots[i]->onChainParameterChanged(v);
}
}

Expand Down
26 changes: 0 additions & 26 deletions src/effects/effectparameter.cpp
Expand Up @@ -196,32 +196,6 @@ void EffectParameter::setLinkType(EffectManifestParameter::LinkType linkType) {
// TODO(rryan) update value based on link type.
}

void EffectParameter::onChainParameterChanged(double chainParameter) {
double max;
double min;
switch (m_linkType) {
case EffectManifestParameter::LINK_INVERSE:
chainParameter = 1.0 - chainParameter;
// Intentional fall-through.
case EffectManifestParameter::LINK_LINKED:
if (chainParameter < 0.0 || chainParameter > 1.0) {
return;
}
max = m_maximum.toDouble();
min = m_minimum.toDouble();
if (m_parameter.controlHint() == EffectManifestParameter::CONTROL_KNOB_LOGARITHMIC) {
double dB1 = log10((max - min) + 1.0);
setValue(min + pow(10.0, dB1 * chainParameter) - 1.0);
} else {
setValue(min + chainParameter * (max - min));
}
break;
case EffectManifestParameter::LINK_NONE:
default:
break;
}
}

QVariant EffectParameter::getValue() const {
return m_value;
}
Expand Down
2 changes: 0 additions & 2 deletions src/effects/effectparameter.h
Expand Up @@ -57,8 +57,6 @@ class EffectParameter : public QObject {

void updateEngineState();

void onChainParameterChanged(double chainParameter);

signals:
void valueChanged(QVariant value);

Expand Down
27 changes: 26 additions & 1 deletion src/effects/effectparameterslot.cpp
Expand Up @@ -16,7 +16,8 @@ EffectParameterSlot::EffectParameterSlot(const unsigned int iRackNumber,
m_iParameterNumber(iParameterNumber),
m_group(formatGroupString(m_iRackNumber, m_iChainNumber,
m_iSlotNumber)),
m_pEffectParameter(NULL) {
m_pEffectParameter(NULL),
m_dChainParameter(0.0) {
QString itemPrefix = formatItemPrefix(iParameterNumber);
m_pControlLoaded = new ControlObject(
ConfigKey(m_group, itemPrefix + QString("_loaded")));
Expand Down Expand Up @@ -108,6 +109,10 @@ void EffectParameterSlot::loadEffect(EffectPointer pEffect) {
connect(m_pEffectParameter, SIGNAL(valueChanged(QVariant)),
this, SLOT(slotParameterValueChanged(QVariant)));
}

// Update the newly loaded parameter to match the current chain
// superknob if it is linked.
onChainParameterChanged(m_dChainParameter);
}
emit(updated());
}
Expand Down Expand Up @@ -158,3 +163,23 @@ void EffectParameterSlot::slotParameterValueChanged(QVariant value) {
qDebug() << debugString() << "slotParameterValueChanged" << value.toDouble();
m_pControlValue->set(value.toDouble());
}

void EffectParameterSlot::onChainParameterChanged(double parameter) {
m_dChainParameter = parameter;
if (m_pEffectParameter != NULL) {
switch (m_pEffectParameter->getLinkType()) {
case EffectManifestParameter::LINK_INVERSE:
parameter = 1.0 - parameter;
// Intentional fall-through.
case EffectManifestParameter::LINK_LINKED:
if (parameter < 0.0 || parameter > 1.0) {
return;
}
m_pControlValue->setParameter(parameter);
break;
case EffectManifestParameter::LINK_NONE:
default:
break;
}
}
}
3 changes: 3 additions & 0 deletions src/effects/effectparameterslot.h
Expand Up @@ -44,6 +44,8 @@ class EffectParameterSlot : public QObject {
QString name() const;
QString description() const;

void onChainParameterChanged(double parameter);

signals:
// Signal that indicates that the EffectParameterSlot has been updated.
void updated();
Expand Down Expand Up @@ -81,6 +83,7 @@ class EffectParameterSlot : public QObject {
ControlPushButton* m_pControlLinkType;
ControlEffectKnob* m_pControlValue;
ControlObject* m_pControlType;
double m_dChainParameter;

DISALLOW_COPY_AND_ASSIGN(EffectParameterSlot);
};
Expand Down
6 changes: 6 additions & 0 deletions src/effects/effectslot.cpp
Expand Up @@ -196,3 +196,9 @@ void EffectSlot::slotClear(double v) {
emit(clearEffect(m_iChainNumber, m_iEffectNumber, m_pEffect));
}
}

void EffectSlot::onChainParameterChanged(double parameter) {
for (int i = 0; i < m_parameters.size(); ++i) {
m_parameters[i]->onChainParameterChanged(parameter);
}
}
1 change: 1 addition & 0 deletions src/effects/effectslot.h
Expand Up @@ -39,6 +39,7 @@ class EffectSlot : public QObject {
unsigned int numParameterSlots() const;
EffectParameterSlotPointer addEffectParameterSlot();
EffectParameterSlotPointer getEffectParameterSlot(unsigned int slotNumber);
void onChainParameterChanged(double parameter);

public slots:
// Request that this EffectSlot load the given Effect
Expand Down
5 changes: 0 additions & 5 deletions src/effects/effectsmanager.cpp
Expand Up @@ -154,7 +154,6 @@ void EffectsManager::setupDefaults() {
EffectChainPointer pChain = EffectChainPointer(new EffectChain(
this, "org.mixxx.effectchain.flanger"));
pChain->setName(tr("Flanger"));
pChain->setParameter(0.0f);
EffectPointer pEffect = instantiateEffect(
"org.mixxx.effects.flanger");
pChain->addEffect(pEffect);
Expand All @@ -163,31 +162,27 @@ void EffectsManager::setupDefaults() {
pChain = EffectChainPointer(new EffectChain(
this, "org.mixxx.effectchain.bitcrusher"));
pChain->setName(tr("BitCrusher"));
pChain->setParameter(0.0f);
pEffect = instantiateEffect("org.mixxx.effects.bitcrusher");
pChain->addEffect(pEffect);
m_pEffectChainManager->addEffectChain(pChain);

pChain = EffectChainPointer(new EffectChain(
this, "org.mixxx.effectchain.filter"));
pChain->setName(tr("Filter"));
pChain->setParameter(0.0f);
pEffect = instantiateEffect("org.mixxx.effects.filter");
pChain->addEffect(pEffect);
m_pEffectChainManager->addEffectChain(pChain);

pChain = EffectChainPointer(new EffectChain(
this, "org.mixxx.effectchain.reverb"));
pChain->setName(tr("Reverb"));
pChain->setParameter(0.0f);
pEffect = instantiateEffect("org.mixxx.effects.reverb");
pChain->addEffect(pEffect);
m_pEffectChainManager->addEffectChain(pChain);

pChain = EffectChainPointer(new EffectChain(
this, "org.mixxx.effectchain.echo"));
pChain->setName(tr("Echo"));
pChain->setParameter(0.0f);
pEffect = instantiateEffect("org.mixxx.effects.echo");
pChain->addEffect(pEffect);
m_pEffectChainManager->addEffectChain(pChain);
Expand Down
10 changes: 0 additions & 10 deletions src/test/effectchainslottest.cpp
Expand Up @@ -53,16 +53,6 @@ TEST_F(EffectChainSlotTest, ChainSlotMirrorsLoadedChain) {
ControlObject::set(ConfigKey(group, "num_effects"), 1);
EXPECT_EQ(0, pChain->numEffects());

ControlObject::set(ConfigKey(group, "parameter"), 0.5);
EXPECT_DOUBLE_EQ(0.5, pChain->parameter());

pChain->setParameter(1.0);
EXPECT_DOUBLE_EQ(pChain->parameter(),
ControlObject::get(ConfigKey(group, "parameter")));

ControlObject::set(ConfigKey(group, "parameter"), 0.5);
EXPECT_DOUBLE_EQ(0.5, pChain->parameter());

pChain->setMix(1.0);
EXPECT_DOUBLE_EQ(pChain->mix(),
ControlObject::get(ConfigKey(group, "mix")));
Expand Down

0 comments on commit aecd024

Please sign in to comment.