From 052fd744c53e167148fe12ef16c2c3b6b2dfc579 Mon Sep 17 00:00:00 2001 From: kshitij98 Date: Tue, 5 Jun 2018 19:29:35 +0530 Subject: [PATCH 001/443] Consolidated EffectChain and EffectChainSlot - EffectChain and EffectChainSlot had no clear separation of responsibility - Had to keep the duplicated state in both the classes in sync and thus making it more susceptible to bugs NOTE: XML saving/loading of effects is broken and will be re-implemented in the new architecture --- build/depends.py | 1 - src/effects/effectchain.cpp | 373 --------------- src/effects/effectchain.h | 132 ------ src/effects/effectchainmanager.cpp | 174 +++---- src/effects/effectchainmanager.h | 16 +- src/effects/effectchainslot.cpp | 553 ++++++++++++----------- src/effects/effectchainslot.h | 100 ++-- src/effects/effectrack.cpp | 129 ++---- src/effects/effectrack.h | 5 - src/effects/effectsmanager.cpp | 84 +--- src/effects/effectsmanager.h | 19 +- src/engine/effects/engineeffectchain.cpp | 3 +- src/engine/effects/engineeffectchain.h | 1 - src/mixxx.cpp | 4 +- src/preferences/dialog/dlgprefeq.cpp | 11 +- src/test/baseeffecttest.h | 1 - src/test/effectchainslottest.cpp | 113 ----- src/test/effectslottest.cpp | 6 +- src/test/effectsmanagertest.cpp | 2 - src/test/metaknob_link_test.cpp | 5 +- src/widget/weffectchain.cpp | 8 +- 21 files changed, 544 insertions(+), 1196 deletions(-) delete mode 100644 src/effects/effectchain.cpp delete mode 100644 src/effects/effectchain.h delete mode 100644 src/test/effectchainslottest.cpp diff --git a/build/depends.py b/build/depends.py index 7acc13704288..9d4b68e7a135 100644 --- a/build/depends.py +++ b/build/depends.py @@ -693,7 +693,6 @@ def sources(self, build): "effects/effectmanifest.cpp", "effects/effectmanifestparameter.cpp", - "effects/effectchain.cpp", "effects/effect.cpp", "effects/effectparameter.cpp", diff --git a/src/effects/effectchain.cpp b/src/effects/effectchain.cpp deleted file mode 100644 index ef602743146f..000000000000 --- a/src/effects/effectchain.cpp +++ /dev/null @@ -1,373 +0,0 @@ -#include "effects/effectchain.h" - -#include "engine/engine.h" -#include "effects/effectchainmanager.h" -#include "effects/effectsmanager.h" -#include "effects/effectprocessor.h" -#include "effects/effectxmlelements.h" -#include "engine/effects/engineeffectchain.h" -#include "engine/effects/engineeffectrack.h" -#include "engine/effects/message.h" -#include "util/defs.h" -#include "util/sample.h" -#include "util/xml.h" - -EffectChain::EffectChain(EffectsManager* pEffectsManager, const QString& id, - EffectChainPointer pPrototype) - : QObject(pEffectsManager), - m_pEffectsManager(pEffectsManager), - m_pPrototype(pPrototype), - m_bEnabled(true), - m_id(id), - m_name(""), - m_mixMode(EffectChainMixMode::DrySlashWet), - m_dMix(0), - m_pEngineEffectChain(nullptr), - m_bAddedToEngine(false) { -} - -EffectChain::~EffectChain() { - // Remove all effects. - for (int i = 0; i < m_effects.size(); ++i) { - removeEffect(i); - } -} - -void EffectChain::addToEngine(EngineEffectRack* pRack, int iIndex) { - m_pEngineEffectChain = new EngineEffectChain(m_id, - m_pEffectsManager->registeredInputChannels(), - m_pEffectsManager->registeredOutputChannels()); - EffectsRequest* pRequest = new EffectsRequest(); - pRequest->type = EffectsRequest::ADD_CHAIN_TO_RACK; - pRequest->pTargetRack = pRack; - pRequest->AddChainToRack.pChain = m_pEngineEffectChain; - pRequest->AddChainToRack.iIndex = iIndex; - m_pEffectsManager->writeRequest(pRequest); - m_bAddedToEngine = true; - - // Add all effects. - for (int i = 0; i < m_effects.size(); ++i) { - // Add the effect to the engine. - EffectPointer pEffect = m_effects[i]; - if (pEffect) { - pEffect->addToEngine(m_pEngineEffectChain, i, m_enabledInputChannels); - } - } -} - -void EffectChain::removeFromEngine(EngineEffectRack* pRack, int iIndex) { - if (!m_bAddedToEngine) { - return; - } - - // Order doesn't matter when removing. - for (int i = 0; i < m_effects.size(); ++i) { - EffectPointer pEffect = m_effects[i]; - if (pEffect) { - pEffect->removeFromEngine(m_pEngineEffectChain, i); - } - } - - EffectsRequest* pRequest = new EffectsRequest(); - pRequest->type = EffectsRequest::REMOVE_CHAIN_FROM_RACK; - pRequest->pTargetRack = pRack; - pRequest->RemoveChainFromRack.pChain = m_pEngineEffectChain; - pRequest->RemoveChainFromRack.iIndex = iIndex; - m_pEffectsManager->writeRequest(pRequest); - m_bAddedToEngine = false; - - m_pEngineEffectChain = nullptr; -} - -void EffectChain::updateEngineState() { - if (!m_bAddedToEngine) { - return; - } - // Update chain parameters in the engine. - sendParameterUpdate(); - for (int i = 0; i < m_effects.size(); ++i) { - EffectPointer pEffect = m_effects[i]; - if (pEffect) { - // Update effect parameters in the engine. - pEffect->updateEngineState(); - } - } -} - -// static -EffectChainPointer EffectChain::clone(EffectChainPointer pChain) { - if (!pChain) { - return EffectChainPointer(); - } - - EffectChain* pClone = new EffectChain( - pChain->m_pEffectsManager, pChain->id(), pChain); - pClone->setName(pChain->name()); - // Do not set the state of the chain because that information belongs - // to the EffectChainSlot. Leave that to EffectChainSlot::loadEffectChain. - for (const auto& pEffect : pChain->effects()) { - EffectPointer pClonedEffect; - if (pEffect == nullptr) { - // Insert empty effect to preserve chain order - pClonedEffect = EffectPointer(); - } else { - pClonedEffect = pChain->m_pEffectsManager->instantiateEffect( - pEffect->getManifest()->id()); - } - pClone->addEffect(pClonedEffect); - } - return EffectChainPointer(pClone); -} - -EffectChainPointer EffectChain::prototype() const { - return m_pPrototype; -} - -const QString& EffectChain::id() const { - return m_id; -} - -const QString& EffectChain::name() const { - return m_name; -} - -void EffectChain::setName(const QString& name) { - m_name = name; - emit(nameChanged(name)); -} - -QString EffectChain::description() const { - return m_description; -} - -void EffectChain::setDescription(const QString& description) { - m_description = description; - emit(descriptionChanged(description)); -} - -bool EffectChain::enabled() const { - return m_bEnabled; -} - -void EffectChain::setEnabled(bool enabled) { - m_bEnabled = enabled; - sendParameterUpdate(); - emit(enabledChanged(enabled)); -} - -void EffectChain::enableForInputChannel(const ChannelHandleAndGroup& handle_group) { - // TODO(Be): remove m_enabledChannels from this class and move this logic - // to EffectChainSlot - bool bWasAlreadyEnabled = m_enabledInputChannels.contains(handle_group); - if (!bWasAlreadyEnabled) { - m_enabledInputChannels.insert(handle_group); - } - - // The allocation of EffectStates below may be expensive, so avoid it if - // not needed. - if (!m_bAddedToEngine || bWasAlreadyEnabled) { - return; - } - - EffectsRequest* request = new EffectsRequest(); - request->type = EffectsRequest::ENABLE_EFFECT_CHAIN_FOR_INPUT_CHANNEL; - request->pTargetChain = m_pEngineEffectChain; - request->EnableInputChannelForChain.pChannelHandle = &handle_group.handle(); - - // Allocate EffectStates here in the main thread to avoid allocating - // memory in the realtime audio callback thread. Pointers to the - // EffectStates are passed to the EffectRequest and the EffectProcessorImpls - // store the pointers. The containers of EffectState* pointers get deleted - // by ~EffectsRequest, but the EffectStates are managed by EffectProcessorImpl. - auto pEffectStatesMapArray = new EffectStatesMapArray; - - //TODO: get actual configuration of engine - const mixxx::EngineParameters bufferParameters( - mixxx::AudioSignal::SampleRate(96000), - MAX_BUFFER_LEN / mixxx::kEngineChannelCount); - - for (int i = 0; i < m_effects.size(); ++i) { - auto& statesMap = (*pEffectStatesMapArray)[i]; - if (m_effects[i] != nullptr) { - for (const auto& outputChannel : m_pEffectsManager->registeredOutputChannels()) { - if (kEffectDebugOutput) { - qDebug() << debugString() << "EffectChain::enableForInputChannel creating EffectState for input" << handle_group << "output" << outputChannel; - } - statesMap.insert(outputChannel.handle(), - m_effects[i]->createState(bufferParameters)); - } - } else { - for (EffectState* pState : statesMap) { - if (pState != nullptr) { - delete pState; - } - } - statesMap.clear(); - } - } - request->EnableInputChannelForChain.pEffectStatesMapArray = pEffectStatesMapArray; - - m_pEffectsManager->writeRequest(request); - emit(channelStatusChanged(handle_group.name(), true)); -} - -bool EffectChain::enabledForChannel(const ChannelHandleAndGroup& handle_group) const { - return m_enabledInputChannels.contains(handle_group); -} - -void EffectChain::disableForInputChannel(const ChannelHandleAndGroup& handle_group) { - if (m_enabledInputChannels.remove(handle_group)) { - if (!m_bAddedToEngine) { - return; - } - EffectsRequest* request = new EffectsRequest(); - request->type = EffectsRequest::DISABLE_EFFECT_CHAIN_FOR_INPUT_CHANNEL; - request->pTargetChain = m_pEngineEffectChain; - request->DisableInputChannelForChain.pChannelHandle = &handle_group.handle(); - m_pEffectsManager->writeRequest(request); - - emit(channelStatusChanged(handle_group.name(), false)); - } -} - -double EffectChain::mix() const { - return m_dMix; -} - -void EffectChain::setMix(const double& dMix) { - m_dMix = dMix; - sendParameterUpdate(); - emit(mixChanged(dMix)); -} - -EffectChainMixMode EffectChain::mixMode() const { - return m_mixMode; -} - -void EffectChain::setMixMode(EffectChainMixMode mixMode) { - m_mixMode = mixMode; - sendParameterUpdate(); - emit(mixModeChanged(mixMode)); -} - -void EffectChain::addEffect(EffectPointer pEffect) { - //qDebug() << debugString() << "addEffect" << pEffect; - if (!pEffect) { - // Insert empty effects to preserve chain order - // when loading chains with empty effects - m_effects.append(pEffect); - return; - } - - VERIFY_OR_DEBUG_ASSERT(!m_effects.contains(pEffect)) { - return; - } - - m_effects.append(pEffect); - if (m_bAddedToEngine) { - pEffect->addToEngine(m_pEngineEffectChain, m_effects.size() - 1, m_enabledInputChannels); - } - emit(effectChanged(m_effects.size() - 1)); -} - -void EffectChain::replaceEffect(unsigned int effectSlotNumber, - EffectPointer pEffect) { - //qDebug() << debugString() << "replaceEffect" << effectSlotNumber << pEffect; - while (effectSlotNumber >= static_cast(m_effects.size())) { - if (pEffect.isNull()) { - return; - } - m_effects.append(EffectPointer()); - } - - EffectPointer pOldEffect = m_effects[effectSlotNumber]; - if (!pOldEffect.isNull()) { - if (m_bAddedToEngine) { - pOldEffect->removeFromEngine(m_pEngineEffectChain, effectSlotNumber); - } - } - - m_effects.replace(effectSlotNumber, pEffect); - if (!pEffect.isNull()) { - if (m_bAddedToEngine) { - pEffect->addToEngine(m_pEngineEffectChain, effectSlotNumber, m_enabledInputChannels); - } - } - - emit(effectChanged(effectSlotNumber)); -} - -void EffectChain::removeEffect(unsigned int effectSlotNumber) { - replaceEffect(effectSlotNumber, EffectPointer()); -} - -void EffectChain::refreshAllEffects() { - for (int i = 0; i < m_effects.size(); ++i) { - emit(effectChanged(i)); - } -} - -unsigned int EffectChain::numEffects() const { - return m_effects.size(); -} - -const QList& EffectChain::effects() const { - return m_effects; -} - -EngineEffectChain* EffectChain::getEngineEffectChain() { - return m_pEngineEffectChain; -} - -void EffectChain::sendParameterUpdate() { - if (!m_bAddedToEngine) { - return; - } - EffectsRequest* pRequest = new EffectsRequest(); - pRequest->type = EffectsRequest::SET_EFFECT_CHAIN_PARAMETERS; - pRequest->pTargetChain = m_pEngineEffectChain; - pRequest->SetEffectChainParameters.enabled = m_bEnabled; - pRequest->SetEffectChainParameters.mix_mode = m_mixMode; - pRequest->SetEffectChainParameters.mix = m_dMix; - m_pEffectsManager->writeRequest(pRequest); -} - -// static -EffectChainPointer EffectChain::createFromXml(EffectsManager* pEffectsManager, - const QDomElement& element) { - if (!element.hasChildNodes()) { - // An empty element is treated as an ejected Chain (null) - return EffectChainPointer(); - } - - QString id = XmlParse::selectNodeQString(element, - EffectXml::ChainId); - QString name = XmlParse::selectNodeQString(element, - EffectXml::ChainName); - QString description = XmlParse::selectNodeQString(element, - EffectXml::ChainDescription); - QString mixModeStr = XmlParse::selectNodeQString(element, - EffectXml::ChainMixMode); - - EffectChainPointer pChain(new EffectChain(pEffectsManager, id)); - pChain->setName(name); - pChain->setDescription(description); - EffectChainMixMode mixMode = mixModeFromString(mixModeStr); - if (mixMode < EffectChainMixMode::NumMixModes) { - pChain->setMixMode(mixMode); - } - - QDomElement effects = XmlParse::selectElement(element, EffectXml::EffectsRoot); - QDomNodeList effectChildren = effects.childNodes(); - - for (int i = 0; i < effectChildren.count(); ++i) { - QDomNode effect = effectChildren.at(i); - if (effect.isElement()) { - EffectPointer pEffect = Effect::createFromXml( - pEffectsManager, effect.toElement()); - pChain->addEffect(pEffect); - } - } - - return pChain; -} diff --git a/src/effects/effectchain.h b/src/effects/effectchain.h deleted file mode 100644 index 6b074ffa2a48..000000000000 --- a/src/effects/effectchain.h +++ /dev/null @@ -1,132 +0,0 @@ -#ifndef EFFECTCHAIN_H -#define EFFECTCHAIN_H - -#include -#include -#include -#include - -#include "effects/defs.h" -#include "engine/channelhandle.h" -#include "effects/effect.h" -#include "util/class.h" - -class EffectsManager; -class EngineEffectRack; -class EngineEffectChain; -class EffectChain; -typedef QSharedPointer EffectChainPointer; - -// The main-thread representation of an effect chain. This class is NOT -// thread-safe and must only be used from the main thread. -class EffectChain : public QObject { - Q_OBJECT - public: - EffectChain(EffectsManager* pEffectsManager, const QString& id, - EffectChainPointer prototype=EffectChainPointer()); - virtual ~EffectChain(); - - void addToEngine(EngineEffectRack* pRack, int iIndex); - void removeFromEngine(EngineEffectRack* pRack, int iIndex); - void updateEngineState(); - - // The ID of an EffectChain is a unique ID given to it to help associate it - // with the preset from which it was loaded. - const QString& id() const; - - // Whether the chain is enabled (eligible for processing). - bool enabled() const; - void setEnabled(bool enabled); - - // Activates EffectChain processing for the provided channel. - void enableForInputChannel(const ChannelHandleAndGroup& handle_group); - bool enabledForChannel(const ChannelHandleAndGroup& handle_group) const; - const QSet& enabledChannels() const; - void disableForInputChannel(const ChannelHandleAndGroup& handle_group); - - EffectChainPointer prototype() const; - - // Get the human-readable name of the EffectChain - const QString& name() const; - void setName(const QString& name); - - // Get the human-readable description of the EffectChain - QString description() const; - void setDescription(const QString& description); - - double mix() const; - void setMix(const double& dMix); - - static QString mixModeToString(EffectChainMixMode type) { - switch (type) { - case EffectChainMixMode::DrySlashWet: - return "DRY/WET"; - case EffectChainMixMode::DryPlusWet: - return "DRY+WET"; - default: - return "UNKNOWN"; - } - } - static EffectChainMixMode mixModeFromString(const QString& typeStr) { - if (typeStr == "DRY/WET") { - return EffectChainMixMode::DrySlashWet; - } else if (typeStr == "DRY+WET") { - return EffectChainMixMode::DryPlusWet; - } else { - return EffectChainMixMode::NumMixModes; - } - } - - EffectChainMixMode mixMode() const; - void setMixMode(EffectChainMixMode type); - - void addEffect(EffectPointer pEffect); - void replaceEffect(unsigned int effectSlotNumber, EffectPointer pEffect); - void removeEffect(unsigned int effectSlotNumber); - void refreshAllEffects(); - - const QList& effects() const; - unsigned int numEffects() const; - - EngineEffectChain* getEngineEffectChain(); - - static EffectChainPointer createFromXml(EffectsManager* pEffectsManager, - const QDomElement& element); - static EffectChainPointer clone(EffectChainPointer pChain); - - signals: - // Signal that indicates that an effect has been added or removed. - void effectChanged(unsigned int effectSlotNumber); - void nameChanged(const QString& name); - void descriptionChanged(const QString& name); - void enabledChanged(bool enabled); - void mixChanged(double v); - void mixModeChanged(EffectChainMixMode type); - void channelStatusChanged(const QString& group, bool enabled); - - private: - QString debugString() const { - return QString("EffectChain(%1)").arg(m_id); - } - - void sendParameterUpdate(); - - EffectsManager* m_pEffectsManager; - EffectChainPointer m_pPrototype; - - bool m_bEnabled; - QString m_id; - QString m_name; - QString m_description; - EffectChainMixMode m_mixMode; - double m_dMix; - - QSet m_enabledInputChannels; - QList m_effects; - EngineEffectChain* m_pEngineEffectChain; - bool m_bAddedToEngine; - - DISALLOW_COPY_AND_ASSIGN(EffectChain); -}; - -#endif /* EFFECTCHAIN_H */ diff --git a/src/effects/effectchainmanager.cpp b/src/effects/effectchainmanager.cpp index 595f5e010ffc..682fc71f0ae7 100644 --- a/src/effects/effectchainmanager.cpp +++ b/src/effects/effectchainmanager.cpp @@ -97,50 +97,50 @@ EffectRackPointer EffectChainManager::getEffectRack(const QString& group) { return m_effectRacksByGroup.value(group); } -void EffectChainManager::addEffectChain(EffectChainPointer pEffectChain) { - if (pEffectChain) { - m_effectChains.append(pEffectChain); +void EffectChainManager::addEffectChain(EffectChainSlotPointer pEffectChainSlot) { + if (pEffectChainSlot) { + m_effectChainSlots.append(pEffectChainSlot); } } -void EffectChainManager::removeEffectChain(EffectChainPointer pEffectChain) { - if (pEffectChain) { - m_effectChains.removeAll(pEffectChain); +void EffectChainManager::removeEffectChain(EffectChainSlotPointer pEffectChainSlot) { + if (pEffectChainSlot) { + m_effectChainSlots.removeAll(pEffectChainSlot); } } -EffectChainPointer EffectChainManager::getNextEffectChain(EffectChainPointer pEffectChain) { - if (m_effectChains.isEmpty()) - return EffectChainPointer(); +EffectChainSlotPointer EffectChainManager::getNextEffectChain(EffectChainSlotPointer pEffectChainSlot) { + if (m_effectChainSlots.isEmpty()) + return EffectChainSlotPointer(); - if (!pEffectChain) { - return m_effectChains[0]; + if (!pEffectChainSlot) { + return m_effectChainSlots[0]; } - int indexOf = m_effectChains.lastIndexOf(pEffectChain); + int indexOf = m_effectChainSlots.lastIndexOf(pEffectChainSlot); if (indexOf == -1) { qWarning() << debugString() << "WARNING: getNextEffectChain called for an unmanaged EffectChain"; - return m_effectChains[0]; + return m_effectChainSlots[0]; } - return m_effectChains[(indexOf + 1) % m_effectChains.size()]; + return m_effectChainSlots[(indexOf + 1) % m_effectChainSlots.size()]; } -EffectChainPointer EffectChainManager::getPrevEffectChain(EffectChainPointer pEffectChain) { - if (m_effectChains.isEmpty()) - return EffectChainPointer(); +EffectChainSlotPointer EffectChainManager::getPrevEffectChain(EffectChainSlotPointer pEffectChainSlot) { + if (m_effectChainSlots.isEmpty()) + return EffectChainSlotPointer(); - if (!pEffectChain) { - return m_effectChains[m_effectChains.size()-1]; + if (!pEffectChainSlot) { + return m_effectChainSlots[m_effectChainSlots.size()-1]; } - int indexOf = m_effectChains.lastIndexOf(pEffectChain); + int indexOf = m_effectChainSlots.lastIndexOf(pEffectChainSlot); if (indexOf == -1) { qWarning() << debugString() << "WARNING: getPrevEffectChain called for an unmanaged EffectChain"; - return m_effectChains[m_effectChains.size()-1]; + return m_effectChainSlots[m_effectChainSlots.size()-1]; } - return m_effectChains[(indexOf - 1 + m_effectChains.size()) % m_effectChains.size()]; + return m_effectChainSlots[(indexOf - 1 + m_effectChainSlots.size()) % m_effectChainSlots.size()]; } void EffectChainManager::refeshAllRacks() { @@ -155,80 +155,82 @@ void EffectChainManager::refeshAllRacks() { } } -bool EffectChainManager::saveEffectChains() { - QDomDocument doc("MixxxEffects"); +// NOTE(Kshitij) : Use Effect Preset in constructor +// bool EffectChainManager::saveEffectChains() { +// QDomDocument doc("MixxxEffects"); - QString blank = "\n" - "<" + EffectXml::Root + " schemaVersion=\"" + - QString::number(EffectXml::kXmlSchemaVersion) + "\">\n" - "\n"; - doc.setContent(blank); +// QString blank = "\n" +// "<" + EffectXml::Root + " schemaVersion=\"" + +// QString::number(EffectXml::kXmlSchemaVersion) + "\">\n" +// "\n"; +// doc.setContent(blank); - QDomElement rootNode = doc.documentElement(); +// QDomElement rootNode = doc.documentElement(); - for (EffectRackPointer pRack : m_standardEffectRacks) { - rootNode.appendChild(pRack->toXml(&doc)); - } - // TODO? Save QuickEffects in effects.xml too, or keep stored in ConfigObjects? -// foreach(EffectRackPointer pRack, m_quickEffectRacks) { -// rootNode.appendChild(pRack->toXML(&doc)); +// for (EffectRackPointer pRack : m_standardEffectRacks) { +// rootNode.appendChild(pRack->toXml(&doc)); // } +// // TODO? Save QuickEffects in effects.xml too, or keep stored in ConfigObjects? +// // foreach(EffectRackPointer pRack, m_quickEffectRacks) { +// // rootNode.appendChild(pRack->toXML(&doc)); +// // } - QDir settingsPath(m_pConfig->getSettingsPath()); - - if (!settingsPath.exists()) { - return false; - } - - QFile file(settingsPath.absoluteFilePath("effects.xml")); +// QDir settingsPath(m_pConfig->getSettingsPath()); - // TODO(rryan): overwrite the right way. - if (!file.open(QIODevice::Truncate | QIODevice::WriteOnly)) { - return false; - } +// if (!settingsPath.exists()) { +// return false; +// } - QString effectsXml = doc.toString(); - file.write(effectsXml.toUtf8()); - file.close(); - return true; -} +// QFile file(settingsPath.absoluteFilePath("effects.xml")); -void EffectChainManager::loadEffectChains() { - QDir settingsPath(m_pConfig->getSettingsPath()); - QFile file(settingsPath.absoluteFilePath("effects.xml")); - QDomDocument doc; +// // TODO(rryan): overwrite the right way. +// if (!file.open(QIODevice::Truncate | QIODevice::WriteOnly)) { +// return false; +// } - QDomElement emptyChainElement = doc.createElement(EffectXml::Chain); - // Check that XML file can be opened and is valid XML - if (!file.open(QIODevice::ReadOnly) || !doc.setContent(&file)) { - return; - } +// QString effectsXml = doc.toString(); +// file.write(effectsXml.toUtf8()); +// file.close(); +// return true; +// } + +// NOTE(Kshitij) : Use EffectPreset to load effect chains +// void EffectChainManager::loadEffectChains() { +// QDir settingsPath(m_pConfig->getSettingsPath()); +// QFile file(settingsPath.absoluteFilePath("effects.xml")); +// QDomDocument doc; + +// QDomElement emptyChainElement = doc.createElement(EffectXml::Chain); +// // Check that XML file can be opened and is valid XML +// if (!file.open(QIODevice::ReadOnly) || !doc.setContent(&file)) { +// return; +// } - QDomElement root = doc.documentElement(); - QDomElement rackElement = XmlParse::selectElement(root, EffectXml::Rack); - QDomElement chainsElement = XmlParse::selectElement(rackElement, EffectXml::ChainsRoot); - QDomNodeList chainsList = chainsElement.elementsByTagName(EffectXml::Chain); - - for (int i = 0; i < chainsList.count(); ++i) { - QDomNode chainNode = chainsList.at(i); - - if (chainNode.isElement()) { - QDomElement chainElement = chainNode.toElement(); - EffectChainPointer pChain = EffectChain::createFromXml( - m_pEffectsManager, chainElement); - if (pChain) { // null = ejected chains. - EffectChainSlotPointer pChainSlot = getStandardEffectRack(0)->getEffectChainSlot(i); - if (pChainSlot) { - pChainSlot->loadEffectChainToSlot(pChain); - pChainSlot->loadChainSlotFromXml(chainElement); - pChain->addToEngine(getStandardEffectRack(0)->getEngineEffectRack(), i); - pChain->updateEngineState(); - pChainSlot->updateRoutingSwitches(); - } - } - } - } -} +// QDomElement root = doc.documentElement(); +// QDomElement rackElement = XmlParse::selectElement(root, EffectXml::Rack); +// QDomElement chainsElement = XmlParse::selectElement(rackElement, EffectXml::ChainsRoot); +// QDomNodeList chainsList = chainsElement.elementsByTagName(EffectXml::Chain); + +// for (int i = 0; i < chainsList.count(); ++i) { +// QDomNode chainNode = chainsList.at(i); + +// if (chainNode.isElement()) { +// QDomElement chainElement = chainNode.toElement(); +// EffectChainPointer pChain = EffectChain::createFromXml( +// m_pEffectsManager, chainElement); +// if (pChain) { // null = ejected chains. +// // Note(Kshitij) : Add the effect chain to standardEffectRack +// EffectChainSlotPointer pChainSlot = getStandardEffectRack(0)->getEffectChainSlot(i); +// if (pChainSlot) { +// pChainSlot->loadEffectChainToSlot(pChain); +// pChainSlot->loadChainSlotFromXml(chainElement); +// pChain->addToEngine(getStandardEffectRack(0)->getEngineEffectRack(), i); +// pChain->updateEngineState(); +// } +// } +// } +// } +// } bool EffectChainManager::isAdoptMetaknobValueEnabled() const { return m_pConfig->getValue(ConfigKey("[Effects]", "AdoptMetaknobValue"), true); diff --git a/src/effects/effectchainmanager.h b/src/effects/effectchainmanager.h index 12ea3fb3073a..2c75f70820b1 100644 --- a/src/effects/effectchainmanager.h +++ b/src/effects/effectchainmanager.h @@ -6,7 +6,6 @@ #include #include "preferences/usersettings.h" -#include "effects/effectchain.h" #include "effects/effectrack.h" #include "engine/channelhandle.h" #include "util/class.h" @@ -48,18 +47,19 @@ class EffectChainManager : public QObject { EffectRackPointer getEffectRack(const QString& group); - void addEffectChain(EffectChainPointer pEffectChain); - void removeEffectChain(EffectChainPointer pEffectChain); + void addEffectChain(EffectChainSlotPointer pEffectChainSlot); + void removeEffectChain(EffectChainSlotPointer pEffectChainSlot); // To support cycling through effect chains, there is a global ordering of // chains. These methods allow you to get the next or previous chain given // your current chain. // TODO(rryan): Prevent double-loading of a chain into a slot? - EffectChainPointer getNextEffectChain(EffectChainPointer pEffectChain); - EffectChainPointer getPrevEffectChain(EffectChainPointer pEffectChain); + EffectChainSlotPointer getNextEffectChain(EffectChainSlotPointer pEffectChainSlot); + EffectChainSlotPointer getPrevEffectChain(EffectChainSlotPointer pEffectChainSlot); - bool saveEffectChains(); - void loadEffectChains(); + // NOTE(Kshitij) : New functions for saving and loading + // bool saveEffectChains(); + // void loadEffectChains(); // Reloads all effect to the slots to update parameter assignments void refeshAllRacks(); @@ -80,7 +80,7 @@ class EffectChainManager : public QObject { QList m_quickEffectRacks; OutputEffectRackPointer m_pOutputEffectRack; QHash m_effectRacksByGroup; - QList m_effectChains; + QList m_effectChainSlots; QSet m_registeredInputChannels; QSet m_registeredOutputChannels; DISALLOW_COPY_AND_ASSIGN(EffectChainManager); diff --git a/src/effects/effectchainslot.cpp b/src/effects/effectchainslot.cpp index da4396fb6de5..9eb5059f9772 100644 --- a/src/effects/effectchainslot.cpp +++ b/src/effects/effectchainslot.cpp @@ -1,22 +1,40 @@ #include "effects/effectchainslot.h" -#include "effects/effectrack.h" -#include "effects/effectxmlelements.h" -#include "effects/effectslot.h" +#include "control/controlencoder.h" #include "control/controlpotmeter.h" #include "control/controlpushbutton.h" -#include "control/controlencoder.h" +#include "effects/effectprocessor.h" +#include "effects/effectrack.h" +#include "effects/effectslot.h" +#include "effects/effectsmanager.h" +#include "effects/effectxmlelements.h" +#include "engine/effects/engineeffectchain.h" +#include "engine/effects/engineeffectrack.h" +#include "engine/effects/message.h" +#include "engine/engine.h" #include "mixer/playermanager.h" +#include "util/defs.h" #include "util/math.h" +#include "util/sample.h" #include "util/xml.h" + EffectChainSlot::EffectChainSlot(EffectRack* pRack, const QString& group, - unsigned int iChainNumber) + unsigned int iChainNumber, + EffectsManager* pEffectsManager, + const QString& id) : m_iChainSlotNumber(iChainNumber), // The control group names are 1-indexed while internally everything // is 0-indexed. m_group(group), - m_pEffectRack(pRack) { + m_pEffectRack(pRack), + m_pEffectsManager(pEffectsManager), + m_id(id), + m_name(""), + m_description(""), + m_pEngineEffectChain(nullptr) { + // qDebug() << "EffectChainSlot::EffectChainSlot " << pRack << ' ' << group << ' ' << iChainNumber; + m_pControlClear = new ControlPushButton(ConfigKey(m_group, "clear")); connect(m_pControlClear, SIGNAL(valueChanged(double)), this, SLOT(slotControlClear(double))); @@ -29,6 +47,9 @@ EffectChainSlot::EffectChainSlot(EffectRack* pRack, const QString& group, m_pControlChainLoaded = new ControlObject(ConfigKey(m_group, "loaded")); m_pControlChainLoaded->setReadOnly(); + if (id != QString()) { + m_pControlChainLoaded->forceSet(1.0); + } m_pControlChainEnabled = new ControlPushButton(ConfigKey(m_group, "enabled")); m_pControlChainEnabled->setButtonMode(ControlPushButton::POWERWINDOW); @@ -36,12 +57,12 @@ EffectChainSlot::EffectChainSlot(EffectRack* pRack, const QString& group, m_pControlChainEnabled->setDefaultValue(true); m_pControlChainEnabled->set(true); connect(m_pControlChainEnabled, SIGNAL(valueChanged(double)), - this, SLOT(slotControlChainEnabled(double))); + this, SLOT(sendParameterUpdate())); m_pControlChainMix = new ControlPotmeter(ConfigKey(m_group, "mix"), 0.0, 1.0, false, true, false, true, 1.0); connect(m_pControlChainMix, SIGNAL(valueChanged(double)), - this, SLOT(slotControlChainMix(double))); + this, SLOT(sendParameterUpdate())); m_pControlChainSuperParameter = new ControlPotmeter(ConfigKey(m_group, "super1"), 0.0, 1.0); connect(m_pControlChainSuperParameter, SIGNAL(valueChanged(double)), @@ -53,7 +74,7 @@ EffectChainSlot::EffectChainSlot(EffectRack* pRack, const QString& group, m_pControlChainMixMode->setButtonMode(ControlPushButton::TOGGLE); m_pControlChainMixMode->setStates(static_cast(EffectChainMixMode::NumMixModes)); connect(m_pControlChainMixMode, SIGNAL(valueChanged(double)), - this, SLOT(slotControlChainMixMode(double))); + this, SLOT(sendParameterUpdate())); m_pControlChainNextPreset = new ControlPushButton(ConfigKey(m_group, "next_chain")); connect(m_pControlChainNextPreset, SIGNAL(valueChanged(double)), @@ -86,6 +107,8 @@ EffectChainSlot::EffectChainSlot(EffectRack* pRack, const QString& group, ConfigKey(m_group, "focused_effect"), true); m_pControlChainFocusedEffect->setButtonMode(ControlPushButton::TOGGLE); + + addToEngine(m_pEffectRack->getEngineEffectRack(), m_iChainSlotNumber); } EffectChainSlot::~EffectChainSlot() { @@ -113,190 +136,191 @@ EffectChainSlot::~EffectChainSlot() { } m_slots.clear(); - m_pEffectChain.clear(); + removeFromEngine(m_pEffectRack->getEngineEffectRack(), m_iChainSlotNumber); +} + +void EffectChainSlot::addToEngine(EngineEffectRack* pRack, int iIndex) { + m_pEngineEffectChain = new EngineEffectChain(m_id, + m_pEffectsManager->registeredInputChannels(), + m_pEffectsManager->registeredOutputChannels()); + EffectsRequest* pRequest = new EffectsRequest(); + pRequest->type = EffectsRequest::ADD_CHAIN_TO_RACK; + pRequest->pTargetRack = pRack; + pRequest->AddChainToRack.pChain = m_pEngineEffectChain; + pRequest->AddChainToRack.iIndex = iIndex; + m_pEffectsManager->writeRequest(pRequest); + + // Add all effects. + for (int i = 0; i < m_effects.size(); ++i) { + // Add the effect to the engine. + EffectPointer pEffect = m_effects[i]; + if (pEffect) { + pEffect->addToEngine(m_pEngineEffectChain, i, m_enabledInputChannels); + } + } + sendParameterUpdate(); } -QString EffectChainSlot::id() const { - if (m_pEffectChain) - return m_pEffectChain->id(); - return ""; -} +void EffectChainSlot::removeFromEngine(EngineEffectRack* pRack, int iIndex) { + // Order doesn't matter when removing. + for (int i = 0; i < m_effects.size(); ++i) { + EffectPointer pEffect = m_effects[i]; + if (pEffect) { + pEffect->removeFromEngine(m_pEngineEffectChain, i); + } + } -double EffectChainSlot::getSuperParameter() const { - return m_pControlChainSuperParameter->get(); -} + EffectsRequest* pRequest = new EffectsRequest(); + pRequest->type = EffectsRequest::REMOVE_CHAIN_FROM_RACK; + pRequest->pTargetRack = pRack; + pRequest->RemoveChainFromRack.pChain = m_pEngineEffectChain; + pRequest->RemoveChainFromRack.iIndex = iIndex; + m_pEffectsManager->writeRequest(pRequest); -void EffectChainSlot::setSuperParameter(double value, bool force) { - m_pControlChainSuperParameter->set(value); - slotControlChainSuperParameter(value, force); + m_pEngineEffectChain = nullptr; } -void EffectChainSlot::setSuperParameterDefaultValue(double value) { - m_pControlChainSuperParameter->setDefaultValue(value); +const QString& EffectChainSlot::name() const { + return m_name; } -void EffectChainSlot::slotChainNameChanged(const QString&) { +void EffectChainSlot::setName(const QString& name) { + m_name = name; emit(updated()); } -void EffectChainSlot::slotChainEnabledChanged(bool bEnabled) { - m_pControlChainEnabled->set(bEnabled); - emit(updated()); +QString EffectChainSlot::description() const { + return m_description; } -void EffectChainSlot::slotChainMixChanged(double mix) { - m_pControlChainMix->set(mix); +void EffectChainSlot::setDescription(const QString& description) { + m_description = description; emit(updated()); } -void EffectChainSlot::slotChainMixModeChanged(EffectChainMixMode mixMode) { - m_pControlChainMixMode->set(static_cast(mixMode)); - emit(updated()); +void EffectChainSlot::setMix(const double& dMix) { + m_pControlChainMix->set(dMix); + sendParameterUpdate(); } -void EffectChainSlot::slotChainChannelStatusChanged(const QString& group, - bool enabled) { - ChannelInfo* pInfo = m_channelInfoByName.value(group, NULL); - if (pInfo != NULL && pInfo->pEnabled != NULL) { - pInfo->pEnabled->set(enabled); - emit(updated()); +void EffectChainSlot::addEffect(EffectPointer pEffect) { + // qDebug() << debugString() << "addEffect" << pEffect; + if (!pEffect) { + // Insert empty effects to preserve chain order + // when loading chains with empty effects + m_effects.append(pEffect); + return; } -} -void EffectChainSlot::slotChainEffectChanged(unsigned int effectSlotNumber, - bool shouldEmit) { - //qDebug() << debugString() << "slotChainEffectChanged" << effectSlotNumber; - if (m_pEffectChain) { - const QList effects = m_pEffectChain->effects(); - EffectSlotPointer pSlot; - EffectPointer pEffect; + VERIFY_OR_DEBUG_ASSERT(!m_effects.contains(pEffect)) { + return; + } - if (effects.size() > m_slots.size()) { - qWarning() << debugString() << "has too few slots for effect"; - } + m_effects.append(pEffect); + pEffect->addToEngine(m_pEngineEffectChain, m_effects.size() - 1, m_enabledInputChannels); + slotChainEffectChanged(m_effects.size() - 1); +} - if (effectSlotNumber < (unsigned) m_slots.size()) { - pSlot = m_slots.at(effectSlotNumber); - } - if (effectSlotNumber < (unsigned) effects.size()) { - pEffect = effects.at(effectSlotNumber); - } - if (pSlot != nullptr) { - pSlot->loadEffect(pEffect, m_pEffectRack->isAdoptMetaknobValueEnabled()); +void EffectChainSlot::replaceEffect(unsigned int effectSlotNumber, + EffectPointer pEffect) { + // qDebug() << debugString() << "replaceEffect" << effectSlotNumber << pEffect; + while (effectSlotNumber >= static_cast(m_effects.size())) { + if (pEffect.isNull()) { + return; } + m_effects.append(EffectPointer()); + } - m_pControlNumEffects->forceSet(math_min( - static_cast(m_slots.size()), - m_pEffectChain->numEffects())); + EffectPointer pOldEffect = m_effects[effectSlotNumber]; + if (!pOldEffect.isNull()) { + pOldEffect->removeFromEngine(m_pEngineEffectChain, effectSlotNumber); + } - if (shouldEmit) { - emit(updated()); - } + m_effects.replace(effectSlotNumber, pEffect); + if (!pEffect.isNull()) { + pEffect->addToEngine(m_pEngineEffectChain, effectSlotNumber, m_enabledInputChannels); } + + slotChainEffectChanged(effectSlotNumber); } -void EffectChainSlot::loadEffectChainToSlot(EffectChainPointer pEffectChain) { - //qDebug() << debugString() << "loadEffectChainToSlot" << (pEffectChain ? pEffectChain->id() : "(null)"); - clear(); +void EffectChainSlot::removeEffect(unsigned int effectSlotNumber) { + replaceEffect(effectSlotNumber, EffectPointer()); +} - if (pEffectChain) { - m_pEffectChain = pEffectChain; - - connect(m_pEffectChain.data(), SIGNAL(effectChanged(unsigned int)), - this, SLOT(slotChainEffectChanged(unsigned int))); - connect(m_pEffectChain.data(), SIGNAL(nameChanged(const QString&)), - this, SLOT(slotChainNameChanged(const QString&))); - connect(m_pEffectChain.data(), SIGNAL(enabledChanged(bool)), - this, SLOT(slotChainEnabledChanged(bool))); - connect(m_pEffectChain.data(), SIGNAL(mixChanged(double)), - this, SLOT(slotChainMixChanged(double))); - connect(m_pEffectChain.data(), SIGNAL(mixModeChanged(EffectChainMixMode)), - this, SLOT(slotChainMixModeChanged(EffectChainMixMode))); - connect(m_pEffectChain.data(), SIGNAL(channelStatusChanged(const QString&, bool)), - this, SLOT(slotChainChannelStatusChanged(const QString&, bool))); - - m_pControlChainLoaded->forceSet(true); - m_pControlChainMixMode->set( - static_cast(m_pEffectChain->mixMode())); - - // Mix and enabled channels are persistent properties of the chain slot, - // not of the chain. Propagate the current settings to the chain. - m_pEffectChain->setMix(m_pControlChainMix->get()); - m_pEffectChain->setEnabled(m_pControlChainEnabled->get() > 0.0); - - // Don't emit because we will below. - for (int i = 0; i < m_slots.size(); ++i) { - slotChainEffectChanged(i, false); - } +void EffectChainSlot::refreshAllEffects() { + for (int i = 0; i < m_effects.size(); ++i) { + slotChainEffectChanged(i); } +} - emit(effectChainLoaded(pEffectChain)); - emit(updated()); +const QList& EffectChainSlot::effects() const { + return m_effects; } -void EffectChainSlot::updateRoutingSwitches() { - VERIFY_OR_DEBUG_ASSERT(m_pEffectChain) { - return; - } - for (const ChannelInfo* pChannelInfo : m_channelInfoByName) { - if (pChannelInfo->pEnabled->toBool()) { - m_pEffectChain->enableForInputChannel(pChannelInfo->handle_group); - } else { - m_pEffectChain->disableForInputChannel(pChannelInfo->handle_group); - } - } +void EffectChainSlot::sendParameterUpdate() { + EffectsRequest* pRequest = new EffectsRequest(); + pRequest->type = EffectsRequest::SET_EFFECT_CHAIN_PARAMETERS; + pRequest->pTargetChain = m_pEngineEffectChain; + pRequest->SetEffectChainParameters.enabled = m_pControlChainEnabled->get(); + pRequest->SetEffectChainParameters.mix_mode = static_cast( + static_cast(m_pControlChainMixMode->get())); + pRequest->SetEffectChainParameters.mix = m_pControlChainMix->get(); + m_pEffectsManager->writeRequest(pRequest); +} + +QString EffectChainSlot::id() const { + return m_id; } -EffectChainPointer EffectChainSlot::getEffectChain() const { - return m_pEffectChain; +double EffectChainSlot::getSuperParameter() const { + return m_pControlChainSuperParameter->get(); } -EffectChainPointer EffectChainSlot::getOrCreateEffectChain( - EffectsManager* pEffectsManager) { - if (!m_pEffectChain) { - EffectChainPointer pEffectChain( - new EffectChain(pEffectsManager, QString())); - //: Name for an empty effect chain, that is created after eject - pEffectChain->setName(tr("Empty Chain")); - loadEffectChainToSlot(pEffectChain); - pEffectChain->addToEngine(m_pEffectRack->getEngineEffectRack(), m_iChainSlotNumber); - pEffectChain->updateEngineState(); - updateRoutingSwitches(); +void EffectChainSlot::setSuperParameter(double value, bool force) { + m_pControlChainSuperParameter->set(value); + slotControlChainSuperParameter(value, force); +} + +void EffectChainSlot::setSuperParameterDefaultValue(double value) { + m_pControlChainSuperParameter->setDefaultValue(value); +} + +void EffectChainSlot::slotChainEffectChanged(unsigned int effectSlotNumber) { + qDebug() << debugString() << "slotChainEffectChanged" << effectSlotNumber; + EffectSlotPointer pSlot; + EffectPointer pEffect; + + if (m_effects.size() > m_slots.size()) { + qWarning() << debugString() << "has too few slots for effect"; + } + if (effectSlotNumber < (unsigned) m_slots.size()) { + pSlot = m_slots.at(effectSlotNumber); + } + if (effectSlotNumber < (unsigned) m_effects.size()) { + pEffect = m_effects.at(effectSlotNumber); } - return m_pEffectChain; + if (pSlot != nullptr) { + pSlot->loadEffect(pEffect, m_pEffectRack->isAdoptMetaknobValueEnabled()); + } + + m_pControlNumEffects->forceSet(math_min( + static_cast(m_slots.size()), + static_cast(m_effects.size()))); } void EffectChainSlot::clear() { - // Stop listening to signals from any loaded effect - if (m_pEffectChain) { - m_pEffectChain->removeFromEngine(m_pEffectRack->getEngineEffectRack(), - m_iChainSlotNumber); - for (EffectSlotPointer pSlot : m_slots) { - pSlot->clear(); - } - m_pEffectChain->disconnect(this); - m_pEffectChain.clear(); - } m_pControlNumEffects->forceSet(0.0); m_pControlChainLoaded->forceSet(0.0); m_pControlChainMixMode->set( static_cast(EffectChainMixMode::DrySlashWet)); - emit(updated()); -} - -unsigned int EffectChainSlot::numSlots() const { - //qDebug() << debugString() << "numSlots"; - return m_slots.size(); } EffectSlotPointer EffectChainSlot::addEffectSlot(const QString& group) { - //qDebug() << debugString() << "addEffectSlot" << group; + // qDebug() << debugString() << "addEffectSlot" << group; EffectSlot* pEffectSlot = new EffectSlot(group, m_iChainSlotNumber, m_slots.size()); - // Rebroadcast effectLoaded signals - connect(pEffectSlot, SIGNAL(effectLoaded(EffectPointer, unsigned int)), - this, SLOT(slotEffectLoaded(EffectPointer, unsigned int))); connect(pEffectSlot, SIGNAL(clearEffect(unsigned int)), this, SLOT(slotClearEffect(unsigned int))); connect(pEffectSlot, SIGNAL(nextEffect(unsigned int, unsigned int, EffectPointer)), @@ -327,23 +351,22 @@ void EffectChainSlot::registerInputChannel(const ChannelHandleAndGroup& handle_g ConfigKey(m_group, QString("group_%1_enable").arg(handle_group.name())), true, initialValue); pEnableControl->setButtonMode(ControlPushButton::POWERWINDOW); + if (pEnableControl->toBool()) { + enableForInputChannel(handle_group); + } ChannelInfo* pInfo = new ChannelInfo(handle_group, pEnableControl); m_channelInfoByName[handle_group.name()] = pInfo; + + // m_channelStatusMapper will emit a mapped(handle_group.name()) signal whenever + // the valueChanged(double) signal is emitted by pEnableControl m_channelStatusMapper.setMapping(pEnableControl, handle_group.name()); connect(pEnableControl, SIGNAL(valueChanged(double)), &m_channelStatusMapper, SLOT(map())); } -void EffectChainSlot::slotEffectLoaded(EffectPointer pEffect, unsigned int slotNumber) { - // const int is a safe read... don't bother locking - emit(effectLoaded(pEffect, m_iChainSlotNumber, slotNumber)); -} - void EffectChainSlot::slotClearEffect(unsigned int iEffectSlotNumber) { - if (m_pEffectChain) { - m_pEffectChain->removeEffect(iEffectSlotNumber); - } + removeEffect(iEffectSlotNumber); } EffectSlotPointer EffectChainSlot::getEffectSlot(unsigned int slotNumber) { @@ -357,65 +380,33 @@ EffectSlotPointer EffectChainSlot::getEffectSlot(unsigned int slotNumber) { void EffectChainSlot::slotControlClear(double v) { if (v > 0) { + for (EffectSlotPointer pSlot : m_slots) { + pSlot->clear(); + } clear(); } } -void EffectChainSlot::slotControlChainEnabled(double v) { - //qDebug() << debugString() << "slotControlChainEnabled" << v; - if (m_pEffectChain) { - m_pEffectChain->setEnabled(v > 0); - } -} - -void EffectChainSlot::slotControlChainMix(double v) { - //qDebug() << debugString() << "slotControlChainMix" << v; - - // Clamp to [0.0, 1.0] - if (v < 0.0 || v > 1.0) { - qWarning() << debugString() << "value out of limits"; - v = math_clamp(v, 0.0, 1.0); - m_pControlChainMix->set(v); - } - if (m_pEffectChain) { - m_pEffectChain->setMix(v); - } -} - void EffectChainSlot::slotControlChainSuperParameter(double v, bool force) { - //qDebug() << debugString() << "slotControlChainSuperParameter" << v; + // qDebug() << debugString() << "slotControlChainSuperParameter" << v; - // Clamp to [0.0, 1.0] - if (v < 0.0 || v > 1.0) { - qWarning() << debugString() << "value out of limits"; - v = math_clamp(v, 0.0, 1.0); - m_pControlChainSuperParameter->set(v); - } + m_pControlChainSuperParameter->set(v); for (const auto& pSlot : m_slots) { pSlot->setMetaParameter(v, force); } } -void EffectChainSlot::slotControlChainMixMode(double v) { - // Intermediate cast to integer is needed for VC++. - EffectChainMixMode type = static_cast(int(v)); - (void)v; // this avoids a false warning with g++ 4.8.1 - if (m_pEffectChain && type < EffectChainMixMode::NumMixModes) { - m_pEffectChain->setMixMode(type); - } -} - void EffectChainSlot::slotControlChainSelector(double v) { - //qDebug() << debugString() << "slotControlChainSelector" << v; - if (v > 0) { - emit(nextChain(m_iChainSlotNumber, m_pEffectChain)); - } else if (v < 0) { - emit(prevChain(m_iChainSlotNumber, m_pEffectChain)); - } +// qDebug() << debugString() << "slotControlChainSelector" << v; +// if (v > 0) { +// emit(nextChain(m_iChainSlotNumber, m_pEffectChain)); +// } else if (v < 0) { +// emit(prevChain(m_iChainSlotNumber, m_pEffectChain)); +// } } void EffectChainSlot::slotControlChainNextPreset(double v) { - //qDebug() << debugString() << "slotControlChainNextPreset" << v; + // qDebug() << debugString() << "slotControlChainNextPreset" << v; if (v > 0) { slotControlChainSelector(1); } @@ -429,17 +420,75 @@ void EffectChainSlot::slotControlChainPrevPreset(double v) { } void EffectChainSlot::slotChannelStatusChanged(const QString& group) { - if (m_pEffectChain) { - ChannelInfo* pChannelInfo = m_channelInfoByName.value(group, NULL); - if (pChannelInfo != NULL && pChannelInfo->pEnabled != NULL) { - bool bEnable = pChannelInfo->pEnabled->toBool(); - if (bEnable) { - m_pEffectChain->enableForInputChannel(pChannelInfo->handle_group); - } else { - m_pEffectChain->disableForInputChannel(pChannelInfo->handle_group); + ChannelInfo* pChannelInfo = m_channelInfoByName.value(group, NULL); + if (pChannelInfo != NULL && pChannelInfo->pEnabled != NULL) { + bool bEnable = pChannelInfo->pEnabled->toBool(); + if (bEnable) { + enableForInputChannel(pChannelInfo->handle_group); + } else { + disableForInputChannel(pChannelInfo->handle_group); + } + } +} + +void EffectChainSlot::enableForInputChannel(const ChannelHandleAndGroup& handle_group) { + if (m_enabledInputChannels.contains(handle_group)) { + return; + } + + EffectsRequest* request = new EffectsRequest(); + request->type = EffectsRequest::ENABLE_EFFECT_CHAIN_FOR_INPUT_CHANNEL; + request->pTargetChain = m_pEngineEffectChain; + request->EnableInputChannelForChain.pChannelHandle = &handle_group.handle(); + + // Allocate EffectStates here in the main thread to avoid allocating + // memory in the realtime audio callback thread. Pointers to the + // EffectStates are passed to the EffectRequest and the EffectProcessorImpls + // store the pointers. The containers of EffectState* pointers get deleted + // by ~EffectsRequest, but the EffectStates are managed by EffectProcessorImpl. + auto pEffectStatesMapArray = new EffectStatesMapArray; + + //TODO: get actual configuration of engine + const mixxx::EngineParameters bufferParameters( + mixxx::AudioSignal::SampleRate(96000), + MAX_BUFFER_LEN / mixxx::kEngineChannelCount); + + for (int i = 0; i < m_effects.size(); ++i) { + auto& statesMap = (*pEffectStatesMapArray)[i]; + if (m_effects[i] != nullptr) { + for (const auto& outputChannel : m_pEffectsManager->registeredOutputChannels()) { + if (kEffectDebugOutput) { + qDebug() << debugString() << "EffectChain::enableForInputChannel creating EffectState for input" << handle_group << "output" << outputChannel; + } + statesMap.insert(outputChannel.handle(), + m_effects[i]->createState(bufferParameters)); } + } else { + for (EffectState* pState : statesMap) { + if (pState != nullptr) { + delete pState; + } + } + statesMap.clear(); } } + request->EnableInputChannelForChain.pEffectStatesMapArray = pEffectStatesMapArray; + + m_pEffectsManager->writeRequest(request); + + m_enabledInputChannels.insert(handle_group); +} + +void EffectChainSlot::disableForInputChannel(const ChannelHandleAndGroup& handle_group) { + if (!m_enabledInputChannels.remove(handle_group)) { + return; + } + + EffectsRequest* request = new EffectsRequest(); + request->type = EffectsRequest::DISABLE_EFFECT_CHAIN_FOR_INPUT_CHANNEL; + request->pTargetChain = m_pEngineEffectChain; + request->DisableInputChannelForChain.pChannelHandle = &handle_group.handle(); + m_pEffectsManager->writeRequest(request); } unsigned int EffectChainSlot::getChainSlotNumber() const { @@ -448,62 +497,58 @@ unsigned int EffectChainSlot::getChainSlotNumber() const { QDomElement EffectChainSlot::toXml(QDomDocument* doc) const { QDomElement chainElement = doc->createElement(EffectXml::Chain); - if (m_pEffectChain == nullptr) { - // ejected chains are stored empty - return chainElement; - } - XmlParse::addElement(*doc, chainElement, EffectXml::ChainId, - m_pEffectChain->id()); - XmlParse::addElement(*doc, chainElement, EffectXml::ChainName, - m_pEffectChain->name()); - XmlParse::addElement(*doc, chainElement, EffectXml::ChainDescription, - m_pEffectChain->description()); - XmlParse::addElement(*doc, chainElement, EffectXml::ChainMixMode, - EffectChain::mixModeToString( - static_cast( - static_cast(m_pControlChainMixMode->get())))); - XmlParse::addElement(*doc, chainElement, EffectXml::ChainSuperParameter, - QString::number(m_pControlChainSuperParameter->get())); - - QDomElement effectsElement = doc->createElement(EffectXml::EffectsRoot); - for (const auto& pEffectSlot : m_slots) { - QDomElement effectNode; - if (pEffectSlot->getEffect()) { - effectNode = pEffectSlot->toXml(doc); - } else { - // Create empty element to ensure effects stay in order - // if there are empty slots before loaded slots. - effectNode = doc->createElement(EffectXml::Effect); - } - effectsElement.appendChild(effectNode); - } - chainElement.appendChild(effectsElement); + // XmlParse::addElement(*doc, chainElement, EffectXml::ChainId, + // m_pEffectChain->id()); + // XmlParse::addElement(*doc, chainElement, EffectXml::ChainName, + // m_pEffectChain->name()); + // XmlParse::addElement(*doc, chainElement, EffectXml::ChainDescription, + // m_pEffectChain->description()); + // XmlParse::addElement(*doc, chainElement, EffectXml::ChainMixMode, + // EffectChain::mixModeToString( + // static_cast( + // static_cast(m_pControlChainMixMode->get())))); + // XmlParse::addElement(*doc, chainElement, EffectXml::ChainSuperParameter, + // QString::number(m_pControlChainSuperParameter->get())); + + // QDomElement effectsElement = doc->createElement(EffectXml::EffectsRoot); + // for (const auto& pEffectSlot : m_slots) { + // QDomElement effectNode; + // if (pEffectSlot->getEffect()) { + // effectNode = pEffectSlot->toXml(doc); + // } else { + // // Create empty element to ensure effects stay in order + // // if there are empty slots before loaded slots. + // effectNode = doc->createElement(EffectXml::Effect); + // } + // effectsElement.appendChild(effectNode); + // } + // chainElement.appendChild(effectsElement); return chainElement; } void EffectChainSlot::loadChainSlotFromXml(const QDomElement& effectChainElement) { - if (!effectChainElement.hasChildNodes()) { - return; - } - - // FIXME: mix mode is set in EffectChain::createFromXml - - m_pControlChainSuperParameter->set(XmlParse::selectNodeDouble( - effectChainElement, - EffectXml::ChainSuperParameter)); - - QDomElement effectsElement = XmlParse::selectElement(effectChainElement, - EffectXml::EffectsRoot); - QDomNodeList effectsNodeList = effectsElement.childNodes(); - for (int i = 0; i < m_slots.size(); ++i) { - if (m_slots[i] != nullptr) { - QDomNode effectNode = effectsNodeList.at(i); - if (effectNode.isElement()) { - QDomElement effectElement = effectNode.toElement(); - m_slots[i]->loadEffectSlotFromXml(effectElement); - } - } - } + // if (!effectChainElement.hasChildNodes()) { + // return; + // } + + // // FIXME: mix mode is set in EffectChain::createFromXml + + // m_pControlChainSuperParameter->set(XmlParse::selectNodeDouble( + // effectChainElement, + // EffectXml::ChainSuperParameter)); + + // QDomElement effectsElement = XmlParse::selectElement(effectChainElement, + // EffectXml::EffectsRoot); + // QDomNodeList effectsNodeList = effectsElement.childNodes(); + // for (int i = 0; i < m_slots.size(); ++i) { + // if (m_slots[i] != nullptr) { + // QDomNode effectNode = effectsNodeList.at(i); + // if (effectNode.isElement()) { + // QDomElement effectElement = effectNode.toElement(); + // m_slots[i]->loadEffectSlotFromXml(effectElement); + // } + // } + // } } diff --git a/src/effects/effectchainslot.h b/src/effects/effectchainslot.h index cc869830fc01..81f4a7ab0409 100644 --- a/src/effects/effectchainslot.h +++ b/src/effects/effectchainslot.h @@ -5,10 +5,13 @@ #include #include #include +#include +#include "effects/defs.h" +#include "effects/effect.h" #include "engine/channelhandle.h" #include "util/class.h" -#include "effects/effectchain.h" + class ControlObject; class ControlPushButton; @@ -20,21 +23,17 @@ class EffectChainSlot : public QObject { public: EffectChainSlot(EffectRack* pRack, const QString& group, - const unsigned int iChainNumber); + const unsigned int iChainNumber, + EffectsManager* pEffectsManager, + const QString& id = QString()); virtual ~EffectChainSlot(); // Get the ID of the loaded EffectChain QString id() const; - unsigned int numSlots() const; EffectSlotPointer addEffectSlot(const QString& group); EffectSlotPointer getEffectSlot(unsigned int slotNumber); - void loadEffectChainToSlot(EffectChainPointer pEffectChain); - void updateRoutingSwitches(); - EffectChainPointer getEffectChain() const; - EffectChainPointer getOrCreateEffectChain(EffectsManager* pEffectsManager); - void registerInputChannel(const ChannelHandleAndGroup& handle_group); double getSuperParameter() const; @@ -53,30 +52,68 @@ class EffectChainSlot : public QObject { QDomElement toXml(QDomDocument* doc) const; void loadChainSlotFromXml(const QDomElement& effectChainElement); - signals: - // Indicates that the effect pEffect has been loaded into slotNumber of - // EffectChainSlot chainNumber. pEffect may be an invalid pointer, which - // indicates that a previously loaded effect was removed from the slot. - void effectLoaded(EffectPointer pEffect, unsigned int chainNumber, - unsigned int slotNumber); + // Activates EffectChain processing for the provided channel. + // TODO(Kshitij) : Make this function private once EffectRack layer is removed + void enableForInputChannel(const ChannelHandleAndGroup& handle_group); + void disableForInputChannel(const ChannelHandleAndGroup& handle_group); + + // Get the human-readable name of the EffectChain + const QString& name() const; + void setName(const QString& name); + + // Get the human-readable description of the EffectChain + QString description() const; + void setDescription(const QString& description); + + // TODO(Kshitij) : Remove this setter function once the EffectRack layer is removed + void setMix(const double& dMix); + + static QString mixModeToString(EffectChainMixMode type) { + switch (type) { + case EffectChainMixMode::DrySlashWet: + return "DRY/WET"; + case EffectChainMixMode::DryPlusWet: + return "DRY+WET"; + default: + return "UNKNOWN"; + } + } + static EffectChainMixMode mixModeFromString(const QString& typeStr) { + if (typeStr == "DRY/WET") { + return EffectChainMixMode::DrySlashWet; + } else if (typeStr == "DRY+WET") { + return EffectChainMixMode::DryPlusWet; + } else { + return EffectChainMixMode::NumMixModes; + } + } + + void addEffect(EffectPointer pEffect); + void replaceEffect(unsigned int effectSlotNumber, EffectPointer pEffect); + void removeEffect(unsigned int effectSlotNumber); + void refreshAllEffects(); + + const QList& effects() const; + + signals: // Indicates that the given EffectChain was loaded into this // EffectChainSlot - void effectChainLoaded(EffectChainPointer pEffectChain); + void effectChainLoaded(EffectChainSlotPointer pEffectChain); // Signal that whoever is in charge of this EffectChainSlot should load the // next EffectChain into it. void nextChain(unsigned int iChainSlotNumber, - EffectChainPointer pEffectChain); + EffectChainSlotPointer pEffectChain); // Signal that whoever is in charge of this EffectChainSlot should load the // previous EffectChain into it. void prevChain(unsigned int iChainSlotNumber, - EffectChainPointer pEffectChain); + EffectChainSlotPointer pEffectChain); // Signal that whoever is in charge of this EffectChainSlot should clear // this EffectChain (by removing the chain from this EffectChainSlot). - void clearChain(unsigned int iChainNumber, EffectChainPointer pEffectChain); + void clearChain(unsigned int iChainNumber, EffectChainSlotPointer pEffectChain); // Signal that whoever is in charge of this EffectChainSlot should load the // next Effect into the specified EffectSlot. @@ -95,22 +132,13 @@ class EffectChainSlot : public QObject { private slots: - void slotChainEffectChanged(unsigned int effectSlotNumber, bool shouldEmit=true); - void slotChainNameChanged(const QString& name); - void slotChainEnabledChanged(bool enabled); - void slotChainMixChanged(double mix); - void slotChainMixModeChanged(EffectChainMixMode mixMode); - void slotChainChannelStatusChanged(const QString& group, bool enabled); - - void slotEffectLoaded(EffectPointer pEffect, unsigned int slotNumber); + void sendParameterUpdate(); + void slotChainEffectChanged(unsigned int effectSlotNumber); // Clears the effect in the given position in the loaded EffectChain. void slotClearEffect(unsigned int iEffectSlotNumber); void slotControlClear(double v); - void slotControlChainEnabled(double v); - void slotControlChainMix(double v); void slotControlChainSuperParameter(double v, bool force = false); - void slotControlChainMixMode(double v); void slotControlChainSelector(double v); void slotControlChainNextPreset(double v); void slotControlChainPrevPreset(double v); @@ -121,12 +149,13 @@ class EffectChainSlot : public QObject { return QString("EffectChainSlot(%1)").arg(m_group); } + void addToEngine(EngineEffectRack* pRack, int iIndex); + void removeFromEngine(EngineEffectRack* pRack, int iIndex); + const unsigned int m_iChainSlotNumber; const QString m_group; EffectRack* m_pEffectRack; - EffectChainPointer m_pEffectChain; - ControlPushButton* m_pControlClear; ControlObject* m_pControlNumEffects; ControlObject* m_pControlNumEffectSlots; @@ -164,10 +193,17 @@ class EffectChainSlot : public QObject { ChannelHandleAndGroup handle_group; ControlObject* pEnabled; }; - QMap m_channelInfoByName; + QMap m_channelInfoByName; QList m_slots; QSignalMapper m_channelStatusMapper; + EffectsManager* m_pEffectsManager; + QString m_id; + QString m_name; + QString m_description; + QSet m_enabledInputChannels; + QList m_effects; + EngineEffectChain* m_pEngineEffectChain; DISALLOW_COPY_AND_ASSIGN(EffectChainSlot); }; diff --git a/src/effects/effectrack.cpp b/src/effects/effectrack.cpp index 95dda5e90d88..5274b9c211bd 100644 --- a/src/effects/effectrack.cpp +++ b/src/effects/effectrack.cpp @@ -26,6 +26,7 @@ EffectRack::EffectRack(EffectsManager* pEffectsManager, } EffectRack::~EffectRack() { + m_effectChainSlots.clear(); removeFromEngine(); //qDebug() << "EffectRack::~EffectRack()"; } @@ -42,29 +43,12 @@ void EffectRack::addToEngine() { pRequest->AddEffectRack.signalProcessingStage = m_signalProcessingStage; m_pEffectsManager->writeRequest(pRequest); - // Add all effect chains. for (int i = 0; i < m_effectChainSlots.size(); ++i) { EffectChainSlotPointer pSlot = m_effectChainSlots[i]; - EffectChainPointer pChain = pSlot->getEffectChain(); - if (pChain) { - // Add the effect to the engine. - pChain->addToEngine(m_pEngineEffectRack, i); - // Update its parameters in the engine. - pChain->updateEngineState(); - } } } void EffectRack::removeFromEngine() { - // Order doesn't matter when removing. - for (int i = 0; i < m_effectChainSlots.size(); ++i) { - EffectChainSlotPointer pSlot = m_effectChainSlots[i]; - EffectChainPointer pChain = pSlot->getEffectChain(); - if (pChain) { - pChain->removeFromEngine(m_pEngineEffectRack, i); - } - } - EffectsRequest* pRequest = new EffectsRequest(); pRequest->type = EffectsRequest::REMOVE_EFFECT_RACK; pRequest->RemoveEffectRack.signalProcessingStage = m_signalProcessingStage; @@ -95,6 +79,8 @@ void EffectRack::addEffectChainSlotInternal(EffectChainSlotPointer pChainSlot) { m_effectChainSlots.append(pChainSlot); m_controlNumEffectChainSlots.forceSet( m_controlNumEffectChainSlots.get() + 1); + + // qDebug() << "Total effect chain slots = " << m_controlNumEffectChainSlots.get(); } EffectChainSlotPointer EffectRack::getEffectChainSlot(int i) { @@ -105,37 +91,6 @@ EffectChainSlotPointer EffectRack::getEffectChainSlot(int i) { return m_effectChainSlots[i]; } -void EffectRack::loadNextChain(const unsigned int iChainSlotNumber, - EffectChainPointer pLoadedChain) { - if (pLoadedChain) { - pLoadedChain = pLoadedChain->prototype(); - } - - EffectChainPointer pNextChain = m_pEffectChainManager->getNextEffectChain( - pLoadedChain); - - pNextChain = EffectChain::clone(pNextChain); - pNextChain->addToEngine(m_pEngineEffectRack, iChainSlotNumber); - m_effectChainSlots[iChainSlotNumber]->loadEffectChainToSlot(pNextChain); - m_effectChainSlots[iChainSlotNumber]->updateRoutingSwitches(); -} - - -void EffectRack::loadPrevChain(const unsigned int iChainSlotNumber, - EffectChainPointer pLoadedChain) { - if (pLoadedChain) { - pLoadedChain = pLoadedChain->prototype(); - } - - EffectChainPointer pPrevChain = m_pEffectChainManager->getPrevEffectChain( - pLoadedChain); - - pPrevChain = EffectChain::clone(pPrevChain); - pPrevChain->addToEngine(m_pEngineEffectRack, iChainSlotNumber); - m_effectChainSlots[iChainSlotNumber]->loadEffectChainToSlot(pPrevChain); - m_effectChainSlots[iChainSlotNumber]->updateRoutingSwitches(); -} - void EffectRack::maybeLoadEffect(const unsigned int iChainSlotNumber, const unsigned int iEffectSlotNumber, const QString& id) { @@ -157,9 +112,8 @@ void EffectRack::maybeLoadEffect(const unsigned int iChainSlotNumber, } if (loadNew) { - EffectChainPointer pChain = pChainSlot->getOrCreateEffectChain(m_pEffectsManager); EffectPointer pEffect = m_pEffectsManager->instantiateEffect(id); - pChain->replaceEffect(iEffectSlotNumber, pEffect); + pChainSlot->replaceEffect(iEffectSlotNumber, pEffect); } } @@ -175,8 +129,7 @@ void EffectRack::loadNextEffect(const unsigned int iChainSlotNumber, EffectPointer pNextEffect = m_pEffectsManager->instantiateEffect(nextEffectId); EffectChainSlotPointer pChainSlot = m_effectChainSlots[iChainSlotNumber]; - EffectChainPointer pChain = pChainSlot->getOrCreateEffectChain(m_pEffectsManager); - pChain->replaceEffect(iEffectSlotNumber, pNextEffect); + pChainSlot->replaceEffect(iEffectSlotNumber, pNextEffect); } @@ -192,30 +145,28 @@ void EffectRack::loadPrevEffect(const unsigned int iChainSlotNumber, EffectPointer pPrevEffect = m_pEffectsManager->instantiateEffect(prevEffectId); EffectChainSlotPointer pChainSlot = m_effectChainSlots[iChainSlotNumber]; - EffectChainPointer pChain = pChainSlot->getOrCreateEffectChain(m_pEffectsManager); - pChain->replaceEffect(iEffectSlotNumber, pPrevEffect); + pChainSlot->replaceEffect(iEffectSlotNumber, pPrevEffect); } QDomElement EffectRack::toXml(QDomDocument* doc) const { QDomElement rackElement = doc->createElement("Rack"); - QDomElement groupElement = doc->createElement("Group"); - QDomText groupText = doc->createTextNode(m_group); - groupElement.appendChild(groupText); - rackElement.appendChild(groupElement); - - QDomElement chainsElement = doc->createElement("Chains"); - for (EffectChainSlotPointer pChainSlot : m_effectChainSlots) { - QDomElement chain = pChainSlot->toXml(doc); - chainsElement.appendChild(chain); - } - rackElement.appendChild(chainsElement); + // QDomElement groupElement = doc->createElement("Group"); + // QDomText groupText = doc->createTextNode(m_group); + // groupElement.appendChild(groupText); + // rackElement.appendChild(groupElement); + + // QDomElement chainsElement = doc->createElement("Chains"); + // for (EffectChainSlotPointer pChainSlot : m_effectChainSlots) { + // QDomElement chain = pChainSlot->toXml(doc); + // chainsElement.appendChild(chain); + // } + // rackElement.appendChild(chainsElement); return rackElement; } void EffectRack::refresh() { for (const auto& pChainSlot: m_effectChainSlots) { - EffectChainPointer pChain = pChainSlot->getOrCreateEffectChain(m_pEffectsManager); - pChain->refreshAllEffects(); + pChainSlot->refreshAllEffects(); } } @@ -238,8 +189,10 @@ EffectChainSlotPointer StandardEffectRack::addEffectChainSlot() { QString group = formatEffectChainSlotGroupString(getRackNumber(), iChainSlotNumber); + + EffectChainSlot* pChainSlot = - new EffectChainSlot(this, group, iChainSlotNumber); + new EffectChainSlot(this, group, iChainSlotNumber, m_pEffectsManager); for (int i = 0; i < kNumEffectsPerUnit; ++i) { pChainSlot->addEffectSlot( @@ -247,11 +200,6 @@ EffectChainSlotPointer StandardEffectRack::addEffectChainSlot() { getRackNumber(), iChainSlotNumber, i)); } - connect(pChainSlot, SIGNAL(nextChain(unsigned int, EffectChainPointer)), - this, SLOT(loadNextChain(unsigned int, EffectChainPointer))); - connect(pChainSlot, SIGNAL(prevChain(unsigned int, EffectChainPointer)), - this, SLOT(loadPrevChain(unsigned int, EffectChainPointer))); - connect(pChainSlot, SIGNAL(nextEffect(unsigned int, unsigned int, EffectPointer)), this, SLOT(loadNextEffect(unsigned int, unsigned int, EffectPointer))); connect(pChainSlot, SIGNAL(prevEffect(unsigned int, unsigned int, EffectPointer)), @@ -277,18 +225,9 @@ OutputEffectRack::OutputEffectRack(EffectsManager* pEffectsManager, const QString unitGroup = "[OutputEffectRack_[Master]]"; // Hard code only one EffectChainSlot - EffectChainSlot* pChainSlot = new EffectChainSlot(this, unitGroup, 0); - EffectChainPointer pChain(new EffectChain(m_pEffectsManager, unitGroup)); - pChainSlot->loadEffectChainToSlot(pChain); - pChain->addToEngine(getEngineEffectRack(), 0); - // Add a single EffectSlot for the master EQ effect + EffectChainSlot* pChainSlot = new EffectChainSlot(this, unitGroup, 0, m_pEffectsManager, unitGroup); pChainSlot->addEffectSlot("[OutputEffectRack_[Master]_Effect1]"); - connect(pChainSlot, SIGNAL(nextChain(unsigned int, EffectChainPointer)), - this, SLOT(loadNextChain(unsigned int, EffectChainPointer))); - connect(pChainSlot, SIGNAL(prevChain(unsigned int, EffectChainPointer)), - this, SLOT(loadPrevChain(unsigned int, EffectChainPointer))); - connect(pChainSlot, SIGNAL(nextEffect(unsigned int, unsigned int, EffectPointer)), this, SLOT(loadNextEffect(unsigned int, unsigned int, EffectPointer))); connect(pChainSlot, SIGNAL(prevEffect(unsigned int, unsigned int, EffectPointer)), @@ -309,8 +248,11 @@ OutputEffectRack::OutputEffectRack(EffectsManager* pEffectsManager, DEBUG_ASSERT(masterHandleAndGroup != nullptr); pChainSlot->registerInputChannel(*masterHandleAndGroup); - pChain->enableForInputChannel(*masterHandleAndGroup); - pChain->setMix(1.0); + + // TODO(Kshitij) : Make the following function private after EffectRack + // layer is removed. + pChainSlot->enableForInputChannel(*masterHandleAndGroup); + pChainSlot->setMix(1.0); EffectChainSlotPointer pChainSlotPointer = EffectChainSlotPointer(pChainSlot); addEffectChainSlotInternal(pChainSlotPointer); @@ -332,20 +274,19 @@ void PerGroupRack::setupForGroup(const QString& groupName) { int iChainSlotNumber = m_groupToChainSlot.size(); QString chainSlotGroup = formatEffectChainSlotGroupForGroup( getRackNumber(), iChainSlotNumber, groupName); + // qDebug() << "Chain slot group = " << chainSlotGroup; EffectChainSlot* pChainSlot = new EffectChainSlot(this, chainSlotGroup, - iChainSlotNumber); + iChainSlotNumber, + m_pEffectsManager, + chainSlotGroup); EffectChainSlotPointer pChainSlotPointer(pChainSlot); addEffectChainSlotInternal(pChainSlotPointer); m_groupToChainSlot[groupName] = pChainSlotPointer; // TODO(rryan): Set up next/prev signals. - EffectChainPointer pChain(new EffectChain(m_pEffectsManager, chainSlotGroup)); - pChainSlot->loadEffectChainToSlot(pChain); - pChain->addToEngine(getEngineEffectRack(), iChainSlotNumber); // Set the chain to be fully wet. - pChain->setMix(1.0); - pChain->updateEngineState(); + pChainSlot->setMix(1.0); // TODO(rryan): remove. const ChannelHandleAndGroup* handleAndGroup = nullptr; @@ -360,7 +301,6 @@ void PerGroupRack::setupForGroup(const QString& groupName) { // Register this channel alone with the chain slot. pChainSlot->registerInputChannel(*handleAndGroup); - pChainSlot->updateRoutingSwitches(); // Add a single effect slot pChainSlot->addEffectSlot(formatEffectSlotGroupString(0, groupName)); @@ -375,10 +315,7 @@ bool PerGroupRack::loadEffectToGroup(const QString& groupName, EffectPointer pEf return false; } - EffectChainPointer pChain = pChainSlot->getOrCreateEffectChain(m_pEffectsManager); - pChain->replaceEffect(0, pEffect); - pChainSlot->updateRoutingSwitches(); - + pChainSlot->replaceEffect(0, pEffect); if (pEffect != nullptr) { pEffect->setEnabled(true); } diff --git a/src/effects/effectrack.h b/src/effects/effectrack.h index 1f97f9f1d8ac..7285334d1216 100644 --- a/src/effects/effectrack.h +++ b/src/effects/effectrack.h @@ -56,11 +56,6 @@ class EffectRack : public QObject { void slotClearRack(double v); private slots: - void loadNextChain(const unsigned int iChainSlotNumber, - EffectChainPointer pLoadedChain); - void loadPrevChain(const unsigned int iChainSlotNumber, - EffectChainPointer pLoadedChain); - void loadNextEffect(const unsigned int iChainSlotNumber, const unsigned int iEffectSlotNumber, EffectPointer pEffect); diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index 9f2f2af3f4d8..5100cfdf010b 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -40,11 +40,17 @@ EffectsManager::EffectsManager(QObject* pParent, UserSettingsPointer pConfig, m_pNumEffectsAvailable = new ControlObject(ConfigKey("[Master]", "num_effectsavailable")); m_pNumEffectsAvailable->setReadOnly(); + + // These controls are used inside EQ Effects + m_pLoEqFreq = new ControlPotmeter(ConfigKey("[Mixer Profile]", "LoEQFrequency"), 0., 22040); + m_pHiEqFreq = new ControlPotmeter(ConfigKey("[Mixer Profile]", "HiEQFrequency"), 0., 22040); } EffectsManager::~EffectsManager() { m_underDestruction = true; - m_pEffectChainManager->saveEffectChains(); + + // NOTE(Kshitij) : Use new functions for saving XML files + // m_pEffectChainManager->saveEffectChains(); delete m_pEffectChainManager; // This must be done here, since the engineRacks are deleted via // the queue @@ -333,79 +339,27 @@ bool EffectsManager::getEffectVisibility(EffectManifestPointer pManifest) { return m_visibleEffectManifests.contains(pManifest); } -void EffectsManager::setup() { - // These controls are used inside EQ Effects - m_pLoEqFreq = new ControlPotmeter(ConfigKey("[Mixer Profile]", "LoEQFrequency"), 0., 22040); - m_pHiEqFreq = new ControlPotmeter(ConfigKey("[Mixer Profile]", "HiEQFrequency"), 0., 22040); - +// TODO: remove this when removing EffectRack layer. The EQs and QuickEffects +// should be EffectChainSlot subclasses that get initialized by PlayerManager +// with each deck +void EffectsManager::setupPerGroupRacks() { // NOTE(Be): Effect racks are processed in the order they are added here. - - // Add prefader effect racks addEqualizerRack(); addQuickEffectRack(); +} +void EffectsManager::setup() { // Add postfader effect racks addStandardEffectRack(); addOutputsEffectRack(); - - EffectChainPointer pChain(new EffectChain( - this, "org.mixxx.effectchain.flanger")); - pChain->setName(tr("Flanger")); - EffectPointer pEffect = instantiateEffect( - "org.mixxx.effects.flanger"); - pChain->addEffect(pEffect); - m_pEffectChainManager->addEffectChain(pChain); - - pChain = EffectChainPointer(new EffectChain( - this, "org.mixxx.effectchain.bitcrusher")); - pChain->setName(tr("BitCrusher")); - 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")); - pEffect = instantiateEffect("org.mixxx.effects.filter"); - pChain->addEffect(pEffect); - m_pEffectChainManager->addEffectChain(pChain); - -#ifndef __MACAPPSTORE__ - pChain = EffectChainPointer(new EffectChain( - this, "org.mixxx.effectchain.reverb")); - pChain->setName(tr("Reverb")); - pEffect = instantiateEffect("org.mixxx.effects.reverb"); - pChain->addEffect(pEffect); - m_pEffectChainManager->addEffectChain(pChain); -#endif - - pChain = EffectChainPointer(new EffectChain( - this, "org.mixxx.effectchain.echo")); - pChain->setName(tr("Echo")); - pEffect = instantiateEffect("org.mixxx.effects.echo"); - pChain->addEffect(pEffect); - m_pEffectChainManager->addEffectChain(pChain); - - pChain = EffectChainPointer(new EffectChain( - this, "org.mixxx.effectchain.autopan")); - pChain->setName(tr("AutoPan")); - pEffect = instantiateEffect("org.mixxx.effects.autopan"); - pChain->addEffect(pEffect); - m_pEffectChainManager->addEffectChain(pChain); - - pChain = EffectChainPointer(new EffectChain( - this, "org.mixxx.effectchain.tremolo")); - pChain->setName(tr("Tremolo")); - pEffect = instantiateEffect("org.mixxx.effects.tremolo"); - pChain->addEffect(pEffect); - m_pEffectChainManager->addEffectChain(pChain); -} - -void EffectsManager::loadEffectChains() { - // populate rack and restore state from effects.xml - m_pEffectChainManager->loadEffectChains(); } +// NOTE(Kshitij) : Use new functions for effect loading using Effect Preset +// void EffectsManager::loadEffectChains() { +// // populate rack and restore state from effects.xml +// m_pEffectChainManager->loadEffectChains(); +// } + void EffectsManager::refeshAllRacks() { m_pEffectChainManager->refeshAllRacks(); } diff --git a/src/effects/effectsmanager.h b/src/effects/effectsmanager.h index 24f4cd9024c0..55fad3515a79 100644 --- a/src/effects/effectsmanager.h +++ b/src/effects/effectsmanager.h @@ -63,7 +63,8 @@ class EffectsManager : public QObject { OutputEffectRackPointer addOutputsEffectRack(); OutputEffectRackPointer getOutputsEffectRack(); - void loadEffectChains(); + // NOTE(Kshitij) : Use new functions + // void loadEffectChains(); EffectRackPointer getEffectRack(const QString& group); EffectSlotPointer getEffectSlot(const QString& group); @@ -94,7 +95,7 @@ class EffectsManager : public QObject { void setEffectVisibility(EffectManifestPointer pManifest, bool visibility); bool getEffectVisibility(EffectManifestPointer pManifest); - // Temporary, but for setting up all the default EffectChains and EffectRacks + void setupPerGroupRacks(); void setup(); // Reloads all effect to the slots to update parameter assignments @@ -140,6 +141,20 @@ class EffectsManager : public QObject { bool m_underDestruction; + // START EFFECTCHAINMANAGER + // UserSettingsPointer m_pConfig; + // EffectsManager* m_pEffectsManager; + // QList m_standardEffectRacks; + // QList m_equalizerEffectRacks; + // QList m_quickEffectRacks; + // OutputEffectRackPointer m_pOutputEffectRack; + // QHash m_effectRacksByGroup; + // QList m_effectChains; + // QSet m_registeredInputChannels; + // QSet m_registeredOutputChannels; + // END EFFECTCHAINMANAGER + + DISALLOW_COPY_AND_ASSIGN(EffectsManager); }; diff --git a/src/engine/effects/engineeffectchain.cpp b/src/engine/effects/engineeffectchain.cpp index dd855f1618b7..f88ae52d360d 100644 --- a/src/engine/effects/engineeffectchain.cpp +++ b/src/engine/effects/engineeffectchain.cpp @@ -113,7 +113,8 @@ bool EngineEffectChain::processEffectsRequest(EffectsRequest& message, if (kEffectDebugOutput) { qDebug() << debugString() << this << "SET_EFFECT_CHAIN_PARAMETERS" << "enabled" << message.SetEffectChainParameters.enabled - << "mix" << message.SetEffectChainParameters.mix; + << "mix" << message.SetEffectChainParameters.mix + << "mix_mode" << static_cast(message.SetEffectChainParameters.mix_mode); } response.success = updateParameters(message); break; diff --git a/src/engine/effects/engineeffectchain.h b/src/engine/effects/engineeffectchain.h index 51b971ffa702..1908c9f9628b 100644 --- a/src/engine/effects/engineeffectchain.h +++ b/src/engine/effects/engineeffectchain.h @@ -12,7 +12,6 @@ #include "engine/channelhandle.h" #include "engine/effects/message.h" #include "engine/effects/groupfeaturestate.h" -#include "effects/effectchain.h" class EngineEffect; diff --git a/src/mixxx.cpp b/src/mixxx.cpp index 82b979fd5e7f..e06ad510e971 100644 --- a/src/mixxx.cpp +++ b/src/mixxx.cpp @@ -209,7 +209,7 @@ void MixxxMainWindow::initialize(QApplication* pApp, const CmdlineArgs& args) { #endif // Sets up the EffectChains and EffectRacks (long) - m_pEffectsManager->setup(); + m_pEffectsManager->setupPerGroupRacks(); launchProgress(8); @@ -264,7 +264,7 @@ void MixxxMainWindow::initialize(QApplication* pApp, const CmdlineArgs& args) { launchProgress(30); - m_pEffectsManager->loadEffectChains(); + m_pEffectsManager->setup(); #ifdef __VINYLCONTROL__ m_pVCManager->init(); diff --git a/src/preferences/dialog/dlgprefeq.cpp b/src/preferences/dialog/dlgprefeq.cpp index 2ea1dc9f2194..094fdb37ba14 100644 --- a/src/preferences/dialog/dlgprefeq.cpp +++ b/src/preferences/dialog/dlgprefeq.cpp @@ -458,7 +458,7 @@ void DlgPrefEQ::applySelections() { // group name instead. EffectChainSlotPointer chainslot = m_pEQEffectRack->getGroupEffectChainSlot(group); - if (chainslot && chainslot->numSlots()) { + if (chainslot) { EffectPointer effectpointer = chainslot->getEffectSlot(0)->getEffect(); if (effectpointer && @@ -502,7 +502,7 @@ void DlgPrefEQ::applySelections() { // group name instead. EffectChainSlotPointer chainslot = m_pQuickEffectRack->getGroupEffectChainSlot(group); - if (chainslot && chainslot->numSlots()) { + if (chainslot) { EffectPointer effectpointer = chainslot->getEffectSlot(0)->getEffect(); if (effectpointer && @@ -722,12 +722,8 @@ void DlgPrefEQ::slotMasterEqEffectChanged(int effectIndex) { EffectChainSlotPointer pChainSlot = m_pOutputEffectRack->getEffectChainSlot(0); if (pChainSlot) { - EffectChainPointer pChain = pChainSlot->getEffectChain(); - VERIFY_OR_DEBUG_ASSERT(pChain) { - pChain = pChainSlot->getOrCreateEffectChain(m_pEffectsManager); - } EffectPointer pEffect = m_pEffectsManager->instantiateEffect(effectId); - pChain->replaceEffect(0, pEffect); + pChainSlot->replaceEffect(0, pEffect); if (pEffect) { pEffect->setEnabled(true); @@ -764,7 +760,6 @@ void DlgPrefEQ::slotMasterEqEffectChanged(int effectIndex) { QString valueText = QString::number((double)slider->value() / 100); valueLabel->setText(valueText); slidersGridLayout->addWidget(valueLabel, 2, i + 1, Qt::AlignCenter); - } } } diff --git a/src/test/baseeffecttest.h b/src/test/baseeffecttest.h index 0102f5fc8dd6..bea0fafa0834 100644 --- a/src/test/baseeffecttest.h +++ b/src/test/baseeffecttest.h @@ -6,7 +6,6 @@ #include -#include "effects/effectchain.h" #include "effects/effect.h" #include "effects/effectsmanager.h" #include "effects/effectmanifest.h" diff --git a/src/test/effectchainslottest.cpp b/src/test/effectchainslottest.cpp deleted file mode 100644 index 9169e8943fed..000000000000 --- a/src/test/effectchainslottest.cpp +++ /dev/null @@ -1,113 +0,0 @@ -#include -#include - -#include -#include - -#include "mixxxtest.h" -#include "control/controlobject.h" -#include "effects/effectchain.h" -#include "effects/effectchainslot.h" -#include "effects/effectrack.h" -#include "effects/effectsmanager.h" -#include "test/baseeffecttest.h" - -using ::testing::Return; -using ::testing::_; - -class EffectChainSlotTest : public BaseEffectTest { - protected: - EffectChainSlotTest() - : m_master(m_factory.getOrCreateHandle("[Master]"), "[Master]"), - m_headphone(m_factory.getOrCreateHandle("[Headphone]"), "[Headphone]") { - } - - ChannelHandleFactory m_factory; - ChannelHandleAndGroup m_master; - ChannelHandleAndGroup m_headphone; -}; - -TEST_F(EffectChainSlotTest, ChainSlotMirrorsLoadedChain) { - EffectChainPointer pChain(new EffectChain(m_pEffectsManager.data(), - "org.mixxx.test.chain1")); - int iRackNumber = 0; - int iChainNumber = 0; - - StandardEffectRackPointer pRack = m_pEffectsManager->addStandardEffectRack(); - EffectChainSlotPointer pChainSlot = pRack->getEffectChainSlot(iChainNumber); - - QString group = StandardEffectRack::formatEffectChainSlotGroupString( - iRackNumber, iChainNumber); - pChainSlot->loadEffectChainToSlot(pChain); - - pChain->setEnabled(true); - EXPECT_LT(0.0, ControlObject::get(ConfigKey(group, "enabled"))); - - pChain->setEnabled(false); - EXPECT_DOUBLE_EQ(0.0, ControlObject::get(ConfigKey(group, "enabled"))); - - ControlObject::set(ConfigKey(group, "enabled"), 1.0); - EXPECT_TRUE(pChain->enabled()); - - // Loaded is read-only. Sets to it should not do anything. - ControlObject::set(ConfigKey(group, "loaded"), 0); - EXPECT_TRUE(ControlObject::get(ConfigKey(group, "loaded")) > 0.0); - - // numEffects is read-only. Sets to it should not do anything. - ControlObject::set(ConfigKey(group, "num_effects"), 1); - EXPECT_EQ(0U, pChain->numEffects()); - - pChain->setMix(1.0); - EXPECT_DOUBLE_EQ(pChain->mix(), - ControlObject::get(ConfigKey(group, "mix"))); - - ControlObject::set(ConfigKey(group, "mix"), 0.5); - EXPECT_DOUBLE_EQ(0.5, pChain->mix()); - - pChain->setMixMode(EffectChainMixMode::DryPlusWet); - EXPECT_DOUBLE_EQ(static_cast(pChain->mixMode()), - ControlObject::get(ConfigKey(group, "mix_mode"))); - - ControlObject::set(ConfigKey(group, "mix_mode"), - static_cast(EffectChainMixMode::DrySlashWet)); - EXPECT_EQ(EffectChainMixMode::DrySlashWet, pChain->mixMode()); - - EXPECT_FALSE(pChain->enabledForChannel(m_master)); - EXPECT_DOUBLE_EQ(0.0, ControlObject::get(ConfigKey(group, "group_[Master]_enable"))); - - ControlObject::set(ConfigKey(group, "group_[Master]_enable"), 0); - EXPECT_FALSE(pChain->enabledForChannel(m_master)); -} - -TEST_F(EffectChainSlotTest, ChainSlotMirrorsLoadedChain_StartsWithChainLoaded) { - EffectChainPointer pChain(new EffectChain(m_pEffectsManager.data(), - "org.mixxx.test.chain1")); - int iRackNumber = 0; - int iChainNumber = 0; - - StandardEffectRackPointer pRack = m_pEffectsManager->addStandardEffectRack(); - EffectChainSlotPointer pChainSlot = pRack->getEffectChainSlot(iChainNumber); - pChainSlot->loadEffectChainToSlot(pChain); - QString group = StandardEffectRack::formatEffectChainSlotGroupString( - iRackNumber, iChainNumber); - EXPECT_DOUBLE_EQ(1.0, ControlObject::get(ConfigKey(group, "loaded"))); -} - -TEST_F(EffectChainSlotTest, ChainSlotMirrorsLoadedChain_Clear) { - EffectChainPointer pChain(new EffectChain(m_pEffectsManager.data(), - "org.mixxx.test.chain1")); - - int iRackNumber = 0; - int iChainNumber = 0; - - StandardEffectRackPointer pRack = m_pEffectsManager->addStandardEffectRack(); - EffectChainSlotPointer pChainSlot = pRack->getEffectChainSlot(iChainNumber); - - QString group = StandardEffectRack::formatEffectChainSlotGroupString( - iRackNumber, iChainNumber); - EXPECT_DOUBLE_EQ(0.0, ControlObject::get(ConfigKey(group, "loaded"))); - pChainSlot->loadEffectChainToSlot(pChain); - EXPECT_DOUBLE_EQ(1.0, ControlObject::get(ConfigKey(group, "loaded"))); - ControlObject::set(ConfigKey(group, "clear"), 1.0); - EXPECT_DOUBLE_EQ(0.0, ControlObject::get(ConfigKey(group, "loaded"))); -} diff --git a/src/test/effectslottest.cpp b/src/test/effectslottest.cpp index 10e25db965cf..5715a446507f 100644 --- a/src/test/effectslottest.cpp +++ b/src/test/effectslottest.cpp @@ -6,7 +6,6 @@ #include "mixxxtest.h" #include "control/controlobject.h" -#include "effects/effectchain.h" #include "effects/effectchainslot.h" #include "effects/effectsmanager.h" #include "effects/effectmanifest.h" @@ -32,15 +31,12 @@ class EffectSlotTest : public BaseEffectTest { }; TEST_F(EffectSlotTest, ControlsReflectSlotState) { - EffectChainPointer pChain(new EffectChain(m_pEffectsManager.data(), - "org.mixxx.test.chain1")); int iRackNumber = 0; int iChainNumber = 0; int iEffectNumber = 0; StandardEffectRackPointer pRack = m_pEffectsManager->addStandardEffectRack(); EffectChainSlotPointer pChainSlot = pRack->getEffectChainSlot(iChainNumber); - pChainSlot->loadEffectChainToSlot(pChain); // StandardEffectRack::addEffectChainSlot automatically adds 4 effect // slots. In the future we will probably remove this so this will just start // segfaulting. @@ -77,4 +73,4 @@ TEST_F(EffectSlotTest, ControlsReflectSlotState) { // num_parameters is read-only. ControlObject::set(ConfigKey(group, "num_parameters"), 2.0); EXPECT_DOUBLE_EQ(1, ControlObject::get(ConfigKey(group, "num_parameters"))); -} +} \ No newline at end of file diff --git a/src/test/effectsmanagertest.cpp b/src/test/effectsmanagertest.cpp index f93c4e45dcea..9a452692e5fc 100644 --- a/src/test/effectsmanagertest.cpp +++ b/src/test/effectsmanagertest.cpp @@ -5,8 +5,6 @@ #include #include "test/mixxxtest.h" -#include "effects/effectchain.h" -#include "effects/effectchainslot.h" #include "effects/effectsmanager.h" #include "effects/effectmanifest.h" diff --git a/src/test/metaknob_link_test.cpp b/src/test/metaknob_link_test.cpp index 17f2f2fc0c4f..f39f1f4dcad9 100644 --- a/src/test/metaknob_link_test.cpp +++ b/src/test/metaknob_link_test.cpp @@ -25,15 +25,12 @@ class MetaLinkTest : public BaseEffectTest { m_pEffectsManager->registerInputChannel(m_headphone); registerTestBackend(); - EffectChainPointer pChain(new EffectChain(m_pEffectsManager.data(), - "org.mixxx.test.chain1")); int iRackNumber = 0; int iChainNumber = 0; int iEffectNumber = 0; StandardEffectRackPointer pRack = m_pEffectsManager->addStandardEffectRack(); m_pChainSlot = pRack->getEffectChainSlot(iChainNumber); - m_pChainSlot->loadEffectChainToSlot(pChain); m_pEffectSlot = m_pChainSlot->getEffectSlot(iEffectNumber); QString group = StandardEffectRack::formatEffectSlotGroupString( @@ -260,4 +257,4 @@ TEST_F(MetaLinkTest, HalfLinkTakeover) { newParam = 0.5 + SoftTakeover::kDefaultTakeoverThreshold * 1.5; m_pEffectSlot->slotEffectMetaParameter(newParam); EXPECT_FLOAT_EQ(0.0703125, m_pControlValue->get()); -} +} \ No newline at end of file diff --git a/src/widget/weffectchain.cpp b/src/widget/weffectchain.cpp index cf6ccda72a77..cb504e5901f7 100644 --- a/src/widget/weffectchain.cpp +++ b/src/widget/weffectchain.cpp @@ -35,14 +35,12 @@ void WEffectChain::setEffectChainSlot(EffectChainSlotPointer pEffectChainSlot) { } void WEffectChain::chainUpdated() { + // qDebug() << "chainUpdated()"; QString name = tr("None"); QString description = tr("No effect chain loaded."); if (m_pEffectChainSlot) { - EffectChainPointer pChain = m_pEffectChainSlot->getEffectChain(); - if (pChain) { - name = pChain->name(); - description = pChain->description(); - } + name = m_pEffectChainSlot->name(); + description = m_pEffectChainSlot->description(); } setText(name); setBaseTooltip(description); From 5502ecd5ff0f462049c18ff855e9299fd368438d Mon Sep 17 00:00:00 2001 From: Kshitij Gupta Date: Sat, 16 Jun 2018 15:34:51 +0530 Subject: [PATCH 002/443] Removed EffectChainManager layer - Removed the superfluous class `EffectChainManager` whose functionality is now shifted to `EffectsManager` - Updated EffectProcessor to fix the circular include problem during compilation NOTE: XML saving/loading of effects is broken and will be re-implemented in the new architecture --- build/depends.py | 1 - src/effects/effectchainmanager.cpp | 237 ------------------------- src/effects/effectchainmanager.h | 89 ---------- src/effects/effectchainslot.cpp | 1 + src/effects/effectchainslot.h | 3 +- src/effects/effectprocessor.h | 26 +-- src/effects/effectrack.cpp | 30 ++-- src/effects/effectrack.h | 10 +- src/effects/effectsmanager.cpp | 139 ++++++++++++--- src/effects/effectsmanager.h | 71 +++++--- src/effects/lv2/lv2effectprocessor.cpp | 21 ++- src/effects/lv2/lv2effectprocessor.h | 4 +- src/engine/effects/engineeffect.cpp | 3 +- src/preferences/dialog/dlgpreflv2.cpp | 2 +- src/test/baseeffecttest.h | 2 +- 15 files changed, 200 insertions(+), 439 deletions(-) delete mode 100644 src/effects/effectchainmanager.cpp delete mode 100644 src/effects/effectchainmanager.h diff --git a/build/depends.py b/build/depends.py index 9d4b68e7a135..b004a4136bbf 100644 --- a/build/depends.py +++ b/build/depends.py @@ -703,7 +703,6 @@ def sources(self, build): "effects/effectparameterslot.cpp", "effects/effectbuttonparameterslot.cpp", "effects/effectsmanager.cpp", - "effects/effectchainmanager.cpp", "effects/effectsbackend.cpp", "effects/builtin/builtinbackend.cpp", diff --git a/src/effects/effectchainmanager.cpp b/src/effects/effectchainmanager.cpp deleted file mode 100644 index 682fc71f0ae7..000000000000 --- a/src/effects/effectchainmanager.cpp +++ /dev/null @@ -1,237 +0,0 @@ -#include "effects/effectchainmanager.h" -#include "effects/effectsmanager.h" -#include "effects/effectxmlelements.h" - -#include -#include -#include -#include - -EffectChainManager::EffectChainManager(UserSettingsPointer pConfig, - EffectsManager* pEffectsManager) - : QObject(pEffectsManager), - m_pConfig(pConfig), - m_pEffectsManager(pEffectsManager) { -} - -EffectChainManager::~EffectChainManager() { - //qDebug() << debugString() << "destroyed"; -} - -void EffectChainManager::registerInputChannel(const ChannelHandleAndGroup& handle_group) { - VERIFY_OR_DEBUG_ASSERT(!m_registeredInputChannels.contains(handle_group)) { - return; - } - m_registeredInputChannels.insert(handle_group); - - for (auto& pRack : m_standardEffectRacks) { - pRack->registerInputChannel(handle_group); - } -} - -void EffectChainManager::registerOutputChannel(const ChannelHandleAndGroup& handle_group) { - VERIFY_OR_DEBUG_ASSERT(!m_registeredOutputChannels.contains(handle_group)) { - return; - } - m_registeredOutputChannels.insert(handle_group); -} - -StandardEffectRackPointer EffectChainManager::addStandardEffectRack() { - StandardEffectRackPointer pRack(new StandardEffectRack( - m_pEffectsManager, this, m_standardEffectRacks.size())); - m_standardEffectRacks.append(pRack); - m_effectRacksByGroup.insert(pRack->getGroup(), pRack); - return pRack; -} - -StandardEffectRackPointer EffectChainManager::getStandardEffectRack(int i) { - if (i < 0 || i >= m_standardEffectRacks.size()) { - return StandardEffectRackPointer(); - } - return m_standardEffectRacks[i]; -} - -EqualizerRackPointer EffectChainManager::addEqualizerRack() { - EqualizerRackPointer pRack(new EqualizerRack( - m_pEffectsManager, this, m_equalizerEffectRacks.size())); - m_equalizerEffectRacks.append(pRack); - m_effectRacksByGroup.insert(pRack->getGroup(), pRack); - return pRack; -} - -EqualizerRackPointer EffectChainManager::getEqualizerRack(int i) { - if (i < 0 || i >= m_equalizerEffectRacks.size()) { - return EqualizerRackPointer(); - } - return m_equalizerEffectRacks[i]; -} - -QuickEffectRackPointer EffectChainManager::addQuickEffectRack() { - QuickEffectRackPointer pRack(new QuickEffectRack( - m_pEffectsManager, this, m_quickEffectRacks.size())); - m_quickEffectRacks.append(pRack); - m_effectRacksByGroup.insert(pRack->getGroup(), pRack); - return pRack; -} - -QuickEffectRackPointer EffectChainManager::getQuickEffectRack(int i) { - if (i < 0 || i >= m_quickEffectRacks.size()) { - return QuickEffectRackPointer(); - } - return m_quickEffectRacks[i]; -} - -OutputEffectRackPointer EffectChainManager::addOutputsEffectRack() { - OutputEffectRackPointer pRack(new OutputEffectRack( - m_pEffectsManager, this)); - m_pOutputEffectRack = pRack; - m_effectRacksByGroup.insert(pRack->getGroup(), pRack); - return m_pOutputEffectRack; -} - -OutputEffectRackPointer EffectChainManager::getMasterEffectRack() { - return m_pOutputEffectRack; -} - -EffectRackPointer EffectChainManager::getEffectRack(const QString& group) { - return m_effectRacksByGroup.value(group); -} - -void EffectChainManager::addEffectChain(EffectChainSlotPointer pEffectChainSlot) { - if (pEffectChainSlot) { - m_effectChainSlots.append(pEffectChainSlot); - } -} - -void EffectChainManager::removeEffectChain(EffectChainSlotPointer pEffectChainSlot) { - if (pEffectChainSlot) { - m_effectChainSlots.removeAll(pEffectChainSlot); - } -} - -EffectChainSlotPointer EffectChainManager::getNextEffectChain(EffectChainSlotPointer pEffectChainSlot) { - if (m_effectChainSlots.isEmpty()) - return EffectChainSlotPointer(); - - if (!pEffectChainSlot) { - return m_effectChainSlots[0]; - } - - int indexOf = m_effectChainSlots.lastIndexOf(pEffectChainSlot); - if (indexOf == -1) { - qWarning() << debugString() << "WARNING: getNextEffectChain called for an unmanaged EffectChain"; - return m_effectChainSlots[0]; - } - - return m_effectChainSlots[(indexOf + 1) % m_effectChainSlots.size()]; -} - -EffectChainSlotPointer EffectChainManager::getPrevEffectChain(EffectChainSlotPointer pEffectChainSlot) { - if (m_effectChainSlots.isEmpty()) - return EffectChainSlotPointer(); - - if (!pEffectChainSlot) { - return m_effectChainSlots[m_effectChainSlots.size()-1]; - } - - int indexOf = m_effectChainSlots.lastIndexOf(pEffectChainSlot); - if (indexOf == -1) { - qWarning() << debugString() << "WARNING: getPrevEffectChain called for an unmanaged EffectChain"; - return m_effectChainSlots[m_effectChainSlots.size()-1]; - } - - return m_effectChainSlots[(indexOf - 1 + m_effectChainSlots.size()) % m_effectChainSlots.size()]; -} - -void EffectChainManager::refeshAllRacks() { - for (const auto& pRack: m_standardEffectRacks) { - pRack->refresh(); - } - for (const auto& pRack: m_equalizerEffectRacks) { - pRack->refresh(); - } - for (const auto& pRack: m_quickEffectRacks) { - pRack->refresh(); - } -} - -// NOTE(Kshitij) : Use Effect Preset in constructor -// bool EffectChainManager::saveEffectChains() { -// QDomDocument doc("MixxxEffects"); - -// QString blank = "\n" -// "<" + EffectXml::Root + " schemaVersion=\"" + -// QString::number(EffectXml::kXmlSchemaVersion) + "\">\n" -// "\n"; -// doc.setContent(blank); - -// QDomElement rootNode = doc.documentElement(); - -// for (EffectRackPointer pRack : m_standardEffectRacks) { -// rootNode.appendChild(pRack->toXml(&doc)); -// } -// // TODO? Save QuickEffects in effects.xml too, or keep stored in ConfigObjects? -// // foreach(EffectRackPointer pRack, m_quickEffectRacks) { -// // rootNode.appendChild(pRack->toXML(&doc)); -// // } - -// QDir settingsPath(m_pConfig->getSettingsPath()); - -// if (!settingsPath.exists()) { -// return false; -// } - -// QFile file(settingsPath.absoluteFilePath("effects.xml")); - -// // TODO(rryan): overwrite the right way. -// if (!file.open(QIODevice::Truncate | QIODevice::WriteOnly)) { -// return false; -// } - -// QString effectsXml = doc.toString(); -// file.write(effectsXml.toUtf8()); -// file.close(); -// return true; -// } - -// NOTE(Kshitij) : Use EffectPreset to load effect chains -// void EffectChainManager::loadEffectChains() { -// QDir settingsPath(m_pConfig->getSettingsPath()); -// QFile file(settingsPath.absoluteFilePath("effects.xml")); -// QDomDocument doc; - -// QDomElement emptyChainElement = doc.createElement(EffectXml::Chain); -// // Check that XML file can be opened and is valid XML -// if (!file.open(QIODevice::ReadOnly) || !doc.setContent(&file)) { -// return; -// } - -// QDomElement root = doc.documentElement(); -// QDomElement rackElement = XmlParse::selectElement(root, EffectXml::Rack); -// QDomElement chainsElement = XmlParse::selectElement(rackElement, EffectXml::ChainsRoot); -// QDomNodeList chainsList = chainsElement.elementsByTagName(EffectXml::Chain); - -// for (int i = 0; i < chainsList.count(); ++i) { -// QDomNode chainNode = chainsList.at(i); - -// if (chainNode.isElement()) { -// QDomElement chainElement = chainNode.toElement(); -// EffectChainPointer pChain = EffectChain::createFromXml( -// m_pEffectsManager, chainElement); -// if (pChain) { // null = ejected chains. -// // Note(Kshitij) : Add the effect chain to standardEffectRack -// EffectChainSlotPointer pChainSlot = getStandardEffectRack(0)->getEffectChainSlot(i); -// if (pChainSlot) { -// pChainSlot->loadEffectChainToSlot(pChain); -// pChainSlot->loadChainSlotFromXml(chainElement); -// pChain->addToEngine(getStandardEffectRack(0)->getEngineEffectRack(), i); -// pChain->updateEngineState(); -// } -// } -// } -// } -// } - -bool EffectChainManager::isAdoptMetaknobValueEnabled() const { - return m_pConfig->getValue(ConfigKey("[Effects]", "AdoptMetaknobValue"), true); -} diff --git a/src/effects/effectchainmanager.h b/src/effects/effectchainmanager.h deleted file mode 100644 index 2c75f70820b1..000000000000 --- a/src/effects/effectchainmanager.h +++ /dev/null @@ -1,89 +0,0 @@ -#ifndef EFFECTCHAINMANAGER_H -#define EFFECTCHAINMANAGER_H - -#include -#include -#include - -#include "preferences/usersettings.h" -#include "effects/effectrack.h" -#include "engine/channelhandle.h" -#include "util/class.h" -#include "util/xml.h" - -class EffectsManager; - -// A class for keeping track of all the user's EffectChains. Eventually will -// serialize/deserialize the EffectChains from storage but for Effects v1 we are -// hard-coding the available chains. -class EffectChainManager : public QObject { - Q_OBJECT - public: - EffectChainManager(UserSettingsPointer pConfig, - EffectsManager* pEffectsManager); - virtual ~EffectChainManager(); - - void registerInputChannel(const ChannelHandleAndGroup& handle_group); - const QSet& registeredInputChannels() const { - return m_registeredInputChannels; - } - - void registerOutputChannel(const ChannelHandleAndGroup& handle_group); - const QSet& registeredOutputChannels() const { - return m_registeredOutputChannels; - } - - StandardEffectRackPointer addStandardEffectRack(); - StandardEffectRackPointer getStandardEffectRack(int rack); - - EqualizerRackPointer addEqualizerRack(); - EqualizerRackPointer getEqualizerRack(int rack); - - QuickEffectRackPointer addQuickEffectRack(); - QuickEffectRackPointer getQuickEffectRack(int rack); - - OutputEffectRackPointer addOutputsEffectRack(); - OutputEffectRackPointer getMasterEffectRack(); - - EffectRackPointer getEffectRack(const QString& group); - - void addEffectChain(EffectChainSlotPointer pEffectChainSlot); - void removeEffectChain(EffectChainSlotPointer pEffectChainSlot); - - // To support cycling through effect chains, there is a global ordering of - // chains. These methods allow you to get the next or previous chain given - // your current chain. - // TODO(rryan): Prevent double-loading of a chain into a slot? - EffectChainSlotPointer getNextEffectChain(EffectChainSlotPointer pEffectChainSlot); - EffectChainSlotPointer getPrevEffectChain(EffectChainSlotPointer pEffectChainSlot); - - // NOTE(Kshitij) : New functions for saving and loading - // bool saveEffectChains(); - // void loadEffectChains(); - - // Reloads all effect to the slots to update parameter assignments - void refeshAllRacks(); - - static const int kNumStandardEffectChains = 4; - - bool isAdoptMetaknobValueEnabled() const; - - private: - QString debugString() const { - return "EffectChainManager"; - } - - UserSettingsPointer m_pConfig; - EffectsManager* m_pEffectsManager; - QList m_standardEffectRacks; - QList m_equalizerEffectRacks; - QList m_quickEffectRacks; - OutputEffectRackPointer m_pOutputEffectRack; - QHash m_effectRacksByGroup; - QList m_effectChainSlots; - QSet m_registeredInputChannels; - QSet m_registeredOutputChannels; - DISALLOW_COPY_AND_ASSIGN(EffectChainManager); -}; - -#endif /* EFFECTCHAINMANAGER_H */ diff --git a/src/effects/effectchainslot.cpp b/src/effects/effectchainslot.cpp index 9eb5059f9772..bd2ce029fcab 100644 --- a/src/effects/effectchainslot.cpp +++ b/src/effects/effectchainslot.cpp @@ -453,6 +453,7 @@ void EffectChainSlot::enableForInputChannel(const ChannelHandleAndGroup& handle_ mixxx::AudioSignal::SampleRate(96000), MAX_BUFFER_LEN / mixxx::kEngineChannelCount); + // TODO: Simplify by defining a method to create an EffectState for the input channel for (int i = 0; i < m_effects.size(); ++i) { auto& statesMap = (*pEffectStatesMapArray)[i]; if (m_effects[i] != nullptr) { diff --git a/src/effects/effectchainslot.h b/src/effects/effectchainslot.h index 81f4a7ab0409..4d2c1e175d04 100644 --- a/src/effects/effectchainslot.h +++ b/src/effects/effectchainslot.h @@ -7,13 +7,12 @@ #include #include +#include "control/controlobject.h" #include "effects/defs.h" #include "effects/effect.h" #include "engine/channelhandle.h" #include "util/class.h" - -class ControlObject; class ControlPushButton; class ControlEncoder; class EffectChainSlot; diff --git a/src/effects/effectprocessor.h b/src/effects/effectprocessor.h index b493511aa28b..80a731dcb76c 100644 --- a/src/effects/effectprocessor.h +++ b/src/effects/effectprocessor.h @@ -1,4 +1,3 @@ - #ifndef EFFECTPROCESSOR_H #define EFFECTPROCESSOR_H @@ -13,7 +12,6 @@ #include "engine/effects/groupfeaturestate.h" #include "engine/effects/message.h" #include "engine/channelhandle.h" -#include "effects/effectsmanager.h" class EngineEffect; @@ -57,7 +55,7 @@ class EffectProcessor { // Called from main thread to avoid allocating memory in the audio callback thread virtual void initialize( const QSet& activeInputChannels, - EffectsManager* pEffectsManager, + const QSet& registeredOutputChannels, const mixxx::EngineParameters& bufferParameters) = 0; virtual EffectState* createState(const mixxx::EngineParameters& bufferParameters) = 0; virtual bool loadStatesForInputChannel(const ChannelHandle* inputChannel, @@ -91,8 +89,7 @@ class EffectProcessor { template class EffectProcessorImpl : public EffectProcessor { public: - EffectProcessorImpl() - : m_pEffectsManager(nullptr) { + EffectProcessorImpl() { } // Subclasses should not implement their own destructor. All state should // be stored in the EffectState subclass, not the EffectProcessorImpl subclass. @@ -159,16 +156,17 @@ class EffectProcessorImpl : public EffectProcessor { } void initialize(const QSet& activeInputChannels, - EffectsManager* pEffectsManager, + const QSet& registeredOutputChannels, const mixxx::EngineParameters& bufferParameters) final { + m_registeredOutputChannels = registeredOutputChannels; + for (const ChannelHandleAndGroup& inputChannel : activeInputChannels) { if (kEffectDebugOutput) { qDebug() << this << "EffectProcessorImpl::initialize allocating " "EffectStates for input" << inputChannel; } ChannelHandleMap outputChannelMap; - for (const ChannelHandleAndGroup& outputChannel : - pEffectsManager->registeredOutputChannels()) { + for (const ChannelHandleAndGroup& outputChannel : m_registeredOutputChannels) { outputChannelMap.insert(outputChannel.handle(), createSpecificState(bufferParameters)); if (kEffectDebugOutput) { @@ -178,8 +176,6 @@ class EffectProcessorImpl : public EffectProcessor { } m_channelStateMatrix.insert(inputChannel.handle(), outputChannelMap); } - m_pEffectsManager = pEffectsManager; - DEBUG_ASSERT(m_pEffectsManager != nullptr); }; EffectState* createState(const mixxx::EngineParameters& bufferParameters) final { @@ -217,8 +213,8 @@ class EffectProcessorImpl : public EffectProcessor { } } - for (const ChannelHandleAndGroup& outputChannel : - m_pEffectsManager->registeredOutputChannels()) { + QSet receivedOutputChannels = m_registeredOutputChannels; + for (const ChannelHandleAndGroup& outputChannel : m_registeredOutputChannels) { if (kEffectDebugOutput) { qDebug() << "EffectProcessorImpl::loadStatesForInputChannel" << this << "output" << outputChannel; @@ -230,7 +226,11 @@ class EffectProcessorImpl : public EffectProcessor { return false; } effectSpecificStatesMap.insert(outputChannel.handle(), pState); + receivedOutputChannels.insert(outputChannel); } + // Output channels are hardcoded in EngineMaster and should not + // be registered after Mixxx initializes. + DEBUG_ASSERT(receivedOutputChannels == m_registeredOutputChannels); return true; }; @@ -272,7 +272,7 @@ class EffectProcessorImpl : public EffectProcessor { return pState; }; - EffectsManager* m_pEffectsManager; + QSet m_registeredOutputChannels; ChannelHandleMap> m_channelStateMatrix; }; diff --git a/src/effects/effectrack.cpp b/src/effects/effectrack.cpp index 5274b9c211bd..3ab57e6395e7 100644 --- a/src/effects/effectrack.cpp +++ b/src/effects/effectrack.cpp @@ -1,19 +1,16 @@ #include "effects/effectrack.h" #include "effects/effectsmanager.h" -#include "effects/effectchainmanager.h" #include "effects/effectslot.h" #include "engine/effects/engineeffectrack.h" #include "util/assert.h" EffectRack::EffectRack(EffectsManager* pEffectsManager, - EffectChainManager* pEffectChainManager, const unsigned int iRackNumber, const QString& group, SignalProcessingStage stage) : m_pEngineEffectRack(nullptr), m_pEffectsManager(pEffectsManager), - m_pEffectChainManager(pEffectChainManager), m_signalProcessingStage(stage), m_iRackNumber(iRackNumber), m_group(group), @@ -171,15 +168,14 @@ void EffectRack::refresh() { } bool EffectRack::isAdoptMetaknobValueEnabled() const { - return m_pEffectChainManager->isAdoptMetaknobValueEnabled(); + return m_pEffectsManager->isAdoptMetaknobValueEnabled(); } StandardEffectRack::StandardEffectRack(EffectsManager* pEffectsManager, - EffectChainManager* pChainManager, const unsigned int iRackNumber) - : EffectRack(pEffectsManager, pChainManager, iRackNumber, + : EffectRack(pEffectsManager, iRackNumber, formatGroupString(iRackNumber), SignalProcessingStage::Postfader) { - for (int i = 0; i < EffectChainManager::kNumStandardEffectChains; ++i) { + for (int i = 0; i < EffectsManager::kNumStandardEffectChains; ++i) { addEffectChainSlot(); } } @@ -207,7 +203,7 @@ EffectChainSlotPointer StandardEffectRack::addEffectChainSlot() { // Register all the existing channels with the new EffectChain. const QSet& registeredChannels = - m_pEffectChainManager->registeredInputChannels(); + m_pEffectsManager->registeredInputChannels(); for (const ChannelHandleAndGroup& handle_group : registeredChannels) { pChainSlot->registerInputChannel(handle_group); } @@ -218,9 +214,8 @@ EffectChainSlotPointer StandardEffectRack::addEffectChainSlot() { return pChainSlotPointer; } -OutputEffectRack::OutputEffectRack(EffectsManager* pEffectsManager, - EffectChainManager* pChainManager) - : EffectRack(pEffectsManager, pChainManager, 0, +OutputEffectRack::OutputEffectRack(EffectsManager* pEffectsManager) + : EffectRack(pEffectsManager, 0, "[OutputEffectRack]", SignalProcessingStage::Postfader) { const QString unitGroup = "[OutputEffectRack_[Master]]"; @@ -238,7 +233,7 @@ OutputEffectRack::OutputEffectRack(EffectsManager* pEffectsManager, // TODO(Be): Remove this hideous hack to get the ChannelHandleAndGroup const QSet& registeredChannels = - m_pEffectChainManager->registeredInputChannels(); + m_pEffectsManager->registeredInputChannels(); for (const ChannelHandleAndGroup& handle_group : registeredChannels) { if (handle_group.name() == "[MasterOutput]") { masterHandleAndGroup = &handle_group; @@ -259,10 +254,9 @@ OutputEffectRack::OutputEffectRack(EffectsManager* pEffectsManager, } PerGroupRack::PerGroupRack(EffectsManager* pEffectsManager, - EffectChainManager* pChainManager, const unsigned int iRackNumber, const QString& group) - : EffectRack(pEffectsManager, pChainManager, iRackNumber, group, + : EffectRack(pEffectsManager, iRackNumber, group, SignalProcessingStage::Prefader) { } @@ -291,7 +285,7 @@ void PerGroupRack::setupForGroup(const QString& groupName) { // TODO(rryan): remove. const ChannelHandleAndGroup* handleAndGroup = nullptr; for (const ChannelHandleAndGroup& handle_group : - m_pEffectChainManager->registeredInputChannels()) { + m_pEffectsManager->registeredInputChannels()) { if (handle_group.name() == groupName) { handleAndGroup = &handle_group; break; @@ -327,9 +321,8 @@ EffectChainSlotPointer PerGroupRack::getGroupEffectChainSlot(const QString& grou } QuickEffectRack::QuickEffectRack(EffectsManager* pEffectsManager, - EffectChainManager* pChainManager, const unsigned int iRackNumber) - : PerGroupRack(pEffectsManager, pChainManager, iRackNumber, + : PerGroupRack(pEffectsManager, iRackNumber, QuickEffectRack::formatGroupString(iRackNumber)) { } @@ -351,9 +344,8 @@ bool QuickEffectRack::loadEffectToGroup(const QString& groupName, } EqualizerRack::EqualizerRack(EffectsManager* pEffectsManager, - EffectChainManager* pChainManager, const unsigned int iRackNumber) - : PerGroupRack(pEffectsManager, pChainManager, iRackNumber, + : PerGroupRack(pEffectsManager, iRackNumber, EqualizerRack::formatGroupString(iRackNumber)) { } diff --git a/src/effects/effectrack.h b/src/effects/effectrack.h index 7285334d1216..d2daa6dfb3fa 100644 --- a/src/effects/effectrack.h +++ b/src/effects/effectrack.h @@ -12,7 +12,6 @@ class EngineEffectRack; class EffectsManager; -class EffectChainManager; #include "effects/effectchainslot.h" @@ -21,7 +20,6 @@ class EffectRack : public QObject { Q_OBJECT public: EffectRack(EffectsManager* pEffectsManager, - EffectChainManager* pChainManager, const unsigned int iRackNumber, const QString& group, SignalProcessingStage stage); virtual ~EffectRack(); @@ -70,7 +68,6 @@ class EffectRack : public QObject { // We could make accessors for these for sub-classes. Doesn't really matter. EffectsManager* m_pEffectsManager; - EffectChainManager* m_pEffectChainManager; private: SignalProcessingStage m_signalProcessingStage; @@ -85,7 +82,6 @@ class StandardEffectRack : public EffectRack { Q_OBJECT public: StandardEffectRack(EffectsManager* pEffectsManager, - EffectChainManager* pChainManager, const unsigned int iRackNumber); virtual ~StandardEffectRack() {} @@ -116,8 +112,7 @@ class StandardEffectRack : public EffectRack { class OutputEffectRack : public EffectRack { Q_OBJECT public: - OutputEffectRack(EffectsManager* pEffectsManager, - EffectChainManager* pChainManager); + OutputEffectRack(EffectsManager* pEffectsManager); virtual ~OutputEffectRack() {}; }; @@ -125,7 +120,6 @@ class PerGroupRack : public EffectRack { Q_OBJECT public: PerGroupRack(EffectsManager* pEffectsManager, - EffectChainManager* pChainManager, const unsigned int iRackNumber, const QString& group); virtual ~PerGroupRack() {} @@ -154,7 +148,6 @@ class QuickEffectRack : public PerGroupRack { Q_OBJECT public: QuickEffectRack(EffectsManager* pEffectsManager, - EffectChainManager* pChainManager, const unsigned int iRackNumber); virtual ~QuickEffectRack() {} @@ -208,7 +201,6 @@ class EqualizerRack : public PerGroupRack { Q_OBJECT public: EqualizerRack(EffectsManager* pEffectsManager, - EffectChainManager* pChainManager, const unsigned int iRackNumber); virtual ~EqualizerRack() {} diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index 5100cfdf010b..ffc55202ca1e 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -6,9 +6,9 @@ #include #include "engine/effects/engineeffectsmanager.h" -#include "effects/effectchainmanager.h" #include "effects/effectsbackend.h" #include "effects/effectslot.h" +#include "effects/effectxmlelements.h" #include "engine/effects/engineeffect.h" #include "engine/effects/engineeffectrack.h" #include "engine/effects/engineeffectchain.h" @@ -25,7 +25,7 @@ EffectsManager::EffectsManager(QObject* pParent, UserSettingsPointer pConfig, ChannelHandleFactory* pChannelHandleFactory) : QObject(pParent), m_pChannelHandleFactory(pChannelHandleFactory), - m_pEffectChainManager(new EffectChainManager(pConfig, this)), + m_pConfig(pConfig), m_nextRequestId(0), m_pLoEqFreq(NULL), m_pHiEqFreq(NULL), @@ -50,8 +50,7 @@ EffectsManager::~EffectsManager() { m_underDestruction = true; // NOTE(Kshitij) : Use new functions for saving XML files - // m_pEffectChainManager->saveEffectChains(); - delete m_pEffectChainManager; + // saveEffectChains(); // This must be done here, since the engineRacks are deleted via // the queue processEffectsResponses(); @@ -113,20 +112,76 @@ void EffectsManager::slotBackendRegisteredEffect(EffectManifestPointer pManifest m_pNumEffectsAvailable->forceSet(m_availableEffectManifests.size()); } -void EffectsManager::registerInputChannel(const ChannelHandleAndGroup& handle_group) { - m_pEffectChainManager->registerInputChannel(handle_group); +// TODO(Kshitij) : This function is not being used. Remove +void EffectsManager::addEffectChain(EffectChainSlotPointer pEffectChainSlot) { + if (pEffectChainSlot) { + m_effectChainSlots.append(pEffectChainSlot); + } } -const QSet& EffectsManager::registeredInputChannels() const { - return m_pEffectChainManager->registeredInputChannels(); +// TODO(Kshitij) : This function is not being used. Remove +void EffectsManager::removeEffectChain(EffectChainSlotPointer pEffectChainSlot) { + if (pEffectChainSlot) { + m_effectChainSlots.removeAll(pEffectChainSlot); + } } -void EffectsManager::registerOutputChannel(const ChannelHandleAndGroup& handle_group) { - m_pEffectChainManager->registerOutputChannel(handle_group); +// TODO(Kshitij) : This function is not being used. Remove +EffectChainSlotPointer EffectsManager::getNextEffectChain(EffectChainSlotPointer pEffectChainSlot) { + if (m_effectChainSlots.isEmpty()) + return EffectChainSlotPointer(); + + if (!pEffectChainSlot) { + return m_effectChainSlots[0]; + } + + int indexOf = m_effectChainSlots.lastIndexOf(pEffectChainSlot); + if (indexOf == -1) { + qWarning() << debugString() << "WARNING: getNextEffectChain called for an unmanaged EffectChain"; + return m_effectChainSlots[0]; + } + + return m_effectChainSlots[(indexOf + 1) % m_effectChainSlots.size()]; +} + +// TODO(Kshitij) : This function is not being used. Remove +EffectChainSlotPointer EffectsManager::getPrevEffectChain(EffectChainSlotPointer pEffectChainSlot) { + if (m_effectChainSlots.isEmpty()) + return EffectChainSlotPointer(); + + if (!pEffectChainSlot) { + return m_effectChainSlots[m_effectChainSlots.size()-1]; + } + + int indexOf = m_effectChainSlots.lastIndexOf(pEffectChainSlot); + if (indexOf == -1) { + qWarning() << debugString() << "WARNING: getPrevEffectChain called for an unmanaged EffectChain"; + return m_effectChainSlots[m_effectChainSlots.size()-1]; + } + + return m_effectChainSlots[(indexOf - 1 + m_effectChainSlots.size()) % m_effectChainSlots.size()]; +} + +bool EffectsManager::isAdoptMetaknobValueEnabled() const { + return m_pConfig->getValue(ConfigKey("[Effects]", "AdoptMetaknobValue"), true); } -const QSet& EffectsManager::registeredOutputChannels() const { - return m_pEffectChainManager->registeredOutputChannels(); +void EffectsManager::registerInputChannel(const ChannelHandleAndGroup& handle_group) { + VERIFY_OR_DEBUG_ASSERT(!m_registeredInputChannels.contains(handle_group)) { + return; + } + m_registeredInputChannels.insert(handle_group); + + for (auto& pRack : m_standardEffectRacks) { + pRack->registerInputChannel(handle_group); + } +} + +void EffectsManager::registerOutputChannel(const ChannelHandleAndGroup& handle_group) { + VERIFY_OR_DEBUG_ASSERT(!m_registeredOutputChannels.contains(handle_group)) { + return; + } + m_registeredOutputChannels.insert(handle_group); } const QList EffectsManager::getAvailableEffectManifestsFiltered( @@ -220,39 +275,63 @@ EffectPointer EffectsManager::instantiateEffect(const QString& effectId) { } StandardEffectRackPointer EffectsManager::addStandardEffectRack() { - return m_pEffectChainManager->addStandardEffectRack(); + StandardEffectRackPointer pRack(new StandardEffectRack( + this, m_standardEffectRacks.size())); + m_standardEffectRacks.append(pRack); + m_effectRacksByGroup.insert(pRack->getGroup(), pRack); + return pRack; } -StandardEffectRackPointer EffectsManager::getStandardEffectRack(int rack) { - return m_pEffectChainManager->getStandardEffectRack(rack); +StandardEffectRackPointer EffectsManager::getStandardEffectRack(int i) { + if (i < 0 || i >= m_standardEffectRacks.size()) { + return StandardEffectRackPointer(); + } + return m_standardEffectRacks[i]; } EqualizerRackPointer EffectsManager::addEqualizerRack() { - return m_pEffectChainManager->addEqualizerRack(); + EqualizerRackPointer pRack(new EqualizerRack( + this, m_equalizerEffectRacks.size())); + m_equalizerEffectRacks.append(pRack); + m_effectRacksByGroup.insert(pRack->getGroup(), pRack); + return pRack; } -EqualizerRackPointer EffectsManager::getEqualizerRack(int rack) { - return m_pEffectChainManager->getEqualizerRack(rack); +EqualizerRackPointer EffectsManager::getEqualizerRack(int i) { + if (i < 0 || i >= m_equalizerEffectRacks.size()) { + return EqualizerRackPointer(); + } + return m_equalizerEffectRacks[i]; } QuickEffectRackPointer EffectsManager::addQuickEffectRack() { - return m_pEffectChainManager->addQuickEffectRack(); + QuickEffectRackPointer pRack(new QuickEffectRack( + this, m_quickEffectRacks.size())); + m_quickEffectRacks.append(pRack); + m_effectRacksByGroup.insert(pRack->getGroup(), pRack); + return pRack; } -QuickEffectRackPointer EffectsManager::getQuickEffectRack(int rack) { - return m_pEffectChainManager->getQuickEffectRack(rack); +QuickEffectRackPointer EffectsManager::getQuickEffectRack(int i) { + if (i < 0 || i >= m_quickEffectRacks.size()) { + return QuickEffectRackPointer(); + } + return m_quickEffectRacks[i]; } OutputEffectRackPointer EffectsManager::addOutputsEffectRack() { - return m_pEffectChainManager->addOutputsEffectRack(); + OutputEffectRackPointer pRack(new OutputEffectRack(this)); + m_pOutputEffectRack = pRack; + m_effectRacksByGroup.insert(pRack->getGroup(), pRack); + return m_pOutputEffectRack; } OutputEffectRackPointer EffectsManager::getOutputsEffectRack() { - return m_pEffectChainManager->getMasterEffectRack(); + return m_pOutputEffectRack; } EffectRackPointer EffectsManager::getEffectRack(const QString& group) { - return m_pEffectChainManager->getEffectRack(group); + return m_effectRacksByGroup.value(group); } EffectSlotPointer EffectsManager::getEffectSlot( @@ -360,8 +439,16 @@ void EffectsManager::setup() { // m_pEffectChainManager->loadEffectChains(); // } -void EffectsManager::refeshAllRacks() { - m_pEffectChainManager->refeshAllRacks(); +void EffectsManager::refreshAllRacks() { + for (const auto& pRack: m_standardEffectRacks) { + pRack->refresh(); + } + for (const auto& pRack: m_equalizerEffectRacks) { + pRack->refresh(); + } + for (const auto& pRack: m_quickEffectRacks) { + pRack->refresh(); + } } bool EffectsManager::writeRequest(EffectsRequest* request) { diff --git a/src/effects/effectsmanager.h b/src/effects/effectsmanager.h index 55fad3515a79..1a580b9c96ba 100644 --- a/src/effects/effectsmanager.h +++ b/src/effects/effectsmanager.h @@ -8,16 +8,17 @@ #include #include -#include "preferences/usersettings.h" #include "control/controlpotmeter.h" #include "control/controlpushbutton.h" +#include "effects/effectrack.h" #include "engine/channelhandle.h" #include "engine/effects/message.h" +#include "preferences/usersettings.h" #include "util/class.h" #include "util/fifo.h" +#include "util/xml.h" class EngineEffectsManager; -class EffectChainManager; class EffectManifest; class EffectsBackend; @@ -34,10 +35,6 @@ class EffectsManager : public QObject { return m_pEngineEffectsManager; } - EffectChainManager* getEffectChainManager() { - return m_pEffectChainManager; - } - const ChannelHandle getMasterHandle() { return m_pChannelHandleFactory->getOrCreateHandle("[Master]"); } @@ -46,10 +43,36 @@ class EffectsManager : public QObject { // takes ownership of the backend, and will delete it when EffectsManager is // being deleted. Not thread safe -- use only from the GUI thread. void addEffectsBackend(EffectsBackend* pEffectsBackend); + + // TODO(Kshitij) : Remove these redundant functions + void addEffectChain(EffectChainSlotPointer pEffectChainSlot); + void removeEffectChain(EffectChainSlotPointer pEffectChainSlot); + + // To support cycling through effect chains, there is a global ordering of + // chains. These methods allow you to get the next or previous chain given + // your current chain. + // TODO(rryan): Prevent double-loading of a chain into a slot? + // TODO(Kshitij) : These functions are not being used. Remove + EffectChainSlotPointer getNextEffectChain(EffectChainSlotPointer pEffectChainSlot); + EffectChainSlotPointer getPrevEffectChain(EffectChainSlotPointer pEffectChainSlot); + + // NOTE(Kshitij) : New functions for saving and loading + // bool saveEffectChains(); + // void loadEffectChains(); + + static const int kNumStandardEffectChains = 4; + + bool isAdoptMetaknobValueEnabled() const; + void registerInputChannel(const ChannelHandleAndGroup& handle_group); + const QSet& registeredInputChannels() const { + return m_registeredInputChannels; + } + void registerOutputChannel(const ChannelHandleAndGroup& handle_group); - const QSet& registeredInputChannels() const; - const QSet& registeredOutputChannels() const; + const QSet& registeredOutputChannels() const { + return m_registeredOutputChannels; + } StandardEffectRackPointer addStandardEffectRack(); StandardEffectRackPointer getStandardEffectRack(int rack); @@ -63,7 +86,7 @@ class EffectsManager : public QObject { OutputEffectRackPointer addOutputsEffectRack(); OutputEffectRackPointer getOutputsEffectRack(); - // NOTE(Kshitij) : Use new functions + // NOTE(Kshitij) : Use new functions // void loadEffectChains(); EffectRackPointer getEffectRack(const QString& group); @@ -93,13 +116,13 @@ class EffectsManager : public QObject { EffectPointer instantiateEffect(const QString& effectId); void setEffectVisibility(EffectManifestPointer pManifest, bool visibility); - bool getEffectVisibility(EffectManifestPointer pManifest); + bool getEffectVisibility(EffectManifestPointer pManifest); void setupPerGroupRacks(); void setup(); - // Reloads all effect to the slots to update parameter assignments - void refeshAllRacks(); + // Reloads all effect to the slots to update parameter assignements + void refreshAllRacks(); // Write an EffectsRequest to the EngineEffectsManager. EffectsManager takes // ownership of request and deletes it once a response is received. @@ -123,7 +146,6 @@ class EffectsManager : public QObject { ChannelHandleFactory* m_pChannelHandleFactory; - EffectChainManager* m_pEffectChainManager; QList m_effectsBackends; QList m_availableEffectManifests; QList m_visibleEffectManifests; @@ -141,20 +163,15 @@ class EffectsManager : public QObject { bool m_underDestruction; - // START EFFECTCHAINMANAGER - // UserSettingsPointer m_pConfig; - // EffectsManager* m_pEffectsManager; - // QList m_standardEffectRacks; - // QList m_equalizerEffectRacks; - // QList m_quickEffectRacks; - // OutputEffectRackPointer m_pOutputEffectRack; - // QHash m_effectRacksByGroup; - // QList m_effectChains; - // QSet m_registeredInputChannels; - // QSet m_registeredOutputChannels; - // END EFFECTCHAINMANAGER - - + QSet m_registeredInputChannels; + QSet m_registeredOutputChannels; + QList m_standardEffectRacks; + UserSettingsPointer m_pConfig; + QList m_equalizerEffectRacks; + QList m_quickEffectRacks; + OutputEffectRackPointer m_pOutputEffectRack; + QHash m_effectRacksByGroup; + QList m_effectChainSlots; DISALLOW_COPY_AND_ASSIGN(EffectsManager); }; diff --git a/src/effects/lv2/lv2effectprocessor.cpp b/src/effects/lv2/lv2effectprocessor.cpp index 16fb6336b8cb..bb6abd37a51c 100644 --- a/src/effects/lv2/lv2effectprocessor.cpp +++ b/src/effects/lv2/lv2effectprocessor.cpp @@ -11,8 +11,7 @@ LV2EffectProcessor::LV2EffectProcessor(EngineEffect* pEngineEffect, QList controlPortIndices) : m_pPlugin(plugin), m_audioPortIndices(audioPortIndices), - m_controlPortIndices(controlPortIndices), - m_pEffectsManager(nullptr) { + m_controlPortIndices(controlPortIndices) { m_inputL = new float[MAX_BUFFER_LEN]; m_inputR = new float[MAX_BUFFER_LEN]; m_outputL = new float[MAX_BUFFER_LEN]; @@ -60,20 +59,18 @@ LV2EffectProcessor::~LV2EffectProcessor() { void LV2EffectProcessor::initialize( const QSet& activeInputChannels, - EffectsManager* pEffectsManager, + const QSet& registeredOutputChannels, const mixxx::EngineParameters& bufferParameters) { - Q_UNUSED(pEffectsManager); + m_registeredOutputChannels = registeredOutputChannels; Q_UNUSED(bufferParameters); - for (const ChannelHandleAndGroup& inputChannel : activeInputChannels) { if (kEffectDebugOutput) { qDebug() << this << "LV2EffectProcessor::initialize allocating " "EffectStates for input" << inputChannel; } ChannelHandleMap outputChannelMap; - for (const ChannelHandleAndGroup& outputChannel : - pEffectsManager->registeredOutputChannels()) { + for (const ChannelHandleAndGroup& outputChannel : registeredOutputChannels) { LV2EffectGroupState* pGroupState = createGroupState(bufferParameters); if (pGroupState) { outputChannelMap.insert(outputChannel.handle(), pGroupState); @@ -85,8 +82,6 @@ void LV2EffectProcessor::initialize( } m_channelStateMatrix.insert(inputChannel.handle(), outputChannelMap); } - m_pEffectsManager = pEffectsManager; - DEBUG_ASSERT(m_pEffectsManager != nullptr); } void LV2EffectProcessor::process(const ChannelHandle& inputHandle, @@ -197,8 +192,8 @@ bool LV2EffectProcessor::loadStatesForInputChannel(const ChannelHandle* inputCha } } - for (const ChannelHandleAndGroup& outputChannel : - m_pEffectsManager->registeredOutputChannels()) { + QSet receivedOutputChannels; + for (const ChannelHandleAndGroup& outputChannel : m_registeredOutputChannels) { if (kEffectDebugOutput) { qDebug() << "LV2EffectProcessor::loadStatesForInputChannel" << this << "output" << outputChannel; @@ -210,7 +205,11 @@ bool LV2EffectProcessor::loadStatesForInputChannel(const ChannelHandle* inputCha return false; } effectSpecificStatesMap.insert(outputChannel.handle(), pState); + receivedOutputChannels.insert(outputChannel); } + // Output channels are hardcoded in EngineMaster and should not + // be registered after Mixxx initializes. + DEBUG_ASSERT(receivedOutputChannels == m_registeredOutputChannels); return true; } diff --git a/src/effects/lv2/lv2effectprocessor.h b/src/effects/lv2/lv2effectprocessor.h index 3cebc56d12e4..cf29d72af07b 100644 --- a/src/effects/lv2/lv2effectprocessor.h +++ b/src/effects/lv2/lv2effectprocessor.h @@ -37,7 +37,7 @@ class LV2EffectProcessor : public EffectProcessor { void initialize( const QSet& activeInputChannels, - EffectsManager* pEffectsManager, + const QSet& registeredOutputChannels, const mixxx::EngineParameters& bufferParameters) override; EffectState* createState(const mixxx::EngineParameters& bufferParameters) final; bool loadStatesForInputChannel(const ChannelHandle* inputChannel, @@ -65,7 +65,7 @@ class LV2EffectProcessor : public EffectProcessor { const QList m_audioPortIndices; const QList m_controlPortIndices; - EffectsManager* m_pEffectsManager; + QSet m_registeredOutputChannels; ChannelHandleMap> m_channelStateMatrix; }; diff --git a/src/engine/effects/engineeffect.cpp b/src/engine/effects/engineeffect.cpp index 8fccbb7740e1..e4072ef37d75 100644 --- a/src/engine/effects/engineeffect.cpp +++ b/src/engine/effects/engineeffect.cpp @@ -36,7 +36,8 @@ EngineEffect::EngineEffect(EffectManifestPointer pManifest, const mixxx::EngineParameters bufferParameters( mixxx::AudioSignal::SampleRate(96000), MAX_BUFFER_LEN / mixxx::kEngineChannelCount); - m_pProcessor->initialize(activeInputChannels, pEffectsManager, bufferParameters); + m_pProcessor->initialize(activeInputChannels, + pEffectsManager->registeredOutputChannels(), bufferParameters); m_effectRampsFromDry = pManifest->effectRampsFromDry(); } diff --git a/src/preferences/dialog/dlgpreflv2.cpp b/src/preferences/dialog/dlgpreflv2.cpp index 451eec8594b1..ce6edc52b741 100644 --- a/src/preferences/dialog/dlgpreflv2.cpp +++ b/src/preferences/dialog/dlgpreflv2.cpp @@ -117,7 +117,7 @@ void DlgPrefLV2::slotApply() { EffectManifestParameterPointer pParameter = pCurrentEffectManifest->parameter(i); pParameter->setShowInParameterSlot(m_pluginParameters[i]->isChecked()); } - m_pEffectsManager->refeshAllRacks(); + m_pEffectsManager->refreshAllRacks(); } void DlgPrefLV2::slotUpdateOnParameterCheck(int state) { diff --git a/src/test/baseeffecttest.h b/src/test/baseeffecttest.h index bea0fafa0834..ce12fb8f8ce6 100644 --- a/src/test/baseeffecttest.h +++ b/src/test/baseeffecttest.h @@ -34,7 +34,7 @@ class MockEffectProcessor : public EffectProcessor { MockEffectProcessor() {} MOCK_METHOD3(initialize, void(const QSet& activeInputChannels, - EffectsManager* pEffectsManager, + const QSet& registeredOutputChannels, const mixxx::EngineParameters& bufferParameters)); MOCK_METHOD1(createState, EffectState*(const mixxx::EngineParameters& bufferParameters)); MOCK_METHOD2(loadStatesForInputChannel, bool(const ChannelHandle* inputChannel, From a7cd3a7266cd97e27e976aec74bfd0d4affb6f92 Mon Sep 17 00:00:00 2001 From: Kshitij Gupta Date: Mon, 18 Jun 2018 20:20:26 +0530 Subject: [PATCH 003/443] Removed EngineEffectRack layer - Removed the superfluous layer `EngineEffectRack` above all the effect chains in the engine NOTE: XML saving/loading of effects is broken and will be re-implemented in the new architecture --- build/depends.py | 1 - src/effects/effectchainslot.cpp | 25 ++-- src/effects/effectchainslot.h | 4 +- src/effects/effectrack.cpp | 32 +---- src/effects/effectrack.h | 11 +- src/effects/effectsmanager.cpp | 10 +- src/engine/effects/engineeffectrack.cpp | 140 -------------------- src/engine/effects/engineeffectrack.h | 51 ------- src/engine/effects/engineeffectsmanager.cpp | 131 +++++++++--------- src/engine/effects/engineeffectsmanager.h | 14 +- src/engine/effects/message.h | 37 ++---- 11 files changed, 91 insertions(+), 365 deletions(-) delete mode 100644 src/engine/effects/engineeffectrack.cpp delete mode 100644 src/engine/effects/engineeffectrack.h diff --git a/build/depends.py b/build/depends.py index b004a4136bbf..10239de519aa 100644 --- a/build/depends.py +++ b/build/depends.py @@ -727,7 +727,6 @@ def sources(self, build): "effects/builtin/tremoloeffect.cpp", "engine/effects/engineeffectsmanager.cpp", - "engine/effects/engineeffectrack.cpp", "engine/effects/engineeffectchain.cpp", "engine/effects/engineeffect.cpp", diff --git a/src/effects/effectchainslot.cpp b/src/effects/effectchainslot.cpp index bd2ce029fcab..62b9e8c243d7 100644 --- a/src/effects/effectchainslot.cpp +++ b/src/effects/effectchainslot.cpp @@ -9,7 +9,6 @@ #include "effects/effectsmanager.h" #include "effects/effectxmlelements.h" #include "engine/effects/engineeffectchain.h" -#include "engine/effects/engineeffectrack.h" #include "engine/effects/message.h" #include "engine/engine.h" #include "mixer/playermanager.h" @@ -108,7 +107,7 @@ EffectChainSlot::EffectChainSlot(EffectRack* pRack, const QString& group, true); m_pControlChainFocusedEffect->setButtonMode(ControlPushButton::TOGGLE); - addToEngine(m_pEffectRack->getEngineEffectRack(), m_iChainSlotNumber); + addToEngine(m_iChainSlotNumber); } EffectChainSlot::~EffectChainSlot() { @@ -136,18 +135,18 @@ EffectChainSlot::~EffectChainSlot() { } m_slots.clear(); - removeFromEngine(m_pEffectRack->getEngineEffectRack(), m_iChainSlotNumber); + removeFromEngine(m_iChainSlotNumber); } -void EffectChainSlot::addToEngine(EngineEffectRack* pRack, int iIndex) { +void EffectChainSlot::addToEngine(int iIndex) { m_pEngineEffectChain = new EngineEffectChain(m_id, m_pEffectsManager->registeredInputChannels(), m_pEffectsManager->registeredOutputChannels()); EffectsRequest* pRequest = new EffectsRequest(); - pRequest->type = EffectsRequest::ADD_CHAIN_TO_RACK; - pRequest->pTargetRack = pRack; - pRequest->AddChainToRack.pChain = m_pEngineEffectChain; - pRequest->AddChainToRack.iIndex = iIndex; + pRequest->type = EffectsRequest::ADD_EFFECT_CHAIN; + pRequest->AddEffectChain.signalProcessingStage = m_pEffectRack->getSignalProcessingStage(); + pRequest->AddEffectChain.pChain = m_pEngineEffectChain; + pRequest->AddEffectChain.iIndex = iIndex; m_pEffectsManager->writeRequest(pRequest); // Add all effects. @@ -161,7 +160,7 @@ void EffectChainSlot::addToEngine(EngineEffectRack* pRack, int iIndex) { sendParameterUpdate(); } -void EffectChainSlot::removeFromEngine(EngineEffectRack* pRack, int iIndex) { +void EffectChainSlot::removeFromEngine(int iIndex) { // Order doesn't matter when removing. for (int i = 0; i < m_effects.size(); ++i) { EffectPointer pEffect = m_effects[i]; @@ -171,10 +170,10 @@ void EffectChainSlot::removeFromEngine(EngineEffectRack* pRack, int iIndex) { } EffectsRequest* pRequest = new EffectsRequest(); - pRequest->type = EffectsRequest::REMOVE_CHAIN_FROM_RACK; - pRequest->pTargetRack = pRack; - pRequest->RemoveChainFromRack.pChain = m_pEngineEffectChain; - pRequest->RemoveChainFromRack.iIndex = iIndex; + pRequest->type = EffectsRequest::REMOVE_EFFECT_CHAIN; + pRequest->RemoveEffectChain.signalProcessingStage = m_pEffectRack->getSignalProcessingStage(); + pRequest->RemoveEffectChain.pChain = m_pEngineEffectChain; + pRequest->RemoveEffectChain.iIndex = iIndex; m_pEffectsManager->writeRequest(pRequest); m_pEngineEffectChain = nullptr; diff --git a/src/effects/effectchainslot.h b/src/effects/effectchainslot.h index 4d2c1e175d04..2d404b6a21be 100644 --- a/src/effects/effectchainslot.h +++ b/src/effects/effectchainslot.h @@ -148,8 +148,8 @@ class EffectChainSlot : public QObject { return QString("EffectChainSlot(%1)").arg(m_group); } - void addToEngine(EngineEffectRack* pRack, int iIndex); - void removeFromEngine(EngineEffectRack* pRack, int iIndex); + void addToEngine(int iIndex); + void removeFromEngine(int iIndex); const unsigned int m_iChainSlotNumber; const QString m_group; diff --git a/src/effects/effectrack.cpp b/src/effects/effectrack.cpp index 3ab57e6395e7..b7dde0484747 100644 --- a/src/effects/effectrack.cpp +++ b/src/effects/effectrack.cpp @@ -2,15 +2,13 @@ #include "effects/effectsmanager.h" #include "effects/effectslot.h" -#include "engine/effects/engineeffectrack.h" #include "util/assert.h" EffectRack::EffectRack(EffectsManager* pEffectsManager, const unsigned int iRackNumber, const QString& group, SignalProcessingStage stage) - : m_pEngineEffectRack(nullptr), - m_pEffectsManager(pEffectsManager), + : m_pEffectsManager(pEffectsManager), m_signalProcessingStage(stage), m_iRackNumber(iRackNumber), m_group(group), @@ -19,41 +17,13 @@ EffectRack::EffectRack(EffectsManager* pEffectsManager, connect(&m_controlClearRack, SIGNAL(valueChanged(double)), this, SLOT(slotClearRack(double))); m_controlNumEffectChainSlots.setReadOnly(); - addToEngine(); } EffectRack::~EffectRack() { m_effectChainSlots.clear(); - removeFromEngine(); //qDebug() << "EffectRack::~EffectRack()"; } -EngineEffectRack* EffectRack::getEngineEffectRack() { - return m_pEngineEffectRack; -} - -void EffectRack::addToEngine() { - m_pEngineEffectRack = new EngineEffectRack(m_iRackNumber); - EffectsRequest* pRequest = new EffectsRequest(); - pRequest->type = EffectsRequest::ADD_EFFECT_RACK; - pRequest->AddEffectRack.pRack = m_pEngineEffectRack; - pRequest->AddEffectRack.signalProcessingStage = m_signalProcessingStage; - m_pEffectsManager->writeRequest(pRequest); - - for (int i = 0; i < m_effectChainSlots.size(); ++i) { - EffectChainSlotPointer pSlot = m_effectChainSlots[i]; - } -} - -void EffectRack::removeFromEngine() { - EffectsRequest* pRequest = new EffectsRequest(); - pRequest->type = EffectsRequest::REMOVE_EFFECT_RACK; - pRequest->RemoveEffectRack.signalProcessingStage = m_signalProcessingStage; - pRequest->RemoveEffectRack.pRack = m_pEngineEffectRack; - m_pEffectsManager->writeRequest(pRequest); - m_pEngineEffectRack = NULL; -} - void EffectRack::registerInputChannel(const ChannelHandleAndGroup& handle_group) { foreach (EffectChainSlotPointer pChainSlot, m_effectChainSlots) { pChainSlot->registerInputChannel(handle_group); diff --git a/src/effects/effectrack.h b/src/effects/effectrack.h index d2daa6dfb3fa..617d22fc3fcc 100644 --- a/src/effects/effectrack.h +++ b/src/effects/effectrack.h @@ -10,7 +10,6 @@ #include "engine/channelhandle.h" #include "effects/defs.h" -class EngineEffectRack; class EffectsManager; #include "effects/effectchainslot.h" @@ -24,10 +23,6 @@ class EffectRack : public QObject { const QString& group, SignalProcessingStage stage); virtual ~EffectRack(); - void addToEngine(); - void removeFromEngine(); - EngineEffectRack* getEngineEffectRack(); - void registerInputChannel(const ChannelHandleAndGroup& handle_group); int numEffectChainSlots() const; EffectChainSlotPointer getEffectChainSlot(int i); @@ -44,6 +39,10 @@ class EffectRack : public QObject { return m_group; } + SignalProcessingStage getSignalProcessingStage() const { + return m_signalProcessingStage; + } + void refresh(); QDomElement toXml(QDomDocument* doc) const; @@ -64,8 +63,6 @@ class EffectRack : public QObject { protected: void addEffectChainSlotInternal(EffectChainSlotPointer pChainSlot); - EngineEffectRack* m_pEngineEffectRack; - // We could make accessors for these for sub-classes. Doesn't really matter. EffectsManager* m_pEffectsManager; diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index ffc55202ca1e..18425748cee7 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -10,7 +10,6 @@ #include "effects/effectslot.h" #include "effects/effectxmlelements.h" #include "engine/effects/engineeffect.h" -#include "engine/effects/engineeffectrack.h" #include "engine/effects/engineeffectchain.h" #include "util/assert.h" @@ -515,16 +514,11 @@ void EffectsManager::collectGarbage(const EffectsRequest* pRequest) { qDebug() << debugString() << "delete" << pRequest->RemoveEffectFromChain.pEffect; } delete pRequest->RemoveEffectFromChain.pEffect; - } else if (pRequest->type == EffectsRequest::REMOVE_CHAIN_FROM_RACK) { + } else if (pRequest->type == EffectsRequest::REMOVE_EFFECT_CHAIN) { if (kEffectDebugOutput) { qDebug() << debugString() << "delete" << pRequest->RemoveEffectFromChain.pEffect; } - delete pRequest->RemoveChainFromRack.pChain; - } else if (pRequest->type == EffectsRequest::REMOVE_EFFECT_RACK) { - if (kEffectDebugOutput) { - qDebug() << debugString() << "delete" << pRequest->RemoveEffectRack.pRack; - } - delete pRequest->RemoveEffectRack.pRack; + delete pRequest->RemoveEffectChain.pChain; } else if (pRequest->type == EffectsRequest::DISABLE_EFFECT_CHAIN_FOR_INPUT_CHANNEL) { if (kEffectDebugOutput) { qDebug() << debugString() << "deleting states for input channel" << pRequest->DisableInputChannelForChain.pChannelHandle << "for EngineEffectChain" << pRequest->pTargetChain; diff --git a/src/engine/effects/engineeffectrack.cpp b/src/engine/effects/engineeffectrack.cpp deleted file mode 100644 index e9e648b61136..000000000000 --- a/src/engine/effects/engineeffectrack.cpp +++ /dev/null @@ -1,140 +0,0 @@ -#include "engine/effects/engineeffectrack.h" -#include "engine/effects/engineeffectchain.h" -#include "util/defs.h" -#include "util/sample.h" - -EngineEffectRack::EngineEffectRack(int iRackNumber) - : m_iRackNumber(iRackNumber), - m_buffer1(MAX_BUFFER_LEN), - m_buffer2(MAX_BUFFER_LEN) { - // Try to prevent memory allocation. - m_chains.reserve(256); -} - -EngineEffectRack::~EngineEffectRack() { - //qDebug() << "EngineEffectRack::~EngineEffectRack()" << this; -} - -bool EngineEffectRack::processEffectsRequest(EffectsRequest& message, - EffectsResponsePipe* pResponsePipe) { - EffectsResponse response(message); - switch (message.type) { - case EffectsRequest::ADD_CHAIN_TO_RACK: - if (kEffectDebugOutput) { - qDebug() << debugString() << "ADD_CHAIN_TO_RACK" - << message.AddChainToRack.pChain - << message.AddChainToRack.iIndex; - } - response.success = addEffectChain(message.AddChainToRack.pChain, - message.AddChainToRack.iIndex); - break; - case EffectsRequest::REMOVE_CHAIN_FROM_RACK: - if (kEffectDebugOutput) { - qDebug() << debugString() << "REMOVE_CHAIN_FROM_RACK" - << message.RemoveChainFromRack.pChain - << message.RemoveChainFromRack.iIndex; - } - response.success = removeEffectChain(message.RemoveChainFromRack.pChain, - message.RemoveChainFromRack.iIndex); - break; - default: - return false; - } - pResponsePipe->writeMessages(&response, 1); - return true; -} - -bool EngineEffectRack::process(const ChannelHandle& inputHandle, - const ChannelHandle& outputHandle, - CSAMPLE* pIn, CSAMPLE* pOut, - const unsigned int numSamples, - const unsigned int sampleRate, - const GroupFeatureState& groupFeatures) { - bool processingOccured = false; - if (pIn == pOut) { - // Effects are applied to the buffer in place - for (EngineEffectChain* pChain : m_chains) { - if (pChain != nullptr) { - if (pChain->process(inputHandle, outputHandle, - pIn, pOut, - numSamples, sampleRate, groupFeatures)) { - processingOccured = true; - } - } - } - } else { - // Do not modify the input buffer; only fill the output buffer. - CSAMPLE* pIntermediateInput = pIn; - CSAMPLE* pIntermediateOutput; - - for (EngineEffectChain* pChain : m_chains) { - if (pChain != nullptr) { - // Select an unused intermediate buffer for the next output - if (pIntermediateInput == m_buffer1.data()) { - pIntermediateOutput = m_buffer2.data(); - } else { - pIntermediateOutput = m_buffer1.data(); - } - - if (pChain->process(inputHandle, outputHandle, - pIntermediateInput, pIntermediateOutput, - numSamples, sampleRate, groupFeatures)) { - processingOccured = true; - // Output of this chain becomes the input of the next chain. - pIntermediateInput = pIntermediateOutput; - } - } - } - // pIntermediateInput is the output of the last processed chain. It would be the - // intermediate input of the next chain if there was one. - if (processingOccured) { - SampleUtil::copy(pOut, pIntermediateInput, numSamples); - } - } - return processingOccured; -} - -bool EngineEffectRack::addEffectChain(EngineEffectChain* pChain, int iIndex) { - if (iIndex < 0) { - if (kEffectDebugOutput) { - qDebug() << debugString() - << "WARNING: ADD_CHAIN_TO_RACK message with invalid index:" - << iIndex; - } - return false; - } - if (m_chains.contains(pChain)) { - if (kEffectDebugOutput) { - qDebug() << debugString() << "WARNING: chain already added to EngineEffectRack:" - << pChain->id(); - } - return false; - } - while (iIndex >= m_chains.size()) { - m_chains.append(NULL); - } - m_chains.replace(iIndex, pChain); - return true; -} - -bool EngineEffectRack::removeEffectChain(EngineEffectChain* pChain, int iIndex) { - VERIFY_OR_DEBUG_ASSERT(iIndex < m_chains.size()) { - if (kEffectDebugOutput) { - qDebug() << debugString() - << "WARNING: REMOVE_CHAIN_FROM_RACK message with invalid index:" - << iIndex; - } - return false; - } - - if (m_chains.at(iIndex) != pChain) { - qDebug() << debugString() - << "WARNING: REMOVE_CHAIN_FROM_RACK consistency error" - << m_chains.at(iIndex) << "loaded but received request to remove" - << pChain; - return false; - } - - m_chains.replace(iIndex, NULL); - return true; -} diff --git a/src/engine/effects/engineeffectrack.h b/src/engine/effects/engineeffectrack.h deleted file mode 100644 index 1ff4d542522b..000000000000 --- a/src/engine/effects/engineeffectrack.h +++ /dev/null @@ -1,51 +0,0 @@ -#ifndef ENGINEEFFECTRACK_H -#define ENGINEEFFECTRACK_H - -#include - -#include "engine/channelhandle.h" -#include "engine/effects/message.h" -#include "engine/effects/groupfeaturestate.h" -#include "util/samplebuffer.h" - -class EngineEffectChain; - -//TODO(Be): Remove this superfluous class. -class EngineEffectRack : public EffectsRequestHandler { - public: - EngineEffectRack(int iRackNumber); - virtual ~EngineEffectRack(); - - bool processEffectsRequest( - EffectsRequest& message, - EffectsResponsePipe* pResponsePipe); - - bool process(const ChannelHandle& inputHandle, - const ChannelHandle& outputHandle, - CSAMPLE* pIn, CSAMPLE* pOut, - const unsigned int numSamples, - const unsigned int sampleRate, - const GroupFeatureState& groupFeatures); - - int number() const { - return m_iRackNumber; - } - - private: - bool addEffectChain(EngineEffectChain* pChain, int iIndex); - bool removeEffectChain(EngineEffectChain* pChain, int iIndex); - - QString debugString() const { - return QString("EngineEffectRack%1").arg(m_iRackNumber); - } - - int m_iRackNumber; - QList m_chains; - - mixxx::SampleBuffer m_buffer1; - mixxx::SampleBuffer m_buffer2; - - DISALLOW_COPY_AND_ASSIGN(EngineEffectRack); -}; - -#endif /* ENGINEEFFECTRACK_H */ diff --git a/src/engine/effects/engineeffectsmanager.cpp b/src/engine/effects/engineeffectsmanager.cpp index 0e07c6627766..8d51d5c791ba 100644 --- a/src/engine/effects/engineeffectsmanager.cpp +++ b/src/engine/effects/engineeffectsmanager.cpp @@ -1,6 +1,5 @@ #include "engine/effects/engineeffectsmanager.h" -#include "engine/effects/engineeffectrack.h" #include "engine/effects/engineeffectchain.h" #include "engine/effects/engineeffect.h" @@ -12,7 +11,6 @@ EngineEffectsManager::EngineEffectsManager(EffectsResponsePipe* pResponsePipe) m_buffer1(MAX_BUFFER_LEN), m_buffer2(MAX_BUFFER_LEN) { // Try to prevent memory allocation. - m_chains.reserve(256); m_effects.reserve(256); } @@ -25,52 +23,31 @@ void EngineEffectsManager::onCallbackStart() { EffectsResponse response(*request); bool processed = false; switch (request->type) { - case EffectsRequest::ADD_EFFECT_RACK: - case EffectsRequest::REMOVE_EFFECT_RACK: + case EffectsRequest::ADD_EFFECT_CHAIN: + case EffectsRequest::REMOVE_EFFECT_CHAIN: if (processEffectsRequest(*request, m_pResponsePipe.data())) { processed = true; } break; - case EffectsRequest::ADD_CHAIN_TO_RACK: - case EffectsRequest::REMOVE_CHAIN_FROM_RACK: - VERIFY_OR_DEBUG_ASSERT(request->pTargetRack) { - response.success = false; - response.status = EffectsResponse::NO_SUCH_RACK; - break; - } - - processed = request->pTargetRack->processEffectsRequest( - *request, m_pResponsePipe.data()); - - if (processed) { - // When an effect-chain becomes active (part of a rack), keep - // it in our master list so that we can respond to - // requests about it. - if (request->type == EffectsRequest::ADD_CHAIN_TO_RACK) { - m_chains.append(request->AddChainToRack.pChain); - } else if (request->type == EffectsRequest::REMOVE_CHAIN_FROM_RACK) { - m_chains.removeAll(request->RemoveChainFromRack.pChain); - } - } else { - if (!processed) { - // If we got here, the message was not handled for - // an unknown reason. - response.success = false; - response.status = EffectsResponse::INVALID_REQUEST; - } - } - break; case EffectsRequest::ADD_EFFECT_TO_CHAIN: case EffectsRequest::REMOVE_EFFECT_FROM_CHAIN: case EffectsRequest::SET_EFFECT_CHAIN_PARAMETERS: case EffectsRequest::ENABLE_EFFECT_CHAIN_FOR_INPUT_CHANNEL: case EffectsRequest::DISABLE_EFFECT_CHAIN_FOR_INPUT_CHANNEL: - VERIFY_OR_DEBUG_ASSERT(m_chains.contains(request->pTargetChain)) { - response.success = false; - response.status = EffectsResponse::NO_SUCH_CHAIN; - break; - } + { + bool chainExists = false; + for (auto &chains : m_chainsByStage) { + if (chains.contains(request->pTargetChain)) { + chainExists = true; + } + } + VERIFY_OR_DEBUG_ASSERT(chainExists) { + response.success = false; + response.status = EffectsResponse::NO_SUCH_CHAIN; + break; + } + } processed = request->pTargetChain->processEffectsRequest( *request, m_pResponsePipe.data()); if (processed) { @@ -179,16 +156,20 @@ void EngineEffectsManager::processInner( const CSAMPLE_GAIN oldGain, const CSAMPLE_GAIN newGain) { - const QList& racks = m_racksByStage.value(stage); + const QList& chains = m_chainsByStage.value(stage); + + bool processingOccured = false; if (pIn == pOut) { // Gain and effects are applied to the buffer in place, // modifying the original input buffer SampleUtil::applyRampingGain(pIn, oldGain, newGain, numSamples); - for (EngineEffectRack* pRack : racks) { - if (pRack != nullptr) { - pRack->process(inputHandle, outputHandle, - pIn, pIn, - numSamples, sampleRate, groupFeatures); + for (EngineEffectChain* pChain : chains) { + if (pChain != nullptr) { + if (pChain->process(inputHandle, outputHandle, + pIn, pOut, + numSamples, sampleRate, groupFeatures)) { + processingOccured = true; + } } } } else { @@ -201,7 +182,7 @@ void EngineEffectsManager::processInner( // this to mix channels into pOut regardless of whether any effects were processed. CSAMPLE* pIntermediateInput = m_buffer1.data(); if (oldGain == CSAMPLE_GAIN_ONE && newGain == CSAMPLE_GAIN_ONE) { - // Avoid an unnecessary copy. EngineEffectRack::process does not modify the + // Avoid an unnecessary copy. EngineEffectChain::process does not modify the // input buffer when its input & output buffers are different, so this is okay. pIntermediateInput = pIn; } else { @@ -210,8 +191,8 @@ void EngineEffectsManager::processInner( } CSAMPLE* pIntermediateOutput; - for (EngineEffectRack* pRack : racks) { - if (pRack != nullptr) { + for (EngineEffectChain* pChain : chains) { + if (pChain != nullptr) { // Select an unused intermediate buffer for the next output if (pIntermediateInput == m_buffer1.data()) { pIntermediateOutput = m_buffer2.data(); @@ -219,58 +200,64 @@ void EngineEffectsManager::processInner( pIntermediateOutput = m_buffer1.data(); } - if (pRack->process(inputHandle, outputHandle, - pIntermediateInput, pIntermediateOutput, - numSamples, sampleRate, groupFeatures)) { - // Output of this rack becomes the input of the next rack. + if (pChain->process(inputHandle, outputHandle, + pIntermediateInput, pIntermediateOutput, + numSamples, sampleRate, groupFeatures)) { + processingOccured = true; + // Output of this chain becomes the input of the next chain. pIntermediateInput = pIntermediateOutput; } } } - // pIntermediateInput is the output of the last processed rack. It would be the - // intermediate input of the next rack if there was one. - SampleUtil::add(pOut, pIntermediateInput, numSamples); + + // NOTE(Kshitij) : Check if we are required to add or copy the input samples to pOut + + // pIntermediateInput is the output of the last processed chain. It would be the + // intermediate input of the next chain if there was one. + if (processingOccured) { + SampleUtil::copy(pOut, pIntermediateInput, numSamples); + } } } -bool EngineEffectsManager::addEffectRack(EngineEffectRack* pRack, +bool EngineEffectsManager::addEffectChain(EngineEffectChain* pChain, SignalProcessingStage stage) { - QList& rackList = m_racksByStage[stage]; - VERIFY_OR_DEBUG_ASSERT(!rackList.contains(pRack)) { + QList& chains = m_chainsByStage[stage]; + VERIFY_OR_DEBUG_ASSERT(!chains.contains(pChain)) { return false; } - rackList.append(pRack); + chains.append(pChain); return true; } -bool EngineEffectsManager::removeEffectRack(EngineEffectRack* pRack, +bool EngineEffectsManager::removeEffectChain(EngineEffectChain* pChain, SignalProcessingStage stage) { - QList& rackList = m_racksByStage[stage]; - VERIFY_OR_DEBUG_ASSERT(rackList.contains(pRack)) { + QList& chains = m_chainsByStage[stage]; + VERIFY_OR_DEBUG_ASSERT(chains.contains(pChain)) { return false; } - return rackList.removeAll(pRack) > 0; + return chains.removeAll(pChain) > 0; } bool EngineEffectsManager::processEffectsRequest(EffectsRequest& message, EffectsResponsePipe* pResponsePipe) { EffectsResponse response(message); switch (message.type) { - case EffectsRequest::ADD_EFFECT_RACK: + case EffectsRequest::ADD_EFFECT_CHAIN: if (kEffectDebugOutput) { - qDebug() << debugString() << "ADD_EFFECT_RACK" - << message.AddEffectRack.pRack; + qDebug() << debugString() << "ADD_EFFECT_CHAIN" + << message.AddEffectChain.pChain; } - response.success = addEffectRack(message.AddEffectRack.pRack, - message.AddEffectRack.signalProcessingStage); + response.success = addEffectChain(message.AddEffectChain.pChain, + message.AddEffectChain.signalProcessingStage); break; - case EffectsRequest::REMOVE_EFFECT_RACK: + case EffectsRequest::REMOVE_EFFECT_CHAIN: if (kEffectDebugOutput) { - qDebug() << debugString() << "REMOVE_EFFECT_RACK" - << message.RemoveEffectRack.pRack; + qDebug() << debugString() << "REMOVE_EFFECT_CHAIN" + << message.AddEffectChain.pChain; } - response.success = removeEffectRack(message.AddEffectRack.pRack, - message.AddEffectRack.signalProcessingStage); + response.success = removeEffectChain(message.AddEffectChain.pChain, + message.AddEffectChain.signalProcessingStage); break; default: return false; diff --git a/src/engine/effects/engineeffectsmanager.h b/src/engine/effects/engineeffectsmanager.h index d40406c281da..c7c754d161ce 100644 --- a/src/engine/effects/engineeffectsmanager.h +++ b/src/engine/effects/engineeffectsmanager.h @@ -10,7 +10,6 @@ #include "engine/effects/groupfeaturestate.h" #include "engine/channelhandle.h" -class EngineEffectRack; class EngineEffectChain; class EngineEffect; @@ -64,14 +63,8 @@ class EngineEffectsManager : public EffectsRequestHandler { return QString("EngineEffectsManager"); } - bool addEffectRack(EngineEffectRack* pRack, SignalProcessingStage stage); - bool removeEffectRack(EngineEffectRack* pRack, SignalProcessingStage stage); - - bool addPreFaderEffectRack(EngineEffectRack* pRack); - bool removePreFaderEffectRack(EngineEffectRack* pRack); - - bool addPostFaderEffectRack(EngineEffectRack* pRack); - bool removePostFaderEffectRack(EngineEffectRack* pRack); + bool addEffectChain(EngineEffectChain* pChain, SignalProcessingStage stage); + bool removeEffectChain(EngineEffectChain* pChain, SignalProcessingStage stage); void processInner(const SignalProcessingStage stage, const ChannelHandle& inputHandle, @@ -84,8 +77,7 @@ class EngineEffectsManager : public EffectsRequestHandler { const CSAMPLE_GAIN newGain = CSAMPLE_GAIN_ONE); QScopedPointer m_pResponsePipe; - QHash> m_racksByStage; - QList m_chains; + QHash> m_chainsByStage; QList m_effects; mixxx::SampleBuffer m_buffer1; diff --git a/src/engine/effects/message.h b/src/engine/effects/message.h index 08a974ebe5d3..ac2afc018a14 100644 --- a/src/engine/effects/message.h +++ b/src/engine/effects/message.h @@ -10,21 +10,14 @@ #include "effects/defs.h" #include "engine/channelhandle.h" -class EngineEffectRack; class EngineEffectChain; class EngineEffect; struct EffectsRequest { enum MessageType { - // Messages for EngineEffectsManager - ADD_EFFECT_RACK = 0, - REMOVE_EFFECT_RACK, - - // Messages for EngineEffectRack - ADD_CHAIN_TO_RACK, - REMOVE_CHAIN_FROM_RACK, - // Messages for EngineEffectChain + ADD_EFFECT_CHAIN, + REMOVE_EFFECT_CHAIN, SET_EFFECT_CHAIN_PARAMETERS, ADD_EFFECT_TO_CHAIN, REMOVE_EFFECT_FROM_CHAIN, @@ -48,14 +41,11 @@ struct EffectsRequest { maximum(0.0), default_value(0.0), value(0.0) { - pTargetRack = nullptr; pTargetChain = nullptr; pTargetEffect = nullptr; #define CLEAR_STRUCT(x) memset(&x, 0, sizeof(x)); - CLEAR_STRUCT(AddEffectRack); - CLEAR_STRUCT(RemoveEffectRack); - CLEAR_STRUCT(AddChainToRack); - CLEAR_STRUCT(RemoveChainFromRack); + CLEAR_STRUCT(AddEffectChain); + CLEAR_STRUCT(RemoveEffectChain); CLEAR_STRUCT(EnableInputChannelForChain); CLEAR_STRUCT(DisableInputChannelForChain); CLEAR_STRUCT(AddEffectToChain); @@ -85,10 +75,6 @@ struct EffectsRequest { // Target of the message. union { - // Used by: - // - ADD_CHAIN_TO_RACK - // - REMOVE_CHAIN_FROM_RACK - EngineEffectRack* pTargetRack; // Used by: // - ADD_EFFECT_TO_CHAIN // - REMOVE_EFFECT_FROM_CHAIN @@ -103,22 +89,16 @@ struct EffectsRequest { // Message-specific data. union { - struct { - EngineEffectRack* pRack; - SignalProcessingStage signalProcessingStage; - } AddEffectRack; - struct { - EngineEffectRack* pRack; - SignalProcessingStage signalProcessingStage; - } RemoveEffectRack; struct { EngineEffectChain* pChain; int iIndex; - } AddChainToRack; + SignalProcessingStage signalProcessingStage; + } AddEffectChain; struct { EngineEffectChain* pChain; int iIndex; - } RemoveChainFromRack; + SignalProcessingStage signalProcessingStage; + } RemoveEffectChain; struct { EffectStatesMapArray* pEffectStatesMapArray; const ChannelHandle* pChannelHandle; @@ -158,7 +138,6 @@ struct EffectsResponse { enum StatusCode { OK, UNHANDLED_MESSAGE_TYPE, - NO_SUCH_RACK, NO_SUCH_CHAIN, NO_SUCH_EFFECT, NO_SUCH_PARAMETER, From fcbca5d772f44e44f158dced5a28afdef7438e3a Mon Sep 17 00:00:00 2001 From: Kshitij Gupta Date: Wed, 27 Jun 2018 17:29:33 +0530 Subject: [PATCH 004/443] Removed EffectRack layer - Removed the superfluous layer `EffectRack` above all the effect chain slots - The subclasses of former `EffectRack` class are now subclasses of `EffectChainSlot` NOTE: XML saving/loading of effects is broken and will be re-implemented in the new architecture --- build/depends.py | 2 +- src/controllers/controlpickermenu.cpp | 483 ++++++++++---------- src/effects/defs.h | 27 +- src/effects/effectchainslot.cpp | 80 ++-- src/effects/effectchainslot.h | 60 +-- src/effects/effectrack.cpp | 366 --------------- src/effects/effectrack.h | 247 ---------- src/effects/effectslot.cpp | 14 +- src/effects/effectslot.h | 12 - src/effects/effectsmanager.cpp | 236 ++++------ src/effects/effectsmanager.h | 62 +-- src/effects/specialeffectchainslots.cpp | 186 ++++++++ src/effects/specialeffectchainslots.h | 54 +++ src/engine/effects/engineeffectsmanager.cpp | 4 +- src/engine/effects/message.h | 1 - src/mixer/playermanager.cpp | 13 +- src/mixxx.cpp | 3 - src/preferences/dialog/dlgprefeq.cpp | 36 +- src/preferences/dialog/dlgprefeq.h | 4 - src/preferences/dialog/dlgpreflv2.cpp | 2 +- src/test/effectslottest.cpp | 12 +- src/test/metaknob_link_test.cpp | 14 +- src/widget/effectwidgetutils.h | 39 +- src/widget/weffect.cpp | 4 +- src/widget/weffectbuttonparameter.cpp | 4 +- src/widget/weffectchain.cpp | 4 +- src/widget/weffectparameter.cpp | 4 +- src/widget/weffectselector.cpp | 7 +- src/widget/weffectselector.h | 2 - 29 files changed, 727 insertions(+), 1255 deletions(-) delete mode 100644 src/effects/effectrack.cpp delete mode 100644 src/effects/effectrack.h create mode 100644 src/effects/specialeffectchainslots.cpp create mode 100644 src/effects/specialeffectchainslots.h diff --git a/build/depends.py b/build/depends.py index 10239de519aa..e42a535d7d7e 100644 --- a/build/depends.py +++ b/build/depends.py @@ -696,8 +696,8 @@ def sources(self, build): "effects/effect.cpp", "effects/effectparameter.cpp", - "effects/effectrack.cpp", "effects/effectchainslot.cpp", + "effects/specialeffectchainslots.cpp", "effects/effectslot.cpp", "effects/effectparameterslotbase.cpp", "effects/effectparameterslot.cpp", diff --git a/src/controllers/controlpickermenu.cpp b/src/controllers/controlpickermenu.cpp index 17f3f49ba7c2..b4d6193bb2b3 100644 --- a/src/controllers/controlpickermenu.cpp +++ b/src/controllers/controlpickermenu.cpp @@ -4,8 +4,8 @@ #include "mixer/playermanager.h" #include "engine/cuecontrol.h" #include "engine/loopingcontrol.h" -#include "effects/effectrack.h" #include "effects/effectchainslot.h" +#include "effects/specialeffectchainslots.h" #include "effects/effectslot.h" #include "effects/effectparameterslot.h" @@ -150,38 +150,35 @@ ControlPickerMenu::ControlPickerMenu(QWidget* pParent) tr("Temporarily decrease speed (fine)"), speedMenu); // EQs - QMenu* eqMenu = addSubmenu(tr("Equalizers")); - const int kNumEqRacks = 1; + QMenu* eqMenu = addSubmenu(tr("Equalizers")); // const int kNumEqRacks = 1; const int iNumDecks = ControlObject::get(ConfigKey("[Master]", "num_decks")); - for (int iRackNumber = 0; iRackNumber < kNumEqRacks; ++iRackNumber) { - // TODO: Although there is a mode with 4-band EQs, it's not feasible - // right now to add support for learning both it and regular 3-band eqs. - // Since 3-band is by far the most common, stick with that. - const int kMaxEqs = 3; - QList eqNames; - eqNames.append(tr("Low EQ")); - eqNames.append(tr("Mid EQ")); - eqNames.append(tr("High EQ")); - for (int deck = 1; deck <= iNumDecks; ++deck) { - QMenu* deckMenu = addSubmenu(QString("Deck %1").arg(deck), eqMenu); - for (int effect = kMaxEqs - 1; effect >= 0; --effect) { - const QString group = EqualizerRack::formatEffectSlotGroupString( - iRackNumber, 0, QString("[Channel%1]").arg(deck)); - QMenu* bandMenu = addSubmenu(eqNames[effect], deckMenu); - QString control = "parameter%1"; - addPrefixedControl(group, control.arg(effect+1), - tr("Adjust %1").arg(eqNames[effect]), - tr("Adjust %1").arg(eqNames[effect]), - tr("Deck %1").arg(deck), - bandMenu, true); - - control = "button_parameter%1"; - addPrefixedControl(group, control.arg(effect+1), - tr("Kill %1").arg(eqNames[effect]), - tr("Kill %1").arg(eqNames[effect]), - tr("Deck %1").arg(deck), - bandMenu, false); - } + // TODO: Although there is a mode with 4-band EQs, it's not feasible + // right now to add support for learning both it and regular 3-band eqs. + // Since 3-band is by far the most common, stick with that. + const int kMaxEqs = 3; + QList eqNames; + eqNames.append(tr("Low EQ")); + eqNames.append(tr("Mid EQ")); + eqNames.append(tr("High EQ")); + for (int deck = 1; deck <= iNumDecks; ++deck) { + QMenu* deckMenu = addSubmenu(QString("Deck %1").arg(deck), eqMenu); + for (int effect = kMaxEqs - 1; effect >= 0; --effect) { + const QString group = EqualizerEffectChainSlot::formatEffectSlotGroup( + PlayerManager::groupForDeck(deck)); + QMenu* bandMenu = addSubmenu(eqNames[effect], deckMenu); + QString control = "parameter%1"; + addPrefixedControl(group, control.arg(effect+1), + tr("Adjust %1").arg(eqNames[effect]), + tr("Adjust %1").arg(eqNames[effect]), + tr("Deck %1").arg(deck), + bandMenu, true); + + control = "button_parameter%1"; + addPrefixedControl(group, control.arg(effect+1), + tr("Kill %1").arg(eqNames[effect]), + tr("Kill %1").arg(eqNames[effect]), + tr("Deck %1").arg(deck), + bandMenu, false); } } @@ -432,7 +429,7 @@ ControlPickerMenu::ControlPickerMenu(QWidget* pParent) tr("Replace Auto DJ Queue with selected tracks"), m_libraryStr, libraryMenu); - + // Load track (these can be loaded into any channel) addDeckAndSamplerControl("LoadSelectedTrack", tr("Load Track"), @@ -459,226 +456,220 @@ ControlPickerMenu::ControlPickerMenu(QWidget* pParent) quickEffectMenu); } - const int kNumEffectRacks = 1; - for (int iRackNumber = 1; iRackNumber <= kNumEffectRacks; ++iRackNumber) { - const QString rackGroup = StandardEffectRack::formatGroupString( - iRackNumber - 1); - QMenu* rackMenu = addSubmenu(m_effectRackStr.arg(iRackNumber), effectsMenu); - QString descriptionPrefix = m_effectRackStr.arg(iRackNumber); - - addPrefixedControl(rackGroup, "clear", - tr("Clear Effect Rack"), tr("Clear effect rack"), - descriptionPrefix, rackMenu); - - const int numEffectUnits = ControlObject::get( - ConfigKey(rackGroup, "num_effectunits")); - for (int iEffectUnitNumber = 1; iEffectUnitNumber <= numEffectUnits; - ++iEffectUnitNumber) { - const QString effectUnitGroup = - StandardEffectRack::formatEffectChainSlotGroupString( - iRackNumber - 1, iEffectUnitNumber - 1); - - descriptionPrefix = QString("%1, %2").arg(m_effectRackStr.arg(iRackNumber), - m_effectUnitStr.arg(iEffectUnitNumber)); - - QMenu* effectUnitMenu = addSubmenu(m_effectUnitStr.arg(iEffectUnitNumber), - rackMenu); - addPrefixedControl(effectUnitGroup, "clear", - tr("Clear Unit"), - tr("Clear effect unit"), descriptionPrefix, - effectUnitMenu); - addPrefixedControl(effectUnitGroup, "enabled", - tr("Toggle Unit"), - tr("Enable or disable effect processing"), descriptionPrefix, - effectUnitMenu, false); - addPrefixedControl(effectUnitGroup, "mix", - tr("Dry/Wet"), - tr("Adjust the balance between the original (dry) and processed (wet) signal."), descriptionPrefix, - effectUnitMenu, true); - addPrefixedControl(effectUnitGroup, "super1", - tr("Super Knob"), - tr("Super Knob (control effects' Meta Knobs)"), - descriptionPrefix, - effectUnitMenu, true); - addPrefixedControl(effectUnitGroup, "Mix Mode", - tr("Mix Mode Toggle"), - tr("Toggle effect unit between D/W and D+W modes"), - descriptionPrefix, - effectUnitMenu); - addPrefixedControl(effectUnitGroup, "next_chain", - tr("Next Chain"), - tr("Next chain preset"), descriptionPrefix, - effectUnitMenu); - addPrefixedControl(effectUnitGroup, "prev_chain", - tr("Previous Chain"), - tr("Previous chain preset"), descriptionPrefix, - effectUnitMenu); - addPrefixedControl(effectUnitGroup, "chain_selector", - tr("Next/Previous Chain"), - tr("Next or previous chain preset"), descriptionPrefix, - effectUnitMenu); - addPrefixedControl(effectUnitGroup, "show_parameters", - tr("Show Effect Parameters"), - tr("Show Effect Parameters"), descriptionPrefix, - effectUnitMenu); - - QString enableOn = tr("Toggle Effect Unit"); - QMenu* effectUnitGroups = addSubmenu(enableOn, - effectUnitMenu); - - QString groupDescriptionPrefix = QString("%1, %2 %3").arg( - m_effectRackStr.arg(iRackNumber), - m_effectUnitStr.arg(iEffectUnitNumber), - enableOn); - - addPrefixedControl(effectUnitGroup, "group_[Master]_enable", - m_effectMasterOutputStr, - m_effectMasterOutputStr, groupDescriptionPrefix, + const QString rackGroup = "[EffectRack1]"; + QMenu* rackMenu = addSubmenu(m_effectRackStr.arg(1), effectsMenu); + QString descriptionPrefix = m_effectRackStr.arg(1); + + addPrefixedControl(rackGroup, "clear", + tr("Clear Effect Rack"), tr("Clear effect rack"), + descriptionPrefix, rackMenu); + + const int numEffectUnits = ControlObject::get( + ConfigKey(rackGroup, "num_effectunits")); + for (int iEffectUnitNumber = 1; iEffectUnitNumber <= numEffectUnits; + ++iEffectUnitNumber) { + const QString effectUnitGroup = + StandardEffectChainSlot::formatEffectChainSlotGroup(iEffectUnitNumber - 1); + + descriptionPrefix = QString("%1, %2").arg(m_effectRackStr.arg(1), + m_effectUnitStr.arg(iEffectUnitNumber)); + + QMenu* effectUnitMenu = addSubmenu(m_effectUnitStr.arg(iEffectUnitNumber), + rackMenu); + addPrefixedControl(effectUnitGroup, "clear", + tr("Clear Unit"), + tr("Clear effect unit"), descriptionPrefix, + effectUnitMenu); + addPrefixedControl(effectUnitGroup, "enabled", + tr("Toggle Unit"), + tr("Enable or disable effect processing"), descriptionPrefix, + effectUnitMenu, false); + addPrefixedControl(effectUnitGroup, "mix", + tr("Dry/Wet"), + tr("Adjust the balance between the original (dry) and processed (wet) signal."), descriptionPrefix, + effectUnitMenu, true); + addPrefixedControl(effectUnitGroup, "super1", + tr("Super Knob"), + tr("Super Knob (control effects' Meta Knobs)"), + descriptionPrefix, + effectUnitMenu, true); + addPrefixedControl(effectUnitGroup, "Mix Mode", + tr("Mix Mode Toggle"), + tr("Toggle effect unit between D/W and D+W modes"), + descriptionPrefix, + effectUnitMenu); + addPrefixedControl(effectUnitGroup, "next_chain", + tr("Next Chain"), + tr("Next chain preset"), descriptionPrefix, + effectUnitMenu); + addPrefixedControl(effectUnitGroup, "prev_chain", + tr("Previous Chain"), + tr("Previous chain preset"), descriptionPrefix, + effectUnitMenu); + addPrefixedControl(effectUnitGroup, "chain_selector", + tr("Next/Previous Chain"), + tr("Next or previous chain preset"), descriptionPrefix, + effectUnitMenu); + addPrefixedControl(effectUnitGroup, "show_parameters", + tr("Show Effect Parameters"), + tr("Show Effect Parameters"), descriptionPrefix, + effectUnitMenu); + + QString enableOn = tr("Toggle Effect Unit"); + QMenu* effectUnitGroups = addSubmenu(enableOn, + effectUnitMenu); + + QString groupDescriptionPrefix = QString("%1, %2 %3").arg( + m_effectRackStr.arg(1), + m_effectUnitStr.arg(iEffectUnitNumber), + enableOn); + + addPrefixedControl(effectUnitGroup, "group_[Master]_enable", + m_effectMasterOutputStr, + m_effectMasterOutputStr, groupDescriptionPrefix, + effectUnitGroups); + addPrefixedControl(effectUnitGroup, "group_[Headphone]_enable", + m_effectHeadphoneOutputStr, + m_effectHeadphoneOutputStr, groupDescriptionPrefix, + effectUnitGroups); + + const int iNumDecks = ControlObject::get( + ConfigKey("[Master]", "num_decks")); + for (int iDeckNumber = 1; iDeckNumber <= iNumDecks; ++iDeckNumber) { + // PlayerManager::groupForDeck is 0-indexed. + QString playerGroup = PlayerManager::groupForDeck(iDeckNumber - 1); + // TODO(owen): Fix bad i18n here. + addPrefixedControl(effectUnitGroup, + QString("group_%1_enable").arg(playerGroup), + tr("Assign ") + m_deckStr.arg(iDeckNumber), + tr("Assign ") + m_deckStr.arg(iDeckNumber), + groupDescriptionPrefix, effectUnitGroups); - addPrefixedControl(effectUnitGroup, "group_[Headphone]_enable", - m_effectHeadphoneOutputStr, - m_effectHeadphoneOutputStr, groupDescriptionPrefix, - effectUnitGroups); - - const int iNumDecks = ControlObject::get( - ConfigKey("[Master]", "num_decks")); - for (int iDeckNumber = 1; iDeckNumber <= iNumDecks; ++iDeckNumber) { - // PlayerManager::groupForDeck is 0-indexed. - QString playerGroup = PlayerManager::groupForDeck(iDeckNumber - 1); - // TODO(owen): Fix bad i18n here. - addPrefixedControl(effectUnitGroup, - QString("group_%1_enable").arg(playerGroup), - tr("Assign ") + m_deckStr.arg(iDeckNumber), - tr("Assign ") + m_deckStr.arg(iDeckNumber), - groupDescriptionPrefix, - effectUnitGroups); - } - - const int iNumSamplers = ControlObject::get( - ConfigKey("[Master]", "num_samplers")); - for (int iSamplerNumber = 1; iSamplerNumber <= iNumSamplers; - ++iSamplerNumber) { - // PlayerManager::groupForSampler is 0-indexed. - QString playerGroup = PlayerManager::groupForSampler(iSamplerNumber - 1); - // TODO(owen): Fix bad i18n here. - addPrefixedControl(effectUnitGroup, - QString("group_%1_enable").arg(playerGroup), - tr("Assign ") + m_samplerStr.arg(iSamplerNumber), - tr("Assign ") + m_samplerStr.arg(iSamplerNumber), - groupDescriptionPrefix, - effectUnitGroups); + } - } + const int iNumSamplers = ControlObject::get( + ConfigKey("[Master]", "num_samplers")); + for (int iSamplerNumber = 1; iSamplerNumber <= iNumSamplers; + ++iSamplerNumber) { + // PlayerManager::groupForSampler is 0-indexed. + QString playerGroup = PlayerManager::groupForSampler(iSamplerNumber - 1); + // TODO(owen): Fix bad i18n here. + addPrefixedControl(effectUnitGroup, + QString("group_%1_enable").arg(playerGroup), + tr("Assign ") + m_samplerStr.arg(iSamplerNumber), + tr("Assign ") + m_samplerStr.arg(iSamplerNumber), + groupDescriptionPrefix, + effectUnitGroups); + } - const int iNumMicrophones = ControlObject::get( - ConfigKey("[Master]", "num_microphones")); - for (int iMicrophoneNumber = 1; iMicrophoneNumber <= iNumMicrophones; - ++iMicrophoneNumber) { - QString micGroup = PlayerManager::groupForMicrophone(iMicrophoneNumber - 1); - // TODO(owen): Fix bad i18n here. - addPrefixedControl(effectUnitGroup, - QString("group_%1_enable").arg(micGroup), - tr("Assign ") + m_microphoneStr.arg(iMicrophoneNumber), - tr("Assign ") + m_microphoneStr.arg(iMicrophoneNumber), - groupDescriptionPrefix, - effectUnitGroups); - } + const int iNumMicrophones = ControlObject::get( + ConfigKey("[Master]", "num_microphones")); + for (int iMicrophoneNumber = 1; iMicrophoneNumber <= iNumMicrophones; + ++iMicrophoneNumber) { + QString micGroup = PlayerManager::groupForMicrophone(iMicrophoneNumber - 1); + // TODO(owen): Fix bad i18n here. + addPrefixedControl(effectUnitGroup, + QString("group_%1_enable").arg(micGroup), + tr("Assign ") + m_microphoneStr.arg(iMicrophoneNumber), + tr("Assign ") + m_microphoneStr.arg(iMicrophoneNumber), + groupDescriptionPrefix, + effectUnitGroups); + } - const int iNumAuxiliaries = ControlObject::get( - ConfigKey("[Master]", "num_auxiliaries")); - for (int iAuxiliaryNumber = 1; iAuxiliaryNumber <= iNumAuxiliaries; - ++iAuxiliaryNumber) { - QString auxGroup = PlayerManager::groupForAuxiliary(iAuxiliaryNumber - 1); - // TODO(owen): Fix bad i18n here. - addPrefixedControl(effectUnitGroup, - QString("group_%1_enable").arg(auxGroup), - tr("Assign ") + m_auxStr.arg(iAuxiliaryNumber), - tr("Assign ") + m_auxStr.arg(iAuxiliaryNumber), - groupDescriptionPrefix, - effectUnitGroups); - } + const int iNumAuxiliaries = ControlObject::get( + ConfigKey("[Master]", "num_auxiliaries")); + for (int iAuxiliaryNumber = 1; iAuxiliaryNumber <= iNumAuxiliaries; + ++iAuxiliaryNumber) { + QString auxGroup = PlayerManager::groupForAuxiliary(iAuxiliaryNumber - 1); + // TODO(owen): Fix bad i18n here. + addPrefixedControl(effectUnitGroup, + QString("group_%1_enable").arg(auxGroup), + tr("Assign ") + m_auxStr.arg(iAuxiliaryNumber), + tr("Assign ") + m_auxStr.arg(iAuxiliaryNumber), + groupDescriptionPrefix, + effectUnitGroups); + } - const int numEffectSlots = ControlObject::get( - ConfigKey(effectUnitGroup, "num_effectslots")); - for (int iEffectSlotNumber = 1; iEffectSlotNumber <= numEffectSlots; - ++iEffectSlotNumber) { - const QString effectSlotGroup = - StandardEffectRack::formatEffectSlotGroupString( - iRackNumber - 1, iEffectUnitNumber - 1, + const int numEffectSlots = ControlObject::get( + ConfigKey(effectUnitGroup, "num_effectslots")); + for (int iEffectSlotNumber = 1; iEffectSlotNumber <= numEffectSlots; + ++iEffectSlotNumber) { + const QString effectSlotGroup = + StandardEffectChainSlot::formatEffectSlotGroup( + iEffectUnitNumber - 1, + iEffectSlotNumber - 1); + + QMenu* effectSlotMenu = addSubmenu(m_effectStr.arg(iEffectSlotNumber), + effectUnitMenu); + + QString slotDescriptionPrefix = + QString("%1, %2").arg(descriptionPrefix, + m_effectStr.arg(iEffectSlotNumber)); + + addPrefixedControl(effectSlotGroup, "clear", + tr("Clear"), tr("Clear the current effect"), + slotDescriptionPrefix, + effectSlotMenu); + addPrefixedControl(effectSlotGroup, "meta", + tr("Meta Knob"), tr("Effect Meta Knob (control linked effect parameters)"), + slotDescriptionPrefix, + effectSlotMenu); + addPrefixedControl(effectSlotGroup, "enabled", + tr("Toggle"), tr("Toggle the current effect"), + slotDescriptionPrefix, + effectSlotMenu); + addPrefixedControl(effectSlotGroup, "next_effect", + tr("Next"), tr("Switch to next effect"), + slotDescriptionPrefix, + effectSlotMenu); + addPrefixedControl(effectSlotGroup, "prev_effect", + tr("Previous"), tr("Switch to the previous effect"), + slotDescriptionPrefix, + effectSlotMenu); + addPrefixedControl(effectSlotGroup, "effect_selector", + tr("Next or Previous"), + tr("Switch to either next or previous effect"), + slotDescriptionPrefix, + effectSlotMenu); + + const int numParameterSlots = ControlObject::get( + ConfigKey(effectSlotGroup, "num_parameterslots")); + for (int iParameterSlotNumber = 1; iParameterSlotNumber <= numParameterSlots; + ++iParameterSlotNumber) { + // The parameter slot group is the same as the effect slot + // group on a standard effect rack. + const QString parameterSlotGroup = + StandardEffectChainSlot::formatEffectSlotGroup( + iEffectUnitNumber - 1, iEffectSlotNumber - 1); + const QString parameterSlotItemPrefix = EffectParameterSlot::formatItemPrefix( + iParameterSlotNumber - 1); + QMenu* parameterSlotMenu = addSubmenu( + m_parameterStr.arg(iParameterSlotNumber), + effectSlotMenu); + + QString parameterDescriptionPrefix = + QString("%1, %2").arg(slotDescriptionPrefix, + m_parameterStr.arg(iParameterSlotNumber)); + + // Likely to change soon. + addPrefixedControl(parameterSlotGroup, parameterSlotItemPrefix, + tr("Parameter Value"), + tr("Parameter Value"), + parameterDescriptionPrefix, + parameterSlotMenu, true); + + addPrefixedControl(parameterSlotGroup, parameterSlotItemPrefix + "_link_type", + tr("Meta Knob Mode"), + tr("Set how linked effect parameters change when turning the Meta Knob."), + parameterDescriptionPrefix, + parameterSlotMenu); + addPrefixedControl(parameterSlotGroup, parameterSlotItemPrefix + "_link_inverse", + tr("Meta Knob Mode Invert"), + tr("Invert how linked effect parameters change when turning the Meta Knob."), + parameterDescriptionPrefix, + parameterSlotMenu); - QMenu* effectSlotMenu = addSubmenu(m_effectStr.arg(iEffectSlotNumber), - effectUnitMenu); - - QString slotDescriptionPrefix = - QString("%1, %2").arg(descriptionPrefix, - m_effectStr.arg(iEffectSlotNumber)); - - addPrefixedControl(effectSlotGroup, "clear", - tr("Clear"), tr("Clear the current effect"), - slotDescriptionPrefix, - effectSlotMenu); - addPrefixedControl(effectSlotGroup, "meta", - tr("Meta Knob"), tr("Effect Meta Knob (control linked effect parameters)"), - slotDescriptionPrefix, - effectSlotMenu); - addPrefixedControl(effectSlotGroup, "enabled", - tr("Toggle"), tr("Toggle the current effect"), - slotDescriptionPrefix, - effectSlotMenu); - addPrefixedControl(effectSlotGroup, "next_effect", - tr("Next"), tr("Switch to next effect"), - slotDescriptionPrefix, - effectSlotMenu); - addPrefixedControl(effectSlotGroup, "prev_effect", - tr("Previous"), tr("Switch to the previous effect"), - slotDescriptionPrefix, - effectSlotMenu); - addPrefixedControl(effectSlotGroup, "effect_selector", - tr("Next or Previous"), - tr("Switch to either next or previous effect"), - slotDescriptionPrefix, - effectSlotMenu); - - const int numParameterSlots = ControlObject::get( - ConfigKey(effectSlotGroup, "num_parameterslots")); - for (int iParameterSlotNumber = 1; iParameterSlotNumber <= numParameterSlots; - ++iParameterSlotNumber) { - // The parameter slot group is the same as the effect slot - // group on a standard effect rack. - const QString parameterSlotGroup = - StandardEffectRack::formatEffectSlotGroupString( - iRackNumber - 1, iEffectUnitNumber - 1, - iEffectSlotNumber - 1); - const QString parameterSlotItemPrefix = EffectParameterSlot::formatItemPrefix( - iParameterSlotNumber - 1); - QMenu* parameterSlotMenu = addSubmenu( - m_parameterStr.arg(iParameterSlotNumber), - effectSlotMenu); - - QString parameterDescriptionPrefix = - QString("%1, %2").arg(slotDescriptionPrefix, - m_parameterStr.arg(iParameterSlotNumber)); - - // Likely to change soon. - addPrefixedControl(parameterSlotGroup, parameterSlotItemPrefix, - tr("Parameter Value"), - tr("Parameter Value"), - parameterDescriptionPrefix, - parameterSlotMenu, true); - - addPrefixedControl(parameterSlotGroup, parameterSlotItemPrefix + "_link_type", - tr("Meta Knob Mode"), - tr("Set how linked effect parameters change when turning the Meta Knob."), - parameterDescriptionPrefix, - parameterSlotMenu); - addPrefixedControl(parameterSlotGroup, parameterSlotItemPrefix + "_link_inverse", - tr("Meta Knob Mode Invert"), - tr("Invert how linked effect parameters change when turning the Meta Knob."), - parameterDescriptionPrefix, - parameterSlotMenu); - - } } } } diff --git a/src/effects/defs.h b/src/effects/defs.h index c6ce474f90e4..b3783c183757 100644 --- a/src/effects/defs.h +++ b/src/effects/defs.h @@ -44,21 +44,6 @@ class EffectState; typedef ChannelHandleMap EffectStatesMap; typedef std::array EffectStatesMapArray; -class EffectRack; -typedef QSharedPointer EffectRackPointer; - -class StandardEffectRack; -typedef QSharedPointer StandardEffectRackPointer; - -class EqualizerRack; -typedef QSharedPointer EqualizerRackPointer; - -class QuickEffectRack; -typedef QSharedPointer QuickEffectRackPointer; - -class OutputEffectRack; -typedef QSharedPointer OutputEffectRackPointer; - class EffectSlot; typedef QSharedPointer EffectSlotPointer; @@ -79,3 +64,15 @@ typedef QSharedPointer EffectParameterSlotBasePointer; class EffectChainSlot; typedef QSharedPointer EffectChainSlotPointer; + +class StandardEffectChainSlot; +typedef QSharedPointer StandardEffectChainSlotPointer; + +class EqualizerEffectChainSlot; +typedef QSharedPointer EqualizerEffectChainSlotPointer; + +class OutputEffectChainSlot; +typedef QSharedPointer OutputEffectChainSlotPointer; + +class QuickEffectChainSlot; +typedef QSharedPointer QuickEffectChainSlotPointer; diff --git a/src/effects/effectchainslot.cpp b/src/effects/effectchainslot.cpp index 62b9e8c243d7..c4591b8ca6d2 100644 --- a/src/effects/effectchainslot.cpp +++ b/src/effects/effectchainslot.cpp @@ -4,10 +4,10 @@ #include "control/controlpotmeter.h" #include "control/controlpushbutton.h" #include "effects/effectprocessor.h" -#include "effects/effectrack.h" #include "effects/effectslot.h" #include "effects/effectsmanager.h" #include "effects/effectxmlelements.h" +#include "effects/specialeffectchainslots.h" #include "engine/effects/engineeffectchain.h" #include "engine/effects/message.h" #include "engine/engine.h" @@ -18,21 +18,22 @@ #include "util/xml.h" -EffectChainSlot::EffectChainSlot(EffectRack* pRack, const QString& group, - unsigned int iChainNumber, +EffectChainSlot::EffectChainSlot(const QString& group, EffectsManager* pEffectsManager, + SignalProcessingStage stage, + const bool hasMetaknob, const QString& id) - : m_iChainSlotNumber(iChainNumber), - // The control group names are 1-indexed while internally everything + : // The control group names are 1-indexed while internally everything // is 0-indexed. m_group(group), - m_pEffectRack(pRack), m_pEffectsManager(pEffectsManager), + m_signalProcessingStage(stage), + m_bHasMetaknob(hasMetaknob), m_id(id), m_name(""), m_description(""), m_pEngineEffectChain(nullptr) { - // qDebug() << "EffectChainSlot::EffectChainSlot " << pRack << ' ' << group << ' ' << iChainNumber; + // qDebug() << "EffectChainSlot::EffectChainSlot " << group << ' ' << iChainNumber; m_pControlClear = new ControlPushButton(ConfigKey(m_group, "clear")); connect(m_pControlClear, SIGNAL(valueChanged(double)), @@ -107,7 +108,7 @@ EffectChainSlot::EffectChainSlot(EffectRack* pRack, const QString& group, true); m_pControlChainFocusedEffect->setButtonMode(ControlPushButton::TOGGLE); - addToEngine(m_iChainSlotNumber); + addToEngine(); } EffectChainSlot::~EffectChainSlot() { @@ -135,18 +136,17 @@ EffectChainSlot::~EffectChainSlot() { } m_slots.clear(); - removeFromEngine(m_iChainSlotNumber); + removeFromEngine(); } -void EffectChainSlot::addToEngine(int iIndex) { +void EffectChainSlot::addToEngine() { m_pEngineEffectChain = new EngineEffectChain(m_id, m_pEffectsManager->registeredInputChannels(), m_pEffectsManager->registeredOutputChannels()); EffectsRequest* pRequest = new EffectsRequest(); pRequest->type = EffectsRequest::ADD_EFFECT_CHAIN; - pRequest->AddEffectChain.signalProcessingStage = m_pEffectRack->getSignalProcessingStage(); + pRequest->AddEffectChain.signalProcessingStage = m_signalProcessingStage; pRequest->AddEffectChain.pChain = m_pEngineEffectChain; - pRequest->AddEffectChain.iIndex = iIndex; m_pEffectsManager->writeRequest(pRequest); // Add all effects. @@ -160,7 +160,7 @@ void EffectChainSlot::addToEngine(int iIndex) { sendParameterUpdate(); } -void EffectChainSlot::removeFromEngine(int iIndex) { +void EffectChainSlot::removeFromEngine() { // Order doesn't matter when removing. for (int i = 0; i < m_effects.size(); ++i) { EffectPointer pEffect = m_effects[i]; @@ -171,9 +171,8 @@ void EffectChainSlot::removeFromEngine(int iIndex) { EffectsRequest* pRequest = new EffectsRequest(); pRequest->type = EffectsRequest::REMOVE_EFFECT_CHAIN; - pRequest->RemoveEffectChain.signalProcessingStage = m_pEffectRack->getSignalProcessingStage(); + pRequest->RemoveEffectChain.signalProcessingStage = m_signalProcessingStage; pRequest->RemoveEffectChain.pChain = m_pEngineEffectChain; - pRequest->RemoveEffectChain.iIndex = iIndex; m_pEffectsManager->writeRequest(pRequest); m_pEngineEffectChain = nullptr; @@ -197,11 +196,6 @@ void EffectChainSlot::setDescription(const QString& description) { emit(updated()); } -void EffectChainSlot::setMix(const double& dMix) { - m_pControlChainMix->set(dMix); - sendParameterUpdate(); -} - void EffectChainSlot::addEffect(EffectPointer pEffect) { // qDebug() << debugString() << "addEffect" << pEffect; if (!pEffect) { @@ -220,6 +214,23 @@ void EffectChainSlot::addEffect(EffectPointer pEffect) { slotChainEffectChanged(m_effects.size() - 1); } +void EffectChainSlot::maybeLoadEffect(const unsigned int iEffectSlotNumber, + const QString& id) { + EffectSlotPointer pEffectSlot = getEffectSlot(iEffectSlotNumber); + + bool loadNew = false; + if (pEffectSlot == nullptr || pEffectSlot->getEffect() == nullptr) { + loadNew = true; + } else if (id != pEffectSlot->getEffect()->getManifest()->id()) { + loadNew = true; + } + + if (loadNew) { + EffectPointer pEffect = m_pEffectsManager->instantiateEffect(id); + replaceEffect(iEffectSlotNumber, pEffect); + } +} + void EffectChainSlot::replaceEffect(unsigned int effectSlotNumber, EffectPointer pEffect) { // qDebug() << debugString() << "replaceEffect" << effectSlotNumber << pEffect; @@ -272,6 +283,10 @@ QString EffectChainSlot::id() const { return m_id; } +QString EffectChainSlot::group() const { + return m_group; +} + double EffectChainSlot::getSuperParameter() const { return m_pControlChainSuperParameter->get(); } @@ -300,7 +315,7 @@ void EffectChainSlot::slotChainEffectChanged(unsigned int effectSlotNumber) { pEffect = m_effects.at(effectSlotNumber); } if (pSlot != nullptr) { - pSlot->loadEffect(pEffect, m_pEffectRack->isAdoptMetaknobValueEnabled()); + pSlot->loadEffect(pEffect, m_bHasMetaknob && m_pEffectsManager->isAdoptMetaknobValueEnabled()); } m_pControlNumEffects->forceSet(math_min( @@ -317,15 +332,9 @@ void EffectChainSlot::clear() { EffectSlotPointer EffectChainSlot::addEffectSlot(const QString& group) { // qDebug() << debugString() << "addEffectSlot" << group; - - EffectSlot* pEffectSlot = new EffectSlot(group, m_iChainSlotNumber, - m_slots.size()); + EffectSlot* pEffectSlot = new EffectSlot(group, m_slots.size()); connect(pEffectSlot, SIGNAL(clearEffect(unsigned int)), this, SLOT(slotClearEffect(unsigned int))); - connect(pEffectSlot, SIGNAL(nextEffect(unsigned int, unsigned int, EffectPointer)), - this, SIGNAL(nextEffect(unsigned int, unsigned int, EffectPointer))); - connect(pEffectSlot, SIGNAL(prevEffect(unsigned int, unsigned int, EffectPointer)), - this, SIGNAL(prevEffect(unsigned int, unsigned int, EffectPointer))); EffectSlotPointer pSlot(pEffectSlot); m_slots.append(pSlot); @@ -335,17 +344,12 @@ EffectSlotPointer EffectChainSlot::addEffectSlot(const QString& group) { return pSlot; } -void EffectChainSlot::registerInputChannel(const ChannelHandleAndGroup& handle_group) { +void EffectChainSlot::registerInputChannel(const ChannelHandleAndGroup& handle_group, + const double initialValue) { VERIFY_OR_DEBUG_ASSERT(!m_channelInfoByName.contains(handle_group.name())) { return; } - double initialValue = 0.0; - int deckNumber; - if (PlayerManager::isDeckGroup(handle_group.name(), &deckNumber) && - (m_iChainSlotNumber + 1) == (unsigned) deckNumber) { - initialValue = 1.0; - } ControlPushButton* pEnableControl = new ControlPushButton( ConfigKey(m_group, QString("group_%1_enable").arg(handle_group.name())), true, initialValue); @@ -358,7 +362,7 @@ void EffectChainSlot::registerInputChannel(const ChannelHandleAndGroup& handle_g m_channelInfoByName[handle_group.name()] = pInfo; // m_channelStatusMapper will emit a mapped(handle_group.name()) signal whenever - // the valueChanged(double) signal is emitted by pEnableControl + // the valueChanged(double) signal is emitted by pEnableControl m_channelStatusMapper.setMapping(pEnableControl, handle_group.name()); connect(pEnableControl, SIGNAL(valueChanged(double)), &m_channelStatusMapper, SLOT(map())); @@ -491,10 +495,6 @@ void EffectChainSlot::disableForInputChannel(const ChannelHandleAndGroup& handle m_pEffectsManager->writeRequest(request); } -unsigned int EffectChainSlot::getChainSlotNumber() const { - return m_iChainSlotNumber; -} - QDomElement EffectChainSlot::toXml(QDomDocument* doc) const { QDomElement chainElement = doc->createElement(EffectXml::Chain); diff --git a/src/effects/effectchainslot.h b/src/effects/effectchainslot.h index 2d404b6a21be..635f4cdce1aa 100644 --- a/src/effects/effectchainslot.h +++ b/src/effects/effectchainslot.h @@ -20,20 +20,21 @@ class EffectChainSlot; class EffectChainSlot : public QObject { Q_OBJECT public: - EffectChainSlot(EffectRack* pRack, - const QString& group, - const unsigned int iChainNumber, + EffectChainSlot(const QString& group, EffectsManager* pEffectsManager, + SignalProcessingStage stage = SignalProcessingStage::Postfader, + const bool hasMetaknob = true, const QString& id = QString()); virtual ~EffectChainSlot(); // Get the ID of the loaded EffectChain QString id() const; + QString group() const; - EffectSlotPointer addEffectSlot(const QString& group); EffectSlotPointer getEffectSlot(unsigned int slotNumber); - void registerInputChannel(const ChannelHandleAndGroup& handle_group); + void registerInputChannel(const ChannelHandleAndGroup& handle_group, + const double initialValue = 0.0); double getSuperParameter() const; void setSuperParameter(double value, bool force = false); @@ -42,8 +43,6 @@ class EffectChainSlot : public QObject { // Unload the loaded EffectChain. void clear(); - unsigned int getChainSlotNumber() const; - const QString& getGroup() const { return m_group; } @@ -51,12 +50,6 @@ class EffectChainSlot : public QObject { QDomElement toXml(QDomDocument* doc) const; void loadChainSlotFromXml(const QDomElement& effectChainElement); - - // Activates EffectChain processing for the provided channel. - // TODO(Kshitij) : Make this function private once EffectRack layer is removed - void enableForInputChannel(const ChannelHandleAndGroup& handle_group); - void disableForInputChannel(const ChannelHandleAndGroup& handle_group); - // Get the human-readable name of the EffectChain const QString& name() const; void setName(const QString& name); @@ -65,9 +58,6 @@ class EffectChainSlot : public QObject { QString description() const; void setDescription(const QString& description); - // TODO(Kshitij) : Remove this setter function once the EffectRack layer is removed - void setMix(const double& dMix); - static QString mixModeToString(EffectChainMixMode type) { switch (type) { case EffectChainMixMode::DrySlashWet: @@ -89,6 +79,8 @@ class EffectChainSlot : public QObject { } void addEffect(EffectPointer pEffect); + void maybeLoadEffect(const unsigned int iEffectSlotNumber, + const QString& id); void replaceEffect(unsigned int effectSlotNumber, EffectPointer pEffect); void removeEffect(unsigned int effectSlotNumber); void refreshAllEffects(); @@ -114,24 +106,23 @@ class EffectChainSlot : public QObject { // this EffectChain (by removing the chain from this EffectChainSlot). void clearChain(unsigned int iChainNumber, EffectChainSlotPointer pEffectChain); - // Signal that whoever is in charge of this EffectChainSlot should load the - // next Effect into the specified EffectSlot. - void nextEffect(unsigned int iChainSlotNumber, - unsigned int iEffectSlotNumber, - EffectPointer pEffect); - - // Signal that whoever is in charge of this EffectChainSlot should load the - // previous Effect into the specified EffectSlot. - void prevEffect(unsigned int iChainSlotNumber, - unsigned int iEffectSlotNumber, - EffectPointer pEffect); - // Signal that indicates that the EffectChainSlot has been updated. void updated(); + protected slots: + void sendParameterUpdate(); + + protected: + EffectSlotPointer addEffectSlot(const QString& group); + + // Activates EffectChain processing for the provided channel. + void enableForInputChannel(const ChannelHandleAndGroup& handle_group); + void disableForInputChannel(const ChannelHandleAndGroup& handle_group); + + EffectsManager* m_pEffectsManager; + ControlObject* m_pControlChainMix; private slots: - void sendParameterUpdate(); void slotChainEffectChanged(unsigned int effectSlotNumber); // Clears the effect in the given position in the loaded EffectChain. void slotClearEffect(unsigned int iEffectSlotNumber); @@ -148,19 +139,16 @@ class EffectChainSlot : public QObject { return QString("EffectChainSlot(%1)").arg(m_group); } - void addToEngine(int iIndex); - void removeFromEngine(int iIndex); + void addToEngine(); + void removeFromEngine(); - const unsigned int m_iChainSlotNumber; const QString m_group; - EffectRack* m_pEffectRack; ControlPushButton* m_pControlClear; ControlObject* m_pControlNumEffects; ControlObject* m_pControlNumEffectSlots; ControlObject* m_pControlChainLoaded; ControlPushButton* m_pControlChainEnabled; - ControlObject* m_pControlChainMix; ControlObject* m_pControlChainSuperParameter; ControlPushButton* m_pControlChainMixMode; ControlEncoder* m_pControlChainSelector; @@ -196,14 +184,14 @@ class EffectChainSlot : public QObject { QMap m_channelInfoByName; QList m_slots; QSignalMapper m_channelStatusMapper; - EffectsManager* m_pEffectsManager; QString m_id; QString m_name; QString m_description; + SignalProcessingStage m_signalProcessingStage; + bool m_bHasMetaknob; QSet m_enabledInputChannels; QList m_effects; EngineEffectChain* m_pEngineEffectChain; - DISALLOW_COPY_AND_ASSIGN(EffectChainSlot); }; diff --git a/src/effects/effectrack.cpp b/src/effects/effectrack.cpp deleted file mode 100644 index b7dde0484747..000000000000 --- a/src/effects/effectrack.cpp +++ /dev/null @@ -1,366 +0,0 @@ -#include "effects/effectrack.h" - -#include "effects/effectsmanager.h" -#include "effects/effectslot.h" - -#include "util/assert.h" - -EffectRack::EffectRack(EffectsManager* pEffectsManager, - const unsigned int iRackNumber, - const QString& group, SignalProcessingStage stage) - : m_pEffectsManager(pEffectsManager), - m_signalProcessingStage(stage), - m_iRackNumber(iRackNumber), - m_group(group), - m_controlNumEffectChainSlots(ConfigKey(m_group, "num_effectunits")), - m_controlClearRack(ConfigKey(m_group, "clear")) { - connect(&m_controlClearRack, SIGNAL(valueChanged(double)), - this, SLOT(slotClearRack(double))); - m_controlNumEffectChainSlots.setReadOnly(); -} - -EffectRack::~EffectRack() { - m_effectChainSlots.clear(); - //qDebug() << "EffectRack::~EffectRack()"; -} - -void EffectRack::registerInputChannel(const ChannelHandleAndGroup& handle_group) { - foreach (EffectChainSlotPointer pChainSlot, m_effectChainSlots) { - pChainSlot->registerInputChannel(handle_group); - } -} - -void EffectRack::slotClearRack(double v) { - if (v > 0) { - foreach (EffectChainSlotPointer pChainSlot, m_effectChainSlots) { - pChainSlot->clear(); - } - } -} - -int EffectRack::numEffectChainSlots() const { - return m_effectChainSlots.size(); -} - -void EffectRack::addEffectChainSlotInternal(EffectChainSlotPointer pChainSlot) { - m_effectChainSlots.append(pChainSlot); - m_controlNumEffectChainSlots.forceSet( - m_controlNumEffectChainSlots.get() + 1); - - // qDebug() << "Total effect chain slots = " << m_controlNumEffectChainSlots.get(); -} - -EffectChainSlotPointer EffectRack::getEffectChainSlot(int i) { - if (i < 0 || i >= m_effectChainSlots.size()) { - qWarning() << "WARNING: Invalid index for getEffectChainSlot"; - return EffectChainSlotPointer(); - } - return m_effectChainSlots[i]; -} - -void EffectRack::maybeLoadEffect(const unsigned int iChainSlotNumber, - const unsigned int iEffectSlotNumber, - const QString& id) { - if (iChainSlotNumber >= static_cast(m_effectChainSlots.size())) { - return; - } - - EffectChainSlotPointer pChainSlot = m_effectChainSlots[iChainSlotNumber]; - if (pChainSlot == nullptr) { - return; - } - EffectSlotPointer pEffectSlot = pChainSlot->getEffectSlot(iEffectSlotNumber); - - bool loadNew = false; - if (pEffectSlot == nullptr || pEffectSlot->getEffect() == nullptr) { - loadNew = true; - } else if (id != pEffectSlot->getEffect()->getManifest()->id()) { - loadNew = true; - } - - if (loadNew) { - EffectPointer pEffect = m_pEffectsManager->instantiateEffect(id); - pChainSlot->replaceEffect(iEffectSlotNumber, pEffect); - } -} - -void EffectRack::loadNextEffect(const unsigned int iChainSlotNumber, - const unsigned int iEffectSlotNumber, - EffectPointer pEffect) { - if (iChainSlotNumber >= static_cast(m_effectChainSlots.size())) { - return; - } - - QString effectId = pEffect ? pEffect->getManifest()->id() : QString(); - QString nextEffectId = m_pEffectsManager->getNextEffectId(effectId); - EffectPointer pNextEffect = m_pEffectsManager->instantiateEffect(nextEffectId); - - EffectChainSlotPointer pChainSlot = m_effectChainSlots[iChainSlotNumber]; - pChainSlot->replaceEffect(iEffectSlotNumber, pNextEffect); -} - - -void EffectRack::loadPrevEffect(const unsigned int iChainSlotNumber, - const unsigned int iEffectSlotNumber, - EffectPointer pEffect) { - if (iChainSlotNumber >= static_cast(m_effectChainSlots.size())) { - return; - } - - QString effectId = pEffect ? pEffect->getManifest()->id() : QString(); - QString prevEffectId = m_pEffectsManager->getPrevEffectId(effectId); - EffectPointer pPrevEffect = m_pEffectsManager->instantiateEffect(prevEffectId); - - EffectChainSlotPointer pChainSlot = m_effectChainSlots[iChainSlotNumber]; - pChainSlot->replaceEffect(iEffectSlotNumber, pPrevEffect); -} - -QDomElement EffectRack::toXml(QDomDocument* doc) const { - QDomElement rackElement = doc->createElement("Rack"); - // QDomElement groupElement = doc->createElement("Group"); - // QDomText groupText = doc->createTextNode(m_group); - // groupElement.appendChild(groupText); - // rackElement.appendChild(groupElement); - - // QDomElement chainsElement = doc->createElement("Chains"); - // for (EffectChainSlotPointer pChainSlot : m_effectChainSlots) { - // QDomElement chain = pChainSlot->toXml(doc); - // chainsElement.appendChild(chain); - // } - // rackElement.appendChild(chainsElement); - return rackElement; -} - -void EffectRack::refresh() { - for (const auto& pChainSlot: m_effectChainSlots) { - pChainSlot->refreshAllEffects(); - } -} - -bool EffectRack::isAdoptMetaknobValueEnabled() const { - return m_pEffectsManager->isAdoptMetaknobValueEnabled(); -} - -StandardEffectRack::StandardEffectRack(EffectsManager* pEffectsManager, - const unsigned int iRackNumber) - : EffectRack(pEffectsManager, iRackNumber, - formatGroupString(iRackNumber), SignalProcessingStage::Postfader) { - for (int i = 0; i < EffectsManager::kNumStandardEffectChains; ++i) { - addEffectChainSlot(); - } -} - -EffectChainSlotPointer StandardEffectRack::addEffectChainSlot() { - int iChainSlotNumber = numEffectChainSlots(); - - QString group = formatEffectChainSlotGroupString(getRackNumber(), - iChainSlotNumber); - - - EffectChainSlot* pChainSlot = - new EffectChainSlot(this, group, iChainSlotNumber, m_pEffectsManager); - - for (int i = 0; i < kNumEffectsPerUnit; ++i) { - pChainSlot->addEffectSlot( - StandardEffectRack::formatEffectSlotGroupString( - getRackNumber(), iChainSlotNumber, i)); - } - - connect(pChainSlot, SIGNAL(nextEffect(unsigned int, unsigned int, EffectPointer)), - this, SLOT(loadNextEffect(unsigned int, unsigned int, EffectPointer))); - connect(pChainSlot, SIGNAL(prevEffect(unsigned int, unsigned int, EffectPointer)), - this, SLOT(loadPrevEffect(unsigned int, unsigned int, EffectPointer))); - - // Register all the existing channels with the new EffectChain. - const QSet& registeredChannels = - m_pEffectsManager->registeredInputChannels(); - for (const ChannelHandleAndGroup& handle_group : registeredChannels) { - pChainSlot->registerInputChannel(handle_group); - } - - EffectChainSlotPointer pChainSlotPointer = EffectChainSlotPointer(pChainSlot); - addEffectChainSlotInternal(pChainSlotPointer); - - return pChainSlotPointer; -} - -OutputEffectRack::OutputEffectRack(EffectsManager* pEffectsManager) - : EffectRack(pEffectsManager, 0, - "[OutputEffectRack]", SignalProcessingStage::Postfader) { - - const QString unitGroup = "[OutputEffectRack_[Master]]"; - // Hard code only one EffectChainSlot - EffectChainSlot* pChainSlot = new EffectChainSlot(this, unitGroup, 0, m_pEffectsManager, unitGroup); - pChainSlot->addEffectSlot("[OutputEffectRack_[Master]_Effect1]"); - - connect(pChainSlot, SIGNAL(nextEffect(unsigned int, unsigned int, EffectPointer)), - this, SLOT(loadNextEffect(unsigned int, unsigned int, EffectPointer))); - connect(pChainSlot, SIGNAL(prevEffect(unsigned int, unsigned int, EffectPointer)), - this, SLOT(loadPrevEffect(unsigned int, unsigned int, EffectPointer))); - - // Register the master channel. - const ChannelHandleAndGroup* masterHandleAndGroup = nullptr; - - // TODO(Be): Remove this hideous hack to get the ChannelHandleAndGroup - const QSet& registeredChannels = - m_pEffectsManager->registeredInputChannels(); - for (const ChannelHandleAndGroup& handle_group : registeredChannels) { - if (handle_group.name() == "[MasterOutput]") { - masterHandleAndGroup = &handle_group; - break; - } - } - DEBUG_ASSERT(masterHandleAndGroup != nullptr); - - pChainSlot->registerInputChannel(*masterHandleAndGroup); - - // TODO(Kshitij) : Make the following function private after EffectRack - // layer is removed. - pChainSlot->enableForInputChannel(*masterHandleAndGroup); - pChainSlot->setMix(1.0); - - EffectChainSlotPointer pChainSlotPointer = EffectChainSlotPointer(pChainSlot); - addEffectChainSlotInternal(pChainSlotPointer); -} - -PerGroupRack::PerGroupRack(EffectsManager* pEffectsManager, - const unsigned int iRackNumber, - const QString& group) - : EffectRack(pEffectsManager, iRackNumber, group, - SignalProcessingStage::Prefader) { -} - -void PerGroupRack::setupForGroup(const QString& groupName) { - VERIFY_OR_DEBUG_ASSERT(!m_groupToChainSlot.contains(groupName)) { - return; - } - - int iChainSlotNumber = m_groupToChainSlot.size(); - QString chainSlotGroup = formatEffectChainSlotGroupForGroup( - getRackNumber(), iChainSlotNumber, groupName); - // qDebug() << "Chain slot group = " << chainSlotGroup; - EffectChainSlot* pChainSlot = new EffectChainSlot(this, chainSlotGroup, - iChainSlotNumber, - m_pEffectsManager, - chainSlotGroup); - EffectChainSlotPointer pChainSlotPointer(pChainSlot); - addEffectChainSlotInternal(pChainSlotPointer); - m_groupToChainSlot[groupName] = pChainSlotPointer; - - // TODO(rryan): Set up next/prev signals. - - // Set the chain to be fully wet. - pChainSlot->setMix(1.0); - - // TODO(rryan): remove. - const ChannelHandleAndGroup* handleAndGroup = nullptr; - for (const ChannelHandleAndGroup& handle_group : - m_pEffectsManager->registeredInputChannels()) { - if (handle_group.name() == groupName) { - handleAndGroup = &handle_group; - break; - } - } - DEBUG_ASSERT(handleAndGroup != nullptr); - - // Register this channel alone with the chain slot. - pChainSlot->registerInputChannel(*handleAndGroup); - - // Add a single effect slot - pChainSlot->addEffectSlot(formatEffectSlotGroupString(0, groupName)); - // DlgPrefEq loads the Effect with loadEffectToGroup - - configureEffectChainSlotForGroup(pChainSlotPointer, groupName); -} - -bool PerGroupRack::loadEffectToGroup(const QString& groupName, EffectPointer pEffect) { - EffectChainSlotPointer pChainSlot = getGroupEffectChainSlot(groupName); - VERIFY_OR_DEBUG_ASSERT(pChainSlot) { - return false; - } - - pChainSlot->replaceEffect(0, pEffect); - if (pEffect != nullptr) { - pEffect->setEnabled(true); - } - return true; -} - -EffectChainSlotPointer PerGroupRack::getGroupEffectChainSlot(const QString& group) { - return m_groupToChainSlot[group]; -} - -QuickEffectRack::QuickEffectRack(EffectsManager* pEffectsManager, - const unsigned int iRackNumber) - : PerGroupRack(pEffectsManager, iRackNumber, - QuickEffectRack::formatGroupString(iRackNumber)) { -} - -void QuickEffectRack::configureEffectChainSlotForGroup( - EffectChainSlotPointer pSlot, const QString& groupName) { - Q_UNUSED(groupName); - // Set the parameter default value to 0.5 (neutral). - pSlot->setSuperParameter(0.5); - pSlot->setSuperParameterDefaultValue(0.5); -} - -bool QuickEffectRack::loadEffectToGroup(const QString& groupName, - EffectPointer pEffect) { - PerGroupRack::loadEffectToGroup(groupName, pEffect); - EffectChainSlotPointer pChainSlot = getGroupEffectChainSlot(groupName); - // Force update metaknobs and parameters to match state of superknob - pChainSlot->setSuperParameter(pChainSlot->getSuperParameter(), true); - return true; -} - -EqualizerRack::EqualizerRack(EffectsManager* pEffectsManager, - const unsigned int iRackNumber) - : PerGroupRack(pEffectsManager, iRackNumber, - EqualizerRack::formatGroupString(iRackNumber)) { -} - -void EqualizerRack::configureEffectChainSlotForGroup(EffectChainSlotPointer pSlot, - const QString& groupName) { - // Create aliases for legacy EQ controls. - // NOTE(rryan): If we ever add a second EqualizerRack then we need to make - // these only apply to the first. - EffectSlotPointer pEffectSlot = pSlot->getEffectSlot(0); - if (pEffectSlot) { - const QString& effectSlotGroup = pEffectSlot->getGroup(); - ControlDoublePrivate::insertAlias(ConfigKey(groupName, "filterLow"), - ConfigKey(effectSlotGroup, "parameter1")); - - ControlDoublePrivate::insertAlias(ConfigKey(groupName, "filterMid"), - ConfigKey(effectSlotGroup, "parameter2")); - - ControlDoublePrivate::insertAlias(ConfigKey(groupName, "filterHigh"), - ConfigKey(effectSlotGroup, "parameter3")); - - ControlDoublePrivate::insertAlias(ConfigKey(groupName, "filterLowKill"), - ConfigKey(effectSlotGroup, "button_parameter1")); - - ControlDoublePrivate::insertAlias(ConfigKey(groupName, "filterMidKill"), - ConfigKey(effectSlotGroup, "button_parameter2")); - - ControlDoublePrivate::insertAlias(ConfigKey(groupName, "filterHighKill"), - ConfigKey(effectSlotGroup, "button_parameter3")); - - ControlDoublePrivate::insertAlias(ConfigKey(groupName, "filterLow_loaded"), - ConfigKey(effectSlotGroup, "parameter1_loaded")); - - ControlDoublePrivate::insertAlias(ConfigKey(groupName, "filterMid_loaded"), - ConfigKey(effectSlotGroup, "parameter2_loaded")); - - ControlDoublePrivate::insertAlias(ConfigKey(groupName, "filterHigh_loaded"), - ConfigKey(effectSlotGroup, "parameter3_loaded")); - - ControlDoublePrivate::insertAlias(ConfigKey(groupName, "filterLowKill_loaded"), - ConfigKey(effectSlotGroup, "button_parameter1_loaded")); - - ControlDoublePrivate::insertAlias(ConfigKey(groupName, "filterMidKill_loaded"), - ConfigKey(effectSlotGroup, "button_parameter2_loaded")); - - ControlDoublePrivate::insertAlias(ConfigKey(groupName, "filterHighKill_loaded"), - ConfigKey(effectSlotGroup, "button_parameter3_loaded")); - } -} diff --git a/src/effects/effectrack.h b/src/effects/effectrack.h deleted file mode 100644 index 617d22fc3fcc..000000000000 --- a/src/effects/effectrack.h +++ /dev/null @@ -1,247 +0,0 @@ -#ifndef EFFECTRACK_H -#define EFFECTRACK_H - -#include -#include -#include -#include - -#include "control/controlobject.h" -#include "engine/channelhandle.h" -#include "effects/defs.h" - -class EffectsManager; - -#include "effects/effectchainslot.h" - -//TODO(Be): Remove these superfluous classes. -class EffectRack : public QObject { - Q_OBJECT - public: - EffectRack(EffectsManager* pEffectsManager, - const unsigned int iRackNumber, - const QString& group, SignalProcessingStage stage); - virtual ~EffectRack(); - - void registerInputChannel(const ChannelHandleAndGroup& handle_group); - int numEffectChainSlots() const; - EffectChainSlotPointer getEffectChainSlot(int i); - - void maybeLoadEffect(const unsigned int iChainSlotNumber, - const unsigned int iEffectSlotNumber, - const QString& id); - - unsigned int getRackNumber() const { - return m_iRackNumber; - } - - const QString& getGroup() const { - return m_group; - } - - SignalProcessingStage getSignalProcessingStage() const { - return m_signalProcessingStage; - } - - void refresh(); - - QDomElement toXml(QDomDocument* doc) const; - - virtual bool isAdoptMetaknobValueEnabled() const; - - public slots: - void slotClearRack(double v); - - private slots: - void loadNextEffect(const unsigned int iChainSlotNumber, - const unsigned int iEffectSlotNumber, - EffectPointer pEffect); - void loadPrevEffect(const unsigned int iChainSlotNumber, - const unsigned int iEffectSlotNumber, - EffectPointer pEffect); - - protected: - void addEffectChainSlotInternal(EffectChainSlotPointer pChainSlot); - - // We could make accessors for these for sub-classes. Doesn't really matter. - EffectsManager* m_pEffectsManager; - - private: - SignalProcessingStage m_signalProcessingStage; - const unsigned int m_iRackNumber; - const QString m_group; - QList m_effectChainSlots; - ControlObject m_controlNumEffectChainSlots; - ControlObject m_controlClearRack; -}; - -class StandardEffectRack : public EffectRack { - Q_OBJECT - public: - StandardEffectRack(EffectsManager* pEffectsManager, - const unsigned int iRackNumber); - virtual ~StandardEffectRack() {} - - static QString formatGroupString(const unsigned int iRackNumber) { - return QString("[EffectRack%1]") - .arg(QString::number(iRackNumber + 1)); - } - - static QString formatEffectChainSlotGroupString(const unsigned int iRackNumber, - const unsigned int iChainSlotNumber) { - return QString("[EffectRack%1_EffectUnit%2]") - .arg(QString::number(iRackNumber + 1)) - .arg(QString::number(iChainSlotNumber + 1)); - } - - static QString formatEffectSlotGroupString(const unsigned int iRackNumber, - const unsigned int iChainSlotNumber, - const unsigned int iEffectSlotNumber) { - return QString("[EffectRack%1_EffectUnit%2_Effect%3]") - .arg(QString::number(iRackNumber + 1)) - .arg(QString::number(iChainSlotNumber + 1)) - .arg(QString::number(iEffectSlotNumber + 1)); - } - - EffectChainSlotPointer addEffectChainSlot(); -}; - -class OutputEffectRack : public EffectRack { - Q_OBJECT - public: - OutputEffectRack(EffectsManager* pEffectsManager); - virtual ~OutputEffectRack() {}; -}; - -class PerGroupRack : public EffectRack { - Q_OBJECT - public: - PerGroupRack(EffectsManager* pEffectsManager, - const unsigned int iRackNumber, - const QString& group); - virtual ~PerGroupRack() {} - - - void setupForGroup(const QString& group); - EffectChainSlotPointer getGroupEffectChainSlot(const QString& group); - virtual bool loadEffectToGroup(const QString& group, EffectPointer pEffect); - - protected: - virtual void configureEffectChainSlotForGroup(EffectChainSlotPointer pSlot, - const QString& group) = 0; - - virtual QString formatEffectChainSlotGroupForGroup(const unsigned int iRackNumber, - const unsigned int iChainSlotNumber, - const QString& group) const = 0; - - virtual QString formatEffectSlotGroupString(const unsigned int iEffectSlotNumber, - const QString& group) const = 0; - - private: - QHash m_groupToChainSlot; -}; - -class QuickEffectRack : public PerGroupRack { - Q_OBJECT - public: - QuickEffectRack(EffectsManager* pEffectsManager, - const unsigned int iRackNumber); - virtual ~QuickEffectRack() {} - - bool loadEffectToGroup(const QString& group, EffectPointer pEffect) override; - - static QString formatGroupString(const unsigned int iRackNumber) { - return QString("[QuickEffectRack%1]") - .arg(QString::number(iRackNumber + 1)); - } - - static QString formatEffectChainSlotGroupString(const unsigned int iRackNumber, - const QString& group) { - return QString("[QuickEffectRack%1_%2]") - .arg(QString::number(iRackNumber + 1)) - .arg(group); - } - - static QString formatEffectSlotGroupString(const unsigned int iRackNumber, - const unsigned int iEffectSlotNumber, - const QString& group) { - return QString("[QuickEffectRack%1_%2_Effect%3]") - .arg(QString::number(iRackNumber + 1)) - .arg(group) - .arg(QString::number(iEffectSlotNumber + 1)); - } - - QString formatEffectSlotGroupString(const unsigned int iEffectSlotNumber, - const QString& group) const { - return formatEffectSlotGroupString(getRackNumber(), iEffectSlotNumber, - group); - } - - bool isAdoptMetaknobValueEnabled() const override { - // No visible Metaknobs to adopt - return false; - } - - protected: - void configureEffectChainSlotForGroup(EffectChainSlotPointer pSlot, - const QString& group) override; - - virtual QString formatEffectChainSlotGroupForGroup(const unsigned int iRackNumber, - const unsigned int iChainSlotNumber, - const QString& group) const { - Q_UNUSED(iChainSlotNumber); - return formatEffectChainSlotGroupString(iRackNumber, group); - } -}; - -class EqualizerRack : public PerGroupRack { - Q_OBJECT - public: - EqualizerRack(EffectsManager* pEffectsManager, - const unsigned int iRackNumber); - virtual ~EqualizerRack() {} - - static QString formatGroupString(const unsigned int iRackNumber) { - return QString("[EqualizerRack%1]") - .arg(QString::number(iRackNumber + 1)); - } - - static QString formatEffectChainSlotGroupString(const unsigned int iRackNumber, - const QString& group) { - return QString("[EqualizerRack%1_%2]") - .arg(QString::number(iRackNumber + 1)) - .arg(group); - } - - static QString formatEffectSlotGroupString(const unsigned int iRackNumber, - const unsigned int iEffectSlotNumber, - const QString& group) { - return QString("[EqualizerRack%1_%2_Effect%3]") - .arg(QString::number(iRackNumber + 1)) - .arg(group) - .arg(QString::number(iEffectSlotNumber + 1)); - } - - QString formatEffectSlotGroupString(const unsigned int iEffectSlotNumber, - const QString& group) const { - return formatEffectSlotGroupString(getRackNumber(), iEffectSlotNumber, - group); - } - - bool isAdoptMetaknobValueEnabled() const override { - // No visible Metaknobs to adopt - return false; - } - - protected: - void configureEffectChainSlotForGroup(EffectChainSlotPointer pSlot, - const QString& group) override; - virtual QString formatEffectChainSlotGroupForGroup(const unsigned int iRackNumber, - const unsigned int iChainSlotNumber, - const QString& group) const { - Q_UNUSED(iChainSlotNumber); - return formatEffectChainSlotGroupString(iRackNumber, group); - } -}; - -#endif /* EFFECTRACK_H */ diff --git a/src/effects/effectslot.cpp b/src/effects/effectslot.cpp index 3b338cb26997..366033251526 100644 --- a/src/effects/effectslot.cpp +++ b/src/effects/effectslot.cpp @@ -13,10 +13,8 @@ const unsigned int kDefaultMaxParameters = 16; EffectSlot::EffectSlot(const QString& group, - const unsigned int iChainNumber, const unsigned int iEffectnumber) - : m_iChainNumber(iChainNumber), - m_iEffectNumber(iEffectnumber), + : m_iEffectNumber(iEffectnumber), m_group(group) { m_pControlLoaded = new ControlObject(ConfigKey(m_group, "loaded")); m_pControlLoaded->setReadOnly(); @@ -231,11 +229,11 @@ void EffectSlot::slotNextEffect(double v) { } void EffectSlot::slotEffectSelector(double v) { - if (v > 0) { - emit(nextEffect(m_iChainNumber, m_iEffectNumber, m_pEffect)); - } else if (v < 0) { - emit(prevEffect(m_iChainNumber, m_iEffectNumber, m_pEffect)); - } + // if (v > 0) { + // emit(nextEffect(m_iChainNumber, m_iEffectNumber, m_pEffect)); + // } else if (v < 0) { + // emit(prevEffect(m_iChainNumber, m_iEffectNumber, m_pEffect)); + // } } void EffectSlot::slotClear(double v) { diff --git a/src/effects/effectslot.h b/src/effects/effectslot.h index 1afc2a7f7a0e..ca35bdd33515 100644 --- a/src/effects/effectslot.h +++ b/src/effects/effectslot.h @@ -23,7 +23,6 @@ class EffectSlot : public QObject { Q_OBJECT public: EffectSlot(const QString& group, - const unsigned int iChainNumber, const unsigned int iEffectNumber); virtual ~EffectSlot(); @@ -90,16 +89,6 @@ class EffectSlot : public QObject { // previously loaded effect was removed from the slot. void effectLoaded(EffectPointer pEffect, unsigned int effectSlotNumber); - // Signal that whoever is in charge of this EffectSlot should load the next - // Effect into it. - void nextEffect(unsigned int iChainNumber, unsigned int iEffectNumber, - EffectPointer pEffect); - - // Signal that whoever is in charge of this EffectSlot should load the - // previous Effect into it. - void prevEffect(unsigned int iChainNumber, unsigned int iEffectNumber, - EffectPointer pEffect); - // Signal that whoever is in charge of this EffectSlot should clear this // EffectSlot (by deleting the effect from the underlying chain). void clearEffect(unsigned int iEffectNumber); @@ -111,7 +100,6 @@ class EffectSlot : public QObject { return QString("EffectSlot(%1)").arg(m_group); } - const unsigned int m_iChainNumber; const unsigned int m_iEffectNumber; const QString m_group; UserSettingsPointer m_pConfig; diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index 18425748cee7..d05579a26f47 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -14,6 +14,10 @@ #include "util/assert.h" namespace { +const QString kStandardEffectRackGroup = "[EffectRack1]"; +const QString kOutputEffectRackGroup = "[OutputEffectRack]"; +const QString kQuickEffectRackGroup = "[QuickEffectRack1]"; +const QString kEqualizerEffectRackGroup = "[EqualizerRack1]"; const QString kEffectGroupSeparator = "_"; const QString kGroupClose = "]"; const unsigned int kEffectMessagPipeFifoSize = 2048; @@ -26,8 +30,8 @@ EffectsManager::EffectsManager(QObject* pParent, UserSettingsPointer pConfig, m_pChannelHandleFactory(pChannelHandleFactory), m_pConfig(pConfig), m_nextRequestId(0), - m_pLoEqFreq(NULL), - m_pHiEqFreq(NULL), + m_loEqFreq(ConfigKey("[Mixer Profile]", "LoEQFrequency"), 0., 22040), + m_hiEqFreq(ConfigKey("[Mixer Profile]", "HiEQFrequency"), 0., 22040), m_underDestruction(false) { qRegisterMetaType("EffectChainMixMode"); QPair requestPipes = @@ -39,10 +43,6 @@ EffectsManager::EffectsManager(QObject* pParent, UserSettingsPointer pConfig, m_pNumEffectsAvailable = new ControlObject(ConfigKey("[Master]", "num_effectsavailable")); m_pNumEffectsAvailable->setReadOnly(); - - // These controls are used inside EQ Effects - m_pLoEqFreq = new ControlPotmeter(ConfigKey("[Mixer Profile]", "LoEQFrequency"), 0., 22040); - m_pHiEqFreq = new ControlPotmeter(ConfigKey("[Mixer Profile]", "HiEQFrequency"), 0., 22040); } EffectsManager::~EffectsManager() { @@ -63,8 +63,8 @@ EffectsManager::~EffectsManager() { it = m_activeRequests.erase(it); } - delete m_pHiEqFreq; - delete m_pLoEqFreq; + // delete m_pHiEqFreq; + // delete m_pLoEqFreq; delete m_pNumEffectsAvailable; // Safe because the Engine is deleted before EffectsManager. Also, it holds // a bare pointer to m_pRequestPipe so it is critical that it does not @@ -111,56 +111,6 @@ void EffectsManager::slotBackendRegisteredEffect(EffectManifestPointer pManifest m_pNumEffectsAvailable->forceSet(m_availableEffectManifests.size()); } -// TODO(Kshitij) : This function is not being used. Remove -void EffectsManager::addEffectChain(EffectChainSlotPointer pEffectChainSlot) { - if (pEffectChainSlot) { - m_effectChainSlots.append(pEffectChainSlot); - } -} - -// TODO(Kshitij) : This function is not being used. Remove -void EffectsManager::removeEffectChain(EffectChainSlotPointer pEffectChainSlot) { - if (pEffectChainSlot) { - m_effectChainSlots.removeAll(pEffectChainSlot); - } -} - -// TODO(Kshitij) : This function is not being used. Remove -EffectChainSlotPointer EffectsManager::getNextEffectChain(EffectChainSlotPointer pEffectChainSlot) { - if (m_effectChainSlots.isEmpty()) - return EffectChainSlotPointer(); - - if (!pEffectChainSlot) { - return m_effectChainSlots[0]; - } - - int indexOf = m_effectChainSlots.lastIndexOf(pEffectChainSlot); - if (indexOf == -1) { - qWarning() << debugString() << "WARNING: getNextEffectChain called for an unmanaged EffectChain"; - return m_effectChainSlots[0]; - } - - return m_effectChainSlots[(indexOf + 1) % m_effectChainSlots.size()]; -} - -// TODO(Kshitij) : This function is not being used. Remove -EffectChainSlotPointer EffectsManager::getPrevEffectChain(EffectChainSlotPointer pEffectChainSlot) { - if (m_effectChainSlots.isEmpty()) - return EffectChainSlotPointer(); - - if (!pEffectChainSlot) { - return m_effectChainSlots[m_effectChainSlots.size()-1]; - } - - int indexOf = m_effectChainSlots.lastIndexOf(pEffectChainSlot); - if (indexOf == -1) { - qWarning() << debugString() << "WARNING: getPrevEffectChain called for an unmanaged EffectChain"; - return m_effectChainSlots[m_effectChainSlots.size()-1]; - } - - return m_effectChainSlots[(indexOf - 1 + m_effectChainSlots.size()) % m_effectChainSlots.size()]; -} - bool EffectsManager::isAdoptMetaknobValueEnabled() const { return m_pConfig->getValue(ConfigKey("[Effects]", "AdoptMetaknobValue"), true); } @@ -171,8 +121,8 @@ void EffectsManager::registerInputChannel(const ChannelHandleAndGroup& handle_gr } m_registeredInputChannels.insert(handle_group); - for (auto& pRack : m_standardEffectRacks) { - pRack->registerInputChannel(handle_group); + foreach (EffectChainSlotPointer pChainSlot, m_standardEffectChainSlots) { + pChainSlot->registerInputChannel(handle_group); } } @@ -273,64 +223,97 @@ EffectPointer EffectsManager::instantiateEffect(const QString& effectId) { return EffectPointer(); } -StandardEffectRackPointer EffectsManager::addStandardEffectRack() { - StandardEffectRackPointer pRack(new StandardEffectRack( - this, m_standardEffectRacks.size())); - m_standardEffectRacks.append(pRack); - m_effectRacksByGroup.insert(pRack->getGroup(), pRack); - return pRack; -} +void EffectsManager::addStandardEffectChainSlots() { + for (int i = 0; i < EffectsManager::kNumStandardEffectChains; ++i) { + VERIFY_OR_DEBUG_ASSERT(!m_effectChainSlotsByGroup.contains( + StandardEffectChainSlot::formatEffectChainSlotGroup(i))) { + continue; + } + + auto pChainSlot = StandardEffectChainSlotPointer( + new StandardEffectChainSlot(i, this)); -StandardEffectRackPointer EffectsManager::getStandardEffectRack(int i) { - if (i < 0 || i >= m_standardEffectRacks.size()) { - return StandardEffectRackPointer(); + m_standardEffectChainSlots.append(pChainSlot); + m_effectChainSlotsByGroup.insert(pChainSlot->group(), pChainSlot); } - return m_standardEffectRacks[i]; } -EqualizerRackPointer EffectsManager::addEqualizerRack() { - EqualizerRackPointer pRack(new EqualizerRack( - this, m_equalizerEffectRacks.size())); - m_equalizerEffectRacks.append(pRack); - m_effectRacksByGroup.insert(pRack->getGroup(), pRack); - return pRack; +void EffectsManager::addOutputEffectChainSlot() { + m_outputEffectChainSlot = OutputEffectChainSlotPointer(new OutputEffectChainSlot(this)); + m_effectChainSlotsByGroup.insert(m_outputEffectChainSlot->group(), m_outputEffectChainSlot); } -EqualizerRackPointer EffectsManager::getEqualizerRack(int i) { - if (i < 0 || i >= m_equalizerEffectRacks.size()) { - return EqualizerRackPointer(); +EffectChainSlotPointer EffectsManager::getOutputEffectChainSlot() const { + return m_outputEffectChainSlot; +} + +EffectChainSlotPointer EffectsManager::getStandardEffectChainSlot(int unitNumber) const { + VERIFY_OR_DEBUG_ASSERT(0 <= unitNumber || unitNumber < m_standardEffectChainSlots.size()) { + return EffectChainSlotPointer(); } - return m_equalizerEffectRacks[i]; + return m_standardEffectChainSlots.at(unitNumber); } -QuickEffectRackPointer EffectsManager::addQuickEffectRack() { - QuickEffectRackPointer pRack(new QuickEffectRack( - this, m_quickEffectRacks.size())); - m_quickEffectRacks.append(pRack); - m_effectRacksByGroup.insert(pRack->getGroup(), pRack); - return pRack; +void EffectsManager::addEqualizerEffectChainSlot(const QString& groupName) { + VERIFY_OR_DEBUG_ASSERT(!m_equalizerEffectChainSlots.contains( + EqualizerEffectChainSlot::formatEffectChainSlotGroup(groupName))) { + return; + } + + auto pChainSlot = EqualizerEffectChainSlotPointer( + new EqualizerEffectChainSlot(groupName, this)); + m_effectChainSlotsByGroup.insert(pChainSlot->group(), pChainSlot); + m_equalizerEffectChainSlots.insert(pChainSlot->group(), pChainSlot); } -QuickEffectRackPointer EffectsManager::getQuickEffectRack(int i) { - if (i < 0 || i >= m_quickEffectRacks.size()) { - return QuickEffectRackPointer(); +bool EffectsManager::loadEqualizerEffectToGroup(const QString& group, + EffectPointer pEffect) { + auto chainSlotGroup = EqualizerEffectChainSlot::formatEffectChainSlotGroup(group); + auto pChainSlot = m_equalizerEffectChainSlots.value(chainSlotGroup); + VERIFY_OR_DEBUG_ASSERT(pChainSlot) { + return false; } - return m_quickEffectRacks[i]; + + pChainSlot->replaceEffect(0, pEffect); + if (pEffect != nullptr) { + pEffect->setEnabled(true); + } + return true; } -OutputEffectRackPointer EffectsManager::addOutputsEffectRack() { - OutputEffectRackPointer pRack(new OutputEffectRack(this)); - m_pOutputEffectRack = pRack; - m_effectRacksByGroup.insert(pRack->getGroup(), pRack); - return m_pOutputEffectRack; +void EffectsManager::addQuickEffectChainSlot(const QString& groupName) { + VERIFY_OR_DEBUG_ASSERT(!m_quickEffectChainSlots.contains( + QuickEffectChainSlot::formatEffectChainSlotGroup(groupName))) { + return; + } + + auto pChainSlot = QuickEffectChainSlotPointer( + new QuickEffectChainSlot(groupName, this)); + m_effectChainSlotsByGroup.insert(pChainSlot->group(), pChainSlot); + m_quickEffectChainSlots.insert(pChainSlot->group(), pChainSlot); } -OutputEffectRackPointer EffectsManager::getOutputsEffectRack() { - return m_pOutputEffectRack; +bool EffectsManager::loadQuickEffectToGroup(const QString& group, + EffectPointer pEffect) { + auto chainSlotGroup = QuickEffectChainSlot::formatEffectChainSlotGroup(group); + EffectChainSlotPointer pChainSlot = m_quickEffectChainSlots.value(chainSlotGroup); + VERIFY_OR_DEBUG_ASSERT(pChainSlot) { + return false; + } + + pChainSlot->replaceEffect(0, pEffect); + if (pEffect != nullptr) { + pEffect->setEnabled(true); + } + + // Force update metaknobs and parameters to match state of superknob + pChainSlot->setSuperParameter(pChainSlot->getSuperParameter(), true); + + return true; } -EffectRackPointer EffectsManager::getEffectRack(const QString& group) { - return m_effectRacksByGroup.value(group); +EffectChainSlotPointer EffectsManager::getEffectChainSlot(const QString& group) const { + return m_effectChainSlotsByGroup.value(group); } EffectSlotPointer EffectsManager::getEffectSlot( @@ -339,27 +322,9 @@ EffectSlotPointer EffectsManager::getEffectSlot( QStringList parts = group.split(kEffectGroupSeparator); - EffectRackPointer pRack = getEffectRack(parts.at(0) + kGroupClose); - VERIFY_OR_DEBUG_ASSERT(pRack) { - return EffectSlotPointer(); - } - - EffectChainSlotPointer pChainSlot; - if (parts.at(0) == "[EffectRack1") { - intRegEx.indexIn(parts.at(1)); - pChainSlot = pRack->getEffectChainSlot(intRegEx.cap(1).toInt() - 1); - } else { - // Assume a PerGroupRack - const QString chainGroup = - parts.at(0) + kEffectGroupSeparator + parts.at(1) + kGroupClose; - for (int i = 0; i < pRack->numEffectChainSlots(); ++i) { - EffectChainSlotPointer pSlot = pRack->getEffectChainSlot(i); - if (pSlot->getGroup() == chainGroup) { - pChainSlot = pSlot; - break; - } - } - } + // NOTE(Kshitij) : Assuming the group is valid + const QString chainGroup = parts.at(0) + kEffectGroupSeparator + parts.at(1) + kGroupClose; + EffectChainSlotPointer pChainSlot = getEffectChainSlot(chainGroup); VERIFY_OR_DEBUG_ASSERT(pChainSlot) { return EffectSlotPointer(); } @@ -417,19 +382,10 @@ bool EffectsManager::getEffectVisibility(EffectManifestPointer pManifest) { return m_visibleEffectManifests.contains(pManifest); } -// TODO: remove this when removing EffectRack layer. The EQs and QuickEffects -// should be EffectChainSlot subclasses that get initialized by PlayerManager -// with each deck -void EffectsManager::setupPerGroupRacks() { - // NOTE(Be): Effect racks are processed in the order they are added here. - addEqualizerRack(); - addQuickEffectRack(); -} - void EffectsManager::setup() { - // Add postfader effect racks - addStandardEffectRack(); - addOutputsEffectRack(); + // Add postfader effect chain slots + addStandardEffectChainSlots(); + addOutputEffectChainSlot(); } // NOTE(Kshitij) : Use new functions for effect loading using Effect Preset @@ -438,15 +394,15 @@ void EffectsManager::setup() { // m_pEffectChainManager->loadEffectChains(); // } -void EffectsManager::refreshAllRacks() { - for (const auto& pRack: m_standardEffectRacks) { - pRack->refresh(); +void EffectsManager::refreshAllChainSlots() { + for (auto& pChainSlot : m_standardEffectChainSlots) { + pChainSlot->refreshAllEffects(); } - for (const auto& pRack: m_equalizerEffectRacks) { - pRack->refresh(); + for (auto& pChainSlot : m_equalizerEffectChainSlots) { + pChainSlot->refreshAllEffects(); } - for (const auto& pRack: m_quickEffectRacks) { - pRack->refresh(); + for (auto& pChainSlot : m_quickEffectChainSlots) { + pChainSlot->refreshAllEffects(); } } diff --git a/src/effects/effectsmanager.h b/src/effects/effectsmanager.h index 1a580b9c96ba..cee69ef7d51e 100644 --- a/src/effects/effectsmanager.h +++ b/src/effects/effectsmanager.h @@ -10,7 +10,7 @@ #include "control/controlpotmeter.h" #include "control/controlpushbutton.h" -#include "effects/effectrack.h" +#include "effects/specialeffectchainslots.h" #include "engine/channelhandle.h" #include "engine/effects/message.h" #include "preferences/usersettings.h" @@ -44,17 +44,11 @@ class EffectsManager : public QObject { // being deleted. Not thread safe -- use only from the GUI thread. void addEffectsBackend(EffectsBackend* pEffectsBackend); - // TODO(Kshitij) : Remove these redundant functions - void addEffectChain(EffectChainSlotPointer pEffectChainSlot); - void removeEffectChain(EffectChainSlotPointer pEffectChainSlot); - // To support cycling through effect chains, there is a global ordering of // chains. These methods allow you to get the next or previous chain given // your current chain. - // TODO(rryan): Prevent double-loading of a chain into a slot? - // TODO(Kshitij) : These functions are not being used. Remove - EffectChainSlotPointer getNextEffectChain(EffectChainSlotPointer pEffectChainSlot); - EffectChainSlotPointer getPrevEffectChain(EffectChainSlotPointer pEffectChainSlot); + // EffectChainSlotPointer getNextEffectChain(EffectChainSlotPointer pEffectChainSlot); + // EffectChainSlotPointer getPrevEffectChain(EffectChainSlotPointer pEffectChainSlot); // NOTE(Kshitij) : New functions for saving and loading // bool saveEffectChains(); @@ -74,22 +68,34 @@ class EffectsManager : public QObject { return m_registeredOutputChannels; } - StandardEffectRackPointer addStandardEffectRack(); - StandardEffectRackPointer getStandardEffectRack(int rack); + void addStandardEffectChainSlots(); + EffectChainSlotPointer getStandardEffectChainSlot(int unitNumber) const; - EqualizerRackPointer addEqualizerRack(); - EqualizerRackPointer getEqualizerRack(int rack); + void addOutputEffectChainSlot(); + EffectChainSlotPointer getOutputEffectChainSlot() const; - QuickEffectRackPointer addQuickEffectRack(); - QuickEffectRackPointer getQuickEffectRack(int rack); + void addEqualizerEffectChainSlot(const QString& groupName); + EqualizerEffectChainSlotPointer getEqualizerEffectChainSlot(const QString& group) { + return m_equalizerEffectChainSlots.value(group); + } + bool loadEqualizerEffectToGroup(const QString& group, EffectPointer pEffect); + int numEqualizerEffectChainSlots() { + return m_equalizerEffectChainSlots.size(); + } - OutputEffectRackPointer addOutputsEffectRack(); - OutputEffectRackPointer getOutputsEffectRack(); + void addQuickEffectChainSlot(const QString& groupName); + QuickEffectChainSlotPointer getQuickEffectChainSlot(const QString& group) { + return m_quickEffectChainSlots.value(group); + } + bool loadQuickEffectToGroup(const QString& group, EffectPointer pEffect); + int numQuickEffectChainSlots() { + return m_quickEffectChainSlots.size(); + } // NOTE(Kshitij) : Use new functions // void loadEffectChains(); - EffectRackPointer getEffectRack(const QString& group); + EffectChainSlotPointer getEffectChainSlot(const QString& group) const; EffectSlotPointer getEffectSlot(const QString& group); EffectParameterSlotPointer getEffectParameterSlot( @@ -118,11 +124,10 @@ class EffectsManager : public QObject { void setEffectVisibility(EffectManifestPointer pManifest, bool visibility); bool getEffectVisibility(EffectManifestPointer pManifest); - void setupPerGroupRacks(); void setup(); // Reloads all effect to the slots to update parameter assignements - void refreshAllRacks(); + void refreshAllChainSlots(); // Write an EffectsRequest to the EngineEffectsManager. EffectsManager takes // ownership of request and deletes it once a response is received. @@ -158,20 +163,21 @@ class EffectsManager : public QObject { ControlObject* m_pNumEffectsAvailable; // We need to create Control Objects for Equalizers' frequencies - ControlPotmeter* m_pLoEqFreq; - ControlPotmeter* m_pHiEqFreq; + ControlPotmeter m_loEqFreq; + ControlPotmeter m_hiEqFreq; bool m_underDestruction; QSet m_registeredInputChannels; QSet m_registeredOutputChannels; - QList m_standardEffectRacks; UserSettingsPointer m_pConfig; - QList m_equalizerEffectRacks; - QList m_quickEffectRacks; - OutputEffectRackPointer m_pOutputEffectRack; - QHash m_effectRacksByGroup; - QList m_effectChainSlots; + QHash m_effectChainSlotsByGroup; + + QList m_standardEffectChainSlots; + OutputEffectChainSlotPointer m_outputEffectChainSlot; + QHash m_equalizerEffectChainSlots; + QHash m_quickEffectChainSlots; + DISALLOW_COPY_AND_ASSIGN(EffectsManager); }; diff --git a/src/effects/specialeffectchainslots.cpp b/src/effects/specialeffectchainslots.cpp new file mode 100644 index 000000000000..f6d63013fdf5 --- /dev/null +++ b/src/effects/specialeffectchainslots.cpp @@ -0,0 +1,186 @@ +#include "effects/specialeffectchainslots.h" + +#include "effects/effectchainslot.h" +#include "mixer/playermanager.h" + +StandardEffectChainSlot::StandardEffectChainSlot(unsigned int iChainNumber, + EffectsManager* pEffectsManager, + const QString& id) + : EffectChainSlot(formatEffectChainSlotGroup(iChainNumber), + pEffectsManager, + SignalProcessingStage::Postfader, false, + formatEffectChainSlotGroup(iChainNumber)) { + for (int i = 0; i < kNumEffectsPerUnit; ++i) { + addEffectSlot(formatEffectSlotGroup(iChainNumber, i)); + } + + const QSet& registeredChannels = + m_pEffectsManager->registeredInputChannels(); + for (const ChannelHandleAndGroup& handle_group : registeredChannels) { + int deckNumber; + if (PlayerManager::isDeckGroup(handle_group.name(), &deckNumber) && + (iChainNumber + 1) == (unsigned) deckNumber) { + registerInputChannel(handle_group, 1.0); + } else { + registerInputChannel(handle_group, 0.0); + } + } +} + +QString StandardEffectChainSlot::formatEffectChainSlotGroup(const int iChainNumber) { + return QString("[EffectRack1_EffectUnit%1]") + .arg(QString::number(iChainNumber + 1)); +} + +QString StandardEffectChainSlot::formatEffectSlotGroup(const int iChainSlotNumber, + const int iEffectSlotNumber) { + return QString("[EffectRack1_EffectUnit%1_Effect%2]") + .arg(QString::number(iChainSlotNumber + 1)) + .arg(QString::number(iEffectSlotNumber + 1)); +} + + +OutputEffectChainSlot::OutputEffectChainSlot(EffectsManager* pEffectsManager) + : EffectChainSlot(formatEffectChainSlotGroup("[Master]"), + pEffectsManager, + SignalProcessingStage::Postfader, true, + formatEffectChainSlotGroup("[Master]")) { + addEffectSlot("[OutputEffectRack_[Master]_Effect1]"); + + // Register the master channel + const ChannelHandleAndGroup* masterHandleAndGroup = nullptr; + + // TODO(Be): Remove this hideous hack to get the ChannelHandleAndGroup + const QSet& registeredChannels = + m_pEffectsManager->registeredInputChannels(); + for (const ChannelHandleAndGroup& handle_group : registeredChannels) { + if (handle_group.name() == "[MasterOutput]") { + masterHandleAndGroup = &handle_group; + break; + } + } + DEBUG_ASSERT(masterHandleAndGroup != nullptr); + + registerInputChannel(*masterHandleAndGroup); + enableForInputChannel(*masterHandleAndGroup); + m_pControlChainMix->set(1.0); + sendParameterUpdate(); +} + +QString OutputEffectChainSlot::formatEffectChainSlotGroup(const QString& group) { + return QString("[OutputEffectRack_%1]").arg(group); +} + + +PerGroupEffectChainSlot::PerGroupEffectChainSlot(const QString& group, + const QString& chainSlotGroup, + EffectsManager* pEffectsManager) + : EffectChainSlot(chainSlotGroup, pEffectsManager, + SignalProcessingStage::Prefader, false, + chainSlotGroup) { + // Set the chain to be fully wet. + m_pControlChainMix->set(1.0); + sendParameterUpdate(); + + // TODO(rryan): remove. + const ChannelHandleAndGroup* handleAndGroup = nullptr; + for (const ChannelHandleAndGroup& handle_group : + m_pEffectsManager->registeredInputChannels()) { + if (handle_group.name() == group) { + handleAndGroup = &handle_group; + break; + } + } + DEBUG_ASSERT(handleAndGroup != nullptr); + + // Register this channel alone with the chain slot. + registerInputChannel(*handleAndGroup); + enableForInputChannel(*handleAndGroup); +} + +QuickEffectChainSlot::QuickEffectChainSlot(const QString& group, + EffectsManager* pEffectsManager) + : PerGroupEffectChainSlot(group, formatEffectChainSlotGroup(group), + pEffectsManager) { + // Add a single effect slot + addEffectSlot(formatEffectSlotGroup(group)); + // DlgPrefEq loads the Effect with loadEffectToGroup + + setSuperParameter(0.5); + setSuperParameterDefaultValue(0.5); +} + +QString QuickEffectChainSlot::formatEffectChainSlotGroup(const QString& group) { + return QString("[QuickEffectRack1_%1]").arg(group); +} + +QString QuickEffectChainSlot::formatEffectSlotGroup(const QString& group, + const int iEffectSlotNumber) { + return QString("[QuickEffectRack1_%1_Effect%2]") + .arg(group) + .arg(QString::number(iEffectSlotNumber + 1)); +} + + +EqualizerEffectChainSlot::EqualizerEffectChainSlot(const QString& group, + EffectsManager* pEffectsManager) + : PerGroupEffectChainSlot(group, formatEffectChainSlotGroup(group), + pEffectsManager) { + // Add a single effect slot + addEffectSlot(formatEffectSlotGroup(group)); + // DlgPrefEq loads the Effect with loadEffectToGroup + + setupLegacyAliasesForGroup(group); +} + +QString EqualizerEffectChainSlot::formatEffectChainSlotGroup(const QString& group) { + return QString("[EqualizerRack1_%1]").arg(group); +} + +QString EqualizerEffectChainSlot::formatEffectSlotGroup(const QString& group) { + return QString("[EqualizerRack1_%1_Effect1]") + .arg(group); +} + +void EqualizerEffectChainSlot::setupLegacyAliasesForGroup(const QString& group) { + // Create aliases for legacy EQ controls. + EffectSlotPointer pEffectSlot = getEffectSlot(0); + if (pEffectSlot) { + const QString& effectSlotGroup = pEffectSlot->getGroup(); + ControlDoublePrivate::insertAlias(ConfigKey(group, "filterLow"), + ConfigKey(effectSlotGroup, "parameter1")); + + ControlDoublePrivate::insertAlias(ConfigKey(group, "filterMid"), + ConfigKey(effectSlotGroup, "parameter2")); + + ControlDoublePrivate::insertAlias(ConfigKey(group, "filterHigh"), + ConfigKey(effectSlotGroup, "parameter3")); + + ControlDoublePrivate::insertAlias(ConfigKey(group, "filterLowKill"), + ConfigKey(effectSlotGroup, "button_parameter1")); + + ControlDoublePrivate::insertAlias(ConfigKey(group, "filterMidKill"), + ConfigKey(effectSlotGroup, "button_parameter2")); + + ControlDoublePrivate::insertAlias(ConfigKey(group, "filterHighKill"), + ConfigKey(effectSlotGroup, "button_parameter3")); + + ControlDoublePrivate::insertAlias(ConfigKey(group, "filterLow_loaded"), + ConfigKey(effectSlotGroup, "parameter1_loaded")); + + ControlDoublePrivate::insertAlias(ConfigKey(group, "filterMid_loaded"), + ConfigKey(effectSlotGroup, "parameter2_loaded")); + + ControlDoublePrivate::insertAlias(ConfigKey(group, "filterHigh_loaded"), + ConfigKey(effectSlotGroup, "parameter3_loaded")); + + ControlDoublePrivate::insertAlias(ConfigKey(group, "filterLowKill_loaded"), + ConfigKey(effectSlotGroup, "button_parameter1_loaded")); + + ControlDoublePrivate::insertAlias(ConfigKey(group, "filterMidKill_loaded"), + ConfigKey(effectSlotGroup, "button_parameter2_loaded")); + + ControlDoublePrivate::insertAlias(ConfigKey(group, "filterHighKill_loaded"), + ConfigKey(effectSlotGroup, "button_parameter3_loaded")); + } +} diff --git a/src/effects/specialeffectchainslots.h b/src/effects/specialeffectchainslots.h new file mode 100644 index 000000000000..a5d88f78e8e2 --- /dev/null +++ b/src/effects/specialeffectchainslots.h @@ -0,0 +1,54 @@ +#ifndef SPECIALEFFECTCHAINSLOTS_H +#define SPECIALEFFECTCHAINSLOTS_H + +#include "effects/effectchainslot.h" +#include "effects/effectsmanager.h" +#include "effects/effectslot.h" +#include "effects/defs.h" + +class StandardEffectChainSlot : public EffectChainSlot { + public: + StandardEffectChainSlot(unsigned int iChainNumber, + EffectsManager* pEffectsManager, + const QString& id = QString()); + static QString formatEffectChainSlotGroup(const int iChainNumber); + static QString formatEffectSlotGroup(const int iChainSlotNumber, + const int iEffectSlotNumber); +}; + +class OutputEffectChainSlot : public EffectChainSlot { + public: + OutputEffectChainSlot(EffectsManager* pEffectsManager); + + private: + static QString formatEffectChainSlotGroup(const QString& group); +}; + +class PerGroupEffectChainSlot : public EffectChainSlot { + public: + PerGroupEffectChainSlot(const QString& group, + const QString& chainSlotGroup, + EffectsManager* pEffectsManager); +}; + +class QuickEffectChainSlot : public PerGroupEffectChainSlot { + public: + QuickEffectChainSlot(const QString& group, + EffectsManager* pEffectsManager); + static QString formatEffectChainSlotGroup(const QString& group); + static QString formatEffectSlotGroup(const QString& group, + const int iEffectSlotNumber = 0); +}; + +class EqualizerEffectChainSlot : public PerGroupEffectChainSlot { + public: + EqualizerEffectChainSlot(const QString& group, + EffectsManager* pEffectsManager); + static QString formatEffectChainSlotGroup(const QString& group); + static QString formatEffectSlotGroup(const QString& group); + + private: + void setupLegacyAliasesForGroup(const QString& group); +}; + +#endif /* SPECIALEFFECTCHAINSLOTS_H */ diff --git a/src/engine/effects/engineeffectsmanager.cpp b/src/engine/effects/engineeffectsmanager.cpp index 8d51d5c791ba..81741696ebba 100644 --- a/src/engine/effects/engineeffectsmanager.cpp +++ b/src/engine/effects/engineeffectsmanager.cpp @@ -103,9 +103,9 @@ void EngineEffectsManager::processPreFaderInPlace(const ChannelHandle& inputHand const unsigned int sampleRate) { // Feature state is gathered after prefader effects processing. // This is okay because the equalizer and filter effects do not make use of it. - // However, if an effect is loaded into a QuickEffectRack that could make use + // However, if an effect is loaded into a QuickEffectChainSlot that could make use // of the GroupFeatureState, it will not sound the same as if it is loaded into - // a StandardEffectRack. + // a StandardEffectChainSlot. GroupFeatureState featureState; processInner(SignalProcessingStage::Prefader, inputHandle, outputHandle, diff --git a/src/engine/effects/message.h b/src/engine/effects/message.h index ac2afc018a14..e340c7fc333f 100644 --- a/src/engine/effects/message.h +++ b/src/engine/effects/message.h @@ -91,7 +91,6 @@ struct EffectsRequest { union { struct { EngineEffectChain* pChain; - int iIndex; SignalProcessingStage signalProcessingStage; } AddEffectChain; struct { diff --git a/src/mixer/playermanager.cpp b/src/mixer/playermanager.cpp index 97c1aa55be02..43a50c2cdf80 100644 --- a/src/mixer/playermanager.cpp +++ b/src/mixer/playermanager.cpp @@ -8,7 +8,6 @@ #include "control/controlobject.h" #include "control/controlobject.h" #include "effects/effectsmanager.h" -#include "effects/effectrack.h" #include "engine/enginedeck.h" #include "engine/enginemaster.h" #include "library/library.h" @@ -388,11 +387,7 @@ void PlayerManager::addDeckInner() { AudioInput(AudioInput::VINYLCONTROL, 0, 2, number - 1), pEngineDeck); // Setup equalizer rack for this deck. - EqualizerRackPointer pEqRack = m_pEffectsManager->getEqualizerRack(0); - VERIFY_OR_DEBUG_ASSERT(pEqRack) { - return; - } - pEqRack->setupForGroup(group); + m_pEffectsManager->addEqualizerEffectChainSlot(group); // BaseTrackPlayer needs to delay until we have setup the equalizer rack for // this deck to fetch the legacy EQ controls. @@ -400,11 +395,7 @@ void PlayerManager::addDeckInner() { pDeck->setupEqControls(); // Setup quick effect rack for this deck. - QuickEffectRackPointer pQuickEffectRack = m_pEffectsManager->getQuickEffectRack(0); - VERIFY_OR_DEBUG_ASSERT(pQuickEffectRack) { - return; - } - pQuickEffectRack->setupForGroup(group); + m_pEffectsManager->addQuickEffectChainSlot(group); } void PlayerManager::loadSamplers() { diff --git a/src/mixxx.cpp b/src/mixxx.cpp index e06ad510e971..a5bbdc563a18 100644 --- a/src/mixxx.cpp +++ b/src/mixxx.cpp @@ -208,9 +208,6 @@ void MixxxMainWindow::initialize(QApplication* pApp, const CmdlineArgs& args) { LV2Backend* pLV2Backend = nullptr; #endif - // Sets up the EffectChains and EffectRacks (long) - m_pEffectsManager->setupPerGroupRacks(); - launchProgress(8); // Although m_pSoundManager is created here, m_pSoundManager->setupDevices() diff --git a/src/preferences/dialog/dlgprefeq.cpp b/src/preferences/dialog/dlgprefeq.cpp index 094fdb37ba14..e73bf6494c04 100644 --- a/src/preferences/dialog/dlgprefeq.cpp +++ b/src/preferences/dialog/dlgprefeq.cpp @@ -28,7 +28,7 @@ #include "control/controlproxy.h" #include "util/math.h" #include "mixer/playermanager.h" -#include "effects/effectrack.h" +#include "effects/specialeffectchainslots.h" const QString kConfigKey = "[Mixer Profile]"; const QString kEnableEqs = "EnableEQs"; @@ -55,10 +55,6 @@ DlgPrefEQ::DlgPrefEQ(QWidget* pParent, EffectsManager* pEffectsManager, m_inSlotPopulateDeckEffectSelectors(false), m_bEqAutoReset(false), m_bGainAutoReset(false) { - m_pEQEffectRack = m_pEffectsManager->getEqualizerRack(0); - m_pQuickEffectRack = m_pEffectsManager->getQuickEffectRack(0); - m_pOutputEffectRack = m_pEffectsManager->getOutputsEffectRack(); - setupUi(this); // Connection connect(SliderHiEQ, SIGNAL(valueChanged(int)), this, SLOT(slotUpdateHiEQ())); @@ -453,11 +449,11 @@ void DlgPrefEQ::applySelections() { // Only apply the effect if it changed -- so first interrogate the // loaded effect if any. bool need_load = true; - if (m_pEQEffectRack->numEffectChainSlots() > deck) { + if (m_pEffectsManager->numEqualizerEffectChainSlots() > deck) { // It's not correct to get a chainslot by index number -- get by // group name instead. EffectChainSlotPointer chainslot = - m_pEQEffectRack->getGroupEffectChainSlot(group); + m_pEffectsManager->getEqualizerEffectChainSlot(group); if (chainslot) { EffectPointer effectpointer = chainslot->getEffectSlot(0)->getEffect(); @@ -469,7 +465,7 @@ void DlgPrefEQ::applySelections() { } if (need_load) { EffectPointer pEffect = m_pEffectsManager->instantiateEffect(effectId); - m_pEQEffectRack->loadEffectToGroup(group, pEffect); + m_pEffectsManager->loadEqualizerEffectToGroup(group, pEffect); m_pConfig->set(ConfigKey(kConfigKey, "EffectForGroup_" + group), ConfigValue(effectId)); m_filterWaveformEnableCOs[deck]->set(m_pEffectsManager->isEQ(effectId)); @@ -497,11 +493,11 @@ void DlgPrefEQ::applySelections() { // Only apply the effect if it changed -- so first interrogate the // loaded effect if any. bool need_load = true; - if (m_pQuickEffectRack->numEffectChainSlots() > deck) { + if (m_pEffectsManager->numQuickEffectChainSlots() > deck) { // It's not correct to get a chainslot by index number -- get by // group name instead. EffectChainSlotPointer chainslot = - m_pQuickEffectRack->getGroupEffectChainSlot(group); + m_pEffectsManager->getQuickEffectChainSlot(group); if (chainslot) { EffectPointer effectpointer = chainslot->getEffectSlot(0)->getEffect(); @@ -513,7 +509,7 @@ void DlgPrefEQ::applySelections() { } if (need_load) { EffectPointer pEffect = m_pEffectsManager->instantiateEffect(effectId); - m_pQuickEffectRack->loadEffectToGroup(group, pEffect); + m_pEffectsManager->loadQuickEffectToGroup(group, pEffect); m_pConfig->set(ConfigKey(kConfigKey, "QuickEffectForGroup_" + group), ConfigValue(effectId)); @@ -719,7 +715,7 @@ void DlgPrefEQ::slotMasterEqEffectChanged(int effectIndex) { pbResetMasterEq->show(); } - EffectChainSlotPointer pChainSlot = m_pOutputEffectRack->getEffectChainSlot(0); + auto pChainSlot = m_pEffectsManager->getOutputEffectChainSlot(); if (pChainSlot) { EffectPointer pEffect = m_pEffectsManager->instantiateEffect(effectId); @@ -801,21 +797,13 @@ void DlgPrefEQ::validate_levels() { } QString DlgPrefEQ::getEQEffectGroupForDeck(int deck) const { - // The EQ effect is loaded in effect slot 0. - if (m_pEQEffectRack) { - return m_pEQEffectRack->formatEffectSlotGroupString( - 0, PlayerManager::groupForDeck(deck)); - } - return QString(); + return EqualizerEffectChainSlot::formatEffectSlotGroup( + PlayerManager::groupForDeck(deck)); } QString DlgPrefEQ::getQuickEffectGroupForDeck(int deck) const { - // The quick effect is loaded in effect slot 0. - if (m_pQuickEffectRack) { - return m_pQuickEffectRack->formatEffectSlotGroupString( - 0, PlayerManager::groupForDeck(deck)); - } - return QString(); + return QuickEffectChainSlot::formatEffectSlotGroup( + PlayerManager::groupForDeck(deck)); } void DlgPrefEQ::slotMasterEQToDefault() { diff --git a/src/preferences/dialog/dlgprefeq.h b/src/preferences/dialog/dlgprefeq.h index 67f4dee52b87..021c61a381de 100644 --- a/src/preferences/dialog/dlgprefeq.h +++ b/src/preferences/dialog/dlgprefeq.h @@ -26,7 +26,6 @@ #include "control/controlproxy.h" #include "preferences/dlgpreferencepage.h" #include "effects/effectsmanager.h" -#include "effects/effectrack.h" /** *@author John Sully @@ -86,9 +85,6 @@ class DlgPrefEQ : public DlgPreferencePage, public Ui::DlgPrefEQDlg { // Members needed for changing the effects loaded on the EQ Effect Rack EffectsManager* m_pEffectsManager; - EqualizerRackPointer m_pEQEffectRack; - QuickEffectRackPointer m_pQuickEffectRack; - OutputEffectRackPointer m_pOutputEffectRack; QLabel* m_firstSelectorLabel; QList m_deckEqEffectSelectors; QList m_deckQuickEffectSelectors; diff --git a/src/preferences/dialog/dlgpreflv2.cpp b/src/preferences/dialog/dlgpreflv2.cpp index ce6edc52b741..65a60fc8490e 100644 --- a/src/preferences/dialog/dlgpreflv2.cpp +++ b/src/preferences/dialog/dlgpreflv2.cpp @@ -117,7 +117,7 @@ void DlgPrefLV2::slotApply() { EffectManifestParameterPointer pParameter = pCurrentEffectManifest->parameter(i); pParameter->setShowInParameterSlot(m_pluginParameters[i]->isChecked()); } - m_pEffectsManager->refreshAllRacks(); + m_pEffectsManager->refreshAllChainSlots(); } void DlgPrefLV2::slotUpdateOnParameterCheck(int state) { diff --git a/src/test/effectslottest.cpp b/src/test/effectslottest.cpp index 5715a446507f..f43b127eea7d 100644 --- a/src/test/effectslottest.cpp +++ b/src/test/effectslottest.cpp @@ -9,7 +9,6 @@ #include "effects/effectchainslot.h" #include "effects/effectsmanager.h" #include "effects/effectmanifest.h" -#include "effects/effectrack.h" #include "effects/effectslot.h" #include "test/baseeffecttest.h" @@ -31,19 +30,18 @@ class EffectSlotTest : public BaseEffectTest { }; TEST_F(EffectSlotTest, ControlsReflectSlotState) { - int iRackNumber = 0; int iChainNumber = 0; int iEffectNumber = 0; - StandardEffectRackPointer pRack = m_pEffectsManager->addStandardEffectRack(); - EffectChainSlotPointer pChainSlot = pRack->getEffectChainSlot(iChainNumber); - // StandardEffectRack::addEffectChainSlot automatically adds 4 effect + m_pEffectsManager->addStandardEffectChainSlots(); + EffectChainSlotPointer pChainSlot = m_pEffectsManager->getStandardEffectChainSlot(iChainNumber); + // StandardEffectChainSlot::addEffectChainSlot automatically adds 4 effect // slots. In the future we will probably remove this so this will just start // segfaulting. EffectSlotPointer pEffectSlot = pChainSlot->getEffectSlot(0); - QString group = StandardEffectRack::formatEffectSlotGroupString( - iRackNumber, iChainNumber, iEffectNumber); + QString group = StandardEffectChainSlot::formatEffectSlotGroup( + iChainNumber, iEffectNumber); EffectManifestPointer pManifest(new EffectManifest()); pManifest->setId("org.mixxx.test.effect"); diff --git a/src/test/metaknob_link_test.cpp b/src/test/metaknob_link_test.cpp index f39f1f4dcad9..2efa78556671 100644 --- a/src/test/metaknob_link_test.cpp +++ b/src/test/metaknob_link_test.cpp @@ -6,7 +6,7 @@ #include "controllers/softtakeover.h" #include "effects/effectparameterslot.h" #include "effects/effectchainslot.h" -#include "effects/effectrack.h" +#include "effects/specialeffectchainslots.h" #include "effects/effect.h" #include "effects/effectslot.h" #include "mixxxtest.h" @@ -25,16 +25,15 @@ class MetaLinkTest : public BaseEffectTest { m_pEffectsManager->registerInputChannel(m_headphone); registerTestBackend(); - int iRackNumber = 0; int iChainNumber = 0; int iEffectNumber = 0; - StandardEffectRackPointer pRack = m_pEffectsManager->addStandardEffectRack(); - m_pChainSlot = pRack->getEffectChainSlot(iChainNumber); + m_pEffectsManager->addStandardEffectChainSlots(); + m_pChainSlot = m_pEffectsManager->getStandardEffectChainSlot(iChainNumber); m_pEffectSlot = m_pChainSlot->getEffectSlot(iEffectNumber); - QString group = StandardEffectRack::formatEffectSlotGroupString( - iRackNumber, iChainNumber, iEffectNumber); + QString group = StandardEffectChainSlot::formatEffectSlotGroup( + iChainNumber, iEffectNumber); EffectManifestPointer pManifest(new EffectManifest()); pManifest->setId("org.mixxx.test.effect"); @@ -202,8 +201,7 @@ TEST_F(MetaLinkTest, HalfLinkTakeover) { // We have to recreate the effect because we want a neutral point at // 0 or 1. - QString group = StandardEffectRack::formatEffectSlotGroupString( - 0, 0, 0); + QString group = StandardEffectChainSlot::formatEffectSlotGroup(0, 0); EffectManifestPointer pManifest(new EffectManifest()); pManifest->setId("org.mixxx.test.effect2"); pManifest->setName("Test Effect2"); diff --git a/src/widget/effectwidgetutils.h b/src/widget/effectwidgetutils.h index f2fd08c1c75b..175a6c78d08c 100644 --- a/src/widget/effectwidgetutils.h +++ b/src/widget/effectwidgetutils.h @@ -5,43 +5,16 @@ #include "effects/effectsmanager.h" #include "effects/defs.h" -#include "effects/effectrack.h" #include "effects/effectslot.h" #include "skin/skincontext.h" class EffectWidgetUtils { public: - static EffectRackPointer getEffectRackFromNode( + static EffectChainSlotPointer getEffectChainSlotFromNode( const QDomNode& node, const SkinContext& context, EffectsManager* pEffectsManager) { if (pEffectsManager == nullptr) { - return EffectRackPointer(); - } - - // If specified, EffectRack always refers to a StandardEffectRack index. - bool rackNumberOk = false; - int rackNumber = context.selectInt(node, "EffectRack", - &rackNumberOk); - if (rackNumberOk) { - // XML effect nodes are 1-indexed. - return pEffectsManager->getStandardEffectRack(rackNumber - 1); - } - - // For custom racks, users can specify EffectRackGroup explicitly - // instead. - QString rackGroup; - if (!context.hasNodeSelectString(node, "EffectRackGroup", &rackGroup)) { - return EffectRackPointer(); - } - return pEffectsManager->getEffectRack(rackGroup); - } - - static EffectChainSlotPointer getEffectChainSlotFromNode( - const QDomNode& node, - const SkinContext& context, - EffectRackPointer pRack) { - if (pRack.isNull()) { return EffectChainSlotPointer(); } @@ -50,7 +23,7 @@ class EffectWidgetUtils { &unitNumberOk); if (unitNumberOk) { // XML effect nodes are 1-indexed. - return pRack->getEffectChainSlot(unitNumber - 1); + return pEffectsManager->getStandardEffectChainSlot(unitNumber - 1); } QString unitGroup; @@ -58,13 +31,7 @@ class EffectWidgetUtils { return EffectChainSlotPointer(); } - for (int i = 0; i < pRack->numEffectChainSlots(); ++i) { - EffectChainSlotPointer pSlot = pRack->getEffectChainSlot(i); - if (pSlot->getGroup() == unitGroup) { - return pSlot; - } - } - return EffectChainSlotPointer(); + return pEffectsManager->getEffectChainSlot(unitGroup); } static EffectSlotPointer getEffectSlotFromNode( diff --git a/src/widget/weffect.cpp b/src/widget/weffect.cpp index 8754a99987dc..25d8bd0ba975 100644 --- a/src/widget/weffect.cpp +++ b/src/widget/weffect.cpp @@ -14,10 +14,8 @@ WEffect::WEffect(QWidget* pParent, EffectsManager* pEffectsManager) void WEffect::setup(const QDomNode& node, const SkinContext& context) { WLabel::setup(node, context); // EffectWidgetUtils propagates NULLs so this is all safe. - EffectRackPointer pRack = EffectWidgetUtils::getEffectRackFromNode( - node, context, m_pEffectsManager); EffectChainSlotPointer pChainSlot = EffectWidgetUtils::getEffectChainSlotFromNode( - node, context, pRack); + node, context, m_pEffectsManager); EffectSlotPointer pEffectSlot = EffectWidgetUtils::getEffectSlotFromNode( node, context, pChainSlot); if (pEffectSlot) { diff --git a/src/widget/weffectbuttonparameter.cpp b/src/widget/weffectbuttonparameter.cpp index c78474476471..eccc3b003c1e 100644 --- a/src/widget/weffectbuttonparameter.cpp +++ b/src/widget/weffectbuttonparameter.cpp @@ -11,10 +11,8 @@ WEffectButtonParameter::WEffectButtonParameter(QWidget* pParent, EffectsManager* void WEffectButtonParameter::setup(const QDomNode& node, const SkinContext& context) { WLabel::setup(node, context); // EffectWidgetUtils propagates NULLs so this is all safe. - EffectRackPointer pRack = EffectWidgetUtils::getEffectRackFromNode( - node, context, m_pEffectsManager); EffectChainSlotPointer pChainSlot = EffectWidgetUtils::getEffectChainSlotFromNode( - node, context, pRack); + node, context, m_pEffectsManager); EffectSlotPointer pEffectSlot = EffectWidgetUtils::getEffectSlotFromNode( node, context, pChainSlot); EffectParameterSlotBasePointer pParameterSlot = diff --git a/src/widget/weffectchain.cpp b/src/widget/weffectchain.cpp index cb504e5901f7..b0441779c87d 100644 --- a/src/widget/weffectchain.cpp +++ b/src/widget/weffectchain.cpp @@ -13,10 +13,8 @@ WEffectChain::WEffectChain(QWidget* pParent, EffectsManager* pEffectsManager) void WEffectChain::setup(const QDomNode& node, const SkinContext& context) { WLabel::setup(node, context); // EffectWidgetUtils propagates NULLs so this is all safe. - EffectRackPointer pRack = EffectWidgetUtils::getEffectRackFromNode( - node, context, m_pEffectsManager); EffectChainSlotPointer pChainSlot = EffectWidgetUtils::getEffectChainSlotFromNode( - node, context, pRack); + node, context, m_pEffectsManager); if (pChainSlot) { setEffectChainSlot(pChainSlot); } else { diff --git a/src/widget/weffectparameter.cpp b/src/widget/weffectparameter.cpp index 4d4a22faf3f5..0f071e3fdf85 100644 --- a/src/widget/weffectparameter.cpp +++ b/src/widget/weffectparameter.cpp @@ -11,10 +11,8 @@ WEffectParameter::WEffectParameter(QWidget* pParent, EffectsManager* pEffectsMan void WEffectParameter::setup(const QDomNode& node, const SkinContext& context) { WLabel::setup(node, context); // EffectWidgetUtils propagates NULLs so this is all safe. - EffectRackPointer pRack = EffectWidgetUtils::getEffectRackFromNode( - node, context, m_pEffectsManager); EffectChainSlotPointer pChainSlot = EffectWidgetUtils::getEffectChainSlotFromNode( - node, context, pRack); + node, context, m_pEffectsManager); EffectSlotPointer pEffectSlot = EffectWidgetUtils::getEffectSlotFromNode( node, context, pChainSlot); EffectParameterSlotBasePointer pParameterSlot = diff --git a/src/widget/weffectselector.cpp b/src/widget/weffectselector.cpp index 11aaf2f330cd..67b1a0e91a6a 100644 --- a/src/widget/weffectselector.cpp +++ b/src/widget/weffectselector.cpp @@ -19,10 +19,8 @@ void WEffectSelector::setup(const QDomNode& node, const SkinContext& context) { m_scaleFactor = context.getScaleFactor(); // EffectWidgetUtils propagates NULLs so this is all safe. - m_pRack = EffectWidgetUtils::getEffectRackFromNode( - node, context, m_pEffectsManager); m_pChainSlot = EffectWidgetUtils::getEffectChainSlotFromNode( - node, context, m_pRack); + node, context, m_pEffectsManager); m_pEffectSlot = EffectWidgetUtils::getEffectSlotFromNode( node, context, m_pChainSlot); @@ -80,8 +78,7 @@ void WEffectSelector::populate() { void WEffectSelector::slotEffectSelected(int newIndex) { const QString id = itemData(newIndex).toString(); - m_pRack->maybeLoadEffect( - m_pChainSlot->getChainSlotNumber(), + m_pChainSlot->maybeLoadEffect( m_pEffectSlot->getEffectSlotNumber(), id); diff --git a/src/widget/weffectselector.h b/src/widget/weffectselector.h index a9816f62f2f3..264748491980 100644 --- a/src/widget/weffectselector.h +++ b/src/widget/weffectselector.h @@ -3,7 +3,6 @@ #include #include -#include "effects/effectrack.h" #include "effects/effectslot.h" #include "skin/skincontext.h" @@ -28,7 +27,6 @@ class WEffectSelector : public QComboBox, public WBaseWidget { EffectsManager* m_pEffectsManager; EffectSlotPointer m_pEffectSlot; EffectChainSlotPointer m_pChainSlot; - EffectRackPointer m_pRack; double m_scaleFactor; }; From e7a510c1c625005875ff7475b7824c67d882d35d Mon Sep 17 00:00:00 2001 From: Kshitij Gupta Date: Sat, 7 Jul 2018 07:47:18 +0530 Subject: [PATCH 005/443] Consolidated Effect and EffectSlot - Effect and EffectSlot classes had no clear separation of responsibility - Had to keep the duplicated state in both the classes in sync and thus was more susceptible to bugs - Ensured a loaded effect slot to have a corresponding EngineEffect added to the engine NOTE: XML saving/loading of effects is broken and will be re-implemented in the new architecture --- build/depends.py | 1 - src/controllers/controlpickermenu.cpp | 1 - src/effects/builtin/bessel4lvmixeqeffect.h | 1 - src/effects/builtin/bessel8lvmixeqeffect.h | 1 - src/effects/builtin/biquadfullkilleqeffect.h | 1 - src/effects/builtin/bitcrushereffect.h | 1 - src/effects/builtin/filtereffect.h | 1 - src/effects/builtin/graphiceqeffect.h | 1 - src/effects/builtin/linkwitzriley8eqeffect.h | 1 - src/effects/builtin/loudnesscontoureffect.h | 1 - src/effects/builtin/moogladder4filtereffect.h | 1 - src/effects/builtin/parametriceqeffect.h | 1 - src/effects/builtin/threebandbiquadeqeffect.h | 1 - src/effects/defs.h | 3 - src/effects/effect.cpp | 218 -------- src/effects/effect.h | 89 ---- src/effects/effectbuttonparameterslot.cpp | 19 +- src/effects/effectbuttonparameterslot.h | 4 +- src/effects/effectchainslot.cpp | 167 ++----- src/effects/effectchainslot.h | 33 +- src/effects/effectmanifest.h | 4 + src/effects/effectparameter.cpp | 10 +- src/effects/effectparameter.h | 5 +- src/effects/effectparameterslot.cpp | 19 +- src/effects/effectparameterslot.h | 4 +- src/effects/effectparameterslotbase.cpp | 11 +- src/effects/effectparameterslotbase.h | 6 +- src/effects/effectsbackend.cpp | 19 +- src/effects/effectsbackend.h | 11 +- src/effects/effectslot.cpp | 473 ++++++++++++------ src/effects/effectslot.h | 108 ++-- src/effects/effectsmanager.cpp | 108 ++-- src/effects/effectsmanager.h | 22 +- src/effects/lv2/lv2backend.cpp | 31 +- src/effects/lv2/lv2backend.h | 3 +- src/effects/specialeffectchainslots.cpp | 9 +- src/engine/effects/engineeffect.cpp | 2 +- src/engine/effects/engineeffectsmanager.cpp | 6 +- src/preferences/dialog/dlgprefeq.cpp | 106 ++-- src/preferences/dialog/dlgprefeq.h | 2 +- src/preferences/dialog/dlgpreflv2.cpp | 5 + src/widget/weffect.cpp | 15 +- src/widget/weffectparameterknob.h | 2 + src/widget/weffectparameterknobcomposed.h | 2 + src/widget/weffectselector.cpp | 21 +- 45 files changed, 671 insertions(+), 879 deletions(-) delete mode 100644 src/effects/effect.cpp delete mode 100644 src/effects/effect.h diff --git a/build/depends.py b/build/depends.py index e42a535d7d7e..49b0616db4c0 100644 --- a/build/depends.py +++ b/build/depends.py @@ -693,7 +693,6 @@ def sources(self, build): "effects/effectmanifest.cpp", "effects/effectmanifestparameter.cpp", - "effects/effect.cpp", "effects/effectparameter.cpp", "effects/effectchainslot.cpp", diff --git a/src/controllers/controlpickermenu.cpp b/src/controllers/controlpickermenu.cpp index b4d6193bb2b3..18b88b4d4861 100644 --- a/src/controllers/controlpickermenu.cpp +++ b/src/controllers/controlpickermenu.cpp @@ -4,7 +4,6 @@ #include "mixer/playermanager.h" #include "engine/cuecontrol.h" #include "engine/loopingcontrol.h" -#include "effects/effectchainslot.h" #include "effects/specialeffectchainslots.h" #include "effects/effectslot.h" #include "effects/effectparameterslot.h" diff --git a/src/effects/builtin/bessel4lvmixeqeffect.h b/src/effects/builtin/bessel4lvmixeqeffect.h index 87ac83bd9b2d..68bc4f68f0a2 100644 --- a/src/effects/builtin/bessel4lvmixeqeffect.h +++ b/src/effects/builtin/bessel4lvmixeqeffect.h @@ -4,7 +4,6 @@ #include #include "control/controlproxy.h" -#include "effects/effect.h" #include "effects/effectprocessor.h" #include "effects/builtin/lvmixeqbase.h" #include "engine/effects/engineeffect.h" diff --git a/src/effects/builtin/bessel8lvmixeqeffect.h b/src/effects/builtin/bessel8lvmixeqeffect.h index a65a21dad8e0..f9f5eedf45fb 100644 --- a/src/effects/builtin/bessel8lvmixeqeffect.h +++ b/src/effects/builtin/bessel8lvmixeqeffect.h @@ -6,7 +6,6 @@ #include #include "control/controlproxy.h" -#include "effects/effect.h" #include "effects/effectprocessor.h" #include "engine/effects/engineeffect.h" #include "engine/effects/engineeffectparameter.h" diff --git a/src/effects/builtin/biquadfullkilleqeffect.h b/src/effects/builtin/biquadfullkilleqeffect.h index 67bfffcfe7f9..8296e399a02c 100644 --- a/src/effects/builtin/biquadfullkilleqeffect.h +++ b/src/effects/builtin/biquadfullkilleqeffect.h @@ -2,7 +2,6 @@ #define BIQUADFULLKILLEQEFFECT_H #include "control/controlproxy.h" -#include "effects/effect.h" #include "effects/effectprocessor.h" #include "engine/effects/engineeffect.h" #include "engine/effects/engineeffectparameter.h" diff --git a/src/effects/builtin/bitcrushereffect.h b/src/effects/builtin/bitcrushereffect.h index 88d102719cc8..18dcbf203603 100644 --- a/src/effects/builtin/bitcrushereffect.h +++ b/src/effects/builtin/bitcrushereffect.h @@ -3,7 +3,6 @@ #include -#include "effects/effect.h" #include "effects/effectprocessor.h" #include "engine/effects/engineeffect.h" #include "engine/effects/engineeffectparameter.h" diff --git a/src/effects/builtin/filtereffect.h b/src/effects/builtin/filtereffect.h index 2d96226c8d16..8407fdfcbc8a 100644 --- a/src/effects/builtin/filtereffect.h +++ b/src/effects/builtin/filtereffect.h @@ -1,7 +1,6 @@ #ifndef FILTEREFFECT_H #define FILTEREFFECT_H -#include "effects/effect.h" #include "effects/effectprocessor.h" #include "engine/effects/engineeffect.h" #include "engine/effects/engineeffectparameter.h" diff --git a/src/effects/builtin/graphiceqeffect.h b/src/effects/builtin/graphiceqeffect.h index 673f6efe889a..70a9eb278382 100644 --- a/src/effects/builtin/graphiceqeffect.h +++ b/src/effects/builtin/graphiceqeffect.h @@ -4,7 +4,6 @@ #include #include "control/controlproxy.h" -#include "effects/effect.h" #include "effects/effectprocessor.h" #include "engine/effects/engineeffect.h" #include "engine/effects/engineeffectparameter.h" diff --git a/src/effects/builtin/linkwitzriley8eqeffect.h b/src/effects/builtin/linkwitzriley8eqeffect.h index 5cbd72966066..d7d4e5c9deee 100644 --- a/src/effects/builtin/linkwitzriley8eqeffect.h +++ b/src/effects/builtin/linkwitzriley8eqeffect.h @@ -4,7 +4,6 @@ #include #include "control/controlproxy.h" -#include "effects/effect.h" #include "effects/effectprocessor.h" #include "engine/effects/engineeffect.h" #include "engine/effects/engineeffectparameter.h" diff --git a/src/effects/builtin/loudnesscontoureffect.h b/src/effects/builtin/loudnesscontoureffect.h index ccff153543f2..bae2f88d264d 100644 --- a/src/effects/builtin/loudnesscontoureffect.h +++ b/src/effects/builtin/loudnesscontoureffect.h @@ -2,7 +2,6 @@ #define LOUDNESSCONTOUREFFECT_H #include "control/controlproxy.h" -#include "effects/effect.h" #include "effects/effectprocessor.h" #include "engine/effects/engineeffect.h" #include "engine/effects/engineeffectparameter.h" diff --git a/src/effects/builtin/moogladder4filtereffect.h b/src/effects/builtin/moogladder4filtereffect.h index d540aa3868d2..c0b19bb7107d 100644 --- a/src/effects/builtin/moogladder4filtereffect.h +++ b/src/effects/builtin/moogladder4filtereffect.h @@ -1,7 +1,6 @@ #ifndef MOOGLADDER4FILTEREFFECT_H #define MOOGLADDER4FILTEREFFECT_H -#include "effects/effect.h" #include "effects/effectprocessor.h" #include "engine/effects/engineeffect.h" #include "engine/effects/engineeffectparameter.h" diff --git a/src/effects/builtin/parametriceqeffect.h b/src/effects/builtin/parametriceqeffect.h index 4ca4cdc10506..1641c8d56ac6 100644 --- a/src/effects/builtin/parametriceqeffect.h +++ b/src/effects/builtin/parametriceqeffect.h @@ -5,7 +5,6 @@ #include #include "control/controlproxy.h" -#include "effects/effect.h" #include "effects/effectprocessor.h" #include "engine/effects/engineeffect.h" #include "engine/effects/engineeffectparameter.h" diff --git a/src/effects/builtin/threebandbiquadeqeffect.h b/src/effects/builtin/threebandbiquadeqeffect.h index d08d87286c15..13c326381320 100644 --- a/src/effects/builtin/threebandbiquadeqeffect.h +++ b/src/effects/builtin/threebandbiquadeqeffect.h @@ -2,7 +2,6 @@ #define THREEBANDBIQUADEQEFFECT_H #include "control/controlproxy.h" -#include "effects/effect.h" #include "effects/effectprocessor.h" #include "engine/effects/engineeffect.h" #include "engine/effects/engineeffectparameter.h" diff --git a/src/effects/defs.h b/src/effects/defs.h index b3783c183757..a400ae1dcb04 100644 --- a/src/effects/defs.h +++ b/src/effects/defs.h @@ -56,9 +56,6 @@ typedef QSharedPointer EffectButtonParameterSlotPoint class EffectManifest; typedef QSharedPointer EffectManifestPointer; -class Effect; -typedef QSharedPointer EffectPointer; - class EffectParameterSlotBase; typedef QSharedPointer EffectParameterSlotBasePointer; diff --git a/src/effects/effect.cpp b/src/effects/effect.cpp deleted file mode 100644 index 87b66516e443..000000000000 --- a/src/effects/effect.cpp +++ /dev/null @@ -1,218 +0,0 @@ -#include - -#include "effects/effect.h" -#include "effects/effectprocessor.h" -#include "effects/effectsmanager.h" -#include "effects/effectxmlelements.h" -#include "engine/effects/engineeffectchain.h" -#include "engine/effects/engineeffect.h" -#include "util/xml.h" - -Effect::Effect(EffectsManager* pEffectsManager, - EffectManifestPointer pManifest, - EffectInstantiatorPointer pInstantiator) - : QObject(), // no parent - m_pEffectsManager(pEffectsManager), - m_pManifest(pManifest), - m_pInstantiator(pInstantiator), - m_pEngineEffect(NULL), - m_bAddedToEngine(false), - m_bEnabled(false) { - for (const auto& pManifestParameter: m_pManifest->parameters()) { - EffectParameter* pParameter = new EffectParameter( - this, pEffectsManager, m_parameters.size(), pManifestParameter); - m_parameters.append(pParameter); - if (m_parametersById.contains(pParameter->id())) { - qWarning() << debugString() << "WARNING: Loaded EffectManifest that had parameters with duplicate IDs. Dropping one of them."; - } - m_parametersById[pParameter->id()] = pParameter; - } - //qDebug() << debugString() << "created" << this; -} - -Effect::~Effect() { - //qDebug() << debugString() << "destroyed" << this; - m_parametersById.clear(); - for (int i = 0; i < m_parameters.size(); ++i) { - EffectParameter* pParameter = m_parameters.at(i); - m_parameters[i] = NULL; - delete pParameter; - } -} - -EffectState* Effect::createState(const mixxx::EngineParameters& bufferParameters) { - return m_pEngineEffect->createState(bufferParameters); -} - -void Effect::addToEngine(EngineEffectChain* pChain, int iIndex, - const QSet& activeInputChannels) { - VERIFY_OR_DEBUG_ASSERT(pChain) { - return; - } - VERIFY_OR_DEBUG_ASSERT(m_pEngineEffect == nullptr) { - return; - } - VERIFY_OR_DEBUG_ASSERT(!m_bAddedToEngine) { - return; - } - - m_pEngineEffect = new EngineEffect(m_pManifest, - activeInputChannels, - m_pEffectsManager, - m_pInstantiator); - - EffectsRequest* request = new EffectsRequest(); - request->type = EffectsRequest::ADD_EFFECT_TO_CHAIN; - request->pTargetChain = pChain; - request->AddEffectToChain.pEffect = m_pEngineEffect; - request->AddEffectToChain.iIndex = iIndex; - m_pEffectsManager->writeRequest(request); - - m_bAddedToEngine = true; -} - -void Effect::removeFromEngine(EngineEffectChain* pChain, int iIndex) { - VERIFY_OR_DEBUG_ASSERT(pChain) { - return; - } - VERIFY_OR_DEBUG_ASSERT(m_pEngineEffect != nullptr) { - return; - } - VERIFY_OR_DEBUG_ASSERT(m_bAddedToEngine) { - return; - } - - EffectsRequest* request = new EffectsRequest(); - request->type = EffectsRequest::REMOVE_EFFECT_FROM_CHAIN; - request->pTargetChain = pChain; - request->RemoveEffectFromChain.pEffect = m_pEngineEffect; - request->RemoveEffectFromChain.iIndex = iIndex; - m_pEffectsManager->writeRequest(request); - m_pEngineEffect = NULL; - - m_bAddedToEngine = false; -} - -void Effect::updateEngineState() { - if (!m_pEngineEffect) { - return; - } - sendParameterUpdate(); - foreach (EffectParameter* pParameter, m_parameters) { - pParameter->updateEngineState(); - } -} - -EngineEffect* Effect::getEngineEffect() { - return m_pEngineEffect; -} - -EffectManifestPointer Effect::getManifest() const { - return m_pManifest; -} - -void Effect::setEnabled(bool enabled) { - if (enabled != m_bEnabled) { - m_bEnabled = enabled; - updateEngineState(); - emit(enabledChanged(m_bEnabled)); - } -} - -bool Effect::enabled() const { - return m_bEnabled; -} - -void Effect::sendParameterUpdate() { - if (!m_pEngineEffect) { - return; - } - EffectsRequest* pRequest = new EffectsRequest(); - pRequest->type = EffectsRequest::SET_EFFECT_PARAMETERS; - pRequest->pTargetEffect = m_pEngineEffect; - pRequest->SetEffectParameters.enabled = m_bEnabled; - m_pEffectsManager->writeRequest(pRequest); -} - -unsigned int Effect::numKnobParameters() const { - unsigned int num = 0; - foreach(const EffectParameter* parameter, m_parameters) { - if (parameter->manifest()->controlHint() != - EffectManifestParameter::ControlHint::TOGGLE_STEPPING) { - ++num; - } - } - return num; -} - -unsigned int Effect::numButtonParameters() const { - unsigned int num = 0; - foreach(const EffectParameter* parameter, m_parameters) { - if (parameter->manifest()->controlHint() == - EffectManifestParameter::ControlHint::TOGGLE_STEPPING) { - ++num; - } - } - return num; -} - -EffectParameter* Effect::getParameterById(const QString& id) const { - EffectParameter* pParameter = m_parametersById.value(id, NULL); - if (pParameter == NULL) { - qWarning() << debugString() << "getParameterById" - << "WARNING: parameter for id does not exist:" << id; - } - return pParameter; -} - -// static -bool Effect::isButtonParameter(EffectParameter* parameter) { - return parameter->manifest()->controlHint() == - EffectManifestParameter::ControlHint::TOGGLE_STEPPING; -} - -// static -bool Effect::isKnobParameter(EffectParameter* parameter) { - return !isButtonParameter(parameter); -} - -EffectParameter* Effect::getFilteredParameterForSlot(ParameterFilterFnc filterFnc, - unsigned int slotNumber) { - // It's normal to ask for a parameter that doesn't exist. Callers must check - // for NULL. - unsigned int num = 0; - for (const auto& parameter: m_parameters) { - if (parameter->manifest()->showInParameterSlot() && filterFnc(parameter)) { - if(num == slotNumber) { - return parameter; - } - ++num; - } - } - return NULL; -} - -EffectParameter* Effect::getKnobParameterForSlot(unsigned int slotNumber) { - return getFilteredParameterForSlot(isKnobParameter, slotNumber); -} - -EffectParameter* Effect::getButtonParameterForSlot(unsigned int slotNumber) { - return getFilteredParameterForSlot(isButtonParameter, slotNumber); -} - -// static -EffectPointer Effect::createFromXml(EffectsManager* pEffectsManager, - const QDomElement& element) { - // Empty elements are used to preserve chain order - // when there are empty slots at the beginning of the chain. - if (!element.hasChildNodes()) { - return EffectPointer(); - } - QString effectId = XmlParse::selectNodeQString(element, EffectXml::EffectId); - EffectPointer pEffect = pEffectsManager->instantiateEffect(effectId); - return pEffect; -} - -double Effect::getMetaknobDefault() { - return m_pManifest->metaknobDefault(); -} diff --git a/src/effects/effect.h b/src/effects/effect.h deleted file mode 100644 index 272cbfc3d109..000000000000 --- a/src/effects/effect.h +++ /dev/null @@ -1,89 +0,0 @@ -#ifndef EFFECT_H -#define EFFECT_H - -#include -#include - -#include "engine/channelhandle.h" -#include "engine/engine.h" -#include "effects/effectmanifest.h" -#include "effects/effectparameter.h" -#include "effects/effectinstantiator.h" -#include "util/class.h" - -class EffectState; -class EffectProcessor; -class EngineEffectChain; -class EngineEffect; -class EffectsManager; - -// The Effect class is the main-thread representation of an instantiation of an -// effect. This class is NOT thread safe and must only be used by the main -// thread. The getEngineEffect() method can be used to get a pointer to the -// Engine-thread representation of the effect. -class Effect : public QObject { - Q_OBJECT - public: - typedef bool (*ParameterFilterFnc)(EffectParameter*); - - Effect(EffectsManager* pEffectsManager, - EffectManifestPointer pManifest, - EffectInstantiatorPointer pInstantiator); - virtual ~Effect(); - - EffectState* createState(const mixxx::EngineParameters& bufferParameters); - - EffectManifestPointer getManifest() const; - - unsigned int numKnobParameters() const; - unsigned int numButtonParameters() const; - - static bool isButtonParameter(EffectParameter* parameter); - static bool isKnobParameter(EffectParameter* parameter); - - EffectParameter* getFilteredParameterForSlot( - ParameterFilterFnc filterFnc, unsigned int slotNumber); - EffectParameter* getKnobParameterForSlot(unsigned int slotNumber); - EffectParameter* getButtonParameterForSlot(unsigned int slotNumber); - - EffectParameter* getParameterById(const QString& id) const; - EffectParameter* getButtonParameterById(const QString& id) const; - - void setEnabled(bool enabled); - bool enabled() const; - - EngineEffect* getEngineEffect(); - - void addToEngine(EngineEffectChain* pChain, int iIndex, - const QSet& activeInputChannels); - void removeFromEngine(EngineEffectChain* pChain, int iIndex); - void updateEngineState(); - - static EffectPointer createFromXml(EffectsManager* pEffectsManager, - const QDomElement& element); - - double getMetaknobDefault(); - - signals: - void enabledChanged(bool enabled); - - private: - QString debugString() const { - return QString("Effect(%1)").arg(m_pManifest->name()); - } - - void sendParameterUpdate(); - - EffectsManager* m_pEffectsManager; - EffectManifestPointer m_pManifest; - EffectInstantiatorPointer m_pInstantiator; - EngineEffect* m_pEngineEffect; - bool m_bAddedToEngine; - bool m_bEnabled; - QList m_parameters; - QMap m_parametersById; - - DISALLOW_COPY_AND_ASSIGN(Effect); -}; - -#endif /* EFFECT_H */ diff --git a/src/effects/effectbuttonparameterslot.cpp b/src/effects/effectbuttonparameterslot.cpp index 94d83a23eb1c..3e1db1402f38 100644 --- a/src/effects/effectbuttonparameterslot.cpp +++ b/src/effects/effectbuttonparameterslot.cpp @@ -1,7 +1,8 @@ #include -#include "control/controleffectknob.h" +#include "effects/effectslot.h" #include "effects/effectbuttonparameterslot.h" +#include "control/controleffectknob.h" #include "effects/effectxmlelements.h" #include "control/controlobject.h" #include "control/controlpushbutton.h" @@ -32,21 +33,21 @@ EffectButtonParameterSlot::EffectButtonParameterSlot(const QString& group, } EffectButtonParameterSlot::~EffectButtonParameterSlot() { - //qDebug() << debugString() << "destroyed"; + // qDebug() << debugString() << "destroyed"; // m_pControlLoaded and m_pControlType are deleted by ~EffectParameterSlotBase delete m_pControlValue; } -void EffectButtonParameterSlot::loadEffect(EffectPointer pEffect) { - //qDebug() << debugString() << "loadEffect" << (pEffect ? pEffect->getManifest().name() : "(null)"); +void EffectButtonParameterSlot::loadEffect(EffectSlot* pEffectSlot) { + // qDebug() << debugString() << "loadEffect" << (pEffectSlot ? pEffectSlot->getManifest().name() : "(null)"); if (m_pEffectParameter) { clear(); } - if (pEffect) { - m_pEffect = pEffect; + if (pEffectSlot) { + m_pEffectSlot = pEffectSlot; // Returns null if it doesn't have a parameter for that number - m_pEffectParameter = pEffect->getButtonParameterForSlot(m_iParameterSlotNumber); + m_pEffectParameter = pEffectSlot->getButtonParameterForSlot(m_iParameterSlotNumber); if (m_pEffectParameter) { // Set the number of states @@ -89,10 +90,10 @@ void EffectButtonParameterSlot::clear() { //qDebug() << debugString() << "clear"; if (m_pEffectParameter) { m_pEffectParameter->disconnect(this); - m_pEffectParameter = NULL; + m_pEffectParameter = nullptr; } - m_pEffect.clear(); + m_pEffectSlot = nullptr; m_pControlLoaded->forceSet(0.0); m_pControlValue->set(0.0); m_pControlValue->setDefaultValue(0.0); diff --git a/src/effects/effectbuttonparameterslot.h b/src/effects/effectbuttonparameterslot.h index 20a2a1000855..4a8c14766589 100644 --- a/src/effects/effectbuttonparameterslot.h +++ b/src/effects/effectbuttonparameterslot.h @@ -5,8 +5,8 @@ #include #include +// #include "effects/defs.h" #include "control/controlobject.h" -#include "effects/effect.h" #include "effects/effectparameterslotbase.h" #include "util/class.h" @@ -24,7 +24,7 @@ class EffectButtonParameterSlot : public EffectParameterSlotBase { } // Load the parameter of the given effect into this EffectButtonParameterSlot - void loadEffect(EffectPointer pEffect); + void loadEffect(EffectSlot* pEffectSlot); // Clear the currently loaded effect void clear(); diff --git a/src/effects/effectchainslot.cpp b/src/effects/effectchainslot.cpp index c4591b8ca6d2..f9026d2a38c9 100644 --- a/src/effects/effectchainslot.cpp +++ b/src/effects/effectchainslot.cpp @@ -21,14 +21,12 @@ EffectChainSlot::EffectChainSlot(const QString& group, EffectsManager* pEffectsManager, SignalProcessingStage stage, - const bool hasMetaknob, const QString& id) : // The control group names are 1-indexed while internally everything // is 0-indexed. m_group(group), m_pEffectsManager(pEffectsManager), m_signalProcessingStage(stage), - m_bHasMetaknob(hasMetaknob), m_id(id), m_name(""), m_description(""), @@ -113,7 +111,9 @@ EffectChainSlot::EffectChainSlot(const QString& group, EffectChainSlot::~EffectChainSlot() { //qDebug() << debugString() << "destroyed"; - clear(); + + m_effectSlots.clear(); + delete m_pControlClear; delete m_pControlNumEffects; delete m_pControlNumEffectSlots; @@ -135,7 +135,6 @@ EffectChainSlot::~EffectChainSlot() { it = m_channelInfoByName.erase(it); } - m_slots.clear(); removeFromEngine(); } @@ -149,24 +148,14 @@ void EffectChainSlot::addToEngine() { pRequest->AddEffectChain.pChain = m_pEngineEffectChain; m_pEffectsManager->writeRequest(pRequest); - // Add all effects. - for (int i = 0; i < m_effects.size(); ++i) { - // Add the effect to the engine. - EffectPointer pEffect = m_effects[i]; - if (pEffect) { - pEffect->addToEngine(m_pEngineEffectChain, i, m_enabledInputChannels); - } - } + VERIFY_OR_DEBUG_ASSERT(!m_enabledInputChannels.size()); + sendParameterUpdate(); } void EffectChainSlot::removeFromEngine() { - // Order doesn't matter when removing. - for (int i = 0; i < m_effects.size(); ++i) { - EffectPointer pEffect = m_effects[i]; - if (pEffect) { - pEffect->removeFromEngine(m_pEngineEffectChain, i); - } + VERIFY_OR_DEBUG_ASSERT(m_effectSlots.isEmpty()) { + m_effectSlots.clear(); } EffectsRequest* pRequest = new EffectsRequest(); @@ -196,78 +185,19 @@ void EffectChainSlot::setDescription(const QString& description) { emit(updated()); } -void EffectChainSlot::addEffect(EffectPointer pEffect) { - // qDebug() << debugString() << "addEffect" << pEffect; - if (!pEffect) { - // Insert empty effects to preserve chain order - // when loading chains with empty effects - m_effects.append(pEffect); - return; - } - - VERIFY_OR_DEBUG_ASSERT(!m_effects.contains(pEffect)) { - return; - } - - m_effects.append(pEffect); - pEffect->addToEngine(m_pEngineEffectChain, m_effects.size() - 1, m_enabledInputChannels); - slotChainEffectChanged(m_effects.size() - 1); +void EffectChainSlot::loadEffect(const unsigned int iEffectSlotNumber, + EffectManifestPointer pManifest, + EffectInstantiatorPointer pInstantiator) { + m_effectSlots[iEffectSlotNumber]->loadEffect(pManifest, pInstantiator, + m_enabledInputChannels); } -void EffectChainSlot::maybeLoadEffect(const unsigned int iEffectSlotNumber, - const QString& id) { - EffectSlotPointer pEffectSlot = getEffectSlot(iEffectSlotNumber); - - bool loadNew = false; - if (pEffectSlot == nullptr || pEffectSlot->getEffect() == nullptr) { - loadNew = true; - } else if (id != pEffectSlot->getEffect()->getManifest()->id()) { - loadNew = true; - } - - if (loadNew) { - EffectPointer pEffect = m_pEffectsManager->instantiateEffect(id); - replaceEffect(iEffectSlotNumber, pEffect); +void EffectChainSlot::reloadAllEffects() { + for (EffectSlotPointer pSlot : m_effectSlots) { + pSlot->reload(m_enabledInputChannels); } } -void EffectChainSlot::replaceEffect(unsigned int effectSlotNumber, - EffectPointer pEffect) { - // qDebug() << debugString() << "replaceEffect" << effectSlotNumber << pEffect; - while (effectSlotNumber >= static_cast(m_effects.size())) { - if (pEffect.isNull()) { - return; - } - m_effects.append(EffectPointer()); - } - - EffectPointer pOldEffect = m_effects[effectSlotNumber]; - if (!pOldEffect.isNull()) { - pOldEffect->removeFromEngine(m_pEngineEffectChain, effectSlotNumber); - } - - m_effects.replace(effectSlotNumber, pEffect); - if (!pEffect.isNull()) { - pEffect->addToEngine(m_pEngineEffectChain, effectSlotNumber, m_enabledInputChannels); - } - - slotChainEffectChanged(effectSlotNumber); -} - -void EffectChainSlot::removeEffect(unsigned int effectSlotNumber) { - replaceEffect(effectSlotNumber, EffectPointer()); -} - -void EffectChainSlot::refreshAllEffects() { - for (int i = 0; i < m_effects.size(); ++i) { - slotChainEffectChanged(i); - } -} - -const QList& EffectChainSlot::effects() const { - return m_effects; -} - void EffectChainSlot::sendParameterUpdate() { EffectsRequest* pRequest = new EffectsRequest(); pRequest->type = EffectsRequest::SET_EFFECT_CHAIN_PARAMETERS; @@ -300,44 +230,12 @@ void EffectChainSlot::setSuperParameterDefaultValue(double value) { m_pControlChainSuperParameter->setDefaultValue(value); } -void EffectChainSlot::slotChainEffectChanged(unsigned int effectSlotNumber) { - qDebug() << debugString() << "slotChainEffectChanged" << effectSlotNumber; - EffectSlotPointer pSlot; - EffectPointer pEffect; - - if (m_effects.size() > m_slots.size()) { - qWarning() << debugString() << "has too few slots for effect"; - } - if (effectSlotNumber < (unsigned) m_slots.size()) { - pSlot = m_slots.at(effectSlotNumber); - } - if (effectSlotNumber < (unsigned) m_effects.size()) { - pEffect = m_effects.at(effectSlotNumber); - } - if (pSlot != nullptr) { - pSlot->loadEffect(pEffect, m_bHasMetaknob && m_pEffectsManager->isAdoptMetaknobValueEnabled()); - } - - m_pControlNumEffects->forceSet(math_min( - static_cast(m_slots.size()), - static_cast(m_effects.size()))); -} - -void EffectChainSlot::clear() { - m_pControlNumEffects->forceSet(0.0); - m_pControlChainLoaded->forceSet(0.0); - m_pControlChainMixMode->set( - static_cast(EffectChainMixMode::DrySlashWet)); -} - EffectSlotPointer EffectChainSlot::addEffectSlot(const QString& group) { // qDebug() << debugString() << "addEffectSlot" << group; - EffectSlot* pEffectSlot = new EffectSlot(group, m_slots.size()); - connect(pEffectSlot, SIGNAL(clearEffect(unsigned int)), - this, SLOT(slotClearEffect(unsigned int))); + EffectSlot* pEffectSlot = new EffectSlot(group, m_pEffectsManager, m_effectSlots.size(), m_pEngineEffectChain); EffectSlotPointer pSlot(pEffectSlot); - m_slots.append(pSlot); + m_effectSlots.append(pSlot); int numEffectSlots = m_pControlNumEffectSlots->get() + 1; m_pControlNumEffectSlots->forceSet(numEffectSlots); m_pControlChainFocusedEffect->setStates(numEffectSlots); @@ -368,25 +266,18 @@ void EffectChainSlot::registerInputChannel(const ChannelHandleAndGroup& handle_g &m_channelStatusMapper, SLOT(map())); } -void EffectChainSlot::slotClearEffect(unsigned int iEffectSlotNumber) { - removeEffect(iEffectSlotNumber); -} - EffectSlotPointer EffectChainSlot::getEffectSlot(unsigned int slotNumber) { //qDebug() << debugString() << "getEffectSlot" << slotNumber; - if (slotNumber >= static_cast(m_slots.size())) { + if (slotNumber >= static_cast(m_effectSlots.size())) { qWarning() << "WARNING: slotNumber out of range"; return EffectSlotPointer(); } - return m_slots[slotNumber]; + return m_effectSlots[slotNumber]; } void EffectChainSlot::slotControlClear(double v) { - if (v > 0) { - for (EffectSlotPointer pSlot : m_slots) { - pSlot->clear(); - } - clear(); + for (EffectSlotPointer pSlot : m_effectSlots) { + pSlot->slotClear(v); } } @@ -394,7 +285,7 @@ void EffectChainSlot::slotControlChainSuperParameter(double v, bool force) { // qDebug() << debugString() << "slotControlChainSuperParameter" << v; m_pControlChainSuperParameter->set(v); - for (const auto& pSlot : m_slots) { + for (const auto& pSlot : m_effectSlots) { pSlot->setMetaParameter(v, force); } } @@ -457,15 +348,15 @@ void EffectChainSlot::enableForInputChannel(const ChannelHandleAndGroup& handle_ MAX_BUFFER_LEN / mixxx::kEngineChannelCount); // TODO: Simplify by defining a method to create an EffectState for the input channel - for (int i = 0; i < m_effects.size(); ++i) { + for (int i = 0; i < m_effectSlots.size(); ++i) { auto& statesMap = (*pEffectStatesMapArray)[i]; - if (m_effects[i] != nullptr) { + if (m_effectSlots[i]->isLoaded()) { for (const auto& outputChannel : m_pEffectsManager->registeredOutputChannels()) { if (kEffectDebugOutput) { qDebug() << debugString() << "EffectChain::enableForInputChannel creating EffectState for input" << handle_group << "output" << outputChannel; } statesMap.insert(outputChannel.handle(), - m_effects[i]->createState(bufferParameters)); + m_effectSlots[i]->createState(bufferParameters)); } } else { for (EffectState* pState : statesMap) { @@ -512,7 +403,7 @@ QDomElement EffectChainSlot::toXml(QDomDocument* doc) const { // QString::number(m_pControlChainSuperParameter->get())); // QDomElement effectsElement = doc->createElement(EffectXml::EffectsRoot); - // for (const auto& pEffectSlot : m_slots) { + // for (const auto& pEffectSlot : m_effectSlots) { // QDomElement effectNode; // if (pEffectSlot->getEffect()) { // effectNode = pEffectSlot->toXml(doc); @@ -542,12 +433,12 @@ void EffectChainSlot::loadChainSlotFromXml(const QDomElement& effectChainElement // QDomElement effectsElement = XmlParse::selectElement(effectChainElement, // EffectXml::EffectsRoot); // QDomNodeList effectsNodeList = effectsElement.childNodes(); - // for (int i = 0; i < m_slots.size(); ++i) { - // if (m_slots[i] != nullptr) { + // for (int i = 0; i < m_effectSlots.size(); ++i) { + // if (m_effectSlots[i] != nullptr) { // QDomNode effectNode = effectsNodeList.at(i); // if (effectNode.isElement()) { // QDomElement effectElement = effectNode.toElement(); - // m_slots[i]->loadEffectSlotFromXml(effectElement); + // m_effectSlots[i]->loadEffectSlotFromXml(effectElement); // } // } // } diff --git a/src/effects/effectchainslot.h b/src/effects/effectchainslot.h index 635f4cdce1aa..f1703bdb5a1d 100644 --- a/src/effects/effectchainslot.h +++ b/src/effects/effectchainslot.h @@ -9,13 +9,14 @@ #include "control/controlobject.h" #include "effects/defs.h" -#include "effects/effect.h" +#include "effects/effectinstantiator.h" #include "engine/channelhandle.h" #include "util/class.h" class ControlPushButton; class ControlEncoder; class EffectChainSlot; +class EffectsManager; class EffectChainSlot : public QObject { Q_OBJECT @@ -23,7 +24,6 @@ class EffectChainSlot : public QObject { EffectChainSlot(const QString& group, EffectsManager* pEffectsManager, SignalProcessingStage stage = SignalProcessingStage::Postfader, - const bool hasMetaknob = true, const QString& id = QString()); virtual ~EffectChainSlot(); @@ -35,14 +35,14 @@ class EffectChainSlot : public QObject { void registerInputChannel(const ChannelHandleAndGroup& handle_group, const double initialValue = 0.0); + QSet getActiveChannels() const { + return m_enabledInputChannels; + } double getSuperParameter() const; void setSuperParameter(double value, bool force = false); void setSuperParameterDefaultValue(double value); - // Unload the loaded EffectChain. - void clear(); - const QString& getGroup() const { return m_group; } @@ -78,20 +78,13 @@ class EffectChainSlot : public QObject { } } - void addEffect(EffectPointer pEffect); - void maybeLoadEffect(const unsigned int iEffectSlotNumber, - const QString& id); - void replaceEffect(unsigned int effectSlotNumber, EffectPointer pEffect); - void removeEffect(unsigned int effectSlotNumber); - void refreshAllEffects(); + void loadEffect(const unsigned int iEffectSlotNumber, + EffectManifestPointer pManifest, + EffectInstantiatorPointer pInstantiator); - const QList& effects() const; + void reloadAllEffects(); signals: - // Indicates that the given EffectChain was loaded into this - // EffectChainSlot - void effectChainLoaded(EffectChainSlotPointer pEffectChain); - // Signal that whoever is in charge of this EffectChainSlot should load the // next EffectChain into it. void nextChain(unsigned int iChainSlotNumber, @@ -121,12 +114,9 @@ class EffectChainSlot : public QObject { EffectsManager* m_pEffectsManager; ControlObject* m_pControlChainMix; + QList m_effectSlots; private slots: - void slotChainEffectChanged(unsigned int effectSlotNumber); - // Clears the effect in the given position in the loaded EffectChain. - void slotClearEffect(unsigned int iEffectSlotNumber); - void slotControlClear(double v); void slotControlChainSuperParameter(double v, bool force = false); void slotControlChainSelector(double v); @@ -182,15 +172,12 @@ class EffectChainSlot : public QObject { }; QMap m_channelInfoByName; - QList m_slots; QSignalMapper m_channelStatusMapper; QString m_id; QString m_name; QString m_description; SignalProcessingStage m_signalProcessingStage; - bool m_bHasMetaknob; QSet m_enabledInputChannels; - QList m_effects; EngineEffectChain* m_pEngineEffectChain; DISALLOW_COPY_AND_ASSIGN(EffectChainSlot); }; diff --git a/src/effects/effectmanifest.h b/src/effects/effectmanifest.h index 63337697972f..abef38f3de81 100644 --- a/src/effects/effectmanifest.h +++ b/src/effects/effectmanifest.h @@ -175,6 +175,10 @@ class EffectManifest final { } } + bool operator==(const EffectManifest& other) const { + return other.id() == m_id && other.backendType() == m_backendType; + } + private: QString debugString() const { return QString("EffectManifest(%1)").arg(m_id); diff --git a/src/effects/effectparameter.cpp b/src/effects/effectparameter.cpp index 9bf3a82e9f68..7ad1c1010c6d 100644 --- a/src/effects/effectparameter.cpp +++ b/src/effects/effectparameter.cpp @@ -2,14 +2,12 @@ #include "effects/effectparameter.h" #include "effects/effectsmanager.h" -#include "effects/effect.h" #include "util/assert.h" -EffectParameter::EffectParameter(Effect* pEffect, EffectsManager* pEffectsManager, - int iParameterNumber, - EffectManifestParameterPointer pParameter) +EffectParameter::EffectParameter(EffectSlot* pEffectSlot, EffectsManager* pEffectsManager, + int iParameterNumber, EffectManifestParameterPointer pParameter) : QObject(), // no parent - m_pEffect(pEffect), + m_pEffectSlot(pEffectSlot), m_pEffectsManager(pEffectsManager), m_iParameterNumber(iParameterNumber), m_pParameter(pParameter), @@ -212,7 +210,7 @@ EffectManifestParameter::ControlHint EffectParameter::getControlHint() const { } void EffectParameter::updateEngineState() { - EngineEffect* pEngineEffect = m_pEffect->getEngineEffect(); + EngineEffect* pEngineEffect = m_pEffectSlot->getEngineEffect(); if (!pEngineEffect) { return; } diff --git a/src/effects/effectparameter.h b/src/effects/effectparameter.h index f6565258fa10..290eb4e72119 100644 --- a/src/effects/effectparameter.h +++ b/src/effects/effectparameter.h @@ -5,6 +5,7 @@ #include #include "effects/effectmanifestparameter.h" +#include "effects/effectslot.h" #include "util/class.h" class Effect; @@ -18,7 +19,7 @@ class EffectsManager; class EffectParameter : public QObject { Q_OBJECT public: - EffectParameter(Effect* pEffect, EffectsManager* pEffectsManager, + EffectParameter(EffectSlot* pEffectSlot, EffectsManager* pEffectsManager, int iParameterNumber, EffectManifestParameterPointer pParameter); virtual ~EffectParameter(); @@ -74,7 +75,7 @@ class EffectParameter : public QObject { bool clampDefault(); bool clampRanges(); - Effect* m_pEffect; + EffectSlot* m_pEffectSlot; EffectsManager* m_pEffectsManager; int m_iParameterNumber; EffectManifestParameterPointer m_pParameter; diff --git a/src/effects/effectparameterslot.cpp b/src/effects/effectparameterslot.cpp index 9cf84ddceb58..983f49dabe5b 100644 --- a/src/effects/effectparameterslot.cpp +++ b/src/effects/effectparameterslot.cpp @@ -1,7 +1,10 @@ #include -#include "control/controleffectknob.h" #include "effects/effectparameterslot.h" + +#include "effects/effectslot.h" +#include "effects/effectparameter.h" +#include "control/controleffectknob.h" #include "effects/effectxmlelements.h" #include "control/controlobject.h" #include "control/controlpushbutton.h" @@ -45,7 +48,7 @@ EffectParameterSlot::EffectParameterSlot(const QString& group, const unsigned in } EffectParameterSlot::~EffectParameterSlot() { - //qDebug() << debugString() << "destroyed"; + // qDebug() << debugString() << "destroyed"; delete m_pControlValue; // m_pControlLoaded and m_pControlType are deleted by ~EffectParameterSlotBase delete m_pControlLinkType; @@ -53,12 +56,12 @@ EffectParameterSlot::~EffectParameterSlot() { delete m_pSoftTakeover; } -void EffectParameterSlot::loadEffect(EffectPointer pEffect) { - //qDebug() << debugString() << "loadEffect" << (pEffect ? pEffect->getManifest().name() : "(null)"); +void EffectParameterSlot::loadEffect(EffectSlot* pEffectSlot) { + // qDebug() << debugString() << "loadEffect" << (pEffectSlot ? pEffectSlot->getManifest().name() : "(null)"); clear(); - if (pEffect) { + if (pEffectSlot) { // Returns null if it doesn't have a parameter for that number - m_pEffectParameter = pEffect->getKnobParameterForSlot(m_iParameterSlotNumber); + m_pEffectParameter = pEffectSlot->getKnobParameterForSlot(m_iParameterSlotNumber); if (m_pEffectParameter) { //qDebug() << debugString() << "Loading effect parameter" << m_pEffectParameter->name(); @@ -104,7 +107,7 @@ void EffectParameterSlot::clear() { //qDebug() << debugString() << "clear"; if (m_pEffectParameter) { m_pEffectParameter->disconnect(this); - m_pEffectParameter = NULL; + m_pEffectParameter = nullptr; } m_pControlLoaded->forceSet(0.0); @@ -157,7 +160,7 @@ void EffectParameterSlot::slotLinkInverseChanged(double v) { void EffectParameterSlot::onEffectMetaParameterChanged(double parameter, bool force) { m_dChainParameter = parameter; - if (m_pEffectParameter != NULL) { + if (m_pEffectParameter != nullptr) { // Intermediate cast to integer is needed for VC++. EffectManifestParameter::LinkType type = static_cast( diff --git a/src/effects/effectparameterslot.h b/src/effects/effectparameterslot.h index fdb5ec9c9a53..ec9bf9296273 100644 --- a/src/effects/effectparameterslot.h +++ b/src/effects/effectparameterslot.h @@ -6,7 +6,6 @@ #include #include "control/controlobject.h" -#include "effects/effect.h" #include "effects/effectparameterslotbase.h" #include "util/class.h" @@ -14,6 +13,7 @@ class ControlObject; class ControlPushButton; class ControlEffectKnob; class SoftTakeover; +class EffectSlot; class EffectParameterSlot : public EffectParameterSlotBase { Q_OBJECT @@ -26,7 +26,7 @@ class EffectParameterSlot : public EffectParameterSlotBase { } // Load the parameter of the given effect into this EffectParameterSlot - void loadEffect(EffectPointer pEffect); + void loadEffect(EffectSlot* pEffectSlot); double getValueParameter() const; diff --git a/src/effects/effectparameterslotbase.cpp b/src/effects/effectparameterslotbase.cpp index 4f1b32049038..b69356f4d47e 100644 --- a/src/effects/effectparameterslotbase.cpp +++ b/src/effects/effectparameterslotbase.cpp @@ -1,5 +1,6 @@ #include +#include "effects/effectparameter.h" #include "control/controleffectknob.h" #include "effects/effectparameterslotbase.h" #include "control/controlobject.h" @@ -9,16 +10,16 @@ EffectParameterSlotBase::EffectParameterSlotBase(const QString& group, const unsigned int iParameterSlotNumber) : m_iParameterSlotNumber(iParameterSlotNumber), m_group(group), - m_pEffectParameter(NULL), - m_pControlLoaded(NULL), - m_pControlType(NULL), + m_pEffectParameter(nullptr), + m_pControlLoaded(nullptr), + m_pControlType(nullptr), m_dChainParameter(0.0) { } EffectParameterSlotBase::~EffectParameterSlotBase() { - m_pEffectParameter = NULL; - m_pEffect.clear(); + m_pEffectParameter = nullptr; + m_pEffectSlot = nullptr; delete m_pControlLoaded; delete m_pControlType; } diff --git a/src/effects/effectparameterslotbase.h b/src/effects/effectparameterslotbase.h index fcdf1c854fd2..0fe57b7ab07a 100644 --- a/src/effects/effectparameterslotbase.h +++ b/src/effects/effectparameterslotbase.h @@ -6,11 +6,13 @@ #include #include "control/controlobject.h" -#include "effects/effect.h" +#include "effects/effectmanifest.h" #include "util/class.h" class ControlObject; class ControlPushButton; +class EffectParameter; +class EffectSlot; class EffectParameterSlotBase : public QObject { Q_OBJECT @@ -33,7 +35,7 @@ class EffectParameterSlotBase : public QObject { protected: const unsigned int m_iParameterSlotNumber; QString m_group; - EffectPointer m_pEffect; + EffectSlot* m_pEffectSlot; EffectParameter* m_pEffectParameter; // Controls exposed to the rest of Mixxx diff --git a/src/effects/effectsbackend.cpp b/src/effects/effectsbackend.cpp index dc2e9974fd0a..df00ea2e07dd 100644 --- a/src/effects/effectsbackend.cpp +++ b/src/effects/effectsbackend.cpp @@ -41,19 +41,14 @@ EffectManifestPointer EffectsBackend::getManifest(const QString& effectId) const return m_registeredEffects[effectId].manifest(); } -bool EffectsBackend::canInstantiateEffect(const QString& effectId) const { - return m_registeredEffects.contains(effectId); -} - -EffectPointer EffectsBackend::instantiateEffect(EffectsManager* pEffectsManager, - const QString& effectId) { +EffectInstantiatorPointer EffectsBackend::getInstantiator(const QString& effectId) const { if (!m_registeredEffects.contains(effectId)) { qWarning() << "WARNING: Effect" << effectId << "is not registered."; - return EffectPointer(); + return EffectInstantiatorPointer(); } - RegisteredEffect& effectInfo = m_registeredEffects[effectId]; - - return EffectPointer(new Effect(pEffectsManager, - effectInfo.manifest(), - effectInfo.initiator())); + return m_registeredEffects[effectId].initiator(); } + +bool EffectsBackend::canInstantiateEffect(const QString& effectId) const { + return m_registeredEffects.contains(effectId); +} \ No newline at end of file diff --git a/src/effects/effectsbackend.h b/src/effects/effectsbackend.h index e1d2c327b6c6..73fac35cc14b 100644 --- a/src/effects/effectsbackend.h +++ b/src/effects/effectsbackend.h @@ -7,7 +7,7 @@ #include #include "effects/defs.h" -#include "effects/effect.h" +#include "effects/effectslot.h" #include "effects/effectinstantiator.h" #include "preferences/usersettings.h" @@ -24,12 +24,15 @@ class EffectsBackend : public QObject { EffectsBackend(QObject* pParent, EffectBackendType type); virtual ~EffectsBackend(); - // returns a list sorted like it should be displayed in the GUI + EffectBackendType getType() const { + return m_type; + } + + // returns a list sorted like it should be displayed in the GUI virtual const QList getEffectIds() const; virtual EffectManifestPointer getManifest(const QString& effectId) const; + virtual EffectInstantiatorPointer getInstantiator(const QString& effectId) const; virtual bool canInstantiateEffect(const QString& effectId) const; - virtual EffectPointer instantiateEffect( - EffectsManager* pEffectsManager, const QString& effectId); signals: void effectRegistered(EffectManifestPointer); diff --git a/src/effects/effectslot.cpp b/src/effects/effectslot.cpp index 366033251526..74c914844bf9 100644 --- a/src/effects/effectslot.cpp +++ b/src/effects/effectslot.cpp @@ -3,6 +3,7 @@ #include +#include "effects/defs.h" #include "control/controlpushbutton.h" #include "control/controlencoder.h" #include "control/controlproxy.h" @@ -13,9 +14,18 @@ const unsigned int kDefaultMaxParameters = 16; EffectSlot::EffectSlot(const QString& group, - const unsigned int iEffectnumber) + EffectsManager* pEffectsManager, + const unsigned int iEffectnumber, + EngineEffectChain* pEngineEffectChain) : m_iEffectNumber(iEffectnumber), - m_group(group) { + m_group(group), + m_pEffectsManager(pEffectsManager), + m_pEngineEffectChain(pEngineEffectChain), + m_pEngineEffect(nullptr) { + VERIFY_OR_DEBUG_ASSERT(m_pEngineEffectChain != nullptr) { + return; + } + m_pControlLoaded = new ControlObject(ConfigKey(m_group, "loaded")); m_pControlLoaded->setReadOnly(); @@ -36,7 +46,7 @@ EffectSlot::EffectSlot(const QString& group, m_pControlEnabled = new ControlPushButton(ConfigKey(m_group, "enabled")); m_pControlEnabled->setButtonMode(ControlPushButton::POWERWINDOW); connect(m_pControlEnabled, SIGNAL(valueChanged(double)), - this, SLOT(slotEnabled(double))); + this, SLOT(updateEngineState())); m_pControlNextEffect = new ControlPushButton(ConfigKey(m_group, "next_effect")); connect(m_pControlNextEffect, SIGNAL(valueChanged(double)), @@ -66,14 +76,16 @@ EffectSlot::EffectSlot(const QString& group, m_pControlMetaParameter->set(0.0); m_pControlMetaParameter->setDefaultValue(0.0); - m_pSoftTakeover = new SoftTakeover(); + m_pMetaknobSoftTakeover = new SoftTakeover(); - clear(); + m_pControlLoaded->forceSet(0.0); + m_pControlNumParameters->forceSet(0.0); + m_pControlNumButtonParameters->forceSet(0.0); } EffectSlot::~EffectSlot() { //qDebug() << debugString() << "destroyed"; - clear(); + unloadEffect(); delete m_pControlLoaded; delete m_pControlNumParameters; @@ -86,13 +98,90 @@ EffectSlot::~EffectSlot() { delete m_pControlClear; delete m_pControlEnabled; delete m_pControlMetaParameter; - delete m_pSoftTakeover; + delete m_pMetaknobSoftTakeover; +} + +void EffectSlot::addToEngine(const QSet& activeChannels) { + VERIFY_OR_DEBUG_ASSERT(m_pManifest != nullptr) { + return; + } + + VERIFY_OR_DEBUG_ASSERT(m_pEngineEffect == nullptr) { + return; + } + + m_pEngineEffect = new EngineEffect(m_pManifest, + activeChannels, + m_pEffectsManager, + m_pInstantiator); + + EffectsRequest* request = new EffectsRequest(); + request->type = EffectsRequest::ADD_EFFECT_TO_CHAIN; + request->pTargetChain = m_pEngineEffectChain; + request->AddEffectToChain.pEffect = m_pEngineEffect; + request->AddEffectToChain.iIndex = m_iEffectNumber; + m_pEffectsManager->writeRequest(request); +} + +void EffectSlot::removeFromEngine() { + VERIFY_OR_DEBUG_ASSERT(isLoaded()) { + return; + } + + EffectsRequest* request = new EffectsRequest(); + request->type = EffectsRequest::REMOVE_EFFECT_FROM_CHAIN; + request->pTargetChain = m_pEngineEffectChain; + request->RemoveEffectFromChain.pEffect = m_pEngineEffect; + request->RemoveEffectFromChain.iIndex = m_iEffectNumber; + m_pEffectsManager->writeRequest(request); + + m_pEngineEffect = nullptr; +} + +void EffectSlot::updateEngineState() { + if (!m_pEngineEffect) { + return; + } + sendParameterUpdate(); + for (auto const& pParameter : m_parameters) { + pParameter->updateEngineState(); + } +} + +void EffectSlot::sendParameterUpdate() { + if (!m_pEngineEffect) { + return; + } + EffectsRequest* pRequest = new EffectsRequest(); + pRequest->type = EffectsRequest::SET_EFFECT_PARAMETERS; + pRequest->pTargetEffect = m_pEngineEffect; + pRequest->SetEffectParameters.enabled = m_pControlEnabled->get(); + m_pEffectsManager->writeRequest(pRequest); +} + +EffectState* EffectSlot::createState(const mixxx::EngineParameters& bufferParameters) { + VERIFY_OR_DEBUG_ASSERT(m_pEngineEffect != nullptr) { + return new EffectState(bufferParameters); + } + return m_pEngineEffect->createState(bufferParameters); +} + +EngineEffect* EffectSlot::getEngineEffect() { + return m_pEngineEffect; +} + +EffectManifestPointer EffectSlot::getManifest() const { + return m_pManifest; +} + +void EffectSlot::reload(const QSet& activeChannels) { + loadEffect(m_pManifest, m_pInstantiator, activeChannels); } EffectParameterSlotPointer EffectSlot::addEffectParameterSlot() { EffectParameterSlotPointer pParameter = EffectParameterSlotPointer( - new EffectParameterSlot(m_group, m_parameters.size())); - m_parameters.append(pParameter); + new EffectParameterSlot(m_group, m_parameterSlots.size())); + m_parameterSlots.append(pParameter); m_pControlNumParameterSlots->forceSet( m_pControlNumParameterSlots->get() + 1); return pParameter; @@ -107,36 +196,86 @@ EffectButtonParameterSlotPointer EffectSlot::addEffectButtonParameterSlot() { return pParameter; } -EffectPointer EffectSlot::getEffect() const { - return m_pEffect; +unsigned int EffectSlot::numKnobParameters() const { + unsigned int num = 0; + for (auto const& pParameter : m_parameters) { + if (pParameter->manifest()->controlHint() != + EffectManifestParameter::ControlHint::TOGGLE_STEPPING) { + ++num; + } + } + return num; } -unsigned int EffectSlot::numParameterSlots() const { - return m_parameters.size(); +unsigned int EffectSlot::numButtonParameters() const { + unsigned int num = 0; + for (auto const& pParameter : m_parameters) { + if (pParameter->manifest()->controlHint() == + EffectManifestParameter::ControlHint::TOGGLE_STEPPING) { + ++num; + } + } + return num; } -unsigned int EffectSlot::numButtonParameterSlots() const { - return m_buttonParameters.size(); +// static +bool EffectSlot::isButtonParameter(EffectParameter* parameter) { + return parameter->manifest()->controlHint() == + EffectManifestParameter::ControlHint::TOGGLE_STEPPING; } -void EffectSlot::slotEnabled(double v) { - //qDebug() << debugString() << "slotEnabled" << v; - if (m_pEffect) { - m_pEffect->setEnabled(v > 0); +// static +bool EffectSlot::isKnobParameter(EffectParameter* parameter) { + return !isButtonParameter(parameter); +} + +EffectParameter* EffectSlot::getFilteredParameterForSlot(ParameterFilterFnc filterFnc, + unsigned int slotNumber) { + // It's normal to ask for a parameter that doesn't exist. Callers must check + // for NULL. + unsigned int num = 0; + for (const auto& parameter: m_parameters) { + if (parameter->manifest()->showInParameterSlot() && filterFnc(parameter)) { + if(num == slotNumber) { + return parameter; + } + ++num; + } } + return nullptr; +} + +EffectParameter* EffectSlot::getKnobParameterForSlot(unsigned int slotNumber) { + return getFilteredParameterForSlot(isKnobParameter, slotNumber); +} + +EffectParameter* EffectSlot::getButtonParameterForSlot(unsigned int slotNumber) { + return getFilteredParameterForSlot(isButtonParameter, slotNumber); +} + +double EffectSlot::getMetaknobDefault() { + return m_pManifest->metaknobDefault(); } -void EffectSlot::slotEffectEnabledChanged(bool enabled) { +unsigned int EffectSlot::numParameterSlots() const { + return m_parameterSlots.size(); +} + +unsigned int EffectSlot::numButtonParameterSlots() const { + return m_buttonParameters.size(); +} + +void EffectSlot::setEnabled(bool enabled) { m_pControlEnabled->set(enabled); } EffectParameterSlotPointer EffectSlot::getEffectParameterSlot(unsigned int slotNumber) { //qDebug() << debugString() << "getEffectParameterSlot" << slotNumber; - if (slotNumber >= static_cast(m_parameters.size())) { + if (slotNumber >= static_cast(m_parameterSlots.size())) { qWarning() << "WARNING: slotNumber out of range"; return EffectParameterSlotPointer(); } - return m_parameters[slotNumber]; + return m_parameterSlots[slotNumber]; } EffectButtonParameterSlotPointer EffectSlot::getEffectButtonParameterSlot(unsigned int slotNumber) { @@ -148,72 +287,83 @@ EffectButtonParameterSlotPointer EffectSlot::getEffectButtonParameterSlot(unsign return m_buttonParameters[slotNumber]; } -void EffectSlot::loadEffect(EffectPointer pEffect, bool adoptMetaknobPosition) { - //qDebug() << debugString() << "loadEffect" - // << (pEffect ? pEffect->getManifest().name() : "(null)"); - if (pEffect) { - m_pEffect = pEffect; - m_pControlLoaded->forceSet(1.0); - m_pControlNumParameters->forceSet(pEffect->numKnobParameters()); - m_pControlNumButtonParameters->forceSet(pEffect->numButtonParameters()); +void EffectSlot::loadEffect(EffectManifestPointer pManifest, + EffectInstantiatorPointer pInstantiator, + const QSet& activeChannels) { + unloadEffect(); - // The enabled status persists in the EffectSlot when loading a new - // EffectPointer to the EffectSlot. Effects and EngineEffects default to - // disabled, so if this EffectSlot was enabled, enable the Effect and EngineEffect. - pEffect->setEnabled(m_pControlEnabled->toBool()); + m_pManifest = pManifest; + m_pInstantiator = pInstantiator; - connect(pEffect.data(), SIGNAL(enabledChanged(bool)), - this, SLOT(slotEffectEnabledChanged(bool))); + if (pManifest == EffectManifestPointer() || pInstantiator == EffectInstantiatorPointer()) { + // No new effect to load; just unload the old effect and return. + emit(effectChanged()); + return; + } - while (static_cast(m_parameters.size()) - < pEffect->numKnobParameters()) { - addEffectParameterSlot(); - } + for (const auto& pManifestParameter: m_pManifest->parameters()) { + EffectParameter* pParameter = new EffectParameter( + this, m_pEffectsManager, m_parameters.size(), pManifestParameter); + m_parameters.append(pParameter); + } + addToEngine(activeChannels); - while (static_cast(m_buttonParameters.size()) - < pEffect->numButtonParameters()) { - addEffectButtonParameterSlot(); - } + m_pControlLoaded->forceSet(1.0); - for (const auto& pParameter : m_parameters) { - pParameter->loadEffect(pEffect); - } - for (const auto& pParameter : m_buttonParameters) { - pParameter->loadEffect(pEffect); - } + unsigned int iNumKnobParameters = numKnobParameters(); + while (static_cast(m_parameterSlots.size()) + < iNumKnobParameters) { + addEffectParameterSlot(); + } + unsigned int iNumButtonParameters = numButtonParameters(); + while (static_cast(m_buttonParameters.size()) + < iNumButtonParameters) { + addEffectButtonParameterSlot(); + } - if (adoptMetaknobPosition) { - slotEffectMetaParameter(m_pControlMetaParameter->get(), true); - } else { - m_pControlMetaParameter->set(pEffect->getMetaknobDefault()); - slotEffectMetaParameter(pEffect->getMetaknobDefault(), true); - } + for (const auto& pParameter : m_parameterSlots) { + pParameter->loadEffect(this); + } + for (const auto& pParameter : m_buttonParameters) { + pParameter->loadEffect(this); + } - emit(effectLoaded(pEffect, m_iEffectNumber)); + if (m_pEffectsManager->isAdoptMetaknobValueEnabled()) { + slotEffectMetaParameter(m_pControlMetaParameter->get(), true); } else { - clear(); - // Broadcasts a null effect pointer - emit(effectLoaded(EffectPointer(), m_iEffectNumber)); + m_pControlMetaParameter->set(getMetaknobDefault()); + slotEffectMetaParameter(getMetaknobDefault(), true); } - emit(updated()); + + emit(effectChanged()); + updateEngineState(); } -void EffectSlot::clear() { - if (m_pEffect) { - m_pEffect->disconnect(this); +void EffectSlot::unloadEffect() { + if (!isLoaded()) { + return; } + m_pControlLoaded->forceSet(0.0); m_pControlNumParameters->forceSet(0.0); m_pControlNumButtonParameters->forceSet(0.0); - for (const auto& pParameter : m_parameters) { + for (const auto& pParameter : m_parameterSlots) { pParameter->clear(); } for (const auto& pParameter : m_buttonParameters) { pParameter->clear(); } - m_pEffect.clear(); - emit(updated()); + + for (int i = 0; i < m_parameters.size(); ++i) { + EffectParameter* pParameter = m_parameters.at(i); + m_parameters[i] = nullptr; + delete pParameter; + } + m_parameters.clear(); + m_pManifest.clear(); + + removeFromEngine(); } void EffectSlot::slotPrevEffect(double v) { @@ -238,12 +388,13 @@ void EffectSlot::slotEffectSelector(double v) { void EffectSlot::slotClear(double v) { if (v > 0) { - emit(clearEffect(m_iEffectNumber)); + unloadEffect(); + emit(effectChanged()); } } void EffectSlot::syncSofttakeover() { - for (const auto& pParameterSlot : m_parameters) { + for (const auto& pParameterSlot : m_parameterSlots) { pParameterSlot->syncSofttakeover(); } } @@ -255,7 +406,7 @@ double EffectSlot::getMetaParameter() const { // This function is for the superknob to update individual effects' meta knobs // slotEffectMetaParameter does not need to update m_pControlMetaParameter's value void EffectSlot::setMetaParameter(double v, bool force) { - if (!m_pSoftTakeover->ignore(m_pControlMetaParameter, v) + if (!m_pMetaknobSoftTakeover->ignore(m_pControlMetaParameter, v) || !m_pControlEnabled->toBool() || force) { m_pControlMetaParameter->set(v); @@ -273,112 +424,112 @@ void EffectSlot::slotEffectMetaParameter(double v, bool force) { if (!m_pControlEnabled->toBool()) { force = true; } - for (const auto& pParameterSlot : m_parameters) { + for (const auto& pParameterSlot : m_parameterSlots) { pParameterSlot->onEffectMetaParameterChanged(v, force); } } QDomElement EffectSlot::toXml(QDomDocument* doc) const { QDomElement effectElement = doc->createElement(EffectXml::Effect); - if (!m_pEffect) { - return effectElement; - } - - QDomElement metaKnobElement = doc->createElement(EffectXml::EffectMetaParameter); - XmlParse::addElement(*doc, effectElement, - EffectXml::EffectMetaParameter, - QString::number(m_pControlMetaParameter->get())); - EffectManifestPointer pManifest = m_pEffect->getManifest(); - XmlParse::addElement(*doc, effectElement, - EffectXml::EffectId, pManifest->id()); - XmlParse::addElement(*doc, effectElement, - EffectXml::EffectVersion, pManifest->version()); - - QDomElement parametersElement = doc->createElement(EffectXml::ParametersRoot); - - for (const auto& pParameter : m_parameters) { - QDomElement parameterElement = pParameter->toXml(doc); - if (!parameterElement.hasChildNodes()) { - continue; - } - EffectManifestParameterPointer manifest = pParameter->getManifest(); - if (!manifest) { - continue; - } - XmlParse::addElement(*doc, parameterElement, - EffectXml::ParameterId, - manifest->id()); - parametersElement.appendChild(parameterElement); - } - for (const auto& pParameter : m_buttonParameters) { - QDomElement parameterElement = pParameter->toXml(doc); - if (!parameterElement.hasChildNodes()) { - continue; - } - EffectManifestParameterPointer manifest = pParameter->getManifest(); - if (!manifest) { - continue; - } - XmlParse::addElement(*doc, parameterElement, - EffectXml::ParameterId, - pParameter->getManifest()->id()); - parametersElement.appendChild(parameterElement); - } + // if (!m_pEffect) { + // return effectElement; + // } + + // QDomElement metaKnobElement = doc->createElement(EffectXml::EffectMetaParameter); + // XmlParse::addElement(*doc, effectElement, + // EffectXml::EffectMetaParameter, + // QString::number(m_pControlMetaParameter->get())); + // EffectManifestPointer pManifest = m_pEffect->getManifest(); + // XmlParse::addElement(*doc, effectElement, + // EffectXml::EffectId, pManifest->id()); + // XmlParse::addElement(*doc, effectElement, + // EffectXml::EffectVersion, pManifest->version()); + + // QDomElement parametersElement = doc->createElement(EffectXml::ParametersRoot); + + // for (const auto& pParameter : m_parameterSlots) { + // QDomElement parameterElement = pParameter->toXml(doc); + // if (!parameterElement.hasChildNodes()) { + // continue; + // } + // EffectManifestParameterPointer manifest = pParameter->getManifest(); + // if (!manifest) { + // continue; + // } + // XmlParse::addElement(*doc, parameterElement, + // EffectXml::ParameterId, + // manifest->id()); + // parametersElement.appendChild(parameterElement); + // } + // for (const auto& pParameter : m_buttonParameters) { + // QDomElement parameterElement = pParameter->toXml(doc); + // if (!parameterElement.hasChildNodes()) { + // continue; + // } + // EffectManifestParameterPointer manifest = pParameter->getManifest(); + // if (!manifest) { + // continue; + // } + // XmlParse::addElement(*doc, parameterElement, + // EffectXml::ParameterId, + // pParameter->getManifest()->id()); + // parametersElement.appendChild(parameterElement); + // } - effectElement.appendChild(parametersElement); + // effectElement.appendChild(parametersElement); return effectElement; } void EffectSlot::loadEffectSlotFromXml(const QDomElement& effectElement) { - if (!m_pEffect) { - return; - } + // if (!m_pEffect) { + // return; + // } - if (!effectElement.hasChildNodes()) { - return; - } + // if (!effectElement.hasChildNodes()) { + // return; + // } - QDomElement effectIdElement = XmlParse::selectElement(effectElement, - EffectXml::EffectId); - if (m_pEffect->getManifest()->id() != effectIdElement.text()) { - qWarning() << "EffectSlot::loadEffectSlotFromXml" - << "effect ID in XML does not match presently loaded effect, ignoring."; - return; - } + // QDomElement effectIdElement = XmlParse::selectElement(effectElement, + // EffectXml::EffectId); + // if (m_pEffect->getManifest()->id() != effectIdElement.text()) { + // qWarning() << "EffectSlot::loadEffectSlotFromXml" + // << "effect ID in XML does not match presently loaded effect, ignoring."; + // return; + // } - m_pControlMetaParameter->set(XmlParse::selectNodeDouble( - effectElement, EffectXml::EffectMetaParameter)); - QDomElement parametersElement = XmlParse::selectElement( - effectElement, EffectXml::ParametersRoot); - if (!parametersElement.hasChildNodes()) { - return; - } + // m_pControlMetaParameter->set(XmlParse::selectNodeDouble( + // effectElement, EffectXml::EffectMetaParameter)); + // QDomElement parametersElement = XmlParse::selectElement( + // effectElement, EffectXml::ParametersRoot); + // if (!parametersElement.hasChildNodes()) { + // return; + // } - QMap parametersById; - for (const auto& pParameter : m_parameters) { - EffectManifestParameterPointer manifest = pParameter->getManifest(); - if (manifest) { - parametersById.insert(manifest->id(), pParameter); - } - } - for (const auto& pParameter : m_buttonParameters) { - EffectManifestParameterPointer manifest = pParameter->getManifest(); - if (manifest) { - parametersById.insert(manifest->id(), pParameter); - } - } + // QMap parametersById; + // for (const auto& pParameter : m_parameterSlots) { + // EffectManifestParameterPointer manifest = pParameter->getManifest(); + // if (manifest) { + // parametersById.insert(manifest->id(), pParameter); + // } + // } + // for (const auto& pParameter : m_buttonParameters) { + // EffectManifestParameterPointer manifest = pParameter->getManifest(); + // if (manifest) { + // parametersById.insert(manifest->id(), pParameter); + // } + // } - QDomNodeList parametersNodeList = parametersElement.childNodes(); - for (int i = 0; i < parametersNodeList.size(); ++i) { - QDomNode parameterNode = parametersNodeList.at(i); - if (parameterNode.isElement()) { - const QString id = XmlParse::selectNodeQString(parameterNode, - EffectXml::ParameterId); - EffectParameterSlotBasePointer pParameterSlot = parametersById.value(id); - if (pParameterSlot != nullptr) { - pParameterSlot->loadParameterSlotFromXml(parameterNode.toElement()); - } - } - } + // QDomNodeList parametersNodeList = parametersElement.childNodes(); + // for (int i = 0; i < parametersNodeList.size(); ++i) { + // QDomNode parameterNode = parametersNodeList.at(i); + // if (parameterNode.isElement()) { + // const QString id = XmlParse::selectNodeQString(parameterNode, + // EffectXml::ParameterId); + // EffectParameterSlotBasePointer pParameterSlot = parametersById.value(id); + // if (pParameterSlot != nullptr) { + // pParameterSlot->loadParameterSlotFromXml(parameterNode.toElement()); + // } + // } + // } } diff --git a/src/effects/effectslot.h b/src/effects/effectslot.h index ca35bdd33515..13d574b41020 100644 --- a/src/effects/effectslot.h +++ b/src/effects/effectslot.h @@ -10,40 +10,51 @@ #include "control/controlpotmeter.h" #include "control/controlpushbutton.h" #include "controllers/softtakeover.h" -#include "effects/effect.h" -#include "effects/effectparameterslot.h" +#include "engine/channelhandle.h" +#include "engine/engine.h" +#include "engine/effects/engineeffect.h" #include "effects/effectbuttonparameterslot.h" +#include "effects/effectinstantiator.h" +#include "effects/effectmanifest.h" +#include "effects/effectparameter.h" +#include "effects/effectparameterslot.h" #include "util/class.h" +class EffectProcessor; class EffectSlot; +class EffectState; +class EffectsManager; +class EngineEffect; +class EngineEffectChain; class ControlProxy; - +class EffectParameter; +class EffectParameterSlot; class EffectSlot : public QObject { Q_OBJECT public: + typedef bool (*ParameterFilterFnc)(EffectParameter*); + EffectSlot(const QString& group, - const unsigned int iEffectNumber); + EffectsManager* pEffectsManager, + const unsigned int iEffectNumber, + EngineEffectChain* pEngineEffectChain); virtual ~EffectSlot(); - // Return the currently loaded effect, if any. If no effect is loaded, - // returns a null EffectPointer. - EffectPointer getEffect() const; - - inline bool getEnableState() const { - return m_pControlEnabled->toBool(); - } - inline int getEffectSlotNumber() const { return m_iEffectNumber; } + inline const bool isLoaded() const { + return m_pEngineEffect != nullptr; + } + unsigned int numParameterSlots() const; EffectParameterSlotPointer addEffectParameterSlot(); EffectParameterSlotPointer getEffectParameterSlot(unsigned int slotNumber); EffectParameterSlotPointer getEffectParameterSlotForConfigKey(unsigned int slotNumber); inline const QList& getEffectParameterSlots() const { - return m_parameters; + return m_parameterSlots; }; unsigned int numButtonParameterSlots() const; @@ -55,13 +66,10 @@ class EffectSlot : public QObject { double getMetaParameter() const; - // ensures that Softtakover is bypassed for the following + // Ensures that Softtakover is bypassed for the following // ChainParameterChange. Uses for testing only void syncSofttakeover(); - // Unload the currently loaded effect - void clear(); - const QString& getGroup() const { return m_group; } @@ -69,41 +77,73 @@ class EffectSlot : public QObject { QDomElement toXml(QDomDocument* doc) const; void loadEffectSlotFromXml(const QDomElement& effectElement); + EffectState* createState(const mixxx::EngineParameters& bufferParameters); + + EffectManifestPointer getManifest() const; + + unsigned int numKnobParameters() const; + unsigned int numButtonParameters() const; + + static bool isButtonParameter(EffectParameter* parameter); + static bool isKnobParameter(EffectParameter* parameter); + + EffectParameter* getFilteredParameterForSlot( + ParameterFilterFnc filterFnc, unsigned int slotNumber); + EffectParameter* getKnobParameterForSlot(unsigned int slotNumber); + EffectParameter* getButtonParameterForSlot(unsigned int slotNumber); + + void setEnabled(bool enabled); + + EngineEffect* getEngineEffect(); + + // static EffectPointer createFromXml(EffectsManager* pEffectsManager, + // const QDomElement& element); + void addToEngine(const QSet& activeChannels); + void removeFromEngine(); + + double getMetaknobDefault(); + void reload(const QSet& activeChannels); + public slots: - // Request that this EffectSlot load the given Effect - void loadEffect(EffectPointer pEffect, bool adoptMetaknobPosition); void setMetaParameter(double v, bool force = false); - void slotEnabled(double v); + // Call with nullptr for pManifest and pInstantiator to unload an effect + void loadEffect(EffectManifestPointer pManifest, EffectInstantiatorPointer pInstantiator, + const QSet& activeChannels); + void slotNextEffect(double v); void slotPrevEffect(double v); void slotClear(double v); void slotEffectSelector(double v); - void slotEffectEnabledChanged(bool enabled); void slotEffectMetaParameter(double v, bool force = false); signals: - // Indicates that the effect pEffect has been loaded into this - // EffectSlot. The effectSlotNumber is provided for the convenience of - // listeners. pEffect may be an invalid pointer, which indicates that a - // previously loaded effect was removed from the slot. - void effectLoaded(EffectPointer pEffect, unsigned int effectSlotNumber); - - // Signal that whoever is in charge of this EffectSlot should clear this - // EffectSlot (by deleting the effect from the underlying chain). - void clearEffect(unsigned int iEffectNumber); + void effectChanged(); - void updated(); + private slots: + void updateEngineState(); private: QString debugString() const { return QString("EffectSlot(%1)").arg(m_group); } + void sendParameterUpdate(); + void unloadEffect(); + const unsigned int m_iEffectNumber; const QString m_group; UserSettingsPointer m_pConfig; - EffectPointer m_pEffect; + EffectsManager* m_pEffectsManager; + EffectManifestPointer m_pManifest; + EffectInstantiatorPointer m_pInstantiator; + QSet m_pActiveChannels; + + EngineEffect* m_pEngineEffect; + QList m_parameters; + EngineEffectChain* m_pEngineEffectChain; + QList m_parameterSlots; + QList m_buttonParameters; ControlObject* m_pControlLoaded; ControlPushButton* m_pControlEnabled; @@ -116,10 +156,8 @@ class EffectSlot : public QObject { ControlEncoder* m_pControlEffectSelector; ControlObject* m_pControlClear; ControlPotmeter* m_pControlMetaParameter; - QList m_parameters; - QList m_buttonParameters; - SoftTakeover* m_pSoftTakeover; + SoftTakeover* m_pMetaknobSoftTakeover; DISALLOW_COPY_AND_ASSIGN(EffectSlot); }; diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index d05579a26f47..a95454be08d1 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -133,6 +133,60 @@ void EffectsManager::registerOutputChannel(const ChannelHandleAndGroup& handle_g m_registeredOutputChannels.insert(handle_group); } +void EffectsManager::loadStandardEffect(const int iChainSlotNumber, + const int iEffectSlotNumber, const QString& effectId, + EffectBackendType backendType) { + auto pChainSlot = getStandardEffectChainSlot(iChainSlotNumber); + if (pChainSlot) { + loadEffect(pChainSlot, iEffectSlotNumber, effectId, backendType); + } +} + +void EffectsManager::loadOutputEffect(const int iEffectSlotNumber, + const QString& effectId, EffectBackendType backendType) { + if (m_outputEffectChainSlot) { + loadEffect(m_outputEffectChainSlot, iEffectSlotNumber, effectId, backendType); + } +} + +void EffectsManager::loadQuickEffect(const QString& group, + const int iEffectSlotNumber, const QString& effectId, + EffectBackendType backendType) { + auto pChainSlot = getQuickEffectChainSlot(group); + if (pChainSlot) { + loadEffect(pChainSlot, iEffectSlotNumber, effectId, backendType); + } +} + +void EffectsManager::loadEqualizerEffect(const QString& group, + const int iEffectSlotNumber, const QString& effectId, + EffectBackendType backendType) { + auto pChainSlot = getEqualizerEffectChainSlot(group); + if (pChainSlot) { + loadEffect(pChainSlot, iEffectSlotNumber, effectId, backendType); + } +} + +void EffectsManager::loadEffect(EffectChainSlotPointer pChainSlot, + const int iEffectSlotNumber, const QString& effectId, + EffectBackendType backendType) { + if (kEffectDebugOutput) { + qDebug() << debugString() << "loading effect" << iEffectSlotNumber << effectId; + } + for (auto pBackend : m_effectsBackends) { + if (pBackend->canInstantiateEffect(effectId) && + (backendType == EffectBackendType::Unknown || + pBackend->getType() == backendType)) { + EffectManifestPointer pManifest = pBackend->getManifest(effectId); + EffectInstantiatorPointer pInstantiator = pBackend->getInstantiator(effectId); + + pChainSlot->loadEffect(iEffectSlotNumber, pManifest, pInstantiator); + return; + } + } + pChainSlot->loadEffect(iEffectSlotNumber, EffectManifestPointer(), EffectInstantiatorPointer()); +} + const QList EffectsManager::getAvailableEffectManifestsFiltered( EffectManifestFilterFnc filter) const { if (filter == nullptr) { @@ -211,18 +265,6 @@ EffectManifestPointer EffectsManager::getEffectManifest(const QString& effectId) return pMainifest; } -EffectPointer EffectsManager::instantiateEffect(const QString& effectId) { - if (effectId.isEmpty()) { - return EffectPointer(); - } - for (const auto& pBackend: m_effectsBackends) { - if (pBackend->canInstantiateEffect(effectId)) { - return pBackend->instantiateEffect(this, effectId); - } - } - return EffectPointer(); -} - void EffectsManager::addStandardEffectChainSlots() { for (int i = 0; i < EffectsManager::kNumStandardEffectChains; ++i) { VERIFY_OR_DEBUG_ASSERT(!m_effectChainSlotsByGroup.contains( @@ -266,21 +308,6 @@ void EffectsManager::addEqualizerEffectChainSlot(const QString& groupName) { m_equalizerEffectChainSlots.insert(pChainSlot->group(), pChainSlot); } -bool EffectsManager::loadEqualizerEffectToGroup(const QString& group, - EffectPointer pEffect) { - auto chainSlotGroup = EqualizerEffectChainSlot::formatEffectChainSlotGroup(group); - auto pChainSlot = m_equalizerEffectChainSlots.value(chainSlotGroup); - VERIFY_OR_DEBUG_ASSERT(pChainSlot) { - return false; - } - - pChainSlot->replaceEffect(0, pEffect); - if (pEffect != nullptr) { - pEffect->setEnabled(true); - } - return true; -} - void EffectsManager::addQuickEffectChainSlot(const QString& groupName) { VERIFY_OR_DEBUG_ASSERT(!m_quickEffectChainSlots.contains( QuickEffectChainSlot::formatEffectChainSlotGroup(groupName))) { @@ -293,25 +320,6 @@ void EffectsManager::addQuickEffectChainSlot(const QString& groupName) { m_quickEffectChainSlots.insert(pChainSlot->group(), pChainSlot); } -bool EffectsManager::loadQuickEffectToGroup(const QString& group, - EffectPointer pEffect) { - auto chainSlotGroup = QuickEffectChainSlot::formatEffectChainSlotGroup(group); - EffectChainSlotPointer pChainSlot = m_quickEffectChainSlots.value(chainSlotGroup); - VERIFY_OR_DEBUG_ASSERT(pChainSlot) { - return false; - } - - pChainSlot->replaceEffect(0, pEffect); - if (pEffect != nullptr) { - pEffect->setEnabled(true); - } - - // Force update metaknobs and parameters to match state of superknob - pChainSlot->setSuperParameter(pChainSlot->getSuperParameter(), true); - - return true; -} - EffectChainSlotPointer EffectsManager::getEffectChainSlot(const QString& group) const { return m_effectChainSlotsByGroup.value(group); } @@ -396,13 +404,13 @@ void EffectsManager::setup() { void EffectsManager::refreshAllChainSlots() { for (auto& pChainSlot : m_standardEffectChainSlots) { - pChainSlot->refreshAllEffects(); + pChainSlot->reloadAllEffects(); } for (auto& pChainSlot : m_equalizerEffectChainSlots) { - pChainSlot->refreshAllEffects(); + pChainSlot->reloadAllEffects(); } for (auto& pChainSlot : m_quickEffectChainSlots) { - pChainSlot->refreshAllEffects(); + pChainSlot->reloadAllEffects(); } } @@ -472,7 +480,7 @@ void EffectsManager::collectGarbage(const EffectsRequest* pRequest) { delete pRequest->RemoveEffectFromChain.pEffect; } else if (pRequest->type == EffectsRequest::REMOVE_EFFECT_CHAIN) { if (kEffectDebugOutput) { - qDebug() << debugString() << "delete" << pRequest->RemoveEffectFromChain.pEffect; + qDebug() << debugString() << "delete" << pRequest->RemoveEffectChain.pChain; } delete pRequest->RemoveEffectChain.pChain; } else if (pRequest->type == EffectsRequest::DISABLE_EFFECT_CHAIN_FOR_INPUT_CHANNEL) { diff --git a/src/effects/effectsmanager.h b/src/effects/effectsmanager.h index cee69ef7d51e..2dcacf8157f7 100644 --- a/src/effects/effectsmanager.h +++ b/src/effects/effectsmanager.h @@ -68,6 +68,25 @@ class EffectsManager : public QObject { return m_registeredOutputChannels; } + void loadStandardEffect(const int iChainSlotNumber, + const int iEffectSlotNumber, const QString& effectId, + EffectBackendType backendType = EffectBackendType::Unknown); + + void loadOutputEffect(const int iEffectSlotNumber, const QString& effectId, + EffectBackendType backendType = EffectBackendType::Unknown); + + void loadQuickEffect(const QString& group, + const int iEffectSlotNumber, const QString& effectId, + EffectBackendType backendType = EffectBackendType::Unknown); + + void loadEqualizerEffect(const QString& group, + const int iEffectSlotNumber, const QString& effectId, + EffectBackendType backendType = EffectBackendType::Unknown); + + void loadEffect(EffectChainSlotPointer pChainSlot, + const int iEffectSlotNumber, const QString& effectId, + EffectBackendType backendType = EffectBackendType::Unknown); + void addStandardEffectChainSlots(); EffectChainSlotPointer getStandardEffectChainSlot(int unitNumber) const; @@ -78,7 +97,6 @@ class EffectsManager : public QObject { EqualizerEffectChainSlotPointer getEqualizerEffectChainSlot(const QString& group) { return m_equalizerEffectChainSlots.value(group); } - bool loadEqualizerEffectToGroup(const QString& group, EffectPointer pEffect); int numEqualizerEffectChainSlots() { return m_equalizerEffectChainSlots.size(); } @@ -87,7 +105,6 @@ class EffectsManager : public QObject { QuickEffectChainSlotPointer getQuickEffectChainSlot(const QString& group) { return m_quickEffectChainSlots.value(group); } - bool loadQuickEffectToGroup(const QString& group, EffectPointer pEffect); int numQuickEffectChainSlots() { return m_quickEffectChainSlots.size(); } @@ -119,7 +136,6 @@ class EffectsManager : public QObject { const QString& effectId, EffectManifestPointer* ppManifest, EffectsBackend** ppBackend) const; EffectManifestPointer getEffectManifest(const QString& effectId) const; - EffectPointer instantiateEffect(const QString& effectId); void setEffectVisibility(EffectManifestPointer pManifest, bool visibility); bool getEffectVisibility(EffectManifestPointer pManifest); diff --git a/src/effects/lv2/lv2backend.cpp b/src/effects/lv2/lv2backend.cpp index f32956cd2af1..29307ae42d67 100644 --- a/src/effects/lv2/lv2backend.cpp +++ b/src/effects/lv2/lv2backend.cpp @@ -73,25 +73,18 @@ EffectManifestPointer LV2Backend::getManifest(const QString& effectId) const { return EffectManifestPointer(); } -LV2Manifest* LV2Backend::getLV2Manifest(const QString& effectId) const { - return m_registeredEffects[effectId]; -} - -EffectPointer LV2Backend::instantiateEffect(EffectsManager* pEffectsManager, - const QString& effectId) { - if (!canInstantiateEffect(effectId)) { - qWarning() << "WARNING: Effect" << effectId << "is not registered."; - return EffectPointer(); +EffectInstantiatorPointer LV2Backend::getInstantiator(const QString& effectId) const { + LV2Manifest* pLV2Mainfest = getLV2Manifest(effectId); + if (pLV2Mainfest != nullptr) { + return EffectInstantiatorPointer(new LV2EffectProcessorInstantiator( + pLV2Mainfest->getPlugin(), + pLV2Mainfest->getAudioPortIndices(), + pLV2Mainfest->getControlPortIndices())); } - LV2Manifest* lv2manifest = m_registeredEffects[effectId]; + return EffectInstantiatorPointer(); + +} - return EffectPointer( - new Effect( - pEffectsManager, - lv2manifest->getEffectManifest(), - EffectInstantiatorPointer( - new LV2EffectProcessorInstantiator( - lv2manifest->getPlugin(), - lv2manifest->getAudioPortIndices(), - lv2manifest->getControlPortIndices())))); +LV2Manifest* LV2Backend::getLV2Manifest(const QString& effectId) const { + return m_registeredEffects[effectId]; } diff --git a/src/effects/lv2/lv2backend.h b/src/effects/lv2/lv2backend.h index 1a8c3e747915..4ac0e881000b 100644 --- a/src/effects/lv2/lv2backend.h +++ b/src/effects/lv2/lv2backend.h @@ -17,10 +17,9 @@ class LV2Backend : public EffectsBackend { const QList getEffectIds() const; const QSet getDiscoveredPluginIds() const; EffectManifestPointer getManifest(const QString& effectId) const; + EffectInstantiatorPointer getInstantiator(const QString& effectId) const; LV2Manifest* getLV2Manifest(const QString& effectId) const; bool canInstantiateEffect(const QString& effectId) const; - EffectPointer instantiateEffect(EffectsManager* pEffectsManager, - const QString& effectId); private: void initializeProperties(); diff --git a/src/effects/specialeffectchainslots.cpp b/src/effects/specialeffectchainslots.cpp index f6d63013fdf5..bf43e5e49968 100644 --- a/src/effects/specialeffectchainslots.cpp +++ b/src/effects/specialeffectchainslots.cpp @@ -8,7 +8,7 @@ StandardEffectChainSlot::StandardEffectChainSlot(unsigned int iChainNumber, const QString& id) : EffectChainSlot(formatEffectChainSlotGroup(iChainNumber), pEffectsManager, - SignalProcessingStage::Postfader, false, + SignalProcessingStage::Postfader, formatEffectChainSlotGroup(iChainNumber)) { for (int i = 0; i < kNumEffectsPerUnit; ++i) { addEffectSlot(formatEffectSlotGroup(iChainNumber, i)); @@ -43,9 +43,10 @@ QString StandardEffectChainSlot::formatEffectSlotGroup(const int iChainSlotNumbe OutputEffectChainSlot::OutputEffectChainSlot(EffectsManager* pEffectsManager) : EffectChainSlot(formatEffectChainSlotGroup("[Master]"), pEffectsManager, - SignalProcessingStage::Postfader, true, + SignalProcessingStage::Postfader, formatEffectChainSlotGroup("[Master]")) { addEffectSlot("[OutputEffectRack_[Master]_Effect1]"); + m_effectSlots[0]->setEnabled(true); // Register the master channel const ChannelHandleAndGroup* masterHandleAndGroup = nullptr; @@ -76,7 +77,7 @@ PerGroupEffectChainSlot::PerGroupEffectChainSlot(const QString& group, const QString& chainSlotGroup, EffectsManager* pEffectsManager) : EffectChainSlot(chainSlotGroup, pEffectsManager, - SignalProcessingStage::Prefader, false, + SignalProcessingStage::Prefader, chainSlotGroup) { // Set the chain to be fully wet. m_pControlChainMix->set(1.0); @@ -104,6 +105,7 @@ QuickEffectChainSlot::QuickEffectChainSlot(const QString& group, pEffectsManager) { // Add a single effect slot addEffectSlot(formatEffectSlotGroup(group)); + m_effectSlots[0]->setEnabled(true); // DlgPrefEq loads the Effect with loadEffectToGroup setSuperParameter(0.5); @@ -128,6 +130,7 @@ EqualizerEffectChainSlot::EqualizerEffectChainSlot(const QString& group, pEffectsManager) { // Add a single effect slot addEffectSlot(formatEffectSlotGroup(group)); + m_effectSlots[0]->setEnabled(true); // DlgPrefEq loads the Effect with loadEffectToGroup setupLegacyAliasesForGroup(group); diff --git a/src/engine/effects/engineeffect.cpp b/src/engine/effects/engineeffect.cpp index e4072ef37d75..f25d8240586e 100644 --- a/src/engine/effects/engineeffect.cpp +++ b/src/engine/effects/engineeffect.cpp @@ -62,7 +62,7 @@ EffectState* EngineEffect::createState(const mixxx::EngineParameters& bufferPara } void EngineEffect::loadStatesForInputChannel(const ChannelHandle* inputChannel, - EffectStatesMap* pStatesMap) { + EffectStatesMap* pStatesMap) { if (kEffectDebugOutput) { qDebug() << "EngineEffect::loadStatesForInputChannel" << this << "loading states for input" << *inputChannel; diff --git a/src/engine/effects/engineeffectsmanager.cpp b/src/engine/effects/engineeffectsmanager.cpp index 81741696ebba..92fa9b5b74b9 100644 --- a/src/engine/effects/engineeffectsmanager.cpp +++ b/src/engine/effects/engineeffectsmanager.cpp @@ -254,10 +254,10 @@ bool EngineEffectsManager::processEffectsRequest(EffectsRequest& message, case EffectsRequest::REMOVE_EFFECT_CHAIN: if (kEffectDebugOutput) { qDebug() << debugString() << "REMOVE_EFFECT_CHAIN" - << message.AddEffectChain.pChain; + << message.RemoveEffectChain.pChain; } - response.success = removeEffectChain(message.AddEffectChain.pChain, - message.AddEffectChain.signalProcessingStage); + response.success = removeEffectChain(message.RemoveEffectChain.pChain, + message.RemoveEffectChain.signalProcessingStage); break; default: return false; diff --git a/src/preferences/dialog/dlgprefeq.cpp b/src/preferences/dialog/dlgprefeq.cpp index e73bf6494c04..e79b2b966b09 100644 --- a/src/preferences/dialog/dlgprefeq.cpp +++ b/src/preferences/dialog/dlgprefeq.cpp @@ -448,24 +448,30 @@ void DlgPrefEQ::applySelections() { // Only apply the effect if it changed -- so first interrogate the // loaded effect if any. - bool need_load = true; + bool needLoad = true; if (m_pEffectsManager->numEqualizerEffectChainSlots() > deck) { - // It's not correct to get a chainslot by index number -- get by + // It's not correct to get a pChainSlot by index number -- get by // group name instead. - EffectChainSlotPointer chainslot = + EffectChainSlotPointer pChainSlot = m_pEffectsManager->getEqualizerEffectChainSlot(group); - if (chainslot) { - EffectPointer effectpointer = - chainslot->getEffectSlot(0)->getEffect(); - if (effectpointer && - effectpointer->getManifest()->id() == effectId) { - need_load = false; + if (pChainSlot) { + EffectSlotPointer pEffectSlot = pChainSlot->getEffectSlot(0); + if (pEffectSlot && pEffectSlot->getManifest()->id() == effectId) { + needLoad = false; } } } - if (need_load) { - EffectPointer pEffect = m_pEffectsManager->instantiateEffect(effectId); - m_pEffectsManager->loadEqualizerEffectToGroup(group, pEffect); + if (needLoad) { + QString chainSlotGroup = EqualizerEffectChainSlot::formatEffectChainSlotGroup(group); + + EffectChainSlotPointer pChainSlot = + m_pEffectsManager->getEqualizerEffectChainSlot(chainSlotGroup); + + VERIFY_OR_DEBUG_ASSERT(pChainSlot != nullptr); + + // TODO : Fetch the appropriate effect backend type + m_pEffectsManager->loadEqualizerEffect(chainSlotGroup, 0, effectId, EffectBackendType::Unknown); + m_pConfig->set(ConfigKey(kConfigKey, "EffectForGroup_" + group), ConfigValue(effectId)); m_filterWaveformEnableCOs[deck]->set(m_pEffectsManager->isEQ(effectId)); @@ -492,24 +498,31 @@ void DlgPrefEQ::applySelections() { // Only apply the effect if it changed -- so first interrogate the // loaded effect if any. - bool need_load = true; + bool needLoad = true; if (m_pEffectsManager->numQuickEffectChainSlots() > deck) { - // It's not correct to get a chainslot by index number -- get by + // It's not correct to get a pChainSlot by index number -- get by // group name instead. - EffectChainSlotPointer chainslot = + EffectChainSlotPointer pChainSlot = m_pEffectsManager->getQuickEffectChainSlot(group); - if (chainslot) { - EffectPointer effectpointer = - chainslot->getEffectSlot(0)->getEffect(); - if (effectpointer && - effectpointer->getManifest()->id() == effectId) { - need_load = false; + if (pChainSlot) { + auto pEffectSlot = pChainSlot->getEffectSlot(0); + if (pEffectSlot && pEffectSlot->getManifest()->id() == effectId) { + needLoad = false; } } } - if (need_load) { - EffectPointer pEffect = m_pEffectsManager->instantiateEffect(effectId); - m_pEffectsManager->loadQuickEffectToGroup(group, pEffect); + if (needLoad) { + QString chainSlotGroup = QuickEffectChainSlot::formatEffectChainSlotGroup(group); + EffectChainSlotPointer pChainSlot = + m_pEffectsManager->getQuickEffectChainSlot(chainSlotGroup); + + VERIFY_OR_DEBUG_ASSERT(pChainSlot != nullptr); + + // TODO : Fetch the appropriate backend type + m_pEffectsManager->loadQuickEffect(chainSlotGroup, 0, effectId, EffectBackendType::Unknown); + + // Force update metaknobs and parameters to match state of superknob + pChainSlot->setSuperParameter(pChainSlot->getSuperParameter(), true); m_pConfig->set(ConfigKey(kConfigKey, "QuickEffectForGroup_" + group), ConfigValue(effectId)); @@ -567,11 +580,11 @@ void DlgPrefEQ::slotUpdateLoEQ() { } void DlgPrefEQ::slotUpdateMasterEQParameter(int value) { - EffectPointer effect(m_pEffectMasterEQ); - if (!effect.isNull()) { + EffectSlotPointer pEffectSlot(m_pEffectMasterEQ); + if (!pEffectSlot.isNull()) { QSlider* slider = qobject_cast(sender()); int index = slider->property("index").toInt(); - EffectParameter* param = effect->getKnobParameterForSlot(index); + EffectParameter* param = pEffectSlot->getKnobParameterForSlot(index); if (param) { double dValue = value / 100.0; param->setValue(dValue); @@ -680,11 +693,11 @@ void DlgPrefEQ::setUpMasterEQ() { comboBoxMasterEq->setCurrentIndex(masterEqIndex); // Load parameters from preferences: - EffectPointer effect(m_pEffectMasterEQ); - if (!effect.isNull()) { - int knobNum = effect->numKnobParameters(); + EffectSlotPointer pEffectSlot(m_pEffectMasterEQ); + if (!pEffectSlot.isNull()) { + int knobNum = pEffectSlot->numKnobParameters(); for (int i = 0; i < knobNum; i++) { - EffectParameter* param = effect->getKnobParameterForSlot(i); + EffectParameter* param = pEffectSlot->getKnobParameterForSlot(i); if (param) { QString strValue = m_pConfig->getValueString(ConfigKey(kConfigKey, QString("EffectForGroup_[Master]_parameter%1").arg(i + 1))); @@ -716,21 +729,22 @@ void DlgPrefEQ::slotMasterEqEffectChanged(int effectIndex) { } auto pChainSlot = m_pEffectsManager->getOutputEffectChainSlot(); - if (pChainSlot) { - EffectPointer pEffect = m_pEffectsManager->instantiateEffect(effectId); - pChainSlot->replaceEffect(0, pEffect); + // TODO : Fetch the appropriate backend type + m_pEffectsManager->loadOutputEffect(0, effectId, EffectBackendType::Unknown); + + auto pEffectSlot = pChainSlot->getEffectSlot(0); - if (pEffect) { - pEffect->setEnabled(true); - m_pEffectMasterEQ = pEffect; + if (pEffectSlot) { + pEffectSlot->setEnabled(true); + m_pEffectMasterEQ = pEffectSlot; - int knobNum = pEffect->numKnobParameters(); + int knobNum = pEffectSlot->numKnobParameters(); // Create and set up Master EQ's sliders int i; for (i = 0; i < knobNum; i++) { - EffectParameter* param = pEffect->getKnobParameterForSlot(i); + EffectParameter* param = pEffectSlot->getKnobParameterForSlot(i); if (param) { // Setup Label QLabel* centerFreqLabel = new QLabel(this); @@ -807,11 +821,11 @@ QString DlgPrefEQ::getQuickEffectGroupForDeck(int deck) const { } void DlgPrefEQ::slotMasterEQToDefault() { - EffectPointer effect(m_pEffectMasterEQ); - if (!effect.isNull()) { - int knobNum = effect->numKnobParameters(); + EffectSlotPointer pEffectSlot(m_pEffectMasterEQ); + if (!pEffectSlot.isNull()) { + int knobNum = pEffectSlot->numKnobParameters(); for (int i = 0; i < knobNum; i++) { - EffectParameter* param = effect->getKnobParameterForSlot(i); + EffectParameter* param = pEffectSlot->getKnobParameterForSlot(i); if (param) { double defaultValue = param->getDefault(); setMasterEQParameter(i, defaultValue); @@ -821,9 +835,9 @@ void DlgPrefEQ::slotMasterEQToDefault() { } void DlgPrefEQ::setMasterEQParameter(int i, double value) { - EffectPointer effect(m_pEffectMasterEQ); - if (!effect.isNull()) { - EffectParameter* param = effect->getKnobParameterForSlot(i); + EffectSlotPointer pEffectSlot(m_pEffectMasterEQ); + if (!pEffectSlot.isNull()) { + EffectParameter* param = pEffectSlot->getKnobParameterForSlot(i); if (param) { param->setValue(value); m_masterEQSliders[i]->setValue(value * 100); diff --git a/src/preferences/dialog/dlgprefeq.h b/src/preferences/dialog/dlgprefeq.h index 021c61a381de..0bba241925ff 100644 --- a/src/preferences/dialog/dlgprefeq.h +++ b/src/preferences/dialog/dlgprefeq.h @@ -98,7 +98,7 @@ class DlgPrefEQ : public DlgPreferencePage, public Ui::DlgPrefEQDlg { QList m_masterEQSliders; QList m_masterEQValues; QList m_masterEQLabels; - QWeakPointer m_pEffectMasterEQ; + QWeakPointer m_pEffectMasterEQ; bool m_bEqAutoReset; bool m_bGainAutoReset; diff --git a/src/preferences/dialog/dlgpreflv2.cpp b/src/preferences/dialog/dlgpreflv2.cpp index 65a60fc8490e..b0c2e430acc2 100644 --- a/src/preferences/dialog/dlgpreflv2.cpp +++ b/src/preferences/dialog/dlgpreflv2.cpp @@ -112,6 +112,11 @@ void DlgPrefLV2::slotDisplayParameters() { void DlgPrefLV2::slotApply() { EffectManifestPointer pCurrentEffectManifest = m_pLV2Backend->getManifest(m_currentEffectId); + + if (pCurrentEffectManifest == nullptr) { + return; + } + qDebug() << "DlgPrefLV2::slotApply" << pCurrentEffectManifest.data(); for (int i = 0; i < m_pluginParameters.size(); i++) { EffectManifestParameterPointer pParameter = pCurrentEffectManifest->parameter(i); diff --git a/src/widget/weffect.cpp b/src/widget/weffect.cpp index 25d8bd0ba975..294762baf6de 100644 --- a/src/widget/weffect.cpp +++ b/src/widget/weffect.cpp @@ -29,7 +29,7 @@ void WEffect::setup(const QDomNode& node, const SkinContext& context) { void WEffect::setEffectSlot(EffectSlotPointer pEffectSlot) { if (pEffectSlot) { m_pEffectSlot = pEffectSlot; - connect(pEffectSlot.data(), SIGNAL(updated()), + connect(pEffectSlot.data(), SIGNAL(effectChanged()), this, SLOT(effectUpdated())); effectUpdated(); } @@ -38,14 +38,11 @@ void WEffect::setEffectSlot(EffectSlotPointer pEffectSlot) { void WEffect::effectUpdated() { QString name; QString description; - if (m_pEffectSlot) { - EffectPointer pEffect = m_pEffectSlot->getEffect(); - if (pEffect) { - EffectManifestPointer pManifest = pEffect->getManifest(); - name = pManifest->displayName(); - //: %1 = effect name; %2 = effect description - description = tr("%1: %2").arg(pManifest->name(), pManifest->description()); - } + if (m_pEffectSlot && m_pEffectSlot->isLoaded()) { + EffectManifestPointer pManifest = m_pEffectSlot->getManifest(); + name = pManifest->displayName(); + //: %1 = effect name; %2 = effect description + description = tr("%1: %2").arg(pManifest->name(), pManifest->description()); } else { name = tr("None"); description = tr("No effect loaded."); diff --git a/src/widget/weffectparameterknob.h b/src/widget/weffectparameterknob.h index 6fdeaf8afe30..e0a462d2528f 100644 --- a/src/widget/weffectparameterknob.h +++ b/src/widget/weffectparameterknob.h @@ -4,6 +4,8 @@ #include "widget/wknob.h" #include "effects/effectparameterslot.h" +class EffectsManager; + // This is used for effect parameter knobs with dynamic // tooltips, if the knob value is displayed by one of e.g. // 64 pixmaps. diff --git a/src/widget/weffectparameterknobcomposed.h b/src/widget/weffectparameterknobcomposed.h index 4449ffccfec0..754690bb7609 100644 --- a/src/widget/weffectparameterknobcomposed.h +++ b/src/widget/weffectparameterknobcomposed.h @@ -4,6 +4,8 @@ #include "widget/wknobcomposed.h" #include "effects/effectparameterslot.h" +class EffectsManager; + // This is used for effect parameter knobs with dynamic // tooltips, if the knob value is displayed by rotating a // single SVG image. diff --git a/src/widget/weffectselector.cpp b/src/widget/weffectselector.cpp index 67b1a0e91a6a..e817559e8456 100644 --- a/src/widget/weffectselector.cpp +++ b/src/widget/weffectselector.cpp @@ -27,9 +27,9 @@ void WEffectSelector::setup(const QDomNode& node, const SkinContext& context) { if (m_pEffectSlot != nullptr) { connect(m_pEffectsManager, SIGNAL(visibleEffectsUpdated()), this, SLOT(populate())); - connect(m_pEffectSlot.data(), SIGNAL(updated()), + connect(m_pEffectSlot.data(), SIGNAL(effectChanged()), this, SLOT(slotEffectUpdated())); - connect(this, SIGNAL(currentIndexChanged(int)), + connect(this, SIGNAL(activated(int)), this, SLOT(slotEffectSelected(int))); } else { SKIN_WARNING(node, context) @@ -77,11 +77,7 @@ void WEffectSelector::populate() { void WEffectSelector::slotEffectSelected(int newIndex) { const QString id = itemData(newIndex).toString(); - - m_pChainSlot->maybeLoadEffect( - m_pEffectSlot->getEffectSlotNumber(), - id); - + m_pEffectsManager->loadEffect(m_pChainSlot, m_pEffectSlot->getEffectSlotNumber(), id); setBaseTooltip(itemData(newIndex, Qt::ToolTipRole).toString()); } @@ -89,9 +85,8 @@ void WEffectSelector::slotEffectUpdated() { int newIndex; if (m_pEffectSlot != nullptr) { - EffectPointer pEffect = m_pEffectSlot->getEffect(); - if (pEffect != nullptr) { - EffectManifestPointer pManifest = pEffect->getManifest(); + if (m_pEffectSlot->getManifest() != nullptr) { + EffectManifestPointer pManifest = m_pEffectSlot->getManifest(); newIndex = findData(QVariant(pManifest->id())); } else { newIndex = findData(QVariant()); @@ -100,6 +95,12 @@ void WEffectSelector::slotEffectUpdated() { newIndex = findData(QVariant()); } + if (kEffectDebugOutput) { + qDebug() << "WEffectSelector::slotEffectUpdated" + << "old" << itemData(currentIndex()) + << "new" << itemData(newIndex); + } + if (newIndex != -1 && newIndex != currentIndex()) { setCurrentIndex(newIndex); setBaseTooltip(itemData(newIndex, Qt::ToolTipRole).toString()); From e8626e949529f00ae4f20fc6f4de6dfab6cf277d Mon Sep 17 00:00:00 2001 From: Kshitij Gupta Date: Tue, 17 Jul 2018 10:03:42 +0530 Subject: [PATCH 006/443] [WIP] Updated Effect tests - SIGSEGV on loading an effect --- src/test/baseeffecttest.h | 2 +- src/test/effectslottest.cpp | 8 +++----- src/test/effectsmanagertest.cpp | 36 --------------------------------- src/test/metaknob_link_test.cpp | 19 ++++++++--------- 4 files changed, 12 insertions(+), 53 deletions(-) delete mode 100644 src/test/effectsmanagertest.cpp diff --git a/src/test/baseeffecttest.h b/src/test/baseeffecttest.h index ce12fb8f8ce6..ee5a546ba7a7 100644 --- a/src/test/baseeffecttest.h +++ b/src/test/baseeffecttest.h @@ -6,7 +6,7 @@ #include -#include "effects/effect.h" +#include "effects/effectslot.h" #include "effects/effectsmanager.h" #include "effects/effectmanifest.h" #include "effects/effectsbackend.h" diff --git a/src/test/effectslottest.cpp b/src/test/effectslottest.cpp index f43b127eea7d..4ce5f1a1b664 100644 --- a/src/test/effectslottest.cpp +++ b/src/test/effectslottest.cpp @@ -49,18 +49,16 @@ TEST_F(EffectSlotTest, ControlsReflectSlotState) { pManifest->addParameter(); registerTestEffect(pManifest, false); - // Check the controls reflect the state of their loaded effect. - EffectPointer pEffect = m_pEffectsManager->instantiateEffect(pManifest->id()); // Enabled defaults to false in effect, slot, and engine effect. EXPECT_DOUBLE_EQ(0, ControlObject::get(ConfigKey(group, "enabled"))); EXPECT_DOUBLE_EQ(0, ControlObject::get(ConfigKey(group, "num_parameters"))); - pEffectSlot->loadEffect(pEffect, false); + m_pEffectsManager->loadEffect(pChainSlot, iEffectNumber, + pManifest->id(), EffectBackendType::Unknown); EXPECT_DOUBLE_EQ(0, ControlObject::get(ConfigKey(group, "enabled"))); EXPECT_DOUBLE_EQ(1, ControlObject::get(ConfigKey(group, "num_parameters"))); - pEffect->setEnabled(true); - EXPECT_TRUE(pEffect->enabled()); + pEffectSlot->setEnabled(true); EXPECT_DOUBLE_EQ(1, ControlObject::get(ConfigKey(group, "enabled"))); EXPECT_DOUBLE_EQ(1, ControlObject::get(ConfigKey(group, "num_parameters"))); diff --git a/src/test/effectsmanagertest.cpp b/src/test/effectsmanagertest.cpp deleted file mode 100644 index 9a452692e5fc..000000000000 --- a/src/test/effectsmanagertest.cpp +++ /dev/null @@ -1,36 +0,0 @@ -#include -#include - -#include -#include - -#include "test/mixxxtest.h" -#include "effects/effectsmanager.h" -#include "effects/effectmanifest.h" - -#include "test/baseeffecttest.h" - -using ::testing::Return; -using ::testing::_; - -class EffectsManagerTest : public BaseEffectTest { - protected: - void SetUp() override { - registerTestBackend(); - } -}; - -TEST_F(EffectsManagerTest, CanInstantiateEffectsFromBackend) { - EffectManifestPointer pManifest(new EffectManifest()); - pManifest->setId("org.mixxx.test.effect"); - pManifest->setName("Test Effect"); - registerTestEffect(pManifest, false); - - // Check we can get the same manifest that we registered back. - EffectManifestPointer effect_to_load = m_pEffectsManager->getEffectManifest(pManifest->id()); - EXPECT_QSTRING_EQ(effect_to_load->name(), pManifest->name()); - - // Check we can instantiate the effect. - EffectPointer pEffect = m_pEffectsManager->instantiateEffect(pManifest->id()); - EXPECT_FALSE(pEffect.isNull()); -} diff --git a/src/test/metaknob_link_test.cpp b/src/test/metaknob_link_test.cpp index 2efa78556671..50fb1896dd6d 100644 --- a/src/test/metaknob_link_test.cpp +++ b/src/test/metaknob_link_test.cpp @@ -7,7 +7,6 @@ #include "effects/effectparameterslot.h" #include "effects/effectchainslot.h" #include "effects/specialeffectchainslots.h" -#include "effects/effect.h" #include "effects/effectslot.h" #include "mixxxtest.h" #include "test/baseeffecttest.h" @@ -54,10 +53,8 @@ class MetaLinkTest : public BaseEffectTest { registerTestEffect(pManifest, false); - // Check the controls reflect the state of their loaded effect. - EffectPointer pEffect = m_pEffectsManager->instantiateEffect(pManifest->id()); - - m_pEffectSlot->loadEffect(pEffect, false); + m_pEffectsManager->loadEffect(m_pChainSlot, iEffectNumber, + pManifest->id(), EffectBackendType::Unknown); QString itemPrefix = EffectParameterSlot::formatItemPrefix(0); @@ -118,7 +115,7 @@ TEST_F(MetaLinkTest, MetaToParameter_Softtakeover_EffectEnabled) { m_pControlLinkType->set( static_cast(EffectManifestParameter::LinkType::LINKED)); // Soft takeover should only occur when the effect is enabled. - m_pEffectSlot->slotEnabled(1.0); + m_pEffectSlot->setEnabled(1.0); // Soft takeover always ignores the first change. m_pEffectSlot->slotEffectMetaParameter(0.5); @@ -158,7 +155,7 @@ TEST_F(MetaLinkTest, MetaToParameter_Softtakeover_EffectDisabled) { TEST_F(MetaLinkTest, SuperToMeta_Softtakeover_EffectEnabled) { // Soft takeover should only occur when the effect is enabled. - m_pEffectSlot->slotEnabled(1.0); + m_pEffectSlot->setEnabled(1.0); // Soft takeover always ignores the first change. m_pChainSlot->setSuperParameter(0.5); @@ -197,7 +194,7 @@ TEST_F(MetaLinkTest, HalfLinkTakeover) { // An effect that is linked to half of a knob should be more tolerant of // takeover changes. - m_pEffectSlot->slotEnabled(1.0); + m_pEffectSlot->setEnabled(1.0); // We have to recreate the effect because we want a neutral point at // 0 or 1. @@ -217,9 +214,9 @@ TEST_F(MetaLinkTest, HalfLinkTakeover) { low->setMinimum(0); low->setMaximum(1.0); registerTestEffect(pManifest, false); - // Check the controls reflect the state of their loaded effect. - EffectPointer pEffect = m_pEffectsManager->instantiateEffect(pManifest->id()); - m_pEffectSlot->loadEffect(pEffect, false); + + m_pEffectsManager->loadEffect(m_pChainSlot, 0, pManifest->id(), EffectBackendType::Unknown); + QString itemPrefix = EffectParameterSlot::formatItemPrefix(0); m_pControlValue.reset(new ControlProxy(group, itemPrefix)); m_pControlLinkType.reset(new ControlProxy(group, From 95a8af80707e055ce13c2b2cc26fae1e83ee9e20 Mon Sep 17 00:00:00 2001 From: Be Date: Fri, 13 Jul 2018 16:26:47 -0500 Subject: [PATCH 007/443] use shared pointers for EngineEffectParameters --- src/effects/builtin/autopaneffect.h | 6 +++--- src/effects/builtin/balanceeffect.h | 6 +++--- src/effects/builtin/bessel4lvmixeqeffect.h | 12 ++++++------ src/effects/builtin/bessel8lvmixeqeffect.h | 12 ++++++------ src/effects/builtin/biquadfullkilleqeffect.h | 12 ++++++------ src/effects/builtin/bitcrushereffect.h | 4 ++-- src/effects/builtin/echoeffect.h | 12 ++++++------ src/effects/builtin/filtereffect.h | 6 +++--- src/effects/builtin/flangereffect.h | 12 ++++++------ src/effects/builtin/graphiceqeffect.h | 6 +++--- src/effects/builtin/linkwitzriley8eqeffect.h | 12 ++++++------ src/effects/builtin/loudnesscontoureffect.h | 4 ++-- src/effects/builtin/metronomeeffect.h | 4 ++-- src/effects/builtin/moogladder4filtereffect.h | 6 +++--- src/effects/builtin/parametriceqeffect.h | 6 +++--- src/effects/builtin/phasereffect.h | 14 +++++++------- src/effects/builtin/reverbeffect.h | 8 ++++---- src/effects/builtin/threebandbiquadeqeffect.h | 12 ++++++------ src/effects/builtin/tremoloeffect.h | 14 +++++++------- src/effects/defs.h | 4 ++++ src/effects/lv2/lv2effectprocessor.h | 2 +- src/engine/effects/engineeffect.cpp | 11 +++-------- src/engine/effects/engineeffect.h | 8 ++++---- 23 files changed, 96 insertions(+), 97 deletions(-) diff --git a/src/effects/builtin/autopaneffect.h b/src/effects/builtin/autopaneffect.h index c10f265d21eb..5f5c27f47462 100644 --- a/src/effects/builtin/autopaneffect.h +++ b/src/effects/builtin/autopaneffect.h @@ -100,9 +100,9 @@ class AutoPanEffect : public EffectProcessorImpl { return getId(); } - EngineEffectParameter* m_pSmoothingParameter; - EngineEffectParameter* m_pPeriodParameter; - EngineEffectParameter* m_pWidthParameter; + EngineEffectParameterPointer m_pSmoothingParameter; + EngineEffectParameterPointer m_pPeriodParameter; + EngineEffectParameterPointer m_pWidthParameter; DISALLOW_COPY_AND_ASSIGN(AutoPanEffect); }; diff --git a/src/effects/builtin/balanceeffect.h b/src/effects/builtin/balanceeffect.h index 7276e5142313..898b76535bee 100644 --- a/src/effects/builtin/balanceeffect.h +++ b/src/effects/builtin/balanceeffect.h @@ -48,9 +48,9 @@ class BalanceEffect : public EffectProcessorImpl { return getId(); } - EngineEffectParameter* m_pBalanceParameter; - EngineEffectParameter* m_pMidSideParameter; - EngineEffectParameter* m_pBypassFreqParameter; + EngineEffectParameterPointer m_pBalanceParameter; + EngineEffectParameterPointer m_pMidSideParameter; + EngineEffectParameterPointer m_pBypassFreqParameter; DISALLOW_COPY_AND_ASSIGN(BalanceEffect); }; diff --git a/src/effects/builtin/bessel4lvmixeqeffect.h b/src/effects/builtin/bessel4lvmixeqeffect.h index 68bc4f68f0a2..37ec30932609 100644 --- a/src/effects/builtin/bessel4lvmixeqeffect.h +++ b/src/effects/builtin/bessel4lvmixeqeffect.h @@ -43,13 +43,13 @@ class Bessel4LVMixEQEffect : public EffectProcessorImpl m_pLoFreqCorner; std::unique_ptr m_pHiFreqCorner; diff --git a/src/effects/builtin/bitcrushereffect.h b/src/effects/builtin/bitcrushereffect.h index 18dcbf203603..69b8700bf01b 100644 --- a/src/effects/builtin/bitcrushereffect.h +++ b/src/effects/builtin/bitcrushereffect.h @@ -43,8 +43,8 @@ class BitCrusherEffect : public EffectProcessorImpl { return getId(); } - EngineEffectParameter* m_pBitDepthParameter; - EngineEffectParameter* m_pDownsampleParameter; + EngineEffectParameterPointer m_pBitDepthParameter; + EngineEffectParameterPointer m_pDownsampleParameter; DISALLOW_COPY_AND_ASSIGN(BitCrusherEffect); }; diff --git a/src/effects/builtin/echoeffect.h b/src/effects/builtin/echoeffect.h index c1d9266a5feb..25dbf2a3b893 100644 --- a/src/effects/builtin/echoeffect.h +++ b/src/effects/builtin/echoeffect.h @@ -65,12 +65,12 @@ class EchoEffect : public EffectProcessorImpl { return getId(); } - EngineEffectParameter* m_pDelayParameter; - EngineEffectParameter* m_pSendParameter; - EngineEffectParameter* m_pFeedbackParameter; - EngineEffectParameter* m_pPingPongParameter; - EngineEffectParameter* m_pQuantizeParameter; - EngineEffectParameter* m_pTripletParameter; + EngineEffectParameterPointer m_pDelayParameter; + EngineEffectParameterPointer m_pSendParameter; + EngineEffectParameterPointer m_pFeedbackParameter; + EngineEffectParameterPointer m_pPingPongParameter; + EngineEffectParameterPointer m_pQuantizeParameter; + EngineEffectParameterPointer m_pTripletParameter; DISALLOW_COPY_AND_ASSIGN(EchoEffect); }; diff --git a/src/effects/builtin/filtereffect.h b/src/effects/builtin/filtereffect.h index 8407fdfcbc8a..2e2279929288 100644 --- a/src/effects/builtin/filtereffect.h +++ b/src/effects/builtin/filtereffect.h @@ -47,9 +47,9 @@ class FilterEffect : public EffectProcessorImpl { return getId(); } - EngineEffectParameter* m_pLPF; - EngineEffectParameter* m_pQ; - EngineEffectParameter* m_pHPF; + EngineEffectParameterPointer m_pLPF; + EngineEffectParameterPointer m_pQ; + EngineEffectParameterPointer m_pHPF; DISALLOW_COPY_AND_ASSIGN(FilterEffect); }; diff --git a/src/effects/builtin/flangereffect.h b/src/effects/builtin/flangereffect.h index f87b2b30ef34..4499eddce2b0 100644 --- a/src/effects/builtin/flangereffect.h +++ b/src/effects/builtin/flangereffect.h @@ -68,12 +68,12 @@ class FlangerEffect : public EffectProcessorImpl { return getId(); } - EngineEffectParameter* m_pSpeedParameter; - EngineEffectParameter* m_pWidthParameter; - EngineEffectParameter* m_pManualParameter; - EngineEffectParameter* m_pRegenParameter; - EngineEffectParameter* m_pMixParameter; - EngineEffectParameter* m_pTripletParameter; + EngineEffectParameterPointer m_pSpeedParameter; + EngineEffectParameterPointer m_pWidthParameter; + EngineEffectParameterPointer m_pManualParameter; + EngineEffectParameterPointer m_pRegenParameter; + EngineEffectParameterPointer m_pMixParameter; + EngineEffectParameterPointer m_pTripletParameter; DISALLOW_COPY_AND_ASSIGN(FlangerEffect); }; diff --git a/src/effects/builtin/graphiceqeffect.h b/src/effects/builtin/graphiceqeffect.h index 70a9eb278382..635a8f772926 100644 --- a/src/effects/builtin/graphiceqeffect.h +++ b/src/effects/builtin/graphiceqeffect.h @@ -50,9 +50,9 @@ class GraphicEQEffect : public EffectProcessorImpl { return getId(); } - EngineEffectParameter* m_pPotLow; - QList m_pPotMid; - EngineEffectParameter* m_pPotHigh; + EngineEffectParameterPointer m_pPotLow; + QList m_pPotMid; + EngineEffectParameterPointer m_pPotHigh; unsigned int m_oldSampleRate; DISALLOW_COPY_AND_ASSIGN(GraphicEQEffect); diff --git a/src/effects/builtin/linkwitzriley8eqeffect.h b/src/effects/builtin/linkwitzriley8eqeffect.h index d7d4e5c9deee..cd1d221535e9 100644 --- a/src/effects/builtin/linkwitzriley8eqeffect.h +++ b/src/effects/builtin/linkwitzriley8eqeffect.h @@ -59,13 +59,13 @@ class LinkwitzRiley8EQEffect : public EffectProcessorImpl { const EffectEnableState enableState, const GroupFeatureState& groupFeatures); private: - EngineEffectParameter* m_pBpmParameter; - EngineEffectParameter* m_pSyncParameter; + EngineEffectParameterPointer m_pBpmParameter; + EngineEffectParameterPointer m_pSyncParameter; DISALLOW_COPY_AND_ASSIGN(MetronomeEffect); }; diff --git a/src/effects/builtin/moogladder4filtereffect.h b/src/effects/builtin/moogladder4filtereffect.h index c0b19bb7107d..d39c2d6b4e17 100644 --- a/src/effects/builtin/moogladder4filtereffect.h +++ b/src/effects/builtin/moogladder4filtereffect.h @@ -47,9 +47,9 @@ class MoogLadder4FilterEffect : public EffectProcessorImpl m_pPotGain; - QList m_pPotQ; - QList m_pPotCenter; + QList m_pPotGain; + QList m_pPotQ; + QList m_pPotCenter; unsigned int m_oldSampleRate; diff --git a/src/effects/builtin/phasereffect.h b/src/effects/builtin/phasereffect.h index c85b59a5dc31..ff5263636352 100644 --- a/src/effects/builtin/phasereffect.h +++ b/src/effects/builtin/phasereffect.h @@ -60,13 +60,13 @@ class PhaserEffect : public EffectProcessorImpl { return getId(); } - EngineEffectParameter* m_pStagesParameter; - EngineEffectParameter* m_pLFOPeriodParameter; - EngineEffectParameter* m_pDepthParameter; - EngineEffectParameter* m_pFeedbackParameter; - EngineEffectParameter* m_pRangeParameter; - EngineEffectParameter* m_pTripletParameter; - EngineEffectParameter* m_pStereoParameter; + EngineEffectParameterPointer m_pStagesParameter; + EngineEffectParameterPointer m_pLFOPeriodParameter; + EngineEffectParameterPointer m_pDepthParameter; + EngineEffectParameterPointer m_pFeedbackParameter; + EngineEffectParameterPointer m_pRangeParameter; + EngineEffectParameterPointer m_pTripletParameter; + EngineEffectParameterPointer m_pStereoParameter; //Passing the sample through a series of allpass filters inline CSAMPLE processSample(CSAMPLE input, CSAMPLE* oldIn, CSAMPLE* oldOut, diff --git a/src/effects/builtin/reverbeffect.h b/src/effects/builtin/reverbeffect.h index 1883b536804d..8b449318b27f 100644 --- a/src/effects/builtin/reverbeffect.h +++ b/src/effects/builtin/reverbeffect.h @@ -54,10 +54,10 @@ class ReverbEffect : public EffectProcessorImpl { return getId(); } - EngineEffectParameter* m_pDecayParameter; - EngineEffectParameter* m_pBandWidthParameter; - EngineEffectParameter* m_pDampingParameter; - EngineEffectParameter* m_pSendParameter; + EngineEffectParameterPointer m_pDecayParameter; + EngineEffectParameterPointer m_pBandWidthParameter; + EngineEffectParameterPointer m_pDampingParameter; + EngineEffectParameterPointer m_pSendParameter; DISALLOW_COPY_AND_ASSIGN(ReverbEffect); }; diff --git a/src/effects/builtin/threebandbiquadeqeffect.h b/src/effects/builtin/threebandbiquadeqeffect.h index 13c326381320..f01f14eda46b 100644 --- a/src/effects/builtin/threebandbiquadeqeffect.h +++ b/src/effects/builtin/threebandbiquadeqeffect.h @@ -67,13 +67,13 @@ class ThreeBandBiquadEQEffect : public EffectProcessorImpl m_pLoFreqCorner; std::unique_ptr m_pHiFreqCorner; diff --git a/src/effects/builtin/tremoloeffect.h b/src/effects/builtin/tremoloeffect.h index 571a02398f97..d864c7f57b75 100644 --- a/src/effects/builtin/tremoloeffect.h +++ b/src/effects/builtin/tremoloeffect.h @@ -40,13 +40,13 @@ class TremoloEffect : public EffectProcessorImpl { return getId(); } - EngineEffectParameter* m_pDepthParameter; - EngineEffectParameter* m_pRateParameter; - EngineEffectParameter* m_pWidthParameter; - EngineEffectParameter* m_pWaveformParameter; - EngineEffectParameter* m_pPhaseParameter; - EngineEffectParameter* m_pQuantizeParameter; - EngineEffectParameter* m_pTripletParameter; + EngineEffectParameterPointer m_pDepthParameter; + EngineEffectParameterPointer m_pRateParameter; + EngineEffectParameterPointer m_pWidthParameter; + EngineEffectParameterPointer m_pWaveformParameter; + EngineEffectParameterPointer m_pPhaseParameter; + EngineEffectParameterPointer m_pQuantizeParameter; + EngineEffectParameterPointer m_pTripletParameter; DISALLOW_COPY_AND_ASSIGN(TremoloEffect); }; diff --git a/src/effects/defs.h b/src/effects/defs.h index a400ae1dcb04..b01eee758b76 100644 --- a/src/effects/defs.h +++ b/src/effects/defs.h @@ -3,6 +3,7 @@ #include "engine/channelhandle.h" #include #include +#include enum class EffectEnableState { Disabled, @@ -44,6 +45,9 @@ class EffectState; typedef ChannelHandleMap EffectStatesMap; typedef std::array EffectStatesMapArray; +class EngineEffectParameter; +typedef QSharedPointer EngineEffectParameterPointer; + class EffectSlot; typedef QSharedPointer EffectSlotPointer; diff --git a/src/effects/lv2/lv2effectprocessor.h b/src/effects/lv2/lv2effectprocessor.h index cf29d72af07b..b5be05a199ae 100644 --- a/src/effects/lv2/lv2effectprocessor.h +++ b/src/effects/lv2/lv2effectprocessor.h @@ -55,7 +55,7 @@ class LV2EffectProcessor : public EffectProcessor { private: LV2EffectGroupState* createGroupState(const mixxx::EngineParameters& bufferParameters); - QList m_parameters; + QList m_parameters; float* m_inputL; float* m_inputR; float* m_outputL; diff --git a/src/engine/effects/engineeffect.cpp b/src/engine/effects/engineeffect.cpp index f25d8240586e..39135235123e 100644 --- a/src/engine/effects/engineeffect.cpp +++ b/src/engine/effects/engineeffect.cpp @@ -14,8 +14,7 @@ EngineEffect::EngineEffect(EffectManifestPointer pManifest, const QList& parameters = m_pManifest->parameters(); for (int i = 0; i < parameters.size(); ++i) { EffectManifestParameterPointer param = parameters.at(i); - EngineEffectParameter* pParameter = - new EngineEffectParameter(param); + EngineEffectParameterPointer pParameter(new EngineEffectParameter(param)); m_parameters[i] = pParameter; m_parametersById[param->id()] = pParameter; } @@ -47,11 +46,7 @@ EngineEffect::~EngineEffect() { } delete m_pProcessor; m_parametersById.clear(); - for (int i = 0; i < m_parameters.size(); ++i) { - EngineEffectParameter* pParameter = m_parameters.at(i); - m_parameters[i] = NULL; - delete pParameter; - } + m_parameters.clear(); } EffectState* EngineEffect::createState(const mixxx::EngineParameters& bufferParameters) { @@ -77,7 +72,7 @@ void EngineEffect::deleteStatesForInputChannel(const ChannelHandle* inputChannel bool EngineEffect::processEffectsRequest(EffectsRequest& message, EffectsResponsePipe* pResponsePipe) { - EngineEffectParameter* pParameter = NULL; + EngineEffectParameterPointer pParameter; EffectsResponse response(message); switch (message.type) { diff --git a/src/engine/effects/engineeffect.h b/src/engine/effects/engineeffect.h index d42c1a6759c9..4ed1fc07867d 100644 --- a/src/engine/effects/engineeffect.h +++ b/src/engine/effects/engineeffect.h @@ -29,8 +29,8 @@ class EngineEffect : public EffectsRequestHandler { return m_pManifest->name(); } - EngineEffectParameter* getParameterById(const QString& id) { - return m_parametersById.value(id, NULL); + EngineEffectParameterPointer getParameterById(const QString& id) { + return m_parametersById.value(id); } EffectState* createState(const mixxx::EngineParameters& bufferParameters); @@ -64,8 +64,8 @@ class EngineEffect : public EffectsRequestHandler { ChannelHandleMap> m_effectEnableStateForChannelMatrix; bool m_effectRampsFromDry; // Must not be modified after construction. - QVector m_parameters; - QMap m_parametersById; + QVector m_parameters; + QMap m_parametersById; const EffectsManager* m_pEffectsManager; From b7a0ec06484487dc1cb27c3b430122577e89dd1b Mon Sep 17 00:00:00 2001 From: Be Date: Fri, 13 Jul 2018 17:19:14 -0500 Subject: [PATCH 008/443] decouple EffectProcessor construction from EngineEffect This will allow for constructing EffectProcessors before constructing EngineEffect. --- src/effects/builtin/autopaneffect.cpp | 9 ++--- src/effects/builtin/autopaneffect.h | 5 ++- src/effects/builtin/balanceeffect.cpp | 9 ++--- src/effects/builtin/balanceeffect.h | 5 ++- src/effects/builtin/bessel4lvmixeqeffect.cpp | 18 ++++++---- src/effects/builtin/bessel4lvmixeqeffect.h | 5 ++- src/effects/builtin/bessel8lvmixeqeffect.cpp | 19 ++++++---- src/effects/builtin/bessel8lvmixeqeffect.h | 5 ++- .../builtin/biquadfullkilleqeffect.cpp | 18 ++++++---- src/effects/builtin/biquadfullkilleqeffect.h | 5 ++- src/effects/builtin/bitcrushereffect.cpp | 7 ++-- src/effects/builtin/bitcrushereffect.h | 5 ++- src/effects/builtin/echoeffect.cpp | 17 ++++----- src/effects/builtin/echoeffect.h | 5 ++- src/effects/builtin/filtereffect.cpp | 9 ++--- src/effects/builtin/filtereffect.h | 5 ++- src/effects/builtin/flangereffect.cpp | 15 ++++---- src/effects/builtin/flangereffect.h | 5 ++- src/effects/builtin/graphiceqeffect.cpp | 10 +++--- src/effects/builtin/graphiceqeffect.h | 5 ++- .../builtin/linkwitzriley8eqeffect.cpp | 19 ++++++---- src/effects/builtin/linkwitzriley8eqeffect.h | 5 ++- src/effects/builtin/loudnesscontoureffect.cpp | 8 ++--- src/effects/builtin/loudnesscontoureffect.h | 5 ++- src/effects/builtin/metronomeeffect.cpp | 7 ++-- src/effects/builtin/metronomeeffect.h | 5 ++- .../builtin/moogladder4filtereffect.cpp | 9 ++--- src/effects/builtin/moogladder4filtereffect.h | 5 ++- src/effects/builtin/parametriceqeffect.cpp | 23 ++++++------ src/effects/builtin/parametriceqeffect.h | 10 +++--- src/effects/builtin/phasereffect.cpp | 17 ++++----- src/effects/builtin/phasereffect.h | 5 ++- src/effects/builtin/reverbeffect.cpp | 11 +++--- src/effects/builtin/reverbeffect.h | 5 ++- .../builtin/threebandbiquadeqeffect.cpp | 18 ++++++---- src/effects/builtin/threebandbiquadeqeffect.h | 5 ++- src/effects/builtin/tremoloeffect.cpp | 17 ++++----- src/effects/builtin/tremoloeffect.h | 5 ++- src/effects/effectinstantiator.h | 3 +- src/effects/effectprocessor.h | 5 +-- src/effects/lv2/lv2effectprocessor.cpp | 36 +++++++++++-------- src/effects/lv2/lv2effectprocessor.h | 8 +++-- src/engine/effects/engineeffect.cpp | 1 + src/engine/effects/engineeffect.h | 4 --- 44 files changed, 259 insertions(+), 158 deletions(-) diff --git a/src/effects/builtin/autopaneffect.cpp b/src/effects/builtin/autopaneffect.cpp index b1b76df88c4b..03e9eb6c16b9 100644 --- a/src/effects/builtin/autopaneffect.cpp +++ b/src/effects/builtin/autopaneffect.cpp @@ -77,10 +77,11 @@ EffectManifestPointer AutoPanEffect::getManifest() { return pManifest; } -AutoPanEffect::AutoPanEffect(EngineEffect* pEffect) - : m_pSmoothingParameter(pEffect->getParameterById("smoothing")), - m_pPeriodParameter(pEffect->getParameterById("period")), - m_pWidthParameter(pEffect->getParameterById("width")) { +void AutoPanEffect::loadEngineEffectParameters( + const QMap& parameters) { + m_pSmoothingParameter = parameters.value("smoothing"); + m_pPeriodParameter = parameters.value("period"); + m_pWidthParameter = parameters.value("width"); } AutoPanEffect::~AutoPanEffect() { diff --git a/src/effects/builtin/autopaneffect.h b/src/effects/builtin/autopaneffect.h index 5f5c27f47462..93cc3fff2a78 100644 --- a/src/effects/builtin/autopaneffect.h +++ b/src/effects/builtin/autopaneffect.h @@ -79,12 +79,15 @@ class AutoPanGroupState : public EffectState { class AutoPanEffect : public EffectProcessorImpl { public: - AutoPanEffect(EngineEffect* pEffect); + AutoPanEffect() {}; virtual ~AutoPanEffect(); static QString getId(); static EffectManifestPointer getManifest(); + void loadEngineEffectParameters( + const QMap& parameters); + void processChannel(const ChannelHandle& handle, AutoPanGroupState* pState, const CSAMPLE* pInput, CSAMPLE* pOutput, diff --git a/src/effects/builtin/balanceeffect.cpp b/src/effects/builtin/balanceeffect.cpp index b4ca00aedae9..808c483a5de7 100644 --- a/src/effects/builtin/balanceeffect.cpp +++ b/src/effects/builtin/balanceeffect.cpp @@ -96,10 +96,11 @@ void BalanceGroupState::setFilters(int sampleRate, int freq) { m_high->setFrequencyCorners(sampleRate, freq); } -BalanceEffect::BalanceEffect(EngineEffect* pEffect) - : m_pBalanceParameter(pEffect->getParameterById("balance")), - m_pMidSideParameter(pEffect->getParameterById("midSide")), - m_pBypassFreqParameter(pEffect->getParameterById("bypassFreq")) { +void BalanceEffect::loadEngineEffectParameters( + const QMap& parameters) { + m_pBalanceParameter = parameters.value("balance"); + m_pMidSideParameter = parameters.value("midSide"); + m_pBypassFreqParameter = parameters.value("bypassFreq"); } BalanceEffect::~BalanceEffect() { diff --git a/src/effects/builtin/balanceeffect.h b/src/effects/builtin/balanceeffect.h index 898b76535bee..9ea9f81ac83e 100644 --- a/src/effects/builtin/balanceeffect.h +++ b/src/effects/builtin/balanceeffect.h @@ -29,12 +29,15 @@ class BalanceGroupState : public EffectState { class BalanceEffect : public EffectProcessorImpl { public: - BalanceEffect(EngineEffect* pEffect); + BalanceEffect() {}; virtual ~BalanceEffect(); static QString getId(); static EffectManifestPointer getManifest(); + void loadEngineEffectParameters( + const QMap& parameters); + void processChannel(const ChannelHandle& handle, BalanceGroupState* pState, const CSAMPLE* pInput, CSAMPLE* pOutput, diff --git a/src/effects/builtin/bessel4lvmixeqeffect.cpp b/src/effects/builtin/bessel4lvmixeqeffect.cpp index d04873ca60f1..969c6d1b51a3 100644 --- a/src/effects/builtin/bessel4lvmixeqeffect.cpp +++ b/src/effects/builtin/bessel4lvmixeqeffect.cpp @@ -25,17 +25,21 @@ EffectManifestPointer Bessel4LVMixEQEffect::getManifest() { return pManifest; } -Bessel4LVMixEQEffect::Bessel4LVMixEQEffect(EngineEffect* pEffect) - : m_pPotLow(pEffect->getParameterById("low")), - m_pPotMid(pEffect->getParameterById("mid")), - m_pPotHigh(pEffect->getParameterById("high")), - m_pKillLow(pEffect->getParameterById("killLow")), - m_pKillMid(pEffect->getParameterById("killMid")), - m_pKillHigh(pEffect->getParameterById("killHigh")) { +Bessel4LVMixEQEffect::Bessel4LVMixEQEffect() { m_pLoFreqCorner = new ControlProxy("[Mixer Profile]", "LoEQFrequency"); m_pHiFreqCorner = new ControlProxy("[Mixer Profile]", "HiEQFrequency"); } +void Bessel4LVMixEQEffect::loadEngineEffectParameters( + const QMap& parameters) { + m_pPotLow = parameters.value("low"); + m_pPotMid = parameters.value("mid"); + m_pPotHigh = parameters.value("high"); + m_pKillLow = parameters.value("killLow"); + m_pKillMid = parameters.value("killMid"); + m_pKillHigh = parameters.value("killHigh"); +} + Bessel4LVMixEQEffect::~Bessel4LVMixEQEffect() { delete m_pLoFreqCorner; delete m_pHiFreqCorner; diff --git a/src/effects/builtin/bessel4lvmixeqeffect.h b/src/effects/builtin/bessel4lvmixeqeffect.h index 37ec30932609..ab8cac43e6c4 100644 --- a/src/effects/builtin/bessel4lvmixeqeffect.h +++ b/src/effects/builtin/bessel4lvmixeqeffect.h @@ -24,12 +24,15 @@ class Bessel4LVMixEQEffectGroupState : class Bessel4LVMixEQEffect : public EffectProcessorImpl { public: - Bessel4LVMixEQEffect(EngineEffect* pEffect); + Bessel4LVMixEQEffect(); virtual ~Bessel4LVMixEQEffect(); static QString getId(); static EffectManifestPointer getManifest(); + void loadEngineEffectParameters( + const QMap& parameters); + // See effectprocessor.h void processChannel(const ChannelHandle& handle, Bessel4LVMixEQEffectGroupState* pState, diff --git a/src/effects/builtin/bessel8lvmixeqeffect.cpp b/src/effects/builtin/bessel8lvmixeqeffect.cpp index 898a28f798bb..ce803a93ad72 100644 --- a/src/effects/builtin/bessel8lvmixeqeffect.cpp +++ b/src/effects/builtin/bessel8lvmixeqeffect.cpp @@ -25,17 +25,22 @@ EffectManifestPointer Bessel8LVMixEQEffect::getManifest() { return pManifest; } -Bessel8LVMixEQEffect::Bessel8LVMixEQEffect(EngineEffect* pEffect) - : m_pPotLow(pEffect->getParameterById("low")), - m_pPotMid(pEffect->getParameterById("mid")), - m_pPotHigh(pEffect->getParameterById("high")), - m_pKillLow(pEffect->getParameterById("killLow")), - m_pKillMid(pEffect->getParameterById("killMid")), - m_pKillHigh(pEffect->getParameterById("killHigh")) { +Bessel8LVMixEQEffect::Bessel8LVMixEQEffect() { m_pLoFreqCorner = new ControlProxy("[Mixer Profile]", "LoEQFrequency"); m_pHiFreqCorner = new ControlProxy("[Mixer Profile]", "HiEQFrequency"); } +void Bessel8LVMixEQEffect::loadEngineEffectParameters( + const QMap& parameters) { + m_pPotLow = parameters.value("low"); + m_pPotMid = parameters.value("mid"); + m_pPotHigh = parameters.value("high"); + m_pKillLow = parameters.value("killLow"); + m_pKillMid = parameters.value("killMid"); + m_pKillHigh = parameters.value("killHigh"); +} + + Bessel8LVMixEQEffect::~Bessel8LVMixEQEffect() { delete m_pLoFreqCorner; delete m_pHiFreqCorner; diff --git a/src/effects/builtin/bessel8lvmixeqeffect.h b/src/effects/builtin/bessel8lvmixeqeffect.h index 14497784ce5e..d4954f02098b 100644 --- a/src/effects/builtin/bessel8lvmixeqeffect.h +++ b/src/effects/builtin/bessel8lvmixeqeffect.h @@ -27,12 +27,15 @@ class Bessel8LVMixEQEffectGroupState : class Bessel8LVMixEQEffect : public EffectProcessorImpl { public: - Bessel8LVMixEQEffect(EngineEffect* pEffect); + Bessel8LVMixEQEffect(); virtual ~Bessel8LVMixEQEffect(); static QString getId(); static EffectManifestPointer getManifest(); + void loadEngineEffectParameters( + const QMap& parameters); + // See effectprocessor.h void processChannel(const ChannelHandle& handle, Bessel8LVMixEQEffectGroupState* pState, diff --git a/src/effects/builtin/biquadfullkilleqeffect.cpp b/src/effects/builtin/biquadfullkilleqeffect.cpp index 6adba364a120..0628ba8b312b 100644 --- a/src/effects/builtin/biquadfullkilleqeffect.cpp +++ b/src/effects/builtin/biquadfullkilleqeffect.cpp @@ -135,17 +135,21 @@ void BiquadFullKillEQEffectGroupState::setFilters( m_lvMixIso->setFilters(sampleRate, lowFreqCorner, highFreqCorner); } -BiquadFullKillEQEffect::BiquadFullKillEQEffect(EngineEffect* pEffect) - : m_pPotLow(pEffect->getParameterById("low")), - m_pPotMid(pEffect->getParameterById("mid")), - m_pPotHigh(pEffect->getParameterById("high")), - m_pKillLow(pEffect->getParameterById("killLow")), - m_pKillMid(pEffect->getParameterById("killMid")), - m_pKillHigh(pEffect->getParameterById("killHigh")) { +BiquadFullKillEQEffect::BiquadFullKillEQEffect() { m_pLoFreqCorner = std::make_unique("[Mixer Profile]", "LoEQFrequency"); m_pHiFreqCorner = std::make_unique("[Mixer Profile]", "HiEQFrequency"); } +void BiquadFullKillEQEffect::loadEngineEffectParameters( + const QMap& parameters) { + m_pPotLow = parameters.value("low"); + m_pPotMid = parameters.value("mid"); + m_pPotHigh = parameters.value("high"); + m_pKillLow = parameters.value("killLow"); + m_pKillMid = parameters.value("killMid"); + m_pKillHigh = parameters.value("killHigh"); +} + // BiquadFullKillEQEffect::~BiquadFullKillEQEffect() { // } diff --git a/src/effects/builtin/biquadfullkilleqeffect.h b/src/effects/builtin/biquadfullkilleqeffect.h index c0433c4651de..7bff2cb2e722 100644 --- a/src/effects/builtin/biquadfullkilleqeffect.h +++ b/src/effects/builtin/biquadfullkilleqeffect.h @@ -59,11 +59,14 @@ class BiquadFullKillEQEffectGroupState : public EffectState { class BiquadFullKillEQEffect : public EffectProcessorImpl { public: - BiquadFullKillEQEffect(EngineEffect* pEffect); + BiquadFullKillEQEffect(); static QString getId(); static EffectManifestPointer getManifest(); + void loadEngineEffectParameters( + const QMap& parameters) override; + void setFilters(int sampleRate, double lowFreqCorner, double highFreqCorner); void processChannel(const ChannelHandle& handle, diff --git a/src/effects/builtin/bitcrushereffect.cpp b/src/effects/builtin/bitcrushereffect.cpp index 04dc81884fad..a1a371717540 100644 --- a/src/effects/builtin/bitcrushereffect.cpp +++ b/src/effects/builtin/bitcrushereffect.cpp @@ -57,9 +57,10 @@ EffectManifestPointer BitCrusherEffect::getManifest() { return pManifest; } -BitCrusherEffect::BitCrusherEffect(EngineEffect* pEffect) - : m_pBitDepthParameter(pEffect->getParameterById("bit_depth")), - m_pDownsampleParameter(pEffect->getParameterById("downsample")) { +void BitCrusherEffect::loadEngineEffectParameters( + const QMap& parameters) { + m_pBitDepthParameter = parameters.value("bit_depth"); + m_pDownsampleParameter = parameters.value("downsample"); } BitCrusherEffect::~BitCrusherEffect() { diff --git a/src/effects/builtin/bitcrushereffect.h b/src/effects/builtin/bitcrushereffect.h index 69b8700bf01b..4007b2520a19 100644 --- a/src/effects/builtin/bitcrushereffect.h +++ b/src/effects/builtin/bitcrushereffect.h @@ -24,12 +24,15 @@ struct BitCrusherGroupState : public EffectState { class BitCrusherEffect : public EffectProcessorImpl { public: - BitCrusherEffect(EngineEffect* pEffect); + BitCrusherEffect() {}; virtual ~BitCrusherEffect(); static QString getId(); static EffectManifestPointer getManifest(); + void loadEngineEffectParameters( + const QMap& parameters); + // See effectprocessor.h void processChannel(const ChannelHandle& handle, BitCrusherGroupState* pState, diff --git a/src/effects/builtin/echoeffect.cpp b/src/effects/builtin/echoeffect.cpp index 08cc36d4acee..c43913ac172a 100644 --- a/src/effects/builtin/echoeffect.cpp +++ b/src/effects/builtin/echoeffect.cpp @@ -125,14 +125,15 @@ EffectManifestPointer EchoEffect::getManifest() { return pManifest; } -EchoEffect::EchoEffect(EngineEffect* pEffect) - : m_pDelayParameter(pEffect->getParameterById("delay_time")), - m_pSendParameter(pEffect->getParameterById("send_amount")), - m_pFeedbackParameter(pEffect->getParameterById("feedback_amount")), - m_pPingPongParameter(pEffect->getParameterById("pingpong_amount")), - m_pQuantizeParameter(pEffect->getParameterById("quantize")), - m_pTripletParameter(pEffect->getParameterById("triplet")) { - } +void EchoEffect::loadEngineEffectParameters( + const QMap& parameters) { + m_pDelayParameter = parameters.value("delay_time"); + m_pSendParameter = parameters.value("send_amount"); + m_pFeedbackParameter = parameters.value("feedback_amount"); + m_pPingPongParameter = parameters.value("pingpong_amount"); + m_pQuantizeParameter = parameters.value("quantize"); + m_pTripletParameter = parameters.value("triplet"); +} void EchoEffect::processChannel(const ChannelHandle& handle, EchoGroupState* pGroupState, const CSAMPLE* pInput, diff --git a/src/effects/builtin/echoeffect.h b/src/effects/builtin/echoeffect.h index 25dbf2a3b893..a4569a090322 100644 --- a/src/effects/builtin/echoeffect.h +++ b/src/effects/builtin/echoeffect.h @@ -48,11 +48,14 @@ class EchoGroupState : public EffectState { class EchoEffect : public EffectProcessorImpl { public: - EchoEffect(EngineEffect* pEffect); + EchoEffect() {}; static QString getId(); static EffectManifestPointer getManifest(); + void loadEngineEffectParameters( + const QMap& parameters); + void processChannel(const ChannelHandle& handle, EchoGroupState* pState, const CSAMPLE* pInput, CSAMPLE* pOutput, diff --git a/src/effects/builtin/filtereffect.cpp b/src/effects/builtin/filtereffect.cpp index aece10b9a065..5a3c983841e1 100644 --- a/src/effects/builtin/filtereffect.cpp +++ b/src/effects/builtin/filtereffect.cpp @@ -85,10 +85,11 @@ FilterGroupState::~FilterGroupState() { delete m_pHighFilter; } -FilterEffect::FilterEffect(EngineEffect* pEffect) - : m_pLPF(pEffect->getParameterById("lpf")), - m_pQ(pEffect->getParameterById("q")), - m_pHPF(pEffect->getParameterById("hpf")) { +void FilterEffect::loadEngineEffectParameters( + const QMap& parameters) { + m_pLPF = parameters.value("lpf"); + m_pQ = parameters.value("q"); + m_pHPF = parameters.value("hpf"); } FilterEffect::~FilterEffect() { diff --git a/src/effects/builtin/filtereffect.h b/src/effects/builtin/filtereffect.h index 2e2279929288..c4ebf1490a90 100644 --- a/src/effects/builtin/filtereffect.h +++ b/src/effects/builtin/filtereffect.h @@ -29,12 +29,15 @@ struct FilterGroupState : public EffectState { class FilterEffect : public EffectProcessorImpl { public: - FilterEffect(EngineEffect* pEffect); + FilterEffect() {}; virtual ~FilterEffect(); static QString getId(); static EffectManifestPointer getManifest(); + void loadEngineEffectParameters( + const QMap& parameters); + void processChannel(const ChannelHandle& handle, FilterGroupState* pState, const CSAMPLE* pInput, CSAMPLE *pOutput, diff --git a/src/effects/builtin/flangereffect.cpp b/src/effects/builtin/flangereffect.cpp index a4e39d709dd3..3d1bf4052a13 100644 --- a/src/effects/builtin/flangereffect.cpp +++ b/src/effects/builtin/flangereffect.cpp @@ -116,13 +116,14 @@ EffectManifestPointer FlangerEffect::getManifest() { return pManifest; } -FlangerEffect::FlangerEffect(EngineEffect* pEffect) - : m_pSpeedParameter(pEffect->getParameterById("speed")), - m_pWidthParameter(pEffect->getParameterById("width")), - m_pManualParameter(pEffect->getParameterById("manual")), - m_pRegenParameter(pEffect->getParameterById("regen")), - m_pMixParameter(pEffect->getParameterById("mix")), - m_pTripletParameter(pEffect->getParameterById("triplet")) { +void FlangerEffect::loadEngineEffectParameters( + const QMap& parameters) { + m_pSpeedParameter = parameters.value("speed"); + m_pWidthParameter = parameters.value("width"); + m_pManualParameter = parameters.value("manual"); + m_pRegenParameter = parameters.value("regen"); + m_pMixParameter = parameters.value("mix"); + m_pTripletParameter = parameters.value("triplet"); } FlangerEffect::~FlangerEffect() { diff --git a/src/effects/builtin/flangereffect.h b/src/effects/builtin/flangereffect.h index 4499eddce2b0..d05c0f4db61e 100644 --- a/src/effects/builtin/flangereffect.h +++ b/src/effects/builtin/flangereffect.h @@ -49,12 +49,15 @@ struct FlangerGroupState : public EffectState { class FlangerEffect : public EffectProcessorImpl { public: - FlangerEffect(EngineEffect* pEffect); + FlangerEffect() {}; virtual ~FlangerEffect(); static QString getId(); static EffectManifestPointer getManifest(); + void loadEngineEffectParameters( + const QMap& parameters); + // See effectprocessor.h void processChannel(const ChannelHandle& handle, FlangerGroupState* pState, diff --git a/src/effects/builtin/graphiceqeffect.cpp b/src/effects/builtin/graphiceqeffect.cpp index d73ea07c71f4..cfda32d6c18a 100644 --- a/src/effects/builtin/graphiceqeffect.cpp +++ b/src/effects/builtin/graphiceqeffect.cpp @@ -133,13 +133,13 @@ void GraphicEQEffectGroupState::setFilters(int sampleRate) { } } -GraphicEQEffect::GraphicEQEffect(EngineEffect* pEffect) - : m_oldSampleRate(44100) { - m_pPotLow = pEffect->getParameterById("low"); +void GraphicEQEffect::loadEngineEffectParameters( + const QMap& parameters) { + m_pPotLow = parameters.value("low"); for (int i = 0; i < 6; i++) { - m_pPotMid.append(pEffect->getParameterById(QString("mid%1").arg(i))); + m_pPotMid.append(parameters.value(QString("mid%1").arg(i))); } - m_pPotHigh = pEffect->getParameterById("high"); + m_pPotHigh = parameters.value("high"); } GraphicEQEffect::~GraphicEQEffect() { diff --git a/src/effects/builtin/graphiceqeffect.h b/src/effects/builtin/graphiceqeffect.h index 635a8f772926..c5dd8fad44df 100644 --- a/src/effects/builtin/graphiceqeffect.h +++ b/src/effects/builtin/graphiceqeffect.h @@ -32,12 +32,15 @@ class GraphicEQEffectGroupState : public EffectState { class GraphicEQEffect : public EffectProcessorImpl { public: - GraphicEQEffect(EngineEffect* pEffect); + GraphicEQEffect() {}; virtual ~GraphicEQEffect(); static QString getId(); static EffectManifestPointer getManifest(); + void loadEngineEffectParameters( + const QMap& parameters); + void processChannel(const ChannelHandle& handle, GraphicEQEffectGroupState* pState, const CSAMPLE* pInput, CSAMPLE *pOutput, diff --git a/src/effects/builtin/linkwitzriley8eqeffect.cpp b/src/effects/builtin/linkwitzriley8eqeffect.cpp index 297f31472578..57c13fd3b983 100644 --- a/src/effects/builtin/linkwitzriley8eqeffect.cpp +++ b/src/effects/builtin/linkwitzriley8eqeffect.cpp @@ -66,17 +66,22 @@ void LinkwitzRiley8EQEffectGroupState::setFilters(int sampleRate, int lowFreq, m_high2->setFrequencyCorners(sampleRate, highFreq); } -LinkwitzRiley8EQEffect::LinkwitzRiley8EQEffect(EngineEffect* pEffect) - : m_pPotLow(pEffect->getParameterById("low")), - m_pPotMid(pEffect->getParameterById("mid")), - m_pPotHigh(pEffect->getParameterById("high")), - m_pKillLow(pEffect->getParameterById("killLow")), - m_pKillMid(pEffect->getParameterById("killMid")), - m_pKillHigh(pEffect->getParameterById("killHigh")) { +LinkwitzRiley8EQEffect::LinkwitzRiley8EQEffect() { m_pLoFreqCorner = new ControlProxy("[Mixer Profile]", "LoEQFrequency"); m_pHiFreqCorner = new ControlProxy("[Mixer Profile]", "HiEQFrequency"); } + +void LinkwitzRiley8EQEffect::loadEngineEffectParameters( + const QMap& parameters) { + m_pPotLow = parameters.value("low"); + m_pPotMid = parameters.value("mid"); + m_pPotHigh = parameters.value("high"); + m_pKillLow = parameters.value("killLow"); + m_pKillMid = parameters.value("killMid"); + m_pKillHigh = parameters.value("killHigh"); +} + LinkwitzRiley8EQEffect::~LinkwitzRiley8EQEffect() { delete m_pLoFreqCorner; delete m_pHiFreqCorner; diff --git a/src/effects/builtin/linkwitzriley8eqeffect.h b/src/effects/builtin/linkwitzriley8eqeffect.h index cd1d221535e9..6f9cf57d119c 100644 --- a/src/effects/builtin/linkwitzriley8eqeffect.h +++ b/src/effects/builtin/linkwitzriley8eqeffect.h @@ -40,12 +40,15 @@ class LinkwitzRiley8EQEffectGroupState : public EffectState { class LinkwitzRiley8EQEffect : public EffectProcessorImpl { public: - LinkwitzRiley8EQEffect(EngineEffect* pEffect); + LinkwitzRiley8EQEffect(); virtual ~LinkwitzRiley8EQEffect(); static QString getId(); static EffectManifestPointer getManifest(); + void loadEngineEffectParameters( + const QMap& parameters); + // See effectprocessor.h void processChannel(const ChannelHandle& handle, LinkwitzRiley8EQEffectGroupState* pState, diff --git a/src/effects/builtin/loudnesscontoureffect.cpp b/src/effects/builtin/loudnesscontoureffect.cpp index fd1781f73bab..2241a0c67b51 100644 --- a/src/effects/builtin/loudnesscontoureffect.cpp +++ b/src/effects/builtin/loudnesscontoureffect.cpp @@ -94,10 +94,10 @@ void LoudnessContourEffectGroupState::setFilters(int sampleRate, double gain) { } -LoudnessContourEffect::LoudnessContourEffect( - EngineEffect* pEffect) - : m_pLoudness(pEffect->getParameterById("loudness")), - m_pUseGain(pEffect->getParameterById("useGain")) { +void LoudnessContourEffect::loadEngineEffectParameters( + const QMap& parameters) { + m_pLoudness = parameters.value("loudness"); + m_pUseGain = parameters.value("useGain"); } LoudnessContourEffect::~LoudnessContourEffect() { diff --git a/src/effects/builtin/loudnesscontoureffect.h b/src/effects/builtin/loudnesscontoureffect.h index fdd3290cbf77..1df8471a37aa 100644 --- a/src/effects/builtin/loudnesscontoureffect.h +++ b/src/effects/builtin/loudnesscontoureffect.h @@ -33,12 +33,15 @@ class LoudnessContourEffectGroupState final : public EffectState { class LoudnessContourEffect : public EffectProcessorImpl { public: - LoudnessContourEffect(EngineEffect* pEffect); + LoudnessContourEffect() {}; ~LoudnessContourEffect() override; static QString getId(); static EffectManifestPointer getManifest(); + void loadEngineEffectParameters( + const QMap& parameters); + void setFilters(int sampleRate); void processChannel(const ChannelHandle& handle, diff --git a/src/effects/builtin/metronomeeffect.cpp b/src/effects/builtin/metronomeeffect.cpp index 9bcc956b8c9d..f2f45db83327 100644 --- a/src/effects/builtin/metronomeeffect.cpp +++ b/src/effects/builtin/metronomeeffect.cpp @@ -52,9 +52,10 @@ EffectManifestPointer MetronomeEffect::getManifest() { return pManifest; } -MetronomeEffect::MetronomeEffect(EngineEffect* pEffect) - : m_pBpmParameter(pEffect->getParameterById("bpm")), - m_pSyncParameter(pEffect->getParameterById("sync")) { +void MetronomeEffect::loadEngineEffectParameters( + const QMap& parameters) { + m_pBpmParameter = parameters.value("bpm"); + m_pSyncParameter = parameters.value("sync"); } MetronomeEffect::~MetronomeEffect() { diff --git a/src/effects/builtin/metronomeeffect.h b/src/effects/builtin/metronomeeffect.h index 8f6c7ceefaab..050edcc72bd1 100644 --- a/src/effects/builtin/metronomeeffect.h +++ b/src/effects/builtin/metronomeeffect.h @@ -27,12 +27,15 @@ class MetronomeGroupState final : public EffectState { class MetronomeEffect : public EffectProcessorImpl { public: - MetronomeEffect(EngineEffect* pEffect); + MetronomeEffect() {}; virtual ~MetronomeEffect(); static QString getId(); static EffectManifestPointer getManifest(); + void loadEngineEffectParameters( + const QMap& parameters); + // See effectprocessor.h void processChannel(const ChannelHandle& handle, MetronomeGroupState* pState, diff --git a/src/effects/builtin/moogladder4filtereffect.cpp b/src/effects/builtin/moogladder4filtereffect.cpp index f73bfe6e780e..fe6f515f9542 100644 --- a/src/effects/builtin/moogladder4filtereffect.cpp +++ b/src/effects/builtin/moogladder4filtereffect.cpp @@ -86,10 +86,11 @@ MoogLadder4FilterGroupState::~MoogLadder4FilterGroupState() { delete m_pHighFilter; } -MoogLadder4FilterEffect::MoogLadder4FilterEffect(EngineEffect* pEffect) - : m_pLPF(pEffect->getParameterById("lpf")), - m_pResonance(pEffect->getParameterById("resonance")), - m_pHPF(pEffect->getParameterById("hpf")) { +void MoogLadder4FilterEffect::loadEngineEffectParameters( + const QMap& parameters) { + m_pLPF = parameters.value("lpf"); + m_pResonance = parameters.value("resonance"); + m_pHPF = parameters.value("hpf"); } MoogLadder4FilterEffect::~MoogLadder4FilterEffect() { diff --git a/src/effects/builtin/moogladder4filtereffect.h b/src/effects/builtin/moogladder4filtereffect.h index d39c2d6b4e17..f27eab4709ca 100644 --- a/src/effects/builtin/moogladder4filtereffect.h +++ b/src/effects/builtin/moogladder4filtereffect.h @@ -28,12 +28,15 @@ class MoogLadder4FilterGroupState : public EffectState { class MoogLadder4FilterEffect : public EffectProcessorImpl { public: - MoogLadder4FilterEffect(EngineEffect* pEffect); + MoogLadder4FilterEffect() {}; virtual ~MoogLadder4FilterEffect(); static QString getId(); static EffectManifestPointer getManifest(); + void loadEngineEffectParameters( + const QMap& parameters); + // See effectprocessor.h void processChannel(const ChannelHandle& handle, MoogLadder4FilterGroupState* pState, diff --git a/src/effects/builtin/parametriceqeffect.cpp b/src/effects/builtin/parametriceqeffect.cpp index c58c6de042d9..d8df6f5713a9 100644 --- a/src/effects/builtin/parametriceqeffect.cpp +++ b/src/effects/builtin/parametriceqeffect.cpp @@ -119,7 +119,8 @@ EffectManifestPointer ParametricEQEffect::getManifest() { ParametricEQEffectGroupState::ParametricEQEffectGroupState( const mixxx::EngineParameters& bufferParameters) - : EffectState(bufferParameters) { + : EffectState(bufferParameters), + m_oldSampleRate(44100) { for (int i = 0; i < kBandCount; i++) { m_oldGain.append(1.0); m_oldQ.append(1.75); @@ -142,14 +143,14 @@ void ParametricEQEffectGroupState::setFilters(int sampleRate) { } } -ParametricEQEffect::ParametricEQEffect(EngineEffect* pEffect) - : m_oldSampleRate(44100) { - m_pPotGain.append(pEffect->getParameterById("gain1")); - m_pPotQ.append(pEffect->getParameterById("q1")); - m_pPotCenter.append(pEffect->getParameterById("center1")); - m_pPotGain.append(pEffect->getParameterById("gain2")); - m_pPotQ.append(pEffect->getParameterById("q2")); - m_pPotCenter.append(pEffect->getParameterById("center2")); +void ParametricEQEffect::loadEngineEffectParameters( + const QMap& parameters) { + m_pPotGain.append(parameters.value("gain1")); + m_pPotQ.append(parameters.value("q1")); + m_pPotCenter.append(parameters.value("center1")); + m_pPotGain.append(parameters.value("gain2")); + m_pPotQ.append(parameters.value("q2")); + m_pPotCenter.append(parameters.value("center2")); } ParametricEQEffect::~ParametricEQEffect() { @@ -166,8 +167,8 @@ void ParametricEQEffect::processChannel(const ChannelHandle& handle, // If the sample rate has changed, initialize the filters using the new // sample rate - if (m_oldSampleRate != bufferParameters.sampleRate()) { - m_oldSampleRate = bufferParameters.sampleRate(); + if (pState->m_oldSampleRate != bufferParameters.sampleRate()) { + pState->m_oldSampleRate = bufferParameters.sampleRate(); pState->setFilters(bufferParameters.sampleRate()); } diff --git a/src/effects/builtin/parametriceqeffect.h b/src/effects/builtin/parametriceqeffect.h index c699582d291a..9ff469aae94d 100644 --- a/src/effects/builtin/parametriceqeffect.h +++ b/src/effects/builtin/parametriceqeffect.h @@ -32,17 +32,22 @@ class ParametricEQEffectGroupState final : public EffectState { QList m_oldCenter; QList m_oldQ; + unsigned int m_oldSampleRate; + QList m_pBufs; }; class ParametricEQEffect : public EffectProcessorImpl { public: - ParametricEQEffect(EngineEffect* pEffect); + ParametricEQEffect() {}; virtual ~ParametricEQEffect(); static QString getId(); static EffectManifestPointer getManifest(); + void loadEngineEffectParameters( + const QMap& parameters); + // See effectprocessor.h void processChannel(const ChannelHandle& handle, ParametricEQEffectGroupState* pState, @@ -60,9 +65,6 @@ class ParametricEQEffect : public EffectProcessorImpl m_pPotQ; QList m_pPotCenter; - - unsigned int m_oldSampleRate; - DISALLOW_COPY_AND_ASSIGN(ParametricEQEffect); }; diff --git a/src/effects/builtin/phasereffect.cpp b/src/effects/builtin/phasereffect.cpp index 1556d3b8aaf1..956ef8dbf428 100644 --- a/src/effects/builtin/phasereffect.cpp +++ b/src/effects/builtin/phasereffect.cpp @@ -121,14 +121,15 @@ EffectManifestPointer PhaserEffect::getManifest() { return pManifest; } -PhaserEffect::PhaserEffect(EngineEffect* pEffect) - : m_pStagesParameter(pEffect->getParameterById("stages")), - m_pLFOPeriodParameter(pEffect->getParameterById("lfo_period")), - m_pDepthParameter(pEffect->getParameterById("depth")), - m_pFeedbackParameter(pEffect->getParameterById("feedback")), - m_pRangeParameter(pEffect->getParameterById("range")), - m_pTripletParameter(pEffect->getParameterById("triplet")), - m_pStereoParameter(pEffect->getParameterById("stereo")) { +void PhaserEffect::loadEngineEffectParameters( + const QMap& parameters) { + m_pStagesParameter = parameters.value("stages"); + m_pLFOPeriodParameter = parameters.value("lfo_period"); + m_pDepthParameter = parameters.value("depth"); + m_pFeedbackParameter = parameters.value("feedback"); + m_pRangeParameter = parameters.value("range"); + m_pTripletParameter = parameters.value("triplet"); + m_pStereoParameter = parameters.value("stereo"); } PhaserEffect::~PhaserEffect() { diff --git a/src/effects/builtin/phasereffect.h b/src/effects/builtin/phasereffect.h index ff5263636352..103834343832 100644 --- a/src/effects/builtin/phasereffect.h +++ b/src/effects/builtin/phasereffect.h @@ -41,12 +41,15 @@ class PhaserGroupState final : public EffectState { class PhaserEffect : public EffectProcessorImpl { public: - PhaserEffect(EngineEffect* pEffect); + PhaserEffect() {}; virtual ~PhaserEffect(); static QString getId(); static EffectManifestPointer getManifest(); + void loadEngineEffectParameters( + const QMap& parameters); + // See effectprocessor.h void processChannel(const ChannelHandle& handle, PhaserGroupState* pState, diff --git a/src/effects/builtin/reverbeffect.cpp b/src/effects/builtin/reverbeffect.cpp index 7fdf3ade0fd9..61982a65b42f 100644 --- a/src/effects/builtin/reverbeffect.cpp +++ b/src/effects/builtin/reverbeffect.cpp @@ -80,11 +80,12 @@ EffectManifestPointer ReverbEffect::getManifest() { return pManifest; } -ReverbEffect::ReverbEffect(EngineEffect* pEffect) - : m_pDecayParameter(pEffect->getParameterById("decay")), - m_pBandWidthParameter(pEffect->getParameterById("bandwidth")), - m_pDampingParameter(pEffect->getParameterById("damping")), - m_pSendParameter(pEffect->getParameterById("send_amount")) { +void ReverbEffect::loadEngineEffectParameters( + const QMap& parameters) { + m_pDecayParameter = parameters.value("decay"); + m_pBandWidthParameter = parameters.value("bandwidth"); + m_pDampingParameter = parameters.value("damping"); + m_pSendParameter = parameters.value("send_amount"); } ReverbEffect::~ReverbEffect() { diff --git a/src/effects/builtin/reverbeffect.h b/src/effects/builtin/reverbeffect.h index 8b449318b27f..0a51860fc82b 100644 --- a/src/effects/builtin/reverbeffect.h +++ b/src/effects/builtin/reverbeffect.h @@ -35,12 +35,15 @@ class ReverbGroupState : public EffectState { class ReverbEffect : public EffectProcessorImpl { public: - ReverbEffect(EngineEffect* pEffect); + ReverbEffect() {}; virtual ~ReverbEffect(); static QString getId(); static EffectManifestPointer getManifest(); + void loadEngineEffectParameters( + const QMap& parameters); + // See effectprocessor.h void processChannel(const ChannelHandle& handle, ReverbGroupState* pState, diff --git a/src/effects/builtin/threebandbiquadeqeffect.cpp b/src/effects/builtin/threebandbiquadeqeffect.cpp index c7c112c8bbf6..5bfd2c67b816 100644 --- a/src/effects/builtin/threebandbiquadeqeffect.cpp +++ b/src/effects/builtin/threebandbiquadeqeffect.cpp @@ -124,17 +124,21 @@ void ThreeBandBiquadEQEffectGroupState::setFilters( } -ThreeBandBiquadEQEffect::ThreeBandBiquadEQEffect(EngineEffect* pEffect) - : m_pPotLow(pEffect->getParameterById("low")), - m_pPotMid(pEffect->getParameterById("mid")), - m_pPotHigh(pEffect->getParameterById("high")), - m_pKillLow(pEffect->getParameterById("killLow")), - m_pKillMid(pEffect->getParameterById("killMid")), - m_pKillHigh(pEffect->getParameterById("killHigh")) { +ThreeBandBiquadEQEffect::ThreeBandBiquadEQEffect() { m_pLoFreqCorner = std::make_unique("[Mixer Profile]", "LoEQFrequency"); m_pHiFreqCorner = std::make_unique("[Mixer Profile]", "HiEQFrequency"); } +void ThreeBandBiquadEQEffect::loadEngineEffectParameters( + const QMap& parameters) { + m_pPotLow = parameters.value("low"); + m_pPotMid = parameters.value("mid"); + m_pPotHigh = parameters.value("high"); + m_pKillLow = parameters.value("killLow"); + m_pKillMid = parameters.value("killMid"); + m_pKillHigh = parameters.value("killHigh"); +} + ThreeBandBiquadEQEffect::~ThreeBandBiquadEQEffect() { } diff --git a/src/effects/builtin/threebandbiquadeqeffect.h b/src/effects/builtin/threebandbiquadeqeffect.h index f01f14eda46b..b9ef27091442 100644 --- a/src/effects/builtin/threebandbiquadeqeffect.h +++ b/src/effects/builtin/threebandbiquadeqeffect.h @@ -43,12 +43,15 @@ class ThreeBandBiquadEQEffectGroupState final : public EffectState { class ThreeBandBiquadEQEffect : public EffectProcessorImpl { public: - ThreeBandBiquadEQEffect(EngineEffect* pEffect); + ThreeBandBiquadEQEffect(); ~ThreeBandBiquadEQEffect() override; static QString getId(); static EffectManifestPointer getManifest(); + void loadEngineEffectParameters( + const QMap& parameters); + void setFilters(int sampleRate, double lowFreqCorner, double highFreqCorner); // See effectprocessor.h diff --git a/src/effects/builtin/tremoloeffect.cpp b/src/effects/builtin/tremoloeffect.cpp index 17200a7d1cc1..afb4cfff1155 100644 --- a/src/effects/builtin/tremoloeffect.cpp +++ b/src/effects/builtin/tremoloeffect.cpp @@ -129,14 +129,15 @@ EffectManifestPointer TremoloEffect::getManifest() { return pManifest; } -TremoloEffect::TremoloEffect(EngineEffect* pEffect) - : m_pDepthParameter(pEffect->getParameterById("depth")), - m_pRateParameter(pEffect->getParameterById("rate")), - m_pWidthParameter(pEffect->getParameterById("width")), - m_pWaveformParameter(pEffect->getParameterById("waveform")), - m_pPhaseParameter(pEffect->getParameterById("phase")), - m_pQuantizeParameter(pEffect->getParameterById("quantize")), - m_pTripletParameter(pEffect->getParameterById("triplet")) { +void TremoloEffect::loadEngineEffectParameters( + const QMap& parameters) { + m_pDepthParameter = parameters.value("depth"); + m_pRateParameter = parameters.value("rate"); + m_pWidthParameter = parameters.value("width"); + m_pWaveformParameter = parameters.value("waveform"); + m_pPhaseParameter = parameters.value("phase"); + m_pQuantizeParameter = parameters.value("quantize"); + m_pTripletParameter = parameters.value("triplet"); } void TremoloEffect::processChannel(const ChannelHandle& handle, diff --git a/src/effects/builtin/tremoloeffect.h b/src/effects/builtin/tremoloeffect.h index d864c7f57b75..5c6cb4f11fa6 100644 --- a/src/effects/builtin/tremoloeffect.h +++ b/src/effects/builtin/tremoloeffect.h @@ -22,11 +22,14 @@ class TremoloState : public EffectState { class TremoloEffect : public EffectProcessorImpl { public: - TremoloEffect(EngineEffect* pEffect); + TremoloEffect() {}; static QString getId(); static EffectManifestPointer getManifest(); + void loadEngineEffectParameters( + const QMap& parameters); + // See effectprocessor.h void processChannel(const ChannelHandle& handle, TremoloState* pState, diff --git a/src/effects/effectinstantiator.h b/src/effects/effectinstantiator.h index 483dd4cc2f7a..b3f346dcd9c5 100644 --- a/src/effects/effectinstantiator.h +++ b/src/effects/effectinstantiator.h @@ -22,8 +22,9 @@ class EffectProcessorInstantiator : public EffectInstantiator { public: EffectProcessor* instantiate(EngineEffect* pEngineEffect, EffectManifestPointer pManifest) { + Q_UNUSED(pEngineEffect); Q_UNUSED(pManifest); - return new T(pEngineEffect); + return new T(); } }; diff --git a/src/effects/effectprocessor.h b/src/effects/effectprocessor.h index 80a731dcb76c..88613b9b6a77 100644 --- a/src/effects/effectprocessor.h +++ b/src/effects/effectprocessor.h @@ -13,8 +13,6 @@ #include "engine/effects/message.h" #include "engine/channelhandle.h" -class EngineEffect; - // Effects are implemented as two separate classes, an EffectState subclass and // an EffectProcessorImpl subclass. Separating state from the DSP code allows // memory allocation and deletion, which is slow, to be done on the main thread @@ -64,6 +62,9 @@ class EffectProcessor { // callback executes process() with EffectEnableState::Disabling virtual void deleteStatesForInputChannel(const ChannelHandle* inputChannel) = 0; + virtual void loadEngineEffectParameters( + const QMap& parameters) = 0; + // Take a buffer of audio samples as pInput, process the buffer according to // Effect-specific logic, and output it to the buffer pOutput. Both pInput // and pOutput are represented as stereo interleaved samples for now, but diff --git a/src/effects/lv2/lv2effectprocessor.cpp b/src/effects/lv2/lv2effectprocessor.cpp index bb6abd37a51c..523c528297b8 100644 --- a/src/effects/lv2/lv2effectprocessor.cpp +++ b/src/effects/lv2/lv2effectprocessor.cpp @@ -9,21 +9,29 @@ LV2EffectProcessor::LV2EffectProcessor(EngineEffect* pEngineEffect, const LilvPlugin* plugin, QList audioPortIndices, QList controlPortIndices) - : m_pPlugin(plugin), + : m_pManifest(pManifest), + m_pPlugin(plugin), m_audioPortIndices(audioPortIndices), m_controlPortIndices(controlPortIndices) { m_inputL = new float[MAX_BUFFER_LEN]; m_inputR = new float[MAX_BUFFER_LEN]; m_outputL = new float[MAX_BUFFER_LEN]; m_outputR = new float[MAX_BUFFER_LEN]; - m_params = new float[pManifest->parameters().size()]; - - const QList& effectManifestParameterList = - pManifest->parameters(); +} - // Initialize EngineEffectParameters - for (const auto& pParam: effectManifestParameterList) { - m_parameters.append(pEngineEffect->getParameterById(pParam->id())); +void LV2EffectProcessor::loadEngineEffectParameters( + const QMap& parameters) { + m_LV2parameters = new float[parameters.size()]; + + // EngineEffect passes the EngineEffectParameters indexed by ID string, which + // is used directly by built-in EffectProcessorImpl subclasseses to access + // specific named parameters. However, LV2EffectProcessor::process iterates + // over the EngineEffectParameters to copy their values to the LV2 control + // ports. To avoid slow string comparisons in the audio engine thread in + // LV2EffectProcessor::process, rearrange the QMap of EngineEffectParameters by + // ID string to an ordered QList. + for (const auto& pManifestParameter : m_pManifest->parameters()) { + m_engineEffectParameters.append(parameters.value(pManifestParameter->id())); } } @@ -54,7 +62,7 @@ LV2EffectProcessor::~LV2EffectProcessor() { delete[] m_inputR; delete[] m_outputL; delete[] m_outputR; - delete[] m_params; + delete[] m_LV2parameters; } void LV2EffectProcessor::initialize( @@ -111,8 +119,8 @@ void LV2EffectProcessor::process(const ChannelHandle& inputHandle, return; } - for (int i = 0; i < m_parameters.size(); i++) { - m_params[i] = m_parameters[i]->value(); + for (int i = 0; i < m_engineEffectParameters.size(); i++) { + m_LV2parameters[i] = m_engineEffectParameters[i]->value(); } int j = 0; @@ -136,9 +144,9 @@ LV2EffectGroupState* LV2EffectProcessor::createGroupState(const mixxx::EnginePar LV2EffectGroupState * pState = new LV2EffectGroupState(bufferParameters, m_pPlugin); LilvInstance* handle = pState->lilvIinstance(); if (handle) { - for (int i = 0; i < m_parameters.size(); i++) { - m_params[i] = m_parameters[i]->value(); - lilv_instance_connect_port(handle, m_controlPortIndices[i], &m_params[i]); + for (int i = 0; i < m_engineEffectParameters.size(); i++) { + m_LV2parameters[i] = m_engineEffectParameters[i]->value(); + lilv_instance_connect_port(handle, m_controlPortIndices[i], &m_LV2parameters[i]); } // We assume the audio ports are in the following order: diff --git a/src/effects/lv2/lv2effectprocessor.h b/src/effects/lv2/lv2effectprocessor.h index b5be05a199ae..b54b7e346431 100644 --- a/src/effects/lv2/lv2effectprocessor.h +++ b/src/effects/lv2/lv2effectprocessor.h @@ -46,6 +46,9 @@ class LV2EffectProcessor : public EffectProcessor { // callback executes process() with EffectEnableState::Disabling void deleteStatesForInputChannel(const ChannelHandle* inputChannel) override; + void loadEngineEffectParameters( + const QMap& parameters); + void process(const ChannelHandle& inputHandle, const ChannelHandle& outputHandle, const CSAMPLE* pInput, CSAMPLE* pOutput, @@ -55,12 +58,13 @@ class LV2EffectProcessor : public EffectProcessor { private: LV2EffectGroupState* createGroupState(const mixxx::EngineParameters& bufferParameters); - QList m_parameters; + EffectManifestPointer m_pManifest; + QList m_engineEffectParameters; float* m_inputL; float* m_inputR; float* m_outputL; float* m_outputR; - float* m_params; + float* m_LV2parameters; const LilvPlugin* m_pPlugin; const QList m_audioPortIndices; const QList m_controlPortIndices; diff --git a/src/engine/effects/engineeffect.cpp b/src/engine/effects/engineeffect.cpp index 39135235123e..ddfb95f19c66 100644 --- a/src/engine/effects/engineeffect.cpp +++ b/src/engine/effects/engineeffect.cpp @@ -31,6 +31,7 @@ EngineEffect::EngineEffect(EffectManifestPointer pManifest, // Creating the processor must come last. m_pProcessor = pInstantiator->instantiate(this, pManifest); + m_pProcessor->loadEngineEffectParameters(m_parametersById); //TODO: get actual configuration of engine const mixxx::EngineParameters bufferParameters( mixxx::AudioSignal::SampleRate(96000), diff --git a/src/engine/effects/engineeffect.h b/src/engine/effects/engineeffect.h index 4ed1fc07867d..7a324421ff70 100644 --- a/src/engine/effects/engineeffect.h +++ b/src/engine/effects/engineeffect.h @@ -29,10 +29,6 @@ class EngineEffect : public EffectsRequestHandler { return m_pManifest->name(); } - EngineEffectParameterPointer getParameterById(const QString& id) { - return m_parametersById.value(id); - } - EffectState* createState(const mixxx::EngineParameters& bufferParameters); void loadStatesForInputChannel(const ChannelHandle* inputChannel, From e13af950ab43b0651b4087a1b9f34ac19cf332dc Mon Sep 17 00:00:00 2001 From: Be Date: Tue, 17 Jul 2018 01:28:06 -0500 Subject: [PATCH 009/443] store EffectsBackends in a QHash indexed by EffectBackendType ... in EffectsManager. This will allow for instantiating effects properly with just an EffectManifest, by first fetching the appropriate EffectBackend based on the EffectBackendType stored on the EffectManifest. Currently EffectsManager just iterates through the manifests and asks the backend if it can instantiate an effect ID. This is wrong because the behavior is undefined in the event that two EffectManifests with different backends happen to share the same effect ID. --- src/effects/builtin/builtinbackend.cpp | 4 ++-- src/effects/builtin/builtinbackend.h | 3 +-- src/effects/defs.h | 7 +++++++ src/effects/effectsbackend.cpp | 9 +++------ src/effects/effectsbackend.h | 8 ++------ src/effects/effectsmanager.cpp | 28 ++++++-------------------- src/effects/effectsmanager.h | 10 ++------- src/effects/lv2/lv2backend.cpp | 4 ++-- src/effects/lv2/lv2backend.h | 3 +-- src/mixxx.cpp | 8 ++++---- 10 files changed, 30 insertions(+), 54 deletions(-) diff --git a/src/effects/builtin/builtinbackend.cpp b/src/effects/builtin/builtinbackend.cpp index 9c870a0aba1f..4571b30848e0 100644 --- a/src/effects/builtin/builtinbackend.cpp +++ b/src/effects/builtin/builtinbackend.cpp @@ -24,8 +24,8 @@ #include "effects/builtin/metronomeeffect.h" #include "effects/builtin/tremoloeffect.h" -BuiltInBackend::BuiltInBackend(QObject* pParent) - : EffectsBackend(pParent, EffectBackendType::BuiltIn) { +BuiltInBackend::BuiltInBackend() + : EffectsBackend(EffectBackendType::BuiltIn) { // Keep this list in a reasonable order // Mixing EQs registerEffect(); diff --git a/src/effects/builtin/builtinbackend.h b/src/effects/builtin/builtinbackend.h index b797f293040e..5f1dfa7d1b5f 100644 --- a/src/effects/builtin/builtinbackend.h +++ b/src/effects/builtin/builtinbackend.h @@ -5,9 +5,8 @@ #include "effects/effectsbackend.h" class BuiltInBackend : public EffectsBackend { - Q_OBJECT public: - BuiltInBackend(QObject* pParent); + BuiltInBackend(); virtual ~BuiltInBackend(); private: diff --git a/src/effects/defs.h b/src/effects/defs.h index b01eee758b76..ca00b2dcf021 100644 --- a/src/effects/defs.h +++ b/src/effects/defs.h @@ -18,6 +18,10 @@ enum class EffectBackendType { Unknown }; +inline uint qHash(const EffectBackendType& backendType) { + return static_cast(backendType); +} + enum class SignalProcessingStage { Prefader, Postfader @@ -40,6 +44,9 @@ constexpr int kNumEffectsPerUnit = 4; // enable this when debugging the effects system. constexpr bool kEffectDebugOutput = false; +class EffectsBackend; +typedef QSharedPointer EffectsBackendPointer; + class EffectState; // For sending EffectStates along the MessagePipe typedef ChannelHandleMap EffectStatesMap; diff --git a/src/effects/effectsbackend.cpp b/src/effects/effectsbackend.cpp index df00ea2e07dd..4c77c06a972a 100644 --- a/src/effects/effectsbackend.cpp +++ b/src/effects/effectsbackend.cpp @@ -3,10 +3,8 @@ #include "effects/effectsbackend.h" #include "effects/effectsmanager.h" -EffectsBackend::EffectsBackend(QObject* pParent, - EffectBackendType type) - : QObject(pParent), - m_type(type) { +EffectsBackend::EffectsBackend(EffectBackendType type) + : m_type(type) { } EffectsBackend::~EffectsBackend() { @@ -26,7 +24,6 @@ void EffectsBackend::registerEffect(const QString& id, m_registeredEffects[id] = RegisteredEffect(pManifest, pInstantiator); m_effectIds.append(id); - emit(effectRegistered(pManifest)); } const QList EffectsBackend::getEffectIds() const { @@ -51,4 +48,4 @@ EffectInstantiatorPointer EffectsBackend::getInstantiator(const QString& effectI bool EffectsBackend::canInstantiateEffect(const QString& effectId) const { return m_registeredEffects.contains(effectId); -} \ No newline at end of file +} diff --git a/src/effects/effectsbackend.h b/src/effects/effectsbackend.h index 73fac35cc14b..4126127b384b 100644 --- a/src/effects/effectsbackend.h +++ b/src/effects/effectsbackend.h @@ -18,10 +18,9 @@ class EffectProcessor; // An EffectsBackend is an implementation of a provider of Effect's for use // within the rest of Mixxx. The job of the EffectsBackend is to both enumerate // and instantiate effects. -class EffectsBackend : public QObject { - Q_OBJECT +class EffectsBackend { public: - EffectsBackend(QObject* pParent, EffectBackendType type); + EffectsBackend(EffectBackendType type); virtual ~EffectsBackend(); EffectBackendType getType() const { @@ -34,9 +33,6 @@ class EffectsBackend : public QObject { virtual EffectInstantiatorPointer getInstantiator(const QString& effectId) const; virtual bool canInstantiateEffect(const QString& effectId) const; - signals: - void effectRegistered(EffectManifestPointer); - protected: void registerEffect(const QString& id, EffectManifestPointer pManifest, diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index a95454be08d1..fa9209197ea2 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -53,10 +53,8 @@ EffectsManager::~EffectsManager() { // This must be done here, since the engineRacks are deleted via // the queue processEffectsResponses(); - while (!m_effectsBackends.isEmpty()) { - EffectsBackend* pBackend = m_effectsBackends.takeLast(); - delete pBackend; - } + + m_effectsBackends.clear(); for (QHash::iterator it = m_activeRequests.begin(); it != m_activeRequests.end();) { delete it.value(); @@ -80,11 +78,11 @@ bool alphabetizeEffectManifests(EffectManifestPointer pManifest1, return (backendNameComparision ? (backendNameComparision < 0) : (displayNameComparision < 0)); } -void EffectsManager::addEffectsBackend(EffectsBackend* pBackend) { +void EffectsManager::addEffectsBackend(EffectsBackendPointer pBackend) { VERIFY_OR_DEBUG_ASSERT(pBackend) { return; } - m_effectsBackends.append(pBackend); + m_effectsBackends.insert(pBackend->getType(), pBackend); QList backendEffects = pBackend->getEffectIds(); for (const QString& effectId : backendEffects) { @@ -95,20 +93,6 @@ void EffectsManager::addEffectsBackend(EffectsBackend* pBackend) { qSort(m_availableEffectManifests.begin(), m_availableEffectManifests.end(), alphabetizeEffectManifests); - - connect(pBackend, SIGNAL(effectRegistered(EffectManifestPointer)), - this, SLOT(slotBackendRegisteredEffect(EffectManifestPointer))); - - connect(pBackend, SIGNAL(effectRegistered(EffectManifestPointer)), - this, SIGNAL(availableEffectsUpdated(EffectManifestPointer))); -} - -void EffectsManager::slotBackendRegisteredEffect(EffectManifestPointer pManifest) { - auto insertion_point = std::lower_bound(m_availableEffectManifests.begin(), - m_availableEffectManifests.end(), - pManifest, alphabetizeEffectManifests); - m_availableEffectManifests.insert(insertion_point, pManifest); - m_pNumEffectsAvailable->forceSet(m_availableEffectManifests.size()); } bool EffectsManager::isAdoptMetaknobValueEnabled() const { @@ -250,10 +234,10 @@ QString EffectsManager::getPrevEffectId(const QString& effectId) { void EffectsManager::getEffectManifestAndBackend( const QString& effectId, EffectManifestPointer* ppManifest, EffectsBackend** ppBackend) const { - foreach (EffectsBackend* pBackend, m_effectsBackends) { + for (const auto& pBackend : m_effectsBackends) { if (pBackend->canInstantiateEffect(effectId)) { *ppManifest = pBackend->getManifest(effectId); - *ppBackend = pBackend; + *ppBackend = pBackend.data(); } } } diff --git a/src/effects/effectsmanager.h b/src/effects/effectsmanager.h index 2dcacf8157f7..4fd228d1f8a8 100644 --- a/src/effects/effectsmanager.h +++ b/src/effects/effectsmanager.h @@ -20,7 +20,6 @@ class EngineEffectsManager; class EffectManifest; -class EffectsBackend; class EffectsManager : public QObject { Q_OBJECT @@ -42,7 +41,7 @@ class EffectsManager : public QObject { // Add an effect backend to be managed by EffectsManager. EffectsManager // takes ownership of the backend, and will delete it when EffectsManager is // being deleted. Not thread safe -- use only from the GUI thread. - void addEffectsBackend(EffectsBackend* pEffectsBackend); + void addEffectsBackend(EffectsBackendPointer pEffectsBackend); // To support cycling through effect chains, there is a global ordering of // chains. These methods allow you to get the next or previous chain given @@ -150,13 +149,8 @@ class EffectsManager : public QObject { bool writeRequest(EffectsRequest* request); signals: - // TODO() Not connected. Can be used when we implement effect PlugIn loading at runtime - void availableEffectsUpdated(EffectManifestPointer); void visibleEffectsUpdated(); - private slots: - void slotBackendRegisteredEffect(EffectManifestPointer pManifest); - private: QString debugString() const { return "EffectsManager"; @@ -167,7 +161,7 @@ class EffectsManager : public QObject { ChannelHandleFactory* m_pChannelHandleFactory; - QList m_effectsBackends; + QHash m_effectsBackends; QList m_availableEffectManifests; QList m_visibleEffectManifests; diff --git a/src/effects/lv2/lv2backend.cpp b/src/effects/lv2/lv2backend.cpp index 29307ae42d67..c6aadd86186e 100644 --- a/src/effects/lv2/lv2backend.cpp +++ b/src/effects/lv2/lv2backend.cpp @@ -1,8 +1,8 @@ #include "effects/lv2/lv2backend.h" #include "effects/lv2/lv2manifest.h" -LV2Backend::LV2Backend(QObject* pParent) - : EffectsBackend(pParent, EffectBackendType::LV2) { +LV2Backend::LV2Backend() + : EffectsBackend(EffectBackendType::LV2) { m_pWorld = lilv_world_new(); initializeProperties(); lilv_world_load_all(m_pWorld); diff --git a/src/effects/lv2/lv2backend.h b/src/effects/lv2/lv2backend.h index 4ac0e881000b..a2ecbdbba876 100644 --- a/src/effects/lv2/lv2backend.h +++ b/src/effects/lv2/lv2backend.h @@ -8,9 +8,8 @@ #include class LV2Backend : public EffectsBackend { - Q_OBJECT public: - LV2Backend(QObject* pParent); + LV2Backend(); virtual ~LV2Backend(); void enumeratePlugins(); diff --git a/src/mixxx.cpp b/src/mixxx.cpp index a5bbdc563a18..5b312f48b86d 100644 --- a/src/mixxx.cpp +++ b/src/mixxx.cpp @@ -199,11 +199,11 @@ void MixxxMainWindow::initialize(QApplication* pApp, const CmdlineArgs& args) { // Create effect backends. We do this after creating EngineMaster to allow // effect backends to refer to controls that are produced by the engine. - BuiltInBackend* pBuiltInBackend = new BuiltInBackend(m_pEffectsManager); - m_pEffectsManager->addEffectsBackend(pBuiltInBackend); + BuiltInBackend* pBuiltInBackend = new BuiltInBackend(); + m_pEffectsManager->addEffectsBackend(EffectsBackendPointer(pBuiltInBackend)); #ifdef __LILV__ - LV2Backend* pLV2Backend = new LV2Backend(m_pEffectsManager); - m_pEffectsManager->addEffectsBackend(pLV2Backend); + LV2Backend* pLV2Backend = new LV2Backend(); + m_pEffectsManager->addEffectsBackend(EffectsBackendPointer(pLV2Backend)); #else LV2Backend* pLV2Backend = nullptr; #endif From c367207a62189a444181ebbfb4cc3b264c90abc5 Mon Sep 17 00:00:00 2001 From: Be Date: Tue, 17 Jul 2018 03:06:33 -0500 Subject: [PATCH 010/443] pass EffectProcessor instead of EffectInstantiator to EngineEffect and move EffectInstantiator where it belongs, as a private implementation detail of BuiltInBackend. Move the implementation of EffectsBackend into BuiltInBackend and leave EffectsBackend as an abstract base class. --- build/depends.py | 1 - src/effects/builtin/builtinbackend.cpp | 43 +++++++++++++++++- src/effects/builtin/builtinbackend.h | 60 +++++++++++++++++++++++++ src/effects/effectchainslot.cpp | 6 +-- src/effects/effectchainslot.h | 12 ++--- src/effects/effectinstantiator.h | 54 ---------------------- src/effects/effectmanifest.h | 26 ++++++++--- src/effects/effectsbackend.cpp | 51 --------------------- src/effects/effectsbackend.h | 62 +++++--------------------- src/effects/effectslot.cpp | 26 ++++++----- src/effects/effectslot.h | 20 ++++----- src/effects/effectsmanager.cpp | 45 ++++++++++++------- src/effects/effectsmanager.h | 3 ++ src/effects/lv2/lv2backend.cpp | 41 ++++++++--------- src/effects/lv2/lv2backend.h | 11 +++-- src/effects/lv2/lv2effectprocessor.cpp | 14 +++--- src/effects/lv2/lv2effectprocessor.h | 10 ++--- src/effects/lv2/lv2manifest.h | 4 ++ src/engine/effects/engineeffect.cpp | 7 ++- src/engine/effects/engineeffect.h | 7 +-- src/preferences/dialog/dlgpreflv2.cpp | 10 ++--- 21 files changed, 245 insertions(+), 268 deletions(-) delete mode 100644 src/effects/effectinstantiator.h delete mode 100644 src/effects/effectsbackend.cpp diff --git a/build/depends.py b/build/depends.py index 49b0616db4c0..076c5782937a 100644 --- a/build/depends.py +++ b/build/depends.py @@ -702,7 +702,6 @@ def sources(self, build): "effects/effectparameterslot.cpp", "effects/effectbuttonparameterslot.cpp", "effects/effectsmanager.cpp", - "effects/effectsbackend.cpp", "effects/builtin/builtinbackend.cpp", "effects/builtin/bitcrushereffect.cpp", diff --git a/src/effects/builtin/builtinbackend.cpp b/src/effects/builtin/builtinbackend.cpp index 4571b30848e0..0f3c98ae4d26 100644 --- a/src/effects/builtin/builtinbackend.cpp +++ b/src/effects/builtin/builtinbackend.cpp @@ -24,8 +24,7 @@ #include "effects/builtin/metronomeeffect.h" #include "effects/builtin/tremoloeffect.h" -BuiltInBackend::BuiltInBackend() - : EffectsBackend(EffectBackendType::BuiltIn) { +BuiltInBackend::BuiltInBackend() { // Keep this list in a reasonable order // Mixing EQs registerEffect(); @@ -54,6 +53,46 @@ BuiltInBackend::BuiltInBackend() registerEffect(); } +std::unique_ptr BuiltInBackend::createProcessor( + const EffectManifestPointer pManifest) const { + VERIFY_OR_DEBUG_ASSERT(m_registeredEffects.contains(pManifest->id())) { + return std::unique_ptr(nullptr); + } + return std::unique_ptr( + m_registeredEffects[pManifest->id()].initiator()->instantiate()); +} + BuiltInBackend::~BuiltInBackend() { //qDebug() << debugString() << "destroyed"; + m_registeredEffects.clear(); + m_effectIds.clear(); +} + +void BuiltInBackend::registerEffect(const QString& id, + EffectManifestPointer pManifest, + EffectProcessorInstantiatorPointer pInstantiator) { + VERIFY_OR_DEBUG_ASSERT(!m_registeredEffects.contains(id)) { + return; + } + + pManifest->setBackendType(getType()); + + m_registeredEffects[id] = RegisteredEffect(pManifest, pInstantiator); + m_effectIds.append(id); +} + +const QList BuiltInBackend::getEffectIds() const { + return m_effectIds; +} + +EffectManifestPointer BuiltInBackend::getManifest(const QString& effectId) const { + VERIFY_OR_DEBUG_ASSERT(m_registeredEffects.contains(effectId)) { + return EffectManifestPointer(); + } + return m_registeredEffects.value(effectId).manifest(); +} + + +bool BuiltInBackend::canInstantiateEffect(const QString& effectId) const { + return m_registeredEffects.contains(effectId); } diff --git a/src/effects/builtin/builtinbackend.h b/src/effects/builtin/builtinbackend.h index 5f1dfa7d1b5f..3f2602a4b1f9 100644 --- a/src/effects/builtin/builtinbackend.h +++ b/src/effects/builtin/builtinbackend.h @@ -9,10 +9,70 @@ class BuiltInBackend : public EffectsBackend { BuiltInBackend(); virtual ~BuiltInBackend(); + EffectBackendType getType() const { return EffectBackendType::BuiltIn; }; + + const QList getEffectIds() const; + EffectManifestPointer getManifest(const QString& effectId) const; + std::unique_ptr createProcessor( + const EffectManifestPointer pManifest) const; + bool canInstantiateEffect(const QString& effectId) const; + private: QString debugString() const { return "BuiltInBackend"; } + + // EffectProcessorInstantiator and RegisteredEffect associate the QString + // IDs of effects with EffectProcessorImpl subclasses + class EffectProcessorInstantiator { + public: + virtual ~EffectProcessorInstantiator() {}; + virtual EffectProcessor* instantiate() = 0; + }; + typedef QSharedPointer EffectProcessorInstantiatorPointer; + + template + class EffectProcessorSpecificInstantiator : public EffectProcessorInstantiator { + public: + EffectProcessor* instantiate() { + return new T(); + } + }; + + class RegisteredEffect { + public: + RegisteredEffect(EffectManifestPointer pManifest, + EffectProcessorInstantiatorPointer pInitator) + : m_pManifest(pManifest), + m_pInitator(pInitator) { + } + + RegisteredEffect() { + } + + EffectManifestPointer manifest() const { return m_pManifest; }; + EffectProcessorInstantiatorPointer initiator() const { return m_pInitator; }; + + private: + EffectManifestPointer m_pManifest; + EffectProcessorInstantiatorPointer m_pInitator; + }; + + void registerEffect(const QString& id, + EffectManifestPointer pManifest, + EffectProcessorInstantiatorPointer pInstantiator); + + template + void registerEffect() { + registerEffect( + EffectProcessorImpl::getId(), + EffectProcessorImpl::getManifest(), + EffectProcessorInstantiatorPointer( + new EffectProcessorSpecificInstantiator())); + } + + QMap m_registeredEffects; + QList m_effectIds; }; #endif /* BUILTINBACKEND_H */ diff --git a/src/effects/effectchainslot.cpp b/src/effects/effectchainslot.cpp index f9026d2a38c9..e5ecb37851f0 100644 --- a/src/effects/effectchainslot.cpp +++ b/src/effects/effectchainslot.cpp @@ -186,9 +186,9 @@ void EffectChainSlot::setDescription(const QString& description) { } void EffectChainSlot::loadEffect(const unsigned int iEffectSlotNumber, - EffectManifestPointer pManifest, - EffectInstantiatorPointer pInstantiator) { - m_effectSlots[iEffectSlotNumber]->loadEffect(pManifest, pInstantiator, + const EffectManifestPointer pManifest, + std::unique_ptr pProcessor) { + m_effectSlots[iEffectSlotNumber]->loadEffect(pManifest, std::move(pProcessor), m_enabledInputChannels); } diff --git a/src/effects/effectchainslot.h b/src/effects/effectchainslot.h index f1703bdb5a1d..09bfb514c3ba 100644 --- a/src/effects/effectchainslot.h +++ b/src/effects/effectchainslot.h @@ -9,14 +9,16 @@ #include "control/controlobject.h" #include "effects/defs.h" -#include "effects/effectinstantiator.h" #include "engine/channelhandle.h" #include "util/class.h" +#include "util/memory.h" class ControlPushButton; class ControlEncoder; class EffectChainSlot; class EffectsManager; +class EffectProcessor; +class EngineEffectChain; class EffectChainSlot : public QObject { Q_OBJECT @@ -78,9 +80,9 @@ class EffectChainSlot : public QObject { } } - void loadEffect(const unsigned int iEffectSlotNumber, - EffectManifestPointer pManifest, - EffectInstantiatorPointer pInstantiator); + virtual void loadEffect(const unsigned int iEffectSlotNumber, + const EffectManifestPointer pManifest, + std::unique_ptr pProcessor); void reloadAllEffects(); @@ -114,6 +116,7 @@ class EffectChainSlot : public QObject { EffectsManager* m_pEffectsManager; ControlObject* m_pControlChainMix; + ControlObject* m_pControlChainSuperParameter; QList m_effectSlots; private slots: @@ -139,7 +142,6 @@ class EffectChainSlot : public QObject { ControlObject* m_pControlNumEffectSlots; ControlObject* m_pControlChainLoaded; ControlPushButton* m_pControlChainEnabled; - ControlObject* m_pControlChainSuperParameter; ControlPushButton* m_pControlChainMixMode; ControlEncoder* m_pControlChainSelector; ControlPushButton* m_pControlChainNextPreset; diff --git a/src/effects/effectinstantiator.h b/src/effects/effectinstantiator.h deleted file mode 100644 index b3f346dcd9c5..000000000000 --- a/src/effects/effectinstantiator.h +++ /dev/null @@ -1,54 +0,0 @@ -#ifndef EFFECTINSTANTIATOR_H -#define EFFECTINSTANTIATOR_H - -#include -#include "effects/effectmanifest.h" -#include "effects/effectprocessor.h" - -#ifdef __LILV__ -#include "effects/lv2/lv2effectprocessor.h" -#endif /* __LILV__ */ - -class EffectInstantiator { - public: - virtual ~EffectInstantiator() {} - virtual EffectProcessor* instantiate(EngineEffect* pEngineEffect, - EffectManifestPointer pManifest) = 0; -}; -typedef QSharedPointer EffectInstantiatorPointer; - -template -class EffectProcessorInstantiator : public EffectInstantiator { - public: - EffectProcessor* instantiate(EngineEffect* pEngineEffect, - EffectManifestPointer pManifest) { - Q_UNUSED(pEngineEffect); - Q_UNUSED(pManifest); - return new T(); - } -}; - -#ifdef __LILV__ -class LV2EffectProcessorInstantiator : public EffectInstantiator { - public: - LV2EffectProcessorInstantiator(const LilvPlugin* plugin, - QList audioPortIndices, - QList controlPortIndices) - : m_pPlugin(plugin), - m_audioPortIndices(audioPortIndices), - m_controlPortIndices(controlPortIndices) { } - - EffectProcessor* instantiate(EngineEffect* pEngineEffect, - EffectManifestPointer pManifest) { - return new LV2EffectProcessor(pEngineEffect, pManifest, m_pPlugin, - m_audioPortIndices, m_controlPortIndices); - } - private: - const LilvPlugin* m_pPlugin; - const QList m_audioPortIndices; - const QList m_controlPortIndices; - -}; -#endif /* __LILV__ */ - -#endif /* EFFECTINSTANTIATOR_H */ diff --git a/src/effects/effectmanifest.h b/src/effects/effectmanifest.h index abef38f3de81..f608d7d5a271 100644 --- a/src/effects/effectmanifest.h +++ b/src/effects/effectmanifest.h @@ -18,10 +18,8 @@ // EffectManifest is const, it should be completely immutable. EffectManifest is // meant to be used in most cases as a reference, and in Qt collections, so it // is important that the implicit copy and assign constructors work, and that -// the no-argument constructor be non-explicit. All methods are left virtual to -// allow a backend to replace the entire functionality with its own (for -// example, a database-backed manifest) -class EffectManifest final { +// the no-argument constructor be non-explicit. +class EffectManifest { public: EffectManifest() : m_backendType(EffectBackendType::Unknown), @@ -32,6 +30,15 @@ class EffectManifest final { m_metaknobDefault(0.5) { } + // Hack to store unique IDs in QComboBox models + const QString uniqueId() const { + return m_id + " " + backendName(); + } + + // WARNING! Effects must not be identified solely by ID string or name. + // ID strings and names are only unique among EffectManifests from one + // EffectsBackend. Use EffectManifest::operator== to compare both ID string + // and EffectBackendType. const QString& id() const { return m_id; } @@ -142,7 +149,7 @@ class EffectManifest final { m_metaknobDefault = metaknobDefault; } - QString backendName() { + QString backendName() const { switch (m_backendType) { case EffectBackendType::BuiltIn: return QString("Built-in"); @@ -154,7 +161,7 @@ class EffectManifest final { } // Use this when showing the string in the GUI - QString translatedBackendName() { + QString translatedBackendName() const { switch (m_backendType) { case EffectBackendType::BuiltIn: //: Used for effects that are built into Mixxx @@ -179,6 +186,13 @@ class EffectManifest final { return other.id() == m_id && other.backendType() == m_backendType; } + bool operator<(const EffectManifest& other) const { + if (other.backendType() != m_backendType) { + return other.backendType() < m_backendType; + } + return other.id() < m_id; + } + private: QString debugString() const { return QString("EffectManifest(%1)").arg(m_id); diff --git a/src/effects/effectsbackend.cpp b/src/effects/effectsbackend.cpp deleted file mode 100644 index 4c77c06a972a..000000000000 --- a/src/effects/effectsbackend.cpp +++ /dev/null @@ -1,51 +0,0 @@ -#include - -#include "effects/effectsbackend.h" -#include "effects/effectsmanager.h" - -EffectsBackend::EffectsBackend(EffectBackendType type) - : m_type(type) { -} - -EffectsBackend::~EffectsBackend() { - m_registeredEffects.clear(); - m_effectIds.clear(); -} - -void EffectsBackend::registerEffect(const QString& id, - EffectManifestPointer pManifest, - EffectInstantiatorPointer pInstantiator) { - if (m_registeredEffects.contains(id)) { - qWarning() << "WARNING: Effect" << id << "already registered"; - return; - } - - pManifest->setBackendType(m_type); - - m_registeredEffects[id] = RegisteredEffect(pManifest, pInstantiator); - m_effectIds.append(id); -} - -const QList EffectsBackend::getEffectIds() const { - return m_effectIds; -} - -EffectManifestPointer EffectsBackend::getManifest(const QString& effectId) const { - if (!m_registeredEffects.contains(effectId)) { - qWarning() << "WARNING: Effect" << effectId << "is not registered."; - return EffectManifestPointer(); - } - return m_registeredEffects[effectId].manifest(); -} - -EffectInstantiatorPointer EffectsBackend::getInstantiator(const QString& effectId) const { - if (!m_registeredEffects.contains(effectId)) { - qWarning() << "WARNING: Effect" << effectId << "is not registered."; - return EffectInstantiatorPointer(); - } - return m_registeredEffects[effectId].initiator(); -} - -bool EffectsBackend::canInstantiateEffect(const QString& effectId) const { - return m_registeredEffects.contains(effectId); -} diff --git a/src/effects/effectsbackend.h b/src/effects/effectsbackend.h index 4126127b384b..770985cf6005 100644 --- a/src/effects/effectsbackend.h +++ b/src/effects/effectsbackend.h @@ -8,68 +8,26 @@ #include "effects/defs.h" #include "effects/effectslot.h" -#include "effects/effectinstantiator.h" #include "preferences/usersettings.h" -class EffectsManager; -class EffectsBackend; +#include "util/memory.h" + class EffectProcessor; -// An EffectsBackend is an implementation of a provider of Effect's for use -// within the rest of Mixxx. The job of the EffectsBackend is to both enumerate -// and instantiate effects. +// EffectsBackend enumerates available effects and instantiates EffectProcessors class EffectsBackend { public: - EffectsBackend(EffectBackendType type); - virtual ~EffectsBackend(); + virtual ~EffectsBackend() {}; - EffectBackendType getType() const { - return m_type; - } + virtual EffectBackendType getType() const = 0; // returns a list sorted like it should be displayed in the GUI - virtual const QList getEffectIds() const; - virtual EffectManifestPointer getManifest(const QString& effectId) const; - virtual EffectInstantiatorPointer getInstantiator(const QString& effectId) const; - virtual bool canInstantiateEffect(const QString& effectId) const; - - protected: - void registerEffect(const QString& id, - EffectManifestPointer pManifest, - EffectInstantiatorPointer pInstantiator); - - template - void registerEffect() { - registerEffect( - EffectProcessorImpl::getId(), - EffectProcessorImpl::getManifest(), - EffectInstantiatorPointer( - new EffectProcessorInstantiator())); - } - - EffectBackendType m_type; - - private: - class RegisteredEffect { - public: - RegisteredEffect(EffectManifestPointer pManifest, EffectInstantiatorPointer pInitator) - : m_pManifest(pManifest), - m_pInitator(pInitator) { - } - - RegisteredEffect() { - } - - EffectManifestPointer manifest() const { return m_pManifest; }; - EffectInstantiatorPointer initiator() const { return m_pInitator; }; - - private: - EffectManifestPointer m_pManifest; - EffectInstantiatorPointer m_pInitator; - }; + virtual const QList getEffectIds() const = 0; + virtual EffectManifestPointer getManifest(const QString& effectId) const = 0; + virtual bool canInstantiateEffect(const QString& effectId) const = 0; - QMap m_registeredEffects; - QList m_effectIds; + virtual std::unique_ptr createProcessor( + const EffectManifestPointer pManifest) const = 0; }; #endif /* EFFECTSBACKEND_H */ diff --git a/src/effects/effectslot.cpp b/src/effects/effectslot.cpp index 74c914844bf9..a105094e9f59 100644 --- a/src/effects/effectslot.cpp +++ b/src/effects/effectslot.cpp @@ -101,7 +101,8 @@ EffectSlot::~EffectSlot() { delete m_pMetaknobSoftTakeover; } -void EffectSlot::addToEngine(const QSet& activeChannels) { +void EffectSlot::addToEngine(std::unique_ptr pProcessor, + const QSet& activeInputChannels) { VERIFY_OR_DEBUG_ASSERT(m_pManifest != nullptr) { return; } @@ -111,9 +112,9 @@ void EffectSlot::addToEngine(const QSet& activeChannels) } m_pEngineEffect = new EngineEffect(m_pManifest, - activeChannels, + activeInputChannels, m_pEffectsManager, - m_pInstantiator); + std::move(pProcessor)); EffectsRequest* request = new EffectsRequest(); request->type = EffectsRequest::ADD_EFFECT_TO_CHAIN; @@ -174,8 +175,10 @@ EffectManifestPointer EffectSlot::getManifest() const { return m_pManifest; } -void EffectSlot::reload(const QSet& activeChannels) { - loadEffect(m_pManifest, m_pInstantiator, activeChannels); +void EffectSlot::reload(const QSet& activeInputChannels) { + loadEffect(m_pManifest, + m_pEffectsManager->createProcessor(m_pManifest), + activeInputChannels); } EffectParameterSlotPointer EffectSlot::addEffectParameterSlot() { @@ -287,15 +290,13 @@ EffectButtonParameterSlotPointer EffectSlot::getEffectButtonParameterSlot(unsign return m_buttonParameters[slotNumber]; } -void EffectSlot::loadEffect(EffectManifestPointer pManifest, - EffectInstantiatorPointer pInstantiator, - const QSet& activeChannels) { - unloadEffect(); +void EffectSlot::loadEffect(const EffectManifestPointer pManifest, + std::unique_ptr pProcessor, + const QSet& activeChannels) { unloadEffect(); m_pManifest = pManifest; - m_pInstantiator = pInstantiator; - if (pManifest == EffectManifestPointer() || pInstantiator == EffectInstantiatorPointer()) { + if (pManifest == EffectManifestPointer()) { // No new effect to load; just unload the old effect and return. emit(effectChanged()); return; @@ -306,7 +307,8 @@ void EffectSlot::loadEffect(EffectManifestPointer pManifest, this, m_pEffectsManager, m_parameters.size(), pManifestParameter); m_parameters.append(pParameter); } - addToEngine(activeChannels); + + addToEngine(std::move(pProcessor), activeChannels); m_pControlLoaded->forceSet(1.0); diff --git a/src/effects/effectslot.h b/src/effects/effectslot.h index 13d574b41020..c84332630f47 100644 --- a/src/effects/effectslot.h +++ b/src/effects/effectslot.h @@ -14,7 +14,6 @@ #include "engine/engine.h" #include "engine/effects/engineeffect.h" #include "effects/effectbuttonparameterslot.h" -#include "effects/effectinstantiator.h" #include "effects/effectmanifest.h" #include "effects/effectparameter.h" #include "effects/effectparameterslot.h" @@ -41,11 +40,16 @@ class EffectSlot : public QObject { EngineEffectChain* pEngineEffectChain); virtual ~EffectSlot(); + // Call with nullptr for pManifest and pProcessor to unload an effect + void loadEffect(const EffectManifestPointer pManifest, + std::unique_ptr pProcessor, + const QSet& activeChannels); + inline int getEffectSlotNumber() const { return m_iEffectNumber; } - inline const bool isLoaded() const { + inline bool isLoaded() const { return m_pEngineEffect != nullptr; } @@ -98,19 +102,16 @@ class EffectSlot : public QObject { // static EffectPointer createFromXml(EffectsManager* pEffectsManager, // const QDomElement& element); - void addToEngine(const QSet& activeChannels); + void addToEngine(std::unique_ptr, + const QSet& activeInputChannels); void removeFromEngine(); double getMetaknobDefault(); - void reload(const QSet& activeChannels); + void reload(const QSet& activeInputChannels); public slots: void setMetaParameter(double v, bool force = false); - // Call with nullptr for pManifest and pInstantiator to unload an effect - void loadEffect(EffectManifestPointer pManifest, EffectInstantiatorPointer pInstantiator, - const QSet& activeChannels); - void slotNextEffect(double v); void slotPrevEffect(double v); void slotClear(double v); @@ -136,9 +137,6 @@ class EffectSlot : public QObject { UserSettingsPointer m_pConfig; EffectsManager* m_pEffectsManager; EffectManifestPointer m_pManifest; - EffectInstantiatorPointer m_pInstantiator; - QSet m_pActiveChannels; - EngineEffect* m_pEngineEffect; QList m_parameters; EngineEffectChain* m_pEngineEffectChain; diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index fa9209197ea2..abf58ef494ca 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -117,6 +117,26 @@ void EffectsManager::registerOutputChannel(const ChannelHandleAndGroup& handle_g m_registeredOutputChannels.insert(handle_group); } +void EffectsManager::loadEffect(EffectChainSlotPointer pChainSlot, + const int iEffectSlotNumber, const QString& effectId, + EffectBackendType backendType) { + if (kEffectDebugOutput) { + qDebug() << debugString() << "loading effect" << iEffectSlotNumber << effectId; + } + for (const auto& pBackend : m_effectsBackends) { + if (pBackend->canInstantiateEffect(effectId) && + (backendType == EffectBackendType::Unknown || + pBackend->getType() == backendType)) { + EffectManifestPointer pManifest = pBackend->getManifest(effectId); + std::unique_ptr pProcessor = pBackend->createProcessor(pManifest); + + pChainSlot->loadEffect(iEffectSlotNumber, pManifest, std::move(pProcessor)); + return; + } + } + pChainSlot->loadEffect(iEffectSlotNumber, EffectManifestPointer(), nullptr); +} + void EffectsManager::loadStandardEffect(const int iChainSlotNumber, const int iEffectSlotNumber, const QString& effectId, EffectBackendType backendType) { @@ -151,24 +171,17 @@ void EffectsManager::loadEqualizerEffect(const QString& group, } } -void EffectsManager::loadEffect(EffectChainSlotPointer pChainSlot, - const int iEffectSlotNumber, const QString& effectId, - EffectBackendType backendType) { - if (kEffectDebugOutput) { - qDebug() << debugString() << "loading effect" << iEffectSlotNumber << effectId; +std::unique_ptr EffectsManager::createProcessor( + const EffectManifestPointer pManifest) { + if (!pManifest) { + // This can be a valid request to unload an effect, so do not DEBUG_ASSERT. + return std::unique_ptr(nullptr); } - for (auto pBackend : m_effectsBackends) { - if (pBackend->canInstantiateEffect(effectId) && - (backendType == EffectBackendType::Unknown || - pBackend->getType() == backendType)) { - EffectManifestPointer pManifest = pBackend->getManifest(effectId); - EffectInstantiatorPointer pInstantiator = pBackend->getInstantiator(effectId); - - pChainSlot->loadEffect(iEffectSlotNumber, pManifest, pInstantiator); - return; - } + EffectsBackendPointer pBackend = m_effectsBackends.value(pManifest->backendType()); + VERIFY_OR_DEBUG_ASSERT(pBackend) { + return std::unique_ptr(nullptr); } - pChainSlot->loadEffect(iEffectSlotNumber, EffectManifestPointer(), EffectInstantiatorPointer()); + return pBackend->createProcessor(pManifest); } const QList EffectsManager::getAvailableEffectManifestsFiltered( diff --git a/src/effects/effectsmanager.h b/src/effects/effectsmanager.h index 4fd228d1f8a8..8583ddbfff6d 100644 --- a/src/effects/effectsmanager.h +++ b/src/effects/effectsmanager.h @@ -16,6 +16,7 @@ #include "preferences/usersettings.h" #include "util/class.h" #include "util/fifo.h" +#include "util/memory.h" #include "util/xml.h" class EngineEffectsManager; @@ -85,6 +86,8 @@ class EffectsManager : public QObject { void loadEffect(EffectChainSlotPointer pChainSlot, const int iEffectSlotNumber, const QString& effectId, EffectBackendType backendType = EffectBackendType::Unknown); + std::unique_ptr createProcessor( + const EffectManifestPointer pManifest); void addStandardEffectChainSlots(); EffectChainSlotPointer getStandardEffectChainSlot(int unitNumber) const; diff --git a/src/effects/lv2/lv2backend.cpp b/src/effects/lv2/lv2backend.cpp index c6aadd86186e..a8d4ec6353cc 100644 --- a/src/effects/lv2/lv2backend.cpp +++ b/src/effects/lv2/lv2backend.cpp @@ -1,8 +1,8 @@ #include "effects/lv2/lv2backend.h" #include "effects/lv2/lv2manifest.h" +#include "effects/lv2/lv2effectprocessor.h" -LV2Backend::LV2Backend() - : EffectsBackend(EffectBackendType::LV2) { +LV2Backend::LV2Backend() { m_pWorld = lilv_world_new(); initializeProperties(); lilv_world_load_all(m_pWorld); @@ -10,13 +10,11 @@ LV2Backend::LV2Backend() } LV2Backend::~LV2Backend() { - foreach(LilvNode* node, m_properties) { + for (LilvNode* node : m_properties) { lilv_node_free(node); } lilv_world_free(m_pWorld); - foreach(LV2Manifest* lv2Manifest, m_registeredEffects) { - delete lv2Manifest; - } + m_registeredEffects.clear(); } void LV2Backend::enumeratePlugins() { @@ -26,8 +24,8 @@ void LV2Backend::enumeratePlugins() { if (lilv_plugin_is_replaced(plug)) { continue; } - LV2Manifest* lv2Manifest = new LV2Manifest(plug, m_properties); - lv2Manifest->getEffectManifest()->setBackendType(m_type); + LV2EffectManifestPointer lv2Manifest(new LV2Manifest(plug, m_properties)); + lv2Manifest->getEffectManifest()->setBackendType(getType()); m_registeredEffects.insert(lv2Manifest->getEffectManifest()->id(), lv2Manifest); } @@ -45,7 +43,7 @@ void LV2Backend::initializeProperties() { const QList LV2Backend::getEffectIds() const { QList availableEffects; - foreach (LV2Manifest* lv2Manifest, m_registeredEffects) { + for (const auto& lv2Manifest : m_registeredEffects) { if (lv2Manifest->isValid()) { availableEffects.append(lv2Manifest->getEffectManifest()->id()); } @@ -66,25 +64,22 @@ bool LV2Backend::canInstantiateEffect(const QString& effectId) const { } EffectManifestPointer LV2Backend::getManifest(const QString& effectId) const { - LV2Manifest* pLV2Mainfest = getLV2Manifest(effectId); - if (pLV2Mainfest != nullptr) { - return pLV2Mainfest->getEffectManifest(); + VERIFY_OR_DEBUG_ASSERT(m_registeredEffects.contains(effectId)) { + return EffectManifestPointer(); } - return EffectManifestPointer(); + return m_registeredEffects.value(effectId)->getEffectManifest(); } -EffectInstantiatorPointer LV2Backend::getInstantiator(const QString& effectId) const { - LV2Manifest* pLV2Mainfest = getLV2Manifest(effectId); - if (pLV2Mainfest != nullptr) { - return EffectInstantiatorPointer(new LV2EffectProcessorInstantiator( - pLV2Mainfest->getPlugin(), - pLV2Mainfest->getAudioPortIndices(), - pLV2Mainfest->getControlPortIndices())); +std::unique_ptr LV2Backend::createProcessor( + const EffectManifestPointer pManifest) const { + LV2EffectManifestPointer pLV2Manifest = m_registeredEffects.value(pManifest->id()); + VERIFY_OR_DEBUG_ASSERT(pLV2Manifest) { + return std::unique_ptr(nullptr); } - return EffectInstantiatorPointer(); - + return std::unique_ptr( + new LV2EffectProcessor(pLV2Manifest)); } -LV2Manifest* LV2Backend::getLV2Manifest(const QString& effectId) const { +LV2EffectManifestPointer LV2Backend::getLV2Manifest(const QString& effectId) const { return m_registeredEffects[effectId]; } diff --git a/src/effects/lv2/lv2backend.h b/src/effects/lv2/lv2backend.h index a2ecbdbba876..3b9062b9ddad 100644 --- a/src/effects/lv2/lv2backend.h +++ b/src/effects/lv2/lv2backend.h @@ -12,19 +12,22 @@ class LV2Backend : public EffectsBackend { LV2Backend(); virtual ~LV2Backend(); - void enumeratePlugins(); + EffectBackendType getType() const { return EffectBackendType::LV2; }; + const QList getEffectIds() const; const QSet getDiscoveredPluginIds() const; EffectManifestPointer getManifest(const QString& effectId) const; - EffectInstantiatorPointer getInstantiator(const QString& effectId) const; - LV2Manifest* getLV2Manifest(const QString& effectId) const; + LV2EffectManifestPointer getLV2Manifest(const QString& effectId) const; + std::unique_ptr createProcessor( + const EffectManifestPointer pManifest) const; bool canInstantiateEffect(const QString& effectId) const; private: + void enumeratePlugins(); void initializeProperties(); LilvWorld* m_pWorld; QHash m_properties; - QHash m_registeredEffects; + QHash m_registeredEffects; QString debugString() const { return "LV2Backend"; diff --git a/src/effects/lv2/lv2effectprocessor.cpp b/src/effects/lv2/lv2effectprocessor.cpp index 523c528297b8..c28f415a6bea 100644 --- a/src/effects/lv2/lv2effectprocessor.cpp +++ b/src/effects/lv2/lv2effectprocessor.cpp @@ -4,15 +4,11 @@ #include "util/sample.h" #include "util/defs.h" -LV2EffectProcessor::LV2EffectProcessor(EngineEffect* pEngineEffect, - EffectManifestPointer pManifest, - const LilvPlugin* plugin, - QList audioPortIndices, - QList controlPortIndices) +LV2EffectProcessor::LV2EffectProcessor(LV2EffectManifestPointer pManifest) : m_pManifest(pManifest), - m_pPlugin(plugin), - m_audioPortIndices(audioPortIndices), - m_controlPortIndices(controlPortIndices) { + m_pPlugin(pManifest->getPlugin()), + m_audioPortIndices(pManifest->getAudioPortIndices()), + m_controlPortIndices(pManifest->getControlPortIndices()) { m_inputL = new float[MAX_BUFFER_LEN]; m_inputR = new float[MAX_BUFFER_LEN]; m_outputL = new float[MAX_BUFFER_LEN]; @@ -30,7 +26,7 @@ void LV2EffectProcessor::loadEngineEffectParameters( // ports. To avoid slow string comparisons in the audio engine thread in // LV2EffectProcessor::process, rearrange the QMap of EngineEffectParameters by // ID string to an ordered QList. - for (const auto& pManifestParameter : m_pManifest->parameters()) { + for (const auto& pManifestParameter : m_pManifest->getEffectManifest()->parameters()) { m_engineEffectParameters.append(parameters.value(pManifestParameter->id())); } } diff --git a/src/effects/lv2/lv2effectprocessor.h b/src/effects/lv2/lv2effectprocessor.h index b54b7e346431..7fc2feaae621 100644 --- a/src/effects/lv2/lv2effectprocessor.h +++ b/src/effects/lv2/lv2effectprocessor.h @@ -2,7 +2,7 @@ #define LV2EFFECTPROCESSOR_H #include "effects/effectprocessor.h" -#include "effects/effectmanifest.h" +#include "effects/lv2/lv2manifest.h" #include "engine/effects/engineeffectparameter.h" #include #include "effects/defs.h" @@ -28,11 +28,7 @@ class LV2EffectGroupState : public EffectState { class LV2EffectProcessor : public EffectProcessor { public: - LV2EffectProcessor(EngineEffect* pEngineEffect, - EffectManifestPointer pManifest, - const LilvPlugin* plugin, - QList audioPortIndices, - QList controlPortIndices); + LV2EffectProcessor(LV2EffectManifestPointer pManifest); ~LV2EffectProcessor(); void initialize( @@ -58,7 +54,7 @@ class LV2EffectProcessor : public EffectProcessor { private: LV2EffectGroupState* createGroupState(const mixxx::EngineParameters& bufferParameters); - EffectManifestPointer m_pManifest; + LV2EffectManifestPointer m_pManifest; QList m_engineEffectParameters; float* m_inputL; float* m_inputR; diff --git a/src/effects/lv2/lv2manifest.h b/src/effects/lv2/lv2manifest.h index ec81d88ee1c7..c3233d17c5af 100644 --- a/src/effects/lv2/lv2manifest.h +++ b/src/effects/lv2/lv2manifest.h @@ -1,6 +1,8 @@ #ifndef LV2MANIFEST_H #define LV2MANIFEST_H +#include + #include "effects/effectmanifest.h" #include "effects/defs.h" #include @@ -45,4 +47,6 @@ class LV2Manifest { bool m_isValid; }; +typedef QSharedPointer LV2EffectManifestPointer; + #endif // LV2MANIFEST_H diff --git a/src/engine/effects/engineeffect.cpp b/src/engine/effects/engineeffect.cpp index ddfb95f19c66..a247a9f37aeb 100644 --- a/src/engine/effects/engineeffect.cpp +++ b/src/engine/effects/engineeffect.cpp @@ -7,8 +7,9 @@ EngineEffect::EngineEffect(EffectManifestPointer pManifest, const QSet& activeInputChannels, EffectsManager* pEffectsManager, - EffectInstantiatorPointer pInstantiator) + std::unique_ptr pProcessor) : m_pManifest(pManifest), + m_pProcessor(std::move(pProcessor)), m_parameters(pManifest->parameters().size()), m_pEffectsManager(pEffectsManager) { const QList& parameters = m_pManifest->parameters(); @@ -29,9 +30,8 @@ EngineEffect::EngineEffect(EffectManifestPointer pManifest, m_effectEnableStateForChannelMatrix.insert(inputChannel.handle(), outputChannelMap); } - // Creating the processor must come last. - m_pProcessor = pInstantiator->instantiate(this, pManifest); m_pProcessor->loadEngineEffectParameters(m_parametersById); + //TODO: get actual configuration of engine const mixxx::EngineParameters bufferParameters( mixxx::AudioSignal::SampleRate(96000), @@ -45,7 +45,6 @@ EngineEffect::~EngineEffect() { if (kEffectDebugOutput) { qDebug() << debugString() << "destroyed"; } - delete m_pProcessor; m_parametersById.clear(); m_parameters.clear(); } diff --git a/src/engine/effects/engineeffect.h b/src/engine/effects/engineeffect.h index 7a324421ff70..f7dfb264f619 100644 --- a/src/engine/effects/engineeffect.h +++ b/src/engine/effects/engineeffect.h @@ -11,18 +11,19 @@ #include "effects/effectsmanager.h" #include "effects/effectmanifest.h" #include "effects/effectprocessor.h" -#include "effects/effectinstantiator.h" #include "engine/channelhandle.h" #include "engine/effects/engineeffectparameter.h" #include "engine/effects/message.h" #include "engine/effects/groupfeaturestate.h" +#include "util/memory.h" + class EngineEffect : public EffectsRequestHandler { public: EngineEffect(EffectManifestPointer pManifest, const QSet& activeInputChannels, EffectsManager* pEffectsManager, - EffectInstantiatorPointer pInstantiator); + std::unique_ptr pProcessor); virtual ~EngineEffect(); const QString& name() const { @@ -56,7 +57,7 @@ class EngineEffect : public EffectsRequestHandler { } EffectManifestPointer m_pManifest; - EffectProcessor* m_pProcessor; + std::unique_ptr m_pProcessor; ChannelHandleMap> m_effectEnableStateForChannelMatrix; bool m_effectRampsFromDry; // Must not be modified after construction. diff --git a/src/preferences/dialog/dlgpreflv2.cpp b/src/preferences/dialog/dlgpreflv2.cpp index b0c2e430acc2..dfa49ebb4786 100644 --- a/src/preferences/dialog/dlgpreflv2.cpp +++ b/src/preferences/dialog/dlgpreflv2.cpp @@ -31,7 +31,7 @@ DlgPrefLV2::DlgPrefLV2(QWidget* pParent, LV2Backend* lv2Backend, qSort(allPlugins.begin(), allPlugins.end()); for (const auto& effectId: allPlugins) { - LV2Manifest* lv2Manifest = m_pLV2Backend->getLV2Manifest(effectId); + LV2EffectManifestPointer lv2Manifest = m_pLV2Backend->getLV2Manifest(effectId); EffectManifestPointer pEffectManifest = lv2Manifest->getEffectManifest(); QPushButton* button = new QPushButton(this); @@ -110,13 +110,13 @@ void DlgPrefLV2::slotDisplayParameters() { } void DlgPrefLV2::slotApply() { - EffectManifestPointer pCurrentEffectManifest = - m_pLV2Backend->getManifest(m_currentEffectId); - - if (pCurrentEffectManifest == nullptr) { + if (m_currentEffectId.isEmpty()) { return; } + EffectManifestPointer pCurrentEffectManifest = + m_pLV2Backend->getManifest(m_currentEffectId); + qDebug() << "DlgPrefLV2::slotApply" << pCurrentEffectManifest.data(); for (int i = 0; i < m_pluginParameters.size(); i++) { EffectManifestParameterPointer pParameter = pCurrentEffectManifest->parameter(i); From 70fce49bdbfaa0d3aa4ec2091ecdee85100ffc62 Mon Sep 17 00:00:00 2001 From: Be Date: Sun, 15 Jul 2018 01:32:07 -0500 Subject: [PATCH 011/443] make LV2EffectProcessor a subclass of EffectProcessorImpl to reduce code duplication --- src/effects/effectprocessor.h | 9 +- src/effects/lv2/lv2effectprocessor.cpp | 202 ++++--------------------- src/effects/lv2/lv2effectprocessor.h | 55 +++---- 3 files changed, 59 insertions(+), 207 deletions(-) diff --git a/src/effects/effectprocessor.h b/src/effects/effectprocessor.h index 88613b9b6a77..2a36b4fdc17f 100644 --- a/src/effects/effectprocessor.h +++ b/src/effects/effectprocessor.h @@ -263,9 +263,11 @@ class EffectProcessorImpl : public EffectProcessor { stateMap.clear(); }; - private: - - EffectSpecificState* createSpecificState(const mixxx::EngineParameters& bufferParameters) { + protected: + // Subclasses for external effects plugins may reimplement this, but + // subclasses for built-in effects should not. + virtual EffectSpecificState* createSpecificState( + const mixxx::EngineParameters& bufferParameters) { EffectSpecificState* pState = new EffectSpecificState(bufferParameters); if (kEffectDebugOutput) { qDebug() << this << "EffectProcessorImpl creating EffectState" << pState; @@ -273,6 +275,7 @@ class EffectProcessorImpl : public EffectProcessor { return pState; }; + private: QSet m_registeredOutputChannels; ChannelHandleMap> m_channelStateMatrix; }; diff --git a/src/effects/lv2/lv2effectprocessor.cpp b/src/effects/lv2/lv2effectprocessor.cpp index c28f415a6bea..89cf85cb1ae7 100644 --- a/src/effects/lv2/lv2effectprocessor.cpp +++ b/src/effects/lv2/lv2effectprocessor.cpp @@ -32,28 +32,6 @@ void LV2EffectProcessor::loadEngineEffectParameters( } LV2EffectProcessor::~LV2EffectProcessor() { - if (kEffectDebugOutput) { - qDebug() << "~LV2EffectProcessor" << this; - } - int inputChannelHandleNumber = 0; - for (auto& outputsMap : m_channelStateMatrix) { - int outputChannelHandleNumber = 0; - for (LV2EffectGroupState* pState : outputsMap) { - VERIFY_OR_DEBUG_ASSERT(pState != nullptr) { - continue; - } - if (kEffectDebugOutput) { - qDebug() << "~LV2EffectProcessor deleting LilvInstance" << pState - << "for input ChannelHandle(" << inputChannelHandleNumber << ")" - << "and output ChannelHandle(" << outputChannelHandleNumber << ")"; - } - delete pState; - outputChannelHandleNumber++; - } - outputsMap.clear(); - } - m_channelStateMatrix.clear(); - delete[] m_inputL; delete[] m_inputR; delete[] m_outputL; @@ -61,60 +39,15 @@ LV2EffectProcessor::~LV2EffectProcessor() { delete[] m_LV2parameters; } -void LV2EffectProcessor::initialize( - const QSet& activeInputChannels, - const QSet& registeredOutputChannels, - const mixxx::EngineParameters& bufferParameters) { - m_registeredOutputChannels = registeredOutputChannels; - Q_UNUSED(bufferParameters); - - for (const ChannelHandleAndGroup& inputChannel : activeInputChannels) { - if (kEffectDebugOutput) { - qDebug() << this << "LV2EffectProcessor::initialize allocating " - "EffectStates for input" << inputChannel; - } - ChannelHandleMap outputChannelMap; - for (const ChannelHandleAndGroup& outputChannel : registeredOutputChannels) { - LV2EffectGroupState* pGroupState = createGroupState(bufferParameters); - if (pGroupState) { - outputChannelMap.insert(outputChannel.handle(), pGroupState); - if (kEffectDebugOutput) { - qDebug() << this << "EffectProcessorImpl::initialize " - "registering output" << outputChannel << outputChannelMap[outputChannel.handle()]; - } - } - } - m_channelStateMatrix.insert(inputChannel.handle(), outputChannelMap); - } -} - -void LV2EffectProcessor::process(const ChannelHandle& inputHandle, - const ChannelHandle& outputHandle, - const CSAMPLE* pInput, CSAMPLE* pOutput, - const mixxx::EngineParameters& bufferParameters, - const EffectEnableState enableState, - const GroupFeatureState& groupFeatures) { +void LV2EffectProcessor::processChannel(const ChannelHandle& handle, + LV2EffectGroupState* channelState, + const CSAMPLE* pInput, CSAMPLE* pOutput, + const mixxx::EngineParameters& bufferParameters, + const EffectEnableState enableState, + const GroupFeatureState& groupFeatures) { Q_UNUSED(groupFeatures); Q_UNUSED(enableState); - LV2EffectGroupState* pState = m_channelStateMatrix[inputHandle][outputHandle]; - VERIFY_OR_DEBUG_ASSERT(pState != nullptr) { - if (kEffectDebugOutput) { - qWarning() << "LV2EffectProcessor::process could not retrieve" - "handle for input" << inputHandle - << "and output" << outputHandle - << "Handle should have been preallocated in the" - "main thread."; - } - pState = createGroupState(bufferParameters); - m_channelStateMatrix[inputHandle][outputHandle] = pState; - } - - if (!pState) { - SampleUtil::copyWithGain(pOutput, pInput, 1.0, bufferParameters.samplesPerBuffer()); - return; - } - for (int i = 0; i < m_engineEffectParameters.size(); i++) { m_LV2parameters[i] = m_engineEffectParameters[i]->value(); } @@ -126,7 +59,8 @@ void LV2EffectProcessor::process(const ChannelHandle& inputHandle, j++; } - lilv_instance_run(pState->lilvIinstance(), bufferParameters.framesPerBuffer()); + LilvInstance* instance = channelState->lilvInstance(m_pPlugin, bufferParameters); + lilv_instance_run(instance, bufferParameters.framesPerBuffer()); j = 0; for (unsigned int i = 0; i < bufferParameters.samplesPerBuffer(); i += 2) { @@ -136,113 +70,33 @@ void LV2EffectProcessor::process(const ChannelHandle& inputHandle, } } -LV2EffectGroupState* LV2EffectProcessor::createGroupState(const mixxx::EngineParameters& bufferParameters) { - LV2EffectGroupState * pState = new LV2EffectGroupState(bufferParameters, m_pPlugin); - LilvInstance* handle = pState->lilvIinstance(); - if (handle) { +LV2EffectGroupState* LV2EffectProcessor::createSpecificState( + const mixxx::EngineParameters& bufferParameters) { + LV2EffectGroupState* pState = new LV2EffectGroupState(bufferParameters); + LilvInstance* pInstance = pState->lilvInstance(m_pPlugin, bufferParameters); + VERIFY_OR_DEBUG_ASSERT(pInstance) { + return pState; + } + + if (kEffectDebugOutput) { + qDebug() << this << "LV2EffectProcessor creating LV2EffectGroupState" << pState; + } + + if (pInstance) { for (int i = 0; i < m_engineEffectParameters.size(); i++) { m_LV2parameters[i] = m_engineEffectParameters[i]->value(); - lilv_instance_connect_port(handle, m_controlPortIndices[i], &m_LV2parameters[i]); + lilv_instance_connect_port(pInstance, + m_controlPortIndices[i], &m_LV2parameters[i]); } // We assume the audio ports are in the following order: // input_left, input_right, output_left, output_right - lilv_instance_connect_port(handle, m_audioPortIndices[0], m_inputL); - lilv_instance_connect_port(handle, m_audioPortIndices[1], m_inputR); - lilv_instance_connect_port(handle, m_audioPortIndices[2], m_outputL); - lilv_instance_connect_port(handle, m_audioPortIndices[3], m_outputR); + lilv_instance_connect_port(pInstance, m_audioPortIndices[0], m_inputL); + lilv_instance_connect_port(pInstance, m_audioPortIndices[1], m_inputR); + lilv_instance_connect_port(pInstance, m_audioPortIndices[2], m_outputL); + lilv_instance_connect_port(pInstance, m_audioPortIndices[3], m_outputR); - lilv_instance_activate(handle); - } - if (kEffectDebugOutput) { - qDebug() << this << "LV2EffectProcessor creating EffectState" << pState; + lilv_instance_activate(pInstance); } return pState; }; - -EffectState* LV2EffectProcessor::createState(const mixxx::EngineParameters& bufferParameters) { - return createGroupState(bufferParameters); -}; - -bool LV2EffectProcessor::loadStatesForInputChannel(const ChannelHandle* inputChannel, - const EffectStatesMap* pStatesMap) { - if (kEffectDebugOutput) { - qDebug() << "LV2EffectProcessor::loadStatesForInputChannel" << this - << "input" << *inputChannel; - } - - // NOTE: ChannelHandleMap is like a map in that it associates an - // object with a ChannelHandle key, but it actually backed by a - // QVarLengthArray, not a QMap. So it is okay that - // m_channelStateMatrix may be accessed concurrently in the main - // thread in deleteStatesForInputChannel. - - // Can't directly cast a ChannelHandleMap from containing the base - // EffectState* type to EffectSpecificState* type, so iterate through - // pStatesMap to build a new ChannelHandleMap with - // dynamic_cast'ed states. - ChannelHandleMap& effectSpecificStatesMap = - m_channelStateMatrix[*inputChannel]; - - // deleteStatesForInputChannel should have been called before a new - // map of EffectStates was sent to this function, or this is the first - // time states are being loaded for this input channel, so - // effectSpecificStatesMap should be empty and this loop should - // not go through any iterations. - for (LV2EffectGroupState* pState : effectSpecificStatesMap) { - VERIFY_OR_DEBUG_ASSERT(pState == nullptr) { - delete pState; - qDebug() << "for effectSpecificStatesMap"; - } - } - - QSet receivedOutputChannels; - for (const ChannelHandleAndGroup& outputChannel : m_registeredOutputChannels) { - if (kEffectDebugOutput) { - qDebug() << "LV2EffectProcessor::loadStatesForInputChannel" - << this << "output" << outputChannel; - } - - auto pState = dynamic_cast( - pStatesMap->at(outputChannel.handle())); - VERIFY_OR_DEBUG_ASSERT(pState != nullptr) { - return false; - } - effectSpecificStatesMap.insert(outputChannel.handle(), pState); - receivedOutputChannels.insert(outputChannel); - } - // Output channels are hardcoded in EngineMaster and should not - // be registered after Mixxx initializes. - DEBUG_ASSERT(receivedOutputChannels == m_registeredOutputChannels); - return true; -} - -// Called from main thread for garbage collection after the last audio thread -// callback executes process() with EffectEnableState::Disabling -void LV2EffectProcessor::deleteStatesForInputChannel(const ChannelHandle* inputChannel) { - if (kEffectDebugOutput) { - qDebug() << "LV2EffectProcessor::deleteStatesForInputChannel" - << this << *inputChannel; - } - - // NOTE: ChannelHandleMap is like a map in that it associates an - // object with a ChannelHandle key, but it actually backed by a - // QVarLengthArray, not a QMap. So it is okay that - // m_channelStateMatrix may be accessed concurrently in the audio - // engine thread in loadStatesForInputChannel. - - ChannelHandleMap& stateMap = - m_channelStateMatrix[*inputChannel]; - for (LV2EffectGroupState* pState : stateMap) { - VERIFY_OR_DEBUG_ASSERT(pState != nullptr) { - continue; - } - if (kEffectDebugOutput) { - qDebug() << "LV2EffectProcessor::deleteStatesForInputChannel" - << this << "deleting state" << pState; - } - delete pState; - qDebug() << "inputChannel" << inputChannel; - } - stateMap.clear(); -} diff --git a/src/effects/lv2/lv2effectprocessor.h b/src/effects/lv2/lv2effectprocessor.h index 7fc2feaae621..96b971dc6b6d 100644 --- a/src/effects/lv2/lv2effectprocessor.h +++ b/src/effects/lv2/lv2effectprocessor.h @@ -8,51 +8,49 @@ #include "effects/defs.h" #include "engine/engine.h" -class LV2EffectGroupState : public EffectState { +class LV2EffectGroupState final: public EffectState { public: - LV2EffectGroupState(const mixxx::EngineParameters& bufferParameters, const LilvPlugin* pPlugin) - : EffectState(bufferParameters) { - m_pInstance = lilv_plugin_instantiate(pPlugin, bufferParameters.sampleRate(), nullptr); + LV2EffectGroupState(const mixxx::EngineParameters& bufferParameters) + : EffectState(bufferParameters), + m_pInstance(nullptr) { } ~LV2EffectGroupState() { - lilv_instance_deactivate(m_pInstance); - lilv_instance_free(m_pInstance); + if (m_pInstance) { + lilv_instance_deactivate(m_pInstance); + lilv_instance_free(m_pInstance); + } } - LilvInstance* lilvIinstance() { + LilvInstance* lilvInstance(const LilvPlugin* pPlugin, + const mixxx::EngineParameters& bufferParameters) { + if (!m_pInstance) { + m_pInstance = lilv_plugin_instantiate( + pPlugin, bufferParameters.sampleRate(), nullptr); + } return m_pInstance; } + private: LilvInstance* m_pInstance; }; -class LV2EffectProcessor : public EffectProcessor { +class LV2EffectProcessor final : public EffectProcessorImpl { public: LV2EffectProcessor(LV2EffectManifestPointer pManifest); ~LV2EffectProcessor(); - void initialize( - const QSet& activeInputChannels, - const QSet& registeredOutputChannels, - const mixxx::EngineParameters& bufferParameters) override; - EffectState* createState(const mixxx::EngineParameters& bufferParameters) final; - bool loadStatesForInputChannel(const ChannelHandle* inputChannel, - const EffectStatesMap* pStatesMap) override; - // Called from main thread for garbage collection after the last audio thread - // callback executes process() with EffectEnableState::Disabling - void deleteStatesForInputChannel(const ChannelHandle* inputChannel) override; - void loadEngineEffectParameters( - const QMap& parameters); + const QMap& parameters) override; - void process(const ChannelHandle& inputHandle, - const ChannelHandle& outputHandle, - const CSAMPLE* pInput, CSAMPLE* pOutput, - const mixxx::EngineParameters& bufferParameters, - const EffectEnableState enableState, - const GroupFeatureState& groupFeatures) override; + void processChannel(const ChannelHandle& handle, + LV2EffectGroupState* channelState, + const CSAMPLE* pInput, CSAMPLE* pOutput, + const mixxx::EngineParameters& bufferParameters, + const EffectEnableState enableState, + const GroupFeatureState& groupFeatures) override; private: - LV2EffectGroupState* createGroupState(const mixxx::EngineParameters& bufferParameters); + LV2EffectGroupState* createSpecificState( + const mixxx::EngineParameters& bufferParameters) override; LV2EffectManifestPointer m_pManifest; QList m_engineEffectParameters; @@ -64,9 +62,6 @@ class LV2EffectProcessor : public EffectProcessor { const LilvPlugin* m_pPlugin; const QList m_audioPortIndices; const QList m_controlPortIndices; - - QSet m_registeredOutputChannels; - ChannelHandleMap> m_channelStateMatrix; }; From 09a338b94dd0342c2cec5e4eee9dbed6dd4b3289 Mon Sep 17 00:00:00 2001 From: Be Date: Sun, 15 Jul 2018 01:48:55 -0500 Subject: [PATCH 012/443] make LV2EffectManifest a subclass of EffectManifest --- src/effects/lv2/lv2backend.cpp | 9 ++++---- src/effects/lv2/lv2effectprocessor.cpp | 2 +- src/effects/lv2/lv2manifest.cpp | 21 +++++++----------- src/effects/lv2/lv2manifest.h | 5 ++--- .../dialog/.dlgprefeq.cpp.kate-swp | Bin 0 -> 1424 bytes src/preferences/dialog/dlgpreflv2.cpp | 9 ++++---- 6 files changed, 19 insertions(+), 27 deletions(-) create mode 100644 src/preferences/dialog/.dlgprefeq.cpp.kate-swp diff --git a/src/effects/lv2/lv2backend.cpp b/src/effects/lv2/lv2backend.cpp index a8d4ec6353cc..9cbdc472337d 100644 --- a/src/effects/lv2/lv2backend.cpp +++ b/src/effects/lv2/lv2backend.cpp @@ -25,9 +25,8 @@ void LV2Backend::enumeratePlugins() { continue; } LV2EffectManifestPointer lv2Manifest(new LV2Manifest(plug, m_properties)); - lv2Manifest->getEffectManifest()->setBackendType(getType()); - m_registeredEffects.insert(lv2Manifest->getEffectManifest()->id(), - lv2Manifest); + lv2Manifest->setBackendType(getType()); + m_registeredEffects.insert(lv2Manifest->id(), lv2Manifest); } } @@ -45,7 +44,7 @@ const QList LV2Backend::getEffectIds() const { QList availableEffects; for (const auto& lv2Manifest : m_registeredEffects) { if (lv2Manifest->isValid()) { - availableEffects.append(lv2Manifest->getEffectManifest()->id()); + availableEffects.append(lv2Manifest->id()); } } return availableEffects; @@ -67,7 +66,7 @@ EffectManifestPointer LV2Backend::getManifest(const QString& effectId) const { VERIFY_OR_DEBUG_ASSERT(m_registeredEffects.contains(effectId)) { return EffectManifestPointer(); } - return m_registeredEffects.value(effectId)->getEffectManifest(); + return m_registeredEffects.value(effectId); } std::unique_ptr LV2Backend::createProcessor( diff --git a/src/effects/lv2/lv2effectprocessor.cpp b/src/effects/lv2/lv2effectprocessor.cpp index 89cf85cb1ae7..939e60b7236f 100644 --- a/src/effects/lv2/lv2effectprocessor.cpp +++ b/src/effects/lv2/lv2effectprocessor.cpp @@ -26,7 +26,7 @@ void LV2EffectProcessor::loadEngineEffectParameters( // ports. To avoid slow string comparisons in the audio engine thread in // LV2EffectProcessor::process, rearrange the QMap of EngineEffectParameters by // ID string to an ordered QList. - for (const auto& pManifestParameter : m_pManifest->getEffectManifest()->parameters()) { + for (const auto& pManifestParameter : m_pManifest->parameters()) { m_engineEffectParameters.append(parameters.value(pManifestParameter->id())); } } diff --git a/src/effects/lv2/lv2manifest.cpp b/src/effects/lv2/lv2manifest.cpp index b41915fe8195..ad9547ba6ed2 100644 --- a/src/effects/lv2/lv2manifest.cpp +++ b/src/effects/lv2/lv2manifest.cpp @@ -4,23 +4,22 @@ LV2Manifest::LV2Manifest(const LilvPlugin* plug, QHash& properties) - : m_pEffectManifest(new EffectManifest()), + : EffectManifest(), m_status(AVAILABLE) { - m_pLV2plugin = plug; // Get and set the ID const LilvNode* id = lilv_plugin_get_uri(m_pLV2plugin); - m_pEffectManifest->setId(lilv_node_as_string(id)); + setId(lilv_node_as_string(id)); // Get and set the name LilvNode* info = lilv_plugin_get_name(m_pLV2plugin); - m_pEffectManifest->setName(lilv_node_as_string(info)); + setName(lilv_node_as_string(info)); lilv_node_free(info); // Get and set the author info = lilv_plugin_get_author_name(m_pLV2plugin); - m_pEffectManifest->setAuthor(lilv_node_as_string(info)); + setAuthor(lilv_node_as_string(info)); lilv_node_free(info); int numPorts = lilv_plugin_get_num_ports(plug); @@ -55,7 +54,7 @@ LV2Manifest::LV2Manifest(const LilvPlugin* plug, && !lilv_port_has_property(m_pLV2plugin, port, properties["enumeration_port"]) && !lilv_port_has_property(m_pLV2plugin, port, properties["button_port"])) { controlPortIndices.append(i); - EffectManifestParameterPointer param = m_pEffectManifest->addParameter(); + EffectManifestParameterPointer param = addParameter(); // Get and set the parameter name info = lilv_port_get_name(m_pLV2plugin, port); @@ -96,7 +95,7 @@ LV2Manifest::LV2Manifest(const LilvPlugin* plug, (lilv_port_has_property(m_pLV2plugin, port, properties["enumeration_port"]) || lilv_port_has_property(m_pLV2plugin, port, properties["button_port"]))) { controlPortIndices.append(i); - EffectManifestParameterPointer param = m_pEffectManifest->addParameter(); + EffectManifestParameterPointer param = addParameter(); // Get and set the parameter name info = lilv_port_get_name(m_pLV2plugin, port); @@ -161,10 +160,6 @@ LV2Manifest::~LV2Manifest() { delete m_default; } -EffectManifestPointer LV2Manifest::getEffectManifest() const { - return m_pEffectManifest; -} - QList LV2Manifest::getAudioPortIndices() { return audioPortIndices; } @@ -193,8 +188,8 @@ void LV2Manifest::buildEnumerationOptions(const LilvPort* port, const LilvNode* description = lilv_scale_point_get_label(option); const LilvNode* value = lilv_scale_point_get_value(option); QString strDescription(lilv_node_as_string(description)); - param->appendStep(qMakePair(strDescription, - (double)lilv_node_as_float(value))); + param->appendStep(qMakePair( + strDescription, (double)lilv_node_as_float(value))); } if (options != NULL) { diff --git a/src/effects/lv2/lv2manifest.h b/src/effects/lv2/lv2manifest.h index c3233d17c5af..f9d85a28c73d 100644 --- a/src/effects/lv2/lv2manifest.h +++ b/src/effects/lv2/lv2manifest.h @@ -7,7 +7,7 @@ #include "effects/defs.h" #include -class LV2Manifest { +class LV2Manifest : public EffectManifest { public: enum Status { AVAILABLE, @@ -17,7 +17,7 @@ class LV2Manifest { LV2Manifest(const LilvPlugin* plug, QHash& properties); ~LV2Manifest(); - EffectManifestPointer getEffectManifest() const; + QList getAudioPortIndices(); QList getControlPortIndices(); const LilvPlugin* getPlugin(); @@ -28,7 +28,6 @@ class LV2Manifest { void buildEnumerationOptions(const LilvPort* port, EffectManifestParameterPointer param); const LilvPlugin* m_pLV2plugin; - EffectManifestPointer m_pEffectManifest; // This list contains: // position 0 -> input_left port index diff --git a/src/preferences/dialog/.dlgprefeq.cpp.kate-swp b/src/preferences/dialog/.dlgprefeq.cpp.kate-swp new file mode 100644 index 0000000000000000000000000000000000000000..8689b2b631de1b459059b3c84c1663b8e036dbc7 GIT binary patch literal 1424 zcmciBO-~a+7{Ku<0)j7y2r8&J3TiQGq^O|Yj7wrjjk*WVrEHr`>Tca`CEmT8c=P2e z_!+$U0lawf;-~P){HHT{#)fcYlcxKdXP()4c}6KUv(+dQ9q%@}dNb`Lx_0NTQffB; z`|-z)U6(7Mn z;!&JL@hkJkcz8@m_fhF>vrTXRHJcrbHs(h2@p0Ue{ztJEPq?`MI-VQ~cf^x)&&9`Z zLwpZ}RC4Lh3#Zx#FpTbS?G!CYF8doJggKvt@;7B}+gXPZ+`792$^BfMoe;x;i zJCA!Z{sOLxFW_K5F5+N)mxkhtxGnjYaWEf^3yELBE7YPt;H$I*JF;Xv*UYnCsb9ur zk!J1dx?SY`?k!500^1<fjlqrCF)dsMSiEW!%Zj=lwU^Nnx`|s*?T9<|?%s zBb!g^00cwXFX;+ gJX!9Vko~L4X4vh#eQ@}{!m&61u&;J-mEBd}15!23!~g&Q literal 0 HcmV?d00001 diff --git a/src/preferences/dialog/dlgpreflv2.cpp b/src/preferences/dialog/dlgpreflv2.cpp index dfa49ebb4786..f6f0b2f917f4 100644 --- a/src/preferences/dialog/dlgpreflv2.cpp +++ b/src/preferences/dialog/dlgpreflv2.cpp @@ -31,15 +31,14 @@ DlgPrefLV2::DlgPrefLV2(QWidget* pParent, LV2Backend* lv2Backend, qSort(allPlugins.begin(), allPlugins.end()); for (const auto& effectId: allPlugins) { - LV2EffectManifestPointer lv2Manifest = m_pLV2Backend->getLV2Manifest(effectId); - EffectManifestPointer pEffectManifest = lv2Manifest->getEffectManifest(); + LV2EffectManifestPointer pManifest = m_pLV2Backend->getLV2Manifest(effectId); QPushButton* button = new QPushButton(this); - button->setText(pEffectManifest->name()); + button->setText(pManifest->name()); if (!m_pLV2Backend->canInstantiateEffect(effectId)) { // Tooltip displaying why this effect is disabled - LV2Manifest::Status status = lv2Manifest->getStatus(); + LV2Manifest::Status status = pManifest->getStatus(); switch (status) { case LV2Manifest::IO_NOT_STEREO: button->setToolTip(QObject::tr("This plugin does not support " @@ -58,7 +57,7 @@ DlgPrefLV2::DlgPrefLV2(QWidget* pParent, LV2Backend* lv2Backend, } lv2_vertical_layout_left->addWidget(button); - button->setProperty("id", QVariant(pEffectManifest->id())); + button->setProperty("id", QVariant(pManifest->id())); connect(button, SIGNAL(clicked()), this, SLOT(slotDisplayParameters())); } } From bbc9a9e314ceb1fbd748758b13af35f12bf4dc60 Mon Sep 17 00:00:00 2001 From: Be Date: Sun, 15 Jul 2018 01:55:31 -0500 Subject: [PATCH 013/443] activate and deactivate LV2 effect plugins appropriately --- src/effects/lv2/lv2effectprocessor.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/effects/lv2/lv2effectprocessor.cpp b/src/effects/lv2/lv2effectprocessor.cpp index 939e60b7236f..33bf1364f8cb 100644 --- a/src/effects/lv2/lv2effectprocessor.cpp +++ b/src/effects/lv2/lv2effectprocessor.cpp @@ -46,7 +46,6 @@ void LV2EffectProcessor::processChannel(const ChannelHandle& handle, const EffectEnableState enableState, const GroupFeatureState& groupFeatures) { Q_UNUSED(groupFeatures); - Q_UNUSED(enableState); for (int i = 0; i < m_engineEffectParameters.size(); i++) { m_LV2parameters[i] = m_engineEffectParameters[i]->value(); @@ -60,6 +59,11 @@ void LV2EffectProcessor::processChannel(const ChannelHandle& handle, } LilvInstance* instance = channelState->lilvInstance(m_pPlugin, bufferParameters); + + if (enableState == EffectEnableState::Enabling) { + lilv_instance_activate(instance); + } + lilv_instance_run(instance, bufferParameters.framesPerBuffer()); j = 0; @@ -68,6 +72,10 @@ void LV2EffectProcessor::processChannel(const ChannelHandle& handle, pOutput[i + 1] = m_outputR[j]; j++; } + + if (enableState == EffectEnableState::Disabling) { + lilv_instance_deactivate(instance); + } } LV2EffectGroupState* LV2EffectProcessor::createSpecificState( @@ -95,8 +103,6 @@ LV2EffectGroupState* LV2EffectProcessor::createSpecificState( lilv_instance_connect_port(pInstance, m_audioPortIndices[1], m_inputR); lilv_instance_connect_port(pInstance, m_audioPortIndices[2], m_outputL); lilv_instance_connect_port(pInstance, m_audioPortIndices[3], m_outputR); - - lilv_instance_activate(pInstance); } return pState; }; From 41ef6b61c7ea7609470489277b5dc5ab341f7d03 Mon Sep 17 00:00:00 2001 From: Be Date: Sat, 14 Jul 2018 23:11:53 -0500 Subject: [PATCH 014/443] fix crash on shutdown when an LV2 effect was loaded The crash was introduced in when removing EffectChainManager in fded4f8d5b483681f19bbd0943baa806c8c8aad7 --- src/effects/effectsmanager.cpp | 12 ++++++++++-- src/preferences/dialog/.dlgprefeq.cpp.kate-swp | Bin 1424 -> 0 bytes 2 files changed, 10 insertions(+), 2 deletions(-) delete mode 100644 src/preferences/dialog/.dlgprefeq.cpp.kate-swp diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index abf58ef494ca..22d64f4fa4e4 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -50,8 +50,16 @@ EffectsManager::~EffectsManager() { // NOTE(Kshitij) : Use new functions for saving XML files // saveEffectChains(); - // This must be done here, since the engineRacks are deleted via - // the queue + + // The EffectChainSlots must be deleted before the EffectsBackends in case + // there is an LV2 effect currently loaded. + // ~LV2GroupState calls lilv_instance_free, which will segfault if called + // after ~LV2Backend calls lilv_world_free. + m_equalizerEffectChainSlots.clear(); + m_quickEffectChainSlots.clear(); + m_standardEffectChainSlots.clear(); + m_outputEffectChainSlot.clear(); + m_effectChainSlotsByGroup.clear(); processEffectsResponses(); m_effectsBackends.clear(); diff --git a/src/preferences/dialog/.dlgprefeq.cpp.kate-swp b/src/preferences/dialog/.dlgprefeq.cpp.kate-swp deleted file mode 100644 index 8689b2b631de1b459059b3c84c1663b8e036dbc7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1424 zcmciBO-~a+7{Ku<0)j7y2r8&J3TiQGq^O|Yj7wrjjk*WVrEHr`>Tca`CEmT8c=P2e z_!+$U0lawf;-~P){HHT{#)fcYlcxKdXP()4c}6KUv(+dQ9q%@}dNb`Lx_0NTQffB; z`|-z)U6(7Mn z;!&JL@hkJkcz8@m_fhF>vrTXRHJcrbHs(h2@p0Ue{ztJEPq?`MI-VQ~cf^x)&&9`Z zLwpZ}RC4Lh3#Zx#FpTbS?G!CYF8doJggKvt@;7B}+gXPZ+`792$^BfMoe;x;i zJCA!Z{sOLxFW_K5F5+N)mxkhtxGnjYaWEf^3yELBE7YPt;H$I*JF;Xv*UYnCsb9ur zk!J1dx?SY`?k!500^1<fjlqrCF)dsMSiEW!%Zj=lwU^Nnx`|s*?T9<|?%s zBb!g^00cwXFX;+ gJX!9Vko~L4X4vh#eQ@}{!m&61u&;J-mEBd}15!23!~g&Q From bddd3d4e90615ddf1408c72b0835e924d72a6682 Mon Sep 17 00:00:00 2001 From: Be Date: Sun, 15 Jul 2018 02:38:13 -0500 Subject: [PATCH 015/443] remove unused function parameter and use "override" where appropriate --- src/effects/builtin/autopaneffect.cpp | 3 +-- src/effects/builtin/autopaneffect.h | 6 +++--- src/effects/builtin/balanceeffect.cpp | 13 ++++++------- src/effects/builtin/balanceeffect.h | 16 ++++++++-------- src/effects/builtin/bessel4lvmixeqeffect.cpp | 13 ++++++------- src/effects/builtin/bessel4lvmixeqeffect.h | 17 ++++++++--------- src/effects/builtin/bessel8lvmixeqeffect.cpp | 13 ++++++------- src/effects/builtin/bessel8lvmixeqeffect.h | 15 +++++++-------- src/effects/builtin/biquadfullkilleqeffect.cpp | 2 -- src/effects/builtin/biquadfullkilleqeffect.h | 14 +++++++------- src/effects/builtin/bitcrushereffect.cpp | 13 ++++++------- src/effects/builtin/bitcrushereffect.h | 17 ++++++++--------- src/effects/builtin/echoeffect.cpp | 15 +++++++-------- src/effects/builtin/echoeffect.h | 14 +++++++------- src/effects/builtin/filtereffect.cpp | 13 ++++++------- src/effects/builtin/filtereffect.h | 16 ++++++++-------- src/effects/builtin/flangereffect.cpp | 13 ++++++------- src/effects/builtin/flangereffect.h | 15 +++++++-------- src/effects/builtin/graphiceqeffect.cpp | 13 ++++++------- src/effects/builtin/graphiceqeffect.h | 14 +++++++------- src/effects/builtin/linkwitzriley8eqeffect.cpp | 13 ++++++------- src/effects/builtin/linkwitzriley8eqeffect.h | 17 ++++++++--------- src/effects/builtin/loudnesscontoureffect.cpp | 2 -- src/effects/builtin/loudnesscontoureffect.h | 16 ++++++++-------- src/effects/builtin/metronomeeffect.cpp | 2 -- src/effects/builtin/metronomeeffect.h | 18 +++++++++--------- .../builtin/moogladder4filtereffect.cpp | 2 -- src/effects/builtin/moogladder4filtereffect.h | 17 ++++++++--------- src/effects/builtin/parametriceqeffect.cpp | 13 ++++++------- src/effects/builtin/parametriceqeffect.h | 17 ++++++++--------- src/effects/builtin/phasereffect.cpp | 14 ++++++-------- src/effects/builtin/phasereffect.h | 17 ++++++++--------- src/effects/builtin/reverbeffect.cpp | 13 ++++++------- src/effects/builtin/reverbeffect.h | 13 ++++++------- .../builtin/threebandbiquadeqeffect.cpp | 2 -- src/effects/builtin/threebandbiquadeqeffect.h | 17 ++++++++--------- src/effects/builtin/tremoloeffect.cpp | 14 ++++++-------- src/effects/builtin/tremoloeffect.h | 17 ++++++++--------- src/effects/effectprocessor.h | 10 +++------- src/effects/lv2/lv2effectprocessor.cpp | 12 ++++++------ src/effects/lv2/lv2effectprocessor.h | 13 +++++++------ 41 files changed, 237 insertions(+), 277 deletions(-) diff --git a/src/effects/builtin/autopaneffect.cpp b/src/effects/builtin/autopaneffect.cpp index 03e9eb6c16b9..a2a67c65ca17 100644 --- a/src/effects/builtin/autopaneffect.cpp +++ b/src/effects/builtin/autopaneffect.cpp @@ -88,12 +88,11 @@ AutoPanEffect::~AutoPanEffect() { } void AutoPanEffect::processChannel( - const ChannelHandle& handle, AutoPanGroupState* pGroupState, + AutoPanGroupState* pGroupState, const CSAMPLE* pInput, CSAMPLE* pOutput, const mixxx::EngineParameters& bufferParameters, const EffectEnableState enableState, const GroupFeatureState& groupFeatures) { - Q_UNUSED(handle); if (enableState == EffectEnableState::Disabled) { return; diff --git a/src/effects/builtin/autopaneffect.h b/src/effects/builtin/autopaneffect.h index 93cc3fff2a78..793f8522d2ea 100644 --- a/src/effects/builtin/autopaneffect.h +++ b/src/effects/builtin/autopaneffect.h @@ -86,14 +86,14 @@ class AutoPanEffect : public EffectProcessorImpl { static EffectManifestPointer getManifest(); void loadEngineEffectParameters( - const QMap& parameters); + const QMap& parameters) override; - void processChannel(const ChannelHandle& handle, + void processChannel( AutoPanGroupState* pState, const CSAMPLE* pInput, CSAMPLE* pOutput, const mixxx::EngineParameters& bufferParameters, const EffectEnableState enableState, - const GroupFeatureState& groupFeatures); + const GroupFeatureState& groupFeatures) override; double computeLawCoefficient(double position); diff --git a/src/effects/builtin/balanceeffect.cpp b/src/effects/builtin/balanceeffect.cpp index 808c483a5de7..cd437e30311f 100644 --- a/src/effects/builtin/balanceeffect.cpp +++ b/src/effects/builtin/balanceeffect.cpp @@ -106,13 +106,12 @@ void BalanceEffect::loadEngineEffectParameters( BalanceEffect::~BalanceEffect() { } -void BalanceEffect::processChannel(const ChannelHandle& handle, - BalanceGroupState* pGroupState, - const CSAMPLE* pInput, CSAMPLE* pOutput, - const mixxx::EngineParameters& bufferParameters, - const EffectEnableState enableState, - const GroupFeatureState& groupFeatures) { - Q_UNUSED(handle); +void BalanceEffect::processChannel( + BalanceGroupState* pGroupState, + const CSAMPLE* pInput, CSAMPLE* pOutput, + const mixxx::EngineParameters& bufferParameters, + const EffectEnableState enableState, + const GroupFeatureState& groupFeatures) { Q_UNUSED(groupFeatures); CSAMPLE_GAIN balance = 0; diff --git a/src/effects/builtin/balanceeffect.h b/src/effects/builtin/balanceeffect.h index 9ea9f81ac83e..6f56b4d09be8 100644 --- a/src/effects/builtin/balanceeffect.h +++ b/src/effects/builtin/balanceeffect.h @@ -36,14 +36,14 @@ class BalanceEffect : public EffectProcessorImpl { static EffectManifestPointer getManifest(); void loadEngineEffectParameters( - const QMap& parameters); - - void processChannel(const ChannelHandle& handle, - BalanceGroupState* pState, - const CSAMPLE* pInput, CSAMPLE* pOutput, - const mixxx::EngineParameters& bufferParameters, - const EffectEnableState enableState, - const GroupFeatureState& groupFeatures); + const QMap& parameters) override; + + void processChannel( + BalanceGroupState* pState, + const CSAMPLE* pInput, CSAMPLE* pOutput, + const mixxx::EngineParameters& bufferParameters, + const EffectEnableState enableState, + const GroupFeatureState& groupFeatures) override; private: diff --git a/src/effects/builtin/bessel4lvmixeqeffect.cpp b/src/effects/builtin/bessel4lvmixeqeffect.cpp index 969c6d1b51a3..d0e7973c04f3 100644 --- a/src/effects/builtin/bessel4lvmixeqeffect.cpp +++ b/src/effects/builtin/bessel4lvmixeqeffect.cpp @@ -45,13 +45,12 @@ Bessel4LVMixEQEffect::~Bessel4LVMixEQEffect() { delete m_pHiFreqCorner; } -void Bessel4LVMixEQEffect::processChannel(const ChannelHandle& handle, - Bessel4LVMixEQEffectGroupState* pState, - const CSAMPLE* pInput, CSAMPLE* pOutput, - const mixxx::EngineParameters& bufferParameters, - const EffectEnableState enableState, - const GroupFeatureState& groupFeatures) { - Q_UNUSED(handle); +void Bessel4LVMixEQEffect::processChannel( + Bessel4LVMixEQEffectGroupState* pState, + const CSAMPLE* pInput, CSAMPLE* pOutput, + const mixxx::EngineParameters& bufferParameters, + const EffectEnableState enableState, + const GroupFeatureState& groupFeatures) { Q_UNUSED(groupFeatures); if (enableState == EffectEnableState::Disabling) { diff --git a/src/effects/builtin/bessel4lvmixeqeffect.h b/src/effects/builtin/bessel4lvmixeqeffect.h index ab8cac43e6c4..86a1a7fdc599 100644 --- a/src/effects/builtin/bessel4lvmixeqeffect.h +++ b/src/effects/builtin/bessel4lvmixeqeffect.h @@ -31,15 +31,14 @@ class Bessel4LVMixEQEffect : public EffectProcessorImpl& parameters); - - // See effectprocessor.h - void processChannel(const ChannelHandle& handle, - Bessel4LVMixEQEffectGroupState* pState, - const CSAMPLE* pInput, CSAMPLE* pOutput, - const mixxx::EngineParameters& bufferParameters, - const EffectEnableState enableState, - const GroupFeatureState& groupFeatureState); + const QMap& parameters) override; + + void processChannel( + Bessel4LVMixEQEffectGroupState* pState, + const CSAMPLE* pInput, CSAMPLE* pOutput, + const mixxx::EngineParameters& bufferParameters, + const EffectEnableState enableState, + const GroupFeatureState& groupFeatureState) override; private: QString debugString() const { diff --git a/src/effects/builtin/bessel8lvmixeqeffect.cpp b/src/effects/builtin/bessel8lvmixeqeffect.cpp index ce803a93ad72..75ef2558398b 100644 --- a/src/effects/builtin/bessel8lvmixeqeffect.cpp +++ b/src/effects/builtin/bessel8lvmixeqeffect.cpp @@ -46,13 +46,12 @@ Bessel8LVMixEQEffect::~Bessel8LVMixEQEffect() { delete m_pHiFreqCorner; } -void Bessel8LVMixEQEffect::processChannel(const ChannelHandle& handle, - Bessel8LVMixEQEffectGroupState* pState, - const CSAMPLE* pInput, CSAMPLE* pOutput, - const mixxx::EngineParameters& bufferParameters, - const EffectEnableState enableState, - const GroupFeatureState& groupFeatures) { - Q_UNUSED(handle); +void Bessel8LVMixEQEffect::processChannel( + Bessel8LVMixEQEffectGroupState* pState, + const CSAMPLE* pInput, CSAMPLE* pOutput, + const mixxx::EngineParameters& bufferParameters, + const EffectEnableState enableState, + const GroupFeatureState& groupFeatures) { Q_UNUSED(groupFeatures); if (enableState == EffectEnableState::Disabling) { diff --git a/src/effects/builtin/bessel8lvmixeqeffect.h b/src/effects/builtin/bessel8lvmixeqeffect.h index d4954f02098b..382c52f86074 100644 --- a/src/effects/builtin/bessel8lvmixeqeffect.h +++ b/src/effects/builtin/bessel8lvmixeqeffect.h @@ -34,15 +34,14 @@ class Bessel8LVMixEQEffect : public EffectProcessorImpl& parameters); + const QMap& parameters) override; - // See effectprocessor.h - void processChannel(const ChannelHandle& handle, - Bessel8LVMixEQEffectGroupState* pState, - const CSAMPLE* pInput, CSAMPLE* pOutput, - const mixxx::EngineParameters& bufferParameters, - const EffectEnableState enableState, - const GroupFeatureState& groupFeatureState); + void processChannel( + Bessel8LVMixEQEffectGroupState* pState, + const CSAMPLE* pInput, CSAMPLE* pOutput, + const mixxx::EngineParameters& bufferParameters, + const EffectEnableState enableState, + const GroupFeatureState& groupFeatureState) override; private: QString debugString() const { diff --git a/src/effects/builtin/biquadfullkilleqeffect.cpp b/src/effects/builtin/biquadfullkilleqeffect.cpp index 0628ba8b312b..b1a3c9c30e1b 100644 --- a/src/effects/builtin/biquadfullkilleqeffect.cpp +++ b/src/effects/builtin/biquadfullkilleqeffect.cpp @@ -154,14 +154,12 @@ void BiquadFullKillEQEffect::loadEngineEffectParameters( // } void BiquadFullKillEQEffect::processChannel( - const ChannelHandle& handle, BiquadFullKillEQEffectGroupState* pState, const CSAMPLE* pInput, CSAMPLE* pOutput, const mixxx::EngineParameters& bufferParameters, const EffectEnableState enableState, const GroupFeatureState& groupFeatures) { - Q_UNUSED(handle); Q_UNUSED(groupFeatures); if (pState->m_oldSampleRate != bufferParameters.sampleRate() || diff --git a/src/effects/builtin/biquadfullkilleqeffect.h b/src/effects/builtin/biquadfullkilleqeffect.h index 7bff2cb2e722..57362f3d6e82 100644 --- a/src/effects/builtin/biquadfullkilleqeffect.h +++ b/src/effects/builtin/biquadfullkilleqeffect.h @@ -67,14 +67,14 @@ class BiquadFullKillEQEffect : public EffectProcessorImpl& parameters) override; - void setFilters(int sampleRate, double lowFreqCorner, double highFreqCorner); + void processChannel( + BiquadFullKillEQEffectGroupState* pState, + const CSAMPLE* pInput, CSAMPLE *pOutput, + const mixxx::EngineParameters& bufferParameters, + const EffectEnableState enableState, + const GroupFeatureState& groupFeatureState) override; - void processChannel(const ChannelHandle& handle, - BiquadFullKillEQEffectGroupState* pState, - const CSAMPLE* pInput, CSAMPLE *pOutput, - const mixxx::EngineParameters& bufferParameters, - const EffectEnableState enableState, - const GroupFeatureState& groupFeatureState) override; + void setFilters(int sampleRate, double lowFreqCorner, double highFreqCorner); private: BiquadFullKillEQEffect(const BiquadFullKillEQEffect&) = delete; diff --git a/src/effects/builtin/bitcrushereffect.cpp b/src/effects/builtin/bitcrushereffect.cpp index a1a371717540..ec4266b4e8fb 100644 --- a/src/effects/builtin/bitcrushereffect.cpp +++ b/src/effects/builtin/bitcrushereffect.cpp @@ -67,13 +67,12 @@ BitCrusherEffect::~BitCrusherEffect() { //qDebug() << debugString() << "destroyed"; } -void BitCrusherEffect::processChannel(const ChannelHandle& handle, - BitCrusherGroupState* pState, - const CSAMPLE* pInput, CSAMPLE* pOutput, - const mixxx::EngineParameters& bufferParameters, - const EffectEnableState enableState, - const GroupFeatureState& groupFeatures) { - Q_UNUSED(handle); +void BitCrusherEffect::processChannel( + BitCrusherGroupState* pState, + const CSAMPLE* pInput, CSAMPLE* pOutput, + const mixxx::EngineParameters& bufferParameters, + const EffectEnableState enableState, + const GroupFeatureState& groupFeatures) { Q_UNUSED(groupFeatures); Q_UNUSED(enableState); // no need to ramp, it is just a bitcrusher ;-) diff --git a/src/effects/builtin/bitcrushereffect.h b/src/effects/builtin/bitcrushereffect.h index 4007b2520a19..5a744b9dc887 100644 --- a/src/effects/builtin/bitcrushereffect.h +++ b/src/effects/builtin/bitcrushereffect.h @@ -31,15 +31,14 @@ class BitCrusherEffect : public EffectProcessorImpl { static EffectManifestPointer getManifest(); void loadEngineEffectParameters( - const QMap& parameters); - - // See effectprocessor.h - void processChannel(const ChannelHandle& handle, - BitCrusherGroupState* pState, - const CSAMPLE* pInput, CSAMPLE *pOutput, - const mixxx::EngineParameters& bufferParameters, - const EffectEnableState enableState, - const GroupFeatureState& groupFeatureState); + const QMap& parameters) override; + + void processChannel( + BitCrusherGroupState* pState, + const CSAMPLE* pInput, CSAMPLE *pOutput, + const mixxx::EngineParameters& bufferParameters, + const EffectEnableState enableState, + const GroupFeatureState& groupFeatureState) override; private: QString debugString() const { diff --git a/src/effects/builtin/echoeffect.cpp b/src/effects/builtin/echoeffect.cpp index c43913ac172a..cc87c4cb4c3a 100644 --- a/src/effects/builtin/echoeffect.cpp +++ b/src/effects/builtin/echoeffect.cpp @@ -135,14 +135,13 @@ void EchoEffect::loadEngineEffectParameters( m_pTripletParameter = parameters.value("triplet"); } -void EchoEffect::processChannel(const ChannelHandle& handle, EchoGroupState* pGroupState, - const CSAMPLE* pInput, - CSAMPLE* pOutput, - const mixxx::EngineParameters& bufferParameters, - const EffectEnableState enableState, - const GroupFeatureState& groupFeatures) { - Q_UNUSED(handle); - +void EchoEffect::processChannel( + EchoGroupState* pGroupState, + const CSAMPLE* pInput, + CSAMPLE* pOutput, + const mixxx::EngineParameters& bufferParameters, + const EffectEnableState enableState, + const GroupFeatureState& groupFeatures) { EchoGroupState& gs = *pGroupState; // The minimum of the parameter is zero so the exact center of the knob is 1 beat. double period = m_pDelayParameter->value(); diff --git a/src/effects/builtin/echoeffect.h b/src/effects/builtin/echoeffect.h index a4569a090322..cd3ea5d813b8 100644 --- a/src/effects/builtin/echoeffect.h +++ b/src/effects/builtin/echoeffect.h @@ -54,14 +54,14 @@ class EchoEffect : public EffectProcessorImpl { static EffectManifestPointer getManifest(); void loadEngineEffectParameters( - const QMap& parameters); + const QMap& parameters) override; - void processChannel(const ChannelHandle& handle, - EchoGroupState* pState, - const CSAMPLE* pInput, CSAMPLE* pOutput, - const mixxx::EngineParameters& bufferParameters, - const EffectEnableState enableState, - const GroupFeatureState& groupFeatures); + void processChannel( + EchoGroupState* pState, + const CSAMPLE* pInput, CSAMPLE* pOutput, + const mixxx::EngineParameters& bufferParameters, + const EffectEnableState enableState, + const GroupFeatureState& groupFeatures) override; private: QString debugString() const { diff --git a/src/effects/builtin/filtereffect.cpp b/src/effects/builtin/filtereffect.cpp index 5a3c983841e1..ac7801b5f2ff 100644 --- a/src/effects/builtin/filtereffect.cpp +++ b/src/effects/builtin/filtereffect.cpp @@ -96,13 +96,12 @@ FilterEffect::~FilterEffect() { //qDebug() << debugString() << "destroyed"; } -void FilterEffect::processChannel(const ChannelHandle& handle, - FilterGroupState* pState, - const CSAMPLE* pInput, CSAMPLE* pOutput, - const mixxx::EngineParameters& bufferParameters, - const EffectEnableState enableState, - const GroupFeatureState& groupFeatures) { - Q_UNUSED(handle); +void FilterEffect::processChannel( + FilterGroupState* pState, + const CSAMPLE* pInput, CSAMPLE* pOutput, + const mixxx::EngineParameters& bufferParameters, + const EffectEnableState enableState, + const GroupFeatureState& groupFeatures) { Q_UNUSED(groupFeatures); double hpf; diff --git a/src/effects/builtin/filtereffect.h b/src/effects/builtin/filtereffect.h index c4ebf1490a90..58234de0950b 100644 --- a/src/effects/builtin/filtereffect.h +++ b/src/effects/builtin/filtereffect.h @@ -36,14 +36,14 @@ class FilterEffect : public EffectProcessorImpl { static EffectManifestPointer getManifest(); void loadEngineEffectParameters( - const QMap& parameters); - - void processChannel(const ChannelHandle& handle, - FilterGroupState* pState, - const CSAMPLE* pInput, CSAMPLE *pOutput, - const mixxx::EngineParameters& bufferParameters, - const EffectEnableState enableState, - const GroupFeatureState& groupFeatures); + const QMap& parameters) override; + + void processChannel( + FilterGroupState* pState, + const CSAMPLE* pInput, CSAMPLE *pOutput, + const mixxx::EngineParameters& bufferParameters, + const EffectEnableState enableState, + const GroupFeatureState& groupFeatures) override; private: QString debugString() const { diff --git a/src/effects/builtin/flangereffect.cpp b/src/effects/builtin/flangereffect.cpp index 3d1bf4052a13..3601a5378295 100644 --- a/src/effects/builtin/flangereffect.cpp +++ b/src/effects/builtin/flangereffect.cpp @@ -130,13 +130,12 @@ FlangerEffect::~FlangerEffect() { //qDebug() << debugString() << "destroyed"; } -void FlangerEffect::processChannel(const ChannelHandle& handle, - FlangerGroupState* pState, - const CSAMPLE* pInput, CSAMPLE* pOutput, - const mixxx::EngineParameters& bufferParameters, - const EffectEnableState enableState, - const GroupFeatureState& groupFeatures) { - Q_UNUSED(handle); +void FlangerEffect::processChannel( + FlangerGroupState* pState, + const CSAMPLE* pInput, CSAMPLE* pOutput, + const mixxx::EngineParameters& bufferParameters, + const EffectEnableState enableState, + const GroupFeatureState& groupFeatures) { double lfoPeriodParameter = m_pSpeedParameter->value(); double lfoPeriodFrames; diff --git a/src/effects/builtin/flangereffect.h b/src/effects/builtin/flangereffect.h index d05c0f4db61e..28d65f38b46e 100644 --- a/src/effects/builtin/flangereffect.h +++ b/src/effects/builtin/flangereffect.h @@ -56,15 +56,14 @@ class FlangerEffect : public EffectProcessorImpl { static EffectManifestPointer getManifest(); void loadEngineEffectParameters( - const QMap& parameters); + const QMap& parameters) override; - // See effectprocessor.h - void processChannel(const ChannelHandle& handle, - FlangerGroupState* pState, - const CSAMPLE* pInput, CSAMPLE* pOutput, - const mixxx::EngineParameters& bufferParameters, - const EffectEnableState enableState, - const GroupFeatureState& groupFeatures); + void processChannel( + FlangerGroupState* pState, + const CSAMPLE* pInput, CSAMPLE* pOutput, + const mixxx::EngineParameters& bufferParameters, + const EffectEnableState enableState, + const GroupFeatureState& groupFeatures) override; private: QString debugString() const { diff --git a/src/effects/builtin/graphiceqeffect.cpp b/src/effects/builtin/graphiceqeffect.cpp index cfda32d6c18a..a06b4484462d 100644 --- a/src/effects/builtin/graphiceqeffect.cpp +++ b/src/effects/builtin/graphiceqeffect.cpp @@ -145,13 +145,12 @@ void GraphicEQEffect::loadEngineEffectParameters( GraphicEQEffect::~GraphicEQEffect() { } -void GraphicEQEffect::processChannel(const ChannelHandle& handle, - GraphicEQEffectGroupState* pState, - const CSAMPLE* pInput, CSAMPLE* pOutput, - const mixxx::EngineParameters& bufferParameters, - const EffectEnableState enableState, - const GroupFeatureState& groupFeatures) { - Q_UNUSED(handle); +void GraphicEQEffect::processChannel( + GraphicEQEffectGroupState* pState, + const CSAMPLE* pInput, CSAMPLE* pOutput, + const mixxx::EngineParameters& bufferParameters, + const EffectEnableState enableState, + const GroupFeatureState& groupFeatures) { Q_UNUSED(groupFeatures); // If the sample rate has changed, initialize the filters using the new diff --git a/src/effects/builtin/graphiceqeffect.h b/src/effects/builtin/graphiceqeffect.h index c5dd8fad44df..35b9adf89536 100644 --- a/src/effects/builtin/graphiceqeffect.h +++ b/src/effects/builtin/graphiceqeffect.h @@ -39,14 +39,14 @@ class GraphicEQEffect : public EffectProcessorImpl { static EffectManifestPointer getManifest(); void loadEngineEffectParameters( - const QMap& parameters); + const QMap& parameters) override; - void processChannel(const ChannelHandle& handle, - GraphicEQEffectGroupState* pState, - const CSAMPLE* pInput, CSAMPLE *pOutput, - const mixxx::EngineParameters& bufferParameters, - const EffectEnableState enableState, - const GroupFeatureState& groupFeatureState); + void processChannel( + GraphicEQEffectGroupState* pState, + const CSAMPLE* pInput, CSAMPLE *pOutput, + const mixxx::EngineParameters& bufferParameters, + const EffectEnableState enableState, + const GroupFeatureState& groupFeatureState) override; private: QString debugString() const { diff --git a/src/effects/builtin/linkwitzriley8eqeffect.cpp b/src/effects/builtin/linkwitzriley8eqeffect.cpp index 57c13fd3b983..3f7da0278902 100644 --- a/src/effects/builtin/linkwitzriley8eqeffect.cpp +++ b/src/effects/builtin/linkwitzriley8eqeffect.cpp @@ -87,13 +87,12 @@ LinkwitzRiley8EQEffect::~LinkwitzRiley8EQEffect() { delete m_pHiFreqCorner; } -void LinkwitzRiley8EQEffect::processChannel(const ChannelHandle& handle, - LinkwitzRiley8EQEffectGroupState* pState, - const CSAMPLE* pInput, CSAMPLE* pOutput, - const mixxx::EngineParameters& bufferParameters, - const EffectEnableState enableState, - const GroupFeatureState& groupFeatures) { - Q_UNUSED(handle); +void LinkwitzRiley8EQEffect::processChannel( + LinkwitzRiley8EQEffectGroupState* pState, + const CSAMPLE* pInput, CSAMPLE* pOutput, + const mixxx::EngineParameters& bufferParameters, + const EffectEnableState enableState, + const GroupFeatureState& groupFeatures) { Q_UNUSED(groupFeatures); float fLow = 0.f, fMid = 0.f, fHigh = 0.f; diff --git a/src/effects/builtin/linkwitzriley8eqeffect.h b/src/effects/builtin/linkwitzriley8eqeffect.h index 6f9cf57d119c..b327c7410e77 100644 --- a/src/effects/builtin/linkwitzriley8eqeffect.h +++ b/src/effects/builtin/linkwitzriley8eqeffect.h @@ -47,15 +47,14 @@ class LinkwitzRiley8EQEffect : public EffectProcessorImpl& parameters); - - // See effectprocessor.h - void processChannel(const ChannelHandle& handle, - LinkwitzRiley8EQEffectGroupState* pState, - const CSAMPLE* pInput, CSAMPLE *pOutput, - const mixxx::EngineParameters& bufferParameters, - const EffectEnableState enableState, - const GroupFeatureState& groupFeatureState); + const QMap& parameters) override; + + void processChannel( + LinkwitzRiley8EQEffectGroupState* pState, + const CSAMPLE* pInput, CSAMPLE *pOutput, + const mixxx::EngineParameters& bufferParameters, + const EffectEnableState enableState, + const GroupFeatureState& groupFeatureState) override; private: QString debugString() const { diff --git a/src/effects/builtin/loudnesscontoureffect.cpp b/src/effects/builtin/loudnesscontoureffect.cpp index 2241a0c67b51..6ae89bf0fc59 100644 --- a/src/effects/builtin/loudnesscontoureffect.cpp +++ b/src/effects/builtin/loudnesscontoureffect.cpp @@ -104,14 +104,12 @@ LoudnessContourEffect::~LoudnessContourEffect() { } void LoudnessContourEffect::processChannel( - const ChannelHandle& handle, LoudnessContourEffectGroupState* pState, const CSAMPLE* pInput, CSAMPLE* pOutput, const mixxx::EngineParameters& bufferParameters, const EffectEnableState enableState, const GroupFeatureState& groupFeatures) { - Q_UNUSED(handle); Q_UNUSED(groupFeatures); double filterGainDb = pState->m_oldFilterGainDb; diff --git a/src/effects/builtin/loudnesscontoureffect.h b/src/effects/builtin/loudnesscontoureffect.h index 1df8471a37aa..534cd7714616 100644 --- a/src/effects/builtin/loudnesscontoureffect.h +++ b/src/effects/builtin/loudnesscontoureffect.h @@ -40,16 +40,16 @@ class LoudnessContourEffect static EffectManifestPointer getManifest(); void loadEngineEffectParameters( - const QMap& parameters); + const QMap& parameters) override; - void setFilters(int sampleRate); + void processChannel( + LoudnessContourEffectGroupState* pState, + const CSAMPLE* pInput, CSAMPLE *pOutput, + const mixxx::EngineParameters& bufferParameters, + const EffectEnableState enableState, + const GroupFeatureState& groupFeatureState) override; - void processChannel(const ChannelHandle& handle, - LoudnessContourEffectGroupState* pState, - const CSAMPLE* pInput, CSAMPLE *pOutput, - const mixxx::EngineParameters& bufferParameters, - const EffectEnableState enableState, - const GroupFeatureState& groupFeatureState); + void setFilters(int sampleRate); private: LoudnessContourEffect(const LoudnessContourEffect&) = delete; diff --git a/src/effects/builtin/metronomeeffect.cpp b/src/effects/builtin/metronomeeffect.cpp index f2f45db83327..c872a871e06d 100644 --- a/src/effects/builtin/metronomeeffect.cpp +++ b/src/effects/builtin/metronomeeffect.cpp @@ -62,13 +62,11 @@ MetronomeEffect::~MetronomeEffect() { } void MetronomeEffect::processChannel( - const ChannelHandle& handle, MetronomeGroupState* pGroupState, const CSAMPLE* pInput, CSAMPLE* pOutput, const mixxx::EngineParameters& bufferParameters, const EffectEnableState enableState, const GroupFeatureState& groupFeatures) { - Q_UNUSED(handle); Q_UNUSED(pInput); MetronomeGroupState* gs = pGroupState; diff --git a/src/effects/builtin/metronomeeffect.h b/src/effects/builtin/metronomeeffect.h index 050edcc72bd1..d88f44e2b8b6 100644 --- a/src/effects/builtin/metronomeeffect.h +++ b/src/effects/builtin/metronomeeffect.h @@ -34,15 +34,15 @@ class MetronomeEffect : public EffectProcessorImpl { static EffectManifestPointer getManifest(); void loadEngineEffectParameters( - const QMap& parameters); - - // See effectprocessor.h - void processChannel(const ChannelHandle& handle, - MetronomeGroupState* pState, - const CSAMPLE* pInput, CSAMPLE* pOutput, - const mixxx::EngineParameters& bufferParameters, - const EffectEnableState enableState, - const GroupFeatureState& groupFeatures); + const QMap& parameters) override; + + void processChannel( + MetronomeGroupState* pState, + const CSAMPLE* pInput, CSAMPLE* pOutput, + const mixxx::EngineParameters& bufferParameters, + const EffectEnableState enableState, + const GroupFeatureState& groupFeatures) override; + private: EngineEffectParameterPointer m_pBpmParameter; EngineEffectParameterPointer m_pSyncParameter; diff --git a/src/effects/builtin/moogladder4filtereffect.cpp b/src/effects/builtin/moogladder4filtereffect.cpp index fe6f515f9542..6e8887da9648 100644 --- a/src/effects/builtin/moogladder4filtereffect.cpp +++ b/src/effects/builtin/moogladder4filtereffect.cpp @@ -98,13 +98,11 @@ MoogLadder4FilterEffect::~MoogLadder4FilterEffect() { } void MoogLadder4FilterEffect::processChannel( - const ChannelHandle& handle, MoogLadder4FilterGroupState* pState, const CSAMPLE* pInput, CSAMPLE* pOutput, const mixxx::EngineParameters& bufferParameters, const EffectEnableState enableState, const GroupFeatureState& groupFeatures) { - Q_UNUSED(handle); Q_UNUSED(groupFeatures); double resonance = m_pResonance->value(); diff --git a/src/effects/builtin/moogladder4filtereffect.h b/src/effects/builtin/moogladder4filtereffect.h index f27eab4709ca..401234a6ea38 100644 --- a/src/effects/builtin/moogladder4filtereffect.h +++ b/src/effects/builtin/moogladder4filtereffect.h @@ -35,15 +35,14 @@ class MoogLadder4FilterEffect : public EffectProcessorImpl& parameters); - - // See effectprocessor.h - void processChannel(const ChannelHandle& handle, - MoogLadder4FilterGroupState* pState, - const CSAMPLE* pInput, CSAMPLE *pOutput, - const mixxx::EngineParameters& bufferParameters, - const EffectEnableState enableState, - const GroupFeatureState& groupFeatures); + const QMap& parameters) override; + + void processChannel( + MoogLadder4FilterGroupState* pState, + const CSAMPLE* pInput, CSAMPLE *pOutput, + const mixxx::EngineParameters& bufferParameters, + const EffectEnableState enableState, + const GroupFeatureState& groupFeatures) override; private: QString debugString() const { diff --git a/src/effects/builtin/parametriceqeffect.cpp b/src/effects/builtin/parametriceqeffect.cpp index d8df6f5713a9..683df597757d 100644 --- a/src/effects/builtin/parametriceqeffect.cpp +++ b/src/effects/builtin/parametriceqeffect.cpp @@ -156,13 +156,12 @@ void ParametricEQEffect::loadEngineEffectParameters( ParametricEQEffect::~ParametricEQEffect() { } -void ParametricEQEffect::processChannel(const ChannelHandle& handle, - ParametricEQEffectGroupState* pState, - const CSAMPLE* pInput, CSAMPLE* pOutput, - const mixxx::EngineParameters& bufferParameters, - const EffectEnableState enableState, - const GroupFeatureState& groupFeatures) { - Q_UNUSED(handle); +void ParametricEQEffect::processChannel( + ParametricEQEffectGroupState* pState, + const CSAMPLE* pInput, CSAMPLE* pOutput, + const mixxx::EngineParameters& bufferParameters, + const EffectEnableState enableState, + const GroupFeatureState& groupFeatures) { Q_UNUSED(groupFeatures); // If the sample rate has changed, initialize the filters using the new diff --git a/src/effects/builtin/parametriceqeffect.h b/src/effects/builtin/parametriceqeffect.h index 9ff469aae94d..c3dae472ea25 100644 --- a/src/effects/builtin/parametriceqeffect.h +++ b/src/effects/builtin/parametriceqeffect.h @@ -46,15 +46,14 @@ class ParametricEQEffect : public EffectProcessorImpl& parameters); - - // See effectprocessor.h - void processChannel(const ChannelHandle& handle, - ParametricEQEffectGroupState* pState, - const CSAMPLE* pInput, CSAMPLE *pOutput, - const mixxx::EngineParameters& bufferParameters, - const EffectEnableState enableState, - const GroupFeatureState& groupFeatureState); + const QMap& parameters) override; + + void processChannel( + ParametricEQEffectGroupState* pState, + const CSAMPLE* pInput, CSAMPLE *pOutput, + const mixxx::EngineParameters& bufferParameters, + const EffectEnableState enableState, + const GroupFeatureState& groupFeatureState) override; private: QString debugString() const { diff --git a/src/effects/builtin/phasereffect.cpp b/src/effects/builtin/phasereffect.cpp index 956ef8dbf428..d4559a25f76d 100644 --- a/src/effects/builtin/phasereffect.cpp +++ b/src/effects/builtin/phasereffect.cpp @@ -136,14 +136,12 @@ PhaserEffect::~PhaserEffect() { //qDebug() << debugString() << "destroyed"; } -void PhaserEffect::processChannel(const ChannelHandle& handle, - PhaserGroupState* pState, - const CSAMPLE* pInput, CSAMPLE* pOutput, - const mixxx::EngineParameters& bufferParameters, - const EffectEnableState enableState, - const GroupFeatureState& groupFeatures) { - Q_UNUSED(handle); - +void PhaserEffect::processChannel( + PhaserGroupState* pState, + const CSAMPLE* pInput, CSAMPLE* pOutput, + const mixxx::EngineParameters& bufferParameters, + const EffectEnableState enableState, + const GroupFeatureState& groupFeatures) { if (enableState == EffectEnableState::Enabling) { pState->clear(); } diff --git a/src/effects/builtin/phasereffect.h b/src/effects/builtin/phasereffect.h index 103834343832..ea9cbdedcfbd 100644 --- a/src/effects/builtin/phasereffect.h +++ b/src/effects/builtin/phasereffect.h @@ -48,15 +48,14 @@ class PhaserEffect : public EffectProcessorImpl { static EffectManifestPointer getManifest(); void loadEngineEffectParameters( - const QMap& parameters); - - // See effectprocessor.h - void processChannel(const ChannelHandle& handle, - PhaserGroupState* pState, - const CSAMPLE* pInput, CSAMPLE* pOutput, - const mixxx::EngineParameters& bufferParameters, - const EffectEnableState enableState, - const GroupFeatureState& groupFeatures); + const QMap& parameters) override; + + void processChannel( + PhaserGroupState* pState, + const CSAMPLE* pInput, CSAMPLE* pOutput, + const mixxx::EngineParameters& bufferParameters, + const EffectEnableState enableState, + const GroupFeatureState& groupFeatures); private: QString debugString() const { diff --git a/src/effects/builtin/reverbeffect.cpp b/src/effects/builtin/reverbeffect.cpp index 61982a65b42f..3a1a73d3a8b1 100644 --- a/src/effects/builtin/reverbeffect.cpp +++ b/src/effects/builtin/reverbeffect.cpp @@ -92,13 +92,12 @@ ReverbEffect::~ReverbEffect() { //qDebug() << debugString() << "destroyed"; } -void ReverbEffect::processChannel(const ChannelHandle& handle, - ReverbGroupState* pState, - const CSAMPLE* pInput, CSAMPLE* pOutput, - const mixxx::EngineParameters& bufferParameters, - const EffectEnableState enableState, - const GroupFeatureState& groupFeatures) { - Q_UNUSED(handle); +void ReverbEffect::processChannel( + ReverbGroupState* pState, + const CSAMPLE* pInput, CSAMPLE* pOutput, + const mixxx::EngineParameters& bufferParameters, + const EffectEnableState enableState, + const GroupFeatureState& groupFeatures) { Q_UNUSED(groupFeatures); const auto decay = m_pDecayParameter->value(); diff --git a/src/effects/builtin/reverbeffect.h b/src/effects/builtin/reverbeffect.h index 0a51860fc82b..4f6ce44b8d19 100644 --- a/src/effects/builtin/reverbeffect.h +++ b/src/effects/builtin/reverbeffect.h @@ -44,13 +44,12 @@ class ReverbEffect : public EffectProcessorImpl { void loadEngineEffectParameters( const QMap& parameters); - // See effectprocessor.h - void processChannel(const ChannelHandle& handle, - ReverbGroupState* pState, - const CSAMPLE* pInput, CSAMPLE* pOutput, - const mixxx::EngineParameters& bufferParameters, - const EffectEnableState enableState, - const GroupFeatureState& groupFeatures); + void processChannel( + ReverbGroupState* pState, + const CSAMPLE* pInput, CSAMPLE* pOutput, + const mixxx::EngineParameters& bufferParameters, + const EffectEnableState enableState, + const GroupFeatureState& groupFeatures) override; private: QString debugString() const { diff --git a/src/effects/builtin/threebandbiquadeqeffect.cpp b/src/effects/builtin/threebandbiquadeqeffect.cpp index 5bfd2c67b816..d8eb9c95c996 100644 --- a/src/effects/builtin/threebandbiquadeqeffect.cpp +++ b/src/effects/builtin/threebandbiquadeqeffect.cpp @@ -143,14 +143,12 @@ ThreeBandBiquadEQEffect::~ThreeBandBiquadEQEffect() { } void ThreeBandBiquadEQEffect::processChannel( - const ChannelHandle& handle, ThreeBandBiquadEQEffectGroupState* pState, const CSAMPLE* pInput, CSAMPLE* pOutput, const mixxx::EngineParameters& bufferParameters, const EffectEnableState enableState, const GroupFeatureState& groupFeatures) { - Q_UNUSED(handle); Q_UNUSED(groupFeatures); if (pState->m_oldSampleRate != bufferParameters.sampleRate() || diff --git a/src/effects/builtin/threebandbiquadeqeffect.h b/src/effects/builtin/threebandbiquadeqeffect.h index b9ef27091442..66c2826eecba 100644 --- a/src/effects/builtin/threebandbiquadeqeffect.h +++ b/src/effects/builtin/threebandbiquadeqeffect.h @@ -50,17 +50,16 @@ class ThreeBandBiquadEQEffect : public EffectProcessorImpl& parameters); + const QMap& parameters) override; - void setFilters(int sampleRate, double lowFreqCorner, double highFreqCorner); + void processChannel( + ThreeBandBiquadEQEffectGroupState* pState, + const CSAMPLE* pInput, CSAMPLE *pOutput, + const mixxx::EngineParameters& bufferParameters, + const EffectEnableState enableState, + const GroupFeatureState& groupFeatureState) override; - // See effectprocessor.h - void processChannel(const ChannelHandle& handle, - ThreeBandBiquadEQEffectGroupState* pState, - const CSAMPLE* pInput, CSAMPLE *pOutput, - const mixxx::EngineParameters& bufferParameters, - const EffectEnableState enableState, - const GroupFeatureState& groupFeatureState); + void setFilters(int sampleRate, double lowFreqCorner, double highFreqCorner); private: ThreeBandBiquadEQEffect(const ThreeBandBiquadEQEffect&) = delete; diff --git a/src/effects/builtin/tremoloeffect.cpp b/src/effects/builtin/tremoloeffect.cpp index afb4cfff1155..622573eb80ba 100644 --- a/src/effects/builtin/tremoloeffect.cpp +++ b/src/effects/builtin/tremoloeffect.cpp @@ -140,14 +140,12 @@ void TremoloEffect::loadEngineEffectParameters( m_pTripletParameter = parameters.value("triplet"); } -void TremoloEffect::processChannel(const ChannelHandle& handle, - TremoloState* pState, - const CSAMPLE* pInput, CSAMPLE* pOutput, - const mixxx::EngineParameters& bufferParameters, - const EffectEnableState enableState, - const GroupFeatureState& groupFeatures) { - Q_UNUSED(handle); - +void TremoloEffect::processChannel( + TremoloState* pState, + const CSAMPLE* pInput, CSAMPLE* pOutput, + const mixxx::EngineParameters& bufferParameters, + const EffectEnableState enableState, + const GroupFeatureState& groupFeatures) { const double width = m_pWidthParameter->value(); const double smooth = m_pWaveformParameter->value(); const double depth = m_pDepthParameter->value(); diff --git a/src/effects/builtin/tremoloeffect.h b/src/effects/builtin/tremoloeffect.h index 5c6cb4f11fa6..81ac103533b0 100644 --- a/src/effects/builtin/tremoloeffect.h +++ b/src/effects/builtin/tremoloeffect.h @@ -28,15 +28,14 @@ class TremoloEffect : public EffectProcessorImpl { static EffectManifestPointer getManifest(); void loadEngineEffectParameters( - const QMap& parameters); - - // See effectprocessor.h - void processChannel(const ChannelHandle& handle, - TremoloState* pState, - const CSAMPLE* pInput, CSAMPLE* pOutput, - const mixxx::EngineParameters& bufferParameters, - const EffectEnableState enableState, - const GroupFeatureState& groupFeatures); + const QMap& parameters) override; + + void processChannel( + TremoloState* pState, + const CSAMPLE* pInput, CSAMPLE* pOutput, + const mixxx::EngineParameters& bufferParameters, + const EffectEnableState enableState, + const GroupFeatureState& groupFeatures) override; private: QString debugString() const { diff --git a/src/effects/effectprocessor.h b/src/effects/effectprocessor.h index 2a36b4fdc17f..946f76052a51 100644 --- a/src/effects/effectprocessor.h +++ b/src/effects/effectprocessor.h @@ -125,11 +125,7 @@ class EffectProcessorImpl : public EffectProcessor { // static EffectManifest getManifest(); // This is the only non-static method that subclasses need to implement. - // TODO(Be): remove ChannelHandle& argument? No (built-in) effects use it. Why should - // effects be concerned with the ChannelHandle& when process() takes care of giving - // it the appropriate ChannelStateHolder? - virtual void processChannel(const ChannelHandle& handle, - EffectSpecificState* channelState, + virtual void processChannel(EffectSpecificState* channelState, const CSAMPLE* pInput, CSAMPLE* pOutput, const mixxx::EngineParameters& bufferParameters, const EffectEnableState enableState, @@ -152,8 +148,8 @@ class EffectProcessorImpl : public EffectProcessor { pState = createSpecificState(bufferParameters); m_channelStateMatrix[inputHandle][outputHandle] = pState; } - processChannel(inputHandle, pState, pInput, pOutput, bufferParameters, - enableState, groupFeatures); + processChannel(pState, pInput, pOutput, + bufferParameters, enableState, groupFeatures); } void initialize(const QSet& activeInputChannels, diff --git a/src/effects/lv2/lv2effectprocessor.cpp b/src/effects/lv2/lv2effectprocessor.cpp index 33bf1364f8cb..e9d39ad3d56c 100644 --- a/src/effects/lv2/lv2effectprocessor.cpp +++ b/src/effects/lv2/lv2effectprocessor.cpp @@ -39,12 +39,12 @@ LV2EffectProcessor::~LV2EffectProcessor() { delete[] m_LV2parameters; } -void LV2EffectProcessor::processChannel(const ChannelHandle& handle, - LV2EffectGroupState* channelState, - const CSAMPLE* pInput, CSAMPLE* pOutput, - const mixxx::EngineParameters& bufferParameters, - const EffectEnableState enableState, - const GroupFeatureState& groupFeatures) { +void LV2EffectProcessor::processChannel( + LV2EffectGroupState* channelState, + const CSAMPLE* pInput, CSAMPLE* pOutput, + const mixxx::EngineParameters& bufferParameters, + const EffectEnableState enableState, + const GroupFeatureState& groupFeatures) { Q_UNUSED(groupFeatures); for (int i = 0; i < m_engineEffectParameters.size(); i++) { diff --git a/src/effects/lv2/lv2effectprocessor.h b/src/effects/lv2/lv2effectprocessor.h index 96b971dc6b6d..923546fa8a8f 100644 --- a/src/effects/lv2/lv2effectprocessor.h +++ b/src/effects/lv2/lv2effectprocessor.h @@ -42,12 +42,13 @@ class LV2EffectProcessor final : public EffectProcessorImpl void loadEngineEffectParameters( const QMap& parameters) override; - void processChannel(const ChannelHandle& handle, - LV2EffectGroupState* channelState, - const CSAMPLE* pInput, CSAMPLE* pOutput, - const mixxx::EngineParameters& bufferParameters, - const EffectEnableState enableState, - const GroupFeatureState& groupFeatures) override; + void processChannel( + LV2EffectGroupState* channelState, + const CSAMPLE* pInput, CSAMPLE* pOutput, + const mixxx::EngineParameters& bufferParameters, + const EffectEnableState enableState, + const GroupFeatureState& groupFeatures) override; + private: LV2EffectGroupState* createSpecificState( const mixxx::EngineParameters& bufferParameters) override; From aa4e1d308768ff699b34aa9cfd93d814ebe2d660 Mon Sep 17 00:00:00 2001 From: Be Date: Tue, 17 Jul 2018 13:30:18 -0500 Subject: [PATCH 016/443] use EffectManifests instead of QString IDs to identify effects Effect ID strings are only guaranteed to be unique for one EffectsBackend. Using only the ID strings to identify effects creates the possibility of a name collision between different effect types from different EffectsBackends. EffectManifests contain both the ID string and the EffectBackendType so they uniquely identify an effect type. This refactoring forced a big cleanup of DlgPrefEq. Lots of duplicate code was removed from that class, but there is still tight coupling between DlgPrefEq and EffectChainSlot + EffectSlot for the master equalizer. (cherry picked from commit 59bdce0bc2a792d375a428baf4e628f640ef523b) --- src/effects/effectchainslot.h | 2 +- src/effects/effectslot.cpp | 3 +- src/effects/effectsmanager.cpp | 113 +++---- src/effects/effectsmanager.h | 53 ++-- src/effects/specialeffectchainslots.cpp | 21 +- src/effects/specialeffectchainslots.h | 12 + src/preferences/dialog/dlgprefeffects.cpp | 6 +- src/preferences/dialog/dlgprefeq.cpp | 360 +++++++++------------- src/preferences/dialog/dlgprefeq.h | 34 +- src/preferences/dialog/dlgprefeqdlg.ui | 6 +- src/preferences/effectsettingsmodel.cpp | 2 +- src/widget/weffectselector.cpp | 15 +- 12 files changed, 300 insertions(+), 327 deletions(-) diff --git a/src/effects/effectchainslot.h b/src/effects/effectchainslot.h index 09bfb514c3ba..1b41de7b6abf 100644 --- a/src/effects/effectchainslot.h +++ b/src/effects/effectchainslot.h @@ -106,6 +106,7 @@ class EffectChainSlot : public QObject { protected slots: void sendParameterUpdate(); + void slotControlChainSuperParameter(double v, bool force = false); protected: EffectSlotPointer addEffectSlot(const QString& group); @@ -121,7 +122,6 @@ class EffectChainSlot : public QObject { private slots: void slotControlClear(double v); - void slotControlChainSuperParameter(double v, bool force = false); void slotControlChainSelector(double v); void slotControlChainNextPreset(double v); void slotControlChainPrevPreset(double v); diff --git a/src/effects/effectslot.cpp b/src/effects/effectslot.cpp index a105094e9f59..5e0f2b0ea043 100644 --- a/src/effects/effectslot.cpp +++ b/src/effects/effectslot.cpp @@ -292,7 +292,8 @@ EffectButtonParameterSlotPointer EffectSlot::getEffectButtonParameterSlot(unsign void EffectSlot::loadEffect(const EffectManifestPointer pManifest, std::unique_ptr pProcessor, - const QSet& activeChannels) { unloadEffect(); + const QSet& activeChannels) { + unloadEffect(); m_pManifest = pManifest; diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index 22d64f4fa4e4..024bdff6f14f 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -125,58 +125,46 @@ void EffectsManager::registerOutputChannel(const ChannelHandleAndGroup& handle_g m_registeredOutputChannels.insert(handle_group); } -void EffectsManager::loadEffect(EffectChainSlotPointer pChainSlot, - const int iEffectSlotNumber, const QString& effectId, - EffectBackendType backendType) { - if (kEffectDebugOutput) { - qDebug() << debugString() << "loading effect" << iEffectSlotNumber << effectId; - } - for (const auto& pBackend : m_effectsBackends) { - if (pBackend->canInstantiateEffect(effectId) && - (backendType == EffectBackendType::Unknown || - pBackend->getType() == backendType)) { - EffectManifestPointer pManifest = pBackend->getManifest(effectId); - std::unique_ptr pProcessor = pBackend->createProcessor(pManifest); - - pChainSlot->loadEffect(iEffectSlotNumber, pManifest, std::move(pProcessor)); - return; - } - } - pChainSlot->loadEffect(iEffectSlotNumber, EffectManifestPointer(), nullptr); -} - void EffectsManager::loadStandardEffect(const int iChainSlotNumber, - const int iEffectSlotNumber, const QString& effectId, - EffectBackendType backendType) { + const int iEffectSlotNumber, const EffectManifestPointer pManifest) { auto pChainSlot = getStandardEffectChainSlot(iChainSlotNumber); if (pChainSlot) { - loadEffect(pChainSlot, iEffectSlotNumber, effectId, backendType); + loadEffect(pChainSlot, iEffectSlotNumber, pManifest); } } void EffectsManager::loadOutputEffect(const int iEffectSlotNumber, - const QString& effectId, EffectBackendType backendType) { + const EffectManifestPointer pManifest) { if (m_outputEffectChainSlot) { - loadEffect(m_outputEffectChainSlot, iEffectSlotNumber, effectId, backendType); + loadEffect(m_outputEffectChainSlot, iEffectSlotNumber, pManifest); } } -void EffectsManager::loadQuickEffect(const QString& group, - const int iEffectSlotNumber, const QString& effectId, - EffectBackendType backendType) { - auto pChainSlot = getQuickEffectChainSlot(group); - if (pChainSlot) { - loadEffect(pChainSlot, iEffectSlotNumber, effectId, backendType); +void EffectsManager::loadQuickEffect(const QString& deckGroup, + const int iEffectSlotNumber, const EffectManifestPointer pManifest) { + auto pChainSlot = m_quickEffectChainSlots.value(deckGroup); + VERIFY_OR_DEBUG_ASSERT(pChainSlot) { + return; } + loadEffect(pChainSlot, iEffectSlotNumber, pManifest); } -void EffectsManager::loadEqualizerEffect(const QString& group, - const int iEffectSlotNumber, const QString& effectId, - EffectBackendType backendType) { - auto pChainSlot = getEqualizerEffectChainSlot(group); - if (pChainSlot) { - loadEffect(pChainSlot, iEffectSlotNumber, effectId, backendType); +void EffectsManager::loadEqualizerEffect(const QString& deckGroup, + const int iEffectSlotNumber, const EffectManifestPointer pManifest) { + auto pChainSlot = m_equalizerEffectChainSlots.value(deckGroup); + VERIFY_OR_DEBUG_ASSERT(pChainSlot) { + return; } + loadEffect(pChainSlot, iEffectSlotNumber, pManifest); +} + +void EffectsManager::loadEffect(EffectChainSlotPointer pChainSlot, + const int iEffectSlotNumber, const EffectManifestPointer pManifest) { + if (kEffectDebugOutput) { + qDebug() << debugString() << "loading effect" << iEffectSlotNumber << pManifest; + } + pChainSlot->loadEffect(iEffectSlotNumber, pManifest, + createProcessor(pManifest)); } std::unique_ptr EffectsManager::createProcessor( @@ -207,11 +195,6 @@ const QList EffectsManager::getAvailableEffectManifestsFi return list; } -bool EffectsManager::isEQ(const QString& effectId) const { - EffectManifestPointer pManifest = getEffectManifest(effectId); - return pManifest ? pManifest->isMixingEQ() : false; -} - QString EffectsManager::getNextEffectId(const QString& effectId) { if (m_availableEffectManifests.isEmpty()) { return QString(); @@ -263,11 +246,29 @@ void EffectsManager::getEffectManifestAndBackend( } } -EffectManifestPointer EffectsManager::getEffectManifest(const QString& effectId) const { - EffectManifestPointer pMainifest; - EffectsBackend* pEffectBackend; - getEffectManifestAndBackend(effectId, &pMainifest, &pEffectBackend); - return pMainifest; +EffectManifestPointer EffectsManager::getManifestFromUniqueId(const QString& uid) const { + if (kEffectDebugOutput) { + qDebug() << "EffectsManager::getManifestFromUniqueId" << uid; + } + if (uid.isEmpty()) { + // Do not DEBUG_ASSERT, this may be a valid request for a nullptr to + // unload an effect. + return EffectManifestPointer(); + } + int delimiterIndex = uid.lastIndexOf(" "); + EffectBackendType backendType = EffectManifest::backendTypeFromString( + uid.mid(delimiterIndex+1)); + VERIFY_OR_DEBUG_ASSERT(backendType != EffectBackendType::Unknown) { + // Mixxx 2.0 - 2.2 did not store the backend type in mixxx.cfg, + // so this code will be executed once when upgrading to Mixxx 2.3. + // This debug assertion is safe to ignore in that case. If it is + // triggered at any later time, there is a bug somewhere. + // Do not manipulate the string passed to this function, just pass + // it directly to BuiltInBackend. + return m_effectsBackends.value(EffectBackendType::BuiltIn)->getManifest(uid); + } + return m_effectsBackends.value(backendType)->getManifest( + uid.mid(-1, delimiterIndex+1)); } void EffectsManager::addStandardEffectChainSlots() { @@ -301,28 +302,30 @@ EffectChainSlotPointer EffectsManager::getStandardEffectChainSlot(int unitNumber return m_standardEffectChainSlots.at(unitNumber); } -void EffectsManager::addEqualizerEffectChainSlot(const QString& groupName) { +void EffectsManager::addEqualizerEffectChainSlot(const QString& deckGroupName) { VERIFY_OR_DEBUG_ASSERT(!m_equalizerEffectChainSlots.contains( - EqualizerEffectChainSlot::formatEffectChainSlotGroup(groupName))) { + EqualizerEffectChainSlot::formatEffectChainSlotGroup(deckGroupName))) { return; } auto pChainSlot = EqualizerEffectChainSlotPointer( - new EqualizerEffectChainSlot(groupName, this)); + new EqualizerEffectChainSlot(deckGroupName, this)); + m_equalizerEffectChainSlots.insert(deckGroupName, pChainSlot); + m_effectChainSlotsByGroup.insert(pChainSlot->group(), pChainSlot); - m_equalizerEffectChainSlots.insert(pChainSlot->group(), pChainSlot); } -void EffectsManager::addQuickEffectChainSlot(const QString& groupName) { +void EffectsManager::addQuickEffectChainSlot(const QString& deckGroupName) { VERIFY_OR_DEBUG_ASSERT(!m_quickEffectChainSlots.contains( - QuickEffectChainSlot::formatEffectChainSlotGroup(groupName))) { + QuickEffectChainSlot::formatEffectChainSlotGroup(deckGroupName))) { return; } auto pChainSlot = QuickEffectChainSlotPointer( - new QuickEffectChainSlot(groupName, this)); + new QuickEffectChainSlot(deckGroupName, this)); + + m_quickEffectChainSlots.insert(deckGroupName, pChainSlot); m_effectChainSlotsByGroup.insert(pChainSlot->group(), pChainSlot); - m_quickEffectChainSlots.insert(pChainSlot->group(), pChainSlot); } EffectChainSlotPointer EffectsManager::getEffectChainSlot(const QString& group) const { diff --git a/src/effects/effectsmanager.h b/src/effects/effectsmanager.h index 8583ddbfff6d..ce4da8592294 100644 --- a/src/effects/effectsmanager.h +++ b/src/effects/effectsmanager.h @@ -68,24 +68,29 @@ class EffectsManager : public QObject { return m_registeredOutputChannels; } - void loadStandardEffect(const int iChainSlotNumber, - const int iEffectSlotNumber, const QString& effectId, - EffectBackendType backendType = EffectBackendType::Unknown); + void loadStandardEffect( + const int iChainSlotNumber, + const int iEffectSlotNumber, + const EffectManifestPointer pManifest); - void loadOutputEffect(const int iEffectSlotNumber, const QString& effectId, - EffectBackendType backendType = EffectBackendType::Unknown); + void loadOutputEffect( + const int iEffectSlotNumber, + const EffectManifestPointer pManifest); - void loadQuickEffect(const QString& group, - const int iEffectSlotNumber, const QString& effectId, - EffectBackendType backendType = EffectBackendType::Unknown); + void loadQuickEffect( + const QString& group, + const int iEffectSlotNumber, + const EffectManifestPointer pManifest); void loadEqualizerEffect(const QString& group, - const int iEffectSlotNumber, const QString& effectId, - EffectBackendType backendType = EffectBackendType::Unknown); + const int iEffectSlotNumber, + const EffectManifestPointer pManifest); + + void loadEffect( + EffectChainSlotPointer pChainSlot, + const int iEffectSlotNumber, + const EffectManifestPointer pManifest); - void loadEffect(EffectChainSlotPointer pChainSlot, - const int iEffectSlotNumber, const QString& effectId, - EffectBackendType backendType = EffectBackendType::Unknown); std::unique_ptr createProcessor( const EffectManifestPointer pManifest); @@ -95,25 +100,14 @@ class EffectsManager : public QObject { void addOutputEffectChainSlot(); EffectChainSlotPointer getOutputEffectChainSlot() const; - void addEqualizerEffectChainSlot(const QString& groupName); - EqualizerEffectChainSlotPointer getEqualizerEffectChainSlot(const QString& group) { - return m_equalizerEffectChainSlots.value(group); - } - int numEqualizerEffectChainSlots() { - return m_equalizerEffectChainSlots.size(); - } - - void addQuickEffectChainSlot(const QString& groupName); - QuickEffectChainSlotPointer getQuickEffectChainSlot(const QString& group) { - return m_quickEffectChainSlots.value(group); - } - int numQuickEffectChainSlots() { - return m_quickEffectChainSlots.size(); - } + void addEqualizerEffectChainSlot(const QString& deckGroupName); + void addQuickEffectChainSlot(const QString& deckGroupName); // NOTE(Kshitij) : Use new functions // void loadEffectChains(); + // TODO: Remove these methods to reduce coupling between GUI and + // effects system implementation details. EffectChainSlotPointer getEffectChainSlot(const QString& group) const; EffectSlotPointer getEffectSlot(const QString& group); @@ -134,10 +128,11 @@ class EffectsManager : public QObject { const QList getAvailableEffectManifestsFiltered( EffectManifestFilterFnc filter) const; bool isEQ(const QString& effectId) const; + void getEffectManifestAndBackend( const QString& effectId, EffectManifestPointer* ppManifest, EffectsBackend** ppBackend) const; - EffectManifestPointer getEffectManifest(const QString& effectId) const; + EffectManifestPointer getManifestFromUniqueId(const QString& uid) const; void setEffectVisibility(EffectManifestPointer pManifest, bool visibility); bool getEffectVisibility(EffectManifestPointer pManifest); diff --git a/src/effects/specialeffectchainslots.cpp b/src/effects/specialeffectchainslots.cpp index bf43e5e49968..dc7b947081cc 100644 --- a/src/effects/specialeffectchainslots.cpp +++ b/src/effects/specialeffectchainslots.cpp @@ -112,6 +112,14 @@ QuickEffectChainSlot::QuickEffectChainSlot(const QString& group, setSuperParameterDefaultValue(0.5); } +void QuickEffectChainSlot::loadEffect( + const unsigned int iEffectSlotNumber, + const EffectManifestPointer pManifest, + std::unique_ptr pProcessor) { + EffectChainSlot::loadEffect(iEffectSlotNumber, pManifest, std::move(pProcessor)); + slotControlChainSuperParameter(m_pControlChainSuperParameter->get(), true); +} + QString QuickEffectChainSlot::formatEffectChainSlotGroup(const QString& group) { return QString("[QuickEffectRack1_%1]").arg(group); } @@ -127,7 +135,8 @@ QString QuickEffectChainSlot::formatEffectSlotGroup(const QString& group, EqualizerEffectChainSlot::EqualizerEffectChainSlot(const QString& group, EffectsManager* pEffectsManager) : PerGroupEffectChainSlot(group, formatEffectChainSlotGroup(group), - pEffectsManager) { + pEffectsManager), + m_pCOFilterWaveform(new ControlObject(ConfigKey(group, "filterWaveformEnable"))) { // Add a single effect slot addEffectSlot(formatEffectSlotGroup(group)); m_effectSlots[0]->setEnabled(true); @@ -136,6 +145,16 @@ EqualizerEffectChainSlot::EqualizerEffectChainSlot(const QString& group, setupLegacyAliasesForGroup(group); } +void EqualizerEffectChainSlot::loadEffect( + const unsigned int iEffectSlotNumber, + const EffectManifestPointer pManifest, + std::unique_ptr pProcessor) { + // TODO: preserve effect parameters when loading new effect. This will allow + // for easy comparison of the sound of different equalizer effects. + EffectChainSlot::loadEffect(iEffectSlotNumber, pManifest, std::move(pProcessor)); + m_pCOFilterWaveform->set(pManifest->isMixingEQ()); +} + QString EqualizerEffectChainSlot::formatEffectChainSlotGroup(const QString& group) { return QString("[EqualizerRack1_%1]").arg(group); } diff --git a/src/effects/specialeffectchainslots.h b/src/effects/specialeffectchainslots.h index a5d88f78e8e2..780b492e1ba6 100644 --- a/src/effects/specialeffectchainslots.h +++ b/src/effects/specialeffectchainslots.h @@ -5,6 +5,7 @@ #include "effects/effectsmanager.h" #include "effects/effectslot.h" #include "effects/defs.h" +#include "util/memory.h" class StandardEffectChainSlot : public EffectChainSlot { public: @@ -35,6 +36,11 @@ class QuickEffectChainSlot : public PerGroupEffectChainSlot { public: QuickEffectChainSlot(const QString& group, EffectsManager* pEffectsManager); + + void loadEffect(const unsigned int iEffectSlotNumber, + const EffectManifestPointer pManifest, + std::unique_ptr pProcessor) override; + static QString formatEffectChainSlotGroup(const QString& group); static QString formatEffectSlotGroup(const QString& group, const int iEffectSlotNumber = 0); @@ -44,11 +50,17 @@ class EqualizerEffectChainSlot : public PerGroupEffectChainSlot { public: EqualizerEffectChainSlot(const QString& group, EffectsManager* pEffectsManager); + + void loadEffect(const unsigned int iEffectSlotNumber, + const EffectManifestPointer pManifest, + std::unique_ptr pProcessor) override; + static QString formatEffectChainSlotGroup(const QString& group); static QString formatEffectSlotGroup(const QString& group); private: void setupLegacyAliasesForGroup(const QString& group); + std::unique_ptr m_pCOFilterWaveform; }; #endif /* SPECIALEFFECTCHAINSLOTS_H */ diff --git a/src/preferences/dialog/dlgprefeffects.cpp b/src/preferences/dialog/dlgprefeffects.cpp index 8af7c85de416..1f9797cab88b 100644 --- a/src/preferences/dialog/dlgprefeffects.cpp +++ b/src/preferences/dialog/dlgprefeffects.cpp @@ -86,10 +86,10 @@ void DlgPrefEffects::clear() { void DlgPrefEffects::availableEffectsListItemSelected(const QModelIndex& selected) { QString effectId = m_availableEffectsModel.data(selected, Qt::UserRole).toString(); - EffectManifestPointer pManifest = m_pEffectsManager->getEffectManifest(effectId); - if (!pManifest) { + if (effectId == QVariant().toString()) return; - } + + EffectManifestPointer pManifest = m_pEffectsManager->getManifestFromUniqueId(effectId); effectName->setText(pManifest->name()); effectAuthor->setText(pManifest->author()); diff --git a/src/preferences/dialog/dlgprefeq.cpp b/src/preferences/dialog/dlgprefeq.cpp index e79b2b966b09..633a6d4d66fc 100644 --- a/src/preferences/dialog/dlgprefeq.cpp +++ b/src/preferences/dialog/dlgprefeq.cpp @@ -34,9 +34,9 @@ const QString kConfigKey = "[Mixer Profile]"; const QString kEnableEqs = "EnableEQs"; const QString kEqsOnly = "EQsOnly"; const QString kSingleEq = "SingleEQEffect"; -const QString kDefaultEqId = BiquadFullKillEQEffect::getId(); +const QString kDefaultEqId = BiquadFullKillEQEffect::getId() + " Built-in"; const QString kDefaultMasterEqId = QString(); -const QString kDefaultQuickEffectId = FilterEffect::getId(); +const QString kDefaultQuickEffectId = FilterEffect::getId() + " Built-in"; const int kFrequencyUpperLimit = 20050; const int kFrequencyLowerLimit = 16; @@ -94,9 +94,6 @@ DlgPrefEQ::~DlgPrefEQ() { qDeleteAll(m_deckQuickEffectSelectors); m_deckQuickEffectSelectors.clear(); - - qDeleteAll(m_filterWaveformEnableCOs); - m_filterWaveformEnableCOs.clear(); } void DlgPrefEQ::slotNumDecksChanged(double numDecks) { @@ -110,21 +107,17 @@ void DlgPrefEQ::slotNumDecksChanged(double numDecks) { QString group = PlayerManager::groupForDeck( m_deckEqEffectSelectors.size()); - m_filterWaveformEnableCOs.append( - new ControlObject(ConfigKey(group, "filterWaveformEnable"))); - m_filterWaveformEffectLoaded.append(false); - // Create the drop down list for EQs QComboBox* eqComboBox = new QComboBox(this); m_deckEqEffectSelectors.append(eqComboBox); connect(eqComboBox, SIGNAL(currentIndexChanged(int)), - this, SLOT(slotEqEffectChangedOnDeck(int))); + this, SLOT(slotEffectChangedOnDeck(int))); // Create the drop down list for EQs QComboBox* quickEffectComboBox = new QComboBox(this); m_deckQuickEffectSelectors.append(quickEffectComboBox); connect(quickEffectComboBox, SIGNAL(currentIndexChanged(int)), - this, SLOT(slotQuickEffectChangedOnDeck(int))); + this, SLOT(slotEffectChangedOnDeck(int))); if (deckNo == 1) { m_firstSelectorLabel = label; @@ -143,30 +136,38 @@ void DlgPrefEQ::slotNumDecksChanged(double numDecks) { } slotPopulateDeckEffectSelectors(); for (int i = oldDecks; i < static_cast(numDecks); ++i) { - // Set the configured effect for box and simpleBox or Bessel8 LV-Mix EQ + // Set the configured effect for box and simpleBox or default // if none is configured QString group = PlayerManager::groupForDeck(i); QString configuredEffect = m_pConfig->getValue(ConfigKey(kConfigKey, "EffectForGroup_" + group), kDefaultEqId); - int selectedEffectIndex = m_deckEqEffectSelectors[i]->findData(configuredEffect); - if (selectedEffectIndex < 0) { - selectedEffectIndex = m_deckEqEffectSelectors[i]->findData(kDefaultEqId); - configuredEffect = kDefaultEqId; + + const EffectManifestPointer pEQManifest = + m_pEffectsManager->getManifestFromUniqueId(configuredEffect); + + int selectedEQEffectIndex = 0; + if (pEQManifest) { + selectedEQEffectIndex = m_deckEqEffectSelectors[i]->findData( + QVariant(pEQManifest->uniqueId())); + } else { + // Select "None" + selectedEQEffectIndex = m_deckEqEffectSelectors[i]->count() - 1; } - m_deckEqEffectSelectors[i]->setCurrentIndex(selectedEffectIndex); - m_filterWaveformEffectLoaded[i] = m_pEffectsManager->isEQ(configuredEffect); - m_filterWaveformEnableCOs[i]->set( - m_filterWaveformEffectLoaded[i] && - !CheckBoxBypass->checkState()); + + m_deckEqEffectSelectors[i]->setCurrentIndex(selectedEQEffectIndex); QString configuredQuickEffect = m_pConfig->getValue(ConfigKey(kConfigKey, "QuickEffectForGroup_" + group), kDefaultQuickEffectId); - int selectedQuickEffectIndex = - m_deckQuickEffectSelectors[i]->findData(configuredQuickEffect); - if (selectedQuickEffectIndex < 0) { - selectedQuickEffectIndex = - m_deckEqEffectSelectors[i]->findData(kDefaultQuickEffectId); - configuredEffect = kDefaultQuickEffectId; + const EffectManifestPointer pQuickEffectManifest = + m_pEffectsManager->getManifestFromUniqueId(configuredQuickEffect); + + int selectedQuickEffectIndex = 0; + if (pQuickEffectManifest) { + selectedQuickEffectIndex = m_deckQuickEffectSelectors[i]->findData( + QVariant(pQuickEffectManifest->uniqueId())); + } else { + // Select "None" + selectedQuickEffectIndex = m_deckQuickEffectSelectors[i]->count() - 1; } m_deckQuickEffectSelectors[i]->setCurrentIndex(selectedQuickEffectIndex); } @@ -204,80 +205,62 @@ void DlgPrefEQ::slotPopulateDeckEffectSelectors() { filterEQ = nullptr; // take all } - const QList availableEQEffects = - m_pEffectsManager->getAvailableEffectManifestsFiltered(filterEQ); - const QList availableQuickEffects = - m_pEffectsManager->getAvailableEffectManifestsFiltered(hasSuperKnobLinking); + populateDeckBoxList(m_deckEqEffectSelectors, filterEQ); + populateDeckBoxList(m_deckQuickEffectSelectors, hasSuperKnobLinking); - for (QComboBox* box : m_deckEqEffectSelectors) { - // Populate comboboxes with all available effects - // Save current selection - QString selectedEffectId = box->itemData(box->currentIndex()).toString(); - QString selectedEffectName = box->itemText(box->currentIndex()); - box->clear(); - int currentIndex = -1; // Nothing selected - - int i; - for (i = 0; i < availableEQEffects.size(); ++i) { - EffectManifestPointer pManifest = availableEQEffects.at(i); - box->addItem(pManifest->name(), QVariant(pManifest->id())); - if (selectedEffectId == pManifest->id()) { - currentIndex = i; - } - } - //: Displayed when no effect is selected - box->addItem(tr("None"), QVariant(QString(""))); - if (selectedEffectId.isNull()) { - currentIndex = availableEQEffects.size(); // selects "None" - } - if (currentIndex < 0 && !selectedEffectName.isEmpty()) { - // current selection is not part of the new list - // So we need to add it - box->addItem(selectedEffectName, QVariant(selectedEffectId)); - currentIndex = i + 1; - } - box->setCurrentIndex(currentIndex); - } + m_inSlotPopulateDeckEffectSelectors = false; +} - for (QComboBox* box : m_deckQuickEffectSelectors) { +void DlgPrefEQ::populateDeckBoxList( + const QList boxList, + EffectsManager::EffectManifestFilterFnc filterFunc) { + const QList pManifestList = + m_pEffectsManager->getAvailableEffectManifestsFiltered(filterFunc); + for (QComboBox* box : boxList) { // Populate comboboxes with all available effects // Save current selection - QString selectedEffectId = box->itemData(box->currentIndex()).toString(); - QString selectedEffectName = box->itemText(box->currentIndex()); + const EffectManifestPointer pCurrentlySelectedManifest = + m_pEffectsManager->getManifestFromUniqueId( + box->itemData(box->currentIndex()).toString()); + box->clear(); - int currentIndex = -1;// Nothing selected + int currentIndex = -1; // Nothing selected - int i; - for (i = 0; i < availableQuickEffects.size(); ++i) { - EffectManifestPointer pManifest = availableQuickEffects.at(i); - box->addItem(pManifest->name(), QVariant(pManifest->id())); - if (selectedEffectId == pManifest->id()) { + int i = 0; + for (const auto& pManifest : pManifestList) { + box->addItem(pManifest->name(), QVariant(pManifest->uniqueId())); + if (pCurrentlySelectedManifest && + pCurrentlySelectedManifest.data() == pManifest.data()) { currentIndex = i; } + ++i; } //: Displayed when no effect is selected - box->addItem(tr("None"), QVariant(QString(""))); - if (selectedEffectId.isNull()) { - currentIndex = availableQuickEffects.size(); // selects "None" + box->addItem(tr("None"), QVariant()); + if (pCurrentlySelectedManifest == nullptr) { + currentIndex = box->count() - 1; // selects "None" } - if (currentIndex < 0 && !selectedEffectName.isEmpty()) { + if (currentIndex < 0) { // current selection is not part of the new list // So we need to add it - box->addItem(selectedEffectName, QVariant(selectedEffectId)); + box->addItem(pCurrentlySelectedManifest->shortName(), + QVariant(pCurrentlySelectedManifest->uniqueId())); currentIndex = i + 1; } box->setCurrentIndex(currentIndex); } - - m_inSlotPopulateDeckEffectSelectors = false; } void DlgPrefEQ::slotSingleEqChecked(int checked) { bool do_hide = static_cast(checked); m_pConfig->set(ConfigKey(kConfigKey, kSingleEq), do_hide ? QString("yes") : QString("no")); + int deck1EQIndex = m_deckEqEffectSelectors.at(0)->currentIndex(); + int deck1QuickEffectIndex = m_deckQuickEffectSelectors.at(0)->currentIndex(); for (int i = 2; i < m_deckEqEffectSelectors.size() + 1; ++i) { if (do_hide) { + m_deckEqEffectSelectors.at(i-1)->setCurrentIndex(deck1EQIndex); + m_deckQuickEffectSelectors.at(i-1)->setCurrentIndex(deck1QuickEffectIndex); gridLayout_3->itemAtPosition(i, 0)->widget()->hide(); gridLayout_3->itemAtPosition(i, 1)->widget()->hide(); gridLayout_3->itemAtPosition(i, 2)->widget()->hide(); @@ -348,8 +331,7 @@ void DlgPrefEQ::loadSettings() { } } -void DlgPrefEQ::setDefaultShelves() -{ +void DlgPrefEQ::setDefaultShelves() { m_pConfig->set(ConfigKey(kConfigKey, "HiEQFrequency"), ConfigValue(2500)); m_pConfig->set(ConfigKey(kConfigKey, "LoEQFrequency"), ConfigValue(250)); m_pConfig->set(ConfigKey(kConfigKey, "HiEQFrequencyPrecise"), ConfigValue(2500.0)); @@ -359,11 +341,11 @@ void DlgPrefEQ::setDefaultShelves() void DlgPrefEQ::slotResetToDefaults() { slotMasterEQToDefault(); setDefaultShelves(); - foreach(QComboBox* pCombo, m_deckEqEffectSelectors) { + for (QComboBox* pCombo : m_deckEqEffectSelectors) { pCombo->setCurrentIndex( pCombo->findData(kDefaultEqId)); } - foreach(QComboBox* pCombo, m_deckQuickEffectSelectors) { + for (QComboBox* pCombo : m_deckQuickEffectSelectors) { pCombo->setCurrentIndex( pCombo->findData(kDefaultQuickEffectId)); } @@ -379,52 +361,33 @@ void DlgPrefEQ::slotResetToDefaults() { slotApply(); } -void DlgPrefEQ::slotEqEffectChangedOnDeck(int effectIndex) { +void DlgPrefEQ::slotEffectChangedOnDeck(int effectIndex) { QComboBox* c = qobject_cast(sender()); // Check if qobject_cast was successful - if (c && !m_inSlotPopulateDeckEffectSelectors) { - int deckNumber = m_deckEqEffectSelectors.indexOf(c); - QString effectId = c->itemData(effectIndex).toString(); - - // If we are in single-effect mode and the first effect was changed, - // change the others as well. - if (deckNumber == 0 && CheckBoxSingleEqEffect->isChecked()) { - for (int otherDeck = 1; - otherDeck < static_cast(m_pNumDecks->get()); - ++otherDeck) { - QComboBox* box = m_deckEqEffectSelectors[otherDeck]; - box->setCurrentIndex(effectIndex); - } - } + if (!c || m_inSlotPopulateDeckEffectSelectors) { + return; + } - // This is required to remove a previous selected effect that does not - // fit to the current ShowAllEffects checkbox - slotPopulateDeckEffectSelectors(); + QList* pBoxList = &m_deckEqEffectSelectors; + if (m_deckQuickEffectSelectors.contains(c)) { + pBoxList = &m_deckQuickEffectSelectors; } -} -void DlgPrefEQ::slotQuickEffectChangedOnDeck(int effectIndex) { - QComboBox* c = qobject_cast(sender()); - // Check if qobject_cast was successful - if (c && !m_inSlotPopulateDeckEffectSelectors) { - int deckNumber = m_deckQuickEffectSelectors.indexOf(c); - QString effectId = c->itemData(effectIndex).toString(); - - // If we are in single-effect mode and the first effect was changed, - // change the others as well. - if (deckNumber == 0 && CheckBoxSingleEqEffect->isChecked()) { - for (int otherDeck = 1; - otherDeck < static_cast(m_pNumDecks->get()); - ++otherDeck) { - QComboBox* box = m_deckQuickEffectSelectors[otherDeck]; - box->setCurrentIndex(effectIndex); - } + int deckNumber = pBoxList->indexOf(c); + // If we are in single-effect mode and the first effect was changed, + // change the others as well. + if (deckNumber == 0 && CheckBoxSingleEqEffect->isChecked()) { + for (int otherDeck = 1; + otherDeck < static_cast(m_pNumDecks->get()); + ++otherDeck) { + QComboBox* box = (*pBoxList)[otherDeck]; + box->setCurrentIndex(effectIndex); } - - // This is required to remove a previous selected effect that does not - // fit to the current ShowAllEffects checkbox - slotPopulateDeckEffectSelectors(); } + + // This is required to remove a previous selected effect that does not + // fit to the current ShowAllEffects checkbox + slotPopulateDeckEffectSelectors(); } void DlgPrefEQ::applySelections() { @@ -432,100 +395,49 @@ void DlgPrefEQ::applySelections() { return; } - int deck = 0; - QString firstEffectId; - int firstEffectIndex = 0; - for (QComboBox* box : m_deckEqEffectSelectors) { - QString effectId = box->itemData(box->currentIndex()).toString(); - if (deck == 0) { - firstEffectId = effectId; - firstEffectIndex = box->currentIndex(); - } else if (CheckBoxSingleEqEffect->isChecked()) { - effectId = firstEffectId; - box->setCurrentIndex(firstEffectIndex); - } - QString group = PlayerManager::groupForDeck(deck); + loadEffectFunction loadFunc = std::bind( + &EffectsManager::loadEqualizerEffect, m_pEffectsManager, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3); + applySelectionsToDecks(m_deckEqEffectSelectors, m_eqIndiciesOnUpdate, + loadFunc, "EffectForGroup_"); - // Only apply the effect if it changed -- so first interrogate the - // loaded effect if any. - bool needLoad = true; - if (m_pEffectsManager->numEqualizerEffectChainSlots() > deck) { - // It's not correct to get a pChainSlot by index number -- get by - // group name instead. - EffectChainSlotPointer pChainSlot = - m_pEffectsManager->getEqualizerEffectChainSlot(group); - if (pChainSlot) { - EffectSlotPointer pEffectSlot = pChainSlot->getEffectSlot(0); - if (pEffectSlot && pEffectSlot->getManifest()->id() == effectId) { - needLoad = false; - } - } - } - if (needLoad) { - QString chainSlotGroup = EqualizerEffectChainSlot::formatEffectChainSlotGroup(group); - - EffectChainSlotPointer pChainSlot = - m_pEffectsManager->getEqualizerEffectChainSlot(chainSlotGroup); - - VERIFY_OR_DEBUG_ASSERT(pChainSlot != nullptr); - - // TODO : Fetch the appropriate effect backend type - m_pEffectsManager->loadEqualizerEffect(chainSlotGroup, 0, effectId, EffectBackendType::Unknown); - - m_pConfig->set(ConfigKey(kConfigKey, "EffectForGroup_" + group), - ConfigValue(effectId)); - m_filterWaveformEnableCOs[deck]->set(m_pEffectsManager->isEQ(effectId)); + loadFunc = std::bind(&EffectsManager::loadQuickEffect, m_pEffectsManager, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3); + applySelectionsToDecks(m_deckQuickEffectSelectors, m_quickEffectIndiciesOnUpdate, + loadFunc, "QuickEffectForGroup_"); +} - // This is required to remove a previous selected effect that does not - // fit to the current ShowAllEffects checkbox - slotPopulateDeckEffectSelectors(); - } - ++deck; - } +void DlgPrefEQ::applySelectionsToDecks( + const QList& boxList, + QList& indiciesOnUpdate, + loadEffectFunction loadFunc, + const QString& configKeyPrefix) { + int deck = 0; + for (QComboBox* box : boxList) { + const EffectManifestPointer pManifest = + m_pEffectsManager->getManifestFromUniqueId( + box->itemData(box->currentIndex()).toString()); - deck = 0; - for (QComboBox* box : m_deckQuickEffectSelectors) { - QString effectId = box->itemData(box->currentIndex()).toString(); QString group = PlayerManager::groupForDeck(deck); - if (deck == 0) { - firstEffectId = effectId; - firstEffectIndex = box->currentIndex(); - } else if (CheckBoxSingleEqEffect->isChecked()) { - effectId = firstEffectId; - box->setCurrentIndex(firstEffectIndex); - } - - // Only apply the effect if it changed -- so first interrogate the - // loaded effect if any. bool needLoad = true; - if (m_pEffectsManager->numQuickEffectChainSlots() > deck) { - // It's not correct to get a pChainSlot by index number -- get by - // group name instead. - EffectChainSlotPointer pChainSlot = - m_pEffectsManager->getQuickEffectChainSlot(group); - if (pChainSlot) { - auto pEffectSlot = pChainSlot->getEffectSlot(0); - if (pEffectSlot && pEffectSlot->getManifest()->id() == effectId) { - needLoad = false; - } - } + bool startingUp = (indiciesOnUpdate.size() < (deck + 1)); + if (!startingUp) { + needLoad = (box->currentIndex() != indiciesOnUpdate[deck]); } if (needLoad) { - QString chainSlotGroup = QuickEffectChainSlot::formatEffectChainSlotGroup(group); - EffectChainSlotPointer pChainSlot = - m_pEffectsManager->getQuickEffectChainSlot(chainSlotGroup); + loadFunc(group, 0, pManifest); - VERIFY_OR_DEBUG_ASSERT(pChainSlot != nullptr); - - // TODO : Fetch the appropriate backend type - m_pEffectsManager->loadQuickEffect(chainSlotGroup, 0, effectId, EffectBackendType::Unknown); - - // Force update metaknobs and parameters to match state of superknob - pChainSlot->setSuperParameter(pChainSlot->getSuperParameter(), true); + if (!startingUp) { + indiciesOnUpdate[deck] = box->currentIndex(); + } - m_pConfig->set(ConfigKey(kConfigKey, "QuickEffectForGroup_" + group), - ConfigValue(effectId)); + QString configString; + if (pManifest) { + configString = pManifest->uniqueId(); + } + m_pConfig->set(ConfigKey(kConfigKey, configKeyPrefix + group), + configString); // This is required to remove a previous selected effect that does not // fit to the current ShowAllEffects checkbox @@ -627,6 +539,16 @@ void DlgPrefEQ::slotUpdate() { slotPopulateDeckEffectSelectors(); CheckBoxEqAutoReset->setChecked(m_bEqAutoReset); CheckBoxGainAutoReset->setChecked(m_bGainAutoReset); + + m_eqIndiciesOnUpdate.clear(); + for (const auto& box : m_deckEqEffectSelectors) { + m_eqIndiciesOnUpdate.append(box->currentIndex()); + } + + m_quickEffectIndiciesOnUpdate.clear(); + for (const auto& box : m_deckQuickEffectSelectors) { + m_quickEffectIndiciesOnUpdate.append(box->currentIndex()); + } } void DlgPrefEQ::slotUpdateEqAutoReset(int i) { @@ -646,7 +568,6 @@ void DlgPrefEQ::slotBypass(int state) { for (const auto& box: m_deckEqEffectSelectors) { QString group = getEQEffectGroupForDeck(deck); ControlObject::set(ConfigKey(group, "enabled"), 0); - m_filterWaveformEnableCOs[deck]->set(0); deck++; box->setEnabled(false); } @@ -658,7 +579,6 @@ void DlgPrefEQ::slotBypass(int state) { for (const auto& box: m_deckEqEffectSelectors) { QString group = getEQEffectGroupForDeck(deck); ControlObject::set(ConfigKey(group, "enabled"), 1); - m_filterWaveformEnableCOs[deck]->set(m_filterWaveformEffectLoaded[deck]); deck++; box->setEnabled(true); } @@ -674,21 +594,23 @@ void DlgPrefEQ::setUpMasterEQ() { connect(comboBoxMasterEq, SIGNAL(currentIndexChanged(int)), this, SLOT(slotMasterEqEffectChanged(int))); - QString configuredEffect = m_pConfig->getValue(ConfigKey(kConfigKey, + const QString configuredEffectId = m_pConfig->getValue(ConfigKey(kConfigKey, "EffectForGroup_[Master]"), kDefaultMasterEqId); + const EffectManifestPointer configuredEffectManifest = + m_pEffectsManager->getManifestFromUniqueId(configuredEffectId); const QList availableMasterEQEffects = - m_pEffectsManager->getAvailableEffectManifestsFiltered(isMasterEQ); + m_pEffectsManager->getAvailableEffectManifestsFiltered(isMasterEQ); for (const auto& pManifest : availableMasterEQEffects) { - comboBoxMasterEq->addItem(pManifest->name(), QVariant(pManifest->id())); + comboBoxMasterEq->addItem(pManifest->name(), QVariant(pManifest->uniqueId())); } //: Displayed when no effect is selected comboBoxMasterEq->addItem(tr("None"), QVariant()); - int masterEqIndex = comboBoxMasterEq->findData(configuredEffect); - if (masterEqIndex < 0) { - masterEqIndex = availableMasterEQEffects.size(); // selects "None" + int masterEqIndex = availableMasterEQEffects.size(); // selects "None" by default + if (configuredEffectManifest) { + masterEqIndex = comboBoxMasterEq->findData(configuredEffectManifest->uniqueId()); } comboBoxMasterEq->setCurrentIndex(masterEqIndex); @@ -720,9 +642,12 @@ void DlgPrefEQ::slotMasterEqEffectChanged(int effectIndex) { qDeleteAll(m_masterEQLabels); m_masterEQLabels.clear(); - QString effectId = comboBoxMasterEq->itemData(effectIndex).toString(); + const EffectManifestPointer pManifest = + m_pEffectsManager->getManifestFromUniqueId( + comboBoxMasterEq->itemData( + effectIndex).toString()); - if (effectId.isNull()) { + if (pManifest == nullptr) { pbResetMasterEq->hide(); } else { pbResetMasterEq->show(); @@ -730,8 +655,7 @@ void DlgPrefEQ::slotMasterEqEffectChanged(int effectIndex) { auto pChainSlot = m_pEffectsManager->getOutputEffectChainSlot(); if (pChainSlot) { - // TODO : Fetch the appropriate backend type - m_pEffectsManager->loadOutputEffect(0, effectId, EffectBackendType::Unknown); + m_pEffectsManager->loadOutputEffect(0, pManifest); auto pEffectSlot = pChainSlot->getEffectSlot(0); @@ -776,8 +700,10 @@ void DlgPrefEQ::slotMasterEqEffectChanged(int effectIndex) { } // Update the configured effect for the current QComboBox - m_pConfig->set(ConfigKey(kConfigKey, "EffectForGroup_[Master]"), - ConfigValue(effectId)); + if (pManifest) { + m_pConfig->set(ConfigKey(kConfigKey, "EffectForGroup_[Master]"), + ConfigValue(pManifest->uniqueId())); + } } double DlgPrefEQ::getEqFreq(int sliderVal, int minValue, int maxValue) { diff --git a/src/preferences/dialog/dlgprefeq.h b/src/preferences/dialog/dlgprefeq.h index 0bba241925ff..a3f57ee8a085 100644 --- a/src/preferences/dialog/dlgprefeq.h +++ b/src/preferences/dialog/dlgprefeq.h @@ -18,6 +18,8 @@ #ifndef DLGPREFEQ_H #define DLGPREFEQ_H +#include + #include #include @@ -41,8 +43,13 @@ class DlgPrefEQ : public DlgPreferencePage, public Ui::DlgPrefEQDlg { QString getQuickEffectGroupForDeck(int deck) const; public slots: - void slotEqEffectChangedOnDeck(int effectIndex); - void slotQuickEffectChangedOnDeck(int effectIndex); + // Apply changes to widget + void slotApply(); + void slotUpdate(); + void slotResetToDefaults(); + + private slots: + void slotEffectChangedOnDeck(int effectIndex); void slotNumDecksChanged(double numDecks); void slotSingleEqChecked(int checked); // Slot for toggling between advanced and basic views @@ -51,10 +58,6 @@ class DlgPrefEQ : public DlgPreferencePage, public Ui::DlgPrefEQDlg { void slotUpdateHiEQ(); // Update Lo EQ void slotUpdateLoEQ(); - // Apply changes to widget - void slotApply(); - void slotUpdate(); - void slotResetToDefaults(); void slotUpdateEqAutoReset(int); void slotUpdateGainAutoReset(int); void slotBypass(int state); @@ -64,10 +67,6 @@ class DlgPrefEQ : public DlgPreferencePage, public Ui::DlgPrefEQDlg { void setMasterEQParameter(int i, double value); void slotMasterEqEffectChanged(int effectIndex); - signals: - void apply(const QString &); - void effectOnChainSlot(const unsigned int, const unsigned int, QString); - private: void loadSettings(); void setDefaultShelves(); @@ -77,6 +76,16 @@ class DlgPrefEQ : public DlgPreferencePage, public Ui::DlgPrefEQDlg { void updateBandFilter(int index, double value); void setUpMasterEQ(); void applySelections(); + void populateDeckBoxList( + const QList boxList, + EffectsManager::EffectManifestFilterFnc filterFunc); + + typedef std::function loadEffectFunction; + void applySelectionsToDecks( + const QList& boxList, + QList& indiciesOnUpdate, + loadEffectFunction loadFunc, + const QString& configKeyPrefix); ControlProxy m_COLoFreq; ControlProxy m_COHiFreq; @@ -88,8 +97,6 @@ class DlgPrefEQ : public DlgPreferencePage, public Ui::DlgPrefEQDlg { QLabel* m_firstSelectorLabel; QList m_deckEqEffectSelectors; QList m_deckQuickEffectSelectors; - QList m_filterWaveformEffectLoaded; - QList m_filterWaveformEnableCOs; ControlProxy* m_pNumDecks; bool m_inSlotPopulateDeckEffectSelectors; @@ -102,6 +109,9 @@ class DlgPrefEQ : public DlgPreferencePage, public Ui::DlgPrefEQDlg { bool m_bEqAutoReset; bool m_bGainAutoReset; + + QList m_eqIndiciesOnUpdate; + QList m_quickEffectIndiciesOnUpdate; }; #endif diff --git a/src/preferences/dialog/dlgprefeqdlg.ui b/src/preferences/dialog/dlgprefeqdlg.ui index 3eec8bef5bdc..0313ed7824f5 100644 --- a/src/preferences/dialog/dlgprefeqdlg.ui +++ b/src/preferences/dialog/dlgprefeqdlg.ui @@ -15,11 +15,11 @@ - + - Equalizer Rack + Deck Equalizers and Quick Effects - + diff --git a/src/preferences/effectsettingsmodel.cpp b/src/preferences/effectsettingsmodel.cpp index 48e87ba020ea..0a02e653e863 100644 --- a/src/preferences/effectsettingsmodel.cpp +++ b/src/preferences/effectsettingsmodel.cpp @@ -73,7 +73,7 @@ QVariant EffectSettingsModel::data(const QModelIndex& index, int role) const { EffectProfilePtr profile = m_profiles.at(rowIndex); if (profile) { if (role == Qt::UserRole) { - return profile->pManifest->id(); + return profile->pManifest->uniqueId(); } int column = index.column(); if (column == kColumnEnabled) { diff --git a/src/widget/weffectselector.cpp b/src/widget/weffectselector.cpp index e817559e8456..558f33ba8060 100644 --- a/src/widget/weffectselector.cpp +++ b/src/widget/weffectselector.cpp @@ -53,7 +53,7 @@ void WEffectSelector::populate() { QString elidedDisplayName = metrics.elidedText(pManifest->displayName(), Qt::ElideMiddle, width() - 2); - addItem(elidedDisplayName, QVariant(pManifest->id())); + addItem(elidedDisplayName, QVariant(pManifest->uniqueId())); // NOTE(Be): Using \n instead of : as the separator does not work in // QComboBox item tooltips. @@ -76,8 +76,15 @@ void WEffectSelector::populate() { } void WEffectSelector::slotEffectSelected(int newIndex) { - const QString id = itemData(newIndex).toString(); - m_pEffectsManager->loadEffect(m_pChainSlot, m_pEffectSlot->getEffectSlotNumber(), id); + const EffectManifestPointer pManifest = + m_pEffectsManager->getManifestFromUniqueId( + itemData(newIndex).toString()); + + m_pEffectsManager->loadEffect( + m_pChainSlot, + m_pEffectSlot->getEffectSlotNumber(), + pManifest); + setBaseTooltip(itemData(newIndex, Qt::ToolTipRole).toString()); } @@ -87,7 +94,7 @@ void WEffectSelector::slotEffectUpdated() { if (m_pEffectSlot != nullptr) { if (m_pEffectSlot->getManifest() != nullptr) { EffectManifestPointer pManifest = m_pEffectSlot->getManifest(); - newIndex = findData(QVariant(pManifest->id())); + newIndex = findData(QVariant(pManifest->uniqueId())); } else { newIndex = findData(QVariant()); } From ec335358ebf1ddefd263ed51518e745841566d0e Mon Sep 17 00:00:00 2001 From: Kshitij Gupta Date: Fri, 20 Jul 2018 01:39:56 +0530 Subject: [PATCH 017/443] Added Qt 5.5.1 support --- src/engine/effects/engineeffect.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engine/effects/engineeffect.cpp b/src/engine/effects/engineeffect.cpp index a247a9f37aeb..2b4d85daf8e8 100644 --- a/src/engine/effects/engineeffect.cpp +++ b/src/engine/effects/engineeffect.cpp @@ -113,7 +113,7 @@ bool EngineEffect::processEffectsRequest(EffectsRequest& message, << "value" << message.value; } pParameter = m_parameters.value( - message.SetParameterParameters.iParameter, NULL); + message.SetParameterParameters.iParameter, EngineEffectParameterPointer()); if (pParameter) { pParameter->setMinimum(message.minimum); pParameter->setMaximum(message.maximum); From 4cd7a2843c865ac55940f57cd079e8b8f588018e Mon Sep 17 00:00:00 2001 From: Kshitij Gupta Date: Sat, 21 Jul 2018 08:44:07 +0530 Subject: [PATCH 018/443] Removed redundancy from EffectParameter and EffectParameterSlot - Removed wrapper functions from EffectParameter - Removed clamping from EffectParameter and added assertions directly to EffectManifestParameter - Added setRange function instead of setMinimum, setDefault & setMaximum so that order of setting does not matter and invariancy in ensured --- src/effects/builtin/autopaneffect.cpp | 13 +- src/effects/builtin/balanceeffect.cpp | 12 +- src/effects/builtin/bitcrushereffect.cpp | 8 +- src/effects/builtin/echoeffect.cpp | 24 +-- src/effects/builtin/equalizer_util.h | 24 +-- src/effects/builtin/filtereffect.cpp | 12 +- src/effects/builtin/flangereffect.cpp | 24 +-- src/effects/builtin/graphiceqeffect.cpp | 12 +- src/effects/builtin/loudnesscontoureffect.cpp | 8 +- src/effects/builtin/metronomeeffect.cpp | 8 +- .../builtin/moogladder4filtereffect.cpp | 12 +- src/effects/builtin/parametriceqeffect.cpp | 24 +-- src/effects/builtin/phasereffect.cpp | 28 +-- src/effects/builtin/reverbeffect.cpp | 16 +- src/effects/builtin/tremoloeffect.cpp | 28 +-- src/effects/effectbuttonparameterslot.cpp | 60 +++---- src/effects/effectmanifestparameter.h | 17 +- src/effects/effectparameter.cpp | 162 +----------------- src/effects/effectparameter.h | 37 ---- src/effects/effectparameterslot.cpp | 130 +++++++------- src/effects/effectparameterslotbase.cpp | 18 +- src/effects/effectparameterslotbase.h | 1 + src/effects/effectslot.cpp | 20 +-- src/effects/lv2/lv2manifest.cpp | 30 ++-- src/preferences/dialog/dlgprefeq.cpp | 10 +- 25 files changed, 218 insertions(+), 520 deletions(-) diff --git a/src/effects/builtin/autopaneffect.cpp b/src/effects/builtin/autopaneffect.cpp index a2a67c65ca17..e6f64dbb70d0 100644 --- a/src/effects/builtin/autopaneffect.cpp +++ b/src/effects/builtin/autopaneffect.cpp @@ -39,9 +39,7 @@ EffectManifestPointer AutoPanEffect::getManifest() { period->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); period->setDefaultLinkType(EffectManifestParameter::LinkType::LINKED); period->setDefaultLinkInversion(EffectManifestParameter::LinkInversion::INVERTED); - period->setMinimum(0.0); - period->setMaximum(4.0); - period->setDefault(2.0); + period->setRange(0.0, 2.0, 4.0); EffectManifestParameterPointer smoothing = pManifest->addParameter(); smoothing->setId("smoothing"); @@ -53,9 +51,8 @@ EffectManifestPointer AutoPanEffect::getManifest() { smoothing->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); smoothing->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); smoothing->setDefaultLinkType(EffectManifestParameter::LinkType::LINKED); - smoothing->setMinimum(0.25); - smoothing->setMaximum(0.50); // there are two steps per period so max is half - smoothing->setDefault(0.50); + smoothing->setRange(0.25, 0.50, 0.50); // There are two steps per period so max is half + // TODO(Ferran Pujol): when KnobComposedMaskedRing branch is merged to master, // make the scaleStartParameter for this be 1. @@ -70,9 +67,7 @@ EffectManifestPointer AutoPanEffect::getManifest() { width->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); width->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); width->setDefaultLinkType(EffectManifestParameter::LinkType::LINKED); - width->setMinimum(0.0); - width->setMaximum(1.0); // 0.02 * sampleRate => 20ms - width->setDefault(0.5); + width->setRange(0.0, 0.5, 1.0); // 0.02 * sampleRate => 20ms return pManifest; } diff --git a/src/effects/builtin/balanceeffect.cpp b/src/effects/builtin/balanceeffect.cpp index cd437e30311f..e8fc356a916a 100644 --- a/src/effects/builtin/balanceeffect.cpp +++ b/src/effects/builtin/balanceeffect.cpp @@ -35,9 +35,7 @@ EffectManifestPointer BalanceEffect::getManifest() { balance->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); balance->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); balance->setDefaultLinkType(EffectManifestParameter::LinkType::LINKED); - balance->setMinimum(-1.0); - balance->setMaximum(+1.0); - balance->setDefault(0.0); + balance->setRange(-1.0, 0.0, +1.0); EffectManifestParameterPointer midSide = pManifest->addParameter(); midSide->setId("midSide"); @@ -52,9 +50,7 @@ EffectManifestPointer BalanceEffect::getManifest() { midSide->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); midSide->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); midSide->setDefaultLinkType(EffectManifestParameter::LinkType::NONE); - midSide->setMinimum(-1.0); - midSide->setMaximum(+1.0); - midSide->setDefault(0.0); + midSide->setRange(-1.0, 0.0, +1.0); EffectManifestParameterPointer midLowPass = pManifest->addParameter(); midLowPass->setId("bypassFreq"); @@ -67,9 +63,7 @@ EffectManifestPointer BalanceEffect::getManifest() { midLowPass->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); midLowPass->setDefaultLinkType(EffectManifestParameter::LinkType::NONE); midLowPass->setNeutralPointOnScale(1); - midLowPass->setDefault(kMinCornerHz); - midLowPass->setMinimum(kMinCornerHz); - midLowPass->setMaximum(kMaxCornerHz); + midLowPass->setRange(kMinCornerHz, kMinCornerHz, kMaxCornerHz); return pManifest; } diff --git a/src/effects/builtin/bitcrushereffect.cpp b/src/effects/builtin/bitcrushereffect.cpp index ec4266b4e8fb..af02a7e1fbe0 100644 --- a/src/effects/builtin/bitcrushereffect.cpp +++ b/src/effects/builtin/bitcrushereffect.cpp @@ -32,11 +32,9 @@ EffectManifestPointer BitCrusherEffect::getManifest() { depth->setDefaultLinkType(EffectManifestParameter::LinkType::LINKED); depth->setDefaultLinkInversion(EffectManifestParameter::LinkInversion::INVERTED); depth->setNeutralPointOnScale(1.0); - depth->setDefault(16); // for values -1 0 +1 // we do not allow a 1 bit version because this causes a distortion because of the missing sign bit - depth->setMinimum(2); - depth->setMaximum(16); + depth->setRange(2, 16, 16); EffectManifestParameterPointer frequency = pManifest->addParameter(); frequency->setId("downsample"); @@ -50,9 +48,7 @@ EffectManifestPointer BitCrusherEffect::getManifest() { frequency->setDefaultLinkType(EffectManifestParameter::LinkType::LINKED); frequency->setDefaultLinkInversion(EffectManifestParameter::LinkInversion::INVERTED); frequency->setNeutralPointOnScale(1.0); - frequency->setDefault(1.0); - frequency->setMinimum(0.02); - frequency->setMaximum(1.0); + frequency->setRange(0.02, 1.0, 1.0); return pManifest; } diff --git a/src/effects/builtin/echoeffect.cpp b/src/effects/builtin/echoeffect.cpp index cc87c4cb4c3a..7c70ab3d8bfa 100644 --- a/src/effects/builtin/echoeffect.cpp +++ b/src/effects/builtin/echoeffect.cpp @@ -52,9 +52,7 @@ EffectManifestPointer EchoEffect::getManifest() { delay->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); delay->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); delay->setUnitsHint(EffectManifestParameter::UnitsHint::BEATS); - delay->setMinimum(0.0); - delay->setDefault(0.5); - delay->setMaximum(2.0); + delay->setRange(0.0, 0.5, 2.0); EffectManifestParameterPointer feedback = pManifest->addParameter(); feedback->setId("feedback_amount"); @@ -65,9 +63,7 @@ EffectManifestPointer EchoEffect::getManifest() { feedback->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); feedback->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); feedback->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); - feedback->setMinimum(0.00); - feedback->setDefault(db2ratio(-3.0)); - feedback->setMaximum(1.00); + feedback->setRange(0.00, db2ratio(-3.0), 1.00); EffectManifestParameterPointer pingpong = pManifest->addParameter(); pingpong->setId("pingpong_amount"); @@ -78,9 +74,7 @@ EffectManifestPointer EchoEffect::getManifest() { pingpong->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); pingpong->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); pingpong->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); - pingpong->setMinimum(0.0); - pingpong->setDefault(0.0); - pingpong->setMaximum(1.0); + pingpong->setRange(0.0, 0.0, 1.0); EffectManifestParameterPointer send = pManifest->addParameter(); send->setId("send_amount"); @@ -92,9 +86,7 @@ EffectManifestPointer EchoEffect::getManifest() { send->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); send->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); send->setDefaultLinkType(EffectManifestParameter::LinkType::LINKED); - send->setMinimum(0.0); - send->setDefault(db2ratio(-3.0)); - send->setMaximum(1.0); + send->setRange(0.0, db2ratio(-3.0), 1.0); EffectManifestParameterPointer quantize = pManifest->addParameter(); quantize->setId("quantize"); @@ -105,9 +97,7 @@ EffectManifestPointer EchoEffect::getManifest() { quantize->setControlHint(EffectManifestParameter::ControlHint::TOGGLE_STEPPING); quantize->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); quantize->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); - quantize->setDefault(1); - quantize->setMinimum(0); - quantize->setMaximum(1); + quantize->setRange(0, 1, 1); EffectManifestParameterPointer triplet = pManifest->addParameter(); triplet->setId("triplet"); @@ -118,9 +108,7 @@ EffectManifestPointer EchoEffect::getManifest() { triplet->setControlHint(EffectManifestParameter::ControlHint::TOGGLE_STEPPING); triplet->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); triplet->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); - triplet->setDefault(0); - triplet->setMinimum(0); - triplet->setMaximum(1); + triplet->setRange(0, 0, 1); return pManifest; } diff --git a/src/effects/builtin/equalizer_util.h b/src/effects/builtin/equalizer_util.h index 1ab188a826fe..f2a8116666de 100644 --- a/src/effects/builtin/equalizer_util.h +++ b/src/effects/builtin/equalizer_util.h @@ -25,9 +25,7 @@ class EqualizerUtil { low->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); low->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); low->setNeutralPointOnScale(0.5); - low->setDefault(1.0); - low->setMinimum(0); - low->setMaximum(maximum); + low->setRange(0, 1.0, maximum); EffectManifestParameterPointer killLow = pManifest->addParameter(); killLow->setId("killLow"); @@ -36,9 +34,7 @@ class EqualizerUtil { killLow->setControlHint(EffectManifestParameter::ControlHint::TOGGLE_STEPPING); killLow->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); killLow->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); - killLow->setDefault(0); - killLow->setMinimum(0); - killLow->setMaximum(1); + killLow->setRange(0, 0, 1); EffectManifestParameterPointer mid = pManifest->addParameter(); mid->setId("mid"); @@ -48,9 +44,7 @@ class EqualizerUtil { mid->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); mid->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); mid->setNeutralPointOnScale(0.5); - mid->setDefault(1.0); - mid->setMinimum(0); - mid->setMaximum(maximum); + mid->setRange(0, 1.0, maximum); EffectManifestParameterPointer killMid = pManifest->addParameter(); killMid->setId("killMid"); @@ -59,9 +53,7 @@ class EqualizerUtil { killMid->setControlHint(EffectManifestParameter::ControlHint::TOGGLE_STEPPING); killMid->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); killMid->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); - killMid->setDefault(0); - killMid->setMinimum(0); - killMid->setMaximum(1); + killMid->setRange(0, 0, 1); EffectManifestParameterPointer high = pManifest->addParameter(); high->setId("high"); @@ -71,9 +63,7 @@ class EqualizerUtil { high->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); high->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); high->setNeutralPointOnScale(0.5); - high->setDefault(1.0); - high->setMinimum(0); - high->setMaximum(maximum); + high->setRange(0, 1.0, maximum); EffectManifestParameterPointer killHigh = pManifest->addParameter(); killHigh->setId("killHigh"); @@ -82,9 +72,7 @@ class EqualizerUtil { killHigh->setControlHint(EffectManifestParameter::ControlHint::TOGGLE_STEPPING); killHigh->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); killHigh->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); - killHigh->setDefault(0); - killHigh->setMinimum(0); - killHigh->setMaximum(1); + killHigh->setRange(0, 0, 1); } static QString adjustFrequencyShelvesTip() { diff --git a/src/effects/builtin/filtereffect.cpp b/src/effects/builtin/filtereffect.cpp index ac7801b5f2ff..e0400424e566 100644 --- a/src/effects/builtin/filtereffect.cpp +++ b/src/effects/builtin/filtereffect.cpp @@ -34,9 +34,7 @@ EffectManifestPointer FilterEffect::getManifest() { lpf->setUnitsHint(EffectManifestParameter::UnitsHint::HERTZ); lpf->setDefaultLinkType(EffectManifestParameter::LinkType::LINKED_LEFT); lpf->setNeutralPointOnScale(1); - lpf->setDefault(kMaxCorner); - lpf->setMinimum(kMinCorner); - lpf->setMaximum(kMaxCorner); + lpf->setRange(kMinCorner, kMaxCorner, kMaxCorner); EffectManifestParameterPointer q = pManifest->addParameter(); q->setId("q"); @@ -48,9 +46,7 @@ EffectManifestPointer FilterEffect::getManifest() { q->setControlHint(EffectManifestParameter::ControlHint::KNOB_LOGARITHMIC); q->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); q->setUnitsHint(EffectManifestParameter::UnitsHint::SAMPLERATE); - q->setDefault(0.707106781); // 0.707106781 = Butterworth - q->setMinimum(0.4); - q->setMaximum(4.0); + q->setRange(0.4, 0.707106781, 4.0); // 0.707106781 = Butterworth EffectManifestParameterPointer hpf = pManifest->addParameter(); hpf->setId("hpf"); @@ -63,9 +59,7 @@ EffectManifestPointer FilterEffect::getManifest() { hpf->setUnitsHint(EffectManifestParameter::UnitsHint::HERTZ); hpf->setDefaultLinkType(EffectManifestParameter::LinkType::LINKED_RIGHT); hpf->setNeutralPointOnScale(0.0); - hpf->setDefault(kMinCorner); - hpf->setMinimum(kMinCorner); - hpf->setMaximum(kMaxCorner); + hpf->setRange(kMinCorner, kMinCorner, kMaxCorner); return pManifest; } diff --git a/src/effects/builtin/flangereffect.cpp b/src/effects/builtin/flangereffect.cpp index 3601a5378295..e73c352919a5 100644 --- a/src/effects/builtin/flangereffect.cpp +++ b/src/effects/builtin/flangereffect.cpp @@ -42,9 +42,7 @@ EffectManifestPointer FlangerEffect::getManifest() { "1/32 - 4 Hz if no tempo is detected")); speed->setControlHint(EffectManifestParameter::ControlHint::KNOB_LOGARITHMIC_INVERSE); speed->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); - speed->setMinimum(kMinLfoBeats); - speed->setMaximum(kMaxLfoBeats); - speed->setDefault(8); + speed->setRange(kMinLfoBeats, 8, kMaxLfoBeats); EffectManifestParameterPointer width = pManifest->addParameter(); width->setId("width"); @@ -55,9 +53,7 @@ EffectManifestPointer FlangerEffect::getManifest() { width->setControlHint(EffectManifestParameter::ControlHint::KNOB_LOGARITHMIC); width->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); width->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); - width->setDefault(kMaxLfoWidthMs / 2); - width->setMinimum(0.0); - width->setMaximum(kMaxLfoWidthMs); + width->setRange(0.0, kMaxLfoWidthMs / 2, kMaxLfoWidthMs); EffectManifestParameterPointer manual = pManifest->addParameter(); manual->setId("manual"); @@ -69,9 +65,7 @@ EffectManifestPointer FlangerEffect::getManifest() { manual->setControlHint(EffectManifestParameter::ControlHint::KNOB_LOGARITHMIC); manual->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); manual->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); - manual->setDefault(kCenterDelayMs); - manual->setMinimum(kMinDelayMs); - manual->setMaximum(kMaxDelayMs); + manual->setRange(kMinDelayMs, kCenterDelayMs, kMaxDelayMs); EffectManifestParameterPointer regen = pManifest->addParameter(); regen->setId("regen"); @@ -82,9 +76,7 @@ EffectManifestPointer FlangerEffect::getManifest() { regen->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); regen->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); regen->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); - regen->setDefault(0.25); - regen->setMinimum(0.0); - regen->setMaximum(1.0); + regen->setRange(0.0, 0.25, 1.0); EffectManifestParameterPointer mix = pManifest->addParameter(); mix->setId("mix"); @@ -96,9 +88,7 @@ EffectManifestPointer FlangerEffect::getManifest() { mix->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); mix->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); mix->setDefaultLinkType(EffectManifestParameter::LinkType::LINKED); - mix->setDefault(1.0); - mix->setMinimum(0.0); - mix->setMaximum(1.0); + mix->setRange(0.0, 1.0, 1.0); EffectManifestParameterPointer triplet = pManifest->addParameter(); triplet->setId("triplet"); @@ -109,9 +99,7 @@ EffectManifestPointer FlangerEffect::getManifest() { triplet->setControlHint(EffectManifestParameter::ControlHint::TOGGLE_STEPPING); triplet->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); triplet->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); - triplet->setDefault(0); - triplet->setMinimum(0); - triplet->setMaximum(1); + triplet->setRange(0, 0, 1); return pManifest; } diff --git a/src/effects/builtin/graphiceqeffect.cpp b/src/effects/builtin/graphiceqeffect.cpp index a06b4484462d..dbae3e9bc2a4 100644 --- a/src/effects/builtin/graphiceqeffect.cpp +++ b/src/effects/builtin/graphiceqeffect.cpp @@ -35,9 +35,7 @@ EffectManifestPointer GraphicEQEffect::getManifest() { low->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); low->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); low->setNeutralPointOnScale(0.5); - low->setDefault(0); - low->setMinimum(-12); - low->setMaximum(12); + low->setRange(-12, 0, 12); QString paramName; for (int i = 0; i < 6; i++) { @@ -57,9 +55,7 @@ EffectManifestPointer GraphicEQEffect::getManifest() { mid->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); mid->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); mid->setNeutralPointOnScale(0.5); - mid->setDefault(0); - mid->setMinimum(-12); - mid->setMaximum(12); + mid->setRange(-12, 0, 12); } EffectManifestParameterPointer high = pManifest->addParameter(); @@ -70,9 +66,7 @@ EffectManifestPointer GraphicEQEffect::getManifest() { high->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); high->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); high->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); - high->setDefault(0); - high->setMinimum(-12); - high->setMaximum(12); + high->setRange(-12, 0, 12); return pManifest; } diff --git a/src/effects/builtin/loudnesscontoureffect.cpp b/src/effects/builtin/loudnesscontoureffect.cpp index 6ae89bf0fc59..cdff84946702 100644 --- a/src/effects/builtin/loudnesscontoureffect.cpp +++ b/src/effects/builtin/loudnesscontoureffect.cpp @@ -43,9 +43,7 @@ EffectManifestPointer LoudnessContourEffect::getManifest() { loudness->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); loudness->setDefaultLinkType(EffectManifestParameter::LinkType::LINKED); loudness->setNeutralPointOnScale(1); - loudness->setDefault(-kMaxLoGain / 2); - loudness->setMinimum(-kMaxLoGain); - loudness->setMaximum(0); + loudness->setRange(-kMaxLoGain, -kMaxLoGain / 2, 0); EffectManifestParameterPointer useGain = pManifest->addParameter(); useGain->setId("useGain"); @@ -56,9 +54,7 @@ EffectManifestPointer LoudnessContourEffect::getManifest() { useGain->setControlHint(EffectManifestParameter::ControlHint::TOGGLE_STEPPING); useGain->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); useGain->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); - useGain->setDefault(0); - useGain->setMinimum(0); - useGain->setMaximum(1); + useGain->setRange(0, 0, 1); return pManifest; } diff --git a/src/effects/builtin/metronomeeffect.cpp b/src/effects/builtin/metronomeeffect.cpp index c872a871e06d..5c5427fb54b9 100644 --- a/src/effects/builtin/metronomeeffect.cpp +++ b/src/effects/builtin/metronomeeffect.cpp @@ -32,9 +32,7 @@ EffectManifestPointer MetronomeEffect::getManifest() { period->setControlHint(EffectManifestParameter::ControlHint::KNOB_LOGARITHMIC); period->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); period->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); - period->setMinimum(40); - period->setDefault(120); - period->setMaximum(208); + period->setRange(40, 120, 208); // Period unit @@ -45,9 +43,7 @@ EffectManifestPointer MetronomeEffect::getManifest() { periodUnit->setControlHint(EffectManifestParameter::ControlHint::TOGGLE_STEPPING); periodUnit->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); periodUnit->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); - periodUnit->setDefault(1); - periodUnit->setMinimum(0); - periodUnit->setMaximum(1); + periodUnit->setRange(0, 1, 1); return pManifest; } diff --git a/src/effects/builtin/moogladder4filtereffect.cpp b/src/effects/builtin/moogladder4filtereffect.cpp index 6e8887da9648..f2090e7a3525 100644 --- a/src/effects/builtin/moogladder4filtereffect.cpp +++ b/src/effects/builtin/moogladder4filtereffect.cpp @@ -32,9 +32,7 @@ EffectManifestPointer MoogLadder4FilterEffect::getManifest() { lpf->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); lpf->setDefaultLinkType(EffectManifestParameter::LinkType::LINKED_LEFT); lpf->setNeutralPointOnScale(1); - lpf->setDefault(kMaxCorner); - lpf->setMinimum(kMinCorner); - lpf->setMaximum(kMaxCorner); + lpf->setRange(kMinCorner, kMaxCorner, kMaxCorner); EffectManifestParameterPointer q = pManifest->addParameter(); q->setId("resonance"); @@ -44,9 +42,7 @@ EffectManifestPointer MoogLadder4FilterEffect::getManifest() { q->setControlHint(EffectManifestParameter::ControlHint::KNOB_LOGARITHMIC); q->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); q->setUnitsHint(EffectManifestParameter::UnitsHint::SAMPLERATE); - q->setMinimum(0.0); - q->setMaximum(4.0); - q->setDefault(1.0); + q->setRange(0.0, 1.0, 4.0); EffectManifestParameterPointer hpf = pManifest->addParameter(); hpf->setId("hpf"); @@ -57,9 +53,7 @@ EffectManifestPointer MoogLadder4FilterEffect::getManifest() { hpf->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); hpf->setDefaultLinkType(EffectManifestParameter::LinkType::LINKED_RIGHT); hpf->setNeutralPointOnScale(0.0); - hpf->setDefault(kMinCorner); - hpf->setMinimum(kMinCorner); - hpf->setMaximum(kMaxCorner); + hpf->setRange(kMinCorner, kMinCorner, kMaxCorner); return pManifest; } diff --git a/src/effects/builtin/parametriceqeffect.cpp b/src/effects/builtin/parametriceqeffect.cpp index 683df597757d..e61ed9274a25 100644 --- a/src/effects/builtin/parametriceqeffect.cpp +++ b/src/effects/builtin/parametriceqeffect.cpp @@ -36,9 +36,7 @@ EffectManifestPointer ParametricEQEffect::getManifest() { gain1->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); gain1->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); gain1->setNeutralPointOnScale(0.5); - gain1->setDefault(0); - gain1->setMinimum(-18); - gain1->setMaximum(18); // dB + gain1->setRange(-18, 0, 18); // dB EffectManifestParameterPointer q1 = pManifest->addParameter(); q1->setId("q1"); @@ -52,9 +50,7 @@ EffectManifestPointer ParametricEQEffect::getManifest() { q1->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); q1->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); q1->setNeutralPointOnScale(0.5); - q1->setDefault(1.75); - q1->setMinimum(0.5); - q1->setMaximum(3.0); + q1->setRange(0.5, 1.75, 3.0); EffectManifestParameterPointer center1 = pManifest->addParameter(); center1->setId("center1"); @@ -66,9 +62,7 @@ EffectManifestPointer ParametricEQEffect::getManifest() { center1->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); center1->setUnitsHint(EffectManifestParameter::UnitsHint::HERTZ); center1->setNeutralPointOnScale(0.5); - center1->setDefault(kDefaultCenter1); - center1->setMinimum(100); - center1->setMaximum(14000); + center1->setRange(100, kDefaultCenter1, 14000); EffectManifestParameterPointer gain2 = pManifest->addParameter(); gain2->setId("gain2"); @@ -80,9 +74,7 @@ EffectManifestPointer ParametricEQEffect::getManifest() { gain2->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); gain2->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); gain2->setNeutralPointOnScale(0.5); - gain2->setDefault(0); - gain2->setMinimum(-18); - gain2->setMaximum(18); // dB + gain2->setRange(-18, 0, 18); // dB EffectManifestParameterPointer q2 = pManifest->addParameter(); q2->setId("q2"); @@ -96,9 +88,7 @@ EffectManifestPointer ParametricEQEffect::getManifest() { q2->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); q2->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); q2->setNeutralPointOnScale(0.5); - q2->setDefault(1.75); - q2->setMinimum(0.5); - q2->setMaximum(3.0); + q2->setRange(0.5, 1.75, 3.0); EffectManifestParameterPointer center2 = pManifest->addParameter(); center2->setId("center2"); @@ -110,9 +100,7 @@ EffectManifestPointer ParametricEQEffect::getManifest() { center2->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); center2->setUnitsHint(EffectManifestParameter::UnitsHint::HERTZ); center2->setNeutralPointOnScale(0.5); - center2->setDefault(kDefaultCenter2); - center2->setMinimum(100); - center2->setMaximum(14000); + center2->setRange(100, kDefaultCenter2, 14000); return pManifest; } diff --git a/src/effects/builtin/phasereffect.cpp b/src/effects/builtin/phasereffect.cpp index d4559a25f76d..2d051e8d4528 100644 --- a/src/effects/builtin/phasereffect.cpp +++ b/src/effects/builtin/phasereffect.cpp @@ -35,9 +35,7 @@ EffectManifestPointer PhaserEffect::getManifest() { period->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); period->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); period->setUnitsHint(EffectManifestParameter::UnitsHint::BEATS); - period->setMinimum(0.0); - period->setMaximum(4.0); - period->setDefault(1.0); + period->setRange(0.0, 1.0, 4.0); EffectManifestParameterPointer fb = pManifest->addParameter(); fb->setId("feedback"); @@ -48,9 +46,7 @@ EffectManifestPointer PhaserEffect::getManifest() { fb->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); fb->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); fb->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); - fb->setMinimum(-1.0); - fb->setMaximum(1.0); - fb->setDefault(0.0); + fb->setRange(-1.0, 0.0, 1.0); EffectManifestParameterPointer range = pManifest->addParameter(); range->setId("range"); @@ -61,9 +57,7 @@ EffectManifestPointer PhaserEffect::getManifest() { range->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); range->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); range->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); - range->setMinimum(0.05); - range->setMaximum(1.0); - range->setDefault(1.0); + range->setRange(0.05, 1.0, 1.0); EffectManifestParameterPointer stages = pManifest->addParameter(); stages->setId("stages"); @@ -74,9 +68,7 @@ EffectManifestPointer PhaserEffect::getManifest() { stages->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); stages->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); stages->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); - stages->setMinimum(1.0); - stages->setMaximum(6.0); - stages->setDefault(3.5); + stages->setRange(1.0, 3.5, 6.0); EffectManifestParameterPointer depth = pManifest->addParameter(); depth->setId("depth"); @@ -88,9 +80,7 @@ EffectManifestPointer PhaserEffect::getManifest() { depth->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); depth->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); depth->setDefaultLinkType(EffectManifestParameter::LinkType::LINKED); - depth->setMinimum(0.5); - depth->setMaximum(1.0); - depth->setDefault(0.5); + depth->setRange(0.5, 0.5, 1.0); EffectManifestParameterPointer triplet = pManifest->addParameter(); triplet->setId("triplet"); @@ -101,9 +91,7 @@ EffectManifestPointer PhaserEffect::getManifest() { triplet->setControlHint(EffectManifestParameter::ControlHint::TOGGLE_STEPPING); triplet->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); triplet->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); - triplet->setDefault(0); - triplet->setMinimum(0); - triplet->setMaximum(1); + triplet->setRange(0, 0, 1); EffectManifestParameterPointer stereo = pManifest->addParameter(); stereo->setId("stereo"); @@ -114,9 +102,7 @@ EffectManifestPointer PhaserEffect::getManifest() { stereo->setControlHint(EffectManifestParameter::ControlHint::TOGGLE_STEPPING); stereo->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); stereo->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); - stereo->setMinimum(0); - stereo->setMaximum(1); - stereo->setDefault(0); + stereo->setRange(0, 0, 1); return pManifest; } diff --git a/src/effects/builtin/reverbeffect.cpp b/src/effects/builtin/reverbeffect.cpp index 3a1a73d3a8b1..1992ceda49eb 100644 --- a/src/effects/builtin/reverbeffect.cpp +++ b/src/effects/builtin/reverbeffect.cpp @@ -31,9 +31,7 @@ EffectManifestPointer ReverbEffect::getManifest() { decay->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); decay->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); decay->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); - decay->setMinimum(0); - decay->setDefault(0.5); - decay->setMaximum(1); + decay->setRange(0, 0.5, 1); EffectManifestParameterPointer bandwidth = pManifest->addParameter(); bandwidth->setId("bandwidth"); @@ -45,9 +43,7 @@ EffectManifestPointer ReverbEffect::getManifest() { bandwidth->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); bandwidth->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); bandwidth->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); - bandwidth->setMinimum(0); - bandwidth->setDefault(1); - bandwidth->setMaximum(1); + bandwidth->setRange(0, 1, 1); EffectManifestParameterPointer damping = pManifest->addParameter(); damping->setId("damping"); @@ -58,9 +54,7 @@ EffectManifestPointer ReverbEffect::getManifest() { damping->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); damping->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); damping->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); - damping->setMinimum(0); - damping->setDefault(0); - damping->setMaximum(1); + damping->setRange(0, 0, 1); EffectManifestParameterPointer send = pManifest->addParameter(); send->setId("send_amount"); @@ -73,9 +67,7 @@ EffectManifestPointer ReverbEffect::getManifest() { send->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); send->setDefaultLinkType(EffectManifestParameter::LinkType::LINKED); send->setDefaultLinkInversion(EffectManifestParameter::LinkInversion::NOT_INVERTED); - send->setMinimum(0); - send->setDefault(0); - send->setMaximum(1); + send->setRange(0, 0, 1); return pManifest; } diff --git a/src/effects/builtin/tremoloeffect.cpp b/src/effects/builtin/tremoloeffect.cpp index 622573eb80ba..a463ed2f0a25 100644 --- a/src/effects/builtin/tremoloeffect.cpp +++ b/src/effects/builtin/tremoloeffect.cpp @@ -32,9 +32,7 @@ EffectManifestPointer TremoloEffect::getManifest() { depth->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); depth->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); depth->setDefaultLinkType(EffectManifestParameter::LinkType::LINKED); - depth->setDefault(1); - depth->setMinimum(0); - depth->setMaximum(1); + depth->setRange(0, 1, 1); EffectManifestParameterPointer rate = pManifest->addParameter(); rate->setId("rate"); @@ -48,9 +46,7 @@ EffectManifestPointer TremoloEffect::getManifest() { EffectManifestParameter::ControlHint::KNOB_LOGARITHMIC); rate->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); rate->setUnitsHint(EffectManifestParameter::UnitsHint::BEATS); - rate->setDefault(1); - rate->setMinimum(1.0/4); - rate->setMaximum(8); + rate->setRange(1.0/4, 1, 8); EffectManifestParameterPointer width = pManifest->addParameter(); width->setId("width"); @@ -62,9 +58,7 @@ EffectManifestPointer TremoloEffect::getManifest() { width->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); width->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); width->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); - width->setMinimum(0.1); - width->setDefault(0.5); - width->setMaximum(0.9); + width->setRange(0.1, 0.5, 0.9); EffectManifestParameterPointer waveform = pManifest->addParameter(); waveform->setId("waveform"); @@ -78,9 +72,7 @@ EffectManifestPointer TremoloEffect::getManifest() { EffectManifestParameter::ControlHint::KNOB_LOGARITHMIC); waveform->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); waveform->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); - waveform->setMinimum(0.005); - waveform->setDefault(0.5); - waveform->setMaximum(1); + waveform->setRange(0.005, 0.5, 1); EffectManifestParameterPointer phase = pManifest->addParameter(); phase->setId("phase"); @@ -94,9 +86,7 @@ EffectManifestPointer TremoloEffect::getManifest() { EffectManifestParameter::ControlHint::KNOB_LINEAR); phase->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); phase->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); - phase->setDefault(0); - phase->setMinimum(0); - phase->setMaximum(1); + phase->setRange(0, 0, 1); EffectManifestParameterPointer quantize = pManifest->addParameter(); quantize->setId("quantize"); @@ -108,9 +98,7 @@ EffectManifestPointer TremoloEffect::getManifest() { EffectManifestParameter::ControlHint::TOGGLE_STEPPING); quantize->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); quantize->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); - quantize->setDefault(1); - quantize->setMinimum(0); - quantize->setMaximum(1); + quantize->setRange(0, 1, 1); EffectManifestParameterPointer triplet = pManifest->addParameter(); triplet->setId("triplet"); @@ -122,9 +110,7 @@ EffectManifestPointer TremoloEffect::getManifest() { EffectManifestParameter::ControlHint::TOGGLE_STEPPING); triplet->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); triplet->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); - triplet->setDefault(0); - triplet->setMinimum(0); - triplet->setMaximum(1); + triplet->setRange(0, 0, 1); return pManifest; } diff --git a/src/effects/effectbuttonparameterslot.cpp b/src/effects/effectbuttonparameterslot.cpp index 3e1db1402f38..bb33e2dca03e 100644 --- a/src/effects/effectbuttonparameterslot.cpp +++ b/src/effects/effectbuttonparameterslot.cpp @@ -50,20 +50,21 @@ void EffectButtonParameterSlot::loadEffect(EffectSlot* pEffectSlot) { m_pEffectParameter = pEffectSlot->getButtonParameterForSlot(m_iParameterSlotNumber); if (m_pEffectParameter) { + m_pManifestParameter = m_pEffectParameter->manifest(); + // Set the number of states int numStates = math_max(m_pEffectParameter->manifest()->getSteps().size(), 2); m_pControlValue->setStates(numStates); //qDebug() << debugString() << "Loading effect parameter" << m_pEffectParameter->name(); double dValue = m_pEffectParameter->getValue(); - double dMinimum = m_pEffectParameter->getMinimum(); + double dMinimum = m_pManifestParameter->getMinimum(); double dMinimumLimit = dMinimum; // TODO(rryan) expose limit from EffectParameter - double dMaximum = m_pEffectParameter->getMaximum(); + double dMaximum = m_pManifestParameter->getMaximum(); double dMaximumLimit = dMaximum; // TODO(rryan) expose limit from EffectParameter - double dDefault = m_pEffectParameter->getDefault(); + double dDefault = m_pManifestParameter->getDefault(); if (dValue > dMaximum || dValue < dMinimum || - dMinimum < dMinimumLimit || dMaximum > dMaximumLimit || - dDefault > dMaximum || dDefault < dMinimum) { + dMinimum < dMinimumLimit || dMaximum > dMaximumLimit) { qWarning() << debugString() << "WARNING: EffectParameter does not satisfy basic sanity checks."; } @@ -73,7 +74,7 @@ void EffectButtonParameterSlot::loadEffect(EffectSlot* pEffectSlot) { m_pControlValue->set(dValue); m_pControlValue->setDefaultValue(dDefault); - EffectManifestParameter::ControlHint type = m_pEffectParameter->getControlHint(); + EffectManifestParameter::ControlHint type = m_pManifestParameter->controlHint(); // TODO(rryan) expose this from EffectParameter m_pControlType->forceSet(static_cast(type)); // Default loaded parameters to loaded and unlinked @@ -91,6 +92,7 @@ void EffectButtonParameterSlot::clear() { if (m_pEffectParameter) { m_pEffectParameter->disconnect(this); m_pEffectParameter = nullptr; + m_pManifestParameter.clear(); } m_pEffectSlot = nullptr; @@ -114,33 +116,33 @@ void EffectButtonParameterSlot::slotValueChanged(double v) { QDomElement EffectButtonParameterSlot::toXml(QDomDocument* doc) const { QDomElement parameterElement; - if (m_pEffectParameter != nullptr) { - parameterElement = doc->createElement(EffectXml::Parameter); - XmlParse::addElement(*doc, parameterElement, - EffectXml::ParameterValue, - QString::number(m_pControlValue->get())); - } + // if (m_pEffectParameter != nullptr) { + // parameterElement = doc->createElement(EffectXml::Parameter); + // XmlParse::addElement(*doc, parameterElement, + // EffectXml::ParameterValue, + // QString::number(m_pControlValue->get())); + // } return parameterElement; } void EffectButtonParameterSlot::loadParameterSlotFromXml(const QDomElement& parameterElement) { - if (m_pEffectParameter == nullptr) { - return; - } - if (!parameterElement.hasChildNodes()) { - m_pControlValue->reset(); - } else { - bool conversionWorked = false; - double value = XmlParse::selectNodeDouble(parameterElement, - EffectXml::ParameterValue, - &conversionWorked); - if (conversionWorked) { - // Need to use setParameterFrom(..., nullptr) here to - // trigger valueChanged() signal emission and execute slotValueChanged() - m_pControlValue->setParameterFrom(value, nullptr); - } - // If the conversion failed, the default value is kept. - } + // if (m_pEffectParameter == nullptr) { + // return; + // } + // if (!parameterElement.hasChildNodes()) { + // m_pControlValue->reset(); + // } else { + // bool conversionWorked = false; + // double value = XmlParse::selectNodeDouble(parameterElement, + // EffectXml::ParameterValue, + // &conversionWorked); + // if (conversionWorked) { + // // Need to use setParameterFrom(..., nullptr) here to + // // trigger valueChanged() signal emission and execute slotValueChanged() + // m_pControlValue->setParameterFrom(value, nullptr); + // } + // // If the conversion failed, the default value is kept. + // } } diff --git a/src/effects/effectmanifestparameter.h b/src/effects/effectmanifestparameter.h index baee35ccc07d..5ba77c90b566 100644 --- a/src/effects/effectmanifestparameter.h +++ b/src/effects/effectmanifestparameter.h @@ -6,6 +6,8 @@ #include #include +#include "util/assert.h" + class EffectManifestParameter; typedef QSharedPointer EffectManifestParameterPointer; @@ -202,21 +204,22 @@ class EffectManifestParameter { virtual const double& getDefault() const { return m_default; } - virtual void setDefault(const double& defaultValue) { - m_default = defaultValue; - } virtual const double& getMinimum() const { return m_minimum; } - virtual void setMinimum(const double& minimum) { - m_minimum = minimum; - } virtual const double& getMaximum() const { return m_maximum; } - virtual void setMaximum(const double& maximum) { + + virtual void setRange(const double& minimum, const double& defaultValue, const double& maximum) { + VERIFY_OR_DEBUG_ASSERT(minimum <= defaultValue && defaultValue <= maximum) { + qWarning() << "Invalid Parameter Range: " << minimum << ' ' << defaultValue << ' ' << maximum; + return; + } + m_minimum = minimum; + m_default = defaultValue; m_maximum = maximum; } diff --git a/src/effects/effectparameter.cpp b/src/effects/effectparameter.cpp index 7ad1c1010c6d..0c3df0ca118c 100644 --- a/src/effects/effectparameter.cpp +++ b/src/effects/effectparameter.cpp @@ -10,28 +10,12 @@ EffectParameter::EffectParameter(EffectSlot* pEffectSlot, EffectsManager* pEffec m_pEffectSlot(pEffectSlot), m_pEffectsManager(pEffectsManager), m_iParameterNumber(iParameterNumber), - m_pParameter(pParameter), - m_bAddedToEngine(false) { + m_pParameter(pParameter) { // qDebug() << debugString() << "Constructing new EffectParameter from EffectManifestParameter:" // << m_parameter.id(); - m_minimum = m_pParameter->getMinimum(); - m_maximum = m_pParameter->getMaximum(); - // Sanity check the maximum and minimum - if (m_minimum > m_maximum) { - qWarning() << debugString() << "WARNING: Parameter maximum is less than the minimum."; - m_maximum = m_minimum; - } - // If the parameter specifies a default, set that. Otherwise use the minimum - // value. - m_default = m_pParameter->getDefault(); - if (m_default < m_minimum || m_default > m_maximum) { - qWarning() << debugString() << "WARNING: Parameter default is outside of minimum/maximum range."; - m_default = m_minimum; - } - - // Finally, set the value to the default. - m_value = m_default; + // Set the value to the default. + m_value = m_pParameter->getDefault(); } EffectParameter::~EffectParameter() { @@ -42,22 +26,6 @@ EffectManifestParameterPointer EffectParameter::manifest() const { return m_pParameter; } -const QString& EffectParameter::id() const { - return m_pParameter->id(); -} - -const QString& EffectParameter::name() const { - return m_pParameter->name(); -} - -const QString& EffectParameter::shortName() const { - return m_pParameter->shortName(); -} - -const QString& EffectParameter::description() const { - return m_pParameter->description(); -} - // static bool EffectParameter::clampValue(double* pValue, const double& minimum, const double& maximum) { @@ -72,31 +40,7 @@ bool EffectParameter::clampValue(double* pValue, } bool EffectParameter::clampValue() { - return clampValue(&m_value, m_minimum, m_maximum); -} - -bool EffectParameter::clampDefault() { - return clampValue(&m_default, m_minimum, m_maximum); -} - -bool EffectParameter::clampRanges() { - if (m_minimum > m_maximum) { - m_maximum = m_minimum; - return true; - } - return false; -} - -EffectManifestParameter::LinkType EffectParameter::getDefaultLinkType() const { - return m_pParameter->defaultLinkType(); -} - -EffectManifestParameter::LinkInversion EffectParameter::getDefaultLinkInversion() const { - return m_pParameter->defaultLinkInversion(); -} - -double EffectParameter::getNeutralPointOnScale() const { - return m_pParameter->neutralPointOnScale(); + return clampValue(&m_value, m_pParameter->getMinimum(), m_pParameter->getMaximum()); } double EffectParameter::getValue() const { @@ -117,98 +61,6 @@ void EffectParameter::setValue(double value) { emit(valueChanged(m_value)); } -double EffectParameter::getDefault() const { - return m_default; -} - -void EffectParameter::setDefault(double dflt) { - m_default = dflt; - - if (clampDefault()) { - qWarning() << debugString() << "WARNING: Default parameter value was outside of range, clamped."; - } - - m_default = dflt; - - updateEngineState(); -} - -double EffectParameter::getMinimum() const { - return m_minimum; -} - -void EffectParameter::setMinimum(double minimum) { - // There's a degenerate case here where the maximum could be lower - // than the manifest minimum. If that's the case, then the minimum - // value is currently below the manifest minimum. Since similar - // guards exist in the setMaximum call, this should not be able to - // happen. - VERIFY_OR_DEBUG_ASSERT(m_minimum >= m_pParameter->getMinimum()) { - return; - } - - m_minimum = minimum; - if (m_minimum < m_pParameter->getMinimum()) { - qWarning() << debugString() << "WARNING: Minimum value is less than plugin's absolute minimum, clamping."; - m_minimum = m_pParameter->getMinimum(); - } - - if (m_minimum > m_maximum) { - qWarning() << debugString() << "WARNING: New minimum was above maximum, clamped."; - m_minimum = m_maximum; - } - - if (clampValue()) { - qWarning() << debugString() << "WARNING: Value was outside of new minimum, clamped."; - } - - if (clampDefault()) { - qWarning() << debugString() << "WARNING: Default was outside of new minimum, clamped."; - } - - updateEngineState(); -} - -double EffectParameter::getMaximum() const { - return m_maximum; -} - -void EffectParameter::setMaximum(double maximum) { - // There's a degenerate case here where the minimum could be larger - // than the manifest maximum. If that's the case, then the maximum - // value is currently above the manifest maximum. Since similar - // guards exist in the setMinimum call, this should not be able to - // happen. - VERIFY_OR_DEBUG_ASSERT(m_maximum <= m_pParameter->getMaximum()) { - return; - } - - m_maximum = maximum; - if (m_maximum > m_pParameter->getMaximum()) { - qWarning() << debugString() << "WARNING: Maximum value is less than plugin's absolute maximum, clamping."; - m_maximum = m_pParameter->getMaximum(); - } - - if (m_maximum < m_minimum) { - qWarning() << debugString() << "WARNING: New maximum was below the minimum, clamped."; - m_maximum = m_minimum; - } - - if (clampValue()) { - qWarning() << debugString() << "WARNING: Value was outside of new maximum, clamped."; - } - - if (clampDefault()) { - qWarning() << debugString() << "WARNING: Default was outside of new maximum, clamped."; - } - - updateEngineState(); -} - -EffectManifestParameter::ControlHint EffectParameter::getControlHint() const { - return m_pParameter->controlHint(); -} - void EffectParameter::updateEngineState() { EngineEffect* pEngineEffect = m_pEffectSlot->getEngineEffect(); if (!pEngineEffect) { @@ -219,8 +71,8 @@ void EffectParameter::updateEngineState() { pRequest->pTargetEffect = pEngineEffect; pRequest->SetParameterParameters.iParameter = m_iParameterNumber; pRequest->value = m_value; - pRequest->minimum = m_minimum; - pRequest->maximum = m_maximum; - pRequest->default_value = m_default; + pRequest->minimum = m_pParameter->getMinimum(); + pRequest->maximum = m_pParameter->getMaximum(); + pRequest->default_value = m_pParameter->getDefault(); m_pEffectsManager->writeRequest(pRequest); } diff --git a/src/effects/effectparameter.h b/src/effects/effectparameter.h index 290eb4e72119..e2ec97cbf44e 100644 --- a/src/effects/effectparameter.h +++ b/src/effects/effectparameter.h @@ -23,42 +23,11 @@ class EffectParameter : public QObject { int iParameterNumber, EffectManifestParameterPointer pParameter); virtual ~EffectParameter(); - void addToEngine(); - void removeFromEngine(); - - /////////////////////////////////////////////////////////////////////////// - // Parameter Information - /////////////////////////////////////////////////////////////////////////// - EffectManifestParameterPointer manifest() const; - const QString& id() const; - const QString& name() const; - const QString& shortName() const; - const QString& description() const; - - /////////////////////////////////////////////////////////////////////////// - // Value Settings - /////////////////////////////////////////////////////////////////////////// - - EffectManifestParameter::LinkType getDefaultLinkType() const; - EffectManifestParameter::LinkInversion getDefaultLinkInversion() const; - double getNeutralPointOnScale() const; double getValue() const; - void setValue(double value); - double getDefault() const; - void setDefault(double defaultValue); - - double getMinimum() const; - void setMinimum(double minimum); - - double getMaximum() const; - void setMaximum(double maximum); - - EffectManifestParameter::ControlHint getControlHint() const; - void updateEngineState(); signals: @@ -72,18 +41,12 @@ class EffectParameter : public QObject { static bool clampValue(double* pValue, const double& minimum, const double& maximum); bool clampValue(); - bool clampDefault(); - bool clampRanges(); EffectSlot* m_pEffectSlot; EffectsManager* m_pEffectsManager; int m_iParameterNumber; EffectManifestParameterPointer m_pParameter; - double m_minimum; - double m_maximum; - double m_default; double m_value; - bool m_bAddedToEngine; DISALLOW_COPY_AND_ASSIGN(EffectParameter); }; diff --git a/src/effects/effectparameterslot.cpp b/src/effects/effectparameterslot.cpp index 983f49dabe5b..448f9e3a0a3a 100644 --- a/src/effects/effectparameterslot.cpp +++ b/src/effects/effectparameterslot.cpp @@ -64,25 +64,26 @@ void EffectParameterSlot::loadEffect(EffectSlot* pEffectSlot) { m_pEffectParameter = pEffectSlot->getKnobParameterForSlot(m_iParameterSlotNumber); if (m_pEffectParameter) { - //qDebug() << debugString() << "Loading effect parameter" << m_pEffectParameter->name(); + m_pManifestParameter = m_pEffectParameter->manifest(); + + // qDebug() << debugString() << "Loading effect parameter" << m_pEffectParameter->name(); double dValue = m_pEffectParameter->getValue(); - double dMinimum = m_pEffectParameter->getMinimum(); + double dMinimum = m_pManifestParameter->getMinimum(); double dMinimumLimit = dMinimum; // TODO(rryan) expose limit from EffectParameter - double dMaximum = m_pEffectParameter->getMaximum(); + double dMaximum = m_pManifestParameter->getMaximum(); double dMaximumLimit = dMaximum; // TODO(rryan) expose limit from EffectParameter - double dDefault = m_pEffectParameter->getDefault(); + double dDefault = m_pManifestParameter->getDefault(); if (dValue > dMaximum || dValue < dMinimum || - dMinimum < dMinimumLimit || dMaximum > dMaximumLimit || - dDefault > dMaximum || dDefault < dMinimum) { + dMinimum < dMinimumLimit || dMaximum > dMaximumLimit) { qWarning() << debugString() << "WARNING: EffectParameter does not satisfy basic sanity checks."; } - //qDebug() << debugString() - // << QString("Val: %1 Min: %2 MinLimit: %3 Max: %4 MaxLimit: %5 Default: %6") - // .arg(dValue).arg(dMinimum).arg(dMinimumLimit).arg(dMaximum).arg(dMaximumLimit).arg(dDefault); + // qDebug() << debugString() + // << QString("Val: %1 Min: %2 MinLimit: %3 Max: %4 MaxLimit: %5 Default: %6") + // .arg(dValue).arg(dMinimum).arg(dMinimumLimit).arg(dMaximum).arg(dMaximumLimit).arg(dDefault); - EffectManifestParameter::ControlHint type = m_pEffectParameter->getControlHint(); + EffectManifestParameter::ControlHint type = m_pManifestParameter->controlHint(); m_pControlValue->setBehaviour(type, dMinimum, dMaximum); m_pControlValue->setDefaultValue(dDefault); m_pControlValue->set(dValue); @@ -92,9 +93,9 @@ void EffectParameterSlot::loadEffect(EffectSlot* pEffectSlot) { m_pControlLoaded->forceSet(1.0); m_pControlLinkType->set( - static_cast(m_pEffectParameter->getDefaultLinkType())); + static_cast(m_pManifestParameter->defaultLinkType())); m_pControlLinkInverse->set( - static_cast(m_pEffectParameter->getDefaultLinkInversion())); + static_cast(m_pManifestParameter->defaultLinkInversion())); connect(m_pEffectParameter, SIGNAL(valueChanged(double)), this, SLOT(slotParameterValueChanged(double))); @@ -108,6 +109,7 @@ void EffectParameterSlot::clear() { if (m_pEffectParameter) { m_pEffectParameter->disconnect(this); m_pEffectParameter = nullptr; + m_pManifestParameter.clear(); } m_pControlLoaded->forceSet(0.0); @@ -134,7 +136,7 @@ void EffectParameterSlot::slotLinkTypeChanging(double v) { if (newType == EffectManifestParameter::LinkType::LINKED_LEFT || newType == EffectManifestParameter::LinkType::LINKED_RIGHT || newType == EffectManifestParameter::LinkType::LINKED_LEFT_RIGHT) { - double neutral = m_pEffectParameter->getNeutralPointOnScale(); + double neutral = m_pManifestParameter->neutralPointOnScale(); if (neutral > 0.0 && neutral < 1.0) { // Knob is already a split knob, meaning it has a positive and // negative effect if it's twisted above the neutral point or @@ -174,7 +176,7 @@ void EffectParameterSlot::onEffectMetaParameterChanged(double parameter, bool fo return; } { - double neutral = m_pEffectParameter->getNeutralPointOnScale(); + double neutral = m_pManifestParameter->neutralPointOnScale(); if (neutral > 0.0 && neutral < 1.0) { if (inverse) { // the neutral position must stick where it is @@ -261,59 +263,59 @@ void EffectParameterSlot::slotValueChanged(double v) { QDomElement EffectParameterSlot::toXml(QDomDocument* doc) const { QDomElement parameterElement; - if (m_pEffectParameter != nullptr) { - parameterElement = doc->createElement(EffectXml::Parameter); - XmlParse::addElement(*doc, parameterElement, - EffectXml::ParameterValue, - QString::number(m_pControlValue->getParameter())); - XmlParse::addElement(*doc, parameterElement, - EffectXml::ParameterLinkType, - EffectManifestParameter::LinkTypeToString( - static_cast( - static_cast(m_pControlLinkType->get())))); - XmlParse::addElement(*doc, parameterElement, - EffectXml::ParameterLinkInversion, - QString::number(m_pControlLinkInverse->get())); - } + // if (m_pEffectParameter != nullptr) { + // parameterElement = doc->createElement(EffectXml::Parameter); + // XmlParse::addElement(*doc, parameterElement, + // EffectXml::ParameterValue, + // QString::number(m_pControlValue->getParameter())); + // XmlParse::addElement(*doc, parameterElement, + // EffectXml::ParameterLinkType, + // EffectManifestParameter::LinkTypeToString( + // static_cast( + // static_cast(m_pControlLinkType->get())))); + // XmlParse::addElement(*doc, parameterElement, + // EffectXml::ParameterLinkInversion, + // QString::number(m_pControlLinkInverse->get())); + // } return parameterElement; } void EffectParameterSlot::loadParameterSlotFromXml(const QDomElement& parameterElement) { - if (m_pEffectParameter == nullptr) { - return; - } - if (!parameterElement.hasChildNodes()) { - m_pControlValue->reset(); - m_pControlLinkType->set( - static_cast(m_pEffectParameter->getDefaultLinkType())); - m_pControlLinkInverse->set( - static_cast(m_pEffectParameter->getDefaultLinkInversion())); - } else { - // Need to use setParameterFrom(..., nullptr) here to - // trigger valueChanged() signal emission and execute slotValueChanged() - bool conversionWorked = false; - double value = XmlParse::selectNodeDouble(parameterElement, - EffectXml::ParameterValue, &conversionWorked); - if (conversionWorked) { - // Need to use setParameterFrom(..., nullptr) here to - // trigger valueChanged() signal emission and execute slotValueChanged() - m_pControlValue->setParameterFrom(value, nullptr); - } - // If the conversion failed, the default value is kept. - - QString linkTypeString = XmlParse::selectNodeQString(parameterElement, - EffectXml::ParameterLinkType); - if (!linkTypeString.isEmpty()) { - m_pControlLinkType->set(static_cast( - EffectManifestParameter::LinkTypeFromString(linkTypeString))); - } - - conversionWorked = false; - double linkInversion = XmlParse::selectNodeDouble(parameterElement, - EffectXml::ParameterLinkInversion, &conversionWorked); - if (conversionWorked) { - m_pControlLinkInverse->set(linkInversion); - } - } + // if (m_pEffectParameter == nullptr) { + // return; + // } + // if (!parameterElement.hasChildNodes()) { + // m_pControlValue->reset(); + // m_pControlLinkType->set( + // static_cast(m_pEffectParameter->getDefaultLinkType())); + // m_pControlLinkInverse->set( + // static_cast(m_pEffectParameter->getDefaultLinkInversion())); + // } else { + // // Need to use setParameterFrom(..., nullptr) here to + // // trigger valueChanged() signal emission and execute slotValueChanged() + // bool conversionWorked = false; + // double value = XmlParse::selectNodeDouble(parameterElement, + // EffectXml::ParameterValue, &conversionWorked); + // if (conversionWorked) { + // // Need to use setParameterFrom(..., nullptr) here to + // // trigger valueChanged() signal emission and execute slotValueChanged() + // m_pControlValue->setParameterFrom(value, nullptr); + // } + // // If the conversion failed, the default value is kept. + + // QString linkTypeString = XmlParse::selectNodeQString(parameterElement, + // EffectXml::ParameterLinkType); + // if (!linkTypeString.isEmpty()) { + // m_pControlLinkType->set(static_cast( + // EffectManifestParameter::LinkTypeFromString(linkTypeString))); + // } + + // conversionWorked = false; + // double linkInversion = XmlParse::selectNodeDouble(parameterElement, + // EffectXml::ParameterLinkInversion, &conversionWorked); + // if (conversionWorked) { + // m_pControlLinkInverse->set(linkInversion); + // } + // } } diff --git a/src/effects/effectparameterslotbase.cpp b/src/effects/effectparameterslotbase.cpp index b69356f4d47e..6b3515f3d407 100644 --- a/src/effects/effectparameterslotbase.cpp +++ b/src/effects/effectparameterslotbase.cpp @@ -11,6 +11,7 @@ EffectParameterSlotBase::EffectParameterSlotBase(const QString& group, : m_iParameterSlotNumber(iParameterSlotNumber), m_group(group), m_pEffectParameter(nullptr), + m_pManifestParameter(nullptr), m_pControlLoaded(nullptr), m_pControlType(nullptr), m_dChainParameter(0.0) { @@ -19,35 +20,36 @@ EffectParameterSlotBase::EffectParameterSlotBase(const QString& group, EffectParameterSlotBase::~EffectParameterSlotBase() { m_pEffectParameter = nullptr; + m_pManifestParameter.clear(); m_pEffectSlot = nullptr; delete m_pControlLoaded; delete m_pControlType; } QString EffectParameterSlotBase::name() const { - if (m_pEffectParameter) { - return m_pEffectParameter->name(); + if (m_pManifestParameter) { + return m_pManifestParameter->name(); } return QString(); } QString EffectParameterSlotBase::shortName() const { - if (m_pEffectParameter) { - return m_pEffectParameter->shortName(); + if (m_pManifestParameter) { + return m_pManifestParameter->shortName(); } return QString(); } QString EffectParameterSlotBase::description() const { - if (m_pEffectParameter) { - return m_pEffectParameter->description(); + if (m_pManifestParameter) { + return m_pManifestParameter->description(); } return tr("No effect loaded."); } EffectManifestParameterPointer EffectParameterSlotBase::getManifest() { - if (m_pEffectParameter) { - return m_pEffectParameter->manifest(); + if (m_pManifestParameter) { + return m_pManifestParameter; } return EffectManifestParameterPointer(); } diff --git a/src/effects/effectparameterslotbase.h b/src/effects/effectparameterslotbase.h index 0fe57b7ab07a..9f3743763c39 100644 --- a/src/effects/effectparameterslotbase.h +++ b/src/effects/effectparameterslotbase.h @@ -37,6 +37,7 @@ class EffectParameterSlotBase : public QObject { QString m_group; EffectSlot* m_pEffectSlot; EffectParameter* m_pEffectParameter; + EffectManifestParameterPointer m_pManifestParameter; // Controls exposed to the rest of Mixxx ControlObject* m_pControlLoaded; diff --git a/src/effects/effectslot.cpp b/src/effects/effectslot.cpp index 5e0f2b0ea043..081e83ed813a 100644 --- a/src/effects/effectslot.cpp +++ b/src/effects/effectslot.cpp @@ -182,21 +182,21 @@ void EffectSlot::reload(const QSet& activeInputChannels) } EffectParameterSlotPointer EffectSlot::addEffectParameterSlot() { - EffectParameterSlotPointer pParameter = EffectParameterSlotPointer( + auto pParameterSlot = EffectParameterSlotPointer( new EffectParameterSlot(m_group, m_parameterSlots.size())); - m_parameterSlots.append(pParameter); + m_parameterSlots.append(pParameterSlot); m_pControlNumParameterSlots->forceSet( m_pControlNumParameterSlots->get() + 1); - return pParameter; + return pParameterSlot; } EffectButtonParameterSlotPointer EffectSlot::addEffectButtonParameterSlot() { - EffectButtonParameterSlotPointer pParameter = EffectButtonParameterSlotPointer( + auto pParameterSlot = EffectButtonParameterSlotPointer( new EffectButtonParameterSlot(m_group, m_buttonParameters.size())); - m_buttonParameters.append(pParameter); + m_buttonParameters.append(pParameterSlot); m_pControlNumButtonParameterSlots->forceSet( m_pControlNumButtonParameterSlots->get() + 1); - return pParameter; + return pParameterSlot; } unsigned int EffectSlot::numKnobParameters() const { @@ -351,11 +351,11 @@ void EffectSlot::unloadEffect() { m_pControlLoaded->forceSet(0.0); m_pControlNumParameters->forceSet(0.0); m_pControlNumButtonParameters->forceSet(0.0); - for (const auto& pParameter : m_parameterSlots) { - pParameter->clear(); + for (const auto& pParameterSlot : m_parameterSlots) { + pParameterSlot->clear(); } - for (const auto& pParameter : m_buttonParameters) { - pParameter->clear(); + for (const auto& pButtonParameter : m_buttonParameters) { + pButtonParameter->clear(); } for (int i = 0; i < m_parameters.size(); ++i) { diff --git a/src/effects/lv2/lv2manifest.cpp b/src/effects/lv2/lv2manifest.cpp index ad9547ba6ed2..bd53f57545f4 100644 --- a/src/effects/lv2/lv2manifest.cpp +++ b/src/effects/lv2/lv2manifest.cpp @@ -69,9 +69,7 @@ LV2Manifest::LV2Manifest(const LilvPlugin* plug, param->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); param->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); - param->setDefault(m_default[i]); - param->setMinimum(m_minimum[i]); - param->setMaximum(m_maximum[i]); + param->setRange(m_minimum[i], m_default[i], m_maximum[i]); // Set the appropriate Hints if (lilv_port_has_property(m_pLV2plugin, port, properties["button_port"])) { @@ -121,23 +119,21 @@ LV2Manifest::LV2Manifest(const LilvPlugin* plug, // Some plugins don't specify minimum, maximum and default values // In this case set the minimum and default values to 0 and // the maximum to the number of scale points - if (isnan(m_default[i])) { - param->setDefault(0); - } else { - param->setDefault(m_default[i]); - } + double minimum = 0; + double defaultValue = 0; + double maximum = param->getSteps().size() - 1; - if (isnan(m_minimum[i])) { - param->setMinimum(0); - } else { - param->setMinimum(m_minimum[i]); + if (!isnan(m_minimum[i])) { + minimum = m_minimum[i]; } - - if (isnan(m_maximum[i])) { - param->setMaximum(param->getSteps().size() - 1); - } else { - param->setMaximum(m_maximum[i]); + if (!isnan(m_default[i])) { + defaultValue = m_default[i]; + } + if (!isnan(m_maximum[i])) { + maximum = m_maximum[i]; } + + param->setRange(minimum, defaultValue, maximum); } } diff --git a/src/preferences/dialog/dlgprefeq.cpp b/src/preferences/dialog/dlgprefeq.cpp index 633a6d4d66fc..1ee3f47eb2ec 100644 --- a/src/preferences/dialog/dlgprefeq.cpp +++ b/src/preferences/dialog/dlgprefeq.cpp @@ -670,6 +670,8 @@ void DlgPrefEQ::slotMasterEqEffectChanged(int effectIndex) { for (i = 0; i < knobNum; i++) { EffectParameter* param = pEffectSlot->getKnobParameterForSlot(i); if (param) { + EffectManifestParameterPointer pManifestParameter = param->manifest(); + // Setup Label QLabel* centerFreqLabel = new QLabel(this); QString labelText = param->manifest()->name(); @@ -678,10 +680,10 @@ void DlgPrefEQ::slotMasterEqEffectChanged(int effectIndex) { slidersGridLayout->addWidget(centerFreqLabel, 0, i + 1, Qt::AlignCenter); QSlider* slider = new QSlider(this); - slider->setMinimum(param->getMinimum() * 100); - slider->setMaximum(param->getMaximum() * 100); + slider->setMinimum(pManifestParameter->getMinimum() * 100); + slider->setMaximum(pManifestParameter->getMaximum() * 100); slider->setSingleStep(1); - slider->setValue(param->getDefault() * 100); + slider->setValue(pManifestParameter->getDefault() * 100); slider->setMinimumHeight(90); // Set the index as a property because we need it inside slotUpdateFilter() slider->setProperty("index", QVariant(i)); @@ -753,7 +755,7 @@ void DlgPrefEQ::slotMasterEQToDefault() { for (int i = 0; i < knobNum; i++) { EffectParameter* param = pEffectSlot->getKnobParameterForSlot(i); if (param) { - double defaultValue = param->getDefault(); + double defaultValue = param->manifest()->getDefault(); setMasterEQParameter(i, defaultValue); } } From 766071c555dc704b1ce1bf8177102c525ff79a27 Mon Sep 17 00:00:00 2001 From: Kshitij Gupta Date: Wed, 1 Aug 2018 05:41:08 +0530 Subject: [PATCH 019/443] Added EffectParameter and EffectParameterSlot class comments --- src/effects/effectbuttonparameterslot.h | 2 ++ src/effects/effectparameter.h | 8 +++----- src/effects/effectparameterslot.h | 2 ++ src/effects/effectparameterslotbase.h | 3 +++ 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/effects/effectbuttonparameterslot.h b/src/effects/effectbuttonparameterslot.h index 4a8c14766589..eafa9b8a00ca 100644 --- a/src/effects/effectbuttonparameterslot.h +++ b/src/effects/effectbuttonparameterslot.h @@ -13,6 +13,8 @@ class ControlObject; class ControlPushButton; +// EffectButtonParameterSlot is a wrapper around the parameterX ControlObject +// that loaded with an EffectParameter into itself by the EffectSlot. class EffectButtonParameterSlot : public EffectParameterSlotBase { Q_OBJECT public: diff --git a/src/effects/effectparameter.h b/src/effects/effectparameter.h index e2ec97cbf44e..834eba7c74e0 100644 --- a/src/effects/effectparameter.h +++ b/src/effects/effectparameter.h @@ -11,11 +11,9 @@ class Effect; class EffectsManager; -// An EffectParameter is an instance of an EffectManifestParameter, which is in -// charge of keeping track of the instance values for the default, minimum, -// maximum and value for each Effect's parameter, and validating that they are -// always within acceptable ranges. This class is NOT thread-safe and must only -// be used from the main thread. +// An EffectParameter is a wrapper around EffectManifestParameter that tracks a +// mutable value state and communicates that state to the engine. This class is +// NOT thread-safe and must only be used from the main thread. class EffectParameter : public QObject { Q_OBJECT public: diff --git a/src/effects/effectparameterslot.h b/src/effects/effectparameterslot.h index ec9bf9296273..6c79ce9b3ab3 100644 --- a/src/effects/effectparameterslot.h +++ b/src/effects/effectparameterslot.h @@ -15,6 +15,8 @@ class ControlEffectKnob; class SoftTakeover; class EffectSlot; +// EffectParameterSlot is a wrapper around the parameterX ControlObject +// that loaded with an EffectParameter into itself by the EffectSlot. class EffectParameterSlot : public EffectParameterSlotBase { Q_OBJECT public: diff --git a/src/effects/effectparameterslotbase.h b/src/effects/effectparameterslotbase.h index 9f3743763c39..fbc65be3857f 100644 --- a/src/effects/effectparameterslotbase.h +++ b/src/effects/effectparameterslotbase.h @@ -14,6 +14,9 @@ class ControlPushButton; class EffectParameter; class EffectSlot; + +// EffectParameterSlotBase is a wrapper around the parameterX ControlObject +// that loaded with an EffectParameter into itself by the EffectSlot. class EffectParameterSlotBase : public QObject { Q_OBJECT public: From e292e6382c7412ab58896d614b830d128bfdaa5b Mon Sep 17 00:00:00 2001 From: Kshitij Gupta Date: Thu, 2 Aug 2018 03:37:26 +0530 Subject: [PATCH 020/443] Renamed EffectParameterSlotPointer to EffectKnobParameterSlotPointer --- src/effects/defs.h | 2 +- src/effects/effectslot.cpp | 8 ++++---- src/effects/effectslot.h | 10 +++++----- src/effects/effectsmanager.cpp | 6 +++--- src/effects/effectsmanager.h | 2 +- src/widget/weffectparameterknob.cpp | 4 ++-- src/widget/weffectparameterknob.h | 2 +- src/widget/weffectparameterknobcomposed.cpp | 4 ++-- src/widget/weffectparameterknobcomposed.h | 2 +- 9 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/effects/defs.h b/src/effects/defs.h index ca00b2dcf021..bb412b3eb39a 100644 --- a/src/effects/defs.h +++ b/src/effects/defs.h @@ -59,7 +59,7 @@ class EffectSlot; typedef QSharedPointer EffectSlotPointer; class EffectParameterSlot; -typedef QSharedPointer EffectParameterSlotPointer; +typedef QSharedPointer EffectKnobParameterSlotPointer; class EffectButtonParameterSlot; typedef QSharedPointer EffectButtonParameterSlotPointer; diff --git a/src/effects/effectslot.cpp b/src/effects/effectslot.cpp index 081e83ed813a..aaee0c86bae3 100644 --- a/src/effects/effectslot.cpp +++ b/src/effects/effectslot.cpp @@ -181,8 +181,8 @@ void EffectSlot::reload(const QSet& activeInputChannels) activeInputChannels); } -EffectParameterSlotPointer EffectSlot::addEffectParameterSlot() { - auto pParameterSlot = EffectParameterSlotPointer( +EffectKnobParameterSlotPointer EffectSlot::addEffectParameterSlot() { + auto pParameterSlot = EffectKnobParameterSlotPointer( new EffectParameterSlot(m_group, m_parameterSlots.size())); m_parameterSlots.append(pParameterSlot); m_pControlNumParameterSlots->forceSet( @@ -272,11 +272,11 @@ void EffectSlot::setEnabled(bool enabled) { m_pControlEnabled->set(enabled); } -EffectParameterSlotPointer EffectSlot::getEffectParameterSlot(unsigned int slotNumber) { +EffectKnobParameterSlotPointer EffectSlot::getEffectParameterSlot(unsigned int slotNumber) { //qDebug() << debugString() << "getEffectParameterSlot" << slotNumber; if (slotNumber >= static_cast(m_parameterSlots.size())) { qWarning() << "WARNING: slotNumber out of range"; - return EffectParameterSlotPointer(); + return EffectKnobParameterSlotPointer(); } return m_parameterSlots[slotNumber]; } diff --git a/src/effects/effectslot.h b/src/effects/effectslot.h index c84332630f47..7788a0db2204 100644 --- a/src/effects/effectslot.h +++ b/src/effects/effectslot.h @@ -54,10 +54,10 @@ class EffectSlot : public QObject { } unsigned int numParameterSlots() const; - EffectParameterSlotPointer addEffectParameterSlot(); - EffectParameterSlotPointer getEffectParameterSlot(unsigned int slotNumber); - EffectParameterSlotPointer getEffectParameterSlotForConfigKey(unsigned int slotNumber); - inline const QList& getEffectParameterSlots() const { + EffectKnobParameterSlotPointer addEffectParameterSlot(); + EffectKnobParameterSlotPointer getEffectParameterSlot(unsigned int slotNumber); + EffectKnobParameterSlotPointer getEffectParameterSlotForConfigKey(unsigned int slotNumber); + inline const QList& getEffectParameterSlots() const { return m_parameterSlots; }; @@ -140,7 +140,7 @@ class EffectSlot : public QObject { EngineEffect* m_pEngineEffect; QList m_parameters; EngineEffectChain* m_pEngineEffectChain; - QList m_parameterSlots; + QList m_parameterSlots; QList m_buttonParameters; ControlObject* m_pControlLoaded; diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index 024bdff6f14f..74df3b021bb7 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -351,17 +351,17 @@ EffectSlotPointer EffectsManager::getEffectSlot( return pEffectSlot; } -EffectParameterSlotPointer EffectsManager::getEffectParameterSlot( +EffectKnobParameterSlotPointer EffectsManager::getEffectParameterSlot( const ConfigKey& configKey) { EffectSlotPointer pEffectSlot = getEffectSlot(configKey.group); VERIFY_OR_DEBUG_ASSERT(pEffectSlot) { - return EffectParameterSlotPointer(); + return EffectKnobParameterSlotPointer(); } QRegExp intRegEx(".*(\\d+).*"); intRegEx.indexIn(configKey.item); - EffectParameterSlotPointer pParameterSlot = + EffectKnobParameterSlotPointer pParameterSlot = pEffectSlot->getEffectParameterSlot(intRegEx.cap(1).toInt() - 1); return pParameterSlot; } diff --git a/src/effects/effectsmanager.h b/src/effects/effectsmanager.h index ce4da8592294..35de8baa7df7 100644 --- a/src/effects/effectsmanager.h +++ b/src/effects/effectsmanager.h @@ -111,7 +111,7 @@ class EffectsManager : public QObject { EffectChainSlotPointer getEffectChainSlot(const QString& group) const; EffectSlotPointer getEffectSlot(const QString& group); - EffectParameterSlotPointer getEffectParameterSlot( + EffectKnobParameterSlotPointer getEffectParameterSlot( const ConfigKey& configKey); EffectButtonParameterSlotPointer getEffectButtonParameterSlot( const ConfigKey& configKey); diff --git a/src/widget/weffectparameterknob.cpp b/src/widget/weffectparameterknob.cpp index aafd7a6c217f..fd6ca142a8d8 100644 --- a/src/widget/weffectparameterknob.cpp +++ b/src/widget/weffectparameterknob.cpp @@ -2,7 +2,7 @@ #include "widget/weffectparameterknob.h" void WEffectParameterKnob::setupEffectParameterSlot(const ConfigKey& configKey) { - EffectParameterSlotPointer pParameterSlot = + EffectKnobParameterSlotPointer pParameterSlot = m_pEffectsManager->getEffectParameterSlot(configKey); if (!pParameterSlot) { qWarning() << "EffectParameterKnob" << configKey << @@ -13,7 +13,7 @@ void WEffectParameterKnob::setupEffectParameterSlot(const ConfigKey& configKey) } void WEffectParameterKnob::setEffectParameterSlot( - EffectParameterSlotPointer pParameterSlot) { + EffectKnobParameterSlotPointer pParameterSlot) { m_pEffectParameterSlot = pParameterSlot; if (m_pEffectParameterSlot) { connect(m_pEffectParameterSlot.data(), SIGNAL(updated()), diff --git a/src/widget/weffectparameterknob.h b/src/widget/weffectparameterknob.h index e0a462d2528f..e97eee5e2af1 100644 --- a/src/widget/weffectparameterknob.h +++ b/src/widget/weffectparameterknob.h @@ -27,7 +27,7 @@ class WEffectParameterKnob : public WKnob { private: // Set the EffectParameterSlot that should be monitored by this // WEffectKnobComposed. - void setEffectParameterSlot(EffectParameterSlotPointer pParameterSlot); + void setEffectParameterSlot(EffectKnobParameterSlotPointer pParameterSlot); EffectsManager* m_pEffectsManager; EffectParameterSlotBasePointer m_pEffectParameterSlot; diff --git a/src/widget/weffectparameterknobcomposed.cpp b/src/widget/weffectparameterknobcomposed.cpp index 92be02f01e35..14e5af03d85a 100644 --- a/src/widget/weffectparameterknobcomposed.cpp +++ b/src/widget/weffectparameterknobcomposed.cpp @@ -7,7 +7,7 @@ const QString groupClose = "]"; } // anonymous namespace void WEffectParameterKnobComposed::setupEffectParameterSlot(const ConfigKey& configKey) { - EffectParameterSlotPointer pParameterSlot = + EffectKnobParameterSlotPointer pParameterSlot = m_pEffectsManager->getEffectParameterSlot(configKey); if (!pParameterSlot) { qWarning() << "EffectParameterKnobComposed" << configKey << @@ -18,7 +18,7 @@ void WEffectParameterKnobComposed::setupEffectParameterSlot(const ConfigKey& con } void WEffectParameterKnobComposed::setEffectParameterSlot( - EffectParameterSlotPointer pParameterSlot) { + EffectKnobParameterSlotPointer pParameterSlot) { m_pEffectParameterSlot = pParameterSlot; if (m_pEffectParameterSlot) { connect(m_pEffectParameterSlot.data(), SIGNAL(updated()), diff --git a/src/widget/weffectparameterknobcomposed.h b/src/widget/weffectparameterknobcomposed.h index 754690bb7609..f0c5569672c9 100644 --- a/src/widget/weffectparameterknobcomposed.h +++ b/src/widget/weffectparameterknobcomposed.h @@ -28,7 +28,7 @@ class WEffectParameterKnobComposed : public WKnobComposed { private: // Set the EffectParameterSlot that should be monitored by this // WEffectKnobComposed. - void setEffectParameterSlot(EffectParameterSlotPointer pParameterSlot); + void setEffectParameterSlot(EffectKnobParameterSlotPointer pParameterSlot); EffectsManager* m_pEffectsManager; EffectParameterSlotBasePointer m_pEffectParameterSlot; From 2ac9eb322c64e06f8e87dd9ebe586c9d2043dbd2 Mon Sep 17 00:00:00 2001 From: Kshitij Gupta Date: Thu, 2 Aug 2018 03:58:43 +0530 Subject: [PATCH 021/443] Renamed m_parameterSlots -> m_knobParameterSlots --- src/effects/effectslot.cpp | 24 ++++++++++++------------ src/effects/effectslot.h | 4 ++-- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/effects/effectslot.cpp b/src/effects/effectslot.cpp index aaee0c86bae3..db52c02f724a 100644 --- a/src/effects/effectslot.cpp +++ b/src/effects/effectslot.cpp @@ -183,8 +183,8 @@ void EffectSlot::reload(const QSet& activeInputChannels) EffectKnobParameterSlotPointer EffectSlot::addEffectParameterSlot() { auto pParameterSlot = EffectKnobParameterSlotPointer( - new EffectParameterSlot(m_group, m_parameterSlots.size())); - m_parameterSlots.append(pParameterSlot); + new EffectParameterSlot(m_group, m_knobParameterSlots.size())); + m_knobParameterSlots.append(pParameterSlot); m_pControlNumParameterSlots->forceSet( m_pControlNumParameterSlots->get() + 1); return pParameterSlot; @@ -261,7 +261,7 @@ double EffectSlot::getMetaknobDefault() { } unsigned int EffectSlot::numParameterSlots() const { - return m_parameterSlots.size(); + return m_knobParameterSlots.size(); } unsigned int EffectSlot::numButtonParameterSlots() const { @@ -274,11 +274,11 @@ void EffectSlot::setEnabled(bool enabled) { EffectKnobParameterSlotPointer EffectSlot::getEffectParameterSlot(unsigned int slotNumber) { //qDebug() << debugString() << "getEffectParameterSlot" << slotNumber; - if (slotNumber >= static_cast(m_parameterSlots.size())) { + if (slotNumber >= static_cast(m_knobParameterSlots.size())) { qWarning() << "WARNING: slotNumber out of range"; return EffectKnobParameterSlotPointer(); } - return m_parameterSlots[slotNumber]; + return m_knobParameterSlots[slotNumber]; } EffectButtonParameterSlotPointer EffectSlot::getEffectButtonParameterSlot(unsigned int slotNumber) { @@ -314,7 +314,7 @@ void EffectSlot::loadEffect(const EffectManifestPointer pManifest, m_pControlLoaded->forceSet(1.0); unsigned int iNumKnobParameters = numKnobParameters(); - while (static_cast(m_parameterSlots.size()) + while (static_cast(m_knobParameterSlots.size()) < iNumKnobParameters) { addEffectParameterSlot(); } @@ -325,7 +325,7 @@ void EffectSlot::loadEffect(const EffectManifestPointer pManifest, addEffectButtonParameterSlot(); } - for (const auto& pParameter : m_parameterSlots) { + for (const auto& pParameter : m_knobParameterSlots) { pParameter->loadEffect(this); } for (const auto& pParameter : m_buttonParameters) { @@ -351,7 +351,7 @@ void EffectSlot::unloadEffect() { m_pControlLoaded->forceSet(0.0); m_pControlNumParameters->forceSet(0.0); m_pControlNumButtonParameters->forceSet(0.0); - for (const auto& pParameterSlot : m_parameterSlots) { + for (const auto& pParameterSlot : m_knobParameterSlots) { pParameterSlot->clear(); } for (const auto& pButtonParameter : m_buttonParameters) { @@ -397,7 +397,7 @@ void EffectSlot::slotClear(double v) { } void EffectSlot::syncSofttakeover() { - for (const auto& pParameterSlot : m_parameterSlots) { + for (const auto& pParameterSlot : m_knobParameterSlots) { pParameterSlot->syncSofttakeover(); } } @@ -427,7 +427,7 @@ void EffectSlot::slotEffectMetaParameter(double v, bool force) { if (!m_pControlEnabled->toBool()) { force = true; } - for (const auto& pParameterSlot : m_parameterSlots) { + for (const auto& pParameterSlot : m_knobParameterSlots) { pParameterSlot->onEffectMetaParameterChanged(v, force); } } @@ -450,7 +450,7 @@ QDomElement EffectSlot::toXml(QDomDocument* doc) const { // QDomElement parametersElement = doc->createElement(EffectXml::ParametersRoot); - // for (const auto& pParameter : m_parameterSlots) { + // for (const auto& pParameter : m_knobParameterSlots) { // QDomElement parameterElement = pParameter->toXml(doc); // if (!parameterElement.hasChildNodes()) { // continue; @@ -510,7 +510,7 @@ void EffectSlot::loadEffectSlotFromXml(const QDomElement& effectElement) { // } // QMap parametersById; - // for (const auto& pParameter : m_parameterSlots) { + // for (const auto& pParameter : m_knobParameterSlots) { // EffectManifestParameterPointer manifest = pParameter->getManifest(); // if (manifest) { // parametersById.insert(manifest->id(), pParameter); diff --git a/src/effects/effectslot.h b/src/effects/effectslot.h index 7788a0db2204..fa8d69439632 100644 --- a/src/effects/effectslot.h +++ b/src/effects/effectslot.h @@ -58,7 +58,7 @@ class EffectSlot : public QObject { EffectKnobParameterSlotPointer getEffectParameterSlot(unsigned int slotNumber); EffectKnobParameterSlotPointer getEffectParameterSlotForConfigKey(unsigned int slotNumber); inline const QList& getEffectParameterSlots() const { - return m_parameterSlots; + return m_knobParameterSlots; }; unsigned int numButtonParameterSlots() const; @@ -140,7 +140,7 @@ class EffectSlot : public QObject { EngineEffect* m_pEngineEffect; QList m_parameters; EngineEffectChain* m_pEngineEffectChain; - QList m_parameterSlots; + QList m_knobParameterSlots; QList m_buttonParameters; ControlObject* m_pControlLoaded; From 3a8052f1e2eac6451fcde9772a6508e9a516b2b0 Mon Sep 17 00:00:00 2001 From: Kshitij Gupta Date: Fri, 3 Aug 2018 05:06:05 +0530 Subject: [PATCH 022/443] Renamed EffectParameterSlot -> EffectKnobParameterSlot --- build/depends.py | 2 +- src/controllers/controlpickermenu.cpp | 4 +-- src/effects/defs.h | 4 +-- ...erslot.cpp => effectknobparameterslot.cpp} | 28 +++++++++---------- ...ameterslot.h => effectknobparameterslot.h} | 20 ++++++------- src/effects/effectslot.cpp | 14 +++++----- src/effects/effectslot.h | 12 ++++---- src/effects/effectsmanager.cpp | 4 +-- src/effects/effectsmanager.h | 2 +- src/test/metaknob_link_test.cpp | 6 ++-- src/widget/effectwidgetutils.h | 2 +- src/widget/weffectbuttonparameter.cpp | 2 +- src/widget/weffectparameter.cpp | 2 +- src/widget/weffectparameterbase.cpp | 6 ++-- src/widget/weffectparameterbase.h | 4 +-- src/widget/weffectparameterknob.cpp | 6 ++-- src/widget/weffectparameterknob.h | 6 ++-- src/widget/weffectparameterknobcomposed.cpp | 6 ++-- src/widget/weffectparameterknobcomposed.h | 6 ++-- src/widget/weffectpushbutton.cpp | 4 +-- src/widget/weffectpushbutton.h | 4 +-- 21 files changed, 72 insertions(+), 72 deletions(-) rename src/effects/{effectparameterslot.cpp => effectknobparameterslot.cpp} (93%) rename src/effects/{effectparameterslot.h => effectknobparameterslot.h} (72%) diff --git a/build/depends.py b/build/depends.py index 076c5782937a..a5677a59f687 100644 --- a/build/depends.py +++ b/build/depends.py @@ -699,7 +699,7 @@ def sources(self, build): "effects/specialeffectchainslots.cpp", "effects/effectslot.cpp", "effects/effectparameterslotbase.cpp", - "effects/effectparameterslot.cpp", + "effects/effectknobparameterslot.cpp", "effects/effectbuttonparameterslot.cpp", "effects/effectsmanager.cpp", diff --git a/src/controllers/controlpickermenu.cpp b/src/controllers/controlpickermenu.cpp index 18b88b4d4861..90a14564281c 100644 --- a/src/controllers/controlpickermenu.cpp +++ b/src/controllers/controlpickermenu.cpp @@ -6,7 +6,7 @@ #include "engine/loopingcontrol.h" #include "effects/specialeffectchainslots.h" #include "effects/effectslot.h" -#include "effects/effectparameterslot.h" +#include "effects/effectknobparameterslot.h" ControlPickerMenu::ControlPickerMenu(QWidget* pParent) : QMenu(pParent) { @@ -641,7 +641,7 @@ ControlPickerMenu::ControlPickerMenu(QWidget* pParent) StandardEffectChainSlot::formatEffectSlotGroup( iEffectUnitNumber - 1, iEffectSlotNumber - 1); - const QString parameterSlotItemPrefix = EffectParameterSlot::formatItemPrefix( + const QString parameterSlotItemPrefix = EffectKnobParameterSlot::formatItemPrefix( iParameterSlotNumber - 1); QMenu* parameterSlotMenu = addSubmenu( m_parameterStr.arg(iParameterSlotNumber), diff --git a/src/effects/defs.h b/src/effects/defs.h index bb412b3eb39a..850ffa06576a 100644 --- a/src/effects/defs.h +++ b/src/effects/defs.h @@ -58,8 +58,8 @@ typedef QSharedPointer EngineEffectParameterPointer; class EffectSlot; typedef QSharedPointer EffectSlotPointer; -class EffectParameterSlot; -typedef QSharedPointer EffectKnobParameterSlotPointer; +class EffectKnobParameterSlot; +typedef QSharedPointer EffectKnobParameterSlotPointer; class EffectButtonParameterSlot; typedef QSharedPointer EffectButtonParameterSlotPointer; diff --git a/src/effects/effectparameterslot.cpp b/src/effects/effectknobparameterslot.cpp similarity index 93% rename from src/effects/effectparameterslot.cpp rename to src/effects/effectknobparameterslot.cpp index 448f9e3a0a3a..974b6cce4530 100644 --- a/src/effects/effectparameterslot.cpp +++ b/src/effects/effectknobparameterslot.cpp @@ -1,6 +1,6 @@ #include -#include "effects/effectparameterslot.h" +#include "effects/effectknobparameterslot.h" #include "effects/effectslot.h" #include "effects/effectparameter.h" @@ -11,7 +11,7 @@ #include "controllers/softtakeover.h" #include "util/xml.h" -EffectParameterSlot::EffectParameterSlot(const QString& group, const unsigned int iParameterSlotNumber) +EffectKnobParameterSlot::EffectKnobParameterSlot(const QString& group, const unsigned int iParameterSlotNumber) : EffectParameterSlotBase(group, iParameterSlotNumber) { QString itemPrefix = formatItemPrefix(iParameterSlotNumber); @@ -47,7 +47,7 @@ EffectParameterSlot::EffectParameterSlot(const QString& group, const unsigned in clear(); } -EffectParameterSlot::~EffectParameterSlot() { +EffectKnobParameterSlot::~EffectKnobParameterSlot() { // qDebug() << debugString() << "destroyed"; delete m_pControlValue; // m_pControlLoaded and m_pControlType are deleted by ~EffectParameterSlotBase @@ -56,7 +56,7 @@ EffectParameterSlot::~EffectParameterSlot() { delete m_pSoftTakeover; } -void EffectParameterSlot::loadEffect(EffectSlot* pEffectSlot) { +void EffectKnobParameterSlot::loadEffect(EffectSlot* pEffectSlot) { // qDebug() << debugString() << "loadEffect" << (pEffectSlot ? pEffectSlot->getManifest().name() : "(null)"); clear(); if (pEffectSlot) { @@ -104,7 +104,7 @@ void EffectParameterSlot::loadEffect(EffectSlot* pEffectSlot) { emit(updated()); } -void EffectParameterSlot::clear() { +void EffectKnobParameterSlot::clear() { //qDebug() << debugString() << "clear"; if (m_pEffectParameter) { m_pEffectParameter->disconnect(this); @@ -123,12 +123,12 @@ void EffectParameterSlot::clear() { emit(updated()); } -void EffectParameterSlot::slotParameterValueChanged(double value) { +void EffectKnobParameterSlot::slotParameterValueChanged(double value) { //qDebug() << debugString() << "slotParameterValueChanged" << value.toDouble(); m_pControlValue->set(value); } -void EffectParameterSlot::slotLinkTypeChanging(double v) { +void EffectKnobParameterSlot::slotLinkTypeChanging(double v) { m_pSoftTakeover->ignoreNext(); EffectManifestParameter::LinkType newType = static_cast( @@ -155,12 +155,12 @@ void EffectParameterSlot::slotLinkTypeChanging(double v) { m_pControlLinkType->setAndConfirm(static_cast(newType)); } -void EffectParameterSlot::slotLinkInverseChanged(double v) { +void EffectKnobParameterSlot::slotLinkInverseChanged(double v) { Q_UNUSED(v); m_pSoftTakeover->ignoreNext(); } -void EffectParameterSlot::onEffectMetaParameterChanged(double parameter, bool force) { +void EffectKnobParameterSlot::onEffectMetaParameterChanged(double parameter, bool force) { m_dChainParameter = parameter; if (m_pEffectParameter != nullptr) { // Intermediate cast to integer is needed for VC++. @@ -246,22 +246,22 @@ void EffectParameterSlot::onEffectMetaParameterChanged(double parameter, bool fo } } -void EffectParameterSlot::syncSofttakeover() { +void EffectKnobParameterSlot::syncSofttakeover() { double parameter = m_pControlValue->getParameter(); m_pSoftTakeover->ignore(m_pControlValue, parameter); } -double EffectParameterSlot::getValueParameter() const { +double EffectKnobParameterSlot::getValueParameter() const { return m_pControlValue->getParameter(); } -void EffectParameterSlot::slotValueChanged(double v) { +void EffectKnobParameterSlot::slotValueChanged(double v) { if (m_pEffectParameter) { m_pEffectParameter->setValue(v); } } -QDomElement EffectParameterSlot::toXml(QDomDocument* doc) const { +QDomElement EffectKnobParameterSlot::toXml(QDomDocument* doc) const { QDomElement parameterElement; // if (m_pEffectParameter != nullptr) { // parameterElement = doc->createElement(EffectXml::Parameter); @@ -281,7 +281,7 @@ QDomElement EffectParameterSlot::toXml(QDomDocument* doc) const { return parameterElement; } -void EffectParameterSlot::loadParameterSlotFromXml(const QDomElement& parameterElement) { +void EffectKnobParameterSlot::loadParameterSlotFromXml(const QDomElement& parameterElement) { // if (m_pEffectParameter == nullptr) { // return; // } diff --git a/src/effects/effectparameterslot.h b/src/effects/effectknobparameterslot.h similarity index 72% rename from src/effects/effectparameterslot.h rename to src/effects/effectknobparameterslot.h index 6c79ce9b3ab3..5f1b91bc9078 100644 --- a/src/effects/effectparameterslot.h +++ b/src/effects/effectknobparameterslot.h @@ -1,5 +1,5 @@ -#ifndef EFFECTPARAMETERSLOT_H -#define EFFECTPARAMETERSLOT_H +#ifndef EFFECTKNOBPARAMETERSLOT_H +#define EFFECTKNOBPARAMETERSLOT_H #include #include @@ -15,19 +15,19 @@ class ControlEffectKnob; class SoftTakeover; class EffectSlot; -// EffectParameterSlot is a wrapper around the parameterX ControlObject +// EffectKnobParameterSlot is a wrapper around the parameterX ControlObject // that loaded with an EffectParameter into itself by the EffectSlot. -class EffectParameterSlot : public EffectParameterSlotBase { +class EffectKnobParameterSlot : public EffectParameterSlotBase { Q_OBJECT public: - EffectParameterSlot(const QString& group, const unsigned int iParameterSlotNumber); - virtual ~EffectParameterSlot(); + EffectKnobParameterSlot(const QString& group, const unsigned int iParameterSlotNumber); + virtual ~EffectKnobParameterSlot(); static QString formatItemPrefix(const unsigned int iParameterSlotNumber) { return QString("parameter%1").arg(iParameterSlotNumber + 1); } - // Load the parameter of the given effect into this EffectParameterSlot + // Load the parameter of the given effect into this EffectKnobParameterSlot void loadEffect(EffectSlot* pEffectSlot); double getValueParameter() const; @@ -54,7 +54,7 @@ class EffectParameterSlot : public EffectParameterSlotBase { private: QString debugString() const { - return QString("EffectParameterSlot(%1,%2)").arg(m_group).arg(m_iParameterSlotNumber); + return QString("EffectKnobParameterSlot(%1,%2)").arg(m_group).arg(m_iParameterSlotNumber); } SoftTakeover* m_pSoftTakeover; @@ -64,7 +64,7 @@ class EffectParameterSlot : public EffectParameterSlotBase { ControlPushButton* m_pControlLinkType; ControlPushButton* m_pControlLinkInverse; - DISALLOW_COPY_AND_ASSIGN(EffectParameterSlot); + DISALLOW_COPY_AND_ASSIGN(EffectKnobParameterSlot); }; -#endif // EFFECTPARAMETERSLOT_H +#endif // EFFECTKNOBPARAMETERSLOT_H diff --git a/src/effects/effectslot.cpp b/src/effects/effectslot.cpp index db52c02f724a..b73e7cf9e2a7 100644 --- a/src/effects/effectslot.cpp +++ b/src/effects/effectslot.cpp @@ -66,7 +66,7 @@ EffectSlot::EffectSlot(const QString& group, this, SLOT(slotClear(double))); for (unsigned int i = 0; i < kDefaultMaxParameters; ++i) { - addEffectParameterSlot(); + addEffectKnobParameterSlot(); addEffectButtonParameterSlot(); } @@ -181,9 +181,9 @@ void EffectSlot::reload(const QSet& activeInputChannels) activeInputChannels); } -EffectKnobParameterSlotPointer EffectSlot::addEffectParameterSlot() { +EffectKnobParameterSlotPointer EffectSlot::addEffectKnobParameterSlot() { auto pParameterSlot = EffectKnobParameterSlotPointer( - new EffectParameterSlot(m_group, m_knobParameterSlots.size())); + new EffectKnobParameterSlot(m_group, m_knobParameterSlots.size())); m_knobParameterSlots.append(pParameterSlot); m_pControlNumParameterSlots->forceSet( m_pControlNumParameterSlots->get() + 1); @@ -272,8 +272,8 @@ void EffectSlot::setEnabled(bool enabled) { m_pControlEnabled->set(enabled); } -EffectKnobParameterSlotPointer EffectSlot::getEffectParameterSlot(unsigned int slotNumber) { - //qDebug() << debugString() << "getEffectParameterSlot" << slotNumber; +EffectKnobParameterSlotPointer EffectSlot::getEffectKnobParameterSlot(unsigned int slotNumber) { + //qDebug() << debugString() << "getEffectKnobParameterSlot" << slotNumber; if (slotNumber >= static_cast(m_knobParameterSlots.size())) { qWarning() << "WARNING: slotNumber out of range"; return EffectKnobParameterSlotPointer(); @@ -282,7 +282,7 @@ EffectKnobParameterSlotPointer EffectSlot::getEffectParameterSlot(unsigned int s } EffectButtonParameterSlotPointer EffectSlot::getEffectButtonParameterSlot(unsigned int slotNumber) { - //qDebug() << debugString() << "getEffectParameterSlot" << slotNumber; + //qDebug() << debugString() << "getEffectKnobParameterSlot" << slotNumber; if (slotNumber >= static_cast(m_buttonParameters.size())) { qWarning() << "WARNING: slotNumber out of range"; return EffectButtonParameterSlotPointer(); @@ -316,7 +316,7 @@ void EffectSlot::loadEffect(const EffectManifestPointer pManifest, unsigned int iNumKnobParameters = numKnobParameters(); while (static_cast(m_knobParameterSlots.size()) < iNumKnobParameters) { - addEffectParameterSlot(); + addEffectKnobParameterSlot(); } unsigned int iNumButtonParameters = numButtonParameters(); diff --git a/src/effects/effectslot.h b/src/effects/effectslot.h index fa8d69439632..66faf07f4346 100644 --- a/src/effects/effectslot.h +++ b/src/effects/effectslot.h @@ -16,7 +16,7 @@ #include "effects/effectbuttonparameterslot.h" #include "effects/effectmanifest.h" #include "effects/effectparameter.h" -#include "effects/effectparameterslot.h" +#include "effects/effectknobparameterslot.h" #include "util/class.h" class EffectProcessor; @@ -27,7 +27,7 @@ class EngineEffect; class EngineEffectChain; class ControlProxy; class EffectParameter; -class EffectParameterSlot; +class EffectKnobParameterSlot; class EffectSlot : public QObject { Q_OBJECT @@ -54,10 +54,10 @@ class EffectSlot : public QObject { } unsigned int numParameterSlots() const; - EffectKnobParameterSlotPointer addEffectParameterSlot(); - EffectKnobParameterSlotPointer getEffectParameterSlot(unsigned int slotNumber); - EffectKnobParameterSlotPointer getEffectParameterSlotForConfigKey(unsigned int slotNumber); - inline const QList& getEffectParameterSlots() const { + EffectKnobParameterSlotPointer addEffectKnobParameterSlot(); + EffectKnobParameterSlotPointer getEffectKnobParameterSlot(unsigned int slotNumber); + EffectKnobParameterSlotPointer getEffectKnobParameterSlotForConfigKey(unsigned int slotNumber); + inline const QList& getEffectKnobParameterSlots() const { return m_knobParameterSlots; }; diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index 74df3b021bb7..1b9a58f9d896 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -351,7 +351,7 @@ EffectSlotPointer EffectsManager::getEffectSlot( return pEffectSlot; } -EffectKnobParameterSlotPointer EffectsManager::getEffectParameterSlot( +EffectKnobParameterSlotPointer EffectsManager::getEffectKnobParameterSlot( const ConfigKey& configKey) { EffectSlotPointer pEffectSlot = getEffectSlot(configKey.group); @@ -362,7 +362,7 @@ EffectKnobParameterSlotPointer EffectsManager::getEffectParameterSlot( QRegExp intRegEx(".*(\\d+).*"); intRegEx.indexIn(configKey.item); EffectKnobParameterSlotPointer pParameterSlot = - pEffectSlot->getEffectParameterSlot(intRegEx.cap(1).toInt() - 1); + pEffectSlot->getEffectKnobParameterSlot(intRegEx.cap(1).toInt() - 1); return pParameterSlot; } diff --git a/src/effects/effectsmanager.h b/src/effects/effectsmanager.h index 35de8baa7df7..2064346faeae 100644 --- a/src/effects/effectsmanager.h +++ b/src/effects/effectsmanager.h @@ -111,7 +111,7 @@ class EffectsManager : public QObject { EffectChainSlotPointer getEffectChainSlot(const QString& group) const; EffectSlotPointer getEffectSlot(const QString& group); - EffectKnobParameterSlotPointer getEffectParameterSlot( + EffectKnobParameterSlotPointer getEffectKnobParameterSlot( const ConfigKey& configKey); EffectButtonParameterSlotPointer getEffectButtonParameterSlot( const ConfigKey& configKey); diff --git a/src/test/metaknob_link_test.cpp b/src/test/metaknob_link_test.cpp index 50fb1896dd6d..d570d4c3dcef 100644 --- a/src/test/metaknob_link_test.cpp +++ b/src/test/metaknob_link_test.cpp @@ -4,7 +4,7 @@ #include #include "controllers/softtakeover.h" -#include "effects/effectparameterslot.h" +#include "effects/effectknobparameterslot.h" #include "effects/effectchainslot.h" #include "effects/specialeffectchainslots.h" #include "effects/effectslot.h" @@ -56,7 +56,7 @@ class MetaLinkTest : public BaseEffectTest { m_pEffectsManager->loadEffect(m_pChainSlot, iEffectNumber, pManifest->id(), EffectBackendType::Unknown); - QString itemPrefix = EffectParameterSlot::formatItemPrefix(0); + QString itemPrefix = EffectKnobParameterSlot::formatItemPrefix(0); m_pControlValue.reset(new ControlProxy(group, itemPrefix)); @@ -217,7 +217,7 @@ TEST_F(MetaLinkTest, HalfLinkTakeover) { m_pEffectsManager->loadEffect(m_pChainSlot, 0, pManifest->id(), EffectBackendType::Unknown); - QString itemPrefix = EffectParameterSlot::formatItemPrefix(0); + QString itemPrefix = EffectKnobParameterSlot::formatItemPrefix(0); m_pControlValue.reset(new ControlProxy(group, itemPrefix)); m_pControlLinkType.reset(new ControlProxy(group, itemPrefix + QString("_link_type"))); diff --git a/src/widget/effectwidgetutils.h b/src/widget/effectwidgetutils.h index 175a6c78d08c..20e5a5f89942 100644 --- a/src/widget/effectwidgetutils.h +++ b/src/widget/effectwidgetutils.h @@ -63,7 +63,7 @@ class EffectWidgetUtils { ¶meterNumberOk); if (parameterNumberOk) { // XML effect nodes are 1-indexed. - return pEffectSlot->getEffectParameterSlot(parameterNumber - 1); + return pEffectSlot->getEffectKnobParameterSlot(parameterNumber - 1); } return EffectParameterSlotBasePointer(); } diff --git a/src/widget/weffectbuttonparameter.cpp b/src/widget/weffectbuttonparameter.cpp index eccc3b003c1e..f9ccfc64b3fd 100644 --- a/src/widget/weffectbuttonparameter.cpp +++ b/src/widget/weffectbuttonparameter.cpp @@ -19,7 +19,7 @@ void WEffectButtonParameter::setup(const QDomNode& node, const SkinContext& cont EffectWidgetUtils::getButtonParameterSlotFromNode( node, context, pEffectSlot); if (pParameterSlot) { - setEffectParameterSlot(pParameterSlot); + setEffectKnobParameterSlot(pParameterSlot); } else { SKIN_WARNING(node, context) << "EffectButtonParameter node could not attach to effect parameter"; diff --git a/src/widget/weffectparameter.cpp b/src/widget/weffectparameter.cpp index 0f071e3fdf85..ee9515eb40df 100644 --- a/src/widget/weffectparameter.cpp +++ b/src/widget/weffectparameter.cpp @@ -19,7 +19,7 @@ void WEffectParameter::setup(const QDomNode& node, const SkinContext& context) { EffectWidgetUtils::getParameterSlotFromNode( node, context, pEffectSlot); if (pParameterSlot) { - setEffectParameterSlot(pParameterSlot); + setEffectKnobParameterSlot(pParameterSlot); } else { SKIN_WARNING(node, context) << "EffectParameter node could not attach to effect parameter"; diff --git a/src/widget/weffectparameterbase.cpp b/src/widget/weffectparameterbase.cpp index f2b46be289d9..9c52ea716e69 100644 --- a/src/widget/weffectparameterbase.cpp +++ b/src/widget/weffectparameterbase.cpp @@ -9,9 +9,9 @@ WEffectParameterBase::WEffectParameterBase(QWidget* pParent, EffectsManager* pEf parameterUpdated(); } -void WEffectParameterBase::setEffectParameterSlot( - EffectParameterSlotBasePointer pEffectParameterSlot) { - m_pEffectParameterSlot = pEffectParameterSlot; +void WEffectParameterBase::setEffectKnobParameterSlot( + EffectParameterSlotBasePointer pEffectKnobParameterSlot) { + m_pEffectParameterSlot = pEffectKnobParameterSlot; if (m_pEffectParameterSlot) { connect(m_pEffectParameterSlot.data(), SIGNAL(updated()), this, SLOT(parameterUpdated())); diff --git a/src/widget/weffectparameterbase.h b/src/widget/weffectparameterbase.h index 2b6c9497e223..d14f1bae72a0 100644 --- a/src/widget/weffectparameterbase.h +++ b/src/widget/weffectparameterbase.h @@ -20,9 +20,9 @@ class WEffectParameterBase : public WLabel { void parameterUpdated(); protected: - // Set the EffectParameterSlot that should be monitored by this + // Set the EffectKnobParameterSlot that should be monitored by this // WEffectParameterBase. - void setEffectParameterSlot(EffectParameterSlotBasePointer pEffectParameterSlot); + void setEffectKnobParameterSlot(EffectParameterSlotBasePointer pEffectKnobParameterSlot); EffectsManager* m_pEffectsManager; EffectParameterSlotBasePointer m_pEffectParameterSlot; diff --git a/src/widget/weffectparameterknob.cpp b/src/widget/weffectparameterknob.cpp index fd6ca142a8d8..68e85abbea51 100644 --- a/src/widget/weffectparameterknob.cpp +++ b/src/widget/weffectparameterknob.cpp @@ -3,16 +3,16 @@ void WEffectParameterKnob::setupEffectParameterSlot(const ConfigKey& configKey) { EffectKnobParameterSlotPointer pParameterSlot = - m_pEffectsManager->getEffectParameterSlot(configKey); + m_pEffectsManager->getEffectKnobParameterSlot(configKey); if (!pParameterSlot) { qWarning() << "EffectParameterKnob" << configKey << "is not an effect parameter."; return; } - setEffectParameterSlot(pParameterSlot); + setEffectKnobParameterSlot(pParameterSlot); } -void WEffectParameterKnob::setEffectParameterSlot( +void WEffectParameterKnob::setEffectKnobParameterSlot( EffectKnobParameterSlotPointer pParameterSlot) { m_pEffectParameterSlot = pParameterSlot; if (m_pEffectParameterSlot) { diff --git a/src/widget/weffectparameterknob.h b/src/widget/weffectparameterknob.h index e97eee5e2af1..647270672a62 100644 --- a/src/widget/weffectparameterknob.h +++ b/src/widget/weffectparameterknob.h @@ -2,7 +2,7 @@ #define WEFFECTKNOB_H #include "widget/wknob.h" -#include "effects/effectparameterslot.h" +#include "effects/effectknobparameterslot.h" class EffectsManager; @@ -25,9 +25,9 @@ class WEffectParameterKnob : public WKnob { void parameterUpdated(); private: - // Set the EffectParameterSlot that should be monitored by this + // Set the EffectKnobParameterSlot that should be monitored by this // WEffectKnobComposed. - void setEffectParameterSlot(EffectKnobParameterSlotPointer pParameterSlot); + void setEffectKnobParameterSlot(EffectKnobParameterSlotPointer pParameterSlot); EffectsManager* m_pEffectsManager; EffectParameterSlotBasePointer m_pEffectParameterSlot; diff --git a/src/widget/weffectparameterknobcomposed.cpp b/src/widget/weffectparameterknobcomposed.cpp index 14e5af03d85a..eba3e157f7ba 100644 --- a/src/widget/weffectparameterknobcomposed.cpp +++ b/src/widget/weffectparameterknobcomposed.cpp @@ -8,16 +8,16 @@ const QString groupClose = "]"; void WEffectParameterKnobComposed::setupEffectParameterSlot(const ConfigKey& configKey) { EffectKnobParameterSlotPointer pParameterSlot = - m_pEffectsManager->getEffectParameterSlot(configKey); + m_pEffectsManager->getEffectKnobParameterSlot(configKey); if (!pParameterSlot) { qWarning() << "EffectParameterKnobComposed" << configKey << "is not an effect parameter."; return; } - setEffectParameterSlot(pParameterSlot); + setEffectKnobParameterSlot(pParameterSlot); } -void WEffectParameterKnobComposed::setEffectParameterSlot( +void WEffectParameterKnobComposed::setEffectKnobParameterSlot( EffectKnobParameterSlotPointer pParameterSlot) { m_pEffectParameterSlot = pParameterSlot; if (m_pEffectParameterSlot) { diff --git a/src/widget/weffectparameterknobcomposed.h b/src/widget/weffectparameterknobcomposed.h index f0c5569672c9..6379c755275f 100644 --- a/src/widget/weffectparameterknobcomposed.h +++ b/src/widget/weffectparameterknobcomposed.h @@ -2,7 +2,7 @@ #define WEFFECTKNOBCOMPOSED_H #include "widget/wknobcomposed.h" -#include "effects/effectparameterslot.h" +#include "effects/effectknobparameterslot.h" class EffectsManager; @@ -26,9 +26,9 @@ class WEffectParameterKnobComposed : public WKnobComposed { void parameterUpdated(); private: - // Set the EffectParameterSlot that should be monitored by this + // Set the EffectKnobParameterSlot that should be monitored by this // WEffectKnobComposed. - void setEffectParameterSlot(EffectKnobParameterSlotPointer pParameterSlot); + void setEffectKnobParameterSlot(EffectKnobParameterSlotPointer pParameterSlot); EffectsManager* m_pEffectsManager; EffectParameterSlotBasePointer m_pEffectParameterSlot; diff --git a/src/widget/weffectpushbutton.cpp b/src/widget/weffectpushbutton.cpp index 5ef08375a29c..5e16999dbb15 100644 --- a/src/widget/weffectpushbutton.cpp +++ b/src/widget/weffectpushbutton.cpp @@ -27,10 +27,10 @@ void WEffectPushButton::setupEffectParameterSlot(const ConfigKey& configKey) { "is not an effect button parameter."; return; } - setEffectParameterSlot(pParameterSlot); + setEffectKnobParameterSlot(pParameterSlot); } -void WEffectPushButton::setEffectParameterSlot( +void WEffectPushButton::setEffectKnobParameterSlot( EffectButtonParameterSlotPointer pParameterSlot) { m_pEffectParameterSlot = pParameterSlot; if (m_pEffectParameterSlot) { diff --git a/src/widget/weffectpushbutton.h b/src/widget/weffectpushbutton.h index 595486f8f01b..0a496214422b 100644 --- a/src/widget/weffectpushbutton.h +++ b/src/widget/weffectpushbutton.h @@ -32,9 +32,9 @@ class WEffectPushButton : public WPushButton { void slotActionChosen(QAction* action); private: - // Set the EffectParameterSlot that should be monitored by this + // Set the EffectKnobParameterSlot that should be monitored by this // WEffectKnobComposed. - void setEffectParameterSlot(EffectButtonParameterSlotPointer pParameterSlot); + void setEffectKnobParameterSlot(EffectButtonParameterSlotPointer pParameterSlot); EffectsManager* m_pEffectsManager; From a526371b54d7cccd2eaed57a9f10049fc9983b52 Mon Sep 17 00:00:00 2001 From: Kshitij Gupta Date: Sat, 4 Aug 2018 01:19:54 +0530 Subject: [PATCH 023/443] Renamed m_buttonParameters -> m_buttonParameterSlots --- src/effects/effectslot.cpp | 20 ++++++++++---------- src/effects/effectslot.h | 4 ++-- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/effects/effectslot.cpp b/src/effects/effectslot.cpp index b73e7cf9e2a7..eb25f3e45ad9 100644 --- a/src/effects/effectslot.cpp +++ b/src/effects/effectslot.cpp @@ -192,8 +192,8 @@ EffectKnobParameterSlotPointer EffectSlot::addEffectKnobParameterSlot() { EffectButtonParameterSlotPointer EffectSlot::addEffectButtonParameterSlot() { auto pParameterSlot = EffectButtonParameterSlotPointer( - new EffectButtonParameterSlot(m_group, m_buttonParameters.size())); - m_buttonParameters.append(pParameterSlot); + new EffectButtonParameterSlot(m_group, m_buttonParameterSlots.size())); + m_buttonParameterSlots.append(pParameterSlot); m_pControlNumButtonParameterSlots->forceSet( m_pControlNumButtonParameterSlots->get() + 1); return pParameterSlot; @@ -265,7 +265,7 @@ unsigned int EffectSlot::numParameterSlots() const { } unsigned int EffectSlot::numButtonParameterSlots() const { - return m_buttonParameters.size(); + return m_buttonParameterSlots.size(); } void EffectSlot::setEnabled(bool enabled) { @@ -283,11 +283,11 @@ EffectKnobParameterSlotPointer EffectSlot::getEffectKnobParameterSlot(unsigned i EffectButtonParameterSlotPointer EffectSlot::getEffectButtonParameterSlot(unsigned int slotNumber) { //qDebug() << debugString() << "getEffectKnobParameterSlot" << slotNumber; - if (slotNumber >= static_cast(m_buttonParameters.size())) { + if (slotNumber >= static_cast(m_buttonParameterSlots.size())) { qWarning() << "WARNING: slotNumber out of range"; return EffectButtonParameterSlotPointer(); } - return m_buttonParameters[slotNumber]; + return m_buttonParameterSlots[slotNumber]; } void EffectSlot::loadEffect(const EffectManifestPointer pManifest, @@ -320,7 +320,7 @@ void EffectSlot::loadEffect(const EffectManifestPointer pManifest, } unsigned int iNumButtonParameters = numButtonParameters(); - while (static_cast(m_buttonParameters.size()) + while (static_cast(m_buttonParameterSlots.size()) < iNumButtonParameters) { addEffectButtonParameterSlot(); } @@ -328,7 +328,7 @@ void EffectSlot::loadEffect(const EffectManifestPointer pManifest, for (const auto& pParameter : m_knobParameterSlots) { pParameter->loadEffect(this); } - for (const auto& pParameter : m_buttonParameters) { + for (const auto& pParameter : m_buttonParameterSlots) { pParameter->loadEffect(this); } @@ -354,7 +354,7 @@ void EffectSlot::unloadEffect() { for (const auto& pParameterSlot : m_knobParameterSlots) { pParameterSlot->clear(); } - for (const auto& pButtonParameter : m_buttonParameters) { + for (const auto& pButtonParameter : m_buttonParameterSlots) { pButtonParameter->clear(); } @@ -464,7 +464,7 @@ QDomElement EffectSlot::toXml(QDomDocument* doc) const { // manifest->id()); // parametersElement.appendChild(parameterElement); // } - // for (const auto& pParameter : m_buttonParameters) { + // for (const auto& pParameter : m_buttonParameterSlots) { // QDomElement parameterElement = pParameter->toXml(doc); // if (!parameterElement.hasChildNodes()) { // continue; @@ -516,7 +516,7 @@ void EffectSlot::loadEffectSlotFromXml(const QDomElement& effectElement) { // parametersById.insert(manifest->id(), pParameter); // } // } - // for (const auto& pParameter : m_buttonParameters) { + // for (const auto& pParameter : m_buttonParameterSlots) { // EffectManifestParameterPointer manifest = pParameter->getManifest(); // if (manifest) { // parametersById.insert(manifest->id(), pParameter); diff --git a/src/effects/effectslot.h b/src/effects/effectslot.h index 66faf07f4346..87a837efe2de 100644 --- a/src/effects/effectslot.h +++ b/src/effects/effectslot.h @@ -65,7 +65,7 @@ class EffectSlot : public QObject { EffectButtonParameterSlotPointer addEffectButtonParameterSlot(); EffectButtonParameterSlotPointer getEffectButtonParameterSlot(unsigned int slotNumber); inline const QList& getEffectButtonParameterSlots() const { - return m_buttonParameters; + return m_buttonParameterSlots; }; double getMetaParameter() const; @@ -141,7 +141,7 @@ class EffectSlot : public QObject { QList m_parameters; EngineEffectChain* m_pEngineEffectChain; QList m_knobParameterSlots; - QList m_buttonParameters; + QList m_buttonParameterSlots; ControlObject* m_pControlLoaded; ControlPushButton* m_pControlEnabled; From 94e983c2f74208093c8b5f47a959b0680004d7fa Mon Sep 17 00:00:00 2001 From: Kshitij Gupta Date: Sat, 4 Aug 2018 04:27:35 +0530 Subject: [PATCH 024/443] Effect Parameter Hiding/Rearrangement --- src/effects/effectbuttonparameterslot.cpp | 81 ++++++++++--------- src/effects/effectbuttonparameterslot.h | 2 +- src/effects/effectchainslot.cpp | 34 +++++--- src/effects/effectchainslot.h | 6 +- src/effects/effectknobparameterslot.cpp | 87 ++++++++++---------- src/effects/effectknobparameterslot.h | 2 +- src/effects/effectslot.cpp | 98 +++++++++++++++++------ src/effects/effectslot.h | 8 +- src/effects/effectsmanager.cpp | 22 ++++- src/effects/effectsmanager.h | 6 +- src/preferences/dialog/dlgpreflv2.cpp | 10 ++- 11 files changed, 226 insertions(+), 130 deletions(-) diff --git a/src/effects/effectbuttonparameterslot.cpp b/src/effects/effectbuttonparameterslot.cpp index bb33e2dca03e..e698353c9154 100644 --- a/src/effects/effectbuttonparameterslot.cpp +++ b/src/effects/effectbuttonparameterslot.cpp @@ -38,52 +38,53 @@ EffectButtonParameterSlot::~EffectButtonParameterSlot() { delete m_pControlValue; } -void EffectButtonParameterSlot::loadEffect(EffectSlot* pEffectSlot) { - // qDebug() << debugString() << "loadEffect" << (pEffectSlot ? pEffectSlot->getManifest().name() : "(null)"); +void EffectButtonParameterSlot::loadParameter(EffectParameter* pEffectParameter) { + // qDebug() << debugString() << "loadParameter" << (pEffectSlot ? pEffectSlot->getManifest().name() : "(null)"); if (m_pEffectParameter) { clear(); } - if (pEffectSlot) { - m_pEffectSlot = pEffectSlot; - // Returns null if it doesn't have a parameter for that number - m_pEffectParameter = pEffectSlot->getButtonParameterForSlot(m_iParameterSlotNumber); - - if (m_pEffectParameter) { - m_pManifestParameter = m_pEffectParameter->manifest(); - - // Set the number of states - int numStates = math_max(m_pEffectParameter->manifest()->getSteps().size(), 2); - m_pControlValue->setStates(numStates); - //qDebug() << debugString() << "Loading effect parameter" << m_pEffectParameter->name(); - double dValue = m_pEffectParameter->getValue(); - double dMinimum = m_pManifestParameter->getMinimum(); - double dMinimumLimit = dMinimum; // TODO(rryan) expose limit from EffectParameter - double dMaximum = m_pManifestParameter->getMaximum(); - double dMaximumLimit = dMaximum; // TODO(rryan) expose limit from EffectParameter - double dDefault = m_pManifestParameter->getDefault(); - - if (dValue > dMaximum || dValue < dMinimum || - dMinimum < dMinimumLimit || dMaximum > dMaximumLimit) { - qWarning() << debugString() << "WARNING: EffectParameter does not satisfy basic sanity checks."; - } - - // qDebug() << debugString() - // << QString("Val: %1 Min: %2 MinLimit: %3 Max: %4 MaxLimit: %5 Default: %6") - // .arg(dValue).arg(dMinimum).arg(dMinimumLimit).arg(dMaximum).arg(dMaximumLimit).arg(dDefault); - - m_pControlValue->set(dValue); - m_pControlValue->setDefaultValue(dDefault); - EffectManifestParameter::ControlHint type = m_pManifestParameter->controlHint(); - // TODO(rryan) expose this from EffectParameter - m_pControlType->forceSet(static_cast(type)); - // Default loaded parameters to loaded and unlinked - m_pControlLoaded->forceSet(1.0); - - connect(m_pEffectParameter, SIGNAL(valueChanged(double)), - this, SLOT(slotParameterValueChanged(double))); + VERIFY_OR_DEBUG_ASSERT(EffectSlot::isButtonParameter(pEffectParameter)) { + return; + } + + m_pEffectParameter = pEffectParameter; + + if (m_pEffectParameter) { + m_pManifestParameter = m_pEffectParameter->manifest(); + + // Set the number of states + int numStates = math_max(m_pEffectParameter->manifest()->getSteps().size(), 2); + m_pControlValue->setStates(numStates); + //qDebug() << debugString() << "Loading effect parameter" << m_pEffectParameter->name(); + double dValue = m_pEffectParameter->getValue(); + double dMinimum = m_pManifestParameter->getMinimum(); + double dMinimumLimit = dMinimum; // TODO(rryan) expose limit from EffectParameter + double dMaximum = m_pManifestParameter->getMaximum(); + double dMaximumLimit = dMaximum; // TODO(rryan) expose limit from EffectParameter + double dDefault = m_pManifestParameter->getDefault(); + + if (dValue > dMaximum || dValue < dMinimum || + dMinimum < dMinimumLimit || dMaximum > dMaximumLimit) { + qWarning() << debugString() << "WARNING: EffectParameter does not satisfy basic sanity checks."; } + + // qDebug() << debugString() + // << QString("Val: %1 Min: %2 MinLimit: %3 Max: %4 MaxLimit: %5 Default: %6") + // .arg(dValue).arg(dMinimum).arg(dMinimumLimit).arg(dMaximum).arg(dMaximumLimit).arg(dDefault); + + m_pControlValue->set(dValue); + m_pControlValue->setDefaultValue(dDefault); + EffectManifestParameter::ControlHint type = m_pManifestParameter->controlHint(); + // TODO(rryan) expose this from EffectParameter + m_pControlType->forceSet(static_cast(type)); + // Default loaded parameters to loaded and unlinked + m_pControlLoaded->forceSet(1.0); + + connect(m_pEffectParameter, SIGNAL(valueChanged(double)), + this, SLOT(slotParameterValueChanged(double))); } + emit(updated()); } diff --git a/src/effects/effectbuttonparameterslot.h b/src/effects/effectbuttonparameterslot.h index eafa9b8a00ca..a100b1ba6207 100644 --- a/src/effects/effectbuttonparameterslot.h +++ b/src/effects/effectbuttonparameterslot.h @@ -26,7 +26,7 @@ class EffectButtonParameterSlot : public EffectParameterSlotBase { } // Load the parameter of the given effect into this EffectButtonParameterSlot - void loadEffect(EffectSlot* pEffectSlot); + void loadParameter(EffectParameter* pEffectParameter); // Clear the currently loaded effect void clear(); diff --git a/src/effects/effectchainslot.cpp b/src/effects/effectchainslot.cpp index e5ecb37851f0..a0155f0ece6e 100644 --- a/src/effects/effectchainslot.cpp +++ b/src/effects/effectchainslot.cpp @@ -192,9 +192,21 @@ void EffectChainSlot::loadEffect(const unsigned int iEffectSlotNumber, m_enabledInputChannels); } -void EffectChainSlot::reloadAllEffects() { - for (EffectSlotPointer pSlot : m_effectSlots) { - pSlot->reload(m_enabledInputChannels); +void EffectChainSlot::hideEffectParameter(EffectManifestPointer pManifest, + const unsigned int position) { + for (EffectSlotPointer pEffectSlot : m_effectSlots) { + if (pEffectSlot->getManifest() == pManifest) { + pEffectSlot->hideEffectParameter(position); + } + } +} + +void EffectChainSlot::setEffectParameterPosition(EffectManifestPointer pManifest, + const unsigned int parameterId, const unsigned int position) { + for (EffectSlotPointer pEffectSlot : m_effectSlots) { + if (pEffectSlot->getManifest() == pManifest) { + pEffectSlot->setEffectParameterPosition(parameterId, position); + } } } @@ -232,14 +244,14 @@ void EffectChainSlot::setSuperParameterDefaultValue(double value) { EffectSlotPointer EffectChainSlot::addEffectSlot(const QString& group) { // qDebug() << debugString() << "addEffectSlot" << group; - EffectSlot* pEffectSlot = new EffectSlot(group, m_pEffectsManager, m_effectSlots.size(), m_pEngineEffectChain); + EffectSlotPointer pEffectSlot = EffectSlotPointer( + new EffectSlot(group, m_pEffectsManager, m_effectSlots.size(), m_pEngineEffectChain)); - EffectSlotPointer pSlot(pEffectSlot); - m_effectSlots.append(pSlot); + m_effectSlots.append(pEffectSlot); int numEffectSlots = m_pControlNumEffectSlots->get() + 1; m_pControlNumEffectSlots->forceSet(numEffectSlots); m_pControlChainFocusedEffect->setStates(numEffectSlots); - return pSlot; + return pEffectSlot; } void EffectChainSlot::registerInputChannel(const ChannelHandleAndGroup& handle_group, @@ -276,8 +288,8 @@ EffectSlotPointer EffectChainSlot::getEffectSlot(unsigned int slotNumber) { } void EffectChainSlot::slotControlClear(double v) { - for (EffectSlotPointer pSlot : m_effectSlots) { - pSlot->slotClear(v); + for (EffectSlotPointer pEffectSlot : m_effectSlots) { + pEffectSlot->slotClear(v); } } @@ -285,8 +297,8 @@ void EffectChainSlot::slotControlChainSuperParameter(double v, bool force) { // qDebug() << debugString() << "slotControlChainSuperParameter" << v; m_pControlChainSuperParameter->set(v); - for (const auto& pSlot : m_effectSlots) { - pSlot->setMetaParameter(v, force); + for (const auto& pEffectSlot : m_effectSlots) { + pEffectSlot->setMetaParameter(v, force); } } diff --git a/src/effects/effectchainslot.h b/src/effects/effectchainslot.h index 1b41de7b6abf..91f0e5d7005e 100644 --- a/src/effects/effectchainslot.h +++ b/src/effects/effectchainslot.h @@ -84,7 +84,11 @@ class EffectChainSlot : public QObject { const EffectManifestPointer pManifest, std::unique_ptr pProcessor); - void reloadAllEffects(); + // TODO : Remove these functions once the GUI for parameter rearrangement is implemented + void hideEffectParameter(EffectManifestPointer pManifest, + const unsigned int position); + void setEffectParameterPosition(EffectManifestPointer pManifest, + const unsigned int parameterId, const unsigned int position); signals: // Signal that whoever is in charge of this EffectChainSlot should load the diff --git a/src/effects/effectknobparameterslot.cpp b/src/effects/effectknobparameterslot.cpp index 974b6cce4530..2512536f76c5 100644 --- a/src/effects/effectknobparameterslot.cpp +++ b/src/effects/effectknobparameterslot.cpp @@ -56,51 +56,54 @@ EffectKnobParameterSlot::~EffectKnobParameterSlot() { delete m_pSoftTakeover; } -void EffectKnobParameterSlot::loadEffect(EffectSlot* pEffectSlot) { - // qDebug() << debugString() << "loadEffect" << (pEffectSlot ? pEffectSlot->getManifest().name() : "(null)"); +void EffectKnobParameterSlot::loadParameter(EffectParameter* pEffectParameter) { + // qDebug() << debugString() << "loadParameter" << (pEffectSlot ? pEffectSlot->getManifest().name() : "(null)"); clear(); - if (pEffectSlot) { - // Returns null if it doesn't have a parameter for that number - m_pEffectParameter = pEffectSlot->getKnobParameterForSlot(m_iParameterSlotNumber); - - if (m_pEffectParameter) { - m_pManifestParameter = m_pEffectParameter->manifest(); - - // qDebug() << debugString() << "Loading effect parameter" << m_pEffectParameter->name(); - double dValue = m_pEffectParameter->getValue(); - double dMinimum = m_pManifestParameter->getMinimum(); - double dMinimumLimit = dMinimum; // TODO(rryan) expose limit from EffectParameter - double dMaximum = m_pManifestParameter->getMaximum(); - double dMaximumLimit = dMaximum; // TODO(rryan) expose limit from EffectParameter - double dDefault = m_pManifestParameter->getDefault(); - - if (dValue > dMaximum || dValue < dMinimum || - dMinimum < dMinimumLimit || dMaximum > dMaximumLimit) { - qWarning() << debugString() << "WARNING: EffectParameter does not satisfy basic sanity checks."; - } - - // qDebug() << debugString() - // << QString("Val: %1 Min: %2 MinLimit: %3 Max: %4 MaxLimit: %5 Default: %6") - // .arg(dValue).arg(dMinimum).arg(dMinimumLimit).arg(dMaximum).arg(dMaximumLimit).arg(dDefault); - - EffectManifestParameter::ControlHint type = m_pManifestParameter->controlHint(); - m_pControlValue->setBehaviour(type, dMinimum, dMaximum); - m_pControlValue->setDefaultValue(dDefault); - m_pControlValue->set(dValue); - // TODO(rryan) expose this from EffectParameter - m_pControlType->forceSet(static_cast(type)); - // Default loaded parameters to loaded and unlinked - m_pControlLoaded->forceSet(1.0); - - m_pControlLinkType->set( - static_cast(m_pManifestParameter->defaultLinkType())); - m_pControlLinkInverse->set( - static_cast(m_pManifestParameter->defaultLinkInversion())); - - connect(m_pEffectParameter, SIGNAL(valueChanged(double)), - this, SLOT(slotParameterValueChanged(double))); + + VERIFY_OR_DEBUG_ASSERT(EffectSlot::isKnobParameter(pEffectParameter)) { + return; + } + + m_pEffectParameter = pEffectParameter; + + if (m_pEffectParameter) { + m_pManifestParameter = m_pEffectParameter->manifest(); + + // qDebug() << debugString() << "Loading effect parameter" << m_pEffectParameter->name(); + double dValue = m_pEffectParameter->getValue(); + double dMinimum = m_pManifestParameter->getMinimum(); + double dMinimumLimit = dMinimum; // TODO(rryan) expose limit from EffectParameter + double dMaximum = m_pManifestParameter->getMaximum(); + double dMaximumLimit = dMaximum; // TODO(rryan) expose limit from EffectParameter + double dDefault = m_pManifestParameter->getDefault(); + + if (dValue > dMaximum || dValue < dMinimum || + dMinimum < dMinimumLimit || dMaximum > dMaximumLimit) { + qWarning() << debugString() << "WARNING: EffectParameter does not satisfy basic sanity checks."; } + + // qDebug() << debugString() + // << QString("Val: %1 Min: %2 MinLimit: %3 Max: %4 MaxLimit: %5 Default: %6") + // .arg(dValue).arg(dMinimum).arg(dMinimumLimit).arg(dMaximum).arg(dMaximumLimit).arg(dDefault); + + EffectManifestParameter::ControlHint type = m_pManifestParameter->controlHint(); + m_pControlValue->setBehaviour(type, dMinimum, dMaximum); + m_pControlValue->setDefaultValue(dDefault); + m_pControlValue->set(dValue); + // TODO(rryan) expose this from EffectParameter + m_pControlType->forceSet(static_cast(type)); + // Default loaded parameters to loaded and unlinked + m_pControlLoaded->forceSet(1.0); + + m_pControlLinkType->set( + static_cast(m_pManifestParameter->defaultLinkType())); + m_pControlLinkInverse->set( + static_cast(m_pManifestParameter->defaultLinkInversion())); + + connect(m_pEffectParameter, SIGNAL(valueChanged(double)), + this, SLOT(slotParameterValueChanged(double))); } + emit(updated()); } diff --git a/src/effects/effectknobparameterslot.h b/src/effects/effectknobparameterslot.h index 5f1b91bc9078..69f7e56b3c27 100644 --- a/src/effects/effectknobparameterslot.h +++ b/src/effects/effectknobparameterslot.h @@ -28,7 +28,7 @@ class EffectKnobParameterSlot : public EffectParameterSlotBase { } // Load the parameter of the given effect into this EffectKnobParameterSlot - void loadEffect(EffectSlot* pEffectSlot); + void loadParameter(EffectParameter* pEffectParameter); double getValueParameter() const; diff --git a/src/effects/effectslot.cpp b/src/effects/effectslot.cpp index eb25f3e45ad9..559131178799 100644 --- a/src/effects/effectslot.cpp +++ b/src/effects/effectslot.cpp @@ -175,12 +175,6 @@ EffectManifestPointer EffectSlot::getManifest() const { return m_pManifest; } -void EffectSlot::reload(const QSet& activeInputChannels) { - loadEffect(m_pManifest, - m_pEffectsManager->createProcessor(m_pManifest), - activeInputChannels); -} - EffectKnobParameterSlotPointer EffectSlot::addEffectKnobParameterSlot() { auto pParameterSlot = EffectKnobParameterSlotPointer( new EffectKnobParameterSlot(m_group, m_knobParameterSlots.size())); @@ -303,34 +297,27 @@ void EffectSlot::loadEffect(const EffectManifestPointer pManifest, return; } + m_knobParameterSlotPositionToManifestIndex.clear(); + m_buttonParameterSlotPositionToManifestIndex.clear(); + int index = 0; for (const auto& pManifestParameter: m_pManifest->parameters()) { EffectParameter* pParameter = new EffectParameter( this, m_pEffectsManager, m_parameters.size(), pManifestParameter); m_parameters.append(pParameter); + + if (isKnobParameter(pParameter)) { + m_knobParameterSlotPositionToManifestIndex.push_back(index); + } else { + m_buttonParameterSlotPositionToManifestIndex.push_back(index); + } + ++index; } addToEngine(std::move(pProcessor), activeChannels); m_pControlLoaded->forceSet(1.0); - unsigned int iNumKnobParameters = numKnobParameters(); - while (static_cast(m_knobParameterSlots.size()) - < iNumKnobParameters) { - addEffectKnobParameterSlot(); - } - - unsigned int iNumButtonParameters = numButtonParameters(); - while (static_cast(m_buttonParameterSlots.size()) - < iNumButtonParameters) { - addEffectButtonParameterSlot(); - } - - for (const auto& pParameter : m_knobParameterSlots) { - pParameter->loadEffect(this); - } - for (const auto& pParameter : m_buttonParameterSlots) { - pParameter->loadEffect(this); - } + loadParameters(); if (m_pEffectsManager->isAdoptMetaknobValueEnabled()) { slotEffectMetaParameter(m_pControlMetaParameter->get(), true); @@ -343,6 +330,47 @@ void EffectSlot::loadEffect(const EffectManifestPointer pManifest, updateEngineState(); } +void EffectSlot::loadParameters() { + unsigned int iKnobParameter = 0; + for (int i=0 ; iloadParameter(pParameter); + ++iKnobParameter; + } + } + while (iKnobParameter < m_knobParameterSlots.size()) { + m_knobParameterSlots.at(iKnobParameter)->clear(); + ++iKnobParameter; + } + + unsigned int iButtonParameter = 0; + for (int i=0 ; iloadParameter(pParameter); + ++iButtonParameter; + } + } + while (iButtonParameter < m_buttonParameterSlots.size()) { + m_buttonParameterSlots.at(iButtonParameter)->clear(); + ++iButtonParameter; + } + +} + void EffectSlot::unloadEffect() { if (!isLoaded()) { return; @@ -369,6 +397,28 @@ void EffectSlot::unloadEffect() { removeFromEngine(); } +void EffectSlot::hideEffectParameter(const unsigned int parameterId) { + m_knobParameterSlotPositionToManifestIndex.removeAll(parameterId); + m_buttonParameterSlotPositionToManifestIndex.removeAll(parameterId); + + loadParameters(); +} + +void EffectSlot::setEffectParameterPosition(const unsigned int parameterId, + const unsigned int position) { + m_knobParameterSlotPositionToManifestIndex.removeAll(parameterId); + m_buttonParameterSlotPositionToManifestIndex.removeAll(parameterId); + auto pParameter = m_parameters.at(parameterId); + if (pParameter) { + if (isButtonParameter(pParameter)) { + m_buttonParameterSlotPositionToManifestIndex.insert(position, parameterId); + } else { + m_knobParameterSlotPositionToManifestIndex.insert(position, parameterId); + } + loadParameters(); + } +} + void EffectSlot::slotPrevEffect(double v) { if (v > 0) { slotEffectSelector(-1); diff --git a/src/effects/effectslot.h b/src/effects/effectslot.h index 87a837efe2de..3a8e8cfa9e07 100644 --- a/src/effects/effectslot.h +++ b/src/effects/effectslot.h @@ -107,7 +107,10 @@ class EffectSlot : public QObject { void removeFromEngine(); double getMetaknobDefault(); - void reload(const QSet& activeInputChannels); + + void hideEffectParameter(const unsigned int parameterId); + void setEffectParameterPosition(const unsigned int parameterId, + const unsigned int position); public slots: void setMetaParameter(double v, bool force = false); @@ -129,6 +132,7 @@ class EffectSlot : public QObject { return QString("EffectSlot(%1)").arg(m_group); } + void loadParameters(); void sendParameterUpdate(); void unloadEffect(); @@ -142,6 +146,8 @@ class EffectSlot : public QObject { EngineEffectChain* m_pEngineEffectChain; QList m_knobParameterSlots; QList m_buttonParameterSlots; + QList m_knobParameterSlotPositionToManifestIndex; + QList m_buttonParameterSlotPositionToManifestIndex; ControlObject* m_pControlLoaded; ControlPushButton* m_pControlEnabled; diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index 1b9a58f9d896..9f5e13f89fef 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -410,15 +410,29 @@ void EffectsManager::setup() { // m_pEffectChainManager->loadEffectChains(); // } -void EffectsManager::refreshAllChainSlots() { +void EffectsManager::setEffectParameterPosition(EffectManifestPointer pManifest, + const unsigned int parameterId, const unsigned int position) { for (auto& pChainSlot : m_standardEffectChainSlots) { - pChainSlot->reloadAllEffects(); + pChainSlot->setEffectParameterPosition(pManifest, parameterId, position); } for (auto& pChainSlot : m_equalizerEffectChainSlots) { - pChainSlot->reloadAllEffects(); + pChainSlot->setEffectParameterPosition(pManifest, parameterId, position); } for (auto& pChainSlot : m_quickEffectChainSlots) { - pChainSlot->reloadAllEffects(); + pChainSlot->setEffectParameterPosition(pManifest, parameterId, position); + } +} + +void EffectsManager::hideEffectParameter(EffectManifestPointer pManifest, + const unsigned int position) { + for (auto& pChainSlot : m_standardEffectChainSlots) { + pChainSlot->hideEffectParameter(pManifest, position); + } + for (auto& pChainSlot : m_equalizerEffectChainSlots) { + pChainSlot->hideEffectParameter(pManifest, position); + } + for (auto& pChainSlot : m_quickEffectChainSlots) { + pChainSlot->hideEffectParameter(pManifest, position); } } diff --git a/src/effects/effectsmanager.h b/src/effects/effectsmanager.h index 2064346faeae..d1e73e02d84e 100644 --- a/src/effects/effectsmanager.h +++ b/src/effects/effectsmanager.h @@ -139,8 +139,10 @@ class EffectsManager : public QObject { void setup(); - // Reloads all effect to the slots to update parameter assignements - void refreshAllChainSlots(); + // TODO : Remove these functions once the GUI for parameter rearrangement is implemented + void hideEffectParameter(EffectManifestPointer pManifest, const unsigned int position); + void setEffectParameterPosition(EffectManifestPointer pManifest, + const unsigned int parameterId, const unsigned int position); // Write an EffectsRequest to the EngineEffectsManager. EffectsManager takes // ownership of request and deletes it once a response is received. diff --git a/src/preferences/dialog/dlgpreflv2.cpp b/src/preferences/dialog/dlgpreflv2.cpp index f6f0b2f917f4..e04ee1f60989 100644 --- a/src/preferences/dialog/dlgpreflv2.cpp +++ b/src/preferences/dialog/dlgpreflv2.cpp @@ -117,11 +117,15 @@ void DlgPrefLV2::slotApply() { m_pLV2Backend->getManifest(m_currentEffectId); qDebug() << "DlgPrefLV2::slotApply" << pCurrentEffectManifest.data(); + unsigned int position = 0; for (int i = 0; i < m_pluginParameters.size(); i++) { - EffectManifestParameterPointer pParameter = pCurrentEffectManifest->parameter(i); - pParameter->setShowInParameterSlot(m_pluginParameters[i]->isChecked()); + if (m_pluginParameters[i]->isChecked()) { + m_pEffectsManager->setEffectParameterPosition(pCurrentEffectManifest, i, position); + ++position; + } else { + m_pEffectsManager->hideEffectParameter(pCurrentEffectManifest, i); + } } - m_pEffectsManager->refreshAllChainSlots(); } void DlgPrefLV2::slotUpdateOnParameterCheck(int state) { From a1091b6f66c8e898de4d01fbc08876247c1262ad Mon Sep 17 00:00:00 2001 From: Kshitij Gupta Date: Tue, 28 Aug 2018 12:44:13 +0530 Subject: [PATCH 025/443] Reduced Effect Parameter Code Duplicacy - Added ParameterType enum and merged Knob/Button methods --- src/effects/effectbuttonparameterslot.cpp | 14 +- src/effects/effectbuttonparameterslot.h | 4 + src/effects/effectknobparameterslot.cpp | 5 +- src/effects/effectmanifestparameter.h | 27 +++ src/effects/effectparameterslotbase.cpp | 4 + src/effects/effectparameterslotbase.h | 12 + src/effects/effectslot.cpp | 233 +++++++------------- src/effects/effectslot.h | 42 +--- src/effects/effectsmanager.cpp | 25 +-- src/effects/effectsmanager.h | 7 +- src/preferences/dialog/dlgprefeq.cpp | 16 +- src/widget/effectwidgetutils.h | 4 +- src/widget/weffectparameterknob.cpp | 6 +- src/widget/weffectparameterknob.h | 2 +- src/widget/weffectparameterknobcomposed.cpp | 6 +- src/widget/weffectparameterknobcomposed.h | 2 +- src/widget/weffectpushbutton.cpp | 6 +- src/widget/weffectpushbutton.h | 2 +- 18 files changed, 181 insertions(+), 236 deletions(-) diff --git a/src/effects/effectbuttonparameterslot.cpp b/src/effects/effectbuttonparameterslot.cpp index e698353c9154..3a67e10b0034 100644 --- a/src/effects/effectbuttonparameterslot.cpp +++ b/src/effects/effectbuttonparameterslot.cpp @@ -11,8 +11,9 @@ EffectButtonParameterSlot::EffectButtonParameterSlot(const QString& group, const unsigned int iParameterSlotNumber) - : EffectParameterSlotBase(group, - iParameterSlotNumber) { + : EffectParameterSlotBase(group, iParameterSlotNumber) { + m_parameterType = EffectManifestParameter::EffectParameterType::Button; + QString itemPrefix = formatItemPrefix(iParameterSlotNumber); m_pControlLoaded = new ControlObject( ConfigKey(m_group, itemPrefix + QString("_loaded"))); @@ -44,7 +45,8 @@ void EffectButtonParameterSlot::loadParameter(EffectParameter* pEffectParameter) clear(); } - VERIFY_OR_DEBUG_ASSERT(EffectSlot::isButtonParameter(pEffectParameter)) { + VERIFY_OR_DEBUG_ASSERT(pEffectParameter->manifest()->parameterType() == + EffectManifestParameter::EffectParameterType::Button) { return; } @@ -147,3 +149,9 @@ void EffectButtonParameterSlot::loadParameterSlotFromXml(const QDomElement& // // If the conversion failed, the default value is kept. // } } + +void EffectButtonParameterSlot::syncSofttakeover() { +} + +void EffectButtonParameterSlot::onEffectMetaParameterChanged(double parameter, bool force) { +} diff --git a/src/effects/effectbuttonparameterslot.h b/src/effects/effectbuttonparameterslot.h index a100b1ba6207..74eb3ef2618a 100644 --- a/src/effects/effectbuttonparameterslot.h +++ b/src/effects/effectbuttonparameterslot.h @@ -31,6 +31,10 @@ class EffectButtonParameterSlot : public EffectParameterSlotBase { // Clear the currently loaded effect void clear(); + void syncSofttakeover(); + + void onEffectMetaParameterChanged(double parameter, bool force=false); + QDomElement toXml(QDomDocument* doc) const override; void loadParameterSlotFromXml(const QDomElement& parameterElement) override; diff --git a/src/effects/effectknobparameterslot.cpp b/src/effects/effectknobparameterslot.cpp index 2512536f76c5..e23c31df20b4 100644 --- a/src/effects/effectknobparameterslot.cpp +++ b/src/effects/effectknobparameterslot.cpp @@ -13,6 +13,8 @@ EffectKnobParameterSlot::EffectKnobParameterSlot(const QString& group, const unsigned int iParameterSlotNumber) : EffectParameterSlotBase(group, iParameterSlotNumber) { + m_parameterType = EffectManifestParameter::EffectParameterType::Knob; + QString itemPrefix = formatItemPrefix(iParameterSlotNumber); m_pControlValue = new ControlEffectKnob( @@ -60,7 +62,8 @@ void EffectKnobParameterSlot::loadParameter(EffectParameter* pEffectParameter) { // qDebug() << debugString() << "loadParameter" << (pEffectSlot ? pEffectSlot->getManifest().name() : "(null)"); clear(); - VERIFY_OR_DEBUG_ASSERT(EffectSlot::isKnobParameter(pEffectParameter)) { + VERIFY_OR_DEBUG_ASSERT(pEffectParameter->manifest()->parameterType() == + EffectManifestParameter::EffectParameterType::Knob) { return; } diff --git a/src/effects/effectmanifestparameter.h b/src/effects/effectmanifestparameter.h index 5ba77c90b566..6983e18b0fb2 100644 --- a/src/effects/effectmanifestparameter.h +++ b/src/effects/effectmanifestparameter.h @@ -7,12 +7,20 @@ #include #include "util/assert.h" +#include "effects/defs.h" class EffectManifestParameter; typedef QSharedPointer EffectManifestParameterPointer; + class EffectManifestParameter { public: + enum class EffectParameterType { + Knob, + Button, + NumTypes + }; + enum class ControlHint { UNKNOWN = 0, KNOB_LINEAR, @@ -134,11 +142,24 @@ class EffectManifestParameter { // Usage hints //////////////////////////////////////////////////////////////////////////////// + virtual const EffectParameterType& parameterType() const { + return m_parameterType; + } + + virtual void setParameterType(const EffectParameterType parameterType) { + m_parameterType = parameterType; + } + virtual ControlHint controlHint() const { return m_controlHint; } virtual void setControlHint(ControlHint controlHint) { m_controlHint = controlHint; + if (controlHint == ControlHint::TOGGLE_STEPPING) { + setParameterType(EffectParameterType::Button); + } else { + setParameterType(EffectParameterType::Knob); + } } virtual SemanticHint semanticHint() const { @@ -240,6 +261,7 @@ class EffectManifestParameter { QString m_shortName; QString m_description; + EffectParameterType m_parameterType; ControlHint m_controlHint; SemanticHint m_semanticHint; UnitsHint m_unitsHint; @@ -261,6 +283,11 @@ class EffectManifestParameter { bool m_showInParametertSlot; }; +inline uint qHash(const EffectManifestParameter::EffectParameterType& parameterType) { + return static_cast(parameterType); +} + QDebug operator<<(QDebug dbg, const EffectManifestParameter& parameter); + #endif /* EFFECTMANIFESTPARAMETER_H */ diff --git a/src/effects/effectparameterslotbase.cpp b/src/effects/effectparameterslotbase.cpp index 6b3515f3d407..fa463599de59 100644 --- a/src/effects/effectparameterslotbase.cpp +++ b/src/effects/effectparameterslotbase.cpp @@ -47,6 +47,10 @@ QString EffectParameterSlotBase::description() const { return tr("No effect loaded."); } +EffectManifestParameter::EffectParameterType EffectParameterSlotBase::parameterType() const { + return m_parameterType; +} + EffectManifestParameterPointer EffectParameterSlotBase::getManifest() { if (m_pManifestParameter) { return m_pManifestParameter; diff --git a/src/effects/effectparameterslotbase.h b/src/effects/effectparameterslotbase.h index fbc65be3857f..4d64e223ebdc 100644 --- a/src/effects/effectparameterslotbase.h +++ b/src/effects/effectparameterslotbase.h @@ -23,9 +23,20 @@ class EffectParameterSlotBase : public QObject { EffectParameterSlotBase(const QString& group, const unsigned int iParameterSlotNumber); virtual ~EffectParameterSlotBase(); + // Load the parameter of the given effect into this EffectButtonParameterSlot + virtual void loadParameter(EffectParameter* pEffectParameter) = 0; + + // Clear the currently loaded effect + virtual void clear() = 0; + + virtual void syncSofttakeover() = 0; + + virtual void onEffectMetaParameterChanged(double parameter, bool force=false) = 0; + QString name() const; QString shortName() const; QString description() const; + EffectManifestParameter::EffectParameterType parameterType() const; EffectManifestParameterPointer getManifest(); virtual QDomElement toXml(QDomDocument* doc) const = 0; @@ -41,6 +52,7 @@ class EffectParameterSlotBase : public QObject { EffectSlot* m_pEffectSlot; EffectParameter* m_pEffectParameter; EffectManifestParameterPointer m_pManifestParameter; + EffectManifestParameter::EffectParameterType m_parameterType; // Controls exposed to the rest of Mixxx ControlObject* m_pControlLoaded; diff --git a/src/effects/effectslot.cpp b/src/effects/effectslot.cpp index 559131178799..b68de6137634 100644 --- a/src/effects/effectslot.cpp +++ b/src/effects/effectslot.cpp @@ -29,18 +29,6 @@ EffectSlot::EffectSlot(const QString& group, m_pControlLoaded = new ControlObject(ConfigKey(m_group, "loaded")); m_pControlLoaded->setReadOnly(); - m_pControlNumParameters = new ControlObject(ConfigKey(m_group, "num_parameters")); - m_pControlNumParameters->setReadOnly(); - - m_pControlNumParameterSlots = new ControlObject(ConfigKey(m_group, "num_parameterslots")); - m_pControlNumParameterSlots->setReadOnly(); - - m_pControlNumButtonParameters = new ControlObject(ConfigKey(m_group, "num_button_parameters")); - m_pControlNumButtonParameters->setReadOnly(); - - m_pControlNumButtonParameterSlots = new ControlObject(ConfigKey(m_group, "num_button_parameterslots")); - m_pControlNumButtonParameterSlots->setReadOnly(); - // Default to disabled to prevent accidental activation of effects // at the beginning of a set. m_pControlEnabled = new ControlPushButton(ConfigKey(m_group, "enabled")); @@ -66,8 +54,8 @@ EffectSlot::EffectSlot(const QString& group, this, SLOT(slotClear(double))); for (unsigned int i = 0; i < kDefaultMaxParameters; ++i) { - addEffectKnobParameterSlot(); - addEffectButtonParameterSlot(); + addEffectParameterSlot(EffectManifestParameter::EffectParameterType::Knob); + addEffectParameterSlot(EffectManifestParameter::EffectParameterType::Button); } m_pControlMetaParameter = new ControlPotmeter(ConfigKey(m_group, "meta"), 0.0, 1.0); @@ -79,8 +67,6 @@ EffectSlot::EffectSlot(const QString& group, m_pMetaknobSoftTakeover = new SoftTakeover(); m_pControlLoaded->forceSet(0.0); - m_pControlNumParameters->forceSet(0.0); - m_pControlNumButtonParameters->forceSet(0.0); } EffectSlot::~EffectSlot() { @@ -88,10 +74,6 @@ EffectSlot::~EffectSlot() { unloadEffect(); delete m_pControlLoaded; - delete m_pControlNumParameters; - delete m_pControlNumParameterSlots; - delete m_pControlNumButtonParameters; - delete m_pControlNumButtonParameterSlots; delete m_pControlNextEffect; delete m_pControlPrevEffect; delete m_pControlEffectSelector; @@ -175,64 +157,36 @@ EffectManifestPointer EffectSlot::getManifest() const { return m_pManifest; } -EffectKnobParameterSlotPointer EffectSlot::addEffectKnobParameterSlot() { - auto pParameterSlot = EffectKnobParameterSlotPointer( - new EffectKnobParameterSlot(m_group, m_knobParameterSlots.size())); - m_knobParameterSlots.append(pParameterSlot); - m_pControlNumParameterSlots->forceSet( - m_pControlNumParameterSlots->get() + 1); - return pParameterSlot; -} - -EffectButtonParameterSlotPointer EffectSlot::addEffectButtonParameterSlot() { - auto pParameterSlot = EffectButtonParameterSlotPointer( - new EffectButtonParameterSlot(m_group, m_buttonParameterSlots.size())); - m_buttonParameterSlots.append(pParameterSlot); - m_pControlNumButtonParameterSlots->forceSet( - m_pControlNumButtonParameterSlots->get() + 1); - return pParameterSlot; -} - -unsigned int EffectSlot::numKnobParameters() const { - unsigned int num = 0; - for (auto const& pParameter : m_parameters) { - if (pParameter->manifest()->controlHint() != - EffectManifestParameter::ControlHint::TOGGLE_STEPPING) { - ++num; - } +void EffectSlot::addEffectParameterSlot(EffectManifestParameter::EffectParameterType parameterType) { + EffectParameterSlotBasePointer pParameterSlot = EffectParameterSlotBasePointer(); + if (parameterType == EffectManifestParameter::EffectParameterType::Knob) { + pParameterSlot = static_cast ( + new EffectKnobParameterSlot(m_group, m_iNumParameterSlots[parameterType])); + } else if (parameterType == EffectManifestParameter::EffectParameterType::Button) { + pParameterSlot = static_cast ( + new EffectButtonParameterSlot(m_group, m_iNumParameterSlots[parameterType])); } - return num; + ++m_iNumParameterSlots[parameterType]; + m_parameterSlots.append(pParameterSlot); } -unsigned int EffectSlot::numButtonParameters() const { +unsigned int EffectSlot::numParameters(EffectManifestParameter::EffectParameterType parameterType) const { unsigned int num = 0; for (auto const& pParameter : m_parameters) { - if (pParameter->manifest()->controlHint() == - EffectManifestParameter::ControlHint::TOGGLE_STEPPING) { + if (parameterType == pParameter->manifest()->parameterType()) { ++num; } } return num; } -// static -bool EffectSlot::isButtonParameter(EffectParameter* parameter) { - return parameter->manifest()->controlHint() == - EffectManifestParameter::ControlHint::TOGGLE_STEPPING; -} - -// static -bool EffectSlot::isKnobParameter(EffectParameter* parameter) { - return !isButtonParameter(parameter); -} - -EffectParameter* EffectSlot::getFilteredParameterForSlot(ParameterFilterFnc filterFnc, - unsigned int slotNumber) { +EffectParameter* EffectSlot::getParameterForSlot(EffectManifestParameter::EffectParameterType parameterType, + unsigned int slotNumber) { // It's normal to ask for a parameter that doesn't exist. Callers must check // for NULL. unsigned int num = 0; for (const auto& parameter: m_parameters) { - if (parameter->manifest()->showInParameterSlot() && filterFnc(parameter)) { + if (parameter->manifest()->showInParameterSlot() && parameter->manifest()->parameterType() == parameterType) { if(num == slotNumber) { return parameter; } @@ -242,46 +196,28 @@ EffectParameter* EffectSlot::getFilteredParameterForSlot(ParameterFilterFnc filt return nullptr; } -EffectParameter* EffectSlot::getKnobParameterForSlot(unsigned int slotNumber) { - return getFilteredParameterForSlot(isKnobParameter, slotNumber); -} - -EffectParameter* EffectSlot::getButtonParameterForSlot(unsigned int slotNumber) { - return getFilteredParameterForSlot(isButtonParameter, slotNumber); -} - double EffectSlot::getMetaknobDefault() { return m_pManifest->metaknobDefault(); } -unsigned int EffectSlot::numParameterSlots() const { - return m_knobParameterSlots.size(); -} - -unsigned int EffectSlot::numButtonParameterSlots() const { - return m_buttonParameterSlots.size(); -} - void EffectSlot::setEnabled(bool enabled) { m_pControlEnabled->set(enabled); } -EffectKnobParameterSlotPointer EffectSlot::getEffectKnobParameterSlot(unsigned int slotNumber) { - //qDebug() << debugString() << "getEffectKnobParameterSlot" << slotNumber; - if (slotNumber >= static_cast(m_knobParameterSlots.size())) { - qWarning() << "WARNING: slotNumber out of range"; - return EffectKnobParameterSlotPointer(); - } - return m_knobParameterSlots[slotNumber]; -} +EffectParameterSlotBasePointer EffectSlot::getEffectParameterSlot(EffectManifestParameter::EffectParameterType parameterType, + unsigned int slotNumber) { + // qDebug() << debugString() << "getEffectParameterSlot" << static_cast(parameterType) << ' ' << slotNumber; -EffectButtonParameterSlotPointer EffectSlot::getEffectButtonParameterSlot(unsigned int slotNumber) { - //qDebug() << debugString() << "getEffectKnobParameterSlot" << slotNumber; - if (slotNumber >= static_cast(m_buttonParameterSlots.size())) { - qWarning() << "WARNING: slotNumber out of range"; - return EffectButtonParameterSlotPointer(); + int iSlotNumber = 0; + for (const auto& pParameterSlot : m_parameterSlots) { + if (pParameterSlot->parameterType() == parameterType) { + if (iSlotNumber == slotNumber) { + return pParameterSlot; + } + ++iSlotNumber; + } } - return m_buttonParameterSlots[slotNumber]; + return EffectParameterSlotBasePointer(); } void EffectSlot::loadEffect(const EffectManifestPointer pManifest, @@ -297,19 +233,17 @@ void EffectSlot::loadEffect(const EffectManifestPointer pManifest, return; } - m_knobParameterSlotPositionToManifestIndex.clear(); - m_buttonParameterSlotPositionToManifestIndex.clear(); + for (auto& parameterMapping : m_parameterSlotPositionToManifestIndex) { + parameterMapping.clear(); + } + int index = 0; for (const auto& pManifestParameter: m_pManifest->parameters()) { EffectParameter* pParameter = new EffectParameter( this, m_pEffectsManager, m_parameters.size(), pManifestParameter); m_parameters.append(pParameter); - if (isKnobParameter(pParameter)) { - m_knobParameterSlotPositionToManifestIndex.push_back(index); - } else { - m_buttonParameterSlotPositionToManifestIndex.push_back(index); - } + m_parameterSlotPositionToManifestIndex[pManifestParameter->parameterType()].push_back(index); ++index; } @@ -331,44 +265,39 @@ void EffectSlot::loadEffect(const EffectManifestPointer pManifest, } void EffectSlot::loadParameters() { - unsigned int iKnobParameter = 0; - for (int i=0 ; iloadParameter(pParameter); - ++iKnobParameter; - } - } - while (iKnobParameter < m_knobParameterSlots.size()) { - m_knobParameterSlots.at(iKnobParameter)->clear(); - ++iKnobParameter; - } - - unsigned int iButtonParameter = 0; - for (int i=0 ; i (EffectManifestParameter::EffectParameterType::NumTypes); + for (int parameterTypeId=0 ; parameterTypeId (parameterTypeId); + unsigned int iParameter = 0; + unsigned int numParameterSlots = m_iNumParameterSlots[parameterType]; + for (int i=0 ; iloadParameter(pParameter); + ++iParameter; + } } - - if (iButtonParameter < m_buttonParameterSlots.size()) { - m_buttonParameterSlots.at(iButtonParameter)->loadParameter(pParameter); - ++iButtonParameter; + while (iParameter < numParameterSlots) { + auto pParameterSlot = getEffectParameterSlot(parameterType, iParameter); + VERIFY_OR_DEBUG_ASSERT(pParameterSlot != nullptr) { + break; + } + pParameterSlot->clear(); + ++iParameter; } } - while (iButtonParameter < m_buttonParameterSlots.size()) { - m_buttonParameterSlots.at(iButtonParameter)->clear(); - ++iButtonParameter; - } - } void EffectSlot::unloadEffect() { @@ -377,14 +306,9 @@ void EffectSlot::unloadEffect() { } m_pControlLoaded->forceSet(0.0); - m_pControlNumParameters->forceSet(0.0); - m_pControlNumButtonParameters->forceSet(0.0); - for (const auto& pParameterSlot : m_knobParameterSlots) { + for (const auto& pParameterSlot : m_parameterSlots) { pParameterSlot->clear(); } - for (const auto& pButtonParameter : m_buttonParameterSlots) { - pButtonParameter->clear(); - } for (int i = 0; i < m_parameters.size(); ++i) { EffectParameter* pParameter = m_parameters.at(i); @@ -398,23 +322,22 @@ void EffectSlot::unloadEffect() { } void EffectSlot::hideEffectParameter(const unsigned int parameterId) { - m_knobParameterSlotPositionToManifestIndex.removeAll(parameterId); - m_buttonParameterSlotPositionToManifestIndex.removeAll(parameterId); + for (auto& parameterMapping : m_parameterSlotPositionToManifestIndex) { + parameterMapping.removeAll(parameterId); + } loadParameters(); } void EffectSlot::setEffectParameterPosition(const unsigned int parameterId, const unsigned int position) { - m_knobParameterSlotPositionToManifestIndex.removeAll(parameterId); - m_buttonParameterSlotPositionToManifestIndex.removeAll(parameterId); + for (auto& parameterMapping : m_parameterSlotPositionToManifestIndex) { + parameterMapping.removeAll(parameterId); + } + auto pParameter = m_parameters.at(parameterId); if (pParameter) { - if (isButtonParameter(pParameter)) { - m_buttonParameterSlotPositionToManifestIndex.insert(position, parameterId); - } else { - m_knobParameterSlotPositionToManifestIndex.insert(position, parameterId); - } + m_parameterSlotPositionToManifestIndex[pParameter->manifest()->parameterType()].insert(position, parameterId); loadParameters(); } } @@ -447,8 +370,10 @@ void EffectSlot::slotClear(double v) { } void EffectSlot::syncSofttakeover() { - for (const auto& pParameterSlot : m_knobParameterSlots) { - pParameterSlot->syncSofttakeover(); + for (const auto pParameterSlot : m_parameterSlots) { + if (pParameterSlot->parameterType() == EffectManifestParameter::EffectParameterType::Knob) { + pParameterSlot->syncSofttakeover(); + } } } @@ -477,8 +402,10 @@ void EffectSlot::slotEffectMetaParameter(double v, bool force) { if (!m_pControlEnabled->toBool()) { force = true; } - for (const auto& pParameterSlot : m_knobParameterSlots) { - pParameterSlot->onEffectMetaParameterChanged(v, force); + for (const auto& pParameterSlot : m_parameterSlots) { + if (pParameterSlot->parameterType() == EffectManifestParameter::EffectParameterType::Knob) { + pParameterSlot->onEffectMetaParameterChanged(v, force); + } } } diff --git a/src/effects/effectslot.h b/src/effects/effectslot.h index 3a8e8cfa9e07..db77e632c308 100644 --- a/src/effects/effectslot.h +++ b/src/effects/effectslot.h @@ -32,8 +32,6 @@ class EffectKnobParameterSlot; class EffectSlot : public QObject { Q_OBJECT public: - typedef bool (*ParameterFilterFnc)(EffectParameter*); - EffectSlot(const QString& group, EffectsManager* pEffectsManager, const unsigned int iEffectNumber, @@ -53,20 +51,9 @@ class EffectSlot : public QObject { return m_pEngineEffect != nullptr; } - unsigned int numParameterSlots() const; - EffectKnobParameterSlotPointer addEffectKnobParameterSlot(); - EffectKnobParameterSlotPointer getEffectKnobParameterSlot(unsigned int slotNumber); - EffectKnobParameterSlotPointer getEffectKnobParameterSlotForConfigKey(unsigned int slotNumber); - inline const QList& getEffectKnobParameterSlots() const { - return m_knobParameterSlots; - }; - - unsigned int numButtonParameterSlots() const; - EffectButtonParameterSlotPointer addEffectButtonParameterSlot(); - EffectButtonParameterSlotPointer getEffectButtonParameterSlot(unsigned int slotNumber); - inline const QList& getEffectButtonParameterSlots() const { - return m_buttonParameterSlots; - }; + void addEffectParameterSlot(EffectManifestParameter::EffectParameterType parameterType); + EffectParameterSlotBasePointer getEffectParameterSlot( + EffectManifestParameter::EffectParameterType parameterType, unsigned int slotNumber); double getMetaParameter() const; @@ -85,16 +72,10 @@ class EffectSlot : public QObject { EffectManifestPointer getManifest() const; - unsigned int numKnobParameters() const; - unsigned int numButtonParameters() const; - - static bool isButtonParameter(EffectParameter* parameter); - static bool isKnobParameter(EffectParameter* parameter); + unsigned int numParameters(EffectManifestParameter::EffectParameterType parameterType) const; - EffectParameter* getFilteredParameterForSlot( - ParameterFilterFnc filterFnc, unsigned int slotNumber); - EffectParameter* getKnobParameterForSlot(unsigned int slotNumber); - EffectParameter* getButtonParameterForSlot(unsigned int slotNumber); + EffectParameter* getParameterForSlot(EffectManifestParameter::EffectParameterType parameterType, + unsigned int slotNumber); void setEnabled(bool enabled); @@ -137,6 +118,7 @@ class EffectSlot : public QObject { void unloadEffect(); const unsigned int m_iEffectNumber; + QHash m_iNumParameterSlots; const QString m_group; UserSettingsPointer m_pConfig; EffectsManager* m_pEffectsManager; @@ -144,17 +126,11 @@ class EffectSlot : public QObject { EngineEffect* m_pEngineEffect; QList m_parameters; EngineEffectChain* m_pEngineEffectChain; - QList m_knobParameterSlots; - QList m_buttonParameterSlots; - QList m_knobParameterSlotPositionToManifestIndex; - QList m_buttonParameterSlotPositionToManifestIndex; + QList m_parameterSlots; + QHash> m_parameterSlotPositionToManifestIndex; ControlObject* m_pControlLoaded; ControlPushButton* m_pControlEnabled; - ControlObject* m_pControlNumParameters; - ControlObject* m_pControlNumParameterSlots; - ControlObject* m_pControlNumButtonParameters; - ControlObject* m_pControlNumButtonParameterSlots; ControlObject* m_pControlNextEffect; ControlObject* m_pControlPrevEffect; ControlEncoder* m_pControlEffectSelector; diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index 9f5e13f89fef..c21d14097332 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -351,33 +351,18 @@ EffectSlotPointer EffectsManager::getEffectSlot( return pEffectSlot; } -EffectKnobParameterSlotPointer EffectsManager::getEffectKnobParameterSlot( - const ConfigKey& configKey) { +EffectParameterSlotBasePointer EffectsManager::getEffectParameterSlot( + const EffectManifestParameter::EffectParameterType parameterType, const ConfigKey& configKey) { EffectSlotPointer pEffectSlot = getEffectSlot(configKey.group); VERIFY_OR_DEBUG_ASSERT(pEffectSlot) { - return EffectKnobParameterSlotPointer(); + return EffectParameterSlotBasePointer(); } QRegExp intRegEx(".*(\\d+).*"); intRegEx.indexIn(configKey.item); - EffectKnobParameterSlotPointer pParameterSlot = - pEffectSlot->getEffectKnobParameterSlot(intRegEx.cap(1).toInt() - 1); - return pParameterSlot; -} - -EffectButtonParameterSlotPointer EffectsManager::getEffectButtonParameterSlot( - const ConfigKey& configKey) { - EffectSlotPointer pEffectSlot = - getEffectSlot(configKey.group); - VERIFY_OR_DEBUG_ASSERT(pEffectSlot) { - return EffectButtonParameterSlotPointer(); - } - - QRegExp intRegEx(".*(\\d+).*"); - intRegEx.indexIn(configKey.item); - EffectButtonParameterSlotPointer pParameterSlot = - pEffectSlot->getEffectButtonParameterSlot(intRegEx.cap(1).toInt() - 1); + EffectParameterSlotBasePointer pParameterSlot = pEffectSlot->getEffectParameterSlot( + parameterType, intRegEx.cap(1).toInt() - 1); return pParameterSlot; } diff --git a/src/effects/effectsmanager.h b/src/effects/effectsmanager.h index d1e73e02d84e..5f72b92985a2 100644 --- a/src/effects/effectsmanager.h +++ b/src/effects/effectsmanager.h @@ -11,6 +11,7 @@ #include "control/controlpotmeter.h" #include "control/controlpushbutton.h" #include "effects/specialeffectchainslots.h" +#include "effects/effectmanifestparameter.h" #include "engine/channelhandle.h" #include "engine/effects/message.h" #include "preferences/usersettings.h" @@ -111,10 +112,8 @@ class EffectsManager : public QObject { EffectChainSlotPointer getEffectChainSlot(const QString& group) const; EffectSlotPointer getEffectSlot(const QString& group); - EffectKnobParameterSlotPointer getEffectKnobParameterSlot( - const ConfigKey& configKey); - EffectButtonParameterSlotPointer getEffectButtonParameterSlot( - const ConfigKey& configKey); + EffectParameterSlotBasePointer getEffectParameterSlot( + const EffectManifestParameter::EffectParameterType parameterType, const ConfigKey& configKey); QString getNextEffectId(const QString& effectId); QString getPrevEffectId(const QString& effectId); diff --git a/src/preferences/dialog/dlgprefeq.cpp b/src/preferences/dialog/dlgprefeq.cpp index 1ee3f47eb2ec..671414f3ba8e 100644 --- a/src/preferences/dialog/dlgprefeq.cpp +++ b/src/preferences/dialog/dlgprefeq.cpp @@ -496,7 +496,7 @@ void DlgPrefEQ::slotUpdateMasterEQParameter(int value) { if (!pEffectSlot.isNull()) { QSlider* slider = qobject_cast(sender()); int index = slider->property("index").toInt(); - EffectParameter* param = pEffectSlot->getKnobParameterForSlot(index); + EffectParameter* param = pEffectSlot->getParameterForSlot(EffectManifestParameter::EffectParameterType::Knob, index); if (param) { double dValue = value / 100.0; param->setValue(dValue); @@ -617,9 +617,9 @@ void DlgPrefEQ::setUpMasterEQ() { // Load parameters from preferences: EffectSlotPointer pEffectSlot(m_pEffectMasterEQ); if (!pEffectSlot.isNull()) { - int knobNum = pEffectSlot->numKnobParameters(); + int knobNum = pEffectSlot->numParameters(EffectManifestParameter::EffectParameterType::Knob); for (int i = 0; i < knobNum; i++) { - EffectParameter* param = pEffectSlot->getKnobParameterForSlot(i); + EffectParameter* param = pEffectSlot->getParameterForSlot(EffectManifestParameter::EffectParameterType::Knob, i); if (param) { QString strValue = m_pConfig->getValueString(ConfigKey(kConfigKey, QString("EffectForGroup_[Master]_parameter%1").arg(i + 1))); @@ -663,12 +663,12 @@ void DlgPrefEQ::slotMasterEqEffectChanged(int effectIndex) { pEffectSlot->setEnabled(true); m_pEffectMasterEQ = pEffectSlot; - int knobNum = pEffectSlot->numKnobParameters(); + int knobNum = pEffectSlot->numParameters(EffectManifestParameter::EffectParameterType::Knob); // Create and set up Master EQ's sliders int i; for (i = 0; i < knobNum; i++) { - EffectParameter* param = pEffectSlot->getKnobParameterForSlot(i); + EffectParameter* param = pEffectSlot->getParameterForSlot(EffectManifestParameter::EffectParameterType::Knob, i); if (param) { EffectManifestParameterPointer pManifestParameter = param->manifest(); @@ -751,9 +751,9 @@ QString DlgPrefEQ::getQuickEffectGroupForDeck(int deck) const { void DlgPrefEQ::slotMasterEQToDefault() { EffectSlotPointer pEffectSlot(m_pEffectMasterEQ); if (!pEffectSlot.isNull()) { - int knobNum = pEffectSlot->numKnobParameters(); + int knobNum = pEffectSlot->numParameters(EffectManifestParameter::EffectParameterType::Knob); for (int i = 0; i < knobNum; i++) { - EffectParameter* param = pEffectSlot->getKnobParameterForSlot(i); + EffectParameter* param = pEffectSlot->getParameterForSlot(EffectManifestParameter::EffectParameterType::Knob, i); if (param) { double defaultValue = param->manifest()->getDefault(); setMasterEQParameter(i, defaultValue); @@ -765,7 +765,7 @@ void DlgPrefEQ::slotMasterEQToDefault() { void DlgPrefEQ::setMasterEQParameter(int i, double value) { EffectSlotPointer pEffectSlot(m_pEffectMasterEQ); if (!pEffectSlot.isNull()) { - EffectParameter* param = pEffectSlot->getKnobParameterForSlot(i); + EffectParameter* param = pEffectSlot->getParameterForSlot(EffectManifestParameter::EffectParameterType::Knob, i); if (param) { param->setValue(value); m_masterEQSliders[i]->setValue(value * 100); diff --git a/src/widget/effectwidgetutils.h b/src/widget/effectwidgetutils.h index 20e5a5f89942..fd8d7700c4eb 100644 --- a/src/widget/effectwidgetutils.h +++ b/src/widget/effectwidgetutils.h @@ -63,7 +63,7 @@ class EffectWidgetUtils { ¶meterNumberOk); if (parameterNumberOk) { // XML effect nodes are 1-indexed. - return pEffectSlot->getEffectKnobParameterSlot(parameterNumber - 1); + return pEffectSlot->getEffectParameterSlot(EffectManifestParameter::EffectParameterType::Knob, parameterNumber - 1); } return EffectParameterSlotBasePointer(); } @@ -80,7 +80,7 @@ class EffectWidgetUtils { ¶meterNumberOk); if (parameterNumberOk) { // XML effect nodes are 1-indexed. - return pEffectSlot->getEffectButtonParameterSlot(parameterNumber - 1); + return pEffectSlot->getEffectParameterSlot(EffectManifestParameter::EffectParameterType::Button, parameterNumber - 1); } return EffectParameterSlotBasePointer(); } diff --git a/src/widget/weffectparameterknob.cpp b/src/widget/weffectparameterknob.cpp index 68e85abbea51..efb8b341156e 100644 --- a/src/widget/weffectparameterknob.cpp +++ b/src/widget/weffectparameterknob.cpp @@ -2,8 +2,8 @@ #include "widget/weffectparameterknob.h" void WEffectParameterKnob::setupEffectParameterSlot(const ConfigKey& configKey) { - EffectKnobParameterSlotPointer pParameterSlot = - m_pEffectsManager->getEffectKnobParameterSlot(configKey); + EffectParameterSlotBasePointer pParameterSlot = + m_pEffectsManager->getEffectParameterSlot(EffectManifestParameter::EffectParameterType::Knob, configKey); if (!pParameterSlot) { qWarning() << "EffectParameterKnob" << configKey << "is not an effect parameter."; @@ -13,7 +13,7 @@ void WEffectParameterKnob::setupEffectParameterSlot(const ConfigKey& configKey) } void WEffectParameterKnob::setEffectKnobParameterSlot( - EffectKnobParameterSlotPointer pParameterSlot) { + EffectParameterSlotBasePointer pParameterSlot) { m_pEffectParameterSlot = pParameterSlot; if (m_pEffectParameterSlot) { connect(m_pEffectParameterSlot.data(), SIGNAL(updated()), diff --git a/src/widget/weffectparameterknob.h b/src/widget/weffectparameterknob.h index 647270672a62..460fbcfd1bb2 100644 --- a/src/widget/weffectparameterknob.h +++ b/src/widget/weffectparameterknob.h @@ -27,7 +27,7 @@ class WEffectParameterKnob : public WKnob { private: // Set the EffectKnobParameterSlot that should be monitored by this // WEffectKnobComposed. - void setEffectKnobParameterSlot(EffectKnobParameterSlotPointer pParameterSlot); + void setEffectKnobParameterSlot(EffectParameterSlotBasePointer pParameterSlot); EffectsManager* m_pEffectsManager; EffectParameterSlotBasePointer m_pEffectParameterSlot; diff --git a/src/widget/weffectparameterknobcomposed.cpp b/src/widget/weffectparameterknobcomposed.cpp index eba3e157f7ba..1fa3fe30f4d0 100644 --- a/src/widget/weffectparameterknobcomposed.cpp +++ b/src/widget/weffectparameterknobcomposed.cpp @@ -7,8 +7,8 @@ const QString groupClose = "]"; } // anonymous namespace void WEffectParameterKnobComposed::setupEffectParameterSlot(const ConfigKey& configKey) { - EffectKnobParameterSlotPointer pParameterSlot = - m_pEffectsManager->getEffectKnobParameterSlot(configKey); + EffectParameterSlotBasePointer pParameterSlot = + m_pEffectsManager->getEffectParameterSlot(EffectManifestParameter::EffectParameterType::Knob, configKey); if (!pParameterSlot) { qWarning() << "EffectParameterKnobComposed" << configKey << "is not an effect parameter."; @@ -18,7 +18,7 @@ void WEffectParameterKnobComposed::setupEffectParameterSlot(const ConfigKey& con } void WEffectParameterKnobComposed::setEffectKnobParameterSlot( - EffectKnobParameterSlotPointer pParameterSlot) { + EffectParameterSlotBasePointer pParameterSlot) { m_pEffectParameterSlot = pParameterSlot; if (m_pEffectParameterSlot) { connect(m_pEffectParameterSlot.data(), SIGNAL(updated()), diff --git a/src/widget/weffectparameterknobcomposed.h b/src/widget/weffectparameterknobcomposed.h index 6379c755275f..00471a83f448 100644 --- a/src/widget/weffectparameterknobcomposed.h +++ b/src/widget/weffectparameterknobcomposed.h @@ -28,7 +28,7 @@ class WEffectParameterKnobComposed : public WKnobComposed { private: // Set the EffectKnobParameterSlot that should be monitored by this // WEffectKnobComposed. - void setEffectKnobParameterSlot(EffectKnobParameterSlotPointer pParameterSlot); + void setEffectKnobParameterSlot(EffectParameterSlotBasePointer pParameterSlot); EffectsManager* m_pEffectsManager; EffectParameterSlotBasePointer m_pEffectParameterSlot; diff --git a/src/widget/weffectpushbutton.cpp b/src/widget/weffectpushbutton.cpp index 5e16999dbb15..986e102906a7 100644 --- a/src/widget/weffectpushbutton.cpp +++ b/src/widget/weffectpushbutton.cpp @@ -20,8 +20,8 @@ void WEffectPushButton::setup(const QDomNode& node, const SkinContext& context) } void WEffectPushButton::setupEffectParameterSlot(const ConfigKey& configKey) { - EffectButtonParameterSlotPointer pParameterSlot = - m_pEffectsManager->getEffectButtonParameterSlot(configKey); + EffectParameterSlotBasePointer pParameterSlot = + m_pEffectsManager->getEffectParameterSlot(EffectManifestParameter::EffectParameterType::Button, configKey); if (!pParameterSlot) { qWarning() << "EffectPushButton" << configKey << "is not an effect button parameter."; @@ -31,7 +31,7 @@ void WEffectPushButton::setupEffectParameterSlot(const ConfigKey& configKey) { } void WEffectPushButton::setEffectKnobParameterSlot( - EffectButtonParameterSlotPointer pParameterSlot) { + EffectParameterSlotBasePointer pParameterSlot) { m_pEffectParameterSlot = pParameterSlot; if (m_pEffectParameterSlot) { connect(m_pEffectParameterSlot.data(), SIGNAL(updated()), diff --git a/src/widget/weffectpushbutton.h b/src/widget/weffectpushbutton.h index 0a496214422b..85747e0601bb 100644 --- a/src/widget/weffectpushbutton.h +++ b/src/widget/weffectpushbutton.h @@ -34,7 +34,7 @@ class WEffectPushButton : public WPushButton { private: // Set the EffectKnobParameterSlot that should be monitored by this // WEffectKnobComposed. - void setEffectKnobParameterSlot(EffectButtonParameterSlotPointer pParameterSlot); + void setEffectKnobParameterSlot(EffectParameterSlotBasePointer pParameterSlot); EffectsManager* m_pEffectsManager; From 67d4e8153485660c59655f70ea809391e3ae5f89 Mon Sep 17 00:00:00 2001 From: Kshitij Gupta Date: Thu, 11 Oct 2018 05:40:21 +0530 Subject: [PATCH 026/443] Renamed ControlHint->ValueScaler and EffectParameterType->ParameterType --- src/control/controleffectknob.cpp | 10 ++-- src/control/controleffectknob.h | 2 +- src/effects/builtin/autopaneffect.cpp | 6 +- src/effects/builtin/balanceeffect.cpp | 6 +- src/effects/builtin/bitcrushereffect.cpp | 4 +- src/effects/builtin/echoeffect.cpp | 12 ++-- src/effects/builtin/equalizer_util.h | 18 +++--- src/effects/builtin/filtereffect.cpp | 6 +- src/effects/builtin/flangereffect.cpp | 12 ++-- src/effects/builtin/graphiceqeffect.cpp | 6 +- src/effects/builtin/loudnesscontoureffect.cpp | 4 +- src/effects/builtin/metronomeeffect.cpp | 4 +- .../builtin/moogladder4filtereffect.cpp | 6 +- src/effects/builtin/parametriceqeffect.cpp | 12 ++-- src/effects/builtin/phasereffect.cpp | 14 ++--- src/effects/builtin/reverbeffect.cpp | 8 +-- src/effects/builtin/tremoloeffect.cpp | 24 ++++---- src/effects/effectbuttonparameterslot.cpp | 6 +- src/effects/effectknobparameterslot.cpp | 6 +- src/effects/effectmanifestparameter.h | 55 ++++++++++--------- src/effects/effectparameterslotbase.cpp | 2 +- src/effects/effectparameterslotbase.h | 4 +- src/effects/effectslot.cpp | 26 ++++----- src/effects/effectslot.h | 12 ++-- src/effects/effectsmanager.cpp | 2 +- src/effects/effectsmanager.h | 2 +- src/effects/lv2/lv2manifest.cpp | 10 ++-- src/preferences/dialog/dlgprefeq.cpp | 16 +++--- src/test/metaknob_link_test.cpp | 4 +- src/widget/effectwidgetutils.h | 4 +- src/widget/weffectparameterknob.cpp | 2 +- src/widget/weffectparameterknobcomposed.cpp | 2 +- src/widget/weffectpushbutton.cpp | 2 +- 33 files changed, 155 insertions(+), 154 deletions(-) diff --git a/src/control/controleffectknob.cpp b/src/control/controleffectknob.cpp index 169cade841d2..1c99d2f836f3 100644 --- a/src/control/controleffectknob.cpp +++ b/src/control/controleffectknob.cpp @@ -7,19 +7,19 @@ ControlEffectKnob::ControlEffectKnob(ConfigKey key, double dMinValue, double dMa : ControlPotmeter(key, dMinValue, dMaxValue) { } -void ControlEffectKnob::setBehaviour(EffectManifestParameter::ControlHint type, +void ControlEffectKnob::setBehaviour(EffectManifestParameter::ValueScaler type, double dMinValue, double dMaxValue) { if (m_pControl == NULL) { return; } - if (type == EffectManifestParameter::ControlHint::KNOB_LINEAR) { + if (type == EffectManifestParameter::ValueScaler::LINEAR) { m_pControl->setBehavior(new ControlLinPotmeterBehavior( dMinValue, dMaxValue, false)); - } else if (type == EffectManifestParameter::ControlHint::KNOB_LINEAR_INVERSE) { + } else if (type == EffectManifestParameter::ValueScaler::LINEAR_INVERSE) { m_pControl->setBehavior(new ControlLinInvPotmeterBehavior( dMinValue, dMaxValue, false)); - } else if (type == EffectManifestParameter::ControlHint::KNOB_LOGARITHMIC) { + } else if (type == EffectManifestParameter::ValueScaler::LOGARITHMIC) { if (dMinValue == 0) { if (dMaxValue == 1.0) { // Volume like control @@ -37,7 +37,7 @@ void ControlEffectKnob::setBehaviour(EffectManifestParameter::ControlHint type, m_pControl->setBehavior( new ControlLogPotmeterBehavior(dMinValue, dMaxValue, -40)); } - } else if (type == EffectManifestParameter::ControlHint::KNOB_LOGARITHMIC_INVERSE) { + } else if (type == EffectManifestParameter::ValueScaler::LOGARITHMIC_INVERSE) { m_pControl->setBehavior( new ControlLogInvPotmeterBehavior(dMinValue, dMaxValue, -40)); } diff --git a/src/control/controleffectknob.h b/src/control/controleffectknob.h index eabb38e07b1b..07f6d1a4cd65 100644 --- a/src/control/controleffectknob.h +++ b/src/control/controleffectknob.h @@ -9,7 +9,7 @@ class ControlEffectKnob : public ControlPotmeter { public: ControlEffectKnob(ConfigKey key, double dMinValue = 0.0, double dMaxValue = 1.0); - void setBehaviour(EffectManifestParameter::ControlHint type, + void setBehaviour(EffectManifestParameter::ValueScaler type, double dMinValue, double dMaxValue); }; diff --git a/src/effects/builtin/autopaneffect.cpp b/src/effects/builtin/autopaneffect.cpp index e6f64dbb70d0..6b50782123da 100644 --- a/src/effects/builtin/autopaneffect.cpp +++ b/src/effects/builtin/autopaneffect.cpp @@ -34,7 +34,7 @@ EffectManifestPointer AutoPanEffect::getManifest() { "How fast the sound goes from one side to another\n" "1/4 - 4 beats rounded to 1/2 beat if tempo is detected\n" "1/4 - 4 seconds if no tempo is detected")); - period->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); + period->setValueScaler(EffectManifestParameter::ValueScaler::LINEAR); period->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); period->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); period->setDefaultLinkType(EffectManifestParameter::LinkType::LINKED); @@ -47,7 +47,7 @@ EffectManifestPointer AutoPanEffect::getManifest() { smoothing->setShortName(QObject::tr("Smooth")); smoothing->setDescription(QObject::tr( "How smoothly the signal goes from one side to the other")); - smoothing->setControlHint(EffectManifestParameter::ControlHint::KNOB_LOGARITHMIC); + smoothing->setValueScaler(EffectManifestParameter::ValueScaler::LOGARITHMIC); smoothing->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); smoothing->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); smoothing->setDefaultLinkType(EffectManifestParameter::LinkType::LINKED); @@ -63,7 +63,7 @@ EffectManifestPointer AutoPanEffect::getManifest() { width->setShortName(QObject::tr("Width")); width->setDescription(QObject::tr( "How far the signal goes to each side")); - width->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); + width->setValueScaler(EffectManifestParameter::ValueScaler::LINEAR); width->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); width->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); width->setDefaultLinkType(EffectManifestParameter::LinkType::LINKED); diff --git a/src/effects/builtin/balanceeffect.cpp b/src/effects/builtin/balanceeffect.cpp index e8fc356a916a..f61bc1c19403 100644 --- a/src/effects/builtin/balanceeffect.cpp +++ b/src/effects/builtin/balanceeffect.cpp @@ -31,7 +31,7 @@ EffectManifestPointer BalanceEffect::getManifest() { balance->setShortName(QObject::tr("Balance")); balance->setDescription(QObject::tr( "Adjust balance between left and right channels")); - balance->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); + balance->setValueScaler(EffectManifestParameter::ValueScaler::LINEAR); balance->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); balance->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); balance->setDefaultLinkType(EffectManifestParameter::LinkType::LINKED); @@ -46,7 +46,7 @@ EffectManifestPointer BalanceEffect::getManifest() { "Fully left: mono\n" "Fully right: only side ambiance\n" "Center: does not change the original signal.")); - midSide->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); + midSide->setValueScaler(EffectManifestParameter::ValueScaler::LINEAR); midSide->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); midSide->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); midSide->setDefaultLinkType(EffectManifestParameter::LinkType::NONE); @@ -58,7 +58,7 @@ EffectManifestPointer BalanceEffect::getManifest() { midLowPass->setShortName(QObject::tr("Bypass Fr.")); midLowPass->setDescription(QObject::tr( "Frequencies below this cutoff are not adjusted in the stereo field")); - midLowPass->setControlHint(EffectManifestParameter::ControlHint::KNOB_LOGARITHMIC); + midLowPass->setValueScaler(EffectManifestParameter::ValueScaler::LOGARITHMIC); midLowPass->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); midLowPass->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); midLowPass->setDefaultLinkType(EffectManifestParameter::LinkType::NONE); diff --git a/src/effects/builtin/bitcrushereffect.cpp b/src/effects/builtin/bitcrushereffect.cpp index af02a7e1fbe0..6fdb2d40c53b 100644 --- a/src/effects/builtin/bitcrushereffect.cpp +++ b/src/effects/builtin/bitcrushereffect.cpp @@ -26,7 +26,7 @@ EffectManifestPointer BitCrusherEffect::getManifest() { depth->setShortName(QObject::tr("Bit Depth")); depth->setDescription(QObject::tr( "The bit depth of the samples")); - depth->setControlHint(EffectManifestParameter::ControlHint::KNOB_LOGARITHMIC); + depth->setValueScaler(EffectManifestParameter::ValueScaler::LOGARITHMIC); depth->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); depth->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); depth->setDefaultLinkType(EffectManifestParameter::LinkType::LINKED); @@ -42,7 +42,7 @@ EffectManifestPointer BitCrusherEffect::getManifest() { frequency->setShortName(QObject::tr("Down")); frequency->setDescription(QObject::tr( "The sample rate to which the signal is downsampled")); - frequency->setControlHint(EffectManifestParameter::ControlHint::KNOB_LOGARITHMIC); + frequency->setValueScaler(EffectManifestParameter::ValueScaler::LOGARITHMIC); frequency->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); frequency->setUnitsHint(EffectManifestParameter::UnitsHint::SAMPLERATE); frequency->setDefaultLinkType(EffectManifestParameter::LinkType::LINKED); diff --git a/src/effects/builtin/echoeffect.cpp b/src/effects/builtin/echoeffect.cpp index 7c70ab3d8bfa..2f9cb6776cf4 100644 --- a/src/effects/builtin/echoeffect.cpp +++ b/src/effects/builtin/echoeffect.cpp @@ -49,7 +49,7 @@ EffectManifestPointer EchoEffect::getManifest() { "Delay time\n" "1/8 - 2 beats if tempo is detected\n" "1/8 - 2 seconds if no tempo is detected")); - delay->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); + delay->setValueScaler(EffectManifestParameter::ValueScaler::LINEAR); delay->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); delay->setUnitsHint(EffectManifestParameter::UnitsHint::BEATS); delay->setRange(0.0, 0.5, 2.0); @@ -60,7 +60,7 @@ EffectManifestPointer EchoEffect::getManifest() { feedback->setShortName(QObject::tr("Feedback")); feedback->setDescription(QObject::tr( "Amount the echo fades each time it loops")); - feedback->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); + feedback->setValueScaler(EffectManifestParameter::ValueScaler::LINEAR); feedback->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); feedback->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); feedback->setRange(0.00, db2ratio(-3.0), 1.00); @@ -71,7 +71,7 @@ EffectManifestPointer EchoEffect::getManifest() { pingpong->setShortName(QObject::tr("Ping Pong")); pingpong->setDescription(QObject::tr( "How much the echoed sound bounces between the left and right sides of the stereo field")); - pingpong->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); + pingpong->setValueScaler(EffectManifestParameter::ValueScaler::LINEAR); pingpong->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); pingpong->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); pingpong->setRange(0.0, 0.0, 1.0); @@ -82,7 +82,7 @@ EffectManifestPointer EchoEffect::getManifest() { send->setShortName(QObject::tr("Send")); send->setDescription(QObject::tr( "How much of the signal to send into the delay buffer")); - send->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); + send->setValueScaler(EffectManifestParameter::ValueScaler::LINEAR); send->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); send->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); send->setDefaultLinkType(EffectManifestParameter::LinkType::LINKED); @@ -94,7 +94,7 @@ EffectManifestPointer EchoEffect::getManifest() { quantize->setShortName(QObject::tr("Quantize")); quantize->setDescription(QObject::tr( "Round the Time parameter to the nearest 1/4 beat.")); - quantize->setControlHint(EffectManifestParameter::ControlHint::TOGGLE_STEPPING); + quantize->setValueScaler(EffectManifestParameter::ValueScaler::TOGGLE); quantize->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); quantize->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); quantize->setRange(0, 1, 1); @@ -105,7 +105,7 @@ EffectManifestPointer EchoEffect::getManifest() { triplet->setShortName(QObject::tr("Triplets")); triplet->setDescription(QObject::tr( "When the Quantize parameter is enabled, divide rounded 1/4 beats of Time parameter by 3.")); - triplet->setControlHint(EffectManifestParameter::ControlHint::TOGGLE_STEPPING); + triplet->setValueScaler(EffectManifestParameter::ValueScaler::TOGGLE); triplet->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); triplet->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); triplet->setRange(0, 0, 1); diff --git a/src/effects/builtin/equalizer_util.h b/src/effects/builtin/equalizer_util.h index f2a8116666de..60deda21de9d 100644 --- a/src/effects/builtin/equalizer_util.h +++ b/src/effects/builtin/equalizer_util.h @@ -9,11 +9,11 @@ class EqualizerUtil { public: // Creates common EQ parameters like low/mid/high gain and kill buttons. static void createCommonParameters(EffectManifest* pManifest, bool linear) { - EffectManifestParameter::ControlHint controlHint = - EffectManifestParameter::ControlHint::KNOB_LOGARITHMIC; + EffectManifestParameter::ValueScaler valueScaler = + EffectManifestParameter::ValueScaler::LOGARITHMIC; double maximum = 4.0; if (linear) { - controlHint = EffectManifestParameter::ControlHint::KNOB_LINEAR; + valueScaler = EffectManifestParameter::ValueScaler::LINEAR; maximum = 2.0; } @@ -21,7 +21,7 @@ class EqualizerUtil { low->setId("low"); low->setName(QObject::tr("Low")); low->setDescription(QObject::tr("Gain for Low Filter")); - low->setControlHint(controlHint); + low->setValueScaler(valueScaler); low->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); low->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); low->setNeutralPointOnScale(0.5); @@ -31,7 +31,7 @@ class EqualizerUtil { killLow->setId("killLow"); killLow->setName(QObject::tr("Kill Low")); killLow->setDescription(QObject::tr("Kill the Low Filter")); - killLow->setControlHint(EffectManifestParameter::ControlHint::TOGGLE_STEPPING); + killLow->setValueScaler(EffectManifestParameter::ValueScaler::TOGGLE); killLow->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); killLow->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); killLow->setRange(0, 0, 1); @@ -40,7 +40,7 @@ class EqualizerUtil { mid->setId("mid"); mid->setName(QObject::tr("Mid")); mid->setDescription(QObject::tr("Gain for Mid Filter")); - mid->setControlHint(controlHint); + mid->setValueScaler(valueScaler); mid->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); mid->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); mid->setNeutralPointOnScale(0.5); @@ -50,7 +50,7 @@ class EqualizerUtil { killMid->setId("killMid"); killMid->setName(QObject::tr("Kill Mid")); killMid->setDescription(QObject::tr("Kill the Mid Filter")); - killMid->setControlHint(EffectManifestParameter::ControlHint::TOGGLE_STEPPING); + killMid->setValueScaler(EffectManifestParameter::ValueScaler::TOGGLE); killMid->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); killMid->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); killMid->setRange(0, 0, 1); @@ -59,7 +59,7 @@ class EqualizerUtil { high->setId("high"); high->setName(QObject::tr("High")); high->setDescription(QObject::tr("Gain for High Filter")); - high->setControlHint(controlHint); + high->setValueScaler(valueScaler); high->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); high->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); high->setNeutralPointOnScale(0.5); @@ -69,7 +69,7 @@ class EqualizerUtil { killHigh->setId("killHigh"); killHigh->setName(QObject::tr("Kill High")); killHigh->setDescription(QObject::tr("Kill the High Filter")); - killHigh->setControlHint(EffectManifestParameter::ControlHint::TOGGLE_STEPPING); + killHigh->setValueScaler(EffectManifestParameter::ValueScaler::TOGGLE); killHigh->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); killHigh->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); killHigh->setRange(0, 0, 1); diff --git a/src/effects/builtin/filtereffect.cpp b/src/effects/builtin/filtereffect.cpp index e0400424e566..75ae701a0c7e 100644 --- a/src/effects/builtin/filtereffect.cpp +++ b/src/effects/builtin/filtereffect.cpp @@ -29,7 +29,7 @@ EffectManifestPointer FilterEffect::getManifest() { lpf->setShortName(QObject::tr("LPF")); lpf->setDescription(QObject::tr( "Corner frequency ratio of the low pass filter")); - lpf->setControlHint(EffectManifestParameter::ControlHint::KNOB_LOGARITHMIC); + lpf->setValueScaler(EffectManifestParameter::ValueScaler::LOGARITHMIC); lpf->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); lpf->setUnitsHint(EffectManifestParameter::UnitsHint::HERTZ); lpf->setDefaultLinkType(EffectManifestParameter::LinkType::LINKED_LEFT); @@ -43,7 +43,7 @@ EffectManifestPointer FilterEffect::getManifest() { q->setDescription(QObject::tr( "Resonance of the filters\n" "Default: flat top")); // What does this mean? - q->setControlHint(EffectManifestParameter::ControlHint::KNOB_LOGARITHMIC); + q->setValueScaler(EffectManifestParameter::ValueScaler::LOGARITHMIC); q->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); q->setUnitsHint(EffectManifestParameter::UnitsHint::SAMPLERATE); q->setRange(0.4, 0.707106781, 4.0); // 0.707106781 = Butterworth @@ -54,7 +54,7 @@ EffectManifestPointer FilterEffect::getManifest() { hpf->setShortName(QObject::tr("HPF")); hpf->setDescription(QObject::tr( "Corner frequency ratio of the high pass filter")); - hpf->setControlHint(EffectManifestParameter::ControlHint::KNOB_LOGARITHMIC); + hpf->setValueScaler(EffectManifestParameter::ValueScaler::LOGARITHMIC); hpf->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); hpf->setUnitsHint(EffectManifestParameter::UnitsHint::HERTZ); hpf->setDefaultLinkType(EffectManifestParameter::LinkType::LINKED_RIGHT); diff --git a/src/effects/builtin/flangereffect.cpp b/src/effects/builtin/flangereffect.cpp index e73c352919a5..ae49811c93d7 100644 --- a/src/effects/builtin/flangereffect.cpp +++ b/src/effects/builtin/flangereffect.cpp @@ -40,7 +40,7 @@ EffectManifestPointer FlangerEffect::getManifest() { "Speed of the LFO (low frequency oscillator)\n" "32 - 1/4 beats rounded to 1/2 beat per LFO cycle if tempo is detected\n" "1/32 - 4 Hz if no tempo is detected")); - speed->setControlHint(EffectManifestParameter::ControlHint::KNOB_LOGARITHMIC_INVERSE); + speed->setValueScaler(EffectManifestParameter::ValueScaler::LOGARITHMIC_INVERSE); speed->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); speed->setRange(kMinLfoBeats, 8, kMaxLfoBeats); @@ -50,7 +50,7 @@ EffectManifestPointer FlangerEffect::getManifest() { width->setShortName(QObject::tr("Width")); width->setDescription(QObject::tr( "Delay amplitude of the LFO (low frequency oscillator)")); - width->setControlHint(EffectManifestParameter::ControlHint::KNOB_LOGARITHMIC); + width->setValueScaler(EffectManifestParameter::ValueScaler::LOGARITHMIC); width->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); width->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); width->setRange(0.0, kMaxLfoWidthMs / 2, kMaxLfoWidthMs); @@ -62,7 +62,7 @@ EffectManifestPointer FlangerEffect::getManifest() { manual->setDescription(QObject::tr( "Delay offset of the LFO (low frequency oscillator).\n" "With width at zero, this allows for manually sweeping over the entire delay range.")); - manual->setControlHint(EffectManifestParameter::ControlHint::KNOB_LOGARITHMIC); + manual->setValueScaler(EffectManifestParameter::ValueScaler::LOGARITHMIC); manual->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); manual->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); manual->setRange(kMinDelayMs, kCenterDelayMs, kMaxDelayMs); @@ -73,7 +73,7 @@ EffectManifestPointer FlangerEffect::getManifest() { regen->setShortName(QObject::tr("Regen")); regen->setDescription(QObject::tr( "How much of the delay output is feed back into the input")); - regen->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); + regen->setValueScaler(EffectManifestParameter::ValueScaler::LINEAR); regen->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); regen->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); regen->setRange(0.0, 0.25, 1.0); @@ -84,7 +84,7 @@ EffectManifestPointer FlangerEffect::getManifest() { mix->setShortName(QObject::tr("Mix")); mix->setDescription(QObject::tr( "Intensity of the effect")); - mix->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); + mix->setValueScaler(EffectManifestParameter::ValueScaler::LINEAR); mix->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); mix->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); mix->setDefaultLinkType(EffectManifestParameter::LinkType::LINKED); @@ -96,7 +96,7 @@ EffectManifestPointer FlangerEffect::getManifest() { triplet->setShortName(QObject::tr("Triplets")); triplet->setDescription(QObject::tr( "Divide rounded 1/2 beats of the Period parameter by 3.")); - triplet->setControlHint(EffectManifestParameter::ControlHint::TOGGLE_STEPPING); + triplet->setValueScaler(EffectManifestParameter::ValueScaler::TOGGLE); triplet->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); triplet->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); triplet->setRange(0, 0, 1); diff --git a/src/effects/builtin/graphiceqeffect.cpp b/src/effects/builtin/graphiceqeffect.cpp index dbae3e9bc2a4..38881e37f42d 100644 --- a/src/effects/builtin/graphiceqeffect.cpp +++ b/src/effects/builtin/graphiceqeffect.cpp @@ -31,7 +31,7 @@ EffectManifestPointer GraphicEQEffect::getManifest() { low->setShortName(QString("%1 Hz").arg(centerFrequencies[0])); low->setDescription(QObject::tr( "Gain for Low Filter")); - low->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); + low->setValueScaler(EffectManifestParameter::ValueScaler::LINEAR); low->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); low->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); low->setNeutralPointOnScale(0.5); @@ -51,7 +51,7 @@ EffectManifestPointer GraphicEQEffect::getManifest() { mid->setShortName(paramName); mid->setDescription(QObject::tr( "Gain for Band Filter %1").arg(i + 1)); - mid->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); + mid->setValueScaler(EffectManifestParameter::ValueScaler::LINEAR); mid->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); mid->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); mid->setNeutralPointOnScale(0.5); @@ -63,7 +63,7 @@ EffectManifestPointer GraphicEQEffect::getManifest() { high->setName(QString("%1 kHz").arg(centerFrequencies[7] / 1000)); high->setDescription(QObject::tr( "Gain for High Filter")); - high->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); + high->setValueScaler(EffectManifestParameter::ValueScaler::LINEAR); high->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); high->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); high->setRange(-12, 0, 12); diff --git a/src/effects/builtin/loudnesscontoureffect.cpp b/src/effects/builtin/loudnesscontoureffect.cpp index cdff84946702..732f85fbc261 100644 --- a/src/effects/builtin/loudnesscontoureffect.cpp +++ b/src/effects/builtin/loudnesscontoureffect.cpp @@ -38,7 +38,7 @@ EffectManifestPointer LoudnessContourEffect::getManifest() { loudness->setShortName(QObject::tr("Loudness")); loudness->setDescription(QObject::tr( "Set the gain of the applied loudness contour")); - loudness->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); + loudness->setValueScaler(EffectManifestParameter::ValueScaler::LINEAR); loudness->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); loudness->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); loudness->setDefaultLinkType(EffectManifestParameter::LinkType::LINKED); @@ -51,7 +51,7 @@ EffectManifestPointer LoudnessContourEffect::getManifest() { useGain->setShortName(QObject::tr("Use Gain")); useGain->setDescription(QObject::tr( "Follow Gain Knob")); - useGain->setControlHint(EffectManifestParameter::ControlHint::TOGGLE_STEPPING); + useGain->setValueScaler(EffectManifestParameter::ValueScaler::TOGGLE); useGain->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); useGain->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); useGain->setRange(0, 0, 1); diff --git a/src/effects/builtin/metronomeeffect.cpp b/src/effects/builtin/metronomeeffect.cpp index 5c5427fb54b9..6156470ce348 100644 --- a/src/effects/builtin/metronomeeffect.cpp +++ b/src/effects/builtin/metronomeeffect.cpp @@ -29,7 +29,7 @@ EffectManifestPointer MetronomeEffect::getManifest() { period->setId("bpm"); period->setName(QObject::tr("BPM")); period->setDescription(QObject::tr("Set the beats per minute value of the click sound")); - period->setControlHint(EffectManifestParameter::ControlHint::KNOB_LOGARITHMIC); + period->setValueScaler(EffectManifestParameter::ValueScaler::LOGARITHMIC); period->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); period->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); period->setRange(40, 120, 208); @@ -40,7 +40,7 @@ EffectManifestPointer MetronomeEffect::getManifest() { periodUnit->setId("sync"); periodUnit->setName(QObject::tr("Sync")); periodUnit->setDescription(QObject::tr("Synchronizes the BPM with the track if it can be retrieved")); - periodUnit->setControlHint(EffectManifestParameter::ControlHint::TOGGLE_STEPPING); + periodUnit->setValueScaler(EffectManifestParameter::ValueScaler::TOGGLE); periodUnit->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); periodUnit->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); periodUnit->setRange(0, 1, 1); diff --git a/src/effects/builtin/moogladder4filtereffect.cpp b/src/effects/builtin/moogladder4filtereffect.cpp index f2090e7a3525..ede90925c6b8 100644 --- a/src/effects/builtin/moogladder4filtereffect.cpp +++ b/src/effects/builtin/moogladder4filtereffect.cpp @@ -27,7 +27,7 @@ EffectManifestPointer MoogLadder4FilterEffect::getManifest() { lpf->setId("lpf"); lpf->setName(QObject::tr("LPF")); lpf->setDescription(QObject::tr("Corner frequency ratio of the low pass filter")); - lpf->setControlHint(EffectManifestParameter::ControlHint::KNOB_LOGARITHMIC); + lpf->setValueScaler(EffectManifestParameter::ValueScaler::LOGARITHMIC); lpf->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); lpf->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); lpf->setDefaultLinkType(EffectManifestParameter::LinkType::LINKED_LEFT); @@ -39,7 +39,7 @@ EffectManifestPointer MoogLadder4FilterEffect::getManifest() { q->setName(QObject::tr("Resonance")); q->setShortName(QObject::tr("Res")); q->setDescription(QObject::tr("Resonance of the filters. 4 = self oscillating")); - q->setControlHint(EffectManifestParameter::ControlHint::KNOB_LOGARITHMIC); + q->setValueScaler(EffectManifestParameter::ValueScaler::LOGARITHMIC); q->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); q->setUnitsHint(EffectManifestParameter::UnitsHint::SAMPLERATE); q->setRange(0.0, 1.0, 4.0); @@ -48,7 +48,7 @@ EffectManifestPointer MoogLadder4FilterEffect::getManifest() { hpf->setId("hpf"); hpf->setName(QObject::tr("HPF")); hpf->setDescription(QObject::tr("Corner frequency ratio of the high pass filter")); - hpf->setControlHint(EffectManifestParameter::ControlHint::KNOB_LOGARITHMIC); + hpf->setValueScaler(EffectManifestParameter::ValueScaler::LOGARITHMIC); hpf->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); hpf->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); hpf->setDefaultLinkType(EffectManifestParameter::LinkType::LINKED_RIGHT); diff --git a/src/effects/builtin/parametriceqeffect.cpp b/src/effects/builtin/parametriceqeffect.cpp index e61ed9274a25..65f0341748e1 100644 --- a/src/effects/builtin/parametriceqeffect.cpp +++ b/src/effects/builtin/parametriceqeffect.cpp @@ -32,7 +32,7 @@ EffectManifestPointer ParametricEQEffect::getManifest() { gain1->setShortName(QObject::tr("Gain 1")); gain1->setDescription(QObject::tr( "Gain for Filter 1")); - gain1->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); + gain1->setValueScaler(EffectManifestParameter::ValueScaler::LINEAR); gain1->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); gain1->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); gain1->setNeutralPointOnScale(0.5); @@ -46,7 +46,7 @@ EffectManifestPointer ParametricEQEffect::getManifest() { "Controls the bandwidth of Filter 1.\n" "A lower Q affects a wider band of frequencies,\n" "a higher Q affects a narrower band of frequencies.")); - q1->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); + q1->setValueScaler(EffectManifestParameter::ValueScaler::LINEAR); q1->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); q1->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); q1->setNeutralPointOnScale(0.5); @@ -58,7 +58,7 @@ EffectManifestPointer ParametricEQEffect::getManifest() { center1->setShortName(QObject::tr("Center 1")); center1->setDescription(QObject::tr( "Center frequency for Filter 1, from 100 Hz to 14 kHz")); - center1->setControlHint(EffectManifestParameter::ControlHint::KNOB_LOGARITHMIC); + center1->setValueScaler(EffectManifestParameter::ValueScaler::LOGARITHMIC); center1->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); center1->setUnitsHint(EffectManifestParameter::UnitsHint::HERTZ); center1->setNeutralPointOnScale(0.5); @@ -70,7 +70,7 @@ EffectManifestPointer ParametricEQEffect::getManifest() { gain2->setShortName(QObject::tr("Gain 2")); gain2->setDescription(QObject::tr( "Gain for Filter 2")); - gain2->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); + gain2->setValueScaler(EffectManifestParameter::ValueScaler::LINEAR); gain2->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); gain2->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); gain2->setNeutralPointOnScale(0.5); @@ -84,7 +84,7 @@ EffectManifestPointer ParametricEQEffect::getManifest() { "Controls the bandwidth of Filter 2.\n" "A lower Q affects a wider band of frequencies,\n" "a higher Q affects a narrower band of frequencies.")); - q2->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); + q2->setValueScaler(EffectManifestParameter::ValueScaler::LINEAR); q2->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); q2->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); q2->setNeutralPointOnScale(0.5); @@ -96,7 +96,7 @@ EffectManifestPointer ParametricEQEffect::getManifest() { center2->setShortName(QObject::tr("Center 2")); center2->setDescription(QObject::tr( "Center frequency for Filter 2, from 100 Hz to 14 kHz")); - center2->setControlHint(EffectManifestParameter::ControlHint::KNOB_LOGARITHMIC); + center2->setValueScaler(EffectManifestParameter::ValueScaler::LOGARITHMIC); center2->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); center2->setUnitsHint(EffectManifestParameter::UnitsHint::HERTZ); center2->setNeutralPointOnScale(0.5); diff --git a/src/effects/builtin/phasereffect.cpp b/src/effects/builtin/phasereffect.cpp index 2d051e8d4528..29d33e25c670 100644 --- a/src/effects/builtin/phasereffect.cpp +++ b/src/effects/builtin/phasereffect.cpp @@ -32,7 +32,7 @@ EffectManifestPointer PhaserEffect::getManifest() { "Period of the LFO (low frequency oscillator)\n" "1/4 - 4 beats rounded to 1/2 beat if tempo is detected\n" "1/4 - 4 seconds if no tempo is detected")); - period->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); + period->setValueScaler(EffectManifestParameter::ValueScaler::LINEAR); period->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); period->setUnitsHint(EffectManifestParameter::UnitsHint::BEATS); period->setRange(0.0, 1.0, 4.0); @@ -43,7 +43,7 @@ EffectManifestPointer PhaserEffect::getManifest() { fb->setShortName(QObject::tr("Feedback")); fb->setDescription(QObject::tr( "Controls how much of the output signal is looped")); - fb->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); + fb->setValueScaler(EffectManifestParameter::ValueScaler::LINEAR); fb->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); fb->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); fb->setRange(-1.0, 0.0, 1.0); @@ -54,7 +54,7 @@ EffectManifestPointer PhaserEffect::getManifest() { range->setShortName(QObject::tr("Range")); range->setDescription(QObject::tr( "Controls the frequency range across which the notches sweep.")); - range->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); + range->setValueScaler(EffectManifestParameter::ValueScaler::LINEAR); range->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); range->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); range->setRange(0.05, 1.0, 1.0); @@ -65,7 +65,7 @@ EffectManifestPointer PhaserEffect::getManifest() { stages->setShortName(QObject::tr("Stages")); stages->setDescription(QObject::tr( "Number of stages")); // stages of what? - stages->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); + stages->setValueScaler(EffectManifestParameter::ValueScaler::LINEAR); stages->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); stages->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); stages->setRange(1.0, 3.5, 6.0); @@ -76,7 +76,7 @@ EffectManifestPointer PhaserEffect::getManifest() { depth->setShortName(QObject::tr("Depth")); depth->setDescription(QObject::tr( "Intensity of the effect")); - depth->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); + depth->setValueScaler(EffectManifestParameter::ValueScaler::LINEAR); depth->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); depth->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); depth->setDefaultLinkType(EffectManifestParameter::LinkType::LINKED); @@ -88,7 +88,7 @@ EffectManifestPointer PhaserEffect::getManifest() { triplet->setShortName(QObject::tr("Triplets")); triplet->setDescription(QObject::tr( "Divide rounded 1/2 beats of the Period parameter by 3.")); - triplet->setControlHint(EffectManifestParameter::ControlHint::TOGGLE_STEPPING); + triplet->setValueScaler(EffectManifestParameter::ValueScaler::TOGGLE); triplet->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); triplet->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); triplet->setRange(0, 0, 1); @@ -99,7 +99,7 @@ EffectManifestPointer PhaserEffect::getManifest() { stereo->setShortName(QObject::tr("Stereo")); stereo->setDescription(QObject::tr( "Sets the LFOs (low frequency oscillators) for the left and right channels out of phase with each others")); - stereo->setControlHint(EffectManifestParameter::ControlHint::TOGGLE_STEPPING); + stereo->setValueScaler(EffectManifestParameter::ValueScaler::TOGGLE); stereo->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); stereo->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); stereo->setRange(0, 0, 1); diff --git a/src/effects/builtin/reverbeffect.cpp b/src/effects/builtin/reverbeffect.cpp index 1992ceda49eb..9c213576f34c 100644 --- a/src/effects/builtin/reverbeffect.cpp +++ b/src/effects/builtin/reverbeffect.cpp @@ -28,7 +28,7 @@ EffectManifestPointer ReverbEffect::getManifest() { decay->setShortName(QObject::tr("Decay")); decay->setDescription(QObject::tr( "Lower decay values cause reverberations to fade out more quickly.")); - decay->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); + decay->setValueScaler(EffectManifestParameter::ValueScaler::LINEAR); decay->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); decay->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); decay->setRange(0, 0.5, 1); @@ -40,7 +40,7 @@ EffectManifestPointer ReverbEffect::getManifest() { bandwidth->setDescription(QObject::tr( "Bandwidth of the low pass filter at the input.\n" "Higher values result in less attenuation of high frequencies.")); - bandwidth->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); + bandwidth->setValueScaler(EffectManifestParameter::ValueScaler::LINEAR); bandwidth->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); bandwidth->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); bandwidth->setRange(0, 1, 1); @@ -51,7 +51,7 @@ EffectManifestPointer ReverbEffect::getManifest() { damping->setShortName(QObject::tr("Damping")); damping->setDescription(QObject::tr( "Higher damping values cause high frequencies to decay more quickly than low frequencies.")); - damping->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); + damping->setValueScaler(EffectManifestParameter::ValueScaler::LINEAR); damping->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); damping->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); damping->setRange(0, 0, 1); @@ -62,7 +62,7 @@ EffectManifestPointer ReverbEffect::getManifest() { send->setShortName(QObject::tr("Send")); send->setDescription(QObject::tr( "How much of the signal to send in to the effect")); - send->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); + send->setValueScaler(EffectManifestParameter::ValueScaler::LINEAR); send->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); send->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); send->setDefaultLinkType(EffectManifestParameter::LinkType::LINKED); diff --git a/src/effects/builtin/tremoloeffect.cpp b/src/effects/builtin/tremoloeffect.cpp index a463ed2f0a25..c84ae28cda69 100644 --- a/src/effects/builtin/tremoloeffect.cpp +++ b/src/effects/builtin/tremoloeffect.cpp @@ -28,7 +28,7 @@ EffectManifestPointer TremoloEffect::getManifest() { depth->setShortName(QObject::tr("Depth")); depth->setDescription(QObject::tr( "How much the effect changes the volume")); - depth->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); + depth->setValueScaler(EffectManifestParameter::ValueScaler::LINEAR); depth->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); depth->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); depth->setDefaultLinkType(EffectManifestParameter::LinkType::LINKED); @@ -42,8 +42,8 @@ EffectManifestPointer TremoloEffect::getManifest() { "Rate of the volume changes\n" "4 beats - 1/8 beat if tempo is detected\n" "1/4 Hz - 8 Hz if no tempo is detected")); - rate->setControlHint( - EffectManifestParameter::ControlHint::KNOB_LOGARITHMIC); + rate->setValueScaler( + EffectManifestParameter::ValueScaler::LOGARITHMIC); rate->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); rate->setUnitsHint(EffectManifestParameter::UnitsHint::BEATS); rate->setRange(1.0/4, 1, 8); @@ -55,7 +55,7 @@ EffectManifestPointer TremoloEffect::getManifest() { width->setDescription(QObject::tr( "Width of the volume peak\n" "10% - 90% of the effect period")); - width->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); + width->setValueScaler(EffectManifestParameter::ValueScaler::LINEAR); width->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); width->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); width->setRange(0.1, 0.5, 0.9); @@ -68,8 +68,8 @@ EffectManifestPointer TremoloEffect::getManifest() { "Shape of the volume modulation wave\n" "Fully left: Square wave\n" "Fully right: Sine wave")); - waveform->setControlHint( - EffectManifestParameter::ControlHint::KNOB_LOGARITHMIC); + waveform->setValueScaler( + EffectManifestParameter::ValueScaler::LOGARITHMIC); waveform->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); waveform->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); waveform->setRange(0.005, 0.5, 1); @@ -82,8 +82,8 @@ EffectManifestPointer TremoloEffect::getManifest() { "Shifts the position of the volume peak within the period\n" "Fully left: beginning of the effect period\n" "Fully right: end of the effect period")); - phase->setControlHint( - EffectManifestParameter::ControlHint::KNOB_LINEAR); + phase->setValueScaler( + EffectManifestParameter::ValueScaler::LINEAR); phase->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); phase->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); phase->setRange(0, 0, 1); @@ -94,8 +94,8 @@ EffectManifestPointer TremoloEffect::getManifest() { quantize->setShortName(QObject::tr("Quantize")); quantize->setDescription(QObject::tr( "Round the Rate parameter to the nearest whole division of a beat.")); - quantize->setControlHint( - EffectManifestParameter::ControlHint::TOGGLE_STEPPING); + quantize->setValueScaler( + EffectManifestParameter::ValueScaler::TOGGLE); quantize->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); quantize->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); quantize->setRange(0, 1, 1); @@ -106,8 +106,8 @@ EffectManifestPointer TremoloEffect::getManifest() { triplet->setShortName(QObject::tr("Triplet")); triplet->setDescription(QObject::tr( "When the Quantize parameter is enabled, divide the effect period by 3.")); - triplet->setControlHint( - EffectManifestParameter::ControlHint::TOGGLE_STEPPING); + triplet->setValueScaler( + EffectManifestParameter::ValueScaler::TOGGLE); triplet->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); triplet->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); triplet->setRange(0, 0, 1); diff --git a/src/effects/effectbuttonparameterslot.cpp b/src/effects/effectbuttonparameterslot.cpp index 3a67e10b0034..bf291f0dacdb 100644 --- a/src/effects/effectbuttonparameterslot.cpp +++ b/src/effects/effectbuttonparameterslot.cpp @@ -12,7 +12,7 @@ EffectButtonParameterSlot::EffectButtonParameterSlot(const QString& group, const unsigned int iParameterSlotNumber) : EffectParameterSlotBase(group, iParameterSlotNumber) { - m_parameterType = EffectManifestParameter::EffectParameterType::Button; + m_parameterType = EffectManifestParameter::ParameterType::BUTTON; QString itemPrefix = formatItemPrefix(iParameterSlotNumber); m_pControlLoaded = new ControlObject( @@ -46,7 +46,7 @@ void EffectButtonParameterSlot::loadParameter(EffectParameter* pEffectParameter) } VERIFY_OR_DEBUG_ASSERT(pEffectParameter->manifest()->parameterType() == - EffectManifestParameter::EffectParameterType::Button) { + EffectManifestParameter::ParameterType::BUTTON) { return; } @@ -77,7 +77,7 @@ void EffectButtonParameterSlot::loadParameter(EffectParameter* pEffectParameter) m_pControlValue->set(dValue); m_pControlValue->setDefaultValue(dDefault); - EffectManifestParameter::ControlHint type = m_pManifestParameter->controlHint(); + EffectManifestParameter::ValueScaler type = m_pManifestParameter->valueScaler(); // TODO(rryan) expose this from EffectParameter m_pControlType->forceSet(static_cast(type)); // Default loaded parameters to loaded and unlinked diff --git a/src/effects/effectknobparameterslot.cpp b/src/effects/effectknobparameterslot.cpp index e23c31df20b4..53f53e170749 100644 --- a/src/effects/effectknobparameterslot.cpp +++ b/src/effects/effectknobparameterslot.cpp @@ -13,7 +13,7 @@ EffectKnobParameterSlot::EffectKnobParameterSlot(const QString& group, const unsigned int iParameterSlotNumber) : EffectParameterSlotBase(group, iParameterSlotNumber) { - m_parameterType = EffectManifestParameter::EffectParameterType::Knob; + m_parameterType = EffectManifestParameter::ParameterType::KNOB; QString itemPrefix = formatItemPrefix(iParameterSlotNumber); @@ -63,7 +63,7 @@ void EffectKnobParameterSlot::loadParameter(EffectParameter* pEffectParameter) { clear(); VERIFY_OR_DEBUG_ASSERT(pEffectParameter->manifest()->parameterType() == - EffectManifestParameter::EffectParameterType::Knob) { + EffectManifestParameter::ParameterType::KNOB) { return; } @@ -89,7 +89,7 @@ void EffectKnobParameterSlot::loadParameter(EffectParameter* pEffectParameter) { // << QString("Val: %1 Min: %2 MinLimit: %3 Max: %4 MaxLimit: %5 Default: %6") // .arg(dValue).arg(dMinimum).arg(dMinimumLimit).arg(dMaximum).arg(dMaximumLimit).arg(dDefault); - EffectManifestParameter::ControlHint type = m_pManifestParameter->controlHint(); + EffectManifestParameter::ValueScaler type = m_pManifestParameter->valueScaler(); m_pControlValue->setBehaviour(type, dMinimum, dMaximum); m_pControlValue->setDefaultValue(dDefault); m_pControlValue->set(dValue); diff --git a/src/effects/effectmanifestparameter.h b/src/effects/effectmanifestparameter.h index 6983e18b0fb2..e258044df905 100644 --- a/src/effects/effectmanifestparameter.h +++ b/src/effects/effectmanifestparameter.h @@ -15,22 +15,23 @@ typedef QSharedPointer EffectManifestParameterPointer; class EffectManifestParameter { public: - enum class EffectParameterType { - Knob, - Button, - NumTypes + enum class ParameterType { + KNOB, + BUTTON, + + NUM_TYPES }; - enum class ControlHint { + enum class ValueScaler { UNKNOWN = 0, - KNOB_LINEAR, - KNOB_LINEAR_INVERSE, - KNOB_LOGARITHMIC, - KNOB_LOGARITHMIC_INVERSE, - KNOB_STEPPING, // A step rotary, steps given by m_steps - // are arranged with equal distance on scale - TOGGLE_STEPPING // For button and enum controls, not accessible - // from many controllers, no linking to meta knob + LINEAR, + LINEAR_INVERSE, + LOGARITHMIC, + LOGARITHMIC_INVERSE, + INTEGRAL, // A step rotary, steps given by m_steps + // are arranged with equal distance on scale + TOGGLE // For button and enum controls, not accessible + // from many controllers, no linking to meta knob }; enum class SemanticHint { @@ -90,7 +91,7 @@ class EffectManifestParameter { }; EffectManifestParameter() - : m_controlHint(ControlHint::UNKNOWN), + : m_valueScaler(ValueScaler::UNKNOWN), m_semanticHint(SemanticHint::UNKNOWN), m_unitsHint(UnitsHint::UNKNOWN), m_defaultLinkType(LinkType::NONE), @@ -142,23 +143,23 @@ class EffectManifestParameter { // Usage hints //////////////////////////////////////////////////////////////////////////////// - virtual const EffectParameterType& parameterType() const { + virtual const ParameterType& parameterType() const { return m_parameterType; } - virtual void setParameterType(const EffectParameterType parameterType) { + virtual void setParameterType(const ParameterType parameterType) { m_parameterType = parameterType; } - virtual ControlHint controlHint() const { - return m_controlHint; + virtual ValueScaler valueScaler() const { + return m_valueScaler; } - virtual void setControlHint(ControlHint controlHint) { - m_controlHint = controlHint; - if (controlHint == ControlHint::TOGGLE_STEPPING) { - setParameterType(EffectParameterType::Button); + virtual void setValueScaler(ValueScaler valueScaler) { + m_valueScaler = valueScaler; + if (valueScaler == ValueScaler::TOGGLE) { + setParameterType(ParameterType::BUTTON); } else { - setParameterType(EffectParameterType::Knob); + setParameterType(ParameterType::KNOB); } } @@ -261,8 +262,8 @@ class EffectManifestParameter { QString m_shortName; QString m_description; - EffectParameterType m_parameterType; - ControlHint m_controlHint; + ParameterType m_parameterType; + ValueScaler m_valueScaler; SemanticHint m_semanticHint; UnitsHint m_unitsHint; LinkType m_defaultLinkType; @@ -274,7 +275,7 @@ class EffectManifestParameter { double m_maximum; // Used to describe steps of - // CONTROL_KNOB_STEPPING and CONTROL_TOGGLE_STEPPING + // CONTROL_INTEGRAL and CONTROL_TOGGLE // effect parameters // Each pair has the following form: // name - value @@ -283,7 +284,7 @@ class EffectManifestParameter { bool m_showInParametertSlot; }; -inline uint qHash(const EffectManifestParameter::EffectParameterType& parameterType) { +inline uint qHash(const EffectManifestParameter::ParameterType& parameterType) { return static_cast(parameterType); } diff --git a/src/effects/effectparameterslotbase.cpp b/src/effects/effectparameterslotbase.cpp index fa463599de59..3cc6066fd165 100644 --- a/src/effects/effectparameterslotbase.cpp +++ b/src/effects/effectparameterslotbase.cpp @@ -47,7 +47,7 @@ QString EffectParameterSlotBase::description() const { return tr("No effect loaded."); } -EffectManifestParameter::EffectParameterType EffectParameterSlotBase::parameterType() const { +EffectManifestParameter::ParameterType EffectParameterSlotBase::parameterType() const { return m_parameterType; } diff --git a/src/effects/effectparameterslotbase.h b/src/effects/effectparameterslotbase.h index 4d64e223ebdc..923a0165e01b 100644 --- a/src/effects/effectparameterslotbase.h +++ b/src/effects/effectparameterslotbase.h @@ -36,7 +36,7 @@ class EffectParameterSlotBase : public QObject { QString name() const; QString shortName() const; QString description() const; - EffectManifestParameter::EffectParameterType parameterType() const; + EffectManifestParameter::ParameterType parameterType() const; EffectManifestParameterPointer getManifest(); virtual QDomElement toXml(QDomDocument* doc) const = 0; @@ -52,7 +52,7 @@ class EffectParameterSlotBase : public QObject { EffectSlot* m_pEffectSlot; EffectParameter* m_pEffectParameter; EffectManifestParameterPointer m_pManifestParameter; - EffectManifestParameter::EffectParameterType m_parameterType; + EffectManifestParameter::ParameterType m_parameterType; // Controls exposed to the rest of Mixxx ControlObject* m_pControlLoaded; diff --git a/src/effects/effectslot.cpp b/src/effects/effectslot.cpp index b68de6137634..3f68e26bca1f 100644 --- a/src/effects/effectslot.cpp +++ b/src/effects/effectslot.cpp @@ -54,8 +54,8 @@ EffectSlot::EffectSlot(const QString& group, this, SLOT(slotClear(double))); for (unsigned int i = 0; i < kDefaultMaxParameters; ++i) { - addEffectParameterSlot(EffectManifestParameter::EffectParameterType::Knob); - addEffectParameterSlot(EffectManifestParameter::EffectParameterType::Button); + addEffectParameterSlot(EffectManifestParameter::ParameterType::KNOB); + addEffectParameterSlot(EffectManifestParameter::ParameterType::BUTTON); } m_pControlMetaParameter = new ControlPotmeter(ConfigKey(m_group, "meta"), 0.0, 1.0); @@ -157,12 +157,12 @@ EffectManifestPointer EffectSlot::getManifest() const { return m_pManifest; } -void EffectSlot::addEffectParameterSlot(EffectManifestParameter::EffectParameterType parameterType) { +void EffectSlot::addEffectParameterSlot(EffectManifestParameter::ParameterType parameterType) { EffectParameterSlotBasePointer pParameterSlot = EffectParameterSlotBasePointer(); - if (parameterType == EffectManifestParameter::EffectParameterType::Knob) { + if (parameterType == EffectManifestParameter::ParameterType::KNOB) { pParameterSlot = static_cast ( new EffectKnobParameterSlot(m_group, m_iNumParameterSlots[parameterType])); - } else if (parameterType == EffectManifestParameter::EffectParameterType::Button) { + } else if (parameterType == EffectManifestParameter::ParameterType::BUTTON) { pParameterSlot = static_cast ( new EffectButtonParameterSlot(m_group, m_iNumParameterSlots[parameterType])); } @@ -170,7 +170,7 @@ void EffectSlot::addEffectParameterSlot(EffectManifestParameter::EffectParameter m_parameterSlots.append(pParameterSlot); } -unsigned int EffectSlot::numParameters(EffectManifestParameter::EffectParameterType parameterType) const { +unsigned int EffectSlot::numParameters(EffectManifestParameter::ParameterType parameterType) const { unsigned int num = 0; for (auto const& pParameter : m_parameters) { if (parameterType == pParameter->manifest()->parameterType()) { @@ -180,7 +180,7 @@ unsigned int EffectSlot::numParameters(EffectManifestParameter::EffectParameterT return num; } -EffectParameter* EffectSlot::getParameterForSlot(EffectManifestParameter::EffectParameterType parameterType, +EffectParameter* EffectSlot::getParameterForSlot(EffectManifestParameter::ParameterType parameterType, unsigned int slotNumber) { // It's normal to ask for a parameter that doesn't exist. Callers must check // for NULL. @@ -204,7 +204,7 @@ void EffectSlot::setEnabled(bool enabled) { m_pControlEnabled->set(enabled); } -EffectParameterSlotBasePointer EffectSlot::getEffectParameterSlot(EffectManifestParameter::EffectParameterType parameterType, +EffectParameterSlotBasePointer EffectSlot::getEffectParameterSlot(EffectManifestParameter::ParameterType parameterType, unsigned int slotNumber) { // qDebug() << debugString() << "getEffectParameterSlot" << static_cast(parameterType) << ' ' << slotNumber; @@ -265,10 +265,10 @@ void EffectSlot::loadEffect(const EffectManifestPointer pManifest, } void EffectSlot::loadParameters() { - int numTypes = static_cast (EffectManifestParameter::EffectParameterType::NumTypes); + int numTypes = static_cast (EffectManifestParameter::ParameterType::NUM_TYPES); for (int parameterTypeId=0 ; parameterTypeId (parameterTypeId); + const EffectManifestParameter::ParameterType parameterType = + static_cast (parameterTypeId); unsigned int iParameter = 0; unsigned int numParameterSlots = m_iNumParameterSlots[parameterType]; for (int i=0 ; iparameterType() == EffectManifestParameter::EffectParameterType::Knob) { + if (pParameterSlot->parameterType() == EffectManifestParameter::ParameterType::KNOB) { pParameterSlot->syncSofttakeover(); } } @@ -403,7 +403,7 @@ void EffectSlot::slotEffectMetaParameter(double v, bool force) { force = true; } for (const auto& pParameterSlot : m_parameterSlots) { - if (pParameterSlot->parameterType() == EffectManifestParameter::EffectParameterType::Knob) { + if (pParameterSlot->parameterType() == EffectManifestParameter::ParameterType::KNOB) { pParameterSlot->onEffectMetaParameterChanged(v, force); } } diff --git a/src/effects/effectslot.h b/src/effects/effectslot.h index db77e632c308..89cc9dcfc06c 100644 --- a/src/effects/effectslot.h +++ b/src/effects/effectslot.h @@ -51,9 +51,9 @@ class EffectSlot : public QObject { return m_pEngineEffect != nullptr; } - void addEffectParameterSlot(EffectManifestParameter::EffectParameterType parameterType); + void addEffectParameterSlot(EffectManifestParameter::ParameterType parameterType); EffectParameterSlotBasePointer getEffectParameterSlot( - EffectManifestParameter::EffectParameterType parameterType, unsigned int slotNumber); + EffectManifestParameter::ParameterType parameterType, unsigned int slotNumber); double getMetaParameter() const; @@ -72,9 +72,9 @@ class EffectSlot : public QObject { EffectManifestPointer getManifest() const; - unsigned int numParameters(EffectManifestParameter::EffectParameterType parameterType) const; + unsigned int numParameters(EffectManifestParameter::ParameterType parameterType) const; - EffectParameter* getParameterForSlot(EffectManifestParameter::EffectParameterType parameterType, + EffectParameter* getParameterForSlot(EffectManifestParameter::ParameterType parameterType, unsigned int slotNumber); void setEnabled(bool enabled); @@ -118,7 +118,7 @@ class EffectSlot : public QObject { void unloadEffect(); const unsigned int m_iEffectNumber; - QHash m_iNumParameterSlots; + QHash m_iNumParameterSlots; const QString m_group; UserSettingsPointer m_pConfig; EffectsManager* m_pEffectsManager; @@ -127,7 +127,7 @@ class EffectSlot : public QObject { QList m_parameters; EngineEffectChain* m_pEngineEffectChain; QList m_parameterSlots; - QHash> m_parameterSlotPositionToManifestIndex; + QHash> m_parameterSlotPositionToManifestIndex; ControlObject* m_pControlLoaded; ControlPushButton* m_pControlEnabled; diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index c21d14097332..11df339e5f17 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -352,7 +352,7 @@ EffectSlotPointer EffectsManager::getEffectSlot( } EffectParameterSlotBasePointer EffectsManager::getEffectParameterSlot( - const EffectManifestParameter::EffectParameterType parameterType, const ConfigKey& configKey) { + const EffectManifestParameter::ParameterType parameterType, const ConfigKey& configKey) { EffectSlotPointer pEffectSlot = getEffectSlot(configKey.group); VERIFY_OR_DEBUG_ASSERT(pEffectSlot) { diff --git a/src/effects/effectsmanager.h b/src/effects/effectsmanager.h index 5f72b92985a2..6fe65323a2f8 100644 --- a/src/effects/effectsmanager.h +++ b/src/effects/effectsmanager.h @@ -113,7 +113,7 @@ class EffectsManager : public QObject { EffectSlotPointer getEffectSlot(const QString& group); EffectParameterSlotBasePointer getEffectParameterSlot( - const EffectManifestParameter::EffectParameterType parameterType, const ConfigKey& configKey); + const EffectManifestParameter::ParameterType parameterType, const ConfigKey& configKey); QString getNextEffectId(const QString& effectId); QString getPrevEffectId(const QString& effectId); diff --git a/src/effects/lv2/lv2manifest.cpp b/src/effects/lv2/lv2manifest.cpp index bd53f57545f4..fab234144f67 100644 --- a/src/effects/lv2/lv2manifest.cpp +++ b/src/effects/lv2/lv2manifest.cpp @@ -73,14 +73,14 @@ LV2Manifest::LV2Manifest(const LilvPlugin* plug, // Set the appropriate Hints if (lilv_port_has_property(m_pLV2plugin, port, properties["button_port"])) { - param->setControlHint(EffectManifestParameter::ControlHint::TOGGLE_STEPPING); + param->setValueScaler(EffectManifestParameter::ValueScaler::TOGGLE); } else if (lilv_port_has_property(m_pLV2plugin, port, properties["enumeration_port"])) { buildEnumerationOptions(port, param); - param->setControlHint(EffectManifestParameter::ControlHint::TOGGLE_STEPPING); + param->setValueScaler(EffectManifestParameter::ValueScaler::TOGGLE); } else if (lilv_port_has_property(m_pLV2plugin, port, properties["integer_port"])) { - param->setControlHint(EffectManifestParameter::ControlHint::KNOB_STEPPING); + param->setValueScaler(EffectManifestParameter::ValueScaler::INTEGRAL); } else { - param->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); + param->setValueScaler(EffectManifestParameter::ValueScaler::LINEAR); } } } @@ -108,7 +108,7 @@ LV2Manifest::LV2Manifest(const LilvPlugin* plug, param->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); param->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); - param->setControlHint(EffectManifestParameter::ControlHint::TOGGLE_STEPPING); + param->setValueScaler(EffectManifestParameter::ValueScaler::TOGGLE); if (lilv_port_has_property(m_pLV2plugin, port, properties["enumeration_port"])) { buildEnumerationOptions(port, param); } else { diff --git a/src/preferences/dialog/dlgprefeq.cpp b/src/preferences/dialog/dlgprefeq.cpp index 671414f3ba8e..88d8a0430215 100644 --- a/src/preferences/dialog/dlgprefeq.cpp +++ b/src/preferences/dialog/dlgprefeq.cpp @@ -496,7 +496,7 @@ void DlgPrefEQ::slotUpdateMasterEQParameter(int value) { if (!pEffectSlot.isNull()) { QSlider* slider = qobject_cast(sender()); int index = slider->property("index").toInt(); - EffectParameter* param = pEffectSlot->getParameterForSlot(EffectManifestParameter::EffectParameterType::Knob, index); + EffectParameter* param = pEffectSlot->getParameterForSlot(EffectManifestParameter::ParameterType::KNOB, index); if (param) { double dValue = value / 100.0; param->setValue(dValue); @@ -617,9 +617,9 @@ void DlgPrefEQ::setUpMasterEQ() { // Load parameters from preferences: EffectSlotPointer pEffectSlot(m_pEffectMasterEQ); if (!pEffectSlot.isNull()) { - int knobNum = pEffectSlot->numParameters(EffectManifestParameter::EffectParameterType::Knob); + int knobNum = pEffectSlot->numParameters(EffectManifestParameter::ParameterType::KNOB); for (int i = 0; i < knobNum; i++) { - EffectParameter* param = pEffectSlot->getParameterForSlot(EffectManifestParameter::EffectParameterType::Knob, i); + EffectParameter* param = pEffectSlot->getParameterForSlot(EffectManifestParameter::ParameterType::KNOB, i); if (param) { QString strValue = m_pConfig->getValueString(ConfigKey(kConfigKey, QString("EffectForGroup_[Master]_parameter%1").arg(i + 1))); @@ -663,12 +663,12 @@ void DlgPrefEQ::slotMasterEqEffectChanged(int effectIndex) { pEffectSlot->setEnabled(true); m_pEffectMasterEQ = pEffectSlot; - int knobNum = pEffectSlot->numParameters(EffectManifestParameter::EffectParameterType::Knob); + int knobNum = pEffectSlot->numParameters(EffectManifestParameter::ParameterType::KNOB); // Create and set up Master EQ's sliders int i; for (i = 0; i < knobNum; i++) { - EffectParameter* param = pEffectSlot->getParameterForSlot(EffectManifestParameter::EffectParameterType::Knob, i); + EffectParameter* param = pEffectSlot->getParameterForSlot(EffectManifestParameter::ParameterType::KNOB, i); if (param) { EffectManifestParameterPointer pManifestParameter = param->manifest(); @@ -751,9 +751,9 @@ QString DlgPrefEQ::getQuickEffectGroupForDeck(int deck) const { void DlgPrefEQ::slotMasterEQToDefault() { EffectSlotPointer pEffectSlot(m_pEffectMasterEQ); if (!pEffectSlot.isNull()) { - int knobNum = pEffectSlot->numParameters(EffectManifestParameter::EffectParameterType::Knob); + int knobNum = pEffectSlot->numParameters(EffectManifestParameter::ParameterType::KNOB); for (int i = 0; i < knobNum; i++) { - EffectParameter* param = pEffectSlot->getParameterForSlot(EffectManifestParameter::EffectParameterType::Knob, i); + EffectParameter* param = pEffectSlot->getParameterForSlot(EffectManifestParameter::ParameterType::KNOB, i); if (param) { double defaultValue = param->manifest()->getDefault(); setMasterEQParameter(i, defaultValue); @@ -765,7 +765,7 @@ void DlgPrefEQ::slotMasterEQToDefault() { void DlgPrefEQ::setMasterEQParameter(int i, double value) { EffectSlotPointer pEffectSlot(m_pEffectMasterEQ); if (!pEffectSlot.isNull()) { - EffectParameter* param = pEffectSlot->getParameterForSlot(EffectManifestParameter::EffectParameterType::Knob, i); + EffectParameter* param = pEffectSlot->getParameterForSlot(EffectManifestParameter::ParameterType::KNOB, i); if (param) { param->setValue(value); m_masterEQSliders[i]->setValue(value * 100); diff --git a/src/test/metaknob_link_test.cpp b/src/test/metaknob_link_test.cpp index d570d4c3dcef..09b469044b90 100644 --- a/src/test/metaknob_link_test.cpp +++ b/src/test/metaknob_link_test.cpp @@ -43,7 +43,7 @@ class MetaLinkTest : public BaseEffectTest { low->setId("low"); low->setName(QObject::tr("Low")); low->setDescription(QObject::tr("Gain for Low Filter")); - low->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); + low->setValueScaler(EffectManifestParameter::ValueScaler::LINEAR); low->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); low->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); low->setNeutralPointOnScale(0.25); @@ -206,7 +206,7 @@ TEST_F(MetaLinkTest, HalfLinkTakeover) { low->setId("low"); low->setName(QObject::tr("Low")); low->setDescription(QObject::tr("Gain for Low Filter (neutral at 1.0)")); - low->setControlHint(EffectManifestParameter::ControlHint::KNOB_LINEAR); + low->setValueScaler(EffectManifestParameter::ValueScaler::LINEAR); low->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); low->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); low->setNeutralPointOnScale(1.0); diff --git a/src/widget/effectwidgetutils.h b/src/widget/effectwidgetutils.h index fd8d7700c4eb..c65e3c0ebfd1 100644 --- a/src/widget/effectwidgetutils.h +++ b/src/widget/effectwidgetutils.h @@ -63,7 +63,7 @@ class EffectWidgetUtils { ¶meterNumberOk); if (parameterNumberOk) { // XML effect nodes are 1-indexed. - return pEffectSlot->getEffectParameterSlot(EffectManifestParameter::EffectParameterType::Knob, parameterNumber - 1); + return pEffectSlot->getEffectParameterSlot(EffectManifestParameter::ParameterType::KNOB, parameterNumber - 1); } return EffectParameterSlotBasePointer(); } @@ -80,7 +80,7 @@ class EffectWidgetUtils { ¶meterNumberOk); if (parameterNumberOk) { // XML effect nodes are 1-indexed. - return pEffectSlot->getEffectParameterSlot(EffectManifestParameter::EffectParameterType::Button, parameterNumber - 1); + return pEffectSlot->getEffectParameterSlot(EffectManifestParameter::ParameterType::BUTTON, parameterNumber - 1); } return EffectParameterSlotBasePointer(); } diff --git a/src/widget/weffectparameterknob.cpp b/src/widget/weffectparameterknob.cpp index efb8b341156e..d32a1f705cf8 100644 --- a/src/widget/weffectparameterknob.cpp +++ b/src/widget/weffectparameterknob.cpp @@ -3,7 +3,7 @@ void WEffectParameterKnob::setupEffectParameterSlot(const ConfigKey& configKey) { EffectParameterSlotBasePointer pParameterSlot = - m_pEffectsManager->getEffectParameterSlot(EffectManifestParameter::EffectParameterType::Knob, configKey); + m_pEffectsManager->getEffectParameterSlot(EffectManifestParameter::ParameterType::KNOB, configKey); if (!pParameterSlot) { qWarning() << "EffectParameterKnob" << configKey << "is not an effect parameter."; diff --git a/src/widget/weffectparameterknobcomposed.cpp b/src/widget/weffectparameterknobcomposed.cpp index 1fa3fe30f4d0..8a839a7fa697 100644 --- a/src/widget/weffectparameterknobcomposed.cpp +++ b/src/widget/weffectparameterknobcomposed.cpp @@ -8,7 +8,7 @@ const QString groupClose = "]"; void WEffectParameterKnobComposed::setupEffectParameterSlot(const ConfigKey& configKey) { EffectParameterSlotBasePointer pParameterSlot = - m_pEffectsManager->getEffectParameterSlot(EffectManifestParameter::EffectParameterType::Knob, configKey); + m_pEffectsManager->getEffectParameterSlot(EffectManifestParameter::ParameterType::KNOB, configKey); if (!pParameterSlot) { qWarning() << "EffectParameterKnobComposed" << configKey << "is not an effect parameter."; diff --git a/src/widget/weffectpushbutton.cpp b/src/widget/weffectpushbutton.cpp index 986e102906a7..f9e57ada0a6d 100644 --- a/src/widget/weffectpushbutton.cpp +++ b/src/widget/weffectpushbutton.cpp @@ -21,7 +21,7 @@ void WEffectPushButton::setup(const QDomNode& node, const SkinContext& context) void WEffectPushButton::setupEffectParameterSlot(const ConfigKey& configKey) { EffectParameterSlotBasePointer pParameterSlot = - m_pEffectsManager->getEffectParameterSlot(EffectManifestParameter::EffectParameterType::Button, configKey); + m_pEffectsManager->getEffectParameterSlot(EffectManifestParameter::ParameterType::BUTTON, configKey); if (!pParameterSlot) { qWarning() << "EffectPushButton" << configKey << "is not an effect button parameter."; From 089ef37dcd6f980893369ef526d8736cf510328f Mon Sep 17 00:00:00 2001 From: Kshitij Gupta Date: Fri, 12 Oct 2018 23:25:23 +0530 Subject: [PATCH 027/443] Added ControlNumParameters --- src/effects/effectslot.cpp | 35 +++++++++++++++++++++++++++++++++++ src/effects/effectslot.h | 2 ++ 2 files changed, 37 insertions(+) diff --git a/src/effects/effectslot.cpp b/src/effects/effectslot.cpp index 3f68e26bca1f..3f13cc79c456 100644 --- a/src/effects/effectslot.cpp +++ b/src/effects/effectslot.cpp @@ -29,6 +29,22 @@ EffectSlot::EffectSlot(const QString& group, m_pControlLoaded = new ControlObject(ConfigKey(m_group, "loaded")); m_pControlLoaded->setReadOnly(); + m_pControlNumParameters.insert(EffectManifestParameter::ParameterType::KNOB, + new ControlObject(ConfigKey(m_group, "num_parameters"))); + m_pControlNumParameters.insert(EffectManifestParameter::ParameterType::BUTTON, + new ControlObject(ConfigKey(m_group, "num_button_parameters"))); + for (const auto& pControlNumParameters : m_pControlNumParameters) { + pControlNumParameters->setReadOnly(); + } + + m_pControlNumParameterSlots.insert(EffectManifestParameter::ParameterType::KNOB, + new ControlObject(ConfigKey(m_group, "num_parameterslots"))); + m_pControlNumParameterSlots.insert(EffectManifestParameter::ParameterType::BUTTON, + new ControlObject(ConfigKey(m_group, "num_button_parameterslots"))); + for (const auto& pControlNumParameterSlots : m_pControlNumParameterSlots) { + pControlNumParameterSlots->setReadOnly(); + } + // Default to disabled to prevent accidental activation of effects // at the beginning of a set. m_pControlEnabled = new ControlPushButton(ConfigKey(m_group, "enabled")); @@ -74,6 +90,12 @@ EffectSlot::~EffectSlot() { unloadEffect(); delete m_pControlLoaded; + for (const auto& pControlNumParameters : m_pControlNumParameters) { + delete pControlNumParameters; + } + for (const auto& pControlNumParameterSlots : m_pControlNumParameterSlots) { + delete pControlNumParameterSlots; + } delete m_pControlNextEffect; delete m_pControlPrevEffect; delete m_pControlEffectSelector; @@ -167,6 +189,12 @@ void EffectSlot::addEffectParameterSlot(EffectManifestParameter::ParameterType p new EffectButtonParameterSlot(m_group, m_iNumParameterSlots[parameterType])); } ++m_iNumParameterSlots[parameterType]; + m_pControlNumParameterSlots[parameterType]->forceSet( + m_pControlNumParameterSlots[parameterType]->get() + 1); + VERIFY_OR_DEBUG_ASSERT(m_iNumParameterSlots[parameterType] == + m_pControlNumParameterSlots[parameterType]->get()) { + return; + } m_parameterSlots.append(pParameterSlot); } @@ -269,6 +297,9 @@ void EffectSlot::loadParameters() { for (int parameterTypeId=0 ; parameterTypeId (parameterTypeId); + + m_pControlNumParameters[parameterType]->forceSet(numParameters(parameterType)); + unsigned int iParameter = 0; unsigned int numParameterSlots = m_iNumParameterSlots[parameterType]; for (int i=0 ; iforceSet(0.0); + for (const auto& pControlNumParameters : m_pControlNumParameters) { + pControlNumParameters->forceSet(0.0); + } + for (const auto& pParameterSlot : m_parameterSlots) { pParameterSlot->clear(); } diff --git a/src/effects/effectslot.h b/src/effects/effectslot.h index 89cc9dcfc06c..f383ceea2116 100644 --- a/src/effects/effectslot.h +++ b/src/effects/effectslot.h @@ -130,6 +130,8 @@ class EffectSlot : public QObject { QHash> m_parameterSlotPositionToManifestIndex; ControlObject* m_pControlLoaded; + QHash m_pControlNumParameters; + QHash m_pControlNumParameterSlots; ControlPushButton* m_pControlEnabled; ControlObject* m_pControlNextEffect; ControlObject* m_pControlPrevEffect; From d1703083488caf264363a981cf5e9798ac5178ce Mon Sep 17 00:00:00 2001 From: Kshitij Gupta Date: Sat, 29 Dec 2018 10:13:04 +0530 Subject: [PATCH 028/443] Moved to initialiser list Removed virtual --- src/effects/effectbuttonparameterslot.cpp | 5 +- src/effects/effectknobparameterslot.cpp | 5 +- src/effects/effectmanifestparameter.h | 62 +++++++++---------- src/effects/effectparameterslotbase.cpp | 4 +- src/effects/effectparameterslotbase.h | 5 +- src/effects/effectslot.cpp | 73 ++++++++++------------- src/effects/effectslot.h | 5 +- 7 files changed, 74 insertions(+), 85 deletions(-) diff --git a/src/effects/effectbuttonparameterslot.cpp b/src/effects/effectbuttonparameterslot.cpp index bf291f0dacdb..e80d46536b98 100644 --- a/src/effects/effectbuttonparameterslot.cpp +++ b/src/effects/effectbuttonparameterslot.cpp @@ -11,9 +11,8 @@ EffectButtonParameterSlot::EffectButtonParameterSlot(const QString& group, const unsigned int iParameterSlotNumber) - : EffectParameterSlotBase(group, iParameterSlotNumber) { - m_parameterType = EffectManifestParameter::ParameterType::BUTTON; - + : EffectParameterSlotBase(group, iParameterSlotNumber, + EffectManifestParameter::ParameterType::BUTTON) { QString itemPrefix = formatItemPrefix(iParameterSlotNumber); m_pControlLoaded = new ControlObject( ConfigKey(m_group, itemPrefix + QString("_loaded"))); diff --git a/src/effects/effectknobparameterslot.cpp b/src/effects/effectknobparameterslot.cpp index 53f53e170749..da66f3fde8c3 100644 --- a/src/effects/effectknobparameterslot.cpp +++ b/src/effects/effectknobparameterslot.cpp @@ -12,9 +12,8 @@ #include "util/xml.h" EffectKnobParameterSlot::EffectKnobParameterSlot(const QString& group, const unsigned int iParameterSlotNumber) - : EffectParameterSlotBase(group, iParameterSlotNumber) { - m_parameterType = EffectManifestParameter::ParameterType::KNOB; - + : EffectParameterSlotBase(group, iParameterSlotNumber, + EffectManifestParameter::ParameterType::KNOB) { QString itemPrefix = formatItemPrefix(iParameterSlotNumber); m_pControlValue = new ControlEffectKnob( diff --git a/src/effects/effectmanifestparameter.h b/src/effects/effectmanifestparameter.h index e258044df905..69518030f4db 100644 --- a/src/effects/effectmanifestparameter.h +++ b/src/effects/effectmanifestparameter.h @@ -103,7 +103,7 @@ class EffectManifestParameter { m_showInParametertSlot(true) { } - virtual ~EffectManifestParameter() { + ~EffectManifestParameter() { //qDebug() << debugString() << "destroyed"; } @@ -111,31 +111,31 @@ class EffectManifestParameter { // Parameter Information //////////////////////////////////////////////////////////////////////////////// - virtual const QString& id() const { + const QString& id() const { return m_id; } - virtual void setId(const QString& id) { + void setId(const QString& id) { m_id = id; } - virtual const QString& name() const { + const QString& name() const { return m_name; } - virtual void setName(const QString& name) { + void setName(const QString& name) { m_name = name; } - virtual const QString& shortName() const { + const QString& shortName() const { return m_shortName; } - virtual void setShortName(const QString& shortName) { + void setShortName(const QString& shortName) { m_shortName = shortName; } - virtual const QString& description() const { + const QString& description() const { return m_description; } - virtual void setDescription(const QString& description) { + void setDescription(const QString& description) { m_description = description; } @@ -143,18 +143,18 @@ class EffectManifestParameter { // Usage hints //////////////////////////////////////////////////////////////////////////////// - virtual const ParameterType& parameterType() const { + const ParameterType& parameterType() const { return m_parameterType; } - virtual void setParameterType(const ParameterType parameterType) { + void setParameterType(const ParameterType parameterType) { m_parameterType = parameterType; } - virtual ValueScaler valueScaler() const { + ValueScaler valueScaler() const { return m_valueScaler; } - virtual void setValueScaler(ValueScaler valueScaler) { + void setValueScaler(ValueScaler valueScaler) { m_valueScaler = valueScaler; if (valueScaler == ValueScaler::TOGGLE) { setParameterType(ParameterType::BUTTON); @@ -163,31 +163,31 @@ class EffectManifestParameter { } } - virtual SemanticHint semanticHint() const { + SemanticHint semanticHint() const { return m_semanticHint; } - virtual void setSemanticHint(SemanticHint semanticHint) { + void setSemanticHint(SemanticHint semanticHint) { m_semanticHint = semanticHint; } - virtual UnitsHint unitsHint() const { + UnitsHint unitsHint() const { return m_unitsHint; } - virtual void setUnitsHint(UnitsHint unitsHint) { + void setUnitsHint(UnitsHint unitsHint) { m_unitsHint = unitsHint; } - virtual LinkType defaultLinkType() const { + LinkType defaultLinkType() const { return m_defaultLinkType; } - virtual void setDefaultLinkType(const LinkType linkType) { + void setDefaultLinkType(const LinkType linkType) { m_defaultLinkType = linkType; } - virtual LinkInversion defaultLinkInversion() const { + LinkInversion defaultLinkInversion() const { return m_defaultLinkInversion; } - virtual void setDefaultLinkInversion(const LinkInversion linkInversion) { + void setDefaultLinkInversion(const LinkInversion linkInversion) { m_defaultLinkInversion = linkInversion; } @@ -200,10 +200,10 @@ class EffectManifestParameter { // A EQ Gain has usually a neutral point of 0.5 (0 dB) while a delay knob // has a neutral point of 0.0 (no delay) // A EQ Gain knob cannot be used on a split meta knob. - virtual double neutralPointOnScale() const { + double neutralPointOnScale() const { return m_neutralPointOnScale; } - virtual void setNeutralPointOnScale(double neutralPoint) { + void setNeutralPointOnScale(double neutralPoint) { m_neutralPointOnScale = neutralPoint; } @@ -212,10 +212,10 @@ class EffectManifestParameter { // the effective parameter which is loaded onto the slot. // This is required because we have only 8 parameter slots, but // LV2 or VST effects can have more then 8. - virtual bool showInParameterSlot() const { + bool showInParameterSlot() const { return m_showInParametertSlot; } - virtual void setShowInParameterSlot(double show) { + void setShowInParameterSlot(double show) { m_showInParametertSlot = show; } @@ -223,19 +223,19 @@ class EffectManifestParameter { // Value Settings //////////////////////////////////////////////////////////////////////////////// - virtual const double& getDefault() const { + const double& getDefault() const { return m_default; } - virtual const double& getMinimum() const { + const double& getMinimum() const { return m_minimum; } - virtual const double& getMaximum() const { + const double& getMaximum() const { return m_maximum; } - virtual void setRange(const double& minimum, const double& defaultValue, const double& maximum) { + void setRange(const double& minimum, const double& defaultValue, const double& maximum) { VERIFY_OR_DEBUG_ASSERT(minimum <= defaultValue && defaultValue <= maximum) { qWarning() << "Invalid Parameter Range: " << minimum << ' ' << defaultValue << ' ' << maximum; return; @@ -245,10 +245,10 @@ class EffectManifestParameter { m_maximum = maximum; } - virtual void appendStep(const QPair& step) { + void appendStep(const QPair& step) { m_steps.append(step); } - virtual const QList >& getSteps() const { + const QList >& getSteps() const { return m_steps; } diff --git a/src/effects/effectparameterslotbase.cpp b/src/effects/effectparameterslotbase.cpp index 3cc6066fd165..84e36a7dd01f 100644 --- a/src/effects/effectparameterslotbase.cpp +++ b/src/effects/effectparameterslotbase.cpp @@ -7,8 +7,10 @@ #include "control/controlpushbutton.h" EffectParameterSlotBase::EffectParameterSlotBase(const QString& group, - const unsigned int iParameterSlotNumber) + const unsigned int iParameterSlotNumber, + const EffectManifestParameter::ParameterType parameterType) : m_iParameterSlotNumber(iParameterSlotNumber), + m_parameterType(parameterType), m_group(group), m_pEffectParameter(nullptr), m_pManifestParameter(nullptr), diff --git a/src/effects/effectparameterslotbase.h b/src/effects/effectparameterslotbase.h index 923a0165e01b..2c6d7fb79e68 100644 --- a/src/effects/effectparameterslotbase.h +++ b/src/effects/effectparameterslotbase.h @@ -20,10 +20,11 @@ class EffectSlot; class EffectParameterSlotBase : public QObject { Q_OBJECT public: - EffectParameterSlotBase(const QString& group, const unsigned int iParameterSlotNumber); + EffectParameterSlotBase(const QString& group, const unsigned int iParameterSlotNumber, + const EffectManifestParameter::ParameterType parameterType); + virtual ~EffectParameterSlotBase(); - // Load the parameter of the given effect into this EffectButtonParameterSlot virtual void loadParameter(EffectParameter* pEffectParameter) = 0; // Clear the currently loaded effect diff --git a/src/effects/effectslot.cpp b/src/effects/effectslot.cpp index 3f13cc79c456..7f77cb2b7a8f 100644 --- a/src/effects/effectslot.cpp +++ b/src/effects/effectslot.cpp @@ -107,7 +107,7 @@ EffectSlot::~EffectSlot() { void EffectSlot::addToEngine(std::unique_ptr pProcessor, const QSet& activeInputChannels) { - VERIFY_OR_DEBUG_ASSERT(m_pManifest != nullptr) { + VERIFY_OR_DEBUG_ASSERT(!isLoaded()) { return; } @@ -147,21 +147,16 @@ void EffectSlot::updateEngineState() { if (!m_pEngineEffect) { return; } - sendParameterUpdate(); - for (auto const& pParameter : m_parameters) { - pParameter->updateEngineState(); - } -} -void EffectSlot::sendParameterUpdate() { - if (!m_pEngineEffect) { - return; - } EffectsRequest* pRequest = new EffectsRequest(); pRequest->type = EffectsRequest::SET_EFFECT_PARAMETERS; pRequest->pTargetEffect = m_pEngineEffect; pRequest->SetEffectParameters.enabled = m_pControlEnabled->get(); m_pEffectsManager->writeRequest(pRequest); + + for (auto const& pParameter : m_parameters) { + pParameter->updateEngineState(); + } } EffectState* EffectSlot::createState(const mixxx::EngineParameters& bufferParameters) { @@ -224,10 +219,6 @@ EffectParameter* EffectSlot::getParameterForSlot(EffectManifestParameter::Parame return nullptr; } -double EffectSlot::getMetaknobDefault() { - return m_pManifest->metaknobDefault(); -} - void EffectSlot::setEnabled(bool enabled) { m_pControlEnabled->set(enabled); } @@ -284,14 +275,39 @@ void EffectSlot::loadEffect(const EffectManifestPointer pManifest, if (m_pEffectsManager->isAdoptMetaknobValueEnabled()) { slotEffectMetaParameter(m_pControlMetaParameter->get(), true); } else { - m_pControlMetaParameter->set(getMetaknobDefault()); - slotEffectMetaParameter(getMetaknobDefault(), true); + m_pControlMetaParameter->set(m_pManifest->metaknobDefault()); + slotEffectMetaParameter(m_pManifest->metaknobDefault(), true); } emit(effectChanged()); updateEngineState(); } +void EffectSlot::unloadEffect() { + if (!isLoaded()) { + return; + } + + m_pControlLoaded->forceSet(0.0); + for (const auto& pControlNumParameters : m_pControlNumParameters) { + pControlNumParameters->forceSet(0.0); + } + + for (const auto& pParameterSlot : m_parameterSlots) { + pParameterSlot->clear(); + } + + for (int i = 0; i < m_parameters.size(); ++i) { + EffectParameter* pParameter = m_parameters.at(i); + m_parameters[i] = nullptr; + delete pParameter; + } + m_parameters.clear(); + m_pManifest.clear(); + + removeFromEngine(); +} + void EffectSlot::loadParameters() { int numTypes = static_cast (EffectManifestParameter::ParameterType::NUM_TYPES); for (int parameterTypeId=0 ; parameterTypeIdforceSet(0.0); - for (const auto& pControlNumParameters : m_pControlNumParameters) { - pControlNumParameters->forceSet(0.0); - } - - for (const auto& pParameterSlot : m_parameterSlots) { - pParameterSlot->clear(); - } - - for (int i = 0; i < m_parameters.size(); ++i) { - EffectParameter* pParameter = m_parameters.at(i); - m_parameters[i] = nullptr; - delete pParameter; - } - m_parameters.clear(); - m_pManifest.clear(); - - removeFromEngine(); -} - void EffectSlot::hideEffectParameter(const unsigned int parameterId) { for (auto& parameterMapping : m_parameterSlotPositionToManifestIndex) { parameterMapping.removeAll(parameterId); diff --git a/src/effects/effectslot.h b/src/effects/effectslot.h index f383ceea2116..eeaf3345869b 100644 --- a/src/effects/effectslot.h +++ b/src/effects/effectslot.h @@ -87,8 +87,6 @@ class EffectSlot : public QObject { const QSet& activeInputChannels); void removeFromEngine(); - double getMetaknobDefault(); - void hideEffectParameter(const unsigned int parameterId); void setEffectParameterPosition(const unsigned int parameterId, const unsigned int position); @@ -114,7 +112,6 @@ class EffectSlot : public QObject { } void loadParameters(); - void sendParameterUpdate(); void unloadEffect(); const unsigned int m_iEffectNumber; @@ -123,9 +120,9 @@ class EffectSlot : public QObject { UserSettingsPointer m_pConfig; EffectsManager* m_pEffectsManager; EffectManifestPointer m_pManifest; + EngineEffectChain* m_pEngineEffectChain; EngineEffect* m_pEngineEffect; QList m_parameters; - EngineEffectChain* m_pEngineEffectChain; QList m_parameterSlots; QHash> m_parameterSlotPositionToManifestIndex; From 831daef9f348b6046e1223e8c7a77e6fb1624966 Mon Sep 17 00:00:00 2001 From: Kshitij Gupta Date: Sat, 29 Dec 2018 10:33:27 +0530 Subject: [PATCH 029/443] Renamed m_parameterSlotPositionToManifestIndex -> m_mapForParameterType --- src/effects/effectslot.cpp | 14 +++++++------- src/effects/effectslot.h | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/effects/effectslot.cpp b/src/effects/effectslot.cpp index 7f77cb2b7a8f..1c8d365aa7a3 100644 --- a/src/effects/effectslot.cpp +++ b/src/effects/effectslot.cpp @@ -252,7 +252,7 @@ void EffectSlot::loadEffect(const EffectManifestPointer pManifest, return; } - for (auto& parameterMapping : m_parameterSlotPositionToManifestIndex) { + for (auto& parameterMapping : m_mapForParameterType) { parameterMapping.clear(); } @@ -262,7 +262,7 @@ void EffectSlot::loadEffect(const EffectManifestPointer pManifest, this, m_pEffectsManager, m_parameters.size(), pManifestParameter); m_parameters.append(pParameter); - m_parameterSlotPositionToManifestIndex[pManifestParameter->parameterType()].push_back(index); + m_mapForParameterType[pManifestParameter->parameterType()].push_back(index); ++index; } @@ -318,8 +318,8 @@ void EffectSlot::loadParameters() { unsigned int iParameter = 0; unsigned int numParameterSlots = m_iNumParameterSlots[parameterType]; - for (int i=0 ; imanifest()->parameterType()].insert(position, parameterId); + m_mapForParameterType[pParameter->manifest()->parameterType()].insert(position, parameterId); loadParameters(); } } diff --git a/src/effects/effectslot.h b/src/effects/effectslot.h index eeaf3345869b..aa0fc281876d 100644 --- a/src/effects/effectslot.h +++ b/src/effects/effectslot.h @@ -124,7 +124,7 @@ class EffectSlot : public QObject { EngineEffect* m_pEngineEffect; QList m_parameters; QList m_parameterSlots; - QHash> m_parameterSlotPositionToManifestIndex; + QHash> m_mapForParameterType; ControlObject* m_pControlLoaded; QHash m_pControlNumParameters; From ae6339c09c71e4ac13731c0d9c7e7793bc1fa41c Mon Sep 17 00:00:00 2001 From: Kshitij Gupta Date: Sat, 29 Dec 2018 10:36:31 +0530 Subject: [PATCH 030/443] Removed spacing between "> (" --- src/effects/effectslot.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/effects/effectslot.cpp b/src/effects/effectslot.cpp index 1c8d365aa7a3..241cab9852ef 100644 --- a/src/effects/effectslot.cpp +++ b/src/effects/effectslot.cpp @@ -177,10 +177,10 @@ EffectManifestPointer EffectSlot::getManifest() const { void EffectSlot::addEffectParameterSlot(EffectManifestParameter::ParameterType parameterType) { EffectParameterSlotBasePointer pParameterSlot = EffectParameterSlotBasePointer(); if (parameterType == EffectManifestParameter::ParameterType::KNOB) { - pParameterSlot = static_cast ( + pParameterSlot = static_cast( new EffectKnobParameterSlot(m_group, m_iNumParameterSlots[parameterType])); } else if (parameterType == EffectManifestParameter::ParameterType::BUTTON) { - pParameterSlot = static_cast ( + pParameterSlot = static_cast( new EffectButtonParameterSlot(m_group, m_iNumParameterSlots[parameterType])); } ++m_iNumParameterSlots[parameterType]; @@ -309,10 +309,10 @@ void EffectSlot::unloadEffect() { } void EffectSlot::loadParameters() { - int numTypes = static_cast (EffectManifestParameter::ParameterType::NUM_TYPES); + int numTypes = static_cast(EffectManifestParameter::ParameterType::NUM_TYPES); for (int parameterTypeId=0 ; parameterTypeId (parameterTypeId); + static_cast(parameterTypeId); m_pControlNumParameters[parameterType]->forceSet(numParameters(parameterType)); From 66f09fc5510f594352af02ba99a3ce2984378a29 Mon Sep 17 00:00:00 2001 From: Kshitij Gupta Date: Sat, 29 Dec 2018 10:59:39 +0530 Subject: [PATCH 031/443] Renamed iParameter -> parameterSlotIndex Renamed iParameterPosition -> manifestIndex --- src/effects/effectslot.cpp | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/src/effects/effectslot.cpp b/src/effects/effectslot.cpp index 241cab9852ef..33137af6e99f 100644 --- a/src/effects/effectslot.cpp +++ b/src/effects/effectslot.cpp @@ -316,33 +316,36 @@ void EffectSlot::loadParameters() { m_pControlNumParameters[parameterType]->forceSet(numParameters(parameterType)); - unsigned int iParameter = 0; + unsigned int parameterSlotIndex = 0; unsigned int numParameterSlots = m_iNumParameterSlots[parameterType]; for (int i=0 ; iloadParameter(pParameter); - ++iParameter; + ++parameterSlotIndex; + break; } } - while (iParameter < numParameterSlots) { - auto pParameterSlot = getEffectParameterSlot(parameterType, iParameter); + while (parameterSlotIndex < numParameterSlots) { + auto pParameterSlot = getEffectParameterSlot(parameterType, parameterSlotIndex); VERIFY_OR_DEBUG_ASSERT(pParameterSlot != nullptr) { - break; + ++parameterSlotIndex; + continue; } pParameterSlot->clear(); - ++iParameter; + ++parameterSlotIndex; } } } From 45d49dc5f061f423259b8c2ccf25da36b1cc53fa Mon Sep 17 00:00:00 2001 From: Kshitij Gupta Date: Sat, 29 Dec 2018 11:05:33 +0530 Subject: [PATCH 032/443] Cleared Parameter Mappings --- src/effects/effectslot.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/effects/effectslot.cpp b/src/effects/effectslot.cpp index 33137af6e99f..0c45da313032 100644 --- a/src/effects/effectslot.cpp +++ b/src/effects/effectslot.cpp @@ -304,6 +304,9 @@ void EffectSlot::unloadEffect() { } m_parameters.clear(); m_pManifest.clear(); + for (auto& parameterMapping : m_mapForParameterType) { + parameterMapping.clear(); + } removeFromEngine(); } From 645cb7e4bfa76097063e9989e5ff8dbbbe6e9182 Mon Sep 17 00:00:00 2001 From: Kshitij Gupta Date: Sat, 29 Dec 2018 11:19:23 +0530 Subject: [PATCH 033/443] Added TODO: reimplement slotEffectSelector --- src/effects/effectslot.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/effects/effectslot.cpp b/src/effects/effectslot.cpp index 0c45da313032..a11b842c9154 100644 --- a/src/effects/effectslot.cpp +++ b/src/effects/effectslot.cpp @@ -387,6 +387,7 @@ void EffectSlot::slotNextEffect(double v) { } void EffectSlot::slotEffectSelector(double v) { + // TODO: reimplement // if (v > 0) { // emit(nextEffect(m_iChainNumber, m_iEffectNumber, m_pEffect)); // } else if (v < 0) { From 6c565319023fcfcea2fb8ee0d5d6f16555477f2d Mon Sep 17 00:00:00 2001 From: Kshitij Gupta Date: Sat, 29 Dec 2018 11:44:50 +0530 Subject: [PATCH 034/443] Renamed m_pSoftTakeover -> m_pMetaknobSoftTakeover Removed unnecessary range check in parameters --- src/effects/effectbuttonparameterslot.cpp | 5 ----- src/effects/effectbuttonparameterslot.h | 1 - src/effects/effectknobparameterslot.cpp | 25 +++++++++-------------- src/effects/effectknobparameterslot.h | 2 +- 4 files changed, 11 insertions(+), 22 deletions(-) diff --git a/src/effects/effectbuttonparameterslot.cpp b/src/effects/effectbuttonparameterslot.cpp index e80d46536b98..472bbb6cbbfd 100644 --- a/src/effects/effectbuttonparameterslot.cpp +++ b/src/effects/effectbuttonparameterslot.cpp @@ -65,11 +65,6 @@ void EffectButtonParameterSlot::loadParameter(EffectParameter* pEffectParameter) double dMaximumLimit = dMaximum; // TODO(rryan) expose limit from EffectParameter double dDefault = m_pManifestParameter->getDefault(); - if (dValue > dMaximum || dValue < dMinimum || - dMinimum < dMinimumLimit || dMaximum > dMaximumLimit) { - qWarning() << debugString() << "WARNING: EffectParameter does not satisfy basic sanity checks."; - } - // qDebug() << debugString() // << QString("Val: %1 Min: %2 MinLimit: %3 Max: %4 MaxLimit: %5 Default: %6") // .arg(dValue).arg(dMinimum).arg(dMinimumLimit).arg(dMaximum).arg(dMaximumLimit).arg(dDefault); diff --git a/src/effects/effectbuttonparameterslot.h b/src/effects/effectbuttonparameterslot.h index 74eb3ef2618a..3d12431c9efc 100644 --- a/src/effects/effectbuttonparameterslot.h +++ b/src/effects/effectbuttonparameterslot.h @@ -5,7 +5,6 @@ #include #include -// #include "effects/defs.h" #include "control/controlobject.h" #include "effects/effectparameterslotbase.h" #include "util/class.h" diff --git a/src/effects/effectknobparameterslot.cpp b/src/effects/effectknobparameterslot.cpp index da66f3fde8c3..8dd03442bde0 100644 --- a/src/effects/effectknobparameterslot.cpp +++ b/src/effects/effectknobparameterslot.cpp @@ -43,7 +43,7 @@ EffectKnobParameterSlot::EffectKnobParameterSlot(const QString& group, const uns connect(m_pControlLinkInverse, SIGNAL(valueChanged(double)), this, SLOT(slotLinkInverseChanged(double))); - m_pSoftTakeover = new SoftTakeover(); + m_pMetaknobSoftTakeover = new SoftTakeover(); clear(); } @@ -54,7 +54,7 @@ EffectKnobParameterSlot::~EffectKnobParameterSlot() { // m_pControlLoaded and m_pControlType are deleted by ~EffectParameterSlotBase delete m_pControlLinkType; delete m_pControlLinkInverse; - delete m_pSoftTakeover; + delete m_pMetaknobSoftTakeover; } void EffectKnobParameterSlot::loadParameter(EffectParameter* pEffectParameter) { @@ -79,11 +79,6 @@ void EffectKnobParameterSlot::loadParameter(EffectParameter* pEffectParameter) { double dMaximumLimit = dMaximum; // TODO(rryan) expose limit from EffectParameter double dDefault = m_pManifestParameter->getDefault(); - if (dValue > dMaximum || dValue < dMinimum || - dMinimum < dMinimumLimit || dMaximum > dMaximumLimit) { - qWarning() << debugString() << "WARNING: EffectParameter does not satisfy basic sanity checks."; - } - // qDebug() << debugString() // << QString("Val: %1 Min: %2 MinLimit: %3 Max: %4 MaxLimit: %5 Default: %6") // .arg(dValue).arg(dMinimum).arg(dMinimumLimit).arg(dMaximum).arg(dMaximumLimit).arg(dDefault); @@ -123,7 +118,7 @@ void EffectKnobParameterSlot::clear() { m_pControlType->forceSet(0.0); m_pControlLinkType->setAndConfirm( static_cast(EffectManifestParameter::LinkType::NONE)); - m_pSoftTakeover->setThreshold(SoftTakeover::kDefaultTakeoverThreshold); + m_pMetaknobSoftTakeover->setThreshold(SoftTakeover::kDefaultTakeoverThreshold); m_pControlLinkInverse->set(0.0); emit(updated()); } @@ -134,7 +129,7 @@ void EffectKnobParameterSlot::slotParameterValueChanged(double value) { } void EffectKnobParameterSlot::slotLinkTypeChanging(double v) { - m_pSoftTakeover->ignoreNext(); + m_pMetaknobSoftTakeover->ignoreNext(); EffectManifestParameter::LinkType newType = static_cast( static_cast(v)); @@ -152,17 +147,17 @@ void EffectKnobParameterSlot::slotLinkTypeChanging(double v) { } if (newType == EffectManifestParameter::LinkType::LINKED_LEFT || newType == EffectManifestParameter::LinkType::LINKED_RIGHT) { - m_pSoftTakeover->setThreshold( + m_pMetaknobSoftTakeover->setThreshold( SoftTakeover::kDefaultTakeoverThreshold * 2.0); } else { - m_pSoftTakeover->setThreshold(SoftTakeover::kDefaultTakeoverThreshold); + m_pMetaknobSoftTakeover->setThreshold(SoftTakeover::kDefaultTakeoverThreshold); } m_pControlLinkType->setAndConfirm(static_cast(newType)); } void EffectKnobParameterSlot::slotLinkInverseChanged(double v) { Q_UNUSED(v); - m_pSoftTakeover->ignoreNext(); + m_pMetaknobSoftTakeover->ignoreNext(); } void EffectKnobParameterSlot::onEffectMetaParameterChanged(double parameter, bool force) { @@ -244,8 +239,8 @@ void EffectKnobParameterSlot::onEffectMetaParameterChanged(double parameter, boo if (force) { m_pControlValue->setParameterFrom(parameter, NULL); // This ensures that softtakover is in sync for following updates - m_pSoftTakeover->ignore(m_pControlValue, parameter); - } else if (!m_pSoftTakeover->ignore(m_pControlValue, parameter)) { + m_pMetaknobSoftTakeover->ignore(m_pControlValue, parameter); + } else if (!m_pMetaknobSoftTakeover->ignore(m_pControlValue, parameter)) { m_pControlValue->setParameterFrom(parameter, NULL); } } @@ -253,7 +248,7 @@ void EffectKnobParameterSlot::onEffectMetaParameterChanged(double parameter, boo void EffectKnobParameterSlot::syncSofttakeover() { double parameter = m_pControlValue->getParameter(); - m_pSoftTakeover->ignore(m_pControlValue, parameter); + m_pMetaknobSoftTakeover->ignore(m_pControlValue, parameter); } double EffectKnobParameterSlot::getValueParameter() const { diff --git a/src/effects/effectknobparameterslot.h b/src/effects/effectknobparameterslot.h index 69f7e56b3c27..dc05d21c5314 100644 --- a/src/effects/effectknobparameterslot.h +++ b/src/effects/effectknobparameterslot.h @@ -57,7 +57,7 @@ class EffectKnobParameterSlot : public EffectParameterSlotBase { return QString("EffectKnobParameterSlot(%1,%2)").arg(m_group).arg(m_iParameterSlotNumber); } - SoftTakeover* m_pSoftTakeover; + SoftTakeover* m_pMetaknobSoftTakeover; // Control exposed to the rest of Mixxx ControlEffectKnob* m_pControlValue; From 93b9fd2753e762ecdf77f6eac05839b645bdaa63 Mon Sep 17 00:00:00 2001 From: Kshitij Gupta Date: Sat, 29 Dec 2018 12:15:26 +0530 Subject: [PATCH 035/443] Fixed inheritence in parameter slots Removed syncSofttakeover Removed onEffectMetaParameterChanged --- src/effects/effectbuttonparameterslot.cpp | 8 +------- src/effects/effectbuttonparameterslot.h | 4 ---- src/effects/effectparameterslotbase.cpp | 6 ++++++ src/effects/effectparameterslotbase.h | 4 ++-- 4 files changed, 9 insertions(+), 13 deletions(-) diff --git a/src/effects/effectbuttonparameterslot.cpp b/src/effects/effectbuttonparameterslot.cpp index 472bbb6cbbfd..90f31e1b652a 100644 --- a/src/effects/effectbuttonparameterslot.cpp +++ b/src/effects/effectbuttonparameterslot.cpp @@ -142,10 +142,4 @@ void EffectButtonParameterSlot::loadParameterSlotFromXml(const QDomElement& // } // // If the conversion failed, the default value is kept. // } -} - -void EffectButtonParameterSlot::syncSofttakeover() { -} - -void EffectButtonParameterSlot::onEffectMetaParameterChanged(double parameter, bool force) { -} +} \ No newline at end of file diff --git a/src/effects/effectbuttonparameterslot.h b/src/effects/effectbuttonparameterslot.h index 3d12431c9efc..dea33390d703 100644 --- a/src/effects/effectbuttonparameterslot.h +++ b/src/effects/effectbuttonparameterslot.h @@ -30,10 +30,6 @@ class EffectButtonParameterSlot : public EffectParameterSlotBase { // Clear the currently loaded effect void clear(); - void syncSofttakeover(); - - void onEffectMetaParameterChanged(double parameter, bool force=false); - QDomElement toXml(QDomDocument* doc) const override; void loadParameterSlotFromXml(const QDomElement& parameterElement) override; diff --git a/src/effects/effectparameterslotbase.cpp b/src/effects/effectparameterslotbase.cpp index 84e36a7dd01f..0aa62498c57f 100644 --- a/src/effects/effectparameterslotbase.cpp +++ b/src/effects/effectparameterslotbase.cpp @@ -59,3 +59,9 @@ EffectManifestParameterPointer EffectParameterSlotBase::getManifest() { } return EffectManifestParameterPointer(); } + +void EffectParameterSlotBase::syncSofttakeover() { +} + +void EffectParameterSlotBase::onEffectMetaParameterChanged(double parameter, bool force) { +} \ No newline at end of file diff --git a/src/effects/effectparameterslotbase.h b/src/effects/effectparameterslotbase.h index 2c6d7fb79e68..05c88b9502f7 100644 --- a/src/effects/effectparameterslotbase.h +++ b/src/effects/effectparameterslotbase.h @@ -30,9 +30,9 @@ class EffectParameterSlotBase : public QObject { // Clear the currently loaded effect virtual void clear() = 0; - virtual void syncSofttakeover() = 0; + virtual void syncSofttakeover(); - virtual void onEffectMetaParameterChanged(double parameter, bool force=false) = 0; + virtual void onEffectMetaParameterChanged(double parameter, bool force=false); QString name() const; QString shortName() const; From 5527c03eeb9e7a4d4f8515eed4cef3f3a4b5c765 Mon Sep 17 00:00:00 2001 From: Be Date: Sat, 29 Dec 2018 13:52:48 -0600 Subject: [PATCH 036/443] function pointers for signal-slot connections in effects system --- src/effects/effectbuttonparameterslot.cpp | 8 ++--- src/effects/effectchainslot.cpp | 43 ++++++++++++----------- src/effects/effectknobparameterslot.cpp | 12 +++---- src/effects/effectslot.cpp | 27 +++++++------- 4 files changed, 48 insertions(+), 42 deletions(-) diff --git a/src/effects/effectbuttonparameterslot.cpp b/src/effects/effectbuttonparameterslot.cpp index 90f31e1b652a..a0a5b09c3f44 100644 --- a/src/effects/effectbuttonparameterslot.cpp +++ b/src/effects/effectbuttonparameterslot.cpp @@ -22,8 +22,8 @@ EffectButtonParameterSlot::EffectButtonParameterSlot(const QString& group, m_pControlType = new ControlObject( ConfigKey(m_group, itemPrefix + QString("_type"))); - connect(m_pControlValue, SIGNAL(valueChanged(double)), - this, SLOT(slotValueChanged(double))); + connect(m_pControlValue, &ControlObject::valueChanged, + this, &EffectButtonParameterSlot::slotValueChanged); // Read-only controls. m_pControlType->setReadOnly(); @@ -77,8 +77,8 @@ void EffectButtonParameterSlot::loadParameter(EffectParameter* pEffectParameter) // Default loaded parameters to loaded and unlinked m_pControlLoaded->forceSet(1.0); - connect(m_pEffectParameter, SIGNAL(valueChanged(double)), - this, SLOT(slotParameterValueChanged(double))); + connect(m_pEffectParameter, &EffectParameter::valueChanged, + this, &EffectButtonParameterSlot::slotParameterValueChanged); } emit(updated()); diff --git a/src/effects/effectchainslot.cpp b/src/effects/effectchainslot.cpp index a0155f0ece6e..8f456055f605 100644 --- a/src/effects/effectchainslot.cpp +++ b/src/effects/effectchainslot.cpp @@ -34,8 +34,8 @@ EffectChainSlot::EffectChainSlot(const QString& group, // qDebug() << "EffectChainSlot::EffectChainSlot " << group << ' ' << iChainNumber; m_pControlClear = new ControlPushButton(ConfigKey(m_group, "clear")); - connect(m_pControlClear, SIGNAL(valueChanged(double)), - this, SLOT(slotControlClear(double))); + connect(m_pControlClear, &ControlObject::valueChanged, + this, &EffectChainSlot::slotControlClear); m_pControlNumEffects = new ControlObject(ConfigKey(m_group, "num_effects")); m_pControlNumEffects->setReadOnly(); @@ -54,41 +54,44 @@ EffectChainSlot::EffectChainSlot(const QString& group, // Default to enabled. The skin might not show these buttons. m_pControlChainEnabled->setDefaultValue(true); m_pControlChainEnabled->set(true); - connect(m_pControlChainEnabled, SIGNAL(valueChanged(double)), - this, SLOT(sendParameterUpdate())); + connect(m_pControlChainEnabled, &ControlObject::valueChanged, + this, &EffectChainSlot::sendParameterUpdate); m_pControlChainMix = new ControlPotmeter(ConfigKey(m_group, "mix"), 0.0, 1.0, false, true, false, true, 1.0); - connect(m_pControlChainMix, SIGNAL(valueChanged(double)), - this, SLOT(sendParameterUpdate())); + connect(m_pControlChainMix, &ControlObject::valueChanged, + this, &EffectChainSlot::sendParameterUpdate); m_pControlChainSuperParameter = new ControlPotmeter(ConfigKey(m_group, "super1"), 0.0, 1.0); - connect(m_pControlChainSuperParameter, SIGNAL(valueChanged(double)), - this, SLOT(slotControlChainSuperParameter(double))); + // QObject::connect cannot connect to slots with optional parameters using function + // pointer syntax if the slot has more parameters than the signal, so use a lambda + // to hack around this limitation. + connect(m_pControlChainSuperParameter, &ControlObject::valueChanged, + this, [=](double value){slotControlChainSuperParameter(value);} ); m_pControlChainSuperParameter->set(0.0); m_pControlChainSuperParameter->setDefaultValue(0.0); m_pControlChainMixMode = new ControlPushButton(ConfigKey(m_group, "mix_mode")); m_pControlChainMixMode->setButtonMode(ControlPushButton::TOGGLE); m_pControlChainMixMode->setStates(static_cast(EffectChainMixMode::NumMixModes)); - connect(m_pControlChainMixMode, SIGNAL(valueChanged(double)), - this, SLOT(sendParameterUpdate())); + connect(m_pControlChainMixMode, &ControlObject::valueChanged, + this, &EffectChainSlot::sendParameterUpdate); m_pControlChainNextPreset = new ControlPushButton(ConfigKey(m_group, "next_chain")); - connect(m_pControlChainNextPreset, SIGNAL(valueChanged(double)), - this, SLOT(slotControlChainNextPreset(double))); + connect(m_pControlChainNextPreset, &ControlObject::valueChanged, + this, &EffectChainSlot::slotControlChainNextPreset); m_pControlChainPrevPreset = new ControlPushButton(ConfigKey(m_group, "prev_chain")); - connect(m_pControlChainPrevPreset, SIGNAL(valueChanged(double)), - this, SLOT(slotControlChainPrevPreset(double))); + connect(m_pControlChainPrevPreset, &ControlObject::valueChanged, + this, &EffectChainSlot::slotControlChainPrevPreset); // Ignoring no-ops is important since this is for +/- tickers. m_pControlChainSelector = new ControlEncoder(ConfigKey(m_group, "chain_selector"), false); - connect(m_pControlChainSelector, SIGNAL(valueChanged(double)), - this, SLOT(slotControlChainSelector(double))); + connect(m_pControlChainSelector, &ControlObject::valueChanged, + this, &EffectChainSlot::slotControlChainSelector); - connect(&m_channelStatusMapper, SIGNAL(mapped(const QString&)), - this, SLOT(slotChannelStatusChanged(const QString&))); + connect(&m_channelStatusMapper, QOverload::of(&QSignalMapper::mapped), + this, &EffectChainSlot::slotChannelStatusChanged); // ControlObjects for skin <-> controller mapping interaction. // Refer to comment in header for full explanation. @@ -274,8 +277,8 @@ void EffectChainSlot::registerInputChannel(const ChannelHandleAndGroup& handle_g // m_channelStatusMapper will emit a mapped(handle_group.name()) signal whenever // the valueChanged(double) signal is emitted by pEnableControl m_channelStatusMapper.setMapping(pEnableControl, handle_group.name()); - connect(pEnableControl, SIGNAL(valueChanged(double)), - &m_channelStatusMapper, SLOT(map())); + connect(pEnableControl, &ControlObject::valueChanged, + &m_channelStatusMapper, static_cast(&QSignalMapper::map)); } EffectSlotPointer EffectChainSlot::getEffectSlot(unsigned int slotNumber) { diff --git a/src/effects/effectknobparameterslot.cpp b/src/effects/effectknobparameterslot.cpp index 8dd03442bde0..6d18608072a0 100644 --- a/src/effects/effectknobparameterslot.cpp +++ b/src/effects/effectknobparameterslot.cpp @@ -18,8 +18,8 @@ EffectKnobParameterSlot::EffectKnobParameterSlot(const QString& group, const uns m_pControlValue = new ControlEffectKnob( ConfigKey(m_group, itemPrefix)); - connect(m_pControlValue, SIGNAL(valueChanged(double)), - this, SLOT(slotValueChanged(double))); + connect(m_pControlValue, &ControlObject::valueChanged, + this, &EffectKnobParameterSlot::slotValueChanged); m_pControlLoaded = new ControlObject( ConfigKey(m_group, itemPrefix + QString("_loaded"))); @@ -40,8 +40,8 @@ EffectKnobParameterSlot::EffectKnobParameterSlot(const QString& group, const uns m_pControlLinkInverse = new ControlPushButton( ConfigKey(m_group, itemPrefix + QString("_link_inverse"))); m_pControlLinkInverse->setButtonMode(ControlPushButton::TOGGLE); - connect(m_pControlLinkInverse, SIGNAL(valueChanged(double)), - this, SLOT(slotLinkInverseChanged(double))); + connect(m_pControlLinkInverse, &ControlObject::valueChanged, + this, &EffectKnobParameterSlot::slotLinkInverseChanged); m_pMetaknobSoftTakeover = new SoftTakeover(); @@ -97,8 +97,8 @@ void EffectKnobParameterSlot::loadParameter(EffectParameter* pEffectParameter) { m_pControlLinkInverse->set( static_cast(m_pManifestParameter->defaultLinkInversion())); - connect(m_pEffectParameter, SIGNAL(valueChanged(double)), - this, SLOT(slotParameterValueChanged(double))); + connect(m_pEffectParameter, &EffectParameter::valueChanged, + this, &EffectKnobParameterSlot::slotParameterValueChanged); } emit(updated()); diff --git a/src/effects/effectslot.cpp b/src/effects/effectslot.cpp index a11b842c9154..023c5d4e2f7a 100644 --- a/src/effects/effectslot.cpp +++ b/src/effects/effectslot.cpp @@ -49,25 +49,25 @@ EffectSlot::EffectSlot(const QString& group, // at the beginning of a set. m_pControlEnabled = new ControlPushButton(ConfigKey(m_group, "enabled")); m_pControlEnabled->setButtonMode(ControlPushButton::POWERWINDOW); - connect(m_pControlEnabled, SIGNAL(valueChanged(double)), - this, SLOT(updateEngineState())); + connect(m_pControlEnabled, &ControlObject::valueChanged, + this, &EffectSlot::updateEngineState); m_pControlNextEffect = new ControlPushButton(ConfigKey(m_group, "next_effect")); - connect(m_pControlNextEffect, SIGNAL(valueChanged(double)), - this, SLOT(slotNextEffect(double))); + connect(m_pControlNextEffect, &ControlObject::valueChanged, + this, &EffectSlot::slotNextEffect); m_pControlPrevEffect = new ControlPushButton(ConfigKey(m_group, "prev_effect")); - connect(m_pControlPrevEffect, SIGNAL(valueChanged(double)), - this, SLOT(slotPrevEffect(double))); + connect(m_pControlPrevEffect, &ControlObject::valueChanged, + this, &EffectSlot::slotPrevEffect); // Ignoring no-ops is important since this is for +/- tickers. m_pControlEffectSelector = new ControlEncoder(ConfigKey(m_group, "effect_selector"), false); - connect(m_pControlEffectSelector, SIGNAL(valueChanged(double)), - this, SLOT(slotEffectSelector(double))); + connect(m_pControlEffectSelector, &ControlObject::valueChanged, + this, &EffectSlot::slotEffectSelector); m_pControlClear = new ControlPushButton(ConfigKey(m_group, "clear")); - connect(m_pControlClear, SIGNAL(valueChanged(double)), - this, SLOT(slotClear(double))); + connect(m_pControlClear, &ControlObject::valueChanged, + this, &EffectSlot::slotClear); for (unsigned int i = 0; i < kDefaultMaxParameters; ++i) { addEffectParameterSlot(EffectManifestParameter::ParameterType::KNOB); @@ -75,8 +75,11 @@ EffectSlot::EffectSlot(const QString& group, } m_pControlMetaParameter = new ControlPotmeter(ConfigKey(m_group, "meta"), 0.0, 1.0); - connect(m_pControlMetaParameter, SIGNAL(valueChanged(double)), - this, SLOT(slotEffectMetaParameter(double))); + // QObject::connect cannot connect to slots with optional parameters using function + // pointer syntax if the slot has more parameters than the signal, so use a lambda + // to hack around this limitation. + connect(m_pControlMetaParameter, &ControlObject::valueChanged, + this, [=](double value){slotEffectMetaParameter(value);} ); m_pControlMetaParameter->set(0.0); m_pControlMetaParameter->setDefaultValue(0.0); From cdd440e1e7653996ab72d09d678bbedcac68a506 Mon Sep 17 00:00:00 2001 From: Kshitij Gupta Date: Wed, 2 Jan 2019 09:57:18 +0530 Subject: [PATCH 037/443] Removed redundant block from switch case --- src/effects/effectknobparameterslot.cpp | 34 ++++++++++++------------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/src/effects/effectknobparameterslot.cpp b/src/effects/effectknobparameterslot.cpp index 8dd03442bde0..ef3cd43145d6 100644 --- a/src/effects/effectknobparameterslot.cpp +++ b/src/effects/effectknobparameterslot.cpp @@ -169,30 +169,28 @@ void EffectKnobParameterSlot::onEffectMetaParameterChanged(double parameter, boo static_cast(m_pControlLinkType->get())); bool inverse = m_pControlLinkInverse->toBool(); + double neutral = m_pManifestParameter->neutralPointOnScale(); switch (type) { case EffectManifestParameter::LinkType::LINKED: if (parameter < 0.0 || parameter > 1.0) { return; } - { - double neutral = m_pManifestParameter->neutralPointOnScale(); - if (neutral > 0.0 && neutral < 1.0) { - if (inverse) { - // the neutral position must stick where it is - neutral = 1.0 - neutral; - } - // Knob is already a split knob - // Match to center position of meta knob - if (parameter <= 0.5) { - parameter /= 0.5; - parameter *= neutral; - } else { - parameter -= 0.5; - parameter /= 0.5; - parameter *= 1 - neutral; - parameter += neutral; - } + if (neutral > 0.0 && neutral < 1.0) { + if (inverse) { + // the neutral position must stick where it is + neutral = 1.0 - neutral; + } + // Knob is already a split knob + // Match to center position of meta knob + if (parameter <= 0.5) { + parameter /= 0.5; + parameter *= neutral; + } else { + parameter -= 0.5; + parameter /= 0.5; + parameter *= 1 - neutral; + parameter += neutral; } } break; From 1345726dfbca1188fc6f3db6bbef8733ac8b2d4b Mon Sep 17 00:00:00 2001 From: Kshitij Gupta Date: Wed, 2 Jan 2019 10:02:04 +0530 Subject: [PATCH 038/443] Added comment in load Parameter --- src/effects/effectslot.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/effects/effectslot.cpp b/src/effects/effectslot.cpp index a11b842c9154..fb62b42ea5ee 100644 --- a/src/effects/effectslot.cpp +++ b/src/effects/effectslot.cpp @@ -326,6 +326,7 @@ void EffectSlot::loadParameters() { auto pParameter = m_parameters.value(manifestIndex, nullptr); + // Try loading the next parameter in the current parameter slot VERIFY_OR_DEBUG_ASSERT(pParameter != nullptr) { continue; } From b9b1429683a6827501a1f4464e6443d36ed4884d Mon Sep 17 00:00:00 2001 From: Kshitij Gupta Date: Wed, 2 Jan 2019 11:14:32 +0530 Subject: [PATCH 039/443] Removed EffectSlot::getEngineEffect() Added comments --- src/effects/effectparameter.cpp | 9 ++++----- src/effects/effectparameter.h | 5 +++-- src/effects/effectslot.cpp | 15 ++++++++------- src/effects/effectslot.h | 2 -- 4 files changed, 15 insertions(+), 16 deletions(-) diff --git a/src/effects/effectparameter.cpp b/src/effects/effectparameter.cpp index b099a423efca..386aec2cc77f 100644 --- a/src/effects/effectparameter.cpp +++ b/src/effects/effectparameter.cpp @@ -4,10 +4,10 @@ #include "effects/effectsmanager.h" #include "util/assert.h" -EffectParameter::EffectParameter(EffectSlot* pEffectSlot, EffectsManager* pEffectsManager, +EffectParameter::EffectParameter(EngineEffect* pEngineEffect, EffectsManager* pEffectsManager, int iParameterNumber, EffectManifestParameterPointer pParameter) : QObject(), // no parent - m_pEffectSlot(pEffectSlot), + m_pEngineEffect(pEngineEffect), m_pEffectsManager(pEffectsManager), m_iParameterNumber(iParameterNumber), m_pParameter(pParameter) { @@ -60,13 +60,12 @@ void EffectParameter::setValue(double value) { } void EffectParameter::updateEngineState() { - EngineEffect* pEngineEffect = m_pEffectSlot->getEngineEffect(); - if (!pEngineEffect) { + if (!m_pEngineEffect) { return; } EffectsRequest* pRequest = new EffectsRequest(); pRequest->type = EffectsRequest::SET_PARAMETER_PARAMETERS; - pRequest->pTargetEffect = pEngineEffect; + pRequest->pTargetEffect = m_pEngineEffect; pRequest->SetParameterParameters.iParameter = m_iParameterNumber; pRequest->value = m_value; pRequest->minimum = m_pParameter->getMinimum(); diff --git a/src/effects/effectparameter.h b/src/effects/effectparameter.h index 834eba7c74e0..136ac3df0b82 100644 --- a/src/effects/effectparameter.h +++ b/src/effects/effectparameter.h @@ -10,6 +10,7 @@ class Effect; class EffectsManager; +class EngineEffect; // An EffectParameter is a wrapper around EffectManifestParameter that tracks a // mutable value state and communicates that state to the engine. This class is @@ -17,7 +18,7 @@ class EffectsManager; class EffectParameter : public QObject { Q_OBJECT public: - EffectParameter(EffectSlot* pEffectSlot, EffectsManager* pEffectsManager, + EffectParameter(EngineEffect* pEngineEffect, EffectsManager* pEffectsManager, int iParameterNumber, EffectManifestParameterPointer pParameter); virtual ~EffectParameter(); @@ -40,7 +41,7 @@ class EffectParameter : public QObject { const double& minimum, const double& maximum); bool clampValue(); - EffectSlot* m_pEffectSlot; + EngineEffect* m_pEngineEffect; EffectsManager* m_pEffectsManager; int m_iParameterNumber; EffectManifestParameterPointer m_pParameter; diff --git a/src/effects/effectslot.cpp b/src/effects/effectslot.cpp index fb62b42ea5ee..ae7fe3f8e66d 100644 --- a/src/effects/effectslot.cpp +++ b/src/effects/effectslot.cpp @@ -166,10 +166,6 @@ EffectState* EffectSlot::createState(const mixxx::EngineParameters& bufferParame return m_pEngineEffect->createState(bufferParameters); } -EngineEffect* EffectSlot::getEngineEffect() { - return m_pEngineEffect; -} - EffectManifestPointer EffectSlot::getManifest() const { return m_pManifest; } @@ -256,18 +252,18 @@ void EffectSlot::loadEffect(const EffectManifestPointer pManifest, parameterMapping.clear(); } + addToEngine(std::move(pProcessor), activeChannels); + int index = 0; for (const auto& pManifestParameter: m_pManifest->parameters()) { EffectParameter* pParameter = new EffectParameter( - this, m_pEffectsManager, m_parameters.size(), pManifestParameter); + m_pEngineEffect, m_pEffectsManager, m_parameters.size(), pManifestParameter); m_parameters.append(pParameter); m_mapForParameterType[pManifestParameter->parameterType()].push_back(index); ++index; } - addToEngine(std::move(pProcessor), activeChannels); - m_pControlLoaded->forceSet(1.0); loadParameters(); @@ -321,6 +317,8 @@ void EffectSlot::loadParameters() { unsigned int parameterSlotIndex = 0; unsigned int numParameterSlots = m_iNumParameterSlots[parameterType]; + + // Load EffectParameters into the slot indicated by m_mapForParameterType for (int i=0 ; i, From c672bbdcad87e615e5340a8ce7bb6f5d3151b48d Mon Sep 17 00:00:00 2001 From: Kshitij Gupta Date: Wed, 2 Jan 2019 12:01:12 +0530 Subject: [PATCH 040/443] Added assertion parameterSlotIndex < numParameterSlots --- src/effects/effectslot.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/effects/effectslot.cpp b/src/effects/effectslot.cpp index ec5041b36411..bacf20924aeb 100644 --- a/src/effects/effectslot.cpp +++ b/src/effects/effectslot.cpp @@ -332,16 +332,17 @@ void EffectSlot::loadParameters() { continue; } - while (parameterSlotIndex < numParameterSlots) { - auto pParameterSlot = getEffectParameterSlot(parameterType, parameterSlotIndex); - VERIFY_OR_DEBUG_ASSERT(pParameterSlot != nullptr) { - ++parameterSlotIndex; - continue; - } - pParameterSlot->loadParameter(pParameter); - ++parameterSlotIndex; + VERIFY_OR_DEBUG_ASSERT(parameterSlotIndex < numParameterSlots) { break; } + + auto pParameterSlot = getEffectParameterSlot(parameterType, parameterSlotIndex); + VERIFY_OR_DEBUG_ASSERT(pParameterSlot != nullptr) { + ++parameterSlotIndex; + continue; + } + pParameterSlot->loadParameter(pParameter); + ++parameterSlotIndex; } // Clear any EffectParameterSlots that still have a loaded parameter from before From acf0f4f88ca35549671cb936ea822357d9e69ab8 Mon Sep 17 00:00:00 2001 From: Kshitij Gupta Date: Wed, 2 Jan 2019 12:42:25 +0530 Subject: [PATCH 041/443] Added comment in EffectParameter --- src/effects/effectparameter.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/effects/effectparameter.h b/src/effects/effectparameter.h index 136ac3df0b82..f7294b000094 100644 --- a/src/effects/effectparameter.h +++ b/src/effects/effectparameter.h @@ -14,7 +14,10 @@ class EngineEffect; // An EffectParameter is a wrapper around EffectManifestParameter that tracks a // mutable value state and communicates that state to the engine. This class is -// NOT thread-safe and must only be used from the main thread. +// NOT thread-safe and must only be used from the main thread. Separating this +// from the parameterX ControlObjects in EffectParameterSlot allows for decoupling +// the state of the parameters from the ControlObject states, which is required for +// parameter hiding and rearrangement. class EffectParameter : public QObject { Q_OBJECT public: From 73fecb76c00d6c7fef4f380c6b2d819c3c640326 Mon Sep 17 00:00:00 2001 From: Kshitij Gupta Date: Tue, 12 Feb 2019 00:04:39 +0530 Subject: [PATCH 042/443] Shifted slotValueChanged to EffectParameterSlotBase --- src/effects/effectbuttonparameterslot.cpp | 6 ------ src/effects/effectbuttonparameterslot.h | 1 - src/effects/effectknobparameterslot.cpp | 6 ------ src/effects/effectknobparameterslot.h | 1 - src/effects/effectparameterslotbase.cpp | 8 +++++++- src/effects/effectparameterslotbase.h | 3 +++ 6 files changed, 10 insertions(+), 15 deletions(-) diff --git a/src/effects/effectbuttonparameterslot.cpp b/src/effects/effectbuttonparameterslot.cpp index a0a5b09c3f44..6a60874e06ef 100644 --- a/src/effects/effectbuttonparameterslot.cpp +++ b/src/effects/effectbuttonparameterslot.cpp @@ -105,12 +105,6 @@ void EffectButtonParameterSlot::slotParameterValueChanged(double value) { m_pControlValue->set(value); } -void EffectButtonParameterSlot::slotValueChanged(double v) { - if (m_pEffectParameter) { - m_pEffectParameter->setValue(v); - } -} - QDomElement EffectButtonParameterSlot::toXml(QDomDocument* doc) const { QDomElement parameterElement; // if (m_pEffectParameter != nullptr) { diff --git a/src/effects/effectbuttonparameterslot.h b/src/effects/effectbuttonparameterslot.h index dea33390d703..f119ae18526b 100644 --- a/src/effects/effectbuttonparameterslot.h +++ b/src/effects/effectbuttonparameterslot.h @@ -36,7 +36,6 @@ class EffectButtonParameterSlot : public EffectParameterSlotBase { private slots: // Solely for handling control changes void slotParameterValueChanged(double value); - void slotValueChanged(double v); private: QString debugString() const { diff --git a/src/effects/effectknobparameterslot.cpp b/src/effects/effectknobparameterslot.cpp index e0d42ed92a41..87635fadcb54 100644 --- a/src/effects/effectknobparameterslot.cpp +++ b/src/effects/effectknobparameterslot.cpp @@ -253,12 +253,6 @@ double EffectKnobParameterSlot::getValueParameter() const { return m_pControlValue->getParameter(); } -void EffectKnobParameterSlot::slotValueChanged(double v) { - if (m_pEffectParameter) { - m_pEffectParameter->setValue(v); - } -} - QDomElement EffectKnobParameterSlot::toXml(QDomDocument* doc) const { QDomElement parameterElement; // if (m_pEffectParameter != nullptr) { diff --git a/src/effects/effectknobparameterslot.h b/src/effects/effectknobparameterslot.h index dc05d21c5314..e67da6853266 100644 --- a/src/effects/effectknobparameterslot.h +++ b/src/effects/effectknobparameterslot.h @@ -48,7 +48,6 @@ class EffectKnobParameterSlot : public EffectParameterSlotBase { private slots: // Solely for handling control changes void slotParameterValueChanged(double value); - void slotValueChanged(double v); void slotLinkTypeChanging(double v); void slotLinkInverseChanged(double v); diff --git a/src/effects/effectparameterslotbase.cpp b/src/effects/effectparameterslotbase.cpp index 0aa62498c57f..453cf2f75a28 100644 --- a/src/effects/effectparameterslotbase.cpp +++ b/src/effects/effectparameterslotbase.cpp @@ -64,4 +64,10 @@ void EffectParameterSlotBase::syncSofttakeover() { } void EffectParameterSlotBase::onEffectMetaParameterChanged(double parameter, bool force) { -} \ No newline at end of file +} + +void EffectParameterSlotBase::slotValueChanged(double v) { + if (m_pEffectParameter) { + m_pEffectParameter->setValue(v); + } +} diff --git a/src/effects/effectparameterslotbase.h b/src/effects/effectparameterslotbase.h index 05c88b9502f7..1130907247ed 100644 --- a/src/effects/effectparameterslotbase.h +++ b/src/effects/effectparameterslotbase.h @@ -47,6 +47,9 @@ class EffectParameterSlotBase : public QObject { // Signal that indicates that the EffectParameterSlotBase has been updated. void updated(); + protected slots: + void slotValueChanged(double v); + protected: const unsigned int m_iParameterSlotNumber; QString m_group; From d7d565791124e03a94e64478a21e34a27018d092 Mon Sep 17 00:00:00 2001 From: Kshitij Gupta Date: Tue, 12 Feb 2019 06:19:06 +0530 Subject: [PATCH 043/443] Simplified parameter value updates - Removed EffectSlot::getParameterForSlot - Removed EffectParameter::valueChanged signal --- src/effects/effectbuttonparameterslot.cpp | 4 --- src/effects/effectknobparameterslot.cpp | 4 --- src/effects/effectparameter.cpp | 4 +-- src/effects/effectparameter.h | 6 +--- src/effects/effectparameterslotbase.h | 8 ++++- src/effects/effectslot.cpp | 16 ---------- src/effects/effectslot.h | 3 -- src/preferences/dialog/dlgprefeq.cpp | 38 ++++++++++++++--------- 8 files changed, 32 insertions(+), 51 deletions(-) diff --git a/src/effects/effectbuttonparameterslot.cpp b/src/effects/effectbuttonparameterslot.cpp index 6a60874e06ef..c74e6b9fb343 100644 --- a/src/effects/effectbuttonparameterslot.cpp +++ b/src/effects/effectbuttonparameterslot.cpp @@ -76,9 +76,6 @@ void EffectButtonParameterSlot::loadParameter(EffectParameter* pEffectParameter) m_pControlType->forceSet(static_cast(type)); // Default loaded parameters to loaded and unlinked m_pControlLoaded->forceSet(1.0); - - connect(m_pEffectParameter, &EffectParameter::valueChanged, - this, &EffectButtonParameterSlot::slotParameterValueChanged); } emit(updated()); @@ -87,7 +84,6 @@ void EffectButtonParameterSlot::loadParameter(EffectParameter* pEffectParameter) void EffectButtonParameterSlot::clear() { //qDebug() << debugString() << "clear"; if (m_pEffectParameter) { - m_pEffectParameter->disconnect(this); m_pEffectParameter = nullptr; m_pManifestParameter.clear(); } diff --git a/src/effects/effectknobparameterslot.cpp b/src/effects/effectknobparameterslot.cpp index 87635fadcb54..5fe66b7dee70 100644 --- a/src/effects/effectknobparameterslot.cpp +++ b/src/effects/effectknobparameterslot.cpp @@ -96,9 +96,6 @@ void EffectKnobParameterSlot::loadParameter(EffectParameter* pEffectParameter) { static_cast(m_pManifestParameter->defaultLinkType())); m_pControlLinkInverse->set( static_cast(m_pManifestParameter->defaultLinkInversion())); - - connect(m_pEffectParameter, &EffectParameter::valueChanged, - this, &EffectKnobParameterSlot::slotParameterValueChanged); } emit(updated()); @@ -107,7 +104,6 @@ void EffectKnobParameterSlot::loadParameter(EffectParameter* pEffectParameter) { void EffectKnobParameterSlot::clear() { //qDebug() << debugString() << "clear"; if (m_pEffectParameter) { - m_pEffectParameter->disconnect(this); m_pEffectParameter = nullptr; m_pManifestParameter.clear(); } diff --git a/src/effects/effectparameter.cpp b/src/effects/effectparameter.cpp index 386aec2cc77f..34777e7f9701 100644 --- a/src/effects/effectparameter.cpp +++ b/src/effects/effectparameter.cpp @@ -6,8 +6,7 @@ EffectParameter::EffectParameter(EngineEffect* pEngineEffect, EffectsManager* pEffectsManager, int iParameterNumber, EffectManifestParameterPointer pParameter) - : QObject(), // no parent - m_pEngineEffect(pEngineEffect), + : m_pEngineEffect(pEngineEffect), m_pEffectsManager(pEffectsManager), m_iParameterNumber(iParameterNumber), m_pParameter(pParameter) { @@ -56,7 +55,6 @@ void EffectParameter::setValue(double value) { } updateEngineState(); - emit(valueChanged(m_value)); } void EffectParameter::updateEngineState() { diff --git a/src/effects/effectparameter.h b/src/effects/effectparameter.h index f7294b000094..03b32c8d659c 100644 --- a/src/effects/effectparameter.h +++ b/src/effects/effectparameter.h @@ -18,8 +18,7 @@ class EngineEffect; // from the parameterX ControlObjects in EffectParameterSlot allows for decoupling // the state of the parameters from the ControlObject states, which is required for // parameter hiding and rearrangement. -class EffectParameter : public QObject { - Q_OBJECT +class EffectParameter { public: EffectParameter(EngineEffect* pEngineEffect, EffectsManager* pEffectsManager, int iParameterNumber, EffectManifestParameterPointer pParameter); @@ -32,9 +31,6 @@ class EffectParameter : public QObject { void updateEngineState(); - signals: - void valueChanged(double value); - private: QString debugString() const { return QString("EffectParameter(%1)").arg(m_pParameter->name()); diff --git a/src/effects/effectparameterslotbase.h b/src/effects/effectparameterslotbase.h index 1130907247ed..e76d673f5dc3 100644 --- a/src/effects/effectparameterslotbase.h +++ b/src/effects/effectparameterslotbase.h @@ -39,6 +39,10 @@ class EffectParameterSlotBase : public QObject { QString description() const; EffectManifestParameter::ParameterType parameterType() const; EffectManifestParameterPointer getManifest(); + inline bool isLoaded() const { + return m_pManifestParameter != nullptr; + } + virtual QDomElement toXml(QDomDocument* doc) const = 0; virtual void loadParameterSlotFromXml(const QDomElement& parameterElement) = 0; @@ -47,8 +51,10 @@ class EffectParameterSlotBase : public QObject { // Signal that indicates that the EffectParameterSlotBase has been updated. void updated(); - protected slots: + public slots: + // Solely for handling control changes void slotValueChanged(double v); + virtual void slotParameterValueChanged(double value) = 0; protected: const unsigned int m_iParameterSlotNumber; diff --git a/src/effects/effectslot.cpp b/src/effects/effectslot.cpp index bacf20924aeb..0f827519702f 100644 --- a/src/effects/effectslot.cpp +++ b/src/effects/effectslot.cpp @@ -202,22 +202,6 @@ unsigned int EffectSlot::numParameters(EffectManifestParameter::ParameterType pa return num; } -EffectParameter* EffectSlot::getParameterForSlot(EffectManifestParameter::ParameterType parameterType, - unsigned int slotNumber) { - // It's normal to ask for a parameter that doesn't exist. Callers must check - // for NULL. - unsigned int num = 0; - for (const auto& parameter: m_parameters) { - if (parameter->manifest()->showInParameterSlot() && parameter->manifest()->parameterType() == parameterType) { - if(num == slotNumber) { - return parameter; - } - ++num; - } - } - return nullptr; -} - void EffectSlot::setEnabled(bool enabled) { m_pControlEnabled->set(enabled); } diff --git a/src/effects/effectslot.h b/src/effects/effectslot.h index 513815505801..a14a7cdc3ee4 100644 --- a/src/effects/effectslot.h +++ b/src/effects/effectslot.h @@ -74,9 +74,6 @@ class EffectSlot : public QObject { unsigned int numParameters(EffectManifestParameter::ParameterType parameterType) const; - EffectParameter* getParameterForSlot(EffectManifestParameter::ParameterType parameterType, - unsigned int slotNumber); - void setEnabled(bool enabled); // static EffectPointer createFromXml(EffectsManager* pEffectsManager, diff --git a/src/preferences/dialog/dlgprefeq.cpp b/src/preferences/dialog/dlgprefeq.cpp index 88d8a0430215..79004a41c535 100644 --- a/src/preferences/dialog/dlgprefeq.cpp +++ b/src/preferences/dialog/dlgprefeq.cpp @@ -496,10 +496,12 @@ void DlgPrefEQ::slotUpdateMasterEQParameter(int value) { if (!pEffectSlot.isNull()) { QSlider* slider = qobject_cast(sender()); int index = slider->property("index").toInt(); - EffectParameter* param = pEffectSlot->getParameterForSlot(EffectManifestParameter::ParameterType::KNOB, index); - if (param) { + auto pParameterSlot = pEffectSlot->getEffectParameterSlot( + EffectManifestParameter::ParameterType::KNOB, index); + + if (pParameterSlot->isLoaded()) { double dValue = value / 100.0; - param->setValue(dValue); + pParameterSlot->slotParameterValueChanged(dValue); QLabel* valueLabel = m_masterEQValues[index]; QString valueText = QString::number(dValue); valueLabel->setText(valueText); @@ -619,8 +621,10 @@ void DlgPrefEQ::setUpMasterEQ() { if (!pEffectSlot.isNull()) { int knobNum = pEffectSlot->numParameters(EffectManifestParameter::ParameterType::KNOB); for (int i = 0; i < knobNum; i++) { - EffectParameter* param = pEffectSlot->getParameterForSlot(EffectManifestParameter::ParameterType::KNOB, i); - if (param) { + auto pParameterSlot = pEffectSlot->getEffectParameterSlot( + EffectManifestParameter::ParameterType::KNOB, i); + + if (pParameterSlot->isLoaded()) { QString strValue = m_pConfig->getValueString(ConfigKey(kConfigKey, QString("EffectForGroup_[Master]_parameter%1").arg(i + 1))); bool ok; @@ -668,13 +672,15 @@ void DlgPrefEQ::slotMasterEqEffectChanged(int effectIndex) { // Create and set up Master EQ's sliders int i; for (i = 0; i < knobNum; i++) { - EffectParameter* param = pEffectSlot->getParameterForSlot(EffectManifestParameter::ParameterType::KNOB, i); - if (param) { - EffectManifestParameterPointer pManifestParameter = param->manifest(); + auto pParameterSlot = pEffectSlot->getEffectParameterSlot( + EffectManifestParameter::ParameterType::KNOB, i); + + if (pParameterSlot->isLoaded()) { + EffectManifestParameterPointer pManifestParameter = pParameterSlot->getManifest(); // Setup Label QLabel* centerFreqLabel = new QLabel(this); - QString labelText = param->manifest()->name(); + QString labelText = pParameterSlot->getManifest()->name(); m_masterEQLabels.append(centerFreqLabel); centerFreqLabel->setText(labelText); slidersGridLayout->addWidget(centerFreqLabel, 0, i + 1, Qt::AlignCenter); @@ -753,9 +759,9 @@ void DlgPrefEQ::slotMasterEQToDefault() { if (!pEffectSlot.isNull()) { int knobNum = pEffectSlot->numParameters(EffectManifestParameter::ParameterType::KNOB); for (int i = 0; i < knobNum; i++) { - EffectParameter* param = pEffectSlot->getParameterForSlot(EffectManifestParameter::ParameterType::KNOB, i); - if (param) { - double defaultValue = param->manifest()->getDefault(); + auto pParameterSlot = pEffectSlot->getEffectParameterSlot(EffectManifestParameter::ParameterType::KNOB, i); + if (pParameterSlot->isLoaded()) { + double defaultValue = pParameterSlot->getManifest()->getDefault(); setMasterEQParameter(i, defaultValue); } } @@ -765,9 +771,11 @@ void DlgPrefEQ::slotMasterEQToDefault() { void DlgPrefEQ::setMasterEQParameter(int i, double value) { EffectSlotPointer pEffectSlot(m_pEffectMasterEQ); if (!pEffectSlot.isNull()) { - EffectParameter* param = pEffectSlot->getParameterForSlot(EffectManifestParameter::ParameterType::KNOB, i); - if (param) { - param->setValue(value); + auto pParameterSlot = pEffectSlot->getEffectParameterSlot( + EffectManifestParameter::ParameterType::KNOB, i); + + if (pParameterSlot->isLoaded()) { + pParameterSlot->slotParameterValueChanged(value); m_masterEQSliders[i]->setValue(value * 100); QLabel* valueLabel = m_masterEQValues[i]; From 2fab19ab637b8eb9e35b9aea94bfe2a5e70740d1 Mon Sep 17 00:00:00 2001 From: Kshitij Gupta Date: Sun, 17 Feb 2019 09:23:52 +0530 Subject: [PATCH 044/443] Added Effect Preset classes - Added EffectChainPreset class - Added EffectPreset class - Added EffectsManager::loadEffectChainPresets --- build/depends.py | 2 ++ src/effects/defs.h | 6 +++++ src/effects/effectchainpreset.cpp | 38 ++++++++++++++++++++++++++++ src/effects/effectchainpreset.h | 29 ++++++++++++++++++++++ src/effects/effectpreset.cpp | 32 ++++++++++++++++++++++++ src/effects/effectpreset.h | 23 +++++++++++++++++ src/effects/effectsmanager.cpp | 41 +++++++++++++++++++++++++------ src/effects/effectsmanager.h | 6 ++--- 8 files changed, 167 insertions(+), 10 deletions(-) create mode 100644 src/effects/effectchainpreset.cpp create mode 100644 src/effects/effectchainpreset.h create mode 100644 src/effects/effectpreset.cpp create mode 100644 src/effects/effectpreset.h diff --git a/build/depends.py b/build/depends.py index eef5b2ddc1fa..7c039d59f969 100644 --- a/build/depends.py +++ b/build/depends.py @@ -745,6 +745,8 @@ def sources(self, build): "src/effects/effectparameter.cpp", + "src/effects/effectchainpreset.cpp", + "src/effects/effectpreset.cpp", "src/effects/effectchainslot.cpp", "src/effects/specialeffectchainslots.cpp", "src/effects/effectslot.cpp", diff --git a/src/effects/defs.h b/src/effects/defs.h index 850ffa06576a..aa64e1d68bff 100644 --- a/src/effects/defs.h +++ b/src/effects/defs.h @@ -73,6 +73,12 @@ typedef QSharedPointer EffectParameterSlotBasePointer; class EffectChainSlot; typedef QSharedPointer EffectChainSlotPointer; +class EffectChainPreset; +typedef QSharedPointer EffectChainPresetPointer; + +class EffectPreset; +typedef QSharedPointer EffectPresetPointer; + class StandardEffectChainSlot; typedef QSharedPointer StandardEffectChainSlotPointer; diff --git a/src/effects/effectchainpreset.cpp b/src/effects/effectchainpreset.cpp new file mode 100644 index 000000000000..94b77b3107ed --- /dev/null +++ b/src/effects/effectchainpreset.cpp @@ -0,0 +1,38 @@ +#include "effects/effectchainpreset.h" + +#include "effects/effectxmlelements.h" +#include "effects/effectchainslot.h" +#include "util/xml.h" + +EffectChainPreset::EffectChainPreset() { +} + +EffectChainPreset::EffectChainPreset(const QDomElement& element) { + if (!element.hasChildNodes()) { + return; + } + + m_id = XmlParse::selectNodeQString(element, EffectXml::ChainId); + m_name = XmlParse::selectNodeQString(element, EffectXml::ChainName); + m_description = XmlParse::selectNodeQString(element, EffectXml::ChainDescription); + + QString mixModeStr = XmlParse::selectNodeQString(element, EffectXml::ChainMixMode); + m_mixMode = EffectChainSlot::mixModeFromString(mixModeStr); + + m_dSuper = XmlParse::selectNodeDouble(element, EffectXml::ChainSuperParameter); + + QDomElement effectsElement = XmlParse::selectElement(element, EffectXml::EffectsRoot); + QDomNodeList effectList = effectsElement.childNodes(); + + for (int i = 0; i < effectList.count(); ++i) { + QDomNode effectNode = effectList.at(i); + if (effectNode.isElement()) { + QDomElement effectElement = effectNode.toElement(); + EffectPresetPointer pPreset(new EffectPreset(effectElement)); + m_effectPresets.append(pPreset); + } + } +} + +EffectChainPreset::~EffectChainPreset() { +} diff --git a/src/effects/effectchainpreset.h b/src/effects/effectchainpreset.h new file mode 100644 index 000000000000..bd6c324116e8 --- /dev/null +++ b/src/effects/effectchainpreset.h @@ -0,0 +1,29 @@ +#ifndef EFFECTCHAINPRESET_H +#define EFFECTCHAINPRESET_H + +#include + +#include "effects/defs.h" +#include "effects/effectpreset.h" + + +class EffectChainPreset { + public: + EffectChainPreset(); + EffectChainPreset(const QDomElement& element); + ~EffectChainPreset(); + + QString name() const { + return m_name; + } + + private: + QString m_id; + QString m_name; + QString m_description; + double m_dSuper; + EffectChainMixMode m_mixMode; + QList m_effectPresets; +}; + +#endif /* EFFECTCHAINPRESET_H */ \ No newline at end of file diff --git a/src/effects/effectpreset.cpp b/src/effects/effectpreset.cpp new file mode 100644 index 000000000000..d3734cf194ee --- /dev/null +++ b/src/effects/effectpreset.cpp @@ -0,0 +1,32 @@ +#include "effects/effectpreset.h" + +#include "effects/effectxmlelements.h" +#include "util/xml.h" + +EffectPreset::EffectPreset() { +} + +EffectPreset::EffectPreset(const QDomElement& element) { + if (!element.hasChildNodes()) { + return; + } + + m_id = XmlParse::selectNodeQString(element, EffectXml::EffectId); + m_version = XmlParse::selectNodeQString(element, EffectXml::EffectVersion); + m_dMetaParameter = XmlParse::selectNodeDouble(element, EffectXml::EffectMetaParameter); + + QDomElement parametersElement = XmlParse::selectElement(element, EffectXml::ParametersRoot); + QDomNodeList parametersList = parametersElement.childNodes(); + + for (int i = 0; i < parametersList.count(); ++i) { + QDomNode parameterNode = parametersList.at(i); + if (parameterNode.isElement()) { + QDomElement parameterElement = parameterNode.toElement(); + // EffectParameterPresetPointer pPreset(new EffectParameterPreset(parameterElement)); + // m_effectParameterPresets.append(pPreset); + } + } +} + +EffectPreset::~EffectPreset() { +} diff --git a/src/effects/effectpreset.h b/src/effects/effectpreset.h new file mode 100644 index 000000000000..1cf6d4e5496b --- /dev/null +++ b/src/effects/effectpreset.h @@ -0,0 +1,23 @@ +#ifndef EFFECTPRESET_H +#define EFFECTPRESET_H + +#include + +#include "effects/defs.h" + + +class EffectPreset { + public: + EffectPreset(); + EffectPreset(const QDomElement& element); + ~EffectPreset(); + + private: + QString m_id; + QString m_version; + double m_dMetaParameter; + + // QList m_effectParameterPresets; +}; + +#endif /* EFFECTPRESET_H */ \ No newline at end of file diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index 11df339e5f17..62b7f7263588 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -1,11 +1,13 @@ #include "effects/effectsmanager.h" +#include #include #include #include #include "engine/effects/engineeffectsmanager.h" +#include "effects/effectchainpreset.h" #include "effects/effectsbackend.h" #include "effects/effectslot.h" #include "effects/effectxmlelements.h" @@ -328,7 +330,8 @@ void EffectsManager::addQuickEffectChainSlot(const QString& deckGroupName) { m_effectChainSlotsByGroup.insert(pChainSlot->group(), pChainSlot); } -EffectChainSlotPointer EffectsManager::getEffectChainSlot(const QString& group) const { +EffectChainSlotPointer EffectsManager::getEffectChainSlot( + const QString& group) const { return m_effectChainSlotsByGroup.value(group); } @@ -384,17 +387,12 @@ bool EffectsManager::getEffectVisibility(EffectManifestPointer pManifest) { } void EffectsManager::setup() { + loadEffectChainPresets(); // Add postfader effect chain slots addStandardEffectChainSlots(); addOutputEffectChainSlot(); } -// NOTE(Kshitij) : Use new functions for effect loading using Effect Preset -// void EffectsManager::loadEffectChains() { -// // populate rack and restore state from effects.xml -// m_pEffectChainManager->loadEffectChains(); -// } - void EffectsManager::setEffectParameterPosition(EffectManifestPointer pManifest, const unsigned int parameterId, const unsigned int position) { for (auto& pChainSlot : m_standardEffectChainSlots) { @@ -498,3 +496,32 @@ void EffectsManager::collectGarbage(const EffectsRequest* pRequest) { pRequest->DisableInputChannelForChain.pChannelHandle); } } + +void EffectsManager::loadEffectChainPresets() { + QDir settingsPath(m_pConfig->getSettingsPath()); + QFile file(settingsPath.absoluteFilePath("effects.xml")); + QDomDocument doc; + + if (!file.open(QIODevice::ReadOnly)) { + return; + } else if (!doc.setContent(&file)) { + file.close(); + return; + } + file.close(); + + QDomElement root = doc.documentElement(); + QDomElement rackElement = XmlParse::selectElement(root, EffectXml::Rack); + QDomElement chainsElement = XmlParse::selectElement(rackElement, EffectXml::ChainsRoot); + QDomNodeList chainsList = chainsElement.elementsByTagName(EffectXml::Chain); + + for (int i=0; iname(), pPreset); + } + } +} \ No newline at end of file diff --git a/src/effects/effectsmanager.h b/src/effects/effectsmanager.h index 6fe65323a2f8..06d7c9260991 100644 --- a/src/effects/effectsmanager.h +++ b/src/effects/effectsmanager.h @@ -53,7 +53,6 @@ class EffectsManager : public QObject { // NOTE(Kshitij) : New functions for saving and loading // bool saveEffectChains(); - // void loadEffectChains(); static const int kNumStandardEffectChains = 4; @@ -104,8 +103,7 @@ class EffectsManager : public QObject { void addEqualizerEffectChainSlot(const QString& deckGroupName); void addQuickEffectChainSlot(const QString& deckGroupName); - // NOTE(Kshitij) : Use new functions - // void loadEffectChains(); + void loadEffectChainPresets(); // TODO: Remove these methods to reduce coupling between GUI and // effects system implementation details. @@ -187,6 +185,8 @@ class EffectsManager : public QObject { QHash m_equalizerEffectChainSlots; QHash m_quickEffectChainSlots; + QHash m_effectChainPresets; + DISALLOW_COPY_AND_ASSIGN(EffectsManager); }; From aa44159634b80518646d0ddcab401e4d3cddd6b1 Mon Sep 17 00:00:00 2001 From: Be Date: Wed, 1 Apr 2020 17:13:04 -0500 Subject: [PATCH 045/443] CMakeLists.txt: update for effects system refactoring --- CMakeLists.txt | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5053489dca0d..4f39eff2e0ba 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -251,20 +251,18 @@ add_library(mixxx-lib STATIC EXCLUDE_FROM_ALL src/effects/builtin/reverbeffect.cpp src/effects/builtin/threebandbiquadeqeffect.cpp src/effects/builtin/tremoloeffect.cpp - src/effects/effect.cpp src/effects/effectbuttonparameterslot.cpp - src/effects/effectchain.cpp - src/effects/effectchainmanager.cpp + src/effects/effectchainpreset.cpp src/effects/effectchainslot.cpp src/effects/effectmanifest.cpp src/effects/effectmanifestparameter.cpp src/effects/effectparameter.cpp - src/effects/effectparameterslot.cpp + src/effects/effectpreset.cpp + src/effects/effectknobparameterslot.cpp src/effects/effectparameterslotbase.cpp - src/effects/effectrack.cpp - src/effects/effectsbackend.cpp src/effects/effectslot.cpp src/effects/effectsmanager.cpp + src/effects/specialeffectchainslots.cpp src/encoder/encoder.cpp src/encoder/encoderbroadcastsettings.cpp src/encoder/encoderflacsettings.cpp @@ -298,7 +296,6 @@ add_library(mixxx-lib STATIC EXCLUDE_FROM_ALL src/engine/controls/ratecontrol.cpp src/engine/effects/engineeffect.cpp src/engine/effects/engineeffectchain.cpp - src/engine/effects/engineeffectrack.cpp src/engine/effects/engineeffectsmanager.cpp src/engine/enginebuffer.cpp src/engine/enginedelay.cpp @@ -986,7 +983,6 @@ add_executable(mixxx-test src/test/analyzersilence_test.cpp src/test/audiotaperpot_test.cpp src/test/autodjprocessor_test.cpp - src/test/baseeffecttest.cpp src/test/beatgridtest.cpp src/test/beatmaptest.cpp src/test/beatstranslatetest.cpp @@ -1013,9 +1009,10 @@ add_executable(mixxx-test src/test/directorydaotest.cpp src/test/duration_test.cpp src/test/durationutiltest.cpp - src/test/effectchainslottest.cpp - src/test/effectslottest.cpp - src/test/effectsmanagertest.cpp + #TODO: write useful tests for refactored effects system + #src/test/effectchainslottest.cpp + #src/test/effectslottest.cpp + #src/test/effectsmanagertest.cpp src/test/enginebufferscalelineartest.cpp src/test/enginebuffertest.cpp src/test/enginefilterbiquadtest.cpp @@ -1033,7 +1030,8 @@ add_executable(mixxx-test src/test/main.cpp src/test/mathutiltest.cpp src/test/metadatatest.cpp - src/test/metaknob_link_test.cpp + #TODO: make this build again + #src/test/metaknob_link_test.cpp src/test/midicontrollertest.cpp src/test/mixxxtest.cpp src/test/movinginterquartilemean_test.cpp From 9fddc15be5bfec2dc6602f43ea73772d71648929 Mon Sep 17 00:00:00 2001 From: Be Date: Wed, 1 Apr 2020 20:47:03 -0500 Subject: [PATCH 046/443] effects: move EffectChainPreset and EffectPreset to new folder --- CMakeLists.txt | 4 +- src/effects/effectchainpreset.cpp | 38 ------------------- src/effects/effectsmanager.cpp | 7 ++-- src/effects/presets/effectchainpreset.cpp | 38 +++++++++++++++++++ src/effects/{ => presets}/effectchainpreset.h | 13 ++----- src/effects/{ => presets}/effectpreset.cpp | 14 +++---- src/effects/{ => presets}/effectpreset.h | 7 +--- 7 files changed, 55 insertions(+), 66 deletions(-) delete mode 100644 src/effects/effectchainpreset.cpp create mode 100644 src/effects/presets/effectchainpreset.cpp rename src/effects/{ => presets}/effectchainpreset.h (59%) rename src/effects/{ => presets}/effectpreset.cpp (54%) rename src/effects/{ => presets}/effectpreset.h (81%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4f39eff2e0ba..233ebbcd64bc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -252,17 +252,17 @@ add_library(mixxx-lib STATIC EXCLUDE_FROM_ALL src/effects/builtin/threebandbiquadeqeffect.cpp src/effects/builtin/tremoloeffect.cpp src/effects/effectbuttonparameterslot.cpp - src/effects/effectchainpreset.cpp src/effects/effectchainslot.cpp src/effects/effectmanifest.cpp src/effects/effectmanifestparameter.cpp src/effects/effectparameter.cpp - src/effects/effectpreset.cpp src/effects/effectknobparameterslot.cpp src/effects/effectparameterslotbase.cpp src/effects/effectslot.cpp src/effects/effectsmanager.cpp src/effects/specialeffectchainslots.cpp + src/effects/presets/effectpreset.cpp + src/effects/presets/effectchainpreset.cpp src/encoder/encoder.cpp src/encoder/encoderbroadcastsettings.cpp src/encoder/encoderflacsettings.cpp diff --git a/src/effects/effectchainpreset.cpp b/src/effects/effectchainpreset.cpp deleted file mode 100644 index 94b77b3107ed..000000000000 --- a/src/effects/effectchainpreset.cpp +++ /dev/null @@ -1,38 +0,0 @@ -#include "effects/effectchainpreset.h" - -#include "effects/effectxmlelements.h" -#include "effects/effectchainslot.h" -#include "util/xml.h" - -EffectChainPreset::EffectChainPreset() { -} - -EffectChainPreset::EffectChainPreset(const QDomElement& element) { - if (!element.hasChildNodes()) { - return; - } - - m_id = XmlParse::selectNodeQString(element, EffectXml::ChainId); - m_name = XmlParse::selectNodeQString(element, EffectXml::ChainName); - m_description = XmlParse::selectNodeQString(element, EffectXml::ChainDescription); - - QString mixModeStr = XmlParse::selectNodeQString(element, EffectXml::ChainMixMode); - m_mixMode = EffectChainSlot::mixModeFromString(mixModeStr); - - m_dSuper = XmlParse::selectNodeDouble(element, EffectXml::ChainSuperParameter); - - QDomElement effectsElement = XmlParse::selectElement(element, EffectXml::EffectsRoot); - QDomNodeList effectList = effectsElement.childNodes(); - - for (int i = 0; i < effectList.count(); ++i) { - QDomNode effectNode = effectList.at(i); - if (effectNode.isElement()) { - QDomElement effectElement = effectNode.toElement(); - EffectPresetPointer pPreset(new EffectPreset(effectElement)); - m_effectPresets.append(pPreset); - } - } -} - -EffectChainPreset::~EffectChainPreset() { -} diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index c5d979187b58..742c969d9bc1 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -2,16 +2,15 @@ #include #include - #include -#include "engine/effects/engineeffectsmanager.h" -#include "effects/effectchainpreset.h" #include "effects/effectsbackend.h" #include "effects/effectslot.h" #include "effects/effectxmlelements.h" +#include "effects/presets/effectchainpreset.h" #include "engine/effects/engineeffect.h" #include "engine/effects/engineeffectchain.h" +#include "engine/effects/engineeffectsmanager.h" #include "util/assert.h" namespace { @@ -523,4 +522,4 @@ void EffectsManager::loadEffectChainPresets() { m_effectChainPresets.insert(pPreset->name(), pPreset); } } -} \ No newline at end of file +} diff --git a/src/effects/presets/effectchainpreset.cpp b/src/effects/presets/effectchainpreset.cpp new file mode 100644 index 000000000000..df0a44165c10 --- /dev/null +++ b/src/effects/presets/effectchainpreset.cpp @@ -0,0 +1,38 @@ +#include "effects/presets/effectchainpreset.h" + +#include "effects/effectchainslot.h" +#include "effects/effectxmlelements.h" +#include "util/xml.h" + +EffectChainPreset::EffectChainPreset() { +} + +EffectChainPreset::EffectChainPreset(const QDomElement& chainElement) { + if (!chainElement.hasChildNodes()) { + return; + } + + m_id = XmlParse::selectNodeQString(chainElement, EffectXml::ChainId); + m_name = XmlParse::selectNodeQString(chainElement, EffectXml::ChainName); + m_description = XmlParse::selectNodeQString(chainElement, EffectXml::ChainDescription); + + QString mixModeStr = XmlParse::selectNodeQString(chainElement, EffectXml::ChainMixMode); + m_mixMode = EffectChainSlot::mixModeFromString(mixModeStr); + + m_dSuper = XmlParse::selectNodeDouble(chainElement, EffectXml::ChainSuperParameter); + + QDomElement effectsElement = XmlParse::selectElement(chainElement, EffectXml::EffectsRoot); + QDomNodeList effectList = effectsElement.childNodes(); + + for (int i = 0; i < effectList.count(); ++i) { + QDomNode effectNode = effectList.at(i); + if (effectNode.isElement()) { + QDomElement effectElement = effectNode.toElement(); + EffectPresetPointer pPreset(new EffectPreset(effectElement)); + m_effectPresets.append(pPreset); + } + } +} + +EffectChainPreset::~EffectChainPreset() { +} diff --git a/src/effects/effectchainpreset.h b/src/effects/presets/effectchainpreset.h similarity index 59% rename from src/effects/effectchainpreset.h rename to src/effects/presets/effectchainpreset.h index bd6c324116e8..901c31e71fed 100644 --- a/src/effects/effectchainpreset.h +++ b/src/effects/presets/effectchainpreset.h @@ -1,16 +1,13 @@ -#ifndef EFFECTCHAINPRESET_H -#define EFFECTCHAINPRESET_H - +#pragma once #include #include "effects/defs.h" -#include "effects/effectpreset.h" - +#include "effects/presets/effectpreset.h" class EffectChainPreset { public: EffectChainPreset(); - EffectChainPreset(const QDomElement& element); + EffectChainPreset(const QDomElement& chainElement); ~EffectChainPreset(); QString name() const { @@ -23,7 +20,5 @@ class EffectChainPreset { QString m_description; double m_dSuper; EffectChainMixMode m_mixMode; - QList m_effectPresets; + QList m_effectPresets; }; - -#endif /* EFFECTCHAINPRESET_H */ \ No newline at end of file diff --git a/src/effects/effectpreset.cpp b/src/effects/presets/effectpreset.cpp similarity index 54% rename from src/effects/effectpreset.cpp rename to src/effects/presets/effectpreset.cpp index d3734cf194ee..e5fe29cca22c 100644 --- a/src/effects/effectpreset.cpp +++ b/src/effects/presets/effectpreset.cpp @@ -1,4 +1,4 @@ -#include "effects/effectpreset.h" +#include "effects/presets/effectpreset.h" #include "effects/effectxmlelements.h" #include "util/xml.h" @@ -6,16 +6,16 @@ EffectPreset::EffectPreset() { } -EffectPreset::EffectPreset(const QDomElement& element) { - if (!element.hasChildNodes()) { +EffectPreset::EffectPreset(const QDomElement& effectElement) { + if (!effectElement.hasChildNodes()) { return; } - m_id = XmlParse::selectNodeQString(element, EffectXml::EffectId); - m_version = XmlParse::selectNodeQString(element, EffectXml::EffectVersion); - m_dMetaParameter = XmlParse::selectNodeDouble(element, EffectXml::EffectMetaParameter); + m_id = XmlParse::selectNodeQString(effectElement, EffectXml::EffectId); + m_version = XmlParse::selectNodeQString(effectElement, EffectXml::EffectVersion); + m_dMetaParameter = XmlParse::selectNodeDouble(effectElement, EffectXml::EffectMetaParameter); - QDomElement parametersElement = XmlParse::selectElement(element, EffectXml::ParametersRoot); + QDomElement parametersElement = XmlParse::selectElement(effectElement, EffectXml::ParametersRoot); QDomNodeList parametersList = parametersElement.childNodes(); for (int i = 0; i < parametersList.count(); ++i) { diff --git a/src/effects/effectpreset.h b/src/effects/presets/effectpreset.h similarity index 81% rename from src/effects/effectpreset.h rename to src/effects/presets/effectpreset.h index 1cf6d4e5496b..070141d0e2d6 100644 --- a/src/effects/effectpreset.h +++ b/src/effects/presets/effectpreset.h @@ -1,11 +1,8 @@ -#ifndef EFFECTPRESET_H -#define EFFECTPRESET_H - +#pragma once #include #include "effects/defs.h" - class EffectPreset { public: EffectPreset(); @@ -19,5 +16,3 @@ class EffectPreset { // QList m_effectParameterPresets; }; - -#endif /* EFFECTPRESET_H */ \ No newline at end of file From d9dd4b29df4c3129c0ea4e190efe97fb243840ad Mon Sep 17 00:00:00 2001 From: Be Date: Wed, 1 Apr 2020 20:50:35 -0500 Subject: [PATCH 047/443] add EffectParameterPreset class --- CMakeLists.txt | 1 + src/effects/effectxmlelements.h | 1 + src/effects/presets/effectparameterpreset.cpp | 33 +++++++++++++++++++ src/effects/presets/effectparameterpreset.h | 20 +++++++++++ src/effects/presets/effectpreset.cpp | 4 +-- src/effects/presets/effectpreset.h | 3 +- src/util/xml.cpp | 6 ++++ src/util/xml.h | 7 ++++ 8 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 src/effects/presets/effectparameterpreset.cpp create mode 100644 src/effects/presets/effectparameterpreset.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 233ebbcd64bc..4e8174cc1f03 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -263,6 +263,7 @@ add_library(mixxx-lib STATIC EXCLUDE_FROM_ALL src/effects/specialeffectchainslots.cpp src/effects/presets/effectpreset.cpp src/effects/presets/effectchainpreset.cpp + src/effects/presets/effectparameterpreset.cpp src/encoder/encoder.cpp src/encoder/encoderbroadcastsettings.cpp src/encoder/encoderflacsettings.cpp diff --git a/src/effects/effectxmlelements.h b/src/effects/effectxmlelements.h index 03c373efc6ec..bb33d50e36c1 100644 --- a/src/effects/effectxmlelements.h +++ b/src/effects/effectxmlelements.h @@ -29,4 +29,5 @@ const QString ParameterId("Id"); const QString ParameterValue("Value"); const QString ParameterLinkType("LinkType"); const QString ParameterLinkInversion("LinkInversion"); +const QString ParameterHidden("Hidden"); } diff --git a/src/effects/presets/effectparameterpreset.cpp b/src/effects/presets/effectparameterpreset.cpp new file mode 100644 index 000000000000..a7b99e19f7b7 --- /dev/null +++ b/src/effects/presets/effectparameterpreset.cpp @@ -0,0 +1,33 @@ +#include "effects/presets/effectparameterpreset.h" + +#include "effects/effectxmlelements.h" +#include "util/xml.h" + +EffectParameterPreset::EffectParameterPreset() { +} + +EffectParameterPreset::EffectParameterPreset(const QDomElement& parameterElement) { + if (!parameterElement.hasChildNodes()) { + m_dValue = 0.0; + m_id = QString(); + m_linkType = EffectManifestParameter::LinkType::NONE; + } else { + bool conversionWorked = false; + m_dValue = XmlParse::selectNodeDouble(parameterElement, + EffectXml::ParameterValue, + &conversionWorked); + + m_linkType = EffectManifestParameter::LinkTypeFromString( + XmlParse::selectNodeQString(parameterElement, + EffectXml::ParameterLinkType)); + + m_bLinkInverted = XmlParse::selectNodeBool(parameterElement, + EffectXml::ParameterLinkInversion); + + m_bHidden = XmlParse::selectNodeBool(parameterElement, + EffectXml::ParameterHidden); + } +} + +EffectParameterPreset::~EffectParameterPreset() { +} diff --git a/src/effects/presets/effectparameterpreset.h b/src/effects/presets/effectparameterpreset.h new file mode 100644 index 000000000000..64a505f515de --- /dev/null +++ b/src/effects/presets/effectparameterpreset.h @@ -0,0 +1,20 @@ +#pragma once + +#include + +#include "effects/defs.h" +#include "effects/effectmanifestparameter.h" + +class EffectParameterPreset { + public: + EffectParameterPreset(); + EffectParameterPreset(const QDomElement& parameterElement); + ~EffectParameterPreset(); + + private: + double m_dValue; + QString m_id; + EffectManifestParameter::LinkType m_linkType; + bool m_bLinkInverted; + bool m_bHidden; +}; diff --git a/src/effects/presets/effectpreset.cpp b/src/effects/presets/effectpreset.cpp index e5fe29cca22c..8e220491e5b5 100644 --- a/src/effects/presets/effectpreset.cpp +++ b/src/effects/presets/effectpreset.cpp @@ -22,8 +22,8 @@ EffectPreset::EffectPreset(const QDomElement& effectElement) { QDomNode parameterNode = parametersList.at(i); if (parameterNode.isElement()) { QDomElement parameterElement = parameterNode.toElement(); - // EffectParameterPresetPointer pPreset(new EffectParameterPreset(parameterElement)); - // m_effectParameterPresets.append(pPreset); + EffectParameterPreset parameterPreset(parameterElement); + m_effectParameterPresets.append(parameterElement); } } } diff --git a/src/effects/presets/effectpreset.h b/src/effects/presets/effectpreset.h index 070141d0e2d6..f1e9a359948f 100644 --- a/src/effects/presets/effectpreset.h +++ b/src/effects/presets/effectpreset.h @@ -2,6 +2,7 @@ #include #include "effects/defs.h" +#include "effects/presets/effectparameterpreset.h" class EffectPreset { public: @@ -14,5 +15,5 @@ class EffectPreset { QString m_version; double m_dMetaParameter; - // QList m_effectParameterPresets; + QList m_effectParameterPresets; }; diff --git a/src/util/xml.cpp b/src/util/xml.cpp index 98f8b51062eb..db9281f6d32f 100644 --- a/src/util/xml.cpp +++ b/src/util/xml.cpp @@ -19,6 +19,12 @@ double XmlParse::selectNodeDouble(const QDomNode& nodeHeader, return selectNode(nodeHeader, sNode).toElement().text().toDouble(ok); } +bool XmlParse::selectNodeBool(const QDomNode& nodeHeader, + const QString& sNode, + bool* ok) { + return selectNode(nodeHeader, sNode).toElement().text().toDouble(ok); +} + QDomNode XmlParse::selectNode(const QDomNode& nodeHeader, const QString& sNode) { QDomNode node = nodeHeader.firstChild(); diff --git a/src/util/xml.h b/src/util/xml.h index b736edb6fe5d..40068ba9a26d 100644 --- a/src/util/xml.h +++ b/src/util/xml.h @@ -35,6 +35,13 @@ class XmlParse { static double selectNodeDouble(const QDomNode& nodeHeader, const QString& sNode, bool* ok = 0); + // Searches for an element named sNode in the children of nodeHeader and + // parses the text value of its children as a bool. Returns false if sNode + // is not found in nodeHeader's children. + static bool selectNodeBool(const QDomNode& nodeHeader, + const QString& sNode, + bool* ok = 0); + // Searches for an element named sNode in the children of nodeHeader and // returns the text value of its children. Returns the empty string if sNode // is not found in nodeHeader's children. From 15c3ac562d64bf4be247cf596109718fbed1d63c Mon Sep 17 00:00:00 2001 From: Be Date: Thu, 2 Apr 2020 18:09:17 -0500 Subject: [PATCH 048/443] LV2EffectManifest: handle nan min/max/default values --- src/effects/lv2/lv2manifest.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/effects/lv2/lv2manifest.cpp b/src/effects/lv2/lv2manifest.cpp index eab902db3f03..69529eab987c 100644 --- a/src/effects/lv2/lv2manifest.cpp +++ b/src/effects/lv2/lv2manifest.cpp @@ -51,6 +51,9 @@ LV2Manifest::LV2Manifest(const LilvPlugin* plug, if (lilv_port_is_a(m_pLV2plugin, port, properties["control_port"]) && !lilv_port_has_property(m_pLV2plugin, port, properties["enumeration_port"]) && !lilv_port_has_property(m_pLV2plugin, port, properties["button_port"])) { + if (isnan(m_minimum[i]) || isnan(m_maximum[i])) { + continue; + } controlPortIndices.append(i); EffectManifestParameterPointer param = addParameter(); @@ -67,6 +70,9 @@ LV2Manifest::LV2Manifest(const LilvPlugin* plug, param->setSemanticHint(EffectManifestParameter::SemanticHint::UNKNOWN); param->setUnitsHint(EffectManifestParameter::UnitsHint::UNKNOWN); + if (isnan(m_default[i]) || m_default[i] < m_minimum[i] || m_default[i] > m_maximum[i]) { + m_default[i] = m_minimum[i]; + } param->setRange(m_minimum[i], m_default[i], m_maximum[i]); // Set the appropriate Hints From 6ed410276d5c6e5417d1f7b41d4c73f87a43dc0a Mon Sep 17 00:00:00 2001 From: Be Date: Thu, 2 Apr 2020 18:29:01 -0500 Subject: [PATCH 049/443] remove hacks for hiding LV2 effect parameters This will be replaced by the EffectPreset system with the ability to set custom defaults for any effect, not just LV2 effects. --- src/effects/effectchainslot.cpp | 18 ------------------ src/effects/effectchainslot.h | 5 ----- src/effects/effectslot.cpp | 21 --------------------- src/effects/effectslot.h | 4 ---- src/effects/effectsmanager.cpp | 26 -------------------------- src/effects/effectsmanager.h | 5 ----- src/preferences/dialog/dlgpreflv2.cpp | 11 ----------- 7 files changed, 90 deletions(-) diff --git a/src/effects/effectchainslot.cpp b/src/effects/effectchainslot.cpp index 67d62976022d..bedadcbf5385 100644 --- a/src/effects/effectchainslot.cpp +++ b/src/effects/effectchainslot.cpp @@ -195,24 +195,6 @@ void EffectChainSlot::loadEffect(const unsigned int iEffectSlotNumber, m_enabledInputChannels); } -void EffectChainSlot::hideEffectParameter(EffectManifestPointer pManifest, - const unsigned int position) { - for (EffectSlotPointer pEffectSlot : m_effectSlots) { - if (pEffectSlot->getManifest() == pManifest) { - pEffectSlot->hideEffectParameter(position); - } - } -} - -void EffectChainSlot::setEffectParameterPosition(EffectManifestPointer pManifest, - const unsigned int parameterId, const unsigned int position) { - for (EffectSlotPointer pEffectSlot : m_effectSlots) { - if (pEffectSlot->getManifest() == pManifest) { - pEffectSlot->setEffectParameterPosition(parameterId, position); - } - } -} - void EffectChainSlot::sendParameterUpdate() { EffectsRequest* pRequest = new EffectsRequest(); pRequest->type = EffectsRequest::SET_EFFECT_CHAIN_PARAMETERS; diff --git a/src/effects/effectchainslot.h b/src/effects/effectchainslot.h index 3325d790d5cb..ec8e76db1f6d 100644 --- a/src/effects/effectchainslot.h +++ b/src/effects/effectchainslot.h @@ -84,11 +84,6 @@ class EffectChainSlot : public QObject { const EffectManifestPointer pManifest, std::unique_ptr pProcessor); - // TODO : Remove these functions once the GUI for parameter rearrangement is implemented - void hideEffectParameter(EffectManifestPointer pManifest, - const unsigned int position); - void setEffectParameterPosition(EffectManifestPointer pManifest, - const unsigned int parameterId, const unsigned int position); signals: // Signal that whoever is in charge of this EffectChainSlot should load the diff --git a/src/effects/effectslot.cpp b/src/effects/effectslot.cpp index adf6d30b57cf..0aecf0d65cdd 100644 --- a/src/effects/effectslot.cpp +++ b/src/effects/effectslot.cpp @@ -343,27 +343,6 @@ void EffectSlot::loadParameters() { } } -void EffectSlot::hideEffectParameter(const unsigned int parameterId) { - for (auto& parameterMapping : m_mapForParameterType) { - parameterMapping.removeAll(parameterId); - } - - loadParameters(); -} - -void EffectSlot::setEffectParameterPosition(const unsigned int parameterId, - const unsigned int position) { - for (auto& parameterMapping : m_mapForParameterType) { - parameterMapping.removeAll(parameterId); - } - - auto pParameter = m_parameters.at(parameterId); - if (pParameter) { - m_mapForParameterType[pParameter->manifest()->parameterType()].insert(position, parameterId); - loadParameters(); - } -} - void EffectSlot::slotPrevEffect(double v) { if (v > 0) { slotEffectSelector(-1); diff --git a/src/effects/effectslot.h b/src/effects/effectslot.h index a14a7cdc3ee4..0a7bb21bf71c 100644 --- a/src/effects/effectslot.h +++ b/src/effects/effectslot.h @@ -82,10 +82,6 @@ class EffectSlot : public QObject { const QSet& activeInputChannels); void removeFromEngine(); - void hideEffectParameter(const unsigned int parameterId); - void setEffectParameterPosition(const unsigned int parameterId, - const unsigned int position); - public slots: void setMetaParameter(double v, bool force = false); diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index 742c969d9bc1..12989b3329a0 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -391,32 +391,6 @@ void EffectsManager::setup() { addOutputEffectChainSlot(); } -void EffectsManager::setEffectParameterPosition(EffectManifestPointer pManifest, - const unsigned int parameterId, const unsigned int position) { - for (auto& pChainSlot : m_standardEffectChainSlots) { - pChainSlot->setEffectParameterPosition(pManifest, parameterId, position); - } - for (auto& pChainSlot : m_equalizerEffectChainSlots) { - pChainSlot->setEffectParameterPosition(pManifest, parameterId, position); - } - for (auto& pChainSlot : m_quickEffectChainSlots) { - pChainSlot->setEffectParameterPosition(pManifest, parameterId, position); - } -} - -void EffectsManager::hideEffectParameter(EffectManifestPointer pManifest, - const unsigned int position) { - for (auto& pChainSlot : m_standardEffectChainSlots) { - pChainSlot->hideEffectParameter(pManifest, position); - } - for (auto& pChainSlot : m_equalizerEffectChainSlots) { - pChainSlot->hideEffectParameter(pManifest, position); - } - for (auto& pChainSlot : m_quickEffectChainSlots) { - pChainSlot->hideEffectParameter(pManifest, position); - } -} - bool EffectsManager::writeRequest(EffectsRequest* request) { if (m_underDestruction) { // Catch all delete Messages since the engine is already down diff --git a/src/effects/effectsmanager.h b/src/effects/effectsmanager.h index 06d7c9260991..1f0c69b44d5c 100644 --- a/src/effects/effectsmanager.h +++ b/src/effects/effectsmanager.h @@ -136,11 +136,6 @@ class EffectsManager : public QObject { void setup(); - // TODO : Remove these functions once the GUI for parameter rearrangement is implemented - void hideEffectParameter(EffectManifestPointer pManifest, const unsigned int position); - void setEffectParameterPosition(EffectManifestPointer pManifest, - const unsigned int parameterId, const unsigned int position); - // Write an EffectsRequest to the EngineEffectsManager. EffectsManager takes // ownership of request and deletes it once a response is received. bool writeRequest(EffectsRequest* request); diff --git a/src/preferences/dialog/dlgpreflv2.cpp b/src/preferences/dialog/dlgpreflv2.cpp index deab056f4c3c..4ff1c137e813 100644 --- a/src/preferences/dialog/dlgpreflv2.cpp +++ b/src/preferences/dialog/dlgpreflv2.cpp @@ -117,17 +117,6 @@ void DlgPrefLV2::slotApply() { EffectManifestPointer pCurrentEffectManifest = m_pLV2Backend->getManifest(m_currentEffectId); - - qDebug() << "DlgPrefLV2::slotApply" << pCurrentEffectManifest.data(); - unsigned int position = 0; - for (int i = 0; i < m_pluginParameters.size(); i++) { - if (m_pluginParameters[i]->isChecked()) { - m_pEffectsManager->setEffectParameterPosition(pCurrentEffectManifest, i, position); - ++position; - } else { - m_pEffectsManager->hideEffectParameter(pCurrentEffectManifest, i); - } - } } void DlgPrefLV2::slotUpdateOnParameterCheck(int state) { From 36c8f18a839e2b55e05cb13887a2ec8cb8e853bf Mon Sep 17 00:00:00 2001 From: Be Date: Thu, 2 Apr 2020 18:43:11 -0500 Subject: [PATCH 050/443] remove DlgPrefLV2 The only use of DlgPrefLV2 was hiding effect parameters, which will be reimplemented with EffectPresets in a more flexible way that can be used for all effects. --- CMakeLists.txt | 2 - build/depends.py | 1 - build/features.py | 5 +- src/mixxx.cpp | 6 +- src/preferences/dialog/dlgpreferences.cpp | 23 ------ src/preferences/dialog/dlgpreferences.h | 11 --- src/preferences/dialog/dlgpreflv2.h | 36 --------- src/preferences/dialog/dlgpreflv2dlg.ui | 91 ----------------------- 8 files changed, 3 insertions(+), 172 deletions(-) delete mode 100644 src/preferences/dialog/dlgpreflv2.h delete mode 100644 src/preferences/dialog/dlgpreflv2dlg.ui diff --git a/CMakeLists.txt b/CMakeLists.txt index 4e8174cc1f03..4bd7aeb14e6a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -482,7 +482,6 @@ add_library(mixxx-lib STATIC EXCLUDE_FROM_ALL src/preferences/dialog/dlgprefkeydlg.ui src/preferences/dialog/dlgpreflibrary.cpp src/preferences/dialog/dlgpreflibrarydlg.ui - src/preferences/dialog/dlgpreflv2dlg.ui src/preferences/dialog/dlgprefnovinyl.cpp src/preferences/dialog/dlgprefnovinyldlg.ui src/preferences/dialog/dlgprefrecord.cpp @@ -1809,7 +1808,6 @@ if(LILV) src/effects/lv2/lv2backend.cpp src/effects/lv2/lv2effectprocessor.cpp src/effects/lv2/lv2manifest.cpp - src/preferences/dialog/dlgpreflv2.cpp ) target_compile_definitions(mixxx-lib PUBLIC __LILV__) target_link_libraries(mixxx-lib PUBLIC Lilv::Lilv) diff --git a/build/depends.py b/build/depends.py index 08aa1be75e70..0525dcc5ce66 100644 --- a/build/depends.py +++ b/build/depends.py @@ -1351,7 +1351,6 @@ def sources(self, build): 'src/preferences/dialog/dlgprefdeckdlg.ui', 'src/preferences/dialog/dlgprefcolorsdlg.ui', 'src/preferences/dialog/dlgprefcrossfaderdlg.ui', - 'src/preferences/dialog/dlgpreflv2dlg.ui', 'src/preferences/dialog/dlgprefeffectsdlg.ui', 'src/preferences/dialog/dlgprefeqdlg.ui', 'src/preferences/dialog/dlgpreferencesdlg.ui', diff --git a/build/features.py b/build/features.py index 993d6a2824bb..0dcdf75d95d1 100644 --- a/build/features.py +++ b/build/features.py @@ -707,7 +707,7 @@ def configure(self, build, conf): # https://bugs.launchpad.net/mixxx/+bug/1833225 if not conf.CheckForPKG('shout', '2.4.4'): self.INTERNAL_LINK = True - + if not self.INTERNAL_LINK: self.INTERNAL_LINK = not conf.CheckLib(['libshout', 'shout']) @@ -1171,8 +1171,7 @@ def configure(self, build, conf): def sources(self, build): return ['src/effects/lv2/lv2backend.cpp', 'src/effects/lv2/lv2effectprocessor.cpp', - 'src/effects/lv2/lv2manifest.cpp', - 'src/preferences/dialog/dlgpreflv2.cpp'] + 'src/effects/lv2/lv2manifest.cpp'] class Battery(Feature): def description(self): diff --git a/src/mixxx.cpp b/src/mixxx.cpp index 341dba703f42..8ceafeaf0d64 100644 --- a/src/mixxx.cpp +++ b/src/mixxx.cpp @@ -264,8 +264,6 @@ void MixxxMainWindow::initialize(QApplication* pApp, const CmdlineArgs& args) { #ifdef __LILV__ LV2Backend* pLV2Backend = new LV2Backend(); m_pEffectsManager->addEffectsBackend(EffectsBackendPointer(pLV2Backend)); -#else - LV2Backend* pLV2Backend = nullptr; #endif launchProgress(8); @@ -458,9 +456,7 @@ void MixxxMainWindow::initialize(QApplication* pApp, const CmdlineArgs& args) { } // Initialize preference dialog - m_pPrefDlg = new DlgPreferences(this, m_pSkinLoader, m_pSoundManager, m_pPlayerManager, - m_pControllerManager, m_pVCManager, pLV2Backend, m_pEffectsManager, - m_pSettingsManager, m_pLibrary); + m_pPrefDlg = new DlgPreferences(this, m_pSkinLoader, m_pSoundManager, m_pPlayerManager, m_pControllerManager, m_pVCManager, m_pEffectsManager, m_pSettingsManager, m_pLibrary); m_pPrefDlg->setWindowIcon(QIcon(":/images/mixxx_icon.svg")); m_pPrefDlg->setHidden(true); diff --git a/src/preferences/dialog/dlgpreferences.cpp b/src/preferences/dialog/dlgpreferences.cpp index 61b7b1828e67..ebd5a6b542ed 100644 --- a/src/preferences/dialog/dlgpreferences.cpp +++ b/src/preferences/dialog/dlgpreferences.cpp @@ -43,9 +43,6 @@ #include "preferences/dialog/dlgprefeq.h" #include "preferences/dialog/dlgprefinterface.h" #include "preferences/dialog/dlgprefwaveform.h" -#ifdef __LILV__ -#include "preferences/dialog/dlgpreflv2.h" -#endif /* __LILV__ */ #include "preferences/dialog/dlgprefeffects.h" #include "preferences/dialog/dlgprefautodj.h" @@ -72,15 +69,11 @@ DlgPreferences::DlgPreferences(MixxxMainWindow * mixxx, SkinLoader* pSkinLoader, SoundManager * soundman, PlayerManager* pPlayerManager, ControllerManager * controllers, VinylControlManager *pVCManager, - LV2Backend* pLV2Backend, EffectsManager* pEffectsManager, SettingsManager* pSettingsManager, Library *pLibrary) : m_pConfig(pSettingsManager->settings()), m_pageSizeHint(QSize(0, 0)) { -#ifndef __LILV__ - Q_UNUSED(pLV2Backend); -#endif /* __LILV__ */ setupUi(this); contentsTreeWidget->setHeaderHidden(true); @@ -130,10 +123,6 @@ DlgPreferences::DlgPreferences(MixxxMainWindow * mixxx, SkinLoader* pSkinLoader, addPageWidget(m_crossfaderPage); m_effectsPage = new DlgPrefEffects(this, m_pConfig, pEffectsManager); addPageWidget(m_effectsPage); -#ifdef __LILV__ - m_lv2Page = new DlgPrefLV2(this, pLV2Backend, m_pConfig, pEffectsManager); - addPageWidget(m_lv2Page); -#endif /* __LILV__ */ m_autoDjPage = new DlgPrefAutoDJ(this, m_pConfig); addPageWidget(m_autoDjPage); @@ -261,14 +250,6 @@ void DlgPreferences::createIcons() { m_pEffectsButton->setTextAlignment(0, Qt::AlignLeft | Qt::AlignVCenter); m_pEffectsButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); -#ifdef __LILV__ - m_pLV2Button = new QTreeWidgetItem(contentsTreeWidget, QTreeWidgetItem::Type); - m_pLV2Button->setIcon(0, QIcon(":/images/preferences/ic_preferences_lv2.svg")); - m_pLV2Button->setText(0, tr("LV2 Plugins")); - m_pLV2Button->setTextAlignment(0, Qt::AlignLeft | Qt::AlignVCenter); - m_pLV2Button->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); -#endif /* __LILV__ */ - m_pAutoDJButton = new QTreeWidgetItem(contentsTreeWidget, QTreeWidgetItem::Type); m_pAutoDJButton->setIcon(0, QIcon(":/images/preferences/ic_preferences_autodj.svg")); m_pAutoDJButton->setText(0, tr("Auto DJ")); @@ -351,10 +332,6 @@ void DlgPreferences::changePage(QTreeWidgetItem* current, QTreeWidgetItem* previ switchToPage(m_crossfaderPage); } else if (current == m_pEffectsButton) { switchToPage(m_effectsPage); -#ifdef __LILV__ - } else if (current == m_pLV2Button) { - switchToPage(m_lv2Page); -#endif /* __LILV__ */ } else if (current == m_pAutoDJButton) { switchToPage(m_autoDjPage); #ifdef __BROADCAST__ diff --git a/src/preferences/dialog/dlgpreferences.h b/src/preferences/dialog/dlgpreferences.h index aa1972f4bd9e..fdabe0afd308 100644 --- a/src/preferences/dialog/dlgpreferences.h +++ b/src/preferences/dialog/dlgpreferences.h @@ -50,10 +50,6 @@ class DlgPrefRecord; class DlgPrefBeats; class DlgPrefKey; class DlgPrefReplayGain; -#ifdef __LILV__ -class DlgPrefLV2; -#endif /* __LILV__ */ -class LV2Backend; class ControllerManager; class EffectsManager; class SkinLoader; @@ -73,7 +69,6 @@ class DlgPreferences : public QDialog, public Ui::DlgPreferencesDlg { PlayerManager* pPlayerManager, ControllerManager* controllers, VinylControlManager* pVCManager, - LV2Backend* pLV2Backend, EffectsManager* pEffectsManager, SettingsManager* pSettingsManager, Library* pLibrary); @@ -131,9 +126,6 @@ class DlgPreferences : public QDialog, public Ui::DlgPreferencesDlg { DlgPrefBeats* m_beatgridPage; DlgPrefKey* m_musicalKeyPage; DlgPrefReplayGain* m_replayGainPage; -#ifdef __LILV__ - DlgPrefLV2* m_lv2Page; -#endif /* __LILV__ */ #ifdef __MODPLUG__ DlgPrefModplug* m_modplugPage; #endif @@ -147,9 +139,6 @@ class DlgPreferences : public QDialog, public Ui::DlgPreferencesDlg { QTreeWidgetItem* m_pDecksButton; QTreeWidgetItem* m_pColorsButton; QTreeWidgetItem* m_pEqButton; -#ifdef __LILV__ - QTreeWidgetItem* m_pLV2Button; -#endif /* __LILV__ */ QTreeWidgetItem* m_pEffectsButton; QTreeWidgetItem* m_pCrossfaderButton; //QTreeWidgetItem* m_pEffectsButton; diff --git a/src/preferences/dialog/dlgpreflv2.h b/src/preferences/dialog/dlgpreflv2.h deleted file mode 100644 index fc4b1f4e580e..000000000000 --- a/src/preferences/dialog/dlgpreflv2.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef DLGPREFLV2_H -#define DLGPREFLV2_H - -#include -#include - -#include "preferences/dialog/ui_dlgpreflv2dlg.h" -#include "preferences/usersettings.h" -#include "preferences/dlgpreferencepage.h" -#include "effects/lv2/lv2backend.h" - -class EffectsManager; - -class DlgPrefLV2 : public DlgPreferencePage, public Ui::DlgPrefLV2Dlg { - Q_OBJECT - public: - DlgPrefLV2(QWidget *parent, LV2Backend* lv2Backend, - UserSettingsPointer pConfig, EffectsManager* pEffectsManager); - virtual ~DlgPrefLV2(); - - public slots: - void slotApply(); - - private slots: - void slotDisplayParameters(); - void slotUpdateOnParameterCheck(int state); - - private: - LV2Backend* m_pLV2Backend; - QString m_currentEffectId; - QList m_pluginParameters; - int m_iCheckedParameters; - EffectsManager* m_pEffectsManager; -}; - -#endif diff --git a/src/preferences/dialog/dlgpreflv2dlg.ui b/src/preferences/dialog/dlgpreflv2dlg.ui deleted file mode 100644 index de2d237b4f45..000000000000 --- a/src/preferences/dialog/dlgpreflv2dlg.ui +++ /dev/null @@ -1,91 +0,0 @@ - - - DlgPrefLV2Dlg - - - - 0 - 0 - 529 - 434 - - - - Equalizer Preferences - - - - - - - - - - - 75 - true - - - - Discovered LV2 effects - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop - - - - - - - - - - - Qt::Horizontal - - - QSizePolicy::Maximum - - - - 40 - 20 - - - - - - - - - - - - - 0 - 0 - - - - - 75 - true - - - - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop - - - - - - - - - - - - - From d0192ba7759eed1c3db6fe09b1520e98598f1734 Mon Sep 17 00:00:00 2001 From: Be Date: Thu, 2 Apr 2020 18:56:46 -0500 Subject: [PATCH 051/443] EffectsBackend: add getManifests method so manifests can be iterated over for each backend --- src/effects/builtin/builtinbackend.cpp | 7 +++++++ src/effects/builtin/builtinbackend.h | 1 + src/effects/effectsbackend.h | 1 + src/effects/lv2/lv2backend.cpp | 8 ++++++++ src/effects/lv2/lv2backend.h | 1 + 5 files changed, 18 insertions(+) diff --git a/src/effects/builtin/builtinbackend.cpp b/src/effects/builtin/builtinbackend.cpp index 0f3c98ae4d26..47cd5d94de19 100644 --- a/src/effects/builtin/builtinbackend.cpp +++ b/src/effects/builtin/builtinbackend.cpp @@ -92,6 +92,13 @@ EffectManifestPointer BuiltInBackend::getManifest(const QString& effectId) const return m_registeredEffects.value(effectId).manifest(); } +const QList BuiltInBackend::getManifests() const { + QList list; + for (const auto& registeredEffect : m_registeredEffects) { + list.append(registeredEffect.manifest()); + } + return list; +} bool BuiltInBackend::canInstantiateEffect(const QString& effectId) const { return m_registeredEffects.contains(effectId); diff --git a/src/effects/builtin/builtinbackend.h b/src/effects/builtin/builtinbackend.h index 3f2602a4b1f9..31d15146bbb5 100644 --- a/src/effects/builtin/builtinbackend.h +++ b/src/effects/builtin/builtinbackend.h @@ -13,6 +13,7 @@ class BuiltInBackend : public EffectsBackend { const QList getEffectIds() const; EffectManifestPointer getManifest(const QString& effectId) const; + const QList getManifests() const; std::unique_ptr createProcessor( const EffectManifestPointer pManifest) const; bool canInstantiateEffect(const QString& effectId) const; diff --git a/src/effects/effectsbackend.h b/src/effects/effectsbackend.h index 770985cf6005..49d6f4642418 100644 --- a/src/effects/effectsbackend.h +++ b/src/effects/effectsbackend.h @@ -24,6 +24,7 @@ class EffectsBackend { // returns a list sorted like it should be displayed in the GUI virtual const QList getEffectIds() const = 0; virtual EffectManifestPointer getManifest(const QString& effectId) const = 0; + virtual const QList getManifests() const = 0; virtual bool canInstantiateEffect(const QString& effectId) const = 0; virtual std::unique_ptr createProcessor( diff --git a/src/effects/lv2/lv2backend.cpp b/src/effects/lv2/lv2backend.cpp index 0f13b2d4d595..6922b38498e5 100644 --- a/src/effects/lv2/lv2backend.cpp +++ b/src/effects/lv2/lv2backend.cpp @@ -74,6 +74,14 @@ EffectManifestPointer LV2Backend::getManifest(const QString& effectId) const { return m_registeredEffects.value(effectId); } +const QList LV2Backend::getManifests() const { + QList list; + for (const auto& manifest : m_registeredEffects) { + list.append(manifest); + } + return list; +} + std::unique_ptr LV2Backend::createProcessor( const EffectManifestPointer pManifest) const { LV2EffectManifestPointer pLV2Manifest = m_registeredEffects.value(pManifest->id()); diff --git a/src/effects/lv2/lv2backend.h b/src/effects/lv2/lv2backend.h index 3b9062b9ddad..bfa7503d8f5b 100644 --- a/src/effects/lv2/lv2backend.h +++ b/src/effects/lv2/lv2backend.h @@ -17,6 +17,7 @@ class LV2Backend : public EffectsBackend { const QList getEffectIds() const; const QSet getDiscoveredPluginIds() const; EffectManifestPointer getManifest(const QString& effectId) const; + const QList getManifests() const; LV2EffectManifestPointer getLV2Manifest(const QString& effectId) const; std::unique_ptr createProcessor( const EffectManifestPointer pManifest) const; From f19ed2e5eaf5cd6bd2d684458502b68c0615613f Mon Sep 17 00:00:00 2001 From: Be Date: Thu, 2 Apr 2020 19:41:51 -0500 Subject: [PATCH 052/443] EffectPreset: track effect backend type --- src/effects/effectsbackend.h | 18 ++++++++++++++++++ src/effects/effectxmlelements.h | 2 +- src/effects/presets/effectpreset.cpp | 5 ++++- src/effects/presets/effectpreset.h | 2 +- 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/effects/effectsbackend.h b/src/effects/effectsbackend.h index 49d6f4642418..a9b462000a39 100644 --- a/src/effects/effectsbackend.h +++ b/src/effects/effectsbackend.h @@ -29,6 +29,24 @@ class EffectsBackend { virtual std::unique_ptr createProcessor( const EffectManifestPointer pManifest) const = 0; + + static EffectBackendType backendTypeFromString(const QString& string) { + if (string == "LV2") { + return EffectBackendType::LV2; + } else { + return EffectBackendType::BuiltIn; + } + } + + static QString backendTypeToString(EffectBackendType backendType) { + if (backendType == EffectBackendType::BuiltIn) { + return "BuiltIn"; + } else if (backendType == EffectBackendType::LV2) { + return "LV2"; + } else { + return "Unknown"; + } + } }; #endif /* EFFECTSBACKEND_H */ diff --git a/src/effects/effectxmlelements.h b/src/effects/effectxmlelements.h index bb33d50e36c1..99ce13ecc7e8 100644 --- a/src/effects/effectxmlelements.h +++ b/src/effects/effectxmlelements.h @@ -21,7 +21,7 @@ const QString EffectsRoot("Effects"); const QString Effect("Effect"); const QString EffectMetaParameter("MetaParameterValue"); const QString EffectId("Id"); -const QString EffectVersion("Version"); +const QString EffectBackendType("BackendType"); const QString ParametersRoot("Parameters"); const QString Parameter("Parameter"); diff --git a/src/effects/presets/effectpreset.cpp b/src/effects/presets/effectpreset.cpp index 8e220491e5b5..f28d192996ca 100644 --- a/src/effects/presets/effectpreset.cpp +++ b/src/effects/presets/effectpreset.cpp @@ -1,5 +1,6 @@ #include "effects/presets/effectpreset.h" +#include "effects/effectsbackend.h" #include "effects/effectxmlelements.h" #include "util/xml.h" @@ -12,7 +13,9 @@ EffectPreset::EffectPreset(const QDomElement& effectElement) { } m_id = XmlParse::selectNodeQString(effectElement, EffectXml::EffectId); - m_version = XmlParse::selectNodeQString(effectElement, EffectXml::EffectVersion); + m_backendType = EffectsBackend::backendTypeFromString( + XmlParse::selectNodeQString(effectElement, + EffectXml::EffectBackendType)); m_dMetaParameter = XmlParse::selectNodeDouble(effectElement, EffectXml::EffectMetaParameter); QDomElement parametersElement = XmlParse::selectElement(effectElement, EffectXml::ParametersRoot); diff --git a/src/effects/presets/effectpreset.h b/src/effects/presets/effectpreset.h index f1e9a359948f..83d9e2d01ca6 100644 --- a/src/effects/presets/effectpreset.h +++ b/src/effects/presets/effectpreset.h @@ -12,7 +12,7 @@ class EffectPreset { private: QString m_id; - QString m_version; + EffectBackendType m_backendType; double m_dMetaParameter; QList m_effectParameterPresets; From 2c7ef6f67cd124fd1df90b50ec9c7ab107a74415 Mon Sep 17 00:00:00 2001 From: Be Date: Thu, 2 Apr 2020 19:45:45 -0500 Subject: [PATCH 053/443] EffectParameterPreset: use LinkInversion type instead of bool --- src/effects/presets/effectparameterpreset.cpp | 5 +++-- src/effects/presets/effectparameterpreset.h | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/effects/presets/effectparameterpreset.cpp b/src/effects/presets/effectparameterpreset.cpp index a7b99e19f7b7..dc251c1c0bf3 100644 --- a/src/effects/presets/effectparameterpreset.cpp +++ b/src/effects/presets/effectparameterpreset.cpp @@ -21,8 +21,9 @@ EffectParameterPreset::EffectParameterPreset(const QDomElement& parameterElement XmlParse::selectNodeQString(parameterElement, EffectXml::ParameterLinkType)); - m_bLinkInverted = XmlParse::selectNodeBool(parameterElement, - EffectXml::ParameterLinkInversion); + m_linkInversion = static_cast( + static_cast(XmlParse::selectNodeDouble(parameterElement, + EffectXml::ParameterLinkInversion))); m_bHidden = XmlParse::selectNodeBool(parameterElement, EffectXml::ParameterHidden); diff --git a/src/effects/presets/effectparameterpreset.h b/src/effects/presets/effectparameterpreset.h index 64a505f515de..8e972aa2a965 100644 --- a/src/effects/presets/effectparameterpreset.h +++ b/src/effects/presets/effectparameterpreset.h @@ -15,6 +15,6 @@ class EffectParameterPreset { double m_dValue; QString m_id; EffectManifestParameter::LinkType m_linkType; - bool m_bLinkInverted; + EffectManifestParameter::LinkInversion m_linkInversion; bool m_bHidden; }; From de33ccf6331f09649abe5be7dc1edba8cea6d813 Mon Sep 17 00:00:00 2001 From: Be Date: Thu, 2 Apr 2020 19:48:50 -0500 Subject: [PATCH 054/443] Effect(Parameter)Preset: add constructor for manifests These take the default values from the manifests. This will be used to generate fallback default EffectPresets. --- src/effects/presets/effectparameterpreset.cpp | 8 ++++++++ src/effects/presets/effectparameterpreset.h | 1 + src/effects/presets/effectpreset.cpp | 9 +++++++++ src/effects/presets/effectpreset.h | 2 ++ 4 files changed, 20 insertions(+) diff --git a/src/effects/presets/effectparameterpreset.cpp b/src/effects/presets/effectparameterpreset.cpp index dc251c1c0bf3..a458f6271c36 100644 --- a/src/effects/presets/effectparameterpreset.cpp +++ b/src/effects/presets/effectparameterpreset.cpp @@ -30,5 +30,13 @@ EffectParameterPreset::EffectParameterPreset(const QDomElement& parameterElement } } +EffectParameterPreset::EffectParameterPreset(const EffectManifestParameterPointer pManifestParameter) { + m_id = pManifestParameter->id(); + m_dValue = pManifestParameter->getDefault(); + m_linkType = pManifestParameter->defaultLinkType(); + m_linkInversion = pManifestParameter->defaultLinkInversion(); + m_bHidden = false; +} + EffectParameterPreset::~EffectParameterPreset() { } diff --git a/src/effects/presets/effectparameterpreset.h b/src/effects/presets/effectparameterpreset.h index 8e972aa2a965..6548eeada938 100644 --- a/src/effects/presets/effectparameterpreset.h +++ b/src/effects/presets/effectparameterpreset.h @@ -9,6 +9,7 @@ class EffectParameterPreset { public: EffectParameterPreset(); EffectParameterPreset(const QDomElement& parameterElement); + EffectParameterPreset(const EffectManifestParameterPointer pManifestParameter); ~EffectParameterPreset(); private: diff --git a/src/effects/presets/effectpreset.cpp b/src/effects/presets/effectpreset.cpp index f28d192996ca..6a35db3b210f 100644 --- a/src/effects/presets/effectpreset.cpp +++ b/src/effects/presets/effectpreset.cpp @@ -31,5 +31,14 @@ EffectPreset::EffectPreset(const QDomElement& effectElement) { } } +EffectPreset::EffectPreset(const EffectManifestPointer pManifest) { + m_id = pManifest->id(); + m_backendType = pManifest->backendType(); + m_dMetaParameter = pManifest->metaknobDefault(); + for (const auto pParameterManifest : pManifest->parameters()) { + m_effectParameterPresets.append(EffectParameterPreset(pParameterManifest)); + } +} + EffectPreset::~EffectPreset() { } diff --git a/src/effects/presets/effectpreset.h b/src/effects/presets/effectpreset.h index 83d9e2d01ca6..98d25e85acd2 100644 --- a/src/effects/presets/effectpreset.h +++ b/src/effects/presets/effectpreset.h @@ -2,12 +2,14 @@ #include #include "effects/defs.h" +#include "effects/effectmanifest.h" #include "effects/presets/effectparameterpreset.h" class EffectPreset { public: EffectPreset(); EffectPreset(const QDomElement& element); + EffectPreset(const EffectManifestPointer pManifest); ~EffectPreset(); private: From a84ea3f62f97e356a3c53072867e1a447d6b1c07 Mon Sep 17 00:00:00 2001 From: Be Date: Thu, 2 Apr 2020 19:54:40 -0500 Subject: [PATCH 055/443] EffectsManager: maintain a default preset for each effect --- src/effects/effectsmanager.cpp | 12 ++++++++++++ src/effects/effectsmanager.h | 2 ++ 2 files changed, 14 insertions(+) diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index 12989b3329a0..36de952a3f49 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -389,6 +389,8 @@ void EffectsManager::setup() { // Add postfader effect chain slots addStandardEffectChainSlots(); addOutputEffectChainSlot(); + + loadDefaultEffectPresets(); } bool EffectsManager::writeRequest(EffectsRequest* request) { @@ -469,6 +471,16 @@ void EffectsManager::collectGarbage(const EffectsRequest* pRequest) { } } +void EffectsManager::loadDefaultEffectPresets() { + //TODO: load default presets from filesystem, only fallback to manifest if not found + for (const auto pBackend : m_effectsBackends) { + for (const auto pManifest : pBackend->getManifests()) { + m_defaultPresets.insert(pManifest, + EffectPresetPointer(new EffectPreset(pManifest))); + } + } +} + void EffectsManager::loadEffectChainPresets() { QDir settingsPath(m_pConfig->getSettingsPath()); QFile file(settingsPath.absoluteFilePath("effects.xml")); diff --git a/src/effects/effectsmanager.h b/src/effects/effectsmanager.h index 1f0c69b44d5c..c6e4b2f4a9ae 100644 --- a/src/effects/effectsmanager.h +++ b/src/effects/effectsmanager.h @@ -148,6 +148,7 @@ class EffectsManager : public QObject { return "EffectsManager"; } + void loadDefaultEffectPresets(); void processEffectsResponses(); void collectGarbage(const EffectsRequest* pResponse); @@ -181,6 +182,7 @@ class EffectsManager : public QObject { QHash m_quickEffectChainSlots; QHash m_effectChainPresets; + QHash m_defaultPresets; DISALLOW_COPY_AND_ASSIGN(EffectsManager); }; From f950fce777a11e5d9475b0a61c6bba45a22c941e Mon Sep 17 00:00:00 2001 From: Be Date: Thu, 2 Apr 2020 20:15:06 -0500 Subject: [PATCH 056/443] fix miscellaneous compiler warnings --- src/effects/builtin/phasereffect.h | 5 +++-- src/effects/builtin/reverbeffect.h | 2 +- src/effects/effectchainslot.cpp | 13 +++++-------- src/effects/effectparameterslotbase.cpp | 9 +++++---- src/effects/effectsmanager.cpp | 8 +++----- 5 files changed, 17 insertions(+), 20 deletions(-) diff --git a/src/effects/builtin/phasereffect.h b/src/effects/builtin/phasereffect.h index ea9cbdedcfbd..317eb2701799 100644 --- a/src/effects/builtin/phasereffect.h +++ b/src/effects/builtin/phasereffect.h @@ -52,10 +52,11 @@ class PhaserEffect : public EffectProcessorImpl { void processChannel( PhaserGroupState* pState, - const CSAMPLE* pInput, CSAMPLE* pOutput, + const CSAMPLE* pInput, + CSAMPLE* pOutput, const mixxx::EngineParameters& bufferParameters, const EffectEnableState enableState, - const GroupFeatureState& groupFeatures); + const GroupFeatureState& groupFeatures) override; private: QString debugString() const { diff --git a/src/effects/builtin/reverbeffect.h b/src/effects/builtin/reverbeffect.h index 4f6ce44b8d19..fd1c7d614ff8 100644 --- a/src/effects/builtin/reverbeffect.h +++ b/src/effects/builtin/reverbeffect.h @@ -42,7 +42,7 @@ class ReverbEffect : public EffectProcessorImpl { static EffectManifestPointer getManifest(); void loadEngineEffectParameters( - const QMap& parameters); + const QMap& parameters) override; void processChannel( ReverbGroupState* pState, diff --git a/src/effects/effectchainslot.cpp b/src/effects/effectchainslot.cpp index bedadcbf5385..8572b604006a 100644 --- a/src/effects/effectchainslot.cpp +++ b/src/effects/effectchainslot.cpp @@ -17,19 +17,18 @@ #include "util/sample.h" #include "util/xml.h" - EffectChainSlot::EffectChainSlot(const QString& group, - EffectsManager* pEffectsManager, - SignalProcessingStage stage, - const QString& id) + EffectsManager* pEffectsManager, + SignalProcessingStage stage, + const QString& id) : // The control group names are 1-indexed while internally everything // is 0-indexed. - m_group(group), m_pEffectsManager(pEffectsManager), - m_signalProcessingStage(stage), + m_group(group), m_id(id), m_name(""), m_description(""), + m_signalProcessingStage(stage), m_pEngineEffectChain(nullptr) { // qDebug() << "EffectChainSlot::EffectChainSlot " << group << ' ' << iChainNumber; @@ -151,8 +150,6 @@ void EffectChainSlot::addToEngine() { pRequest->AddEffectChain.pChain = m_pEngineEffectChain; m_pEffectsManager->writeRequest(pRequest); - VERIFY_OR_DEBUG_ASSERT(!m_enabledInputChannels.size()); - sendParameterUpdate(); } diff --git a/src/effects/effectparameterslotbase.cpp b/src/effects/effectparameterslotbase.cpp index 453cf2f75a28..81a8fc5c812d 100644 --- a/src/effects/effectparameterslotbase.cpp +++ b/src/effects/effectparameterslotbase.cpp @@ -7,17 +7,16 @@ #include "control/controlpushbutton.h" EffectParameterSlotBase::EffectParameterSlotBase(const QString& group, - const unsigned int iParameterSlotNumber, - const EffectManifestParameter::ParameterType parameterType) + const unsigned int iParameterSlotNumber, + const EffectManifestParameter::ParameterType parameterType) : m_iParameterSlotNumber(iParameterSlotNumber), - m_parameterType(parameterType), m_group(group), m_pEffectParameter(nullptr), m_pManifestParameter(nullptr), + m_parameterType(parameterType), m_pControlLoaded(nullptr), m_pControlType(nullptr), m_dChainParameter(0.0) { - } EffectParameterSlotBase::~EffectParameterSlotBase() { @@ -64,6 +63,8 @@ void EffectParameterSlotBase::syncSofttakeover() { } void EffectParameterSlotBase::onEffectMetaParameterChanged(double parameter, bool force) { + Q_UNUSED(parameter); + Q_UNUSED(force); } void EffectParameterSlotBase::slotValueChanged(double v) { diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index 36de952a3f49..eaa63bf8f602 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -23,16 +23,14 @@ const QString kGroupClose = "]"; const unsigned int kEffectMessagPipeFifoSize = 2048; } // anonymous namespace - -EffectsManager::EffectsManager(QObject* pParent, UserSettingsPointer pConfig, - ChannelHandleFactory* pChannelHandleFactory) +EffectsManager::EffectsManager(QObject* pParent, UserSettingsPointer pConfig, ChannelHandleFactory* pChannelHandleFactory) : QObject(pParent), m_pChannelHandleFactory(pChannelHandleFactory), - m_pConfig(pConfig), m_nextRequestId(0), m_loEqFreq(ConfigKey("[Mixer Profile]", "LoEQFrequency"), 0., 22040), m_hiEqFreq(ConfigKey("[Mixer Profile]", "HiEQFrequency"), 0., 22040), - m_underDestruction(false) { + m_underDestruction(false), + m_pConfig(pConfig) { qRegisterMetaType("EffectChainMixMode"); QPair requestPipes = TwoWayMessagePipe::makeTwoWayMessagePipe( From c9e81ea9cd922dffcb9f461626e759a4290e3bd4 Mon Sep 17 00:00:00 2001 From: Be Date: Fri, 3 Apr 2020 10:15:19 -0500 Subject: [PATCH 057/443] effect presets: add const getter methods for data This data must only be set by the constructors. It is read only for the lifetime of the preset. --- src/effects/presets/effectchainpreset.h | 12 ++++++++++- src/effects/presets/effectparameterpreset.cpp | 6 +++--- src/effects/presets/effectparameterpreset.h | 20 +++++++++++++++++++ src/effects/presets/effectpreset.h | 16 +++++++++++++++ 4 files changed, 50 insertions(+), 4 deletions(-) diff --git a/src/effects/presets/effectchainpreset.h b/src/effects/presets/effectchainpreset.h index 901c31e71fed..df9ffc1a0f4c 100644 --- a/src/effects/presets/effectchainpreset.h +++ b/src/effects/presets/effectchainpreset.h @@ -10,9 +10,19 @@ class EffectChainPreset { EffectChainPreset(const QDomElement& chainElement); ~EffectChainPreset(); - QString name() const { + const QString& name() const { return m_name; } + EffectChainMixMode mixMode() const { + return m_mixMode; + } + double superKnob() const { + return m_dSuper; + } + + const QList& effectPresets() { + return m_effectPresets; + } private: QString m_id; diff --git a/src/effects/presets/effectparameterpreset.cpp b/src/effects/presets/effectparameterpreset.cpp index a458f6271c36..c941d6b50719 100644 --- a/src/effects/presets/effectparameterpreset.cpp +++ b/src/effects/presets/effectparameterpreset.cpp @@ -12,10 +12,10 @@ EffectParameterPreset::EffectParameterPreset(const QDomElement& parameterElement m_id = QString(); m_linkType = EffectManifestParameter::LinkType::NONE; } else { - bool conversionWorked = false; + m_id = XmlParse::selectNodeQString(parameterElement, EffectXml::ParameterId); + m_dValue = XmlParse::selectNodeDouble(parameterElement, - EffectXml::ParameterValue, - &conversionWorked); + EffectXml::ParameterValue); m_linkType = EffectManifestParameter::LinkTypeFromString( XmlParse::selectNodeQString(parameterElement, diff --git a/src/effects/presets/effectparameterpreset.h b/src/effects/presets/effectparameterpreset.h index 6548eeada938..0144b85e127d 100644 --- a/src/effects/presets/effectparameterpreset.h +++ b/src/effects/presets/effectparameterpreset.h @@ -12,6 +12,26 @@ class EffectParameterPreset { EffectParameterPreset(const EffectManifestParameterPointer pManifestParameter); ~EffectParameterPreset(); + bool isNull() const { + return m_id.isEmpty(); + } + + double value() const { + return m_dValue; + } + const QString& id() const { + return m_id; + } + EffectManifestParameter::LinkType linkType() const { + return m_linkType; + } + EffectManifestParameter::LinkInversion linkInverted() const { + return m_linkInversion; + } + bool hidden() const { + return m_bHidden; + } + private: double m_dValue; QString m_id; diff --git a/src/effects/presets/effectpreset.h b/src/effects/presets/effectpreset.h index 98d25e85acd2..e53b5611ceaf 100644 --- a/src/effects/presets/effectpreset.h +++ b/src/effects/presets/effectpreset.h @@ -12,6 +12,22 @@ class EffectPreset { EffectPreset(const EffectManifestPointer pManifest); ~EffectPreset(); + const QString& id() const { + return m_id; + } + + EffectBackendType backendType() const { + return m_backendType; + } + + double metaParameter() const { + return m_dMetaParameter; + } + + const QList& getParameterPresets() const { + return m_effectParameterPresets; + } + private: QString m_id; EffectBackendType m_backendType; From c8367b14c5c69f87e78ff75ca5c9d9b1af9132ca Mon Sep 17 00:00:00 2001 From: Be Date: Fri, 3 Apr 2020 10:59:49 -0500 Subject: [PATCH 058/443] reimplement loading of effects.xml with new preset classes with support for rearranging parameters by rearranging them in the XML and hiding parameters by adding a element to the parameter element --- src/effects/defs.h | 3 + src/effects/effectbuttonparameterslot.cpp | 2 +- src/effects/effectbuttonparameterslot.h | 8 +- src/effects/effectchainslot.cpp | 20 ++- src/effects/effectchainslot.h | 16 +- src/effects/effectknobparameterslot.cpp | 4 +- src/effects/effectknobparameterslot.h | 11 +- src/effects/effectparameter.cpp | 15 +- src/effects/effectparameter.h | 8 +- src/effects/effectparameterslotbase.h | 4 +- src/effects/effectslot.cpp | 180 ++++++++++++---------- src/effects/effectslot.h | 16 +- src/effects/effectsmanager.cpp | 41 ++++- src/effects/effectsmanager.h | 9 +- src/effects/specialeffectchainslots.cpp | 10 +- src/effects/specialeffectchainslots.h | 10 +- src/util/xml.cpp | 3 +- 17 files changed, 212 insertions(+), 148 deletions(-) diff --git a/src/effects/defs.h b/src/effects/defs.h index aa64e1d68bff..3e8e470d3a41 100644 --- a/src/effects/defs.h +++ b/src/effects/defs.h @@ -55,6 +55,9 @@ typedef std::array EffectStatesMapArray; class EngineEffectParameter; typedef QSharedPointer EngineEffectParameterPointer; +class EffectParameter; +typedef QSharedPointer EffectParameterPointer; + class EffectSlot; typedef QSharedPointer EffectSlotPointer; diff --git a/src/effects/effectbuttonparameterslot.cpp b/src/effects/effectbuttonparameterslot.cpp index b7174225853f..b77ed36029b6 100644 --- a/src/effects/effectbuttonparameterslot.cpp +++ b/src/effects/effectbuttonparameterslot.cpp @@ -38,7 +38,7 @@ EffectButtonParameterSlot::~EffectButtonParameterSlot() { delete m_pControlValue; } -void EffectButtonParameterSlot::loadParameter(EffectParameter* pEffectParameter) { +void EffectButtonParameterSlot::loadParameter(EffectParameterPointer pEffectParameter) { // qDebug() << debugString() << "loadParameter" << (pEffectSlot ? pEffectSlot->getManifest().name() : "(null)"); if (m_pEffectParameter) { clear(); diff --git a/src/effects/effectbuttonparameterslot.h b/src/effects/effectbuttonparameterslot.h index f119ae18526b..7f68be54eaa7 100644 --- a/src/effects/effectbuttonparameterslot.h +++ b/src/effects/effectbuttonparameterslot.h @@ -25,17 +25,15 @@ class EffectButtonParameterSlot : public EffectParameterSlotBase { } // Load the parameter of the given effect into this EffectButtonParameterSlot - void loadParameter(EffectParameter* pEffectParameter); - - // Clear the currently loaded effect - void clear(); + void loadParameter(EffectParameterPointer pEffectParameter) override; QDomElement toXml(QDomDocument* doc) const override; void loadParameterSlotFromXml(const QDomElement& parameterElement) override; + void clear() override; private slots: // Solely for handling control changes - void slotParameterValueChanged(double value); + void slotParameterValueChanged(double value) override; private: QString debugString() const { diff --git a/src/effects/effectchainslot.cpp b/src/effects/effectchainslot.cpp index 8572b604006a..5c0ddf0ae2c3 100644 --- a/src/effects/effectchainslot.cpp +++ b/src/effects/effectchainslot.cpp @@ -186,10 +186,10 @@ void EffectChainSlot::setDescription(const QString& description) { } void EffectChainSlot::loadEffect(const unsigned int iEffectSlotNumber, - const EffectManifestPointer pManifest, - std::unique_ptr pProcessor) { - m_effectSlots[iEffectSlotNumber]->loadEffect(pManifest, std::move(pProcessor), - m_enabledInputChannels); + const EffectManifestPointer pManifest, + std::unique_ptr pProcessor, + EffectPresetPointer pPreset) { + m_effectSlots[iEffectSlotNumber]->loadEffect(pManifest, std::move(pProcessor), pPreset, m_enabledInputChannels); } void EffectChainSlot::sendParameterUpdate() { @@ -224,8 +224,15 @@ void EffectChainSlot::setSuperParameterDefaultValue(double value) { m_pControlChainSuperParameter->setDefaultValue(value); } +void EffectChainSlot::setMixMode(EffectChainMixMode mixMode) { + m_pControlChainMixMode->set(static_cast(mixMode)); + sendParameterUpdate(); +} + EffectSlotPointer EffectChainSlot::addEffectSlot(const QString& group) { - // qDebug() << debugString() << "addEffectSlot" << group; + if (kEffectDebugOutput) { + qDebug() << debugString() << "addEffectSlot" << group; + } EffectSlotPointer pEffectSlot = EffectSlotPointer( new EffectSlot(group, m_pEffectsManager, m_effectSlots.size(), m_pEngineEffectChain)); @@ -262,8 +269,7 @@ void EffectChainSlot::registerInputChannel(const ChannelHandleAndGroup& handle_g EffectSlotPointer EffectChainSlot::getEffectSlot(unsigned int slotNumber) { //qDebug() << debugString() << "getEffectSlot" << slotNumber; - if (slotNumber >= static_cast(m_effectSlots.size())) { - qWarning() << "WARNING: slotNumber out of range"; + VERIFY_OR_DEBUG_ASSERT(slotNumber <= static_cast(m_effectSlots.size())) { return EffectSlotPointer(); } return m_effectSlots[slotNumber]; diff --git a/src/effects/effectchainslot.h b/src/effects/effectchainslot.h index ec8e76db1f6d..7cd9b625ad2b 100644 --- a/src/effects/effectchainslot.h +++ b/src/effects/effectchainslot.h @@ -1,14 +1,15 @@ #ifndef EFFECTCHAINSLOT_H #define EFFECTCHAINSLOT_H -#include -#include +#include #include +#include +#include #include -#include #include "control/controlobject.h" #include "effects/defs.h" +#include "effects/presets/effectchainpreset.h" #include "engine/channelhandle.h" #include "util/class.h" #include "util/memory.h" @@ -45,6 +46,8 @@ class EffectChainSlot : public QObject { void setSuperParameter(double value, bool force = false); void setSuperParameterDefaultValue(double value); + void setMixMode(EffectChainMixMode mixMode); + const QString& getGroup() const { return m_group; } @@ -81,9 +84,9 @@ class EffectChainSlot : public QObject { } virtual void loadEffect(const unsigned int iEffectSlotNumber, - const EffectManifestPointer pManifest, - std::unique_ptr pProcessor); - + const EffectManifestPointer pManifest, + std::unique_ptr pProcessor, + EffectPresetPointer pPreset); signals: // Signal that whoever is in charge of this EffectChainSlot should load the @@ -177,6 +180,7 @@ class EffectChainSlot : public QObject { QString m_id; QString m_name; QString m_description; + EffectChainMixMode m_mixMode; SignalProcessingStage m_signalProcessingStage; QSet m_enabledInputChannels; EngineEffectChain* m_pEngineEffectChain; diff --git a/src/effects/effectknobparameterslot.cpp b/src/effects/effectknobparameterslot.cpp index ec0c644c5af2..6056791a4cc2 100644 --- a/src/effects/effectknobparameterslot.cpp +++ b/src/effects/effectknobparameterslot.cpp @@ -57,7 +57,7 @@ EffectKnobParameterSlot::~EffectKnobParameterSlot() { delete m_pMetaknobSoftTakeover; } -void EffectKnobParameterSlot::loadParameter(EffectParameter* pEffectParameter) { +void EffectKnobParameterSlot::loadParameter(EffectParameterPointer pEffectParameter) { // qDebug() << debugString() << "loadParameter" << (pEffectSlot ? pEffectSlot->getManifest().name() : "(null)"); clear(); @@ -71,7 +71,7 @@ void EffectKnobParameterSlot::loadParameter(EffectParameter* pEffectParameter) { if (m_pEffectParameter) { m_pManifestParameter = m_pEffectParameter->manifest(); - // qDebug() << debugString() << "Loading effect parameter" << m_pEffectParameter->name(); + //qDebug() << debugString() << "Loading effect parameter" << m_pEffectParameter->manifest()->id(); double dValue = m_pEffectParameter->getValue(); double dMinimum = m_pManifestParameter->getMinimum(); double dMinimumLimit = dMinimum; // TODO(rryan) expose limit from EffectParameter diff --git a/src/effects/effectknobparameterslot.h b/src/effects/effectknobparameterslot.h index e67da6853266..6ecdf9be1219 100644 --- a/src/effects/effectknobparameterslot.h +++ b/src/effects/effectknobparameterslot.h @@ -28,26 +28,25 @@ class EffectKnobParameterSlot : public EffectParameterSlotBase { } // Load the parameter of the given effect into this EffectKnobParameterSlot - void loadParameter(EffectParameter* pEffectParameter); + void loadParameter(EffectParameterPointer pEffectParameter) override; double getValueParameter() const; - void onEffectMetaParameterChanged(double parameter, bool force=false); + void onEffectMetaParameterChanged(double parameter, bool force = false) override; // Syncs the Super button with the parameter, that the following // super button change will be passed to the effect parameter // used during test - void syncSofttakeover(); + void syncSofttakeover() override; // Clear the currently loaded effect - void clear(); - QDomElement toXml(QDomDocument* doc) const override; void loadParameterSlotFromXml(const QDomElement& parameterElement) override; + void clear() override; private slots: // Solely for handling control changes - void slotParameterValueChanged(double value); + void slotParameterValueChanged(double value) override; void slotLinkTypeChanging(double v); void slotLinkInverseChanged(double v); diff --git a/src/effects/effectparameter.cpp b/src/effects/effectparameter.cpp index 34777e7f9701..9adb621bb5b0 100644 --- a/src/effects/effectparameter.cpp +++ b/src/effects/effectparameter.cpp @@ -4,17 +4,18 @@ #include "effects/effectsmanager.h" #include "util/assert.h" -EffectParameter::EffectParameter(EngineEffect* pEngineEffect, EffectsManager* pEffectsManager, - int iParameterNumber, EffectManifestParameterPointer pParameter) +EffectParameter::EffectParameter(EngineEffect* pEngineEffect, EffectsManager* pEffectsManager, int iParameterNumber, EffectManifestParameterPointer pParameter, EffectParameterPreset preset) : m_pEngineEffect(pEngineEffect), m_pEffectsManager(pEffectsManager), m_iParameterNumber(iParameterNumber), m_pParameter(pParameter) { - // qDebug() << debugString() << "Constructing new EffectParameter from EffectManifestParameter:" - // << m_parameter.id(); - - // Set the value to the default. - m_value = m_pParameter->getDefault(); + if (preset.isNull()) { + setValue(pParameter->getDefault()); + } else { + setValue(preset.value()); + m_linkType = preset.linkType(); + m_linkInversion = preset.linkInverted(); + } } EffectParameter::~EffectParameter() { diff --git a/src/effects/effectparameter.h b/src/effects/effectparameter.h index 03b32c8d659c..6b20ffa07e82 100644 --- a/src/effects/effectparameter.h +++ b/src/effects/effectparameter.h @@ -11,6 +11,7 @@ class Effect; class EffectsManager; class EngineEffect; +class EffectParameterPreset; // An EffectParameter is a wrapper around EffectManifestParameter that tracks a // mutable value state and communicates that state to the engine. This class is @@ -20,8 +21,7 @@ class EngineEffect; // parameter hiding and rearrangement. class EffectParameter { public: - EffectParameter(EngineEffect* pEngineEffect, EffectsManager* pEffectsManager, - int iParameterNumber, EffectManifestParameterPointer pParameter); + EffectParameter(EngineEffect* pEngineEffect, EffectsManager* pEffectsManager, int iParameterNumber, EffectManifestParameterPointer pParameter, EffectParameterPreset preset); virtual ~EffectParameter(); EffectManifestParameterPointer manifest() const; @@ -45,6 +45,10 @@ class EffectParameter { int m_iParameterNumber; EffectManifestParameterPointer m_pParameter; double m_value; + // Hidden parameters cannot be linked to the metaknob, but EffectParameter + // needs to maintain their state in case they are loaded into an EffectParameterSlot. + EffectManifestParameter::LinkType m_linkType; + EffectManifestParameter::LinkInversion m_linkInversion; DISALLOW_COPY_AND_ASSIGN(EffectParameter); }; diff --git a/src/effects/effectparameterslotbase.h b/src/effects/effectparameterslotbase.h index e76d673f5dc3..f6a839fb61a6 100644 --- a/src/effects/effectparameterslotbase.h +++ b/src/effects/effectparameterslotbase.h @@ -25,7 +25,7 @@ class EffectParameterSlotBase : public QObject { virtual ~EffectParameterSlotBase(); - virtual void loadParameter(EffectParameter* pEffectParameter) = 0; + virtual void loadParameter(EffectParameterPointer pEffectParameter) = 0; // Clear the currently loaded effect virtual void clear() = 0; @@ -60,7 +60,7 @@ class EffectParameterSlotBase : public QObject { const unsigned int m_iParameterSlotNumber; QString m_group; EffectSlot* m_pEffectSlot; - EffectParameter* m_pEffectParameter; + EffectParameterPointer m_pEffectParameter; EffectManifestParameterPointer m_pManifestParameter; EffectManifestParameter::ParameterType m_parameterType; diff --git a/src/effects/effectslot.cpp b/src/effects/effectslot.cpp index 0aecf0d65cdd..6c5e86cfa417 100644 --- a/src/effects/effectslot.cpp +++ b/src/effects/effectslot.cpp @@ -157,8 +157,10 @@ void EffectSlot::updateEngineState() { pRequest->SetEffectParameters.enabled = m_pControlEnabled->get(); m_pEffectsManager->writeRequest(pRequest); - for (auto const& pParameter : m_parameters) { - pParameter->updateEngineState(); + for (const auto& parameterList : m_parameters) { + for (auto const& pParameter : parameterList) { + pParameter->updateEngineState(); + } } } @@ -189,42 +191,37 @@ void EffectSlot::addEffectParameterSlot(EffectManifestParameter::ParameterType p m_pControlNumParameterSlots[parameterType]->get()) { return; } - m_parameterSlots.append(pParameterSlot); + m_parameterSlots[parameterType].append(pParameterSlot); } unsigned int EffectSlot::numParameters(EffectManifestParameter::ParameterType parameterType) const { - unsigned int num = 0; - for (auto const& pParameter : m_parameters) { - if (parameterType == pParameter->manifest()->parameterType()) { - ++num; - } - } - return num; + return m_parameters.value(parameterType).size(); } void EffectSlot::setEnabled(bool enabled) { m_pControlEnabled->set(enabled); } -EffectParameterSlotBasePointer EffectSlot::getEffectParameterSlot(EffectManifestParameter::ParameterType parameterType, - unsigned int slotNumber) { - // qDebug() << debugString() << "getEffectParameterSlot" << static_cast(parameterType) << ' ' << slotNumber; - - int iSlotNumber = 0; - for (const auto& pParameterSlot : m_parameterSlots) { - if (pParameterSlot->parameterType() == parameterType) { - if (iSlotNumber == slotNumber) { - return pParameterSlot; - } - ++iSlotNumber; - } +EffectParameterSlotBasePointer EffectSlot::getEffectParameterSlot( + EffectManifestParameter::ParameterType parameterType, + unsigned int slotNumber) { + VERIFY_OR_DEBUG_ASSERT(slotNumber <= (unsigned)m_parameterSlots.value(parameterType).size()) { + return nullptr; } - return EffectParameterSlotBasePointer(); + return m_parameterSlots.value(parameterType).at(slotNumber); } void EffectSlot::loadEffect(const EffectManifestPointer pManifest, - std::unique_ptr pProcessor, - const QSet& activeChannels) { + std::unique_ptr pProcessor, + EffectPresetPointer pEffectPreset, + const QSet& activeChannels) { + if (kEffectDebugOutput) { + if (pManifest != nullptr) { + qDebug() << this << m_group << "loading effect" << pManifest->id() << pEffectPreset.get() << pProcessor.get(); + } else { + qDebug() << this << m_group << "unloading effect"; + } + } unloadEffect(); m_pManifest = pManifest; @@ -235,26 +232,58 @@ void EffectSlot::loadEffect(const EffectManifestPointer pManifest, return; } - for (auto& parameterMapping : m_mapForParameterType) { - parameterMapping.clear(); - } - addToEngine(std::move(pProcessor), activeChannels); - int index = 0; + // Create EffectParameters. Every parameter listed in the manifest must have + // an EffectParameter created, regardless of whether it is loaded in a slot. + int manifestIndex = 0; for (const auto& pManifestParameter: m_pManifest->parameters()) { - EffectParameter* pParameter = new EffectParameter( - m_pEngineEffect, m_pEffectsManager, m_parameters.size(), pManifestParameter); - m_parameters.append(pParameter); - - m_mapForParameterType[pManifestParameter->parameterType()].push_back(index); - ++index; + // match the manifest parameter to the preset parameter + EffectParameterPreset parameterPreset = EffectParameterPreset(); + if (pEffectPreset != nullptr) { + for (const auto& p : pEffectPreset->getParameterPresets()) { + if (p.id() == pManifestParameter->id()) { + parameterPreset = p; + } + } + } + EffectParameterPointer pParameter(new EffectParameter( + m_pEngineEffect, m_pEffectsManager, manifestIndex, pManifestParameter, parameterPreset)); + m_parameters[pManifestParameter->parameterType()].append(pParameter); + manifestIndex++; } - m_pControlLoaded->forceSet(1.0); + // Map the parameter slots to the EffectParameters. + // The slot order is determined by the order parameters are listed in the preset. + int numTypes = static_cast(EffectManifestParameter::ParameterType::NUM_TYPES); + for (int parameterTypeId = 0; parameterTypeId < numTypes; ++parameterTypeId) { + const EffectManifestParameter::ParameterType parameterType = + static_cast(parameterTypeId); + + if (pEffectPreset != nullptr && !pEffectPreset.isNull()) { + m_loadedParameters[parameterType].clear(); + int slot = 0; + for (const auto& parameterPreset : pEffectPreset->getParameterPresets()) { + if (parameterPreset.hidden() || parameterPreset.isNull()) { + continue; + } + + for (const auto& pParameter : m_parameters.value(parameterType)) { + if (pParameter->manifest()->id() == parameterPreset.id()) { + m_loadedParameters[parameterType].insert(slot, pParameter); + break; + } + } + slot++; + } + } + } loadParameters(); + m_pControlLoaded->forceSet(1.0); + + // TODO: load meta knob from preset if (m_pEffectsManager->isAdoptMetaknobValueEnabled()) { slotEffectMetaParameter(m_pControlMetaParameter->get(), true); } else { @@ -276,25 +305,28 @@ void EffectSlot::unloadEffect() { pControlNumParameters->forceSet(0.0); } - for (const auto& pParameterSlot : m_parameterSlots) { - pParameterSlot->clear(); + for (auto& slotList : m_parameterSlots) { + // Do not delete the slots; clear the parameters from the slots + // The parameter slots are used by the next effect, but the EffectParameters + // are deleted below. + for (auto pSlot : slotList) { + pSlot->clear(); + } } - - for (int i = 0; i < m_parameters.size(); ++i) { - EffectParameter* pParameter = m_parameters.at(i); - m_parameters[i] = nullptr; - delete pParameter; + for (auto& parameterList : m_parameters) { + parameterList.clear(); } - m_parameters.clear(); - m_pManifest.clear(); - for (auto& parameterMapping : m_mapForParameterType) { - parameterMapping.clear(); + for (auto& parameterList : m_loadedParameters) { + parameterList.clear(); } + m_pManifest.clear(); + removeFromEngine(); } void EffectSlot::loadParameters() { + //qDebug() << this << m_group << "loading parameters"; int numTypes = static_cast(EffectManifestParameter::ParameterType::NUM_TYPES); for (int parameterTypeId=0 ; parameterTypeIdforceSet(numParameters(parameterType)); - unsigned int parameterSlotIndex = 0; - unsigned int numParameterSlots = m_iNumParameterSlots[parameterType]; - - // Load EffectParameters into the slot indicated by m_mapForParameterType - for (int i=0 ; iloadParameter(pParameter); - ++parameterSlotIndex; + m_parameterSlots.value(parameterType).at(slot)->loadParameter(pParameter); + slot++; } // Clear any EffectParameterSlots that still have a loaded parameter from before - // but the loop above did not load a new parameter into them - while (parameterSlotIndex < numParameterSlots) { - auto pParameterSlot = getEffectParameterSlot(parameterType, parameterSlotIndex); - VERIFY_OR_DEBUG_ASSERT(pParameterSlot != nullptr) { - ++parameterSlotIndex; - continue; - } - pParameterSlot->clear(); - ++parameterSlotIndex; + // but the loop above did not load a new parameter into them. + for (; slot < m_parameterSlots.value(parameterType).size(); slot++) { + m_parameterSlots.value(parameterType).at(slot)->clear(); } } } @@ -372,9 +380,11 @@ void EffectSlot::slotClear(double v) { } void EffectSlot::syncSofttakeover() { - for (const auto pParameterSlot : m_parameterSlots) { - if (pParameterSlot->parameterType() == EffectManifestParameter::ParameterType::KNOB) { - pParameterSlot->syncSofttakeover(); + for (const auto& parameterSlotList : m_parameterSlots) { + for (const auto& pParameterSlot : parameterSlotList) { + if (pParameterSlot->parameterType() == EffectManifestParameter::ParameterType::KNOB) { + pParameterSlot->syncSofttakeover(); + } } } } @@ -404,7 +414,9 @@ void EffectSlot::slotEffectMetaParameter(double v, bool force) { if (!m_pControlEnabled->toBool()) { force = true; } - for (const auto& pParameterSlot : m_parameterSlots) { + + // Only knobs are linked to the metaknob; not buttons + for (const auto& pParameterSlot : m_parameterSlots.value(EffectManifestParameter::ParameterType::KNOB)) { if (pParameterSlot->parameterType() == EffectManifestParameter::ParameterType::KNOB) { pParameterSlot->onEffectMetaParameterChanged(v, force); } diff --git a/src/effects/effectslot.h b/src/effects/effectslot.h index 0a7bb21bf71c..a8f1dc2f3abc 100644 --- a/src/effects/effectslot.h +++ b/src/effects/effectslot.h @@ -10,13 +10,14 @@ #include "control/controlpotmeter.h" #include "control/controlpushbutton.h" #include "controllers/softtakeover.h" -#include "engine/channelhandle.h" -#include "engine/engine.h" -#include "engine/effects/engineeffect.h" #include "effects/effectbuttonparameterslot.h" +#include "effects/effectknobparameterslot.h" #include "effects/effectmanifest.h" #include "effects/effectparameter.h" -#include "effects/effectknobparameterslot.h" +#include "effects/presets/effectpreset.h" +#include "engine/channelhandle.h" +#include "engine/effects/engineeffect.h" +#include "engine/engine.h" #include "util/class.h" class EffectProcessor; @@ -41,6 +42,7 @@ class EffectSlot : public QObject { // Call with nullptr for pManifest and pProcessor to unload an effect void loadEffect(const EffectManifestPointer pManifest, std::unique_ptr pProcessor, + EffectPresetPointer pPreset, const QSet& activeChannels); inline int getEffectSlotNumber() const { @@ -113,9 +115,9 @@ class EffectSlot : public QObject { EffectManifestPointer m_pManifest; EngineEffectChain* m_pEngineEffectChain; EngineEffect* m_pEngineEffect; - QList m_parameters; - QList m_parameterSlots; - QHash> m_mapForParameterType; + QMap> m_parameters; + QMap> m_loadedParameters; + QMap> m_parameterSlots; ControlObject* m_pControlLoaded; QHash m_pControlNumParameters; diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index eaa63bf8f602..985e1399e5eb 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -157,12 +157,13 @@ void EffectsManager::loadEqualizerEffect(const QString& deckGroup, } void EffectsManager::loadEffect(EffectChainSlotPointer pChainSlot, - const int iEffectSlotNumber, const EffectManifestPointer pManifest) { - if (kEffectDebugOutput) { - qDebug() << debugString() << "loading effect" << iEffectSlotNumber << pManifest; + const int iEffectSlotNumber, + const EffectManifestPointer pManifest, + EffectPresetPointer pPreset) { + if (pPreset == nullptr) { + pPreset = m_defaultPresets.value(pManifest); } - pChainSlot->loadEffect(iEffectSlotNumber, pManifest, - createProcessor(pManifest)); + pChainSlot->loadEffect(iEffectSlotNumber, pManifest, createProcessor(pManifest), pPreset); } std::unique_ptr EffectsManager::createProcessor( @@ -178,6 +179,31 @@ std::unique_ptr EffectsManager::createProcessor( return pBackend->createProcessor(pManifest); } +// This needs to be in EffectsManager rather than EffectChainSlot because it +// needs access to the EffectsBackends. +void EffectsManager::loadEffectChainPreset(EffectChainSlotPointer pChainSlot, + EffectChainPresetPointer pPreset) { + VERIFY_OR_DEBUG_ASSERT(pChainSlot) { + return; + } + VERIFY_OR_DEBUG_ASSERT(pPreset) { + return; + } + int effectSlot = 0; + for (const auto& pEffectPreset : pPreset->effectPresets()) { + EffectsBackendPointer pBackend = m_effectsBackends.value(pEffectPreset->backendType()); + VERIFY_OR_DEBUG_ASSERT(pBackend) { + effectSlot++; + continue; + } + EffectManifestPointer pManifest = pBackend->getManifest(pEffectPreset->id()); + pChainSlot->loadEffect(effectSlot, pManifest, createProcessor(pManifest), pEffectPreset); + effectSlot++; + } + pChainSlot->setMixMode(pPreset->mixMode()); + pChainSlot->setSuperParameter(pPreset->superKnob()); +} + const QList EffectsManager::getAvailableEffectManifestsFiltered( EffectManifestFilterFnc filter) const { if (filter == nullptr) { @@ -246,7 +272,7 @@ void EffectsManager::getEffectManifestAndBackend( EffectManifestPointer EffectsManager::getManifestFromUniqueId(const QString& uid) const { if (kEffectDebugOutput) { - qDebug() << "EffectsManager::getManifestFromUniqueId" << uid; + //qDebug() << "EffectsManager::getManifestFromUniqueId" << uid; } if (uid.isEmpty()) { // Do not DEBUG_ASSERT, this may be a valid request for a nullptr to @@ -383,12 +409,12 @@ bool EffectsManager::getEffectVisibility(EffectManifestPointer pManifest) { } void EffectsManager::setup() { - loadEffectChainPresets(); // Add postfader effect chain slots addStandardEffectChainSlots(); addOutputEffectChainSlot(); loadDefaultEffectPresets(); + loadEffectChainPresets(); } bool EffectsManager::writeRequest(EffectsRequest* request) { @@ -504,6 +530,7 @@ void EffectsManager::loadEffectChainPresets() { QDomElement chainElement = chainNode.toElement(); EffectChainPresetPointer pPreset(new EffectChainPreset(chainElement)); m_effectChainPresets.insert(pPreset->name(), pPreset); + loadEffectChainPreset(m_standardEffectChainSlots.value(i), pPreset); } } } diff --git a/src/effects/effectsmanager.h b/src/effects/effectsmanager.h index c6e4b2f4a9ae..045b3fd849cf 100644 --- a/src/effects/effectsmanager.h +++ b/src/effects/effectsmanager.h @@ -89,11 +89,14 @@ class EffectsManager : public QObject { void loadEffect( EffectChainSlotPointer pChainSlot, const int iEffectSlotNumber, - const EffectManifestPointer pManifest); + const EffectManifestPointer pManifest, + EffectPresetPointer pPreset = nullptr); std::unique_ptr createProcessor( const EffectManifestPointer pManifest); + void loadEffectChainPreset(EffectChainSlotPointer pChainSlot, + EffectChainPresetPointer pPreset); void addStandardEffectChainSlots(); EffectChainSlotPointer getStandardEffectChainSlot(int unitNumber) const; @@ -103,8 +106,6 @@ class EffectsManager : public QObject { void addEqualizerEffectChainSlot(const QString& deckGroupName); void addQuickEffectChainSlot(const QString& deckGroupName); - void loadEffectChainPresets(); - // TODO: Remove these methods to reduce coupling between GUI and // effects system implementation details. EffectChainSlotPointer getEffectChainSlot(const QString& group) const; @@ -149,6 +150,8 @@ class EffectsManager : public QObject { } void loadDefaultEffectPresets(); + void loadEffectChainPresets(); + void processEffectsResponses(); void collectGarbage(const EffectsRequest* pResponse); diff --git a/src/effects/specialeffectchainslots.cpp b/src/effects/specialeffectchainslots.cpp index dc7b947081cc..4748de22958a 100644 --- a/src/effects/specialeffectchainslots.cpp +++ b/src/effects/specialeffectchainslots.cpp @@ -115,8 +115,9 @@ QuickEffectChainSlot::QuickEffectChainSlot(const QString& group, void QuickEffectChainSlot::loadEffect( const unsigned int iEffectSlotNumber, const EffectManifestPointer pManifest, - std::unique_ptr pProcessor) { - EffectChainSlot::loadEffect(iEffectSlotNumber, pManifest, std::move(pProcessor)); + std::unique_ptr pProcessor, + EffectPresetPointer pPreset) { + EffectChainSlot::loadEffect(iEffectSlotNumber, pManifest, std::move(pProcessor), pPreset); slotControlChainSuperParameter(m_pControlChainSuperParameter->get(), true); } @@ -148,10 +149,11 @@ EqualizerEffectChainSlot::EqualizerEffectChainSlot(const QString& group, void EqualizerEffectChainSlot::loadEffect( const unsigned int iEffectSlotNumber, const EffectManifestPointer pManifest, - std::unique_ptr pProcessor) { + std::unique_ptr pProcessor, + EffectPresetPointer pPreset) { // TODO: preserve effect parameters when loading new effect. This will allow // for easy comparison of the sound of different equalizer effects. - EffectChainSlot::loadEffect(iEffectSlotNumber, pManifest, std::move(pProcessor)); + EffectChainSlot::loadEffect(iEffectSlotNumber, pManifest, std::move(pProcessor), pPreset); m_pCOFilterWaveform->set(pManifest->isMixingEQ()); } diff --git a/src/effects/specialeffectchainslots.h b/src/effects/specialeffectchainslots.h index 780b492e1ba6..dba82cb34158 100644 --- a/src/effects/specialeffectchainslots.h +++ b/src/effects/specialeffectchainslots.h @@ -38,8 +38,9 @@ class QuickEffectChainSlot : public PerGroupEffectChainSlot { EffectsManager* pEffectsManager); void loadEffect(const unsigned int iEffectSlotNumber, - const EffectManifestPointer pManifest, - std::unique_ptr pProcessor) override; + const EffectManifestPointer pManifest, + std::unique_ptr pProcessor, + EffectPresetPointer pPreset) override; static QString formatEffectChainSlotGroup(const QString& group); static QString formatEffectSlotGroup(const QString& group, @@ -52,8 +53,9 @@ class EqualizerEffectChainSlot : public PerGroupEffectChainSlot { EffectsManager* pEffectsManager); void loadEffect(const unsigned int iEffectSlotNumber, - const EffectManifestPointer pManifest, - std::unique_ptr pProcessor) override; + const EffectManifestPointer pManifest, + std::unique_ptr pProcessor, + EffectPresetPointer pPreset) override; static QString formatEffectChainSlotGroup(const QString& group); static QString formatEffectSlotGroup(const QString& group); diff --git a/src/util/xml.cpp b/src/util/xml.cpp index db9281f6d32f..1ec770e5326c 100644 --- a/src/util/xml.cpp +++ b/src/util/xml.cpp @@ -22,7 +22,8 @@ double XmlParse::selectNodeDouble(const QDomNode& nodeHeader, bool XmlParse::selectNodeBool(const QDomNode& nodeHeader, const QString& sNode, bool* ok) { - return selectNode(nodeHeader, sNode).toElement().text().toDouble(ok); + QString text = selectNode(nodeHeader, sNode).toElement().text(); + return text == "true" || static_cast(text.toDouble()) || static_cast(text.toInt()); } QDomNode XmlParse::selectNode(const QDomNode& nodeHeader, From 51f68577b711edf52de1b523e356ca01c16c5951 Mon Sep 17 00:00:00 2001 From: Be Date: Fri, 3 Apr 2020 13:54:35 -0500 Subject: [PATCH 059/443] EffectParameter: track metaknob link type and inversion so it can be saved with EffectParameterPreset --- src/effects/effectknobparameterslot.cpp | 4 ++++ src/effects/effectparameter.h | 13 +++++++++++++ 2 files changed, 17 insertions(+) diff --git a/src/effects/effectknobparameterslot.cpp b/src/effects/effectknobparameterslot.cpp index 6056791a4cc2..435839e58325 100644 --- a/src/effects/effectknobparameterslot.cpp +++ b/src/effects/effectknobparameterslot.cpp @@ -149,11 +149,15 @@ void EffectKnobParameterSlot::slotLinkTypeChanging(double v) { m_pMetaknobSoftTakeover->setThreshold(SoftTakeover::kDefaultTakeoverThreshold); } m_pControlLinkType->setAndConfirm(static_cast(newType)); + m_pEffectParameter->setLinkType(newType); } void EffectKnobParameterSlot::slotLinkInverseChanged(double v) { Q_UNUSED(v); m_pMetaknobSoftTakeover->ignoreNext(); + m_pEffectParameter->setLinkInversion( + static_cast( + static_cast(v))); } void EffectKnobParameterSlot::onEffectMetaParameterChanged(double parameter, bool force) { diff --git a/src/effects/effectparameter.h b/src/effects/effectparameter.h index 6b20ffa07e82..48347d3bdf15 100644 --- a/src/effects/effectparameter.h +++ b/src/effects/effectparameter.h @@ -26,6 +26,19 @@ class EffectParameter { EffectManifestParameterPointer manifest() const; + void setLinkType(EffectManifestParameter::LinkType type) { + m_linkType = type; + } + EffectManifestParameter::LinkType linkType() const { + return m_linkType; + } + void setLinkInversion(EffectManifestParameter::LinkInversion inversion) { + m_linkInversion = inversion; + } + EffectManifestParameter::LinkInversion linkInversion() const { + return m_linkInversion; + } + double getValue() const; void setValue(double value); From e3fdb9b1fe0f920b69abd9b9e515a469a6311005 Mon Sep 17 00:00:00 2001 From: Be Date: Fri, 3 Apr 2020 13:55:46 -0500 Subject: [PATCH 060/443] EffectChainSlot: set Dry/Wet as default mix mode --- src/effects/effectchainslot.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/effects/effectchainslot.cpp b/src/effects/effectchainslot.cpp index 5c0ddf0ae2c3..7ebf5ba8e74c 100644 --- a/src/effects/effectchainslot.cpp +++ b/src/effects/effectchainslot.cpp @@ -28,6 +28,7 @@ EffectChainSlot::EffectChainSlot(const QString& group, m_id(id), m_name(""), m_description(""), + m_mixMode(EffectChainMixMode::DrySlashWet), m_signalProcessingStage(stage), m_pEngineEffectChain(nullptr) { // qDebug() << "EffectChainSlot::EffectChainSlot " << group << ' ' << iChainNumber; From be99aa2efb6a71d5493db4620bbdc9ed8455e59d Mon Sep 17 00:00:00 2001 From: Be Date: Fri, 3 Apr 2020 13:58:09 -0500 Subject: [PATCH 061/443] reimplement saving to effects.xml with new EffectPreset classes --- src/effects/effectbuttonparameterslot.cpp | 33 ------ src/effects/effectbuttonparameterslot.h | 2 - src/effects/effectchainslot.cpp | 58 ---------- src/effects/effectchainslot.h | 10 +- src/effects/effectknobparameterslot.cpp | 59 ---------- src/effects/effectknobparameterslot.h | 2 - src/effects/effectparameterslotbase.h | 4 - src/effects/effectslot.cpp | 105 ------------------ src/effects/effectslot.h | 38 ++++++- src/effects/effectsmanager.cpp | 36 +++++- src/effects/effectsmanager.h | 1 + src/effects/presets/effectchainpreset.cpp | 29 +++++ src/effects/presets/effectchainpreset.h | 7 +- src/effects/presets/effectparameterpreset.cpp | 22 ++++ src/effects/presets/effectparameterpreset.h | 4 + src/effects/presets/effectpreset.cpp | 37 ++++++ src/effects/presets/effectpreset.h | 3 + 17 files changed, 176 insertions(+), 274 deletions(-) diff --git a/src/effects/effectbuttonparameterslot.cpp b/src/effects/effectbuttonparameterslot.cpp index b77ed36029b6..61de22463886 100644 --- a/src/effects/effectbuttonparameterslot.cpp +++ b/src/effects/effectbuttonparameterslot.cpp @@ -100,36 +100,3 @@ void EffectButtonParameterSlot::slotParameterValueChanged(double value) { //qDebug() << debugString() << "slotParameterValueChanged" << value.toDouble(); m_pControlValue->set(value); } - -QDomElement EffectButtonParameterSlot::toXml(QDomDocument* doc) const { - QDomElement parameterElement; - // if (m_pEffectParameter != nullptr) { - // parameterElement = doc->createElement(EffectXml::Parameter); - // XmlParse::addElement(*doc, parameterElement, - // EffectXml::ParameterValue, - // QString::number(m_pControlValue->get())); - // } - - return parameterElement; -} - -void EffectButtonParameterSlot::loadParameterSlotFromXml(const QDomElement& - parameterElement) { - // if (m_pEffectParameter == nullptr) { - // return; - // } - // if (!parameterElement.hasChildNodes()) { - // m_pControlValue->reset(); - // } else { - // bool conversionWorked = false; - // double value = XmlParse::selectNodeDouble(parameterElement, - // EffectXml::ParameterValue, - // &conversionWorked); - // if (conversionWorked) { - // // Need to use setParameterFrom(..., nullptr) here to - // // trigger valueChanged() signal emission and execute slotValueChanged() - // m_pControlValue->setParameterFrom(value, nullptr); - // } - // // If the conversion failed, the default value is kept. - // } -} diff --git a/src/effects/effectbuttonparameterslot.h b/src/effects/effectbuttonparameterslot.h index 7f68be54eaa7..8e1aa847361a 100644 --- a/src/effects/effectbuttonparameterslot.h +++ b/src/effects/effectbuttonparameterslot.h @@ -27,8 +27,6 @@ class EffectButtonParameterSlot : public EffectParameterSlotBase { // Load the parameter of the given effect into this EffectButtonParameterSlot void loadParameter(EffectParameterPointer pEffectParameter) override; - QDomElement toXml(QDomDocument* doc) const override; - void loadParameterSlotFromXml(const QDomElement& parameterElement) override; void clear() override; private slots: diff --git a/src/effects/effectchainslot.cpp b/src/effects/effectchainslot.cpp index 7ebf5ba8e74c..613098f25f52 100644 --- a/src/effects/effectchainslot.cpp +++ b/src/effects/effectchainslot.cpp @@ -386,61 +386,3 @@ void EffectChainSlot::disableForInputChannel(const ChannelHandleAndGroup& handle request->DisableInputChannelForChain.pChannelHandle = &handle_group.handle(); m_pEffectsManager->writeRequest(request); } - -QDomElement EffectChainSlot::toXml(QDomDocument* doc) const { - QDomElement chainElement = doc->createElement(EffectXml::Chain); - - // XmlParse::addElement(*doc, chainElement, EffectXml::ChainId, - // m_pEffectChain->id()); - // XmlParse::addElement(*doc, chainElement, EffectXml::ChainName, - // m_pEffectChain->name()); - // XmlParse::addElement(*doc, chainElement, EffectXml::ChainDescription, - // m_pEffectChain->description()); - // XmlParse::addElement(*doc, chainElement, EffectXml::ChainMixMode, - // EffectChain::mixModeToString( - // static_cast( - // static_cast(m_pControlChainMixMode->get())))); - // XmlParse::addElement(*doc, chainElement, EffectXml::ChainSuperParameter, - // QString::number(m_pControlChainSuperParameter->get())); - - // QDomElement effectsElement = doc->createElement(EffectXml::EffectsRoot); - // for (const auto& pEffectSlot : m_effectSlots) { - // QDomElement effectNode; - // if (pEffectSlot->getEffect()) { - // effectNode = pEffectSlot->toXml(doc); - // } else { - // // Create empty element to ensure effects stay in order - // // if there are empty slots before loaded slots. - // effectNode = doc->createElement(EffectXml::Effect); - // } - // effectsElement.appendChild(effectNode); - // } - // chainElement.appendChild(effectsElement); - - return chainElement; -} - -void EffectChainSlot::loadChainSlotFromXml(const QDomElement& effectChainElement) { - // if (!effectChainElement.hasChildNodes()) { - // return; - // } - - // // FIXME: mix mode is set in EffectChain::createFromXml - - // m_pControlChainSuperParameter->set(XmlParse::selectNodeDouble( - // effectChainElement, - // EffectXml::ChainSuperParameter)); - - // QDomElement effectsElement = XmlParse::selectElement(effectChainElement, - // EffectXml::EffectsRoot); - // QDomNodeList effectsNodeList = effectsElement.childNodes(); - // for (int i = 0; i < m_effectSlots.size(); ++i) { - // if (m_effectSlots[i] != nullptr) { - // QDomNode effectNode = effectsNodeList.at(i); - // if (effectNode.isElement()) { - // QDomElement effectElement = effectNode.toElement(); - // m_effectSlots[i]->loadEffectSlotFromXml(effectElement); - // } - // } - // } -} diff --git a/src/effects/effectchainslot.h b/src/effects/effectchainslot.h index 7cd9b625ad2b..96de37336e73 100644 --- a/src/effects/effectchainslot.h +++ b/src/effects/effectchainslot.h @@ -46,15 +46,15 @@ class EffectChainSlot : public QObject { void setSuperParameter(double value, bool force = false); void setSuperParameterDefaultValue(double value); + EffectChainMixMode mixMode() const { + return m_mixMode; + } void setMixMode(EffectChainMixMode mixMode); const QString& getGroup() const { return m_group; } - QDomElement toXml(QDomDocument* doc) const; - void loadChainSlotFromXml(const QDomElement& effectChainElement); - // Get the human-readable name of the EffectChain const QString& name() const; void setName(const QString& name); @@ -83,6 +83,10 @@ class EffectChainSlot : public QObject { } } + const QList& getEffectSlots() const { + return m_effectSlots; + } + virtual void loadEffect(const unsigned int iEffectSlotNumber, const EffectManifestPointer pManifest, std::unique_ptr pProcessor, diff --git a/src/effects/effectknobparameterslot.cpp b/src/effects/effectknobparameterslot.cpp index 435839e58325..7152f4ee5849 100644 --- a/src/effects/effectknobparameterslot.cpp +++ b/src/effects/effectknobparameterslot.cpp @@ -252,62 +252,3 @@ void EffectKnobParameterSlot::syncSofttakeover() { double EffectKnobParameterSlot::getValueParameter() const { return m_pControlValue->getParameter(); } - -QDomElement EffectKnobParameterSlot::toXml(QDomDocument* doc) const { - QDomElement parameterElement; - // if (m_pEffectParameter != nullptr) { - // parameterElement = doc->createElement(EffectXml::Parameter); - // XmlParse::addElement(*doc, parameterElement, - // EffectXml::ParameterValue, - // QString::number(m_pControlValue->getParameter())); - // XmlParse::addElement(*doc, parameterElement, - // EffectXml::ParameterLinkType, - // EffectManifestParameter::LinkTypeToString( - // static_cast( - // static_cast(m_pControlLinkType->get())))); - // XmlParse::addElement(*doc, parameterElement, - // EffectXml::ParameterLinkInversion, - // QString::number(m_pControlLinkInverse->get())); - // } - - return parameterElement; -} - -void EffectKnobParameterSlot::loadParameterSlotFromXml(const QDomElement& parameterElement) { - // if (m_pEffectParameter == nullptr) { - // return; - // } - // if (!parameterElement.hasChildNodes()) { - // m_pControlValue->reset(); - // m_pControlLinkType->set( - // static_cast(m_pEffectParameter->getDefaultLinkType())); - // m_pControlLinkInverse->set( - // static_cast(m_pEffectParameter->getDefaultLinkInversion())); - // } else { - // // Need to use setParameterFrom(..., nullptr) here to - // // trigger valueChanged() signal emission and execute slotValueChanged() - // bool conversionWorked = false; - // double value = XmlParse::selectNodeDouble(parameterElement, - // EffectXml::ParameterValue, &conversionWorked); - // if (conversionWorked) { - // // Need to use setParameterFrom(..., nullptr) here to - // // trigger valueChanged() signal emission and execute slotValueChanged() - // m_pControlValue->setParameterFrom(value, nullptr); - // } - // // If the conversion failed, the default value is kept. - - // QString linkTypeString = XmlParse::selectNodeQString(parameterElement, - // EffectXml::ParameterLinkType); - // if (!linkTypeString.isEmpty()) { - // m_pControlLinkType->set(static_cast( - // EffectManifestParameter::LinkTypeFromString(linkTypeString))); - // } - - // conversionWorked = false; - // double linkInversion = XmlParse::selectNodeDouble(parameterElement, - // EffectXml::ParameterLinkInversion, &conversionWorked); - // if (conversionWorked) { - // m_pControlLinkInverse->set(linkInversion); - // } - // } -} diff --git a/src/effects/effectknobparameterslot.h b/src/effects/effectknobparameterslot.h index 6ecdf9be1219..32d36e7a037f 100644 --- a/src/effects/effectknobparameterslot.h +++ b/src/effects/effectknobparameterslot.h @@ -40,8 +40,6 @@ class EffectKnobParameterSlot : public EffectParameterSlotBase { void syncSofttakeover() override; // Clear the currently loaded effect - QDomElement toXml(QDomDocument* doc) const override; - void loadParameterSlotFromXml(const QDomElement& parameterElement) override; void clear() override; private slots: diff --git a/src/effects/effectparameterslotbase.h b/src/effects/effectparameterslotbase.h index f6a839fb61a6..61f1a7721cde 100644 --- a/src/effects/effectparameterslotbase.h +++ b/src/effects/effectparameterslotbase.h @@ -43,10 +43,6 @@ class EffectParameterSlotBase : public QObject { return m_pManifestParameter != nullptr; } - - virtual QDomElement toXml(QDomDocument* doc) const = 0; - virtual void loadParameterSlotFromXml(const QDomElement& parameterElement) = 0; - signals: // Signal that indicates that the EffectParameterSlotBase has been updated. void updated(); diff --git a/src/effects/effectslot.cpp b/src/effects/effectslot.cpp index 6c5e86cfa417..67030dcc0d4b 100644 --- a/src/effects/effectslot.cpp +++ b/src/effects/effectslot.cpp @@ -422,108 +422,3 @@ void EffectSlot::slotEffectMetaParameter(double v, bool force) { } } } - -QDomElement EffectSlot::toXml(QDomDocument* doc) const { - QDomElement effectElement = doc->createElement(EffectXml::Effect); - // if (!m_pEffect) { - // return effectElement; - // } - - // QDomElement metaKnobElement = doc->createElement(EffectXml::EffectMetaParameter); - // XmlParse::addElement(*doc, effectElement, - // EffectXml::EffectMetaParameter, - // QString::number(m_pControlMetaParameter->get())); - // EffectManifestPointer pManifest = m_pEffect->getManifest(); - // XmlParse::addElement(*doc, effectElement, - // EffectXml::EffectId, pManifest->id()); - // XmlParse::addElement(*doc, effectElement, - // EffectXml::EffectVersion, pManifest->version()); - - // QDomElement parametersElement = doc->createElement(EffectXml::ParametersRoot); - - // for (const auto& pParameter : m_knobParameterSlots) { - // QDomElement parameterElement = pParameter->toXml(doc); - // if (!parameterElement.hasChildNodes()) { - // continue; - // } - // EffectManifestParameterPointer manifest = pParameter->getManifest(); - // if (!manifest) { - // continue; - // } - // XmlParse::addElement(*doc, parameterElement, - // EffectXml::ParameterId, - // manifest->id()); - // parametersElement.appendChild(parameterElement); - // } - // for (const auto& pParameter : m_buttonParameterSlots) { - // QDomElement parameterElement = pParameter->toXml(doc); - // if (!parameterElement.hasChildNodes()) { - // continue; - // } - // EffectManifestParameterPointer manifest = pParameter->getManifest(); - // if (!manifest) { - // continue; - // } - // XmlParse::addElement(*doc, parameterElement, - // EffectXml::ParameterId, - // pParameter->getManifest()->id()); - // parametersElement.appendChild(parameterElement); - // } - - // effectElement.appendChild(parametersElement); - - return effectElement; -} - -void EffectSlot::loadEffectSlotFromXml(const QDomElement& effectElement) { - // if (!m_pEffect) { - // return; - // } - - // if (!effectElement.hasChildNodes()) { - // return; - // } - - // QDomElement effectIdElement = XmlParse::selectElement(effectElement, - // EffectXml::EffectId); - // if (m_pEffect->getManifest()->id() != effectIdElement.text()) { - // qWarning() << "EffectSlot::loadEffectSlotFromXml" - // << "effect ID in XML does not match presently loaded effect, ignoring."; - // return; - // } - - // m_pControlMetaParameter->set(XmlParse::selectNodeDouble( - // effectElement, EffectXml::EffectMetaParameter)); - // QDomElement parametersElement = XmlParse::selectElement( - // effectElement, EffectXml::ParametersRoot); - // if (!parametersElement.hasChildNodes()) { - // return; - // } - - // QMap parametersById; - // for (const auto& pParameter : m_knobParameterSlots) { - // EffectManifestParameterPointer manifest = pParameter->getManifest(); - // if (manifest) { - // parametersById.insert(manifest->id(), pParameter); - // } - // } - // for (const auto& pParameter : m_buttonParameterSlots) { - // EffectManifestParameterPointer manifest = pParameter->getManifest(); - // if (manifest) { - // parametersById.insert(manifest->id(), pParameter); - // } - // } - - // QDomNodeList parametersNodeList = parametersElement.childNodes(); - // for (int i = 0; i < parametersNodeList.size(); ++i) { - // QDomNode parameterNode = parametersNodeList.at(i); - // if (parameterNode.isElement()) { - // const QString id = XmlParse::selectNodeQString(parameterNode, - // EffectXml::ParameterId); - // EffectParameterSlotBasePointer pParameterSlot = parametersById.value(id); - // if (pParameterSlot != nullptr) { - // pParameterSlot->loadParameterSlotFromXml(parameterNode.toElement()); - // } - // } - // } -} diff --git a/src/effects/effectslot.h b/src/effects/effectslot.h index a8f1dc2f3abc..11530c82ffbf 100644 --- a/src/effects/effectslot.h +++ b/src/effects/effectslot.h @@ -53,6 +53,39 @@ class EffectSlot : public QObject { return m_pEngineEffect != nullptr; } + const QString id() const { + if (!isLoaded() || m_pManifest == nullptr) { + return ""; + } + return m_pManifest->id(); + } + + EffectBackendType backendType() const { + if (!isLoaded() || m_pManifest == nullptr) { + return EffectBackendType::BuiltIn; + } + return m_pManifest->backendType(); + } + + const QMap> getLoadedParameters() const { + return m_loadedParameters; + } + + const QMap> getHiddenParameters() const { + QMap> hiddenParameters; + int numTypes = static_cast(EffectManifestParameter::ParameterType::NUM_TYPES); + for (int parameterTypeId = 0; parameterTypeId < numTypes; ++parameterTypeId) { + const EffectManifestParameter::ParameterType parameterType = + static_cast(parameterTypeId); + for (const auto& pParameter : m_parameters.value(parameterType)) { + if (!m_loadedParameters.value(parameterType).contains(pParameter)) { + hiddenParameters[parameterType].append(pParameter); + } + } + } + return hiddenParameters; + } + void addEffectParameterSlot(EffectManifestParameter::ParameterType parameterType); EffectParameterSlotBasePointer getEffectParameterSlot( EffectManifestParameter::ParameterType parameterType, unsigned int slotNumber); @@ -67,9 +100,6 @@ class EffectSlot : public QObject { return m_group; } - QDomElement toXml(QDomDocument* doc) const; - void loadEffectSlotFromXml(const QDomElement& effectElement); - EffectState* createState(const mixxx::EngineParameters& bufferParameters); EffectManifestPointer getManifest() const; @@ -78,8 +108,6 @@ class EffectSlot : public QObject { void setEnabled(bool enabled); - // static EffectPointer createFromXml(EffectsManager* pEffectsManager, - // const QDomElement& element); void addToEngine(std::unique_ptr, const QSet& activeInputChannels); void removeFromEngine(); diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index 985e1399e5eb..33a5ccff27f1 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -46,8 +46,7 @@ EffectsManager::EffectsManager(QObject* pParent, UserSettingsPointer pConfig, Ch EffectsManager::~EffectsManager() { m_underDestruction = true; - // NOTE(Kshitij) : Use new functions for saving XML files - // saveEffectChains(); + saveEffectChainPresets(); // The EffectChainSlots must be deleted before the EffectsBackends in case // there is an LV2 effect currently loaded. @@ -191,6 +190,10 @@ void EffectsManager::loadEffectChainPreset(EffectChainSlotPointer pChainSlot, } int effectSlot = 0; for (const auto& pEffectPreset : pPreset->effectPresets()) { + if (pEffectPreset->isNull()) { + effectSlot++; + continue; + } EffectsBackendPointer pBackend = m_effectsBackends.value(pEffectPreset->backendType()); VERIFY_OR_DEBUG_ASSERT(pBackend) { effectSlot++; @@ -534,3 +537,32 @@ void EffectsManager::loadEffectChainPresets() { } } } + +void EffectsManager::saveEffectChainPresets() { + QDomDocument doc("MixxxEffects"); + doc.setContent(QString("\n")); + + QDomElement rootElement = doc.createElement("MixxxEffects"); + rootElement.setAttribute("schemaVersion", QString::number(EffectXml::kXmlSchemaVersion)); + doc.appendChild(rootElement); + QDomElement rackElement = doc.createElement(EffectXml::Rack); + rootElement.appendChild(rackElement); + QDomElement chainsElement = doc.createElement(EffectXml::ChainsRoot); + rackElement.appendChild(chainsElement); + + for (const auto pChainSlot : m_standardEffectChainSlots) { + EffectChainSlot* genericChainSlot = static_cast(pChainSlot.get()); + chainsElement.appendChild(EffectChainPreset(genericChainSlot).toXml(&doc)); + } + + QDir settingsPath(m_pConfig->getSettingsPath()); + if (!settingsPath.exists()) { + return; + } + QFile file(settingsPath.absoluteFilePath("effects.xml")); + if (!file.open(QIODevice::Truncate | QIODevice::WriteOnly)) { + return; + } + file.write(doc.toString().toUtf8()); + file.close(); +} diff --git a/src/effects/effectsmanager.h b/src/effects/effectsmanager.h index 045b3fd849cf..f3ec794818e5 100644 --- a/src/effects/effectsmanager.h +++ b/src/effects/effectsmanager.h @@ -151,6 +151,7 @@ class EffectsManager : public QObject { void loadDefaultEffectPresets(); void loadEffectChainPresets(); + void saveEffectChainPresets(); void processEffectsResponses(); void collectGarbage(const EffectsRequest* pResponse); diff --git a/src/effects/presets/effectchainpreset.cpp b/src/effects/presets/effectchainpreset.cpp index df0a44165c10..3e639d047f45 100644 --- a/src/effects/presets/effectchainpreset.cpp +++ b/src/effects/presets/effectchainpreset.cpp @@ -34,5 +34,34 @@ EffectChainPreset::EffectChainPreset(const QDomElement& chainElement) { } } +EffectChainPreset::EffectChainPreset(const EffectChainSlot* chain) { + m_id = chain->id(); + m_name = chain->name(); + m_description = chain->description(); + m_mixMode = chain->mixMode(); + m_dSuper = chain->getSuperParameter(); + for (const auto& pEffectSlot : chain->getEffectSlots()) { + m_effectPresets.append(EffectPresetPointer(new EffectPreset(pEffectSlot))); + } +} + +const QDomElement EffectChainPreset::toXml(QDomDocument* doc) const { + QDomElement chainElement = doc->createElement(EffectXml::Chain); + + XmlParse::addElement(*doc, chainElement, EffectXml::ChainId, m_id); + XmlParse::addElement(*doc, chainElement, EffectXml::ChainName, m_name); + XmlParse::addElement(*doc, chainElement, EffectXml::ChainDescription, m_description); + XmlParse::addElement(*doc, chainElement, EffectXml::ChainMixMode, EffectChainSlot::mixModeToString(m_mixMode)); + XmlParse::addElement(*doc, chainElement, EffectXml::ChainSuperParameter, QString::number(m_dSuper)); + + QDomElement effectsElement = doc->createElement(EffectXml::EffectsRoot); + for (const auto& pEffectPreset : m_effectPresets) { + effectsElement.appendChild(pEffectPreset->toXml(doc)); + } + chainElement.appendChild(effectsElement); + + return chainElement; +} + EffectChainPreset::~EffectChainPreset() { } diff --git a/src/effects/presets/effectchainpreset.h b/src/effects/presets/effectchainpreset.h index df9ffc1a0f4c..cc147592c04b 100644 --- a/src/effects/presets/effectchainpreset.h +++ b/src/effects/presets/effectchainpreset.h @@ -4,12 +4,17 @@ #include "effects/defs.h" #include "effects/presets/effectpreset.h" +class EffectChainSlot; + class EffectChainPreset { public: EffectChainPreset(); EffectChainPreset(const QDomElement& chainElement); + EffectChainPreset(const EffectChainSlot* pChain); ~EffectChainPreset(); + const QDomElement toXml(QDomDocument* doc) const; + const QString& name() const { return m_name; } @@ -20,7 +25,7 @@ class EffectChainPreset { return m_dSuper; } - const QList& effectPresets() { + const QList& effectPresets() const { return m_effectPresets; } diff --git a/src/effects/presets/effectparameterpreset.cpp b/src/effects/presets/effectparameterpreset.cpp index c941d6b50719..67487fe55e3f 100644 --- a/src/effects/presets/effectparameterpreset.cpp +++ b/src/effects/presets/effectparameterpreset.cpp @@ -1,5 +1,6 @@ #include "effects/presets/effectparameterpreset.h" +#include "effects/effectparameter.h" #include "effects/effectxmlelements.h" #include "util/xml.h" @@ -30,6 +31,14 @@ EffectParameterPreset::EffectParameterPreset(const QDomElement& parameterElement } } +EffectParameterPreset::EffectParameterPreset(const EffectParameterPointer pParameter, bool hidden) { + m_id = pParameter->manifest()->id(); + m_dValue = pParameter->getValue(); + m_linkType = pParameter->linkType(); + m_linkInversion = pParameter->linkInversion(); + m_bHidden = hidden; +} + EffectParameterPreset::EffectParameterPreset(const EffectManifestParameterPointer pManifestParameter) { m_id = pManifestParameter->id(); m_dValue = pManifestParameter->getDefault(); @@ -38,5 +47,18 @@ EffectParameterPreset::EffectParameterPreset(const EffectManifestParameterPointe m_bHidden = false; } +const QDomElement EffectParameterPreset::toXml(QDomDocument* doc) const { + QDomElement parameterElement; + if (!m_id.isEmpty()) { + parameterElement = doc->createElement(EffectXml::Parameter); + XmlParse::addElement(*doc, parameterElement, EffectXml::EffectId, m_id); + XmlParse::addElement(*doc, parameterElement, EffectXml::ParameterValue, QString::number(m_dValue)); + XmlParse::addElement(*doc, parameterElement, EffectXml::ParameterLinkType, EffectManifestParameter::LinkTypeToString(m_linkType)); + XmlParse::addElement(*doc, parameterElement, EffectXml::ParameterLinkInversion, QString::number(static_cast(m_linkInversion))); + XmlParse::addElement(*doc, parameterElement, EffectXml::ParameterHidden, QString::number(static_cast(m_bHidden))); + } + return parameterElement; +} + EffectParameterPreset::~EffectParameterPreset() { } diff --git a/src/effects/presets/effectparameterpreset.h b/src/effects/presets/effectparameterpreset.h index 0144b85e127d..1330b0373278 100644 --- a/src/effects/presets/effectparameterpreset.h +++ b/src/effects/presets/effectparameterpreset.h @@ -9,9 +9,13 @@ class EffectParameterPreset { public: EffectParameterPreset(); EffectParameterPreset(const QDomElement& parameterElement); + // The hidden state is stored in the EffectSlot, not the EffectParameter + EffectParameterPreset(const EffectParameterPointer pParameter, bool hidden); EffectParameterPreset(const EffectManifestParameterPointer pManifestParameter); ~EffectParameterPreset(); + const QDomElement toXml(QDomDocument* doc) const; + bool isNull() const { return m_id.isEmpty(); } diff --git a/src/effects/presets/effectpreset.cpp b/src/effects/presets/effectpreset.cpp index 6a35db3b210f..251ad464133e 100644 --- a/src/effects/presets/effectpreset.cpp +++ b/src/effects/presets/effectpreset.cpp @@ -31,6 +31,25 @@ EffectPreset::EffectPreset(const QDomElement& effectElement) { } } +EffectPreset::EffectPreset(const EffectSlotPointer pEffectSlot) { + m_id = pEffectSlot->id(); + m_backendType = pEffectSlot->backendType(); + m_dMetaParameter = pEffectSlot->getMetaParameter(); + // Parameters are reloaded in the order they are saved, so the order of + // loaded effects must be preserved. + int numTypes = static_cast(EffectManifestParameter::ParameterType::NUM_TYPES); + for (int parameterTypeId = 0; parameterTypeId < numTypes; ++parameterTypeId) { + const EffectManifestParameter::ParameterType parameterType = + static_cast(parameterTypeId); + for (const auto& pParameter : pEffectSlot->getLoadedParameters().value(parameterType)) { + m_effectParameterPresets.append(EffectParameterPreset(pParameter, false)); + } + for (const auto& pParameter : pEffectSlot->getHiddenParameters().value(parameterType)) { + m_effectParameterPresets.append(EffectParameterPreset(pParameter, true)); + } + } +} + EffectPreset::EffectPreset(const EffectManifestPointer pManifest) { m_id = pManifest->id(); m_backendType = pManifest->backendType(); @@ -40,5 +59,23 @@ EffectPreset::EffectPreset(const EffectManifestPointer pManifest) { } } +const QDomElement EffectPreset::toXml(QDomDocument* doc) const { + QDomElement effectElement = doc->createElement(EffectXml::Effect); + if (m_id.isEmpty()) { + return effectElement; + } + + XmlParse::addElement(*doc, effectElement, EffectXml::EffectMetaParameter, QString::number(m_dMetaParameter)); + XmlParse::addElement(*doc, effectElement, EffectXml::EffectId, m_id); + + QDomElement parametersElement = doc->createElement(EffectXml::ParametersRoot); + for (const auto& pParameter : m_effectParameterPresets) { + parametersElement.appendChild(pParameter.toXml(doc)); + } + effectElement.appendChild(parametersElement); + + return effectElement; +} + EffectPreset::~EffectPreset() { } diff --git a/src/effects/presets/effectpreset.h b/src/effects/presets/effectpreset.h index e53b5611ceaf..b48d1bd00432 100644 --- a/src/effects/presets/effectpreset.h +++ b/src/effects/presets/effectpreset.h @@ -9,9 +9,12 @@ class EffectPreset { public: EffectPreset(); EffectPreset(const QDomElement& element); + EffectPreset(const EffectSlotPointer pEffectSlot); EffectPreset(const EffectManifestPointer pManifest); ~EffectPreset(); + const QDomElement toXml(QDomDocument* doc) const; + const QString& id() const { return m_id; } From 20a6fe2fafbad6d625be2994e8ceaa3ad2fe1b0b Mon Sep 17 00:00:00 2001 From: Be Date: Fri, 3 Apr 2020 15:34:22 -0500 Subject: [PATCH 062/443] implement setting super and meta knobs from effect presets --- src/effects/effectchainslot.cpp | 5 +++-- src/effects/effectchainslot.h | 3 ++- src/effects/effectslot.cpp | 17 ++++++++++++----- src/effects/effectslot.h | 3 ++- src/effects/effectsmanager.cpp | 12 ++++++++---- src/effects/effectsmanager.h | 3 ++- src/effects/presets/effectpreset.h | 4 ++++ src/effects/specialeffectchainslots.cpp | 10 ++++++---- src/effects/specialeffectchainslots.h | 6 ++++-- 9 files changed, 43 insertions(+), 20 deletions(-) diff --git a/src/effects/effectchainslot.cpp b/src/effects/effectchainslot.cpp index 613098f25f52..50ee9f05713e 100644 --- a/src/effects/effectchainslot.cpp +++ b/src/effects/effectchainslot.cpp @@ -189,8 +189,9 @@ void EffectChainSlot::setDescription(const QString& description) { void EffectChainSlot::loadEffect(const unsigned int iEffectSlotNumber, const EffectManifestPointer pManifest, std::unique_ptr pProcessor, - EffectPresetPointer pPreset) { - m_effectSlots[iEffectSlotNumber]->loadEffect(pManifest, std::move(pProcessor), pPreset, m_enabledInputChannels); + EffectPresetPointer pPreset, + bool adoptMetaknobFromPreset) { + m_effectSlots[iEffectSlotNumber]->loadEffect(pManifest, std::move(pProcessor), pPreset, m_enabledInputChannels, adoptMetaknobFromPreset); } void EffectChainSlot::sendParameterUpdate() { diff --git a/src/effects/effectchainslot.h b/src/effects/effectchainslot.h index 96de37336e73..ddfaaf7a5358 100644 --- a/src/effects/effectchainslot.h +++ b/src/effects/effectchainslot.h @@ -90,7 +90,8 @@ class EffectChainSlot : public QObject { virtual void loadEffect(const unsigned int iEffectSlotNumber, const EffectManifestPointer pManifest, std::unique_ptr pProcessor, - EffectPresetPointer pPreset); + EffectPresetPointer pPreset, + bool adoptMetaknobFromPreset = false); signals: // Signal that whoever is in charge of this EffectChainSlot should load the diff --git a/src/effects/effectslot.cpp b/src/effects/effectslot.cpp index 67030dcc0d4b..9d18eac7e428 100644 --- a/src/effects/effectslot.cpp +++ b/src/effects/effectslot.cpp @@ -214,7 +214,8 @@ EffectParameterSlotBasePointer EffectSlot::getEffectParameterSlot( void EffectSlot::loadEffect(const EffectManifestPointer pManifest, std::unique_ptr pProcessor, EffectPresetPointer pEffectPreset, - const QSet& activeChannels) { + const QSet& activeChannels, + bool adoptMetaknobFromPreset) { if (kEffectDebugOutput) { if (pManifest != nullptr) { qDebug() << this << m_group << "loading effect" << pManifest->id() << pEffectPreset.get() << pProcessor.get(); @@ -283,12 +284,18 @@ void EffectSlot::loadEffect(const EffectManifestPointer pManifest, m_pControlLoaded->forceSet(1.0); - // TODO: load meta knob from preset if (m_pEffectsManager->isAdoptMetaknobValueEnabled()) { - slotEffectMetaParameter(m_pControlMetaParameter->get(), true); + if (adoptMetaknobFromPreset) { + // Update the ControlObject value, but do not sync the parameters + // with slotEffectMetaParameter. This allows presets to intentionally + // save parameters in a state inconsistent with the metaknob. + m_pControlMetaParameter->set(pEffectPreset->metaParameter()); + } else { + slotEffectMetaParameter(m_pControlMetaParameter->get(), true); + } } else { - m_pControlMetaParameter->set(m_pManifest->metaknobDefault()); - slotEffectMetaParameter(m_pManifest->metaknobDefault(), true); + m_pControlMetaParameter->set(pEffectPreset->metaParameter()); + slotEffectMetaParameter(pEffectPreset->metaParameter(), true); } emit effectChanged(); diff --git a/src/effects/effectslot.h b/src/effects/effectslot.h index 11530c82ffbf..48bf1a413563 100644 --- a/src/effects/effectslot.h +++ b/src/effects/effectslot.h @@ -43,7 +43,8 @@ class EffectSlot : public QObject { void loadEffect(const EffectManifestPointer pManifest, std::unique_ptr pProcessor, EffectPresetPointer pPreset, - const QSet& activeChannels); + const QSet& activeChannels, + bool adoptMetaknobFromPreset = false); inline int getEffectSlotNumber() const { return m_iEffectNumber; diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index 33a5ccff27f1..74254f905e87 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -158,11 +158,12 @@ void EffectsManager::loadEqualizerEffect(const QString& deckGroup, void EffectsManager::loadEffect(EffectChainSlotPointer pChainSlot, const int iEffectSlotNumber, const EffectManifestPointer pManifest, - EffectPresetPointer pPreset) { + EffectPresetPointer pPreset, + bool adoptMetaknobFromPreset) { if (pPreset == nullptr) { pPreset = m_defaultPresets.value(pManifest); } - pChainSlot->loadEffect(iEffectSlotNumber, pManifest, createProcessor(pManifest), pPreset); + pChainSlot->loadEffect(iEffectSlotNumber, pManifest, createProcessor(pManifest), pPreset, adoptMetaknobFromPreset); } std::unique_ptr EffectsManager::createProcessor( @@ -188,6 +189,10 @@ void EffectsManager::loadEffectChainPreset(EffectChainSlotPointer pChainSlot, VERIFY_OR_DEBUG_ASSERT(pPreset) { return; } + // Set the superknob before loading the effects so it does not change their + // metaknobs + pChainSlot->setSuperParameter(pPreset->superKnob()); + int effectSlot = 0; for (const auto& pEffectPreset : pPreset->effectPresets()) { if (pEffectPreset->isNull()) { @@ -200,11 +205,10 @@ void EffectsManager::loadEffectChainPreset(EffectChainSlotPointer pChainSlot, continue; } EffectManifestPointer pManifest = pBackend->getManifest(pEffectPreset->id()); - pChainSlot->loadEffect(effectSlot, pManifest, createProcessor(pManifest), pEffectPreset); + pChainSlot->loadEffect(effectSlot, pManifest, createProcessor(pManifest), pEffectPreset, true); effectSlot++; } pChainSlot->setMixMode(pPreset->mixMode()); - pChainSlot->setSuperParameter(pPreset->superKnob()); } const QList EffectsManager::getAvailableEffectManifestsFiltered( diff --git a/src/effects/effectsmanager.h b/src/effects/effectsmanager.h index f3ec794818e5..21117ac42377 100644 --- a/src/effects/effectsmanager.h +++ b/src/effects/effectsmanager.h @@ -90,7 +90,8 @@ class EffectsManager : public QObject { EffectChainSlotPointer pChainSlot, const int iEffectSlotNumber, const EffectManifestPointer pManifest, - EffectPresetPointer pPreset = nullptr); + EffectPresetPointer pPreset = nullptr, + bool adoptMetaknobFromPreset = false); std::unique_ptr createProcessor( const EffectManifestPointer pManifest); diff --git a/src/effects/presets/effectpreset.h b/src/effects/presets/effectpreset.h index b48d1bd00432..ab8901541ceb 100644 --- a/src/effects/presets/effectpreset.h +++ b/src/effects/presets/effectpreset.h @@ -19,6 +19,10 @@ class EffectPreset { return m_id; } + bool isNull() const { + return m_id.isEmpty(); + } + EffectBackendType backendType() const { return m_backendType; } diff --git a/src/effects/specialeffectchainslots.cpp b/src/effects/specialeffectchainslots.cpp index 4748de22958a..2eab61765ead 100644 --- a/src/effects/specialeffectchainslots.cpp +++ b/src/effects/specialeffectchainslots.cpp @@ -116,8 +116,9 @@ void QuickEffectChainSlot::loadEffect( const unsigned int iEffectSlotNumber, const EffectManifestPointer pManifest, std::unique_ptr pProcessor, - EffectPresetPointer pPreset) { - EffectChainSlot::loadEffect(iEffectSlotNumber, pManifest, std::move(pProcessor), pPreset); + EffectPresetPointer pPreset, + bool adoptMetaknobFromPreset) { + EffectChainSlot::loadEffect(iEffectSlotNumber, pManifest, std::move(pProcessor), pPreset, adoptMetaknobFromPreset); slotControlChainSuperParameter(m_pControlChainSuperParameter->get(), true); } @@ -150,10 +151,11 @@ void EqualizerEffectChainSlot::loadEffect( const unsigned int iEffectSlotNumber, const EffectManifestPointer pManifest, std::unique_ptr pProcessor, - EffectPresetPointer pPreset) { + EffectPresetPointer pPreset, + bool adoptMetaknobFromPreset) { // TODO: preserve effect parameters when loading new effect. This will allow // for easy comparison of the sound of different equalizer effects. - EffectChainSlot::loadEffect(iEffectSlotNumber, pManifest, std::move(pProcessor), pPreset); + EffectChainSlot::loadEffect(iEffectSlotNumber, pManifest, std::move(pProcessor), pPreset, adoptMetaknobFromPreset); m_pCOFilterWaveform->set(pManifest->isMixingEQ()); } diff --git a/src/effects/specialeffectchainslots.h b/src/effects/specialeffectchainslots.h index dba82cb34158..4036b2bd1260 100644 --- a/src/effects/specialeffectchainslots.h +++ b/src/effects/specialeffectchainslots.h @@ -40,7 +40,8 @@ class QuickEffectChainSlot : public PerGroupEffectChainSlot { void loadEffect(const unsigned int iEffectSlotNumber, const EffectManifestPointer pManifest, std::unique_ptr pProcessor, - EffectPresetPointer pPreset) override; + EffectPresetPointer pPreset, + bool adoptMetaknobFromPreset = false) override; static QString formatEffectChainSlotGroup(const QString& group); static QString formatEffectSlotGroup(const QString& group, @@ -55,7 +56,8 @@ class EqualizerEffectChainSlot : public PerGroupEffectChainSlot { void loadEffect(const unsigned int iEffectSlotNumber, const EffectManifestPointer pManifest, std::unique_ptr pProcessor, - EffectPresetPointer pPreset) override; + EffectPresetPointer pPreset, + bool adoptMetaknobFromPreset = false) override; static QString formatEffectChainSlotGroup(const QString& group); static QString formatEffectSlotGroup(const QString& group); From 83cb473a19ec7f604bbeabe8f55601fdad7c1a2e Mon Sep 17 00:00:00 2001 From: Be Date: Fri, 3 Apr 2020 15:42:27 -0500 Subject: [PATCH 063/443] add safety checks for constructing effect presets from XML --- src/effects/presets/effectchainpreset.cpp | 4 ++++ src/effects/presets/effectparameterpreset.cpp | 3 +++ src/effects/presets/effectpreset.cpp | 4 ++++ 3 files changed, 11 insertions(+) diff --git a/src/effects/presets/effectchainpreset.cpp b/src/effects/presets/effectchainpreset.cpp index 3e639d047f45..bf6fe42b01b1 100644 --- a/src/effects/presets/effectchainpreset.cpp +++ b/src/effects/presets/effectchainpreset.cpp @@ -8,6 +8,10 @@ EffectChainPreset::EffectChainPreset() { } EffectChainPreset::EffectChainPreset(const QDomElement& chainElement) { + // chainElement can come from untrusted input from the filesystem, so do not DEBUG_ASSERT + if (chainElement.tagName() != EffectXml::Chain) { + return; + } if (!chainElement.hasChildNodes()) { return; } diff --git a/src/effects/presets/effectparameterpreset.cpp b/src/effects/presets/effectparameterpreset.cpp index 67487fe55e3f..d530967f2746 100644 --- a/src/effects/presets/effectparameterpreset.cpp +++ b/src/effects/presets/effectparameterpreset.cpp @@ -8,6 +8,9 @@ EffectParameterPreset::EffectParameterPreset() { } EffectParameterPreset::EffectParameterPreset(const QDomElement& parameterElement) { + VERIFY_OR_DEBUG_ASSERT(parameterElement.tagName() == EffectXml::Parameter) { + return; + } if (!parameterElement.hasChildNodes()) { m_dValue = 0.0; m_id = QString(); diff --git a/src/effects/presets/effectpreset.cpp b/src/effects/presets/effectpreset.cpp index 251ad464133e..5e9ea1ffd55e 100644 --- a/src/effects/presets/effectpreset.cpp +++ b/src/effects/presets/effectpreset.cpp @@ -8,6 +8,10 @@ EffectPreset::EffectPreset() { } EffectPreset::EffectPreset(const QDomElement& effectElement) { + // effectElement can come from untrusted input from the filesystem, so do not DEBUG_ASSERT + if (effectElement.tagName() != EffectXml::Effect) { + return; + } if (!effectElement.hasChildNodes()) { return; } From 39dc824e79099f8d807d864c81024960b0d7ae71 Mon Sep 17 00:00:00 2001 From: Be Date: Fri, 3 Apr 2020 18:14:48 -0500 Subject: [PATCH 064/443] EffectsManager: add getManifest method --- src/effects/effectsmanager.cpp | 4 ++++ src/effects/effectsmanager.h | 1 + 2 files changed, 5 insertions(+) diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index 74254f905e87..b2d031a10f72 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -302,6 +302,10 @@ EffectManifestPointer EffectsManager::getManifestFromUniqueId(const QString& uid uid.mid(-1, delimiterIndex+1)); } +EffectManifestPointer EffectsManager::getManifest(const QString& id, EffectBackendType backendType) const { + return m_effectsBackends.value(backendType)->getManifest(id); +} + void EffectsManager::addStandardEffectChainSlots() { for (int i = 0; i < EffectsManager::kNumStandardEffectChains; ++i) { VERIFY_OR_DEBUG_ASSERT(!m_effectChainSlotsByGroup.contains( diff --git a/src/effects/effectsmanager.h b/src/effects/effectsmanager.h index 21117ac42377..01c0a8e5b04e 100644 --- a/src/effects/effectsmanager.h +++ b/src/effects/effectsmanager.h @@ -132,6 +132,7 @@ class EffectsManager : public QObject { const QString& effectId, EffectManifestPointer* ppManifest, EffectsBackend** ppBackend) const; EffectManifestPointer getManifestFromUniqueId(const QString& uid) const; + EffectManifestPointer getManifest(const QString& id, EffectBackendType backendType) const; void setEffectVisibility(EffectManifestPointer pManifest, bool visibility); bool getEffectVisibility(EffectManifestPointer pManifest); From 690c3c5874d9f44b4a2030b329557289d7d87d8b Mon Sep 17 00:00:00 2001 From: Be Date: Fri, 3 Apr 2020 18:15:14 -0500 Subject: [PATCH 065/443] EffectsManager: save/load a default EffectPreset for each effect --- src/effects/effectsmanager.cpp | 60 ++++++++++++++++++++++++++++++++-- src/effects/effectsmanager.h | 2 ++ 2 files changed, 59 insertions(+), 3 deletions(-) diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index b2d031a10f72..246fbc77fb15 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -47,6 +47,9 @@ EffectsManager::~EffectsManager() { m_underDestruction = true; saveEffectChainPresets(); + for (const auto pEffectPreset : m_defaultPresets) { + saveDefaultForEffect(pEffectPreset); + } // The EffectChainSlots must be deleted before the EffectsBackends in case // there is an LV2 effect currently loaded. @@ -507,15 +510,66 @@ void EffectsManager::collectGarbage(const EffectsRequest* pRequest) { } void EffectsManager::loadDefaultEffectPresets() { - //TODO: load default presets from filesystem, only fallback to manifest if not found + // Load saved defaults from settings directory + QString dirPath(m_pConfig->getSettingsPath() + "/effects/defaults"); + QDir effectsDefaultsDir(dirPath); + effectsDefaultsDir.setFilter(QDir::Files | QDir::Readable); + for (const auto& filePath : effectsDefaultsDir.entryList()) { + QFile file(dirPath + "/" + filePath); + if (!file.open(QIODevice::ReadOnly)) { + continue; + } + QDomDocument doc; + if (!doc.setContent(&file)) { + file.close(); + continue; + } + EffectPresetPointer pEffectPreset(new EffectPreset(doc.documentElement())); + if (!pEffectPreset->isNull()) { + EffectManifestPointer pManifest = getManifest(pEffectPreset->id(), pEffectPreset->backendType()); + m_defaultPresets.insert(pManifest, pEffectPreset); + } + file.close(); + } + + // If no preset was found, generate one from the manifest for (const auto pBackend : m_effectsBackends) { for (const auto pManifest : pBackend->getManifests()) { - m_defaultPresets.insert(pManifest, - EffectPresetPointer(new EffectPreset(pManifest))); + if (!m_defaultPresets.contains(pManifest)) { + m_defaultPresets.insert(pManifest, + EffectPresetPointer(new EffectPreset(pManifest))); + } } } } +void EffectsManager::saveDefaultForEffect(EffectPresetPointer pEffectPreset) { + VERIFY_OR_DEBUG_ASSERT(!pEffectPreset.isNull()) { + return; + } + + const auto pBackend = m_effectsBackends.value(pEffectPreset->backendType()); + const auto pManifest = pBackend->getManifest(pEffectPreset->id()); + m_defaultPresets.insert(pManifest, pEffectPreset); + + QDomDocument doc(EffectXml::Effect); + doc.setContent(QString("\n")); + doc.appendChild(pEffectPreset->toXml(&doc)); + + QString path(m_pConfig->getSettingsPath() + "/effects/defaults"); + QDir effectsDefaultsDir(path); + if (!effectsDefaultsDir.exists()) { + effectsDefaultsDir.mkpath(path); + } + // TODO: sanitize file name? + QFile file(path + "/" + pEffectPreset->id() + ".xml"); + if (!file.open(QIODevice::Truncate | QIODevice::WriteOnly)) { + return; + } + file.write(doc.toString().toUtf8()); + file.close(); +} + void EffectsManager::loadEffectChainPresets() { QDir settingsPath(m_pConfig->getSettingsPath()); QFile file(settingsPath.absoluteFilePath("effects.xml")); diff --git a/src/effects/effectsmanager.h b/src/effects/effectsmanager.h index 01c0a8e5b04e..052aa0743c1c 100644 --- a/src/effects/effectsmanager.h +++ b/src/effects/effectsmanager.h @@ -137,6 +137,8 @@ class EffectsManager : public QObject { void setEffectVisibility(EffectManifestPointer pManifest, bool visibility); bool getEffectVisibility(EffectManifestPointer pManifest); + void saveDefaultForEffect(EffectPresetPointer pEffectPreset); + void setup(); // Write an EffectsRequest to the EngineEffectsManager. EffectsManager takes From d2e43418f59b8a8f253ce99bb2596314959c4735 Mon Sep 17 00:00:00 2001 From: Be Date: Fri, 3 Apr 2020 23:21:14 -0500 Subject: [PATCH 066/443] EffectsManager: add support for saving/loading chain presets --- src/effects/effectsmanager.cpp | 86 ++++++++++++++++++++++++- src/effects/effectsmanager.h | 8 ++- src/effects/presets/effectchainpreset.h | 7 ++ 3 files changed, 97 insertions(+), 4 deletions(-) diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index 246fbc77fb15..f9509611a384 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -1,6 +1,7 @@ #include "effects/effectsmanager.h" #include +#include #include #include @@ -46,7 +47,7 @@ EffectsManager::EffectsManager(QObject* pParent, UserSettingsPointer pConfig, Ch EffectsManager::~EffectsManager() { m_underDestruction = true; - saveEffectChainPresets(); + saveStandardEffectChains(); for (const auto pEffectPreset : m_defaultPresets) { saveDefaultForEffect(pEffectPreset); } @@ -214,6 +215,10 @@ void EffectsManager::loadEffectChainPreset(EffectChainSlotPointer pChainSlot, pChainSlot->setMixMode(pPreset->mixMode()); } +void EffectsManager::loadPresetToStandardChain(int chainNumber, EffectChainPresetPointer pPreset) { + loadEffectChainPreset(m_standardEffectChainSlots.at(chainNumber), pPreset); +} + const QList EffectsManager::getAvailableEffectManifestsFiltered( EffectManifestFilterFnc filter) const { if (filter == nullptr) { @@ -429,6 +434,8 @@ void EffectsManager::setup() { loadDefaultEffectPresets(); loadEffectChainPresets(); + + reloadStandardEffectChains(); } bool EffectsManager::writeRequest(EffectsRequest* request) { @@ -571,6 +578,80 @@ void EffectsManager::saveDefaultForEffect(EffectPresetPointer pEffectPreset) { } void EffectsManager::loadEffectChainPresets() { + QString dirPath(m_pConfig->getSettingsPath() + "/effects/chains"); + QDir effectsDefaultsDir(dirPath); + effectsDefaultsDir.setFilter(QDir::Files | QDir::Readable); + for (const auto& filePath : effectsDefaultsDir.entryList()) { + QFile file(dirPath + "/" + filePath); + if (!file.open(QIODevice::ReadOnly)) { + continue; + } + QDomDocument doc; + if (!doc.setContent(&file)) { + file.close(); + continue; + } + EffectChainPresetPointer pEffectChainPreset(new EffectChainPreset(doc.documentElement())); + if (!pEffectChainPreset->isNull()) { + m_effectChainPresets.insert(pEffectChainPreset->name(), pEffectChainPreset); + } + file.close(); + } +} + +void EffectsManager::savePresetFromStandardEffectChain(int chainNumber) { + StandardEffectChainSlotPointer pStandardChainSlot = m_standardEffectChainSlots.at(chainNumber); + EffectChainSlot* genericChainSlot = static_cast(pStandardChainSlot.get()); + EffectChainPresetPointer pChainPreset(new EffectChainPreset(genericChainSlot)); + + bool okay = false; + QString name = QInputDialog::getText(nullptr, + tr("Save preset for effect chain %1").arg(QString::number(chainNumber)), + tr("Name for new effect chain preset"), + QLineEdit::Normal, + pChainPreset->name(), + &okay); + if (!okay) { + return; + } + + pChainPreset->setName(name); + m_effectChainPresets.insert(name, pChainPreset); + + QString path(m_pConfig->getSettingsPath() + "/effects/chains"); + QDir effectsChainsDir(path); + if (!effectsChainsDir.exists()) { + effectsChainsDir.mkpath(path); + } + // TODO: sanitize file name? + QFile file(path + "/" + name + ".xml"); + if (!file.open(QIODevice::Truncate | QIODevice::WriteOnly)) { + return; + } + + QDomDocument doc(EffectXml::Chain); + doc.setContent(QString("\n")); + doc.appendChild(pChainPreset->toXml(&doc)); + file.write(doc.toString().toUtf8()); + file.close(); +} + +const QList EffectsManager::getAvailableChainPresets() const { + // Sort available chain presets by name alphabetically + QStringList nameList; + for (const auto pChainPreset : m_effectChainPresets) { + nameList.append(pChainPreset->name()); + } + nameList.sort(); + + QList presetList; + for (const auto& name : nameList) { + presetList.append(m_effectChainPresets.value(name)); + } + return presetList; +} + +void EffectsManager::reloadStandardEffectChains() { QDir settingsPath(m_pConfig->getSettingsPath()); QFile file(settingsPath.absoluteFilePath("effects.xml")); QDomDocument doc; @@ -594,13 +675,12 @@ void EffectsManager::loadEffectChainPresets() { if (chainNode.isElement()) { QDomElement chainElement = chainNode.toElement(); EffectChainPresetPointer pPreset(new EffectChainPreset(chainElement)); - m_effectChainPresets.insert(pPreset->name(), pPreset); loadEffectChainPreset(m_standardEffectChainSlots.value(i), pPreset); } } } -void EffectsManager::saveEffectChainPresets() { +void EffectsManager::saveStandardEffectChains() { QDomDocument doc("MixxxEffects"); doc.setContent(QString("\n")); diff --git a/src/effects/effectsmanager.h b/src/effects/effectsmanager.h index 052aa0743c1c..d65e46eee06d 100644 --- a/src/effects/effectsmanager.h +++ b/src/effects/effectsmanager.h @@ -98,6 +98,7 @@ class EffectsManager : public QObject { void loadEffectChainPreset(EffectChainSlotPointer pChainSlot, EffectChainPresetPointer pPreset); + void loadPresetToStandardChain(int chainNumber, EffectChainPresetPointer pPreset); void addStandardEffectChainSlots(); EffectChainSlotPointer getStandardEffectChainSlot(int unitNumber) const; @@ -139,6 +140,9 @@ class EffectsManager : public QObject { void saveDefaultForEffect(EffectPresetPointer pEffectPreset); + void savePresetFromStandardEffectChain(int chainNumber); + const QList getAvailableChainPresets() const; + void setup(); // Write an EffectsRequest to the EngineEffectsManager. EffectsManager takes @@ -155,7 +159,9 @@ class EffectsManager : public QObject { void loadDefaultEffectPresets(); void loadEffectChainPresets(); - void saveEffectChainPresets(); + + void reloadStandardEffectChains(); + void saveStandardEffectChains(); void processEffectsResponses(); void collectGarbage(const EffectsRequest* pResponse); diff --git a/src/effects/presets/effectchainpreset.h b/src/effects/presets/effectchainpreset.h index cc147592c04b..db45095e216e 100644 --- a/src/effects/presets/effectchainpreset.h +++ b/src/effects/presets/effectchainpreset.h @@ -15,6 +15,13 @@ class EffectChainPreset { const QDomElement toXml(QDomDocument* doc) const; + bool isNull() const { + return m_name.isEmpty(); + } + + void setName(const QString& newName) { + m_name = newName; + } const QString& name() const { return m_name; } From e34ce68589064f4d2e73a3c452ed6b885e54b803 Mon Sep 17 00:00:00 2001 From: Be Date: Fri, 3 Apr 2020 23:31:49 -0500 Subject: [PATCH 067/443] add WEffectChainPresetButton to save/load chain presets --- CMakeLists.txt | 1 + src/skin/legacyskinparser.cpp | 10 +++++++ src/skin/legacyskinparser.h | 1 + src/widget/effectwidgetutils.h | 10 +++++++ src/widget/weffectchainpresetbutton.cpp | 36 +++++++++++++++++++++++++ src/widget/weffectchainpresetbutton.h | 26 ++++++++++++++++++ 6 files changed, 84 insertions(+) create mode 100644 src/widget/weffectchainpresetbutton.cpp create mode 100644 src/widget/weffectchainpresetbutton.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 4bd7aeb14e6a..2799c6e92f14 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -676,6 +676,7 @@ add_library(mixxx-lib STATIC EXCLUDE_FROM_ALL src/widget/weffect.cpp src/widget/weffectbuttonparameter.cpp src/widget/weffectchain.cpp + src/widget/weffectchainpresetbutton.cpp src/widget/weffectparameter.cpp src/widget/weffectparameterbase.cpp src/widget/weffectparameterknob.cpp diff --git a/src/skin/legacyskinparser.cpp b/src/skin/legacyskinparser.cpp index 30cd1c3ae7d7..1685e911be40 100644 --- a/src/skin/legacyskinparser.cpp +++ b/src/skin/legacyskinparser.cpp @@ -46,6 +46,7 @@ #include "widget/weffect.h" #include "widget/weffectbuttonparameter.h" #include "widget/weffectchain.h" +#include "widget/weffectchainpresetbutton.h" #include "widget/weffectparameter.h" #include "widget/weffectparameterbase.h" #include "widget/weffectparameterknob.h" @@ -557,6 +558,8 @@ QList LegacySkinParser::parseNode(const QDomElement& node) { result = wrapWidget(parseSizeAwareStack(node)); } else if (nodeName == "EffectChainName") { result = wrapWidget(parseEffectChainName(node)); + } else if (nodeName == "EffectChainPresetButton") { + result = wrapWidget(parseEffectChainPresetButton(node)); } else if (nodeName == "EffectName") { result = wrapWidget(parseEffectName(node)); } else if (nodeName == "EffectSelector") { @@ -1580,6 +1583,13 @@ QWidget* LegacySkinParser::parseEffectChainName(const QDomElement& node) { return pEffectChain; } +QWidget* LegacySkinParser::parseEffectChainPresetButton(const QDomElement& node) { + WEffectChainPresetButton* pButton = new WEffectChainPresetButton(m_pParent, m_pEffectsManager); + commonWidgetSetup(node, pButton); + pButton->setup(node, *m_pContext); + return pButton; +} + QWidget* LegacySkinParser::parseEffectName(const QDomElement& node) { WEffect* pEffect = new WEffect(m_pParent, m_pEffectsManager); setupLabelWidget(node, pEffect); diff --git a/src/skin/legacyskinparser.h b/src/skin/legacyskinparser.h index ad6854625407..0e1f010fc28e 100644 --- a/src/skin/legacyskinparser.h +++ b/src/skin/legacyskinparser.h @@ -81,6 +81,7 @@ class LegacySkinParser : public QObject, public SkinParser { QWidget* parseEngineKey(const QDomElement& node); QWidget* parseBeatSpinBox(const QDomElement& node); QWidget* parseEffectChainName(const QDomElement& node); + QWidget* parseEffectChainPresetButton(const QDomElement& node); QWidget* parseEffectName(const QDomElement& node); QWidget* parseEffectParameterName(const QDomElement& node); QWidget* parseEffectParameterKnob(const QDomElement& node); diff --git a/src/widget/effectwidgetutils.h b/src/widget/effectwidgetutils.h index c65e3c0ebfd1..8ed1742f69b3 100644 --- a/src/widget/effectwidgetutils.h +++ b/src/widget/effectwidgetutils.h @@ -10,6 +10,16 @@ class EffectWidgetUtils { public: + static int getEffectUnitNumberFromNode(const QDomNode& node, const SkinContext& context) { + bool unitNumberOk = false; + int unitNumber = context.selectInt(node, "EffectUnit", &unitNumberOk); + if (unitNumberOk) { + // XML effect nodes are 1-indexed. + return unitNumber - 1; + } + return 0; + } + static EffectChainSlotPointer getEffectChainSlotFromNode( const QDomNode& node, const SkinContext& context, diff --git a/src/widget/weffectchainpresetbutton.cpp b/src/widget/weffectchainpresetbutton.cpp new file mode 100644 index 000000000000..2872bc1ccf99 --- /dev/null +++ b/src/widget/weffectchainpresetbutton.cpp @@ -0,0 +1,36 @@ +#include "widget/weffectchainpresetbutton.h" + +#include "widget/effectwidgetutils.h" + +WEffectChainPresetButton::WEffectChainPresetButton(QWidget* parent, EffectsManager* pEffectsManager) + : QPushButton(parent), + WBaseWidget(this), + m_pEffectsManager(pEffectsManager), + m_pMenu(make_parented(new QMenu(this))) { + setMenu(m_pMenu.get()); + connect(this, + &QPushButton::pressed, + this, + &WEffectChainPresetButton::populateMenu); +} + +void WEffectChainPresetButton::setup(const QDomNode& node, const SkinContext& context) { + m_iChainNumber = EffectWidgetUtils::getEffectUnitNumberFromNode(node, context); + // TODO: set icon +} + +void WEffectChainPresetButton::populateMenu() { + m_pMenu->clear(); + for (const auto pChainPreset : m_pEffectsManager->getAvailableChainPresets()) { + m_pMenu->addAction(pChainPreset->name(), [=]() { + m_pEffectsManager->loadPresetToStandardChain(m_iChainNumber, pChainPreset); + }); + } + m_pMenu->addSeparator(); + m_pMenu->addAction(tr("Save preset"), this, &WEffectChainPresetButton::saveChainPreset); + showMenu(); +} + +void WEffectChainPresetButton::saveChainPreset() { + m_pEffectsManager->savePresetFromStandardEffectChain(m_iChainNumber); +} diff --git a/src/widget/weffectchainpresetbutton.h b/src/widget/weffectchainpresetbutton.h new file mode 100644 index 000000000000..439ba7eb0507 --- /dev/null +++ b/src/widget/weffectchainpresetbutton.h @@ -0,0 +1,26 @@ +#pragma once + +#include +#include + +#include "effects/effectsmanager.h" +#include "skin/skincontext.h" +#include "util/parented_ptr.h" +#include "widget/wbasewidget.h" + +class WEffectChainPresetButton : public QPushButton, public WBaseWidget { + Q_OBJECT + public: + WEffectChainPresetButton(QWidget* parent, EffectsManager* pEffectsManager); + + void setup(const QDomNode& node, const SkinContext& context); + + private slots: + void populateMenu(); + void saveChainPreset(); + + private: + int m_iChainNumber; + EffectsManager* m_pEffectsManager; + parented_ptr m_pMenu; +}; From 2fd03b60c5572d14f39f79cf5e92f4c37b4012c5 Mon Sep 17 00:00:00 2001 From: Be Date: Fri, 3 Apr 2020 23:32:45 -0500 Subject: [PATCH 068/443] LegacySkinParser: rearrange headers with clang-format --- src/skin/legacyskinparser.cpp | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/src/skin/legacyskinparser.cpp b/src/skin/legacyskinparser.cpp index 1685e911be40..0d769c853e47 100644 --- a/src/skin/legacyskinparser.cpp +++ b/src/skin/legacyskinparser.cpp @@ -15,26 +15,21 @@ #include "control/controlobject.h" #include "control/controlproxy.h" - -#include "controllers/keyboard/keyboardeventfilter.h" -#include "mixer/playermanager.h" -#include "mixer/basetrackplayer.h" -#include "library/library.h" -#include "util/xml.h" #include "controllers/controllerlearningeventfilter.h" #include "controllers/controllermanager.h" - -#include "skin/colorschemeparser.h" -#include "skin/skincontext.h" -#include "skin/launchimage.h" - +#include "controllers/keyboard/keyboardeventfilter.h" #include "effects/effectsmanager.h" - +#include "library/library.h" +#include "mixer/basetrackplayer.h" +#include "mixer/playermanager.h" #include "recording/recordingmanager.h" - +#include "skin/colorschemeparser.h" +#include "skin/launchimage.h" +#include "skin/skincontext.h" #include "util/cmdlineargs.h" #include "util/timer.h" #include "util/valuetransformer.h" +#include "util/xml.h" #include "waveform/waveformwidgetfactory.h" #include "widget/controlwidgetconnection.h" #include "widget/wbasewidget.h" From 0500754821500056166a235c8dc4f211033fb2cb Mon Sep 17 00:00:00 2001 From: Be Date: Fri, 3 Apr 2020 23:33:15 -0500 Subject: [PATCH 069/443] Tango: add EffectChainPresetButton to effect units --- res/skins/Tango/fx_unit_left.xml | 5 +++++ res/skins/Tango/fx_unit_right.xml | 9 +++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/res/skins/Tango/fx_unit_left.xml b/res/skins/Tango/fx_unit_left.xml index 50b7ca8a6ee3..2ed1c11e9545 100644 --- a/res/skins/Tango/fx_unit_left.xml +++ b/res/skins/Tango/fx_unit_left.xml @@ -267,6 +267,11 @@ Variables: + + + 30f,30f + + min,me diff --git a/res/skins/Tango/fx_unit_right.xml b/res/skins/Tango/fx_unit_right.xml index 5f7800ce65a1..2f9d27a558e3 100644 --- a/res/skins/Tango/fx_unit_right.xml +++ b/res/skins/Tango/fx_unit_right.xml @@ -93,8 +93,13 @@ Variables: [Skin],show_superknobs visible - - + + + + + + 30f,30f + min,me From a835511dc17c5b7fe31b63a446d291f8048eb1f8 Mon Sep 17 00:00:00 2001 From: Be Date: Sat, 4 Apr 2020 01:57:50 -0500 Subject: [PATCH 070/443] WEffectChainPresetButton: toggle parameters and save defaults --- src/effects/effectslot.cpp | 21 +++++++++ src/effects/effectslot.h | 15 ++++-- src/effects/effectsmanager.cpp | 22 +++++++++ src/effects/effectsmanager.h | 9 ++++ src/widget/weffectchainpresetbutton.cpp | 63 +++++++++++++++++++++++++ 5 files changed, 125 insertions(+), 5 deletions(-) diff --git a/src/effects/effectslot.cpp b/src/effects/effectslot.cpp index 9d18eac7e428..85e934ca02a2 100644 --- a/src/effects/effectslot.cpp +++ b/src/effects/effectslot.cpp @@ -358,6 +358,27 @@ void EffectSlot::loadParameters() { } } +void EffectSlot::hideParameter(EffectParameterPointer pParameter) { + auto parameterType = pParameter->manifest()->parameterType(); + VERIFY_OR_DEBUG_ASSERT(m_parameters.value(parameterType).contains(pParameter)) { + return; + } + m_loadedParameters[parameterType].removeAll(pParameter); + loadParameters(); +} + +void EffectSlot::showParameter(EffectParameterPointer pParameter) { + auto parameterType = pParameter->manifest()->parameterType(); + VERIFY_OR_DEBUG_ASSERT(m_parameters.value(parameterType).contains(pParameter)) { + return; + } + VERIFY_OR_DEBUG_ASSERT(!m_loadedParameters.value(parameterType).contains(pParameter)) { + return; + } + m_loadedParameters[parameterType].append(pParameter); + loadParameters(); +} + void EffectSlot::slotPrevEffect(double v) { if (v > 0) { slotEffectSelector(-1); diff --git a/src/effects/effectslot.h b/src/effects/effectslot.h index 48bf1a413563..dcbaa67f7a63 100644 --- a/src/effects/effectslot.h +++ b/src/effects/effectslot.h @@ -30,6 +30,8 @@ class ControlProxy; class EffectParameter; class EffectKnobParameterSlot; +typedef QMap> ParameterMap; + class EffectSlot : public QObject { Q_OBJECT public: @@ -68,12 +70,12 @@ class EffectSlot : public QObject { return m_pManifest->backendType(); } - const QMap> getLoadedParameters() const { + const ParameterMap getLoadedParameters() const { return m_loadedParameters; } - const QMap> getHiddenParameters() const { - QMap> hiddenParameters; + const ParameterMap getHiddenParameters() const { + ParameterMap hiddenParameters; int numTypes = static_cast(EffectManifestParameter::ParameterType::NUM_TYPES); for (int parameterTypeId = 0; parameterTypeId < numTypes; ++parameterTypeId) { const EffectManifestParameter::ParameterType parameterType = @@ -87,6 +89,9 @@ class EffectSlot : public QObject { return hiddenParameters; } + void hideParameter(EffectParameterPointer pParameter); + void showParameter(EffectParameterPointer pParameter); + void addEffectParameterSlot(EffectManifestParameter::ParameterType parameterType); EffectParameterSlotBasePointer getEffectParameterSlot( EffectManifestParameter::ParameterType parameterType, unsigned int slotNumber); @@ -144,8 +149,8 @@ class EffectSlot : public QObject { EffectManifestPointer m_pManifest; EngineEffectChain* m_pEngineEffectChain; EngineEffect* m_pEngineEffect; - QMap> m_parameters; - QMap> m_loadedParameters; + ParameterMap m_parameters; + ParameterMap m_loadedParameters; QMap> m_parameterSlots; ControlObject* m_pControlLoaded; diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index f9509611a384..4df24bd2e251 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -183,6 +183,22 @@ std::unique_ptr EffectsManager::createProcessor( return pBackend->createProcessor(pManifest); } +ParameterMap EffectsManager::getLoadedParameters(int chainNumber, int effectNumber) const { + return m_standardEffectChainSlots.at(chainNumber)->getEffectSlot(effectNumber)->getLoadedParameters(); +} + +ParameterMap EffectsManager::getHiddenParameters(int chainNumber, int effectNumber) const { + return m_standardEffectChainSlots.at(chainNumber)->getEffectSlot(effectNumber)->getHiddenParameters(); +} + +void EffectsManager::hideParameter(int chainNumber, int effectNumber, EffectParameterPointer pParameter) { + m_standardEffectChainSlots.at(chainNumber)->getEffectSlot(effectNumber)->hideParameter(pParameter); +} + +void EffectsManager::showParameter(int chainNumber, int effectNumber, EffectParameterPointer pParameter) { + m_standardEffectChainSlots.at(chainNumber)->getEffectSlot(effectNumber)->showParameter(pParameter); +} + // This needs to be in EffectsManager rather than EffectChainSlot because it // needs access to the EffectsBackends. void EffectsManager::loadEffectChainPreset(EffectChainSlotPointer pChainSlot, @@ -577,6 +593,12 @@ void EffectsManager::saveDefaultForEffect(EffectPresetPointer pEffectPreset) { file.close(); } +void EffectsManager::saveDefaultForEffect(int unitNumber, int effectNumber) { + auto pSlot = m_standardEffectChainSlots.at(unitNumber)->getEffectSlot(effectNumber); + EffectPresetPointer pPreset(new EffectPreset(pSlot)); + saveDefaultForEffect(pPreset); +} + void EffectsManager::loadEffectChainPresets() { QString dirPath(m_pConfig->getSettingsPath() + "/effects/chains"); QDir effectsDefaultsDir(dirPath); diff --git a/src/effects/effectsmanager.h b/src/effects/effectsmanager.h index d65e46eee06d..dad6cc5a0967 100644 --- a/src/effects/effectsmanager.h +++ b/src/effects/effectsmanager.h @@ -23,6 +23,8 @@ class EngineEffectsManager; class EffectManifest; +typedef QMap> ParameterMap; + class EffectsManager : public QObject { Q_OBJECT public: @@ -96,6 +98,12 @@ class EffectsManager : public QObject { std::unique_ptr createProcessor( const EffectManifestPointer pManifest); + ParameterMap getLoadedParameters(int chainNumber, int effectNumber) const; + ParameterMap getHiddenParameters(int chainNumber, int effectNumber) const; + + void hideParameter(int chainNumber, int effectNumber, EffectParameterPointer pParameter); + void showParameter(int chainNumber, int effectNumber, EffectParameterPointer pParameter); + void loadEffectChainPreset(EffectChainSlotPointer pChainSlot, EffectChainPresetPointer pPreset); void loadPresetToStandardChain(int chainNumber, EffectChainPresetPointer pPreset); @@ -139,6 +147,7 @@ class EffectsManager : public QObject { bool getEffectVisibility(EffectManifestPointer pManifest); void saveDefaultForEffect(EffectPresetPointer pEffectPreset); + void saveDefaultForEffect(int chainNumber, int effcectNumber); void savePresetFromStandardEffectChain(int chainNumber); const QList getAvailableChainPresets() const; diff --git a/src/widget/weffectchainpresetbutton.cpp b/src/widget/weffectchainpresetbutton.cpp index 2872bc1ccf99..657c0f8b8e77 100644 --- a/src/widget/weffectchainpresetbutton.cpp +++ b/src/widget/weffectchainpresetbutton.cpp @@ -1,5 +1,8 @@ #include "widget/weffectchainpresetbutton.h" +#include +#include + #include "widget/effectwidgetutils.h" WEffectChainPresetButton::WEffectChainPresetButton(QWidget* parent, EffectsManager* pEffectsManager) @@ -28,6 +31,66 @@ void WEffectChainPresetButton::populateMenu() { } m_pMenu->addSeparator(); m_pMenu->addAction(tr("Save preset"), this, &WEffectChainPresetButton::saveChainPreset); + + m_pMenu->addSeparator(); + for (int i = 0; i < 3; ++i) { + const ParameterMap loadedParameters = m_pEffectsManager->getLoadedParameters(m_iChainNumber, i); + const ParameterMap hiddenParameters = m_pEffectsManager->getHiddenParameters(m_iChainNumber, i); + + auto pEffectMenu = make_parented(m_pMenu); + pEffectMenu->setTitle(tr("Effect") + " " + QString::number(i + 1)); + + int numTypes = static_cast(EffectManifestParameter::ParameterType::NUM_TYPES); + for (int parameterTypeId = 0; parameterTypeId < numTypes; ++parameterTypeId) { + const EffectManifestParameter::ParameterType parameterType = + static_cast(parameterTypeId); + for (const auto pParameter : loadedParameters.value(parameterType)) { + auto pCheckbox = make_parented(pEffectMenu); + pCheckbox->setChecked(true); + pCheckbox->setText(pParameter->manifest()->name()); + auto handler = [this, pCheckbox{pCheckbox.get()}, i, pParameter] { + if (pCheckbox->isChecked()) { + m_pEffectsManager->showParameter(m_iChainNumber, i, pParameter); + } else { + m_pEffectsManager->hideParameter(m_iChainNumber, i, pParameter); + } + }; + connect(pCheckbox.get(), &QCheckBox::stateChanged, this, handler); + + auto pAction = make_parented(pEffectMenu); + pAction->setDefaultWidget(pCheckbox.get()); + connect(pAction.get(), &QAction::triggered, this, handler); + + pEffectMenu->addAction(pAction.get()); + } + + for (const auto pParameter : hiddenParameters.value(parameterType)) { + auto pCheckbox = make_parented(pEffectMenu); + pCheckbox->setChecked(false); + pCheckbox->setText(pParameter->manifest()->name()); + auto handler = [this, pCheckbox{pCheckbox.get()}, i, pParameter] { + if (pCheckbox->isChecked()) { + m_pEffectsManager->showParameter(m_iChainNumber, i, pParameter); + } else { + m_pEffectsManager->hideParameter(m_iChainNumber, i, pParameter); + } + }; + connect(pCheckbox.get(), &QCheckBox::stateChanged, this, handler); + + auto pAction = make_parented(pEffectMenu); + pAction->setDefaultWidget(pCheckbox.get()); + connect(pAction.get(), &QAction::triggered, this, handler); + + pEffectMenu->addAction(pAction.get()); + } + pEffectMenu->addSeparator(); + } + pEffectMenu->addAction(tr("Save snapshot"), [=] { + m_pEffectsManager->saveDefaultForEffect(m_iChainNumber, i); + }); + m_pMenu->addMenu(pEffectMenu); + } + showMenu(); } From 83e14536ad8440e24510e6c03df88e69b2fff1c3 Mon Sep 17 00:00:00 2001 From: Be Date: Sat, 4 Apr 2020 02:00:43 -0500 Subject: [PATCH 071/443] EffectPreset: save backend type in XML --- src/effects/presets/effectpreset.cpp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/effects/presets/effectpreset.cpp b/src/effects/presets/effectpreset.cpp index 5e9ea1ffd55e..a32d972bd00c 100644 --- a/src/effects/presets/effectpreset.cpp +++ b/src/effects/presets/effectpreset.cpp @@ -69,8 +69,21 @@ const QDomElement EffectPreset::toXml(QDomDocument* doc) const { return effectElement; } - XmlParse::addElement(*doc, effectElement, EffectXml::EffectMetaParameter, QString::number(m_dMetaParameter)); - XmlParse::addElement(*doc, effectElement, EffectXml::EffectId, m_id); + XmlParse::addElement( + *doc, + effectElement, + EffectXml::EffectMetaParameter, + QString::number(m_dMetaParameter)); + XmlParse::addElement( + *doc, + effectElement, + EffectXml::EffectId, + m_id); + XmlParse::addElement( + *doc, + effectElement, + EffectXml::EffectBackendType, + EffectsBackend::backendTypeToString(m_backendType)); QDomElement parametersElement = doc->createElement(EffectXml::ParametersRoot); for (const auto& pParameter : m_effectParameterPresets) { From cc79262e87ad905afb101d180d3e21cf9da9dca1 Mon Sep 17 00:00:00 2001 From: Be Date: Sat, 4 Apr 2020 02:01:07 -0500 Subject: [PATCH 072/443] EffectSlot: fix crash when LV2 effect has >16 parameters --- src/effects/effectslot.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/effects/effectslot.cpp b/src/effects/effectslot.cpp index 85e934ca02a2..ebe014b4fb70 100644 --- a/src/effects/effectslot.cpp +++ b/src/effects/effectslot.cpp @@ -343,6 +343,10 @@ void EffectSlot::loadParameters() { int slot = 0; for (auto pParameter : m_loadedParameters.value(parameterType)) { + // LV2 effects may have more parameters than there are slots available + if ((unsigned)slot >= kDefaultMaxParameters) { + return; + } VERIFY_OR_DEBUG_ASSERT(slot <= m_parameterSlots.value(parameterType).size()) { break; } From 64dbaac1cdd00434bac4b2824adb059ee2c74d00 Mon Sep 17 00:00:00 2001 From: Be Date: Sat, 4 Apr 2020 02:01:52 -0500 Subject: [PATCH 073/443] EffectsManager: sanitize filenames for effect defaults --- src/effects/effectsmanager.cpp | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index 4df24bd2e251..8ba1ee489484 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -584,8 +584,27 @@ void EffectsManager::saveDefaultForEffect(EffectPresetPointer pEffectPreset) { if (!effectsDefaultsDir.exists()) { effectsDefaultsDir.mkpath(path); } - // TODO: sanitize file name? - QFile file(path + "/" + pEffectPreset->id() + ".xml"); + + // The file name does not matter as long as it is unique. The actual id string + // is safely stored in the UTF8 document, regardless of what the filesystem + // supports for file names. + QString fileName = pEffectPreset->id(); + // LV2 ids are URLs + fileName.replace("/", "-"); + QStringList forbiddenCharacters; + forbiddenCharacters << "<" + << ">" + << ":" + << "\"" + << "\'" + << "|" + << "?" + << "*" + << "\\"; + for (const auto& character : forbiddenCharacters) { + fileName.remove(character); + } + QFile file(path + "/" + fileName + ".xml"); if (!file.open(QIODevice::Truncate | QIODevice::WriteOnly)) { return; } From 8585b67d2495e3ef1f20f4cad91b2660e120aacb Mon Sep 17 00:00:00 2001 From: Be Date: Sat, 4 Apr 2020 04:42:25 -0500 Subject: [PATCH 074/443] EngineEffectsManager: fix headphones output This was broken in 5502ecd --- src/engine/effects/engineeffectsmanager.cpp | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/engine/effects/engineeffectsmanager.cpp b/src/engine/effects/engineeffectsmanager.cpp index ba94c602fec8..e1b7dff90f8a 100644 --- a/src/engine/effects/engineeffectsmanager.cpp +++ b/src/engine/effects/engineeffectsmanager.cpp @@ -209,14 +209,9 @@ void EngineEffectsManager::processInner( } } } - - // NOTE(Kshitij) : Check if we are required to add or copy the input samples to pOut - - // pIntermediateInput is the output of the last processed chain. It would be the - // intermediate input of the next chain if there was one. - if (processingOccured) { - SampleUtil::copy(pOut, pIntermediateInput, numSamples); - } + // pIntermediateInput is the output of the last processed chain. It would + // be the intermediate input of the next chain if there was one. + SampleUtil::add(pOut, pIntermediateInput, numSamples); } } From adc66925e7be4081e671de439e58aa530c901355 Mon Sep 17 00:00:00 2001 From: Be Date: Sat, 4 Apr 2020 07:10:07 -0500 Subject: [PATCH 075/443] fix SCons build --- build/depends.py | 7 +++++-- src/effects/presets/effectchainpreset.h | 4 ++++ src/effects/presets/effectparameterpreset.h | 3 +++ src/effects/presets/effectpreset.h | 3 +++ 4 files changed, 15 insertions(+), 2 deletions(-) diff --git a/build/depends.py b/build/depends.py index 0525dcc5ce66..b00481cd1678 100644 --- a/build/depends.py +++ b/build/depends.py @@ -801,8 +801,6 @@ def sources(self, build): "src/effects/effectparameter.cpp", - "src/effects/effectchainpreset.cpp", - "src/effects/effectpreset.cpp", "src/effects/effectchainslot.cpp", "src/effects/specialeffectchainslots.cpp", "src/effects/effectslot.cpp", @@ -832,6 +830,10 @@ def sources(self, build): "src/effects/builtin/metronomeeffect.cpp", "src/effects/builtin/tremoloeffect.cpp", + "src/effects/presets/effectpreset.cpp", + "src/effects/presets/effectchainpreset.cpp", + "src/effects/presets/effectparameterpreset.cpp", + "src/engine/effects/engineeffectsmanager.cpp", "src/engine/effects/engineeffectchain.cpp", "src/engine/effects/engineeffect.cpp", @@ -977,6 +979,7 @@ def sources(self, build): "src/widget/wtrackproperty.cpp", "src/widget/wstarrating.cpp", "src/widget/weffectchain.cpp", + "src/widget/weffectchainpresetbutton.cpp", "src/widget/weffect.cpp", "src/widget/weffectselector.cpp", "src/widget/weffectparameter.cpp", diff --git a/src/effects/presets/effectchainpreset.h b/src/effects/presets/effectchainpreset.h index db45095e216e..35b29efb4269 100644 --- a/src/effects/presets/effectchainpreset.h +++ b/src/effects/presets/effectchainpreset.h @@ -6,6 +6,10 @@ class EffectChainSlot; +// EffectChainPreset is a read-only snapshot of the state of an effect chain +// that can be serialized to/deserialized from XML. It is used to easily +// save/load user-defined chain presets as well as save the state of loaded +// effects when Mixxx shuts down and restarts. class EffectChainPreset { public: EffectChainPreset(); diff --git a/src/effects/presets/effectparameterpreset.h b/src/effects/presets/effectparameterpreset.h index 1330b0373278..614e049f6d2c 100644 --- a/src/effects/presets/effectparameterpreset.h +++ b/src/effects/presets/effectparameterpreset.h @@ -5,12 +5,15 @@ #include "effects/defs.h" #include "effects/effectmanifestparameter.h" +// EffectParameterPreset is a read-only snapshot of the state of an effect parameter +// that can be serialized to/deserialized from XML. class EffectParameterPreset { public: EffectParameterPreset(); EffectParameterPreset(const QDomElement& parameterElement); // The hidden state is stored in the EffectSlot, not the EffectParameter EffectParameterPreset(const EffectParameterPointer pParameter, bool hidden); + // read defaults from manifest EffectParameterPreset(const EffectManifestParameterPointer pManifestParameter); ~EffectParameterPreset(); diff --git a/src/effects/presets/effectpreset.h b/src/effects/presets/effectpreset.h index ab8901541ceb..589f6fa9e385 100644 --- a/src/effects/presets/effectpreset.h +++ b/src/effects/presets/effectpreset.h @@ -5,6 +5,9 @@ #include "effects/effectmanifest.h" #include "effects/presets/effectparameterpreset.h" +// EffectPreset is a read-only snapshot of the state of an effect that can be +// serialized to/deserialized from XML. It is used to save/load chain presets +// as well as save custom defaults for each effect. class EffectPreset { public: EffectPreset(); From 0c54c3c1b61b510ceeaa60f36b628e4d4e3ec36c Mon Sep 17 00:00:00 2001 From: Be Date: Sat, 4 Apr 2020 15:11:54 -0500 Subject: [PATCH 076/443] add documentation for effects classes in the main thread --- src/effects/effectbuttonparameterslot.h | 3 +-- src/effects/effectchainslot.h | 25 +++++++++++++++++++++ src/effects/effectknobparameterslot.h | 3 +-- src/effects/effectmanifest.h | 13 ++++++----- src/effects/effectparameter.h | 18 ++++++++++----- src/effects/effectparameterslotbase.h | 9 +++++--- src/effects/effectsbackend.h | 15 ++++++++++++- src/effects/effectslot.h | 21 +++++++++++++++++ src/effects/effectsmanager.h | 23 ++++++++++++++++--- src/effects/lv2/lv2backend.h | 1 + src/effects/lv2/lv2effectprocessor.h | 1 + src/effects/lv2/lv2manifest.h | 1 + src/effects/presets/effectchainpreset.h | 7 +++--- src/effects/presets/effectparameterpreset.h | 5 +++-- src/effects/presets/effectpreset.h | 5 +++-- 15 files changed, 121 insertions(+), 29 deletions(-) diff --git a/src/effects/effectbuttonparameterslot.h b/src/effects/effectbuttonparameterslot.h index 8e1aa847361a..b7ca06c7201a 100644 --- a/src/effects/effectbuttonparameterslot.h +++ b/src/effects/effectbuttonparameterslot.h @@ -12,8 +12,7 @@ class ControlObject; class ControlPushButton; -// EffectButtonParameterSlot is a wrapper around the parameterX ControlObject -// that loaded with an EffectParameter into itself by the EffectSlot. +// Refer to EffectParameterSlotBase for documentation class EffectButtonParameterSlot : public EffectParameterSlotBase { Q_OBJECT public: diff --git a/src/effects/effectchainslot.h b/src/effects/effectchainslot.h index ddfaaf7a5358..2b519ead2894 100644 --- a/src/effects/effectchainslot.h +++ b/src/effects/effectchainslot.h @@ -21,6 +21,31 @@ class EffectsManager; class EffectProcessor; class EngineEffectChain; +// EffectChainSlot is the main thread representation of an effect chain which +// adds/removes exactly one EngineEffectChain from the engine. Unlike EffectSlot, +// EffectChainSlot does not add/remove EngineEffectChains apart from Mixxx +// startup and shutdown. The lifetime of EngineEffectChain is coupled with +// EffectChainSlot. Do not change this relationship; there is no use case for +// that. + +// EffectChainSlot owns the ControlObjects for the routing switches that assign +// chains to process audio inputs (decks, microphones, auxiliary inputs, +// master mix). EffectChainSlot also owns the ControlObject for the superknob +// which manipulates the metaknob of each effect in the chain. + +// The state of an EffectChainSlot can be saved to and loaded from an +// EffectChainPreset, which can serialize/deserialize that state to/from XML. +// Loading state from an EffectChainPreset is done by +// EffectsManager::loadEffectChainPreset rather than directly by EffectChainSlot +// because loading effects requires access to the EffectsBackends and default +// EffectPresets which are maintained by EffectsManager. + +// Currently EffectChainSlot has a fixed number of EffectSlots. In the future +// this may be extended to create an Effect class to decouple an EngineEffect's +// state from the ControlObjects so that EffectChainSlot could arbitrarily hide +// and rearrange Effects by loading/unloading them from EffectSlots. This would +// be similar to the relationship between EffectSlot and +// EffectParameterSlotBase/EffectParameter. class EffectChainSlot : public QObject { Q_OBJECT public: diff --git a/src/effects/effectknobparameterslot.h b/src/effects/effectknobparameterslot.h index 32d36e7a037f..d622a8d62130 100644 --- a/src/effects/effectknobparameterslot.h +++ b/src/effects/effectknobparameterslot.h @@ -15,8 +15,7 @@ class ControlEffectKnob; class SoftTakeover; class EffectSlot; -// EffectKnobParameterSlot is a wrapper around the parameterX ControlObject -// that loaded with an EffectParameter into itself by the EffectSlot. +// Refer to EffectParameterSlotBase for documentation class EffectKnobParameterSlot : public EffectParameterSlotBase { Q_OBJECT public: diff --git a/src/effects/effectmanifest.h b/src/effects/effectmanifest.h index f608d7d5a271..7f3cc20f9d7d 100644 --- a/src/effects/effectmanifest.h +++ b/src/effects/effectmanifest.h @@ -9,11 +9,14 @@ #include "effects/effectmanifestparameter.h" #include "effects/defs.h" -// An EffectManifest is a full description of the metadata associated with an -// effect (e.g. name, author, version, description, etc.) and the parameters of -// the effect that are intended to be exposed to the rest of Mixxx for user or -// script control. -// +// An EffectManifest is a description of the metadata associated with an effect +// (ID, display name, author, description) and all the parameters of the effect. +// The pair of the ID string and EffectBackendType uniquely identifies an +// effect. EffectManifests are used by EffectBackends to create EffectProcessors +// which implement the DSP logic of the effect. The name string of effect +// parameters in the manifest is used to link EngineEffectParameters +// with member variables used in the DSP logic of the EffectProcessorImpl. + // EffectManifest is composed purely of simple data types, and when an // EffectManifest is const, it should be completely immutable. EffectManifest is // meant to be used in most cases as a reference, and in Qt collections, so it diff --git a/src/effects/effectparameter.h b/src/effects/effectparameter.h index 48347d3bdf15..d010be4f84b6 100644 --- a/src/effects/effectparameter.h +++ b/src/effects/effectparameter.h @@ -13,12 +13,18 @@ class EffectsManager; class EngineEffect; class EffectParameterPreset; -// An EffectParameter is a wrapper around EffectManifestParameter that tracks a -// mutable value state and communicates that state to the engine. This class is -// NOT thread-safe and must only be used from the main thread. Separating this -// from the parameterX ControlObjects in EffectParameterSlot allows for decoupling -// the state of the parameters from the ControlObject states, which is required for -// parameter hiding and rearrangement. +// An EffectParameter is a main thread representation of the state of an +// EngineEffectParameter. EffectParameter tracks a mutable value state and +// communicates that state to the engine. Separating this from the parameterX +// ControlObjects in EffectParameterSlotBase allows for decoupling the state of +// the parameters from the ControlObject states, which is required for +// EffectSlot to do parameter hiding and rearrangement. EffectParameter is +// responsible for manipulating the value of knob parameters when the metaknob +// of the EffectSlot is changed (button parameters cannot be linked to the +// metaknob). For EffectParameter, there is no difference between knobs and +// buttons; only EffectSlot and +// EffectKnobParameterSlot/EffectButtonParameterSlot are responsible for taking +// care of that difference. class EffectParameter { public: EffectParameter(EngineEffect* pEngineEffect, EffectsManager* pEffectsManager, int iParameterNumber, EffectManifestParameterPointer pParameter, EffectParameterPreset preset); diff --git a/src/effects/effectparameterslotbase.h b/src/effects/effectparameterslotbase.h index 61f1a7721cde..0ea793b5f340 100644 --- a/src/effects/effectparameterslotbase.h +++ b/src/effects/effectparameterslotbase.h @@ -14,9 +14,12 @@ class ControlPushButton; class EffectParameter; class EffectSlot; - -// EffectParameterSlotBase is a wrapper around the parameterX ControlObject -// that loaded with an EffectParameter into itself by the EffectSlot. +// EffectParameterSlotBase is a wrapper around the parameterX ControlObject. +// EffectSlot loads/unloads an EffectParameter from the EffectParameterSlotBase. +// The EffectParameter is responsible for communicating changes in the parameter +// value to the EngineEffectParameter. The separation of EffectParameter and +// EffectParameterSlotBase allows EffectSlot to arbitrarily hide and rearrange +// parameters. class EffectParameterSlotBase : public QObject { Q_OBJECT public: diff --git a/src/effects/effectsbackend.h b/src/effects/effectsbackend.h index a9b462000a39..0ff3361820f5 100644 --- a/src/effects/effectsbackend.h +++ b/src/effects/effectsbackend.h @@ -14,7 +14,20 @@ class EffectProcessor; -// EffectsBackend enumerates available effects and instantiates EffectProcessors +// EffectsBackend is an abstract base class that enumerates available effects +// which are identified by EffectManifests. EffectsBackend creates +// EffectProcessors when provided with an EffectManifest from EffectsManager +// indicating which specific EffectProcessor type to create. + +// The EffectProcessors implement the DSP logic specific to each effect. +// EffectManager sends the EffectProcessors down to the EffectChainSlot, which +// sends it down to the EffectSlot. The EffectSlot uses the EffectProcessor to +// create an EngineEffect and add/remove the EngineEffect from the engine. + +// Currently the implemented EffectsBackend subclasses are for the effects +// built into Mixxx and LV2 plugins. Other plugin types such as VSTs could be +// added in the future by creating new subclasses of EffectsBackend, +// EffectManifest, EffectState, and EffectProcessorImpl. class EffectsBackend { public: virtual ~EffectsBackend() {}; diff --git a/src/effects/effectslot.h b/src/effects/effectslot.h index dcbaa67f7a63..ce32e1157d06 100644 --- a/src/effects/effectslot.h +++ b/src/effects/effectslot.h @@ -32,6 +32,27 @@ class EffectKnobParameterSlot; typedef QMap> ParameterMap; +// EffectSlot is a main thread class which creates EngineEffects and sends +// updates to them in response to changes in ControlObjects. It owns the +// ControlObjects for enabling/disabling the effect and the effect metaknob. + +// EffectSlot owns a list of EffectParameterSlotBases and EffectParameters. +// The EffectParameters are the main thread representation of the state of an +// EngineEffectParameter. EffectSlot creates and destroys EffectParameters +// together with the EngineEffect as it loads/unloads EngineEffects. The +// EffectParameterSlotBases own the ControlObjects for manipulating the +// EffectParameters and showing them in skins. The EffectParameterSlotBases are +// permanent for the lifetime the EffectSlot; they are not created or destroyed +// when loading/unloading effects. + +// The separation of EffectParameters from EffectParameterSlotBases decouples +// the parameters available from manipulation via ControlObjects from the +// parameters of EngineEffects. This allows EffectSlot to arbitrarily hide and +// rearrange EffectParameters by loading/unloading them from the +// EffectParameterSlotBases without changing the audio processing in the engine. + +// The state of an EffectSlot is loaded from an EffectPreset and a snapshot +// of EffectSlot's state can be serialized into a EffectPreset. class EffectSlot : public QObject { Q_OBJECT public: diff --git a/src/effects/effectsmanager.h b/src/effects/effectsmanager.h index dad6cc5a0967..02936e525fca 100644 --- a/src/effects/effectsmanager.h +++ b/src/effects/effectsmanager.h @@ -25,6 +25,26 @@ class EffectManifest; typedef QMap> ParameterMap; +// EffectsManager is the interface between the parts of the effects system in +// the main thread and the rest of Mixxx. It creates/destroys a fixed +// set of EffectChainSlots on Mixxx startup/shutdown. EffectManager uses +// EffectBackends and EffectManifests to create EffectProcessors. The +// EffectProcessors are sent down to the EffectChainSlots, then down to the +// EffectSlots which use the EffectProcessors to create EngineEffects and add +// them to the audio engine. + +// EffectsManager saves/loads EffectChainPresets and EffectPresets. +// EffectsManager maintains a list of custom EffectChainPresets in the +// "effects/chains" folder in the user settings folder. The state of loaded +// effects are saved as EffectChainPresets in the effects.xml file in the user +// settings folder, which is used to restore the state of effects on startup. +// Additionally, EffectsManager saves/loads EffectPresets in the +// "effects/defaults" folder in the user settings folder to allow users to +// specify default states when each effect is loaded. + +// To maintain clear separation of responsibilities, GUI classes should NOT +// access the EffectChainSlots or EffectSlots directly. They should interface +// with them indirectly through EffectsManager. class EffectsManager : public QObject { Q_OBJECT public: @@ -53,9 +73,6 @@ class EffectsManager : public QObject { // EffectChainSlotPointer getNextEffectChain(EffectChainSlotPointer pEffectChainSlot); // EffectChainSlotPointer getPrevEffectChain(EffectChainSlotPointer pEffectChainSlot); - // NOTE(Kshitij) : New functions for saving and loading - // bool saveEffectChains(); - static const int kNumStandardEffectChains = 4; bool isAdoptMetaknobValueEnabled() const; diff --git a/src/effects/lv2/lv2backend.h b/src/effects/lv2/lv2backend.h index bfa7503d8f5b..5b0fb09cd8aa 100644 --- a/src/effects/lv2/lv2backend.h +++ b/src/effects/lv2/lv2backend.h @@ -7,6 +7,7 @@ #include "preferences/usersettings.h" #include +// Refer to EffectsBackend for documentation class LV2Backend : public EffectsBackend { public: LV2Backend(); diff --git a/src/effects/lv2/lv2effectprocessor.h b/src/effects/lv2/lv2effectprocessor.h index 923546fa8a8f..92ae7186ae48 100644 --- a/src/effects/lv2/lv2effectprocessor.h +++ b/src/effects/lv2/lv2effectprocessor.h @@ -8,6 +8,7 @@ #include "effects/defs.h" #include "engine/engine.h" +// Refer to EffectProcessor for documentation class LV2EffectGroupState final: public EffectState { public: LV2EffectGroupState(const mixxx::EngineParameters& bufferParameters) diff --git a/src/effects/lv2/lv2manifest.h b/src/effects/lv2/lv2manifest.h index 869757b1d102..c316e6a53ac8 100644 --- a/src/effects/lv2/lv2manifest.h +++ b/src/effects/lv2/lv2manifest.h @@ -7,6 +7,7 @@ #include "effects/defs.h" #include +// Refer to EffectManifest for documentation class LV2Manifest : public EffectManifest { public: enum Status { diff --git a/src/effects/presets/effectchainpreset.h b/src/effects/presets/effectchainpreset.h index 35b29efb4269..15f6cff492ae 100644 --- a/src/effects/presets/effectchainpreset.h +++ b/src/effects/presets/effectchainpreset.h @@ -7,9 +7,9 @@ class EffectChainSlot; // EffectChainPreset is a read-only snapshot of the state of an effect chain -// that can be serialized to/deserialized from XML. It is used to easily -// save/load user-defined chain presets as well as save the state of loaded -// effects when Mixxx shuts down and restarts. +// that can be serialized to/deserialized from XML. It is used by EffectsManager +// to easily save/load user-defined chain presets as well as save the state of +// loaded effects when Mixxx shuts down and restarts. class EffectChainPreset { public: EffectChainPreset(); @@ -23,6 +23,7 @@ class EffectChainPreset { return m_name.isEmpty(); } + // This is the only exception to EffectChainPreset being read-only. void setName(const QString& newName) { m_name = newName; } diff --git a/src/effects/presets/effectparameterpreset.h b/src/effects/presets/effectparameterpreset.h index 614e049f6d2c..e629b25c9d42 100644 --- a/src/effects/presets/effectparameterpreset.h +++ b/src/effects/presets/effectparameterpreset.h @@ -5,8 +5,9 @@ #include "effects/defs.h" #include "effects/effectmanifestparameter.h" -// EffectParameterPreset is a read-only snapshot of the state of an effect parameter -// that can be serialized to/deserialized from XML. +// EffectParameterPreset is a read-only snapshot of the state of an effect +// parameter that can be serialized to/deserialized from XML. It is only used +// as a component of an EffectPreset; never on its own. class EffectParameterPreset { public: EffectParameterPreset(); diff --git a/src/effects/presets/effectpreset.h b/src/effects/presets/effectpreset.h index 589f6fa9e385..930445f96936 100644 --- a/src/effects/presets/effectpreset.h +++ b/src/effects/presets/effectpreset.h @@ -6,8 +6,9 @@ #include "effects/presets/effectparameterpreset.h" // EffectPreset is a read-only snapshot of the state of an effect that can be -// serialized to/deserialized from XML. It is used to save/load chain presets -// as well as save custom defaults for each effect. +// serialized to/deserialized from XML. It is used by EffectChainPreset to +// save/load chain presets. It is also used by EffectsManager to save custom +// defaults for each effect. class EffectPreset { public: EffectPreset(); From f319d5ad7e70ed7f331c5b79a4fb7d2ffb661b87 Mon Sep 17 00:00:00 2001 From: Be Date: Sat, 4 Apr 2020 16:15:23 -0500 Subject: [PATCH 077/443] create src/effects/backends folder to improve organization EffectProcessor, EffectManifest, EffectManifestParameter are so closely related to the backends that I moved them to src/effects/backends too. --- CMakeLists.txt | 50 +++++++++---------- build/depends.py | 47 +++++++++-------- build/features.py | 6 +-- src/control/controleffectknob.cpp | 2 +- src/control/controleffectknob.h | 2 +- .../{ => backends}/builtin/autopaneffect.cpp | 2 +- .../{ => backends}/builtin/autopaneffect.h | 2 +- .../{ => backends}/builtin/balanceeffect.cpp | 0 .../{ => backends}/builtin/balanceeffect.h | 2 +- .../builtin/bessel4lvmixeqeffect.cpp | 4 +- .../builtin/bessel4lvmixeqeffect.h | 4 +- .../builtin/bessel8lvmixeqeffect.cpp | 4 +- .../builtin/bessel8lvmixeqeffect.h | 4 +- .../builtin/biquadfullkilleqeffect.cpp | 4 +- .../builtin/biquadfullkilleqeffect.h | 4 +- .../builtin/bitcrushereffect.cpp | 2 +- .../{ => backends}/builtin/bitcrushereffect.h | 2 +- .../{ => backends}/builtin/builtinbackend.cpp | 40 +++++++-------- .../{ => backends}/builtin/builtinbackend.h | 2 +- .../{ => backends}/builtin/echoeffect.cpp | 2 +- .../{ => backends}/builtin/echoeffect.h | 2 +- .../{ => backends}/builtin/equalizer_util.h | 2 +- .../{ => backends}/builtin/filtereffect.cpp | 2 +- .../{ => backends}/builtin/filtereffect.h | 2 +- .../{ => backends}/builtin/flangereffect.cpp | 2 +- .../{ => backends}/builtin/flangereffect.h | 2 +- .../builtin/graphiceqeffect.cpp | 2 +- .../{ => backends}/builtin/graphiceqeffect.h | 2 +- .../builtin/linkwitzriley8eqeffect.cpp | 4 +- .../builtin/linkwitzriley8eqeffect.h | 2 +- .../builtin/loudnesscontoureffect.cpp | 2 +- .../builtin/loudnesscontoureffect.h | 2 +- .../{ => backends}/builtin/lvmixeqbase.h | 2 +- .../{ => backends}/builtin/metronomeclick.h | 0 .../builtin/metronomeeffect.cpp | 1 - .../{ => backends}/builtin/metronomeeffect.h | 2 +- .../builtin/moogladder4filtereffect.cpp | 2 +- .../builtin/moogladder4filtereffect.h | 2 +- .../builtin/parametriceqeffect.cpp | 2 +- .../builtin/parametriceqeffect.h | 2 +- .../{ => backends}/builtin/phasereffect.cpp | 2 +- .../{ => backends}/builtin/phasereffect.h | 2 +- .../{ => backends}/builtin/reverbeffect.cpp | 2 +- .../{ => backends}/builtin/reverbeffect.h | 2 +- .../builtin/threebandbiquadeqeffect.cpp | 4 +- .../builtin/threebandbiquadeqeffect.h | 2 +- .../{ => backends}/builtin/tremoloeffect.cpp | 2 +- .../{ => backends}/builtin/tremoloeffect.h | 2 +- src/effects/{ => backends}/effectmanifest.cpp | 2 +- src/effects/{ => backends}/effectmanifest.h | 2 +- .../effectmanifestparameter.cpp | 2 +- .../{ => backends}/effectmanifestparameter.h | 0 src/effects/{ => backends}/effectprocessor.h | 0 src/effects/{ => backends}/effectsbackend.h | 4 -- src/effects/{ => backends}/lv2/lv2backend.cpp | 6 +-- src/effects/{ => backends}/lv2/lv2backend.h | 4 +- .../{ => backends}/lv2/lv2effectprocessor.cpp | 3 +- .../{ => backends}/lv2/lv2effectprocessor.h | 4 +- .../{ => backends}/lv2/lv2manifest.cpp | 4 +- src/effects/{ => backends}/lv2/lv2manifest.h | 2 +- src/effects/effectchainslot.cpp | 2 +- src/effects/effectparameter.h | 2 +- src/effects/effectparameterslotbase.h | 2 +- src/effects/effectslot.h | 2 +- src/effects/effectsmanager.cpp | 2 +- src/effects/effectsmanager.h | 2 +- src/effects/presets/effectparameterpreset.h | 2 +- src/effects/presets/effectpreset.cpp | 3 +- src/effects/presets/effectpreset.h | 2 +- src/engine/effects/engineeffect.h | 4 +- src/engine/effects/engineeffectparameter.h | 2 +- src/mixxx.cpp | 4 +- src/preferences/dialog/dlgprefeffects.cpp | 4 +- src/preferences/dialog/dlgprefeq.cpp | 4 +- src/preferences/effectsettingsmodel.h | 2 +- 75 files changed, 154 insertions(+), 160 deletions(-) rename src/effects/{ => backends}/builtin/autopaneffect.cpp (99%) rename src/effects/{ => backends}/builtin/autopaneffect.h (98%) rename src/effects/{ => backends}/builtin/balanceeffect.cpp (100%) rename src/effects/{ => backends}/builtin/balanceeffect.h (97%) rename src/effects/{ => backends}/builtin/bessel4lvmixeqeffect.cpp (96%) rename src/effects/{ => backends}/builtin/bessel4lvmixeqeffect.h (95%) rename src/effects/{ => backends}/builtin/bessel8lvmixeqeffect.cpp (96%) rename src/effects/{ => backends}/builtin/bessel8lvmixeqeffect.h (95%) rename src/effects/{ => backends}/builtin/biquadfullkilleqeffect.cpp (99%) rename src/effects/{ => backends}/builtin/biquadfullkilleqeffect.h (97%) rename src/effects/{ => backends}/builtin/bitcrushereffect.cpp (98%) rename src/effects/{ => backends}/builtin/bitcrushereffect.h (97%) rename src/effects/{ => backends}/builtin/builtinbackend.cpp (71%) rename src/effects/{ => backends}/builtin/builtinbackend.h (98%) rename src/effects/{ => backends}/builtin/echoeffect.cpp (99%) rename src/effects/{ => backends}/builtin/echoeffect.h (98%) rename src/effects/{ => backends}/builtin/equalizer_util.h (98%) rename src/effects/{ => backends}/builtin/filtereffect.cpp (99%) rename src/effects/{ => backends}/builtin/filtereffect.h (97%) rename src/effects/{ => backends}/builtin/flangereffect.cpp (99%) rename src/effects/{ => backends}/builtin/flangereffect.h (98%) rename src/effects/{ => backends}/builtin/graphiceqeffect.cpp (99%) rename src/effects/{ => backends}/builtin/graphiceqeffect.h (97%) rename src/effects/{ => backends}/builtin/linkwitzriley8eqeffect.cpp (98%) rename src/effects/{ => backends}/builtin/linkwitzriley8eqeffect.h (97%) rename src/effects/{ => backends}/builtin/loudnesscontoureffect.cpp (99%) rename src/effects/{ => backends}/builtin/loudnesscontoureffect.h (97%) rename src/effects/{ => backends}/builtin/lvmixeqbase.h (99%) rename src/effects/{ => backends}/builtin/metronomeclick.h (100%) rename src/effects/{ => backends}/builtin/metronomeeffect.cpp (99%) rename src/effects/{ => backends}/builtin/metronomeeffect.h (96%) rename src/effects/{ => backends}/builtin/moogladder4filtereffect.cpp (99%) rename src/effects/{ => backends}/builtin/moogladder4filtereffect.h (97%) rename src/effects/{ => backends}/builtin/parametriceqeffect.cpp (99%) rename src/effects/{ => backends}/builtin/parametriceqeffect.h (97%) rename src/effects/{ => backends}/builtin/phasereffect.cpp (99%) rename src/effects/{ => backends}/builtin/phasereffect.h (98%) rename src/effects/{ => backends}/builtin/reverbeffect.cpp (99%) rename src/effects/{ => backends}/builtin/reverbeffect.h (97%) rename src/effects/{ => backends}/builtin/threebandbiquadeqeffect.cpp (99%) rename src/effects/{ => backends}/builtin/threebandbiquadeqeffect.h (98%) rename src/effects/{ => backends}/builtin/tremoloeffect.cpp (99%) rename src/effects/{ => backends}/builtin/tremoloeffect.h (97%) rename src/effects/{ => backends}/effectmanifest.cpp (76%) rename src/effects/{ => backends}/effectmanifest.h (99%) rename src/effects/{ => backends}/effectmanifestparameter.cpp (75%) rename src/effects/{ => backends}/effectmanifestparameter.h (100%) rename src/effects/{ => backends}/effectprocessor.h (100%) rename src/effects/{ => backends}/effectsbackend.h (95%) rename src/effects/{ => backends}/lv2/lv2backend.cpp (95%) rename src/effects/{ => backends}/lv2/lv2backend.h (92%) rename src/effects/{ => backends}/lv2/lv2effectprocessor.cpp (98%) rename src/effects/{ => backends}/lv2/lv2effectprocessor.h (95%) rename src/effects/{ => backends}/lv2/lv2manifest.cpp (98%) rename src/effects/{ => backends}/lv2/lv2manifest.h (96%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2799c6e92f14..c5bfd4d4ed59 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -231,36 +231,36 @@ add_library(mixxx-lib STATIC EXCLUDE_FROM_ALL src/dialog/dlgaboutdlg.ui src/dialog/dlgdevelopertools.cpp src/dialog/dlgdevelopertoolsdlg.ui - src/effects/builtin/autopaneffect.cpp - src/effects/builtin/balanceeffect.cpp - src/effects/builtin/bessel4lvmixeqeffect.cpp - src/effects/builtin/bessel8lvmixeqeffect.cpp - src/effects/builtin/biquadfullkilleqeffect.cpp - src/effects/builtin/bitcrushereffect.cpp - src/effects/builtin/builtinbackend.cpp - src/effects/builtin/echoeffect.cpp - src/effects/builtin/filtereffect.cpp - src/effects/builtin/flangereffect.cpp - src/effects/builtin/graphiceqeffect.cpp - src/effects/builtin/linkwitzriley8eqeffect.cpp - src/effects/builtin/loudnesscontoureffect.cpp - src/effects/builtin/metronomeeffect.cpp - src/effects/builtin/moogladder4filtereffect.cpp - src/effects/builtin/parametriceqeffect.cpp - src/effects/builtin/phasereffect.cpp - src/effects/builtin/reverbeffect.cpp - src/effects/builtin/threebandbiquadeqeffect.cpp - src/effects/builtin/tremoloeffect.cpp src/effects/effectbuttonparameterslot.cpp src/effects/effectchainslot.cpp - src/effects/effectmanifest.cpp - src/effects/effectmanifestparameter.cpp src/effects/effectparameter.cpp src/effects/effectknobparameterslot.cpp src/effects/effectparameterslotbase.cpp src/effects/effectslot.cpp src/effects/effectsmanager.cpp src/effects/specialeffectchainslots.cpp + src/effects/backends/effectmanifest.cpp + src/effects/backends/effectmanifestparameter.cpp + src/effects/backends/builtin/autopaneffect.cpp + src/effects/backends/builtin/balanceeffect.cpp + src/effects/backends/builtin/bessel4lvmixeqeffect.cpp + src/effects/backends/builtin/bessel8lvmixeqeffect.cpp + src/effects/backends/builtin/biquadfullkilleqeffect.cpp + src/effects/backends/builtin/bitcrushereffect.cpp + src/effects/backends/builtin/builtinbackend.cpp + src/effects/backends/builtin/echoeffect.cpp + src/effects/backends/builtin/filtereffect.cpp + src/effects/backends/builtin/flangereffect.cpp + src/effects/backends/builtin/graphiceqeffect.cpp + src/effects/backends/builtin/linkwitzriley8eqeffect.cpp + src/effects/backends/builtin/loudnesscontoureffect.cpp + src/effects/backends/builtin/metronomeeffect.cpp + src/effects/backends/builtin/moogladder4filtereffect.cpp + src/effects/backends/builtin/parametriceqeffect.cpp + src/effects/backends/builtin/phasereffect.cpp + src/effects/backends/builtin/reverbeffect.cpp + src/effects/backends/builtin/threebandbiquadeqeffect.cpp + src/effects/backends/builtin/tremoloeffect.cpp src/effects/presets/effectpreset.cpp src/effects/presets/effectchainpreset.cpp src/effects/presets/effectparameterpreset.cpp @@ -1806,9 +1806,9 @@ if(LILV) message(FATAL_ERROR "Lilv (LV2) support requires the liblilv-0 and its development headers.") endif() target_sources(mixxx-lib PRIVATE - src/effects/lv2/lv2backend.cpp - src/effects/lv2/lv2effectprocessor.cpp - src/effects/lv2/lv2manifest.cpp + src/effects/backends/lv2/lv2backend.cpp + src/effects/backends/lv2/lv2effectprocessor.cpp + src/effects/backends/lv2/lv2manifest.cpp ) target_compile_definitions(mixxx-lib PUBLIC __LILV__) target_link_libraries(mixxx-lib PUBLIC Lilv::Lilv) diff --git a/build/depends.py b/build/depends.py index b00481cd1678..05a925efc645 100644 --- a/build/depends.py +++ b/build/depends.py @@ -796,11 +796,7 @@ def sources(self, build): "src/preferences/colorpalettesettings.cpp", "src/preferences/dlgpreferencepage.cpp", - "src/effects/effectmanifest.cpp", - "src/effects/effectmanifestparameter.cpp", - "src/effects/effectparameter.cpp", - "src/effects/effectchainslot.cpp", "src/effects/specialeffectchainslots.cpp", "src/effects/effectslot.cpp", @@ -809,26 +805,29 @@ def sources(self, build): "src/effects/effectbuttonparameterslot.cpp", "src/effects/effectsmanager.cpp", - "src/effects/builtin/builtinbackend.cpp", - "src/effects/builtin/bitcrushereffect.cpp", - "src/effects/builtin/balanceeffect.cpp", - "src/effects/builtin/linkwitzriley8eqeffect.cpp", - "src/effects/builtin/bessel4lvmixeqeffect.cpp", - "src/effects/builtin/bessel8lvmixeqeffect.cpp", - "src/effects/builtin/threebandbiquadeqeffect.cpp", - "src/effects/builtin/biquadfullkilleqeffect.cpp", - "src/effects/builtin/loudnesscontoureffect.cpp", - "src/effects/builtin/graphiceqeffect.cpp", - "src/effects/builtin/parametriceqeffect.cpp", - "src/effects/builtin/flangereffect.cpp", - "src/effects/builtin/filtereffect.cpp", - "src/effects/builtin/moogladder4filtereffect.cpp", - "src/effects/builtin/reverbeffect.cpp", - "src/effects/builtin/echoeffect.cpp", - "src/effects/builtin/autopaneffect.cpp", - "src/effects/builtin/phasereffect.cpp", - "src/effects/builtin/metronomeeffect.cpp", - "src/effects/builtin/tremoloeffect.cpp", + "src/effects/backends/effectmanifest.cpp", + "src/effects/backends/effectmanifestparameter.cpp", + + "src/effects/backends/builtin/builtinbackend.cpp", + "src/effects/backends/builtin/bitcrushereffect.cpp", + "src/effects/backends/builtin/balanceeffect.cpp", + "src/effects/backends/builtin/linkwitzriley8eqeffect.cpp", + "src/effects/backends/builtin/bessel4lvmixeqeffect.cpp", + "src/effects/backends/builtin/bessel8lvmixeqeffect.cpp", + "src/effects/backends/builtin/threebandbiquadeqeffect.cpp", + "src/effects/backends/builtin/biquadfullkilleqeffect.cpp", + "src/effects/backends/builtin/loudnesscontoureffect.cpp", + "src/effects/backends/builtin/graphiceqeffect.cpp", + "src/effects/backends/builtin/parametriceqeffect.cpp", + "src/effects/backends/builtin/flangereffect.cpp", + "src/effects/backends/builtin/filtereffect.cpp", + "src/effects/backends/builtin/moogladder4filtereffect.cpp", + "src/effects/backends/builtin/reverbeffect.cpp", + "src/effects/backends/builtin/echoeffect.cpp", + "src/effects/backends/builtin/autopaneffect.cpp", + "src/effects/backends/builtin/phasereffect.cpp", + "src/effects/backends/builtin/metronomeeffect.cpp", + "src/effects/backends/builtin/tremoloeffect.cpp", "src/effects/presets/effectpreset.cpp", "src/effects/presets/effectchainpreset.cpp", diff --git a/build/features.py b/build/features.py index 0dcdf75d95d1..c3d9f02d5a6a 100644 --- a/build/features.py +++ b/build/features.py @@ -1169,9 +1169,9 @@ def configure(self, build, conf): build.env.Append(CPPDEFINES='__LILV__') def sources(self, build): - return ['src/effects/lv2/lv2backend.cpp', - 'src/effects/lv2/lv2effectprocessor.cpp', - 'src/effects/lv2/lv2manifest.cpp'] + return ['src/effects/backends/lv2/lv2backend.cpp', + 'src/effects/backends/lv2/lv2effectprocessor.cpp', + 'src/effects/backends/lv2/lv2manifest.cpp'] class Battery(Feature): def description(self): diff --git a/src/control/controleffectknob.cpp b/src/control/controleffectknob.cpp index 1c99d2f836f3..99b0c0806e34 100644 --- a/src/control/controleffectknob.cpp +++ b/src/control/controleffectknob.cpp @@ -1,7 +1,7 @@ #include "control/controleffectknob.h" #include "util/math.h" -#include "effects/effectmanifestparameter.h" +#include "effects/backends/effectmanifestparameter.h" ControlEffectKnob::ControlEffectKnob(ConfigKey key, double dMinValue, double dMaxValue) : ControlPotmeter(key, dMinValue, dMaxValue) { diff --git a/src/control/controleffectknob.h b/src/control/controleffectknob.h index 07f6d1a4cd65..fe94bba4b8b6 100644 --- a/src/control/controleffectknob.h +++ b/src/control/controleffectknob.h @@ -2,7 +2,7 @@ #define CONTROLEFFECTKNOB_H #include "control/controlpotmeter.h" -#include "effects/effectmanifestparameter.h" +#include "effects/backends/effectmanifestparameter.h" class ControlEffectKnob : public ControlPotmeter { Q_OBJECT diff --git a/src/effects/builtin/autopaneffect.cpp b/src/effects/backends/builtin/autopaneffect.cpp similarity index 99% rename from src/effects/builtin/autopaneffect.cpp rename to src/effects/backends/builtin/autopaneffect.cpp index 6b50782123da..0010e69a3e70 100644 --- a/src/effects/builtin/autopaneffect.cpp +++ b/src/effects/backends/builtin/autopaneffect.cpp @@ -1,4 +1,4 @@ -#include "effects/builtin/autopaneffect.h" +#include "effects/backends/builtin/autopaneffect.h" #include diff --git a/src/effects/builtin/autopaneffect.h b/src/effects/backends/builtin/autopaneffect.h similarity index 98% rename from src/effects/builtin/autopaneffect.h rename to src/effects/backends/builtin/autopaneffect.h index 83ccf636fe4c..640e5ff04deb 100644 --- a/src/effects/builtin/autopaneffect.h +++ b/src/effects/backends/builtin/autopaneffect.h @@ -3,7 +3,7 @@ #include -#include "effects/effectprocessor.h" +#include "effects/backends/effectprocessor.h" #include "engine/effects/engineeffect.h" #include "engine/effects/engineeffectparameter.h" #include "engine/filters/enginefilterpansingle.h" diff --git a/src/effects/builtin/balanceeffect.cpp b/src/effects/backends/builtin/balanceeffect.cpp similarity index 100% rename from src/effects/builtin/balanceeffect.cpp rename to src/effects/backends/builtin/balanceeffect.cpp diff --git a/src/effects/builtin/balanceeffect.h b/src/effects/backends/builtin/balanceeffect.h similarity index 97% rename from src/effects/builtin/balanceeffect.h rename to src/effects/backends/builtin/balanceeffect.h index 553fc919b9d7..4df0ed66fa47 100644 --- a/src/effects/builtin/balanceeffect.h +++ b/src/effects/backends/builtin/balanceeffect.h @@ -1,7 +1,7 @@ #ifndef BALANCEEFFECT_H #define BALANCEEFFECT_H -#include "effects/effectprocessor.h" +#include "effects/backends/effectprocessor.h" #include "engine/effects/engineeffect.h" #include "engine/effects/engineeffectparameter.h" #include "engine/filters/enginefilterlinkwitzriley4.h" diff --git a/src/effects/builtin/bessel4lvmixeqeffect.cpp b/src/effects/backends/builtin/bessel4lvmixeqeffect.cpp similarity index 96% rename from src/effects/builtin/bessel4lvmixeqeffect.cpp rename to src/effects/backends/builtin/bessel4lvmixeqeffect.cpp index d0e7973c04f3..ecbb67a4f1bc 100644 --- a/src/effects/builtin/bessel4lvmixeqeffect.cpp +++ b/src/effects/backends/builtin/bessel4lvmixeqeffect.cpp @@ -1,6 +1,6 @@ -#include "effects/builtin/bessel4lvmixeqeffect.h" +#include "effects/backends/builtin/bessel4lvmixeqeffect.h" -#include "effects/builtin/equalizer_util.h" +#include "effects/backends/builtin/equalizer_util.h" #include "util/math.h" // static diff --git a/src/effects/builtin/bessel4lvmixeqeffect.h b/src/effects/backends/builtin/bessel4lvmixeqeffect.h similarity index 95% rename from src/effects/builtin/bessel4lvmixeqeffect.h rename to src/effects/backends/builtin/bessel4lvmixeqeffect.h index 6cf42c1c14fd..90d119fd8ef8 100644 --- a/src/effects/builtin/bessel4lvmixeqeffect.h +++ b/src/effects/backends/builtin/bessel4lvmixeqeffect.h @@ -4,8 +4,8 @@ #include #include "control/controlproxy.h" -#include "effects/effectprocessor.h" -#include "effects/builtin/lvmixeqbase.h" +#include "effects/backends/effectprocessor.h" +#include "effects/backends/builtin/lvmixeqbase.h" #include "engine/effects/engineeffect.h" #include "engine/effects/engineeffectparameter.h" #include "engine/filters/enginefilterbessel4.h" diff --git a/src/effects/builtin/bessel8lvmixeqeffect.cpp b/src/effects/backends/builtin/bessel8lvmixeqeffect.cpp similarity index 96% rename from src/effects/builtin/bessel8lvmixeqeffect.cpp rename to src/effects/backends/builtin/bessel8lvmixeqeffect.cpp index 75ef2558398b..0f4dbad0c3d3 100644 --- a/src/effects/builtin/bessel8lvmixeqeffect.cpp +++ b/src/effects/backends/builtin/bessel8lvmixeqeffect.cpp @@ -1,6 +1,6 @@ -#include "effects/builtin/bessel8lvmixeqeffect.h" +#include "effects/backends/builtin/bessel8lvmixeqeffect.h" -#include "effects/builtin/equalizer_util.h" +#include "effects/backends/builtin/equalizer_util.h" #include "util/math.h" // static diff --git a/src/effects/builtin/bessel8lvmixeqeffect.h b/src/effects/backends/builtin/bessel8lvmixeqeffect.h similarity index 95% rename from src/effects/builtin/bessel8lvmixeqeffect.h rename to src/effects/backends/builtin/bessel8lvmixeqeffect.h index d9f672d46d95..bd71048e2284 100644 --- a/src/effects/builtin/bessel8lvmixeqeffect.h +++ b/src/effects/backends/builtin/bessel8lvmixeqeffect.h @@ -1,12 +1,12 @@ #ifndef BESSEL8LVMIXEQEFFECT_H #define BESSEL8LVMIXEQEFFECT_H -#include "effects/builtin/lvmixeqbase.h" +#include "effects/backends/builtin/lvmixeqbase.h" #include #include "control/controlproxy.h" -#include "effects/effectprocessor.h" +#include "effects/backends/effectprocessor.h" #include "engine/effects/engineeffect.h" #include "engine/effects/engineeffectparameter.h" #include "engine/filters/enginefilterbessel8.h" diff --git a/src/effects/builtin/biquadfullkilleqeffect.cpp b/src/effects/backends/builtin/biquadfullkilleqeffect.cpp similarity index 99% rename from src/effects/builtin/biquadfullkilleqeffect.cpp rename to src/effects/backends/builtin/biquadfullkilleqeffect.cpp index b1a3c9c30e1b..da76b4bf24da 100644 --- a/src/effects/builtin/biquadfullkilleqeffect.cpp +++ b/src/effects/backends/builtin/biquadfullkilleqeffect.cpp @@ -1,6 +1,6 @@ -#include "effects/builtin/biquadfullkilleqeffect.h" +#include "effects/backends/builtin/biquadfullkilleqeffect.h" -#include "effects/builtin/equalizer_util.h" +#include "effects/backends/builtin/equalizer_util.h" #include "util/math.h" namespace { diff --git a/src/effects/builtin/biquadfullkilleqeffect.h b/src/effects/backends/builtin/biquadfullkilleqeffect.h similarity index 97% rename from src/effects/builtin/biquadfullkilleqeffect.h rename to src/effects/backends/builtin/biquadfullkilleqeffect.h index 9650ece5d809..3d3daada42ea 100644 --- a/src/effects/builtin/biquadfullkilleqeffect.h +++ b/src/effects/backends/builtin/biquadfullkilleqeffect.h @@ -2,12 +2,12 @@ #define BIQUADFULLKILLEQEFFECT_H #include "control/controlproxy.h" -#include "effects/effectprocessor.h" +#include "effects/backends/effectprocessor.h" #include "engine/effects/engineeffect.h" #include "engine/effects/engineeffectparameter.h" #include "engine/filters/enginefilterbiquad1.h" #include "engine/filters/enginefilterbessel4.h" -#include "effects/builtin/lvmixeqbase.h" +#include "effects/backends/builtin/lvmixeqbase.h" #include "engine/filters/enginefilterdelay.h" #include "util/class.h" #include "util/defs.h" diff --git a/src/effects/builtin/bitcrushereffect.cpp b/src/effects/backends/builtin/bitcrushereffect.cpp similarity index 98% rename from src/effects/builtin/bitcrushereffect.cpp rename to src/effects/backends/builtin/bitcrushereffect.cpp index 6fdb2d40c53b..0141c1e11db5 100644 --- a/src/effects/builtin/bitcrushereffect.cpp +++ b/src/effects/backends/builtin/bitcrushereffect.cpp @@ -1,4 +1,4 @@ -#include "effects/builtin/bitcrushereffect.h" +#include "effects/backends/builtin/bitcrushereffect.h" #include "util/sample.h" diff --git a/src/effects/builtin/bitcrushereffect.h b/src/effects/backends/builtin/bitcrushereffect.h similarity index 97% rename from src/effects/builtin/bitcrushereffect.h rename to src/effects/backends/builtin/bitcrushereffect.h index 5a744b9dc887..005502806b1e 100644 --- a/src/effects/builtin/bitcrushereffect.h +++ b/src/effects/backends/builtin/bitcrushereffect.h @@ -3,7 +3,7 @@ #include -#include "effects/effectprocessor.h" +#include "effects/backends/effectprocessor.h" #include "engine/effects/engineeffect.h" #include "engine/effects/engineeffectparameter.h" #include "util/class.h" diff --git a/src/effects/builtin/builtinbackend.cpp b/src/effects/backends/builtin/builtinbackend.cpp similarity index 71% rename from src/effects/builtin/builtinbackend.cpp rename to src/effects/backends/builtin/builtinbackend.cpp index 47cd5d94de19..2cb839d374ed 100644 --- a/src/effects/builtin/builtinbackend.cpp +++ b/src/effects/backends/builtin/builtinbackend.cpp @@ -1,28 +1,28 @@ #include -#include "effects/builtin/builtinbackend.h" -#include "effects/builtin/flangereffect.h" -#include "effects/builtin/bitcrushereffect.h" -#include "effects/builtin/balanceeffect.h" -#include "effects/builtin/linkwitzriley8eqeffect.h" -#include "effects/builtin/bessel8lvmixeqeffect.h" -#include "effects/builtin/bessel4lvmixeqeffect.h" -#include "effects/builtin/threebandbiquadeqeffect.h" -#include "effects/builtin/biquadfullkilleqeffect.h" -#include "effects/builtin/graphiceqeffect.h" -#include "effects/builtin/parametriceqeffect.h" -#include "effects/builtin/filtereffect.h" -#include "effects/builtin/moogladder4filtereffect.h" +#include "effects/backends/builtin/builtinbackend.h" +#include "effects/backends/builtin/flangereffect.h" +#include "effects/backends/builtin/bitcrushereffect.h" +#include "effects/backends/builtin/balanceeffect.h" +#include "effects/backends/builtin/linkwitzriley8eqeffect.h" +#include "effects/backends/builtin/bessel8lvmixeqeffect.h" +#include "effects/backends/builtin/bessel4lvmixeqeffect.h" +#include "effects/backends/builtin/threebandbiquadeqeffect.h" +#include "effects/backends/builtin/biquadfullkilleqeffect.h" +#include "effects/backends/builtin/graphiceqeffect.h" +#include "effects/backends/builtin/parametriceqeffect.h" +#include "effects/backends/builtin/filtereffect.h" +#include "effects/backends/builtin/moogladder4filtereffect.h" #ifndef __MACAPPSTORE__ -#include "effects/builtin/reverbeffect.h" +#include "effects/backends/builtin/reverbeffect.h" #endif -#include "effects/builtin/echoeffect.h" -#include "effects/builtin/autopaneffect.h" -#include "effects/builtin/phasereffect.h" -#include "effects/builtin/loudnesscontoureffect.h" -#include "effects/builtin/metronomeeffect.h" -#include "effects/builtin/tremoloeffect.h" +#include "effects/backends/builtin/echoeffect.h" +#include "effects/backends/builtin/autopaneffect.h" +#include "effects/backends/builtin/phasereffect.h" +#include "effects/backends/builtin/loudnesscontoureffect.h" +#include "effects/backends/builtin/metronomeeffect.h" +#include "effects/backends/builtin/tremoloeffect.h" BuiltInBackend::BuiltInBackend() { // Keep this list in a reasonable order diff --git a/src/effects/builtin/builtinbackend.h b/src/effects/backends/builtin/builtinbackend.h similarity index 98% rename from src/effects/builtin/builtinbackend.h rename to src/effects/backends/builtin/builtinbackend.h index 31d15146bbb5..69609a9f7730 100644 --- a/src/effects/builtin/builtinbackend.h +++ b/src/effects/backends/builtin/builtinbackend.h @@ -2,7 +2,7 @@ #define BUILTINBACKEND_H #include "effects/defs.h" -#include "effects/effectsbackend.h" +#include "effects/backends/effectsbackend.h" class BuiltInBackend : public EffectsBackend { public: diff --git a/src/effects/builtin/echoeffect.cpp b/src/effects/backends/builtin/echoeffect.cpp similarity index 99% rename from src/effects/builtin/echoeffect.cpp rename to src/effects/backends/builtin/echoeffect.cpp index 2f9cb6776cf4..a56e700ab166 100644 --- a/src/effects/builtin/echoeffect.cpp +++ b/src/effects/backends/builtin/echoeffect.cpp @@ -1,4 +1,4 @@ -#include "effects/builtin/echoeffect.h" +#include "effects/backends/builtin/echoeffect.h" #include diff --git a/src/effects/builtin/echoeffect.h b/src/effects/backends/builtin/echoeffect.h similarity index 98% rename from src/effects/builtin/echoeffect.h rename to src/effects/backends/builtin/echoeffect.h index cd3ea5d813b8..b82c3149edb3 100644 --- a/src/effects/builtin/echoeffect.h +++ b/src/effects/backends/builtin/echoeffect.h @@ -3,7 +3,7 @@ #include -#include "effects/effectprocessor.h" +#include "effects/backends/effectprocessor.h" #include "engine/engine.h" #include "engine/effects/engineeffect.h" #include "engine/effects/engineeffectparameter.h" diff --git a/src/effects/builtin/equalizer_util.h b/src/effects/backends/builtin/equalizer_util.h similarity index 98% rename from src/effects/builtin/equalizer_util.h rename to src/effects/backends/builtin/equalizer_util.h index 60deda21de9d..96fc0823b337 100644 --- a/src/effects/builtin/equalizer_util.h +++ b/src/effects/backends/builtin/equalizer_util.h @@ -3,7 +3,7 @@ #include -#include "effects/effectmanifest.h" +#include "effects/backends/effectmanifest.h" class EqualizerUtil { public: diff --git a/src/effects/builtin/filtereffect.cpp b/src/effects/backends/builtin/filtereffect.cpp similarity index 99% rename from src/effects/builtin/filtereffect.cpp rename to src/effects/backends/builtin/filtereffect.cpp index 75ae701a0c7e..8591184e4c88 100644 --- a/src/effects/builtin/filtereffect.cpp +++ b/src/effects/backends/builtin/filtereffect.cpp @@ -1,4 +1,4 @@ -#include "effects/builtin/filtereffect.h" +#include "effects/backends/builtin/filtereffect.h" #include "util/math.h" namespace { diff --git a/src/effects/builtin/filtereffect.h b/src/effects/backends/builtin/filtereffect.h similarity index 97% rename from src/effects/builtin/filtereffect.h rename to src/effects/backends/builtin/filtereffect.h index 383dd1a54242..97737405856e 100644 --- a/src/effects/builtin/filtereffect.h +++ b/src/effects/backends/builtin/filtereffect.h @@ -1,7 +1,7 @@ #ifndef FILTEREFFECT_H #define FILTEREFFECT_H -#include "effects/effectprocessor.h" +#include "effects/backends/effectprocessor.h" #include "engine/effects/engineeffect.h" #include "engine/effects/engineeffectparameter.h" #include "engine/filters/enginefilterbiquad1.h" diff --git a/src/effects/builtin/flangereffect.cpp b/src/effects/backends/builtin/flangereffect.cpp similarity index 99% rename from src/effects/builtin/flangereffect.cpp rename to src/effects/backends/builtin/flangereffect.cpp index ae49811c93d7..7161f4c74c42 100644 --- a/src/effects/builtin/flangereffect.cpp +++ b/src/effects/backends/builtin/flangereffect.cpp @@ -1,4 +1,4 @@ -#include "effects/builtin/flangereffect.h" +#include "effects/backends/builtin/flangereffect.h" #include diff --git a/src/effects/builtin/flangereffect.h b/src/effects/backends/builtin/flangereffect.h similarity index 98% rename from src/effects/builtin/flangereffect.h rename to src/effects/backends/builtin/flangereffect.h index 28d65f38b46e..bcdac48e1e79 100644 --- a/src/effects/builtin/flangereffect.h +++ b/src/effects/backends/builtin/flangereffect.h @@ -3,7 +3,7 @@ #include -#include "effects/effectprocessor.h" +#include "effects/backends/effectprocessor.h" #include "engine/effects/engineeffect.h" #include "engine/effects/engineeffectparameter.h" #include "util/class.h" diff --git a/src/effects/builtin/graphiceqeffect.cpp b/src/effects/backends/builtin/graphiceqeffect.cpp similarity index 99% rename from src/effects/builtin/graphiceqeffect.cpp rename to src/effects/backends/builtin/graphiceqeffect.cpp index 38881e37f42d..a2b0c09aaf82 100644 --- a/src/effects/builtin/graphiceqeffect.cpp +++ b/src/effects/backends/builtin/graphiceqeffect.cpp @@ -1,4 +1,4 @@ -#include "effects/builtin/graphiceqeffect.h" +#include "effects/backends/builtin/graphiceqeffect.h" #include "util/math.h" #define Q 1.2247449 diff --git a/src/effects/builtin/graphiceqeffect.h b/src/effects/backends/builtin/graphiceqeffect.h similarity index 97% rename from src/effects/builtin/graphiceqeffect.h rename to src/effects/backends/builtin/graphiceqeffect.h index 1a8877404f31..029d1306892d 100644 --- a/src/effects/builtin/graphiceqeffect.h +++ b/src/effects/backends/builtin/graphiceqeffect.h @@ -4,7 +4,7 @@ #include #include "control/controlproxy.h" -#include "effects/effectprocessor.h" +#include "effects/backends/effectprocessor.h" #include "engine/effects/engineeffect.h" #include "engine/effects/engineeffectparameter.h" #include "engine/filters/enginefilterbiquad1.h" diff --git a/src/effects/builtin/linkwitzriley8eqeffect.cpp b/src/effects/backends/builtin/linkwitzriley8eqeffect.cpp similarity index 98% rename from src/effects/builtin/linkwitzriley8eqeffect.cpp rename to src/effects/backends/builtin/linkwitzriley8eqeffect.cpp index 3f7da0278902..d6d2b072a924 100644 --- a/src/effects/builtin/linkwitzriley8eqeffect.cpp +++ b/src/effects/backends/builtin/linkwitzriley8eqeffect.cpp @@ -1,6 +1,6 @@ -#include "effects/builtin/linkwitzriley8eqeffect.h" +#include "effects/backends/builtin/linkwitzriley8eqeffect.h" -#include "effects/builtin/equalizer_util.h" +#include "effects/backends/builtin/equalizer_util.h" #include "util/math.h" static const unsigned int kStartupSamplerate = 44100; diff --git a/src/effects/builtin/linkwitzriley8eqeffect.h b/src/effects/backends/builtin/linkwitzriley8eqeffect.h similarity index 97% rename from src/effects/builtin/linkwitzriley8eqeffect.h rename to src/effects/backends/builtin/linkwitzriley8eqeffect.h index e1561510c41c..c92bef831f2e 100644 --- a/src/effects/builtin/linkwitzriley8eqeffect.h +++ b/src/effects/backends/builtin/linkwitzriley8eqeffect.h @@ -4,7 +4,7 @@ #include #include "control/controlproxy.h" -#include "effects/effectprocessor.h" +#include "effects/backends/effectprocessor.h" #include "engine/effects/engineeffect.h" #include "engine/effects/engineeffectparameter.h" #include "engine/filters/enginefilterlinkwitzriley8.h" diff --git a/src/effects/builtin/loudnesscontoureffect.cpp b/src/effects/backends/builtin/loudnesscontoureffect.cpp similarity index 99% rename from src/effects/builtin/loudnesscontoureffect.cpp rename to src/effects/backends/builtin/loudnesscontoureffect.cpp index 732f85fbc261..7be2a759f1e0 100644 --- a/src/effects/builtin/loudnesscontoureffect.cpp +++ b/src/effects/backends/builtin/loudnesscontoureffect.cpp @@ -1,4 +1,4 @@ -#include "effects/builtin/loudnesscontoureffect.h" +#include "effects/backends/builtin/loudnesscontoureffect.h" #include "util/math.h" namespace { diff --git a/src/effects/builtin/loudnesscontoureffect.h b/src/effects/backends/builtin/loudnesscontoureffect.h similarity index 97% rename from src/effects/builtin/loudnesscontoureffect.h rename to src/effects/backends/builtin/loudnesscontoureffect.h index fbc440aec734..6b665e0c7ea2 100644 --- a/src/effects/builtin/loudnesscontoureffect.h +++ b/src/effects/backends/builtin/loudnesscontoureffect.h @@ -2,7 +2,7 @@ #define LOUDNESSCONTOUREFFECT_H #include "control/controlproxy.h" -#include "effects/effectprocessor.h" +#include "effects/backends/effectprocessor.h" #include "engine/effects/engineeffect.h" #include "engine/effects/engineeffectparameter.h" #include "engine/filters/enginefilterbiquad1.h" diff --git a/src/effects/builtin/lvmixeqbase.h b/src/effects/backends/builtin/lvmixeqbase.h similarity index 99% rename from src/effects/builtin/lvmixeqbase.h rename to src/effects/backends/builtin/lvmixeqbase.h index 167450001185..b02f4792a269 100644 --- a/src/effects/builtin/lvmixeqbase.h +++ b/src/effects/backends/builtin/lvmixeqbase.h @@ -1,7 +1,7 @@ #ifndef BESSELLVMIXEQBASE_H #define BESSELLVMIXEQBASE_H -#include "effects/effectprocessor.h" +#include "effects/backends/effectprocessor.h" #include "engine/filters/enginefilterdelay.h" #include "util/defs.h" #include "util/math.h" diff --git a/src/effects/builtin/metronomeclick.h b/src/effects/backends/builtin/metronomeclick.h similarity index 100% rename from src/effects/builtin/metronomeclick.h rename to src/effects/backends/builtin/metronomeclick.h diff --git a/src/effects/builtin/metronomeeffect.cpp b/src/effects/backends/builtin/metronomeeffect.cpp similarity index 99% rename from src/effects/builtin/metronomeeffect.cpp rename to src/effects/backends/builtin/metronomeeffect.cpp index 6156470ce348..da39bd52628a 100644 --- a/src/effects/builtin/metronomeeffect.cpp +++ b/src/effects/backends/builtin/metronomeeffect.cpp @@ -130,4 +130,3 @@ void MetronomeEffect::processChannel( copyFrames); } } - diff --git a/src/effects/builtin/metronomeeffect.h b/src/effects/backends/builtin/metronomeeffect.h similarity index 96% rename from src/effects/builtin/metronomeeffect.h rename to src/effects/backends/builtin/metronomeeffect.h index 674d9f739d71..53495d4544dc 100644 --- a/src/effects/builtin/metronomeeffect.h +++ b/src/effects/backends/builtin/metronomeeffect.h @@ -3,7 +3,7 @@ #include -#include "effects/effectprocessor.h" +#include "effects/backends/effectprocessor.h" #include "engine/effects/engineeffect.h" #include "engine/effects/engineeffectparameter.h" #include "engine/filters/enginefilterpansingle.h" diff --git a/src/effects/builtin/moogladder4filtereffect.cpp b/src/effects/backends/builtin/moogladder4filtereffect.cpp similarity index 99% rename from src/effects/builtin/moogladder4filtereffect.cpp rename to src/effects/backends/builtin/moogladder4filtereffect.cpp index 47ed2965ff6d..3a448e4aecff 100644 --- a/src/effects/builtin/moogladder4filtereffect.cpp +++ b/src/effects/backends/builtin/moogladder4filtereffect.cpp @@ -1,4 +1,4 @@ -#include "effects/builtin/moogladder4filtereffect.h" +#include "effects/backends/builtin/moogladder4filtereffect.h" #include "util/math.h" diff --git a/src/effects/builtin/moogladder4filtereffect.h b/src/effects/backends/builtin/moogladder4filtereffect.h similarity index 97% rename from src/effects/builtin/moogladder4filtereffect.h rename to src/effects/backends/builtin/moogladder4filtereffect.h index bb2640dcb5fc..ffe4bae9d4f5 100644 --- a/src/effects/builtin/moogladder4filtereffect.h +++ b/src/effects/backends/builtin/moogladder4filtereffect.h @@ -1,7 +1,7 @@ #ifndef MOOGLADDER4FILTEREFFECT_H #define MOOGLADDER4FILTEREFFECT_H -#include "effects/effectprocessor.h" +#include "effects/backends/effectprocessor.h" #include "engine/effects/engineeffect.h" #include "engine/effects/engineeffectparameter.h" #include "engine/filters/enginefiltermoogladder4.h" diff --git a/src/effects/builtin/parametriceqeffect.cpp b/src/effects/backends/builtin/parametriceqeffect.cpp similarity index 99% rename from src/effects/builtin/parametriceqeffect.cpp rename to src/effects/backends/builtin/parametriceqeffect.cpp index 65f0341748e1..64b38bcd98c5 100644 --- a/src/effects/builtin/parametriceqeffect.cpp +++ b/src/effects/backends/builtin/parametriceqeffect.cpp @@ -1,4 +1,4 @@ -#include "effects/builtin/parametriceqeffect.h" +#include "effects/backends/builtin/parametriceqeffect.h" #include "util/math.h" namespace { diff --git a/src/effects/builtin/parametriceqeffect.h b/src/effects/backends/builtin/parametriceqeffect.h similarity index 97% rename from src/effects/builtin/parametriceqeffect.h rename to src/effects/backends/builtin/parametriceqeffect.h index c1241a524e2d..eaca61ca52de 100644 --- a/src/effects/builtin/parametriceqeffect.h +++ b/src/effects/backends/builtin/parametriceqeffect.h @@ -5,7 +5,7 @@ #include #include "control/controlproxy.h" -#include "effects/effectprocessor.h" +#include "effects/backends/effectprocessor.h" #include "engine/effects/engineeffect.h" #include "engine/effects/engineeffectparameter.h" #include "engine/filters/enginefilterbiquad1.h" diff --git a/src/effects/builtin/phasereffect.cpp b/src/effects/backends/builtin/phasereffect.cpp similarity index 99% rename from src/effects/builtin/phasereffect.cpp rename to src/effects/backends/builtin/phasereffect.cpp index 29d33e25c670..aeab92689074 100644 --- a/src/effects/builtin/phasereffect.cpp +++ b/src/effects/backends/builtin/phasereffect.cpp @@ -1,4 +1,4 @@ -#include "effects/builtin/phasereffect.h" +#include "effects/backends/builtin/phasereffect.h" #include diff --git a/src/effects/builtin/phasereffect.h b/src/effects/backends/builtin/phasereffect.h similarity index 98% rename from src/effects/builtin/phasereffect.h rename to src/effects/backends/builtin/phasereffect.h index 317eb2701799..d52754215b48 100644 --- a/src/effects/builtin/phasereffect.h +++ b/src/effects/backends/builtin/phasereffect.h @@ -1,7 +1,7 @@ #ifndef PHASEREFFECT_H #define PHASEREFFECT_H -#include "effects/effectprocessor.h" +#include "effects/backends/effectprocessor.h" #include "engine/effects/engineeffect.h" #include "engine/effects/engineeffectparameter.h" #include "util/class.h" diff --git a/src/effects/builtin/reverbeffect.cpp b/src/effects/backends/builtin/reverbeffect.cpp similarity index 99% rename from src/effects/builtin/reverbeffect.cpp rename to src/effects/backends/builtin/reverbeffect.cpp index 9c213576f34c..815d75a9b18d 100644 --- a/src/effects/builtin/reverbeffect.cpp +++ b/src/effects/backends/builtin/reverbeffect.cpp @@ -1,4 +1,4 @@ -#include "effects/builtin/reverbeffect.h" +#include "effects/backends/builtin/reverbeffect.h" #include diff --git a/src/effects/builtin/reverbeffect.h b/src/effects/backends/builtin/reverbeffect.h similarity index 97% rename from src/effects/builtin/reverbeffect.h rename to src/effects/backends/builtin/reverbeffect.h index fd1c7d614ff8..cee38b166155 100644 --- a/src/effects/builtin/reverbeffect.h +++ b/src/effects/backends/builtin/reverbeffect.h @@ -8,7 +8,7 @@ #include -#include "effects/effectprocessor.h" +#include "effects/backends/effectprocessor.h" #include "engine/effects/engineeffect.h" #include "engine/effects/engineeffectparameter.h" #include "util/class.h" diff --git a/src/effects/builtin/threebandbiquadeqeffect.cpp b/src/effects/backends/builtin/threebandbiquadeqeffect.cpp similarity index 99% rename from src/effects/builtin/threebandbiquadeqeffect.cpp rename to src/effects/backends/builtin/threebandbiquadeqeffect.cpp index d8eb9c95c996..92e45381d537 100644 --- a/src/effects/builtin/threebandbiquadeqeffect.cpp +++ b/src/effects/backends/builtin/threebandbiquadeqeffect.cpp @@ -1,6 +1,6 @@ -#include "effects/builtin/threebandbiquadeqeffect.h" +#include "effects/backends/builtin/threebandbiquadeqeffect.h" -#include "effects/builtin/equalizer_util.h" +#include "effects/backends/builtin/equalizer_util.h" #include "util/math.h" namespace { diff --git a/src/effects/builtin/threebandbiquadeqeffect.h b/src/effects/backends/builtin/threebandbiquadeqeffect.h similarity index 98% rename from src/effects/builtin/threebandbiquadeqeffect.h rename to src/effects/backends/builtin/threebandbiquadeqeffect.h index 28a57aa2b0b6..de802d8b7d35 100644 --- a/src/effects/builtin/threebandbiquadeqeffect.h +++ b/src/effects/backends/builtin/threebandbiquadeqeffect.h @@ -2,7 +2,7 @@ #define THREEBANDBIQUADEQEFFECT_H #include "control/controlproxy.h" -#include "effects/effectprocessor.h" +#include "effects/backends/effectprocessor.h" #include "engine/effects/engineeffect.h" #include "engine/effects/engineeffectparameter.h" #include "engine/filters/enginefilterbiquad1.h" diff --git a/src/effects/builtin/tremoloeffect.cpp b/src/effects/backends/builtin/tremoloeffect.cpp similarity index 99% rename from src/effects/builtin/tremoloeffect.cpp rename to src/effects/backends/builtin/tremoloeffect.cpp index c84ae28cda69..34d6de49a745 100644 --- a/src/effects/builtin/tremoloeffect.cpp +++ b/src/effects/backends/builtin/tremoloeffect.cpp @@ -1,4 +1,4 @@ -#include "effects/builtin/tremoloeffect.h" +#include "effects/backends/builtin/tremoloeffect.h" namespace { // Used to avoid gain discontinuities when changing parameters too fast diff --git a/src/effects/builtin/tremoloeffect.h b/src/effects/backends/builtin/tremoloeffect.h similarity index 97% rename from src/effects/builtin/tremoloeffect.h rename to src/effects/backends/builtin/tremoloeffect.h index 81ac103533b0..1f2cb63259d8 100644 --- a/src/effects/builtin/tremoloeffect.h +++ b/src/effects/backends/builtin/tremoloeffect.h @@ -1,7 +1,7 @@ #ifndef TREMOLOEFFECT_H #define TREMOLOEFFECT_H -#include "effects/effectprocessor.h" +#include "effects/backends/effectprocessor.h" #include "engine/effects/engineeffect.h" #include "engine/effects/engineeffectparameter.h" #include "util/class.h" diff --git a/src/effects/effectmanifest.cpp b/src/effects/backends/effectmanifest.cpp similarity index 76% rename from src/effects/effectmanifest.cpp rename to src/effects/backends/effectmanifest.cpp index 35326f54cb93..d1c0666b8244 100644 --- a/src/effects/effectmanifest.cpp +++ b/src/effects/backends/effectmanifest.cpp @@ -1,4 +1,4 @@ -#include "effects/effectmanifest.h" +#include "effects/backends/effectmanifest.h" QDebug operator<<(QDebug dbg, const EffectManifest& manifest) { return dbg.maybeSpace() << QString("EffectManifest(%1)").arg(manifest.id()); diff --git a/src/effects/effectmanifest.h b/src/effects/backends/effectmanifest.h similarity index 99% rename from src/effects/effectmanifest.h rename to src/effects/backends/effectmanifest.h index 7f3cc20f9d7d..421ae044cd66 100644 --- a/src/effects/effectmanifest.h +++ b/src/effects/backends/effectmanifest.h @@ -6,7 +6,7 @@ #include #include -#include "effects/effectmanifestparameter.h" +#include "effects/backends/effectmanifestparameter.h" #include "effects/defs.h" // An EffectManifest is a description of the metadata associated with an effect diff --git a/src/effects/effectmanifestparameter.cpp b/src/effects/backends/effectmanifestparameter.cpp similarity index 75% rename from src/effects/effectmanifestparameter.cpp rename to src/effects/backends/effectmanifestparameter.cpp index 0094635c1489..9e3ba418a579 100644 --- a/src/effects/effectmanifestparameter.cpp +++ b/src/effects/backends/effectmanifestparameter.cpp @@ -1,4 +1,4 @@ -#include "effects/effectmanifestparameter.h" +#include "effects/backends/effectmanifestparameter.h" QDebug operator<<(QDebug dbg, const EffectManifestParameter& parameter) { return dbg.maybeSpace() << QString("EffectManifestParameter(%1)").arg(parameter.id()); diff --git a/src/effects/effectmanifestparameter.h b/src/effects/backends/effectmanifestparameter.h similarity index 100% rename from src/effects/effectmanifestparameter.h rename to src/effects/backends/effectmanifestparameter.h diff --git a/src/effects/effectprocessor.h b/src/effects/backends/effectprocessor.h similarity index 100% rename from src/effects/effectprocessor.h rename to src/effects/backends/effectprocessor.h diff --git a/src/effects/effectsbackend.h b/src/effects/backends/effectsbackend.h similarity index 95% rename from src/effects/effectsbackend.h rename to src/effects/backends/effectsbackend.h index 0ff3361820f5..30ba312ce2d3 100644 --- a/src/effects/effectsbackend.h +++ b/src/effects/backends/effectsbackend.h @@ -7,10 +7,6 @@ #include #include "effects/defs.h" -#include "effects/effectslot.h" -#include "preferences/usersettings.h" - -#include "util/memory.h" class EffectProcessor; diff --git a/src/effects/lv2/lv2backend.cpp b/src/effects/backends/lv2/lv2backend.cpp similarity index 95% rename from src/effects/lv2/lv2backend.cpp rename to src/effects/backends/lv2/lv2backend.cpp index 6922b38498e5..f0d04586b02c 100644 --- a/src/effects/lv2/lv2backend.cpp +++ b/src/effects/backends/lv2/lv2backend.cpp @@ -1,6 +1,6 @@ -#include "effects/lv2/lv2backend.h" -#include "effects/lv2/lv2manifest.h" -#include "effects/lv2/lv2effectprocessor.h" +#include "effects/backends/lv2/lv2backend.h" +#include "effects/backends/lv2/lv2manifest.h" +#include "effects/backends/lv2/lv2effectprocessor.h" LV2Backend::LV2Backend() { m_pWorld = lilv_world_new(); diff --git a/src/effects/lv2/lv2backend.h b/src/effects/backends/lv2/lv2backend.h similarity index 92% rename from src/effects/lv2/lv2backend.h rename to src/effects/backends/lv2/lv2backend.h index 5b0fb09cd8aa..8ed6019373e3 100644 --- a/src/effects/lv2/lv2backend.h +++ b/src/effects/backends/lv2/lv2backend.h @@ -2,8 +2,8 @@ #define LV2BACKEND_H #include "effects/defs.h" -#include "effects/effectsbackend.h" -#include "effects/lv2/lv2manifest.h" +#include "effects/backends/effectsbackend.h" +#include "effects/backends/lv2/lv2manifest.h" #include "preferences/usersettings.h" #include diff --git a/src/effects/lv2/lv2effectprocessor.cpp b/src/effects/backends/lv2/lv2effectprocessor.cpp similarity index 98% rename from src/effects/lv2/lv2effectprocessor.cpp rename to src/effects/backends/lv2/lv2effectprocessor.cpp index e9d39ad3d56c..a37ea645fa97 100644 --- a/src/effects/lv2/lv2effectprocessor.cpp +++ b/src/effects/backends/lv2/lv2effectprocessor.cpp @@ -1,6 +1,5 @@ -#include "effects/lv2/lv2effectprocessor.h" +#include "effects/backends/lv2/lv2effectprocessor.h" #include "engine/effects/engineeffect.h" -#include "control/controlobject.h" #include "util/sample.h" #include "util/defs.h" diff --git a/src/effects/lv2/lv2effectprocessor.h b/src/effects/backends/lv2/lv2effectprocessor.h similarity index 95% rename from src/effects/lv2/lv2effectprocessor.h rename to src/effects/backends/lv2/lv2effectprocessor.h index 92ae7186ae48..5d8cd647d5da 100644 --- a/src/effects/lv2/lv2effectprocessor.h +++ b/src/effects/backends/lv2/lv2effectprocessor.h @@ -1,8 +1,8 @@ #ifndef LV2EFFECTPROCESSOR_H #define LV2EFFECTPROCESSOR_H -#include "effects/effectprocessor.h" -#include "effects/lv2/lv2manifest.h" +#include "effects/backends/effectprocessor.h" +#include "effects/backends/lv2/lv2manifest.h" #include "engine/effects/engineeffectparameter.h" #include #include "effects/defs.h" diff --git a/src/effects/lv2/lv2manifest.cpp b/src/effects/backends/lv2/lv2manifest.cpp similarity index 98% rename from src/effects/lv2/lv2manifest.cpp rename to src/effects/backends/lv2/lv2manifest.cpp index 69529eab987c..9ca1235acb47 100644 --- a/src/effects/lv2/lv2manifest.cpp +++ b/src/effects/backends/lv2/lv2manifest.cpp @@ -1,5 +1,5 @@ -#include "effects/lv2/lv2manifest.h" -#include "effects/effectmanifestparameter.h" +#include "effects/backends/lv2/lv2manifest.h" +#include "effects/backends/effectmanifestparameter.h" #include "util/math.h" LV2Manifest::LV2Manifest(const LilvPlugin* plug, diff --git a/src/effects/lv2/lv2manifest.h b/src/effects/backends/lv2/lv2manifest.h similarity index 96% rename from src/effects/lv2/lv2manifest.h rename to src/effects/backends/lv2/lv2manifest.h index c316e6a53ac8..9be87ac3ea7c 100644 --- a/src/effects/lv2/lv2manifest.h +++ b/src/effects/backends/lv2/lv2manifest.h @@ -3,7 +3,7 @@ #include -#include "effects/effectmanifest.h" +#include "effects/backends/effectmanifest.h" #include "effects/defs.h" #include diff --git a/src/effects/effectchainslot.cpp b/src/effects/effectchainslot.cpp index 50ee9f05713e..c25295e5818c 100644 --- a/src/effects/effectchainslot.cpp +++ b/src/effects/effectchainslot.cpp @@ -3,7 +3,7 @@ #include "control/controlencoder.h" #include "control/controlpotmeter.h" #include "control/controlpushbutton.h" -#include "effects/effectprocessor.h" +#include "effects/backends/effectprocessor.h" #include "effects/effectslot.h" #include "effects/effectsmanager.h" #include "effects/effectxmlelements.h" diff --git a/src/effects/effectparameter.h b/src/effects/effectparameter.h index d010be4f84b6..704857b19305 100644 --- a/src/effects/effectparameter.h +++ b/src/effects/effectparameter.h @@ -4,7 +4,7 @@ #include #include -#include "effects/effectmanifestparameter.h" +#include "effects/backends/effectmanifestparameter.h" #include "effects/effectslot.h" #include "util/class.h" diff --git a/src/effects/effectparameterslotbase.h b/src/effects/effectparameterslotbase.h index 0ea793b5f340..8cd2ad44e55f 100644 --- a/src/effects/effectparameterslotbase.h +++ b/src/effects/effectparameterslotbase.h @@ -6,7 +6,7 @@ #include #include "control/controlobject.h" -#include "effects/effectmanifest.h" +#include "effects/backends/effectmanifest.h" #include "util/class.h" class ControlObject; diff --git a/src/effects/effectslot.h b/src/effects/effectslot.h index ce32e1157d06..0f83ef1135c1 100644 --- a/src/effects/effectslot.h +++ b/src/effects/effectslot.h @@ -12,7 +12,7 @@ #include "controllers/softtakeover.h" #include "effects/effectbuttonparameterslot.h" #include "effects/effectknobparameterslot.h" -#include "effects/effectmanifest.h" +#include "effects/backends/effectmanifest.h" #include "effects/effectparameter.h" #include "effects/presets/effectpreset.h" #include "engine/channelhandle.h" diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index 8ba1ee489484..f4efcb5727d4 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -5,7 +5,7 @@ #include #include -#include "effects/effectsbackend.h" +#include "effects/backends/effectsbackend.h" #include "effects/effectslot.h" #include "effects/effectxmlelements.h" #include "effects/presets/effectchainpreset.h" diff --git a/src/effects/effectsmanager.h b/src/effects/effectsmanager.h index 02936e525fca..7ae9513ec6d6 100644 --- a/src/effects/effectsmanager.h +++ b/src/effects/effectsmanager.h @@ -11,7 +11,7 @@ #include "control/controlpotmeter.h" #include "control/controlpushbutton.h" #include "effects/specialeffectchainslots.h" -#include "effects/effectmanifestparameter.h" +#include "effects/backends/effectmanifestparameter.h" #include "engine/channelhandle.h" #include "engine/effects/message.h" #include "preferences/usersettings.h" diff --git a/src/effects/presets/effectparameterpreset.h b/src/effects/presets/effectparameterpreset.h index e629b25c9d42..30af16bac532 100644 --- a/src/effects/presets/effectparameterpreset.h +++ b/src/effects/presets/effectparameterpreset.h @@ -3,7 +3,7 @@ #include #include "effects/defs.h" -#include "effects/effectmanifestparameter.h" +#include "effects/backends/effectmanifestparameter.h" // EffectParameterPreset is a read-only snapshot of the state of an effect // parameter that can be serialized to/deserialized from XML. It is only used diff --git a/src/effects/presets/effectpreset.cpp b/src/effects/presets/effectpreset.cpp index a32d972bd00c..9a88b0c4b604 100644 --- a/src/effects/presets/effectpreset.cpp +++ b/src/effects/presets/effectpreset.cpp @@ -1,6 +1,7 @@ #include "effects/presets/effectpreset.h" -#include "effects/effectsbackend.h" +#include "effects/effectslot.h" +#include "effects/backends/effectsbackend.h" #include "effects/effectxmlelements.h" #include "util/xml.h" diff --git a/src/effects/presets/effectpreset.h b/src/effects/presets/effectpreset.h index 930445f96936..983a6e750ad8 100644 --- a/src/effects/presets/effectpreset.h +++ b/src/effects/presets/effectpreset.h @@ -2,7 +2,7 @@ #include #include "effects/defs.h" -#include "effects/effectmanifest.h" +#include "effects/backends/effectmanifest.h" #include "effects/presets/effectparameterpreset.h" // EffectPreset is a read-only snapshot of the state of an effect that can be diff --git a/src/engine/effects/engineeffect.h b/src/engine/effects/engineeffect.h index f7dfb264f619..a08cc7d40a16 100644 --- a/src/engine/effects/engineeffect.h +++ b/src/engine/effects/engineeffect.h @@ -9,8 +9,8 @@ #include #include "effects/effectsmanager.h" -#include "effects/effectmanifest.h" -#include "effects/effectprocessor.h" +#include "effects/backends/effectmanifest.h" +#include "effects/backends/effectprocessor.h" #include "engine/channelhandle.h" #include "engine/effects/engineeffectparameter.h" #include "engine/effects/message.h" diff --git a/src/engine/effects/engineeffectparameter.h b/src/engine/effects/engineeffectparameter.h index 888773f9f99f..72ab60108e57 100644 --- a/src/engine/effects/engineeffectparameter.h +++ b/src/engine/effects/engineeffectparameter.h @@ -5,7 +5,7 @@ #include #include "util/class.h" -#include "effects/effectmanifestparameter.h" +#include "effects/backends/effectmanifestparameter.h" class EngineEffectParameter { public: diff --git a/src/mixxx.cpp b/src/mixxx.cpp index 8ceafeaf0d64..6b283299395b 100644 --- a/src/mixxx.cpp +++ b/src/mixxx.cpp @@ -37,9 +37,9 @@ #include "dialog/dlgdevelopertools.h" #include "engine/enginemaster.h" #include "effects/effectsmanager.h" -#include "effects/builtin/builtinbackend.h" +#include "effects/backends/builtin/builtinbackend.h" #ifdef __LILV__ -#include "effects/lv2/lv2backend.h" +#include "effects/backends/lv2/lv2backend.h" #endif #include "library/coverartcache.h" #include "library/library.h" diff --git a/src/preferences/dialog/dlgprefeffects.cpp b/src/preferences/dialog/dlgprefeffects.cpp index 49ad322d2e9f..b060c7c98f7b 100644 --- a/src/preferences/dialog/dlgprefeffects.cpp +++ b/src/preferences/dialog/dlgprefeffects.cpp @@ -1,8 +1,8 @@ #include "preferences/dialog/dlgprefeffects.h" #include "effects/effectsmanager.h" -#include "effects/effectmanifest.h" -#include "effects/effectsbackend.h" +#include "effects/backends/effectmanifest.h" +#include "effects/backends/effectsbackend.h" DlgPrefEffects::DlgPrefEffects(QWidget* pParent, UserSettingsPointer pConfig, diff --git a/src/preferences/dialog/dlgprefeq.cpp b/src/preferences/dialog/dlgprefeq.cpp index 213d01d21ea3..1f680ffd8982 100644 --- a/src/preferences/dialog/dlgprefeq.cpp +++ b/src/preferences/dialog/dlgprefeq.cpp @@ -20,8 +20,8 @@ #include #include "preferences/dialog/dlgprefeq.h" -#include "effects/builtin/biquadfullkilleqeffect.h" -#include "effects/builtin/filtereffect.h" +#include "effects/backends/builtin/biquadfullkilleqeffect.h" +#include "effects/backends/builtin/filtereffect.h" #include "effects/effectslot.h" #include "engine/filters/enginefilterbessel4.h" #include "control/controlobject.h" diff --git a/src/preferences/effectsettingsmodel.h b/src/preferences/effectsettingsmodel.h index c89bea82eb5b..e0cd9c4643fd 100644 --- a/src/preferences/effectsettingsmodel.h +++ b/src/preferences/effectsettingsmodel.h @@ -6,7 +6,7 @@ #include #include -#include "effects/effectmanifest.h" +#include "effects/backends/effectmanifest.h" #include "effects/effectsmanager.h" struct EffectProfile { From 7b68f3800ec5f8e63c2bc6d830709ce387643278 Mon Sep 17 00:00:00 2001 From: Be Date: Sat, 4 Apr 2020 16:17:13 -0500 Subject: [PATCH 078/443] DlgPrefEffects: clang-format fixes --- src/preferences/dialog/dlgprefeffects.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/preferences/dialog/dlgprefeffects.cpp b/src/preferences/dialog/dlgprefeffects.cpp index b060c7c98f7b..881aab3964ff 100644 --- a/src/preferences/dialog/dlgprefeffects.cpp +++ b/src/preferences/dialog/dlgprefeffects.cpp @@ -16,12 +16,13 @@ DlgPrefEffects::DlgPrefEffects(QWidget* pParent, for (auto& profile : m_availableEffectsModel.profiles()) { EffectManifestPointer pManifest = profile->pManifest; - // Users are likely to have lots of external plugins installed and - // many of them are useless for DJing. To avoid cluttering the list + // Users are likely to have lots of external plugins installed and + // many of them are useless for DJing. To avoid cluttering the list // shown in WEffectSelector, blacklist external plugins by default. bool defaultValue = (pManifest->backendType() == EffectBackendType::BuiltIn); - bool visible = m_pConfig->getValue(ConfigKey("[Visible " + pManifest->backendName() + " Effects]", - pManifest->id()), defaultValue); + bool visible = m_pConfig->getValue(ConfigKey("[Visible " + pManifest->backendName() + " Effects]", + pManifest->id()), + defaultValue); profile->bIsVisible = visible; m_pEffectsManager->setEffectVisibility(pManifest, visible); } @@ -56,12 +57,12 @@ void DlgPrefEffects::slotApply() { for (EffectProfilePtr profile : m_availableEffectsModel.profiles()) { EffectManifestPointer pManifest = profile->pManifest; m_pEffectsManager->setEffectVisibility(pManifest, profile->bIsVisible); - + // Effects from different backends can have same Effect IDs. // Add backend name to group to uniquely identify those effects. // Use untranslated value to keep the group language independent. - m_pConfig->set(ConfigKey("[Visible " + pManifest->backendName() + " Effects]", pManifest->id()), - ConfigValue(profile->bIsVisible)); + m_pConfig->set(ConfigKey("[Visible " + pManifest->backendName() + " Effects]", pManifest->id()), + ConfigValue(profile->bIsVisible)); } } From 08d48f0acedddc24ac484322f3f7cf5561fccd6b Mon Sep 17 00:00:00 2001 From: Be Date: Sat, 4 Apr 2020 16:22:25 -0500 Subject: [PATCH 079/443] move EffectsBackends out of MixxxMainWindow into EffectsManager This was an ugly hack required by DlgPrefLV2 which was removed in 36c8f18a839e2b55e05cb13887a2ec8cb8e853bf --- src/effects/effectsmanager.cpp | 8 +++++++- src/mixxx.cpp | 13 ------------- 2 files changed, 7 insertions(+), 14 deletions(-) diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index f4efcb5727d4..172ce5519322 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -5,7 +5,8 @@ #include #include -#include "effects/backends/effectsbackend.h" +#include "effects/backends/builtin/builtinbackend.h" +#include "effects/backends/lv2/lv2backend.h" #include "effects/effectslot.h" #include "effects/effectxmlelements.h" #include "effects/presets/effectchainpreset.h" @@ -42,6 +43,11 @@ EffectsManager::EffectsManager(QObject* pParent, UserSettingsPointer pConfig, Ch m_pNumEffectsAvailable = new ControlObject(ConfigKey("[Master]", "num_effectsavailable")); m_pNumEffectsAvailable->setReadOnly(); + + addEffectsBackend(EffectsBackendPointer(new BuiltInBackend())); +#ifdef __LILV__ + addEffectsBackend(EffectsBackendPointer(new LV2Backend())); +#endif } EffectsManager::~EffectsManager() { diff --git a/src/mixxx.cpp b/src/mixxx.cpp index 6b283299395b..59e1d5f9b02e 100644 --- a/src/mixxx.cpp +++ b/src/mixxx.cpp @@ -37,10 +37,6 @@ #include "dialog/dlgdevelopertools.h" #include "engine/enginemaster.h" #include "effects/effectsmanager.h" -#include "effects/backends/builtin/builtinbackend.h" -#ifdef __LILV__ -#include "effects/backends/lv2/lv2backend.h" -#endif #include "library/coverartcache.h" #include "library/library.h" #include "library/library_preferences.h" @@ -257,15 +253,6 @@ void MixxxMainWindow::initialize(QApplication* pApp, const CmdlineArgs& args) { m_pEngine = new EngineMaster(pConfig, "[Master]", m_pEffectsManager, m_pChannelHandleFactory, true); - // Create effect backends. We do this after creating EngineMaster to allow - // effect backends to refer to controls that are produced by the engine. - BuiltInBackend* pBuiltInBackend = new BuiltInBackend(); - m_pEffectsManager->addEffectsBackend(EffectsBackendPointer(pBuiltInBackend)); -#ifdef __LILV__ - LV2Backend* pLV2Backend = new LV2Backend(); - m_pEffectsManager->addEffectsBackend(EffectsBackendPointer(pLV2Backend)); -#endif - launchProgress(8); // Although m_pSoundManager is created here, m_pSoundManager->setupDevices() From 1e1812d9ad2eb711fcaea0aaf39ba8c49e53d8ed Mon Sep 17 00:00:00 2001 From: Be Date: Sat, 4 Apr 2020 16:31:19 -0500 Subject: [PATCH 080/443] move src/effects/effectxmlelements.h to src/effects/presets folder --- src/effects/effectbuttonparameterslot.cpp | 1 - src/effects/effectchainslot.cpp | 1 - src/effects/effectknobparameterslot.cpp | 1 - src/effects/effectslot.cpp | 1 - src/effects/effectsmanager.cpp | 2 +- src/effects/presets/effectchainpreset.cpp | 2 +- src/effects/presets/effectparameterpreset.cpp | 2 +- src/effects/presets/effectpreset.cpp | 4 ++-- src/effects/{ => presets}/effectxmlelements.h | 2 +- 9 files changed, 6 insertions(+), 10 deletions(-) rename src/effects/{ => presets}/effectxmlelements.h (97%) diff --git a/src/effects/effectbuttonparameterslot.cpp b/src/effects/effectbuttonparameterslot.cpp index 61de22463886..56b7754f0eb1 100644 --- a/src/effects/effectbuttonparameterslot.cpp +++ b/src/effects/effectbuttonparameterslot.cpp @@ -3,7 +3,6 @@ #include "effects/effectslot.h" #include "effects/effectbuttonparameterslot.h" #include "control/controleffectknob.h" -#include "effects/effectxmlelements.h" #include "control/controlobject.h" #include "control/controlpushbutton.h" #include "util/math.h" diff --git a/src/effects/effectchainslot.cpp b/src/effects/effectchainslot.cpp index c25295e5818c..bd8bdb560f2c 100644 --- a/src/effects/effectchainslot.cpp +++ b/src/effects/effectchainslot.cpp @@ -6,7 +6,6 @@ #include "effects/backends/effectprocessor.h" #include "effects/effectslot.h" #include "effects/effectsmanager.h" -#include "effects/effectxmlelements.h" #include "effects/specialeffectchainslots.h" #include "engine/effects/engineeffectchain.h" #include "engine/effects/message.h" diff --git a/src/effects/effectknobparameterslot.cpp b/src/effects/effectknobparameterslot.cpp index 7152f4ee5849..8675d7fd494f 100644 --- a/src/effects/effectknobparameterslot.cpp +++ b/src/effects/effectknobparameterslot.cpp @@ -5,7 +5,6 @@ #include "effects/effectslot.h" #include "effects/effectparameter.h" #include "control/controleffectknob.h" -#include "effects/effectxmlelements.h" #include "control/controlobject.h" #include "control/controlpushbutton.h" #include "controllers/softtakeover.h" diff --git a/src/effects/effectslot.cpp b/src/effects/effectslot.cpp index ebe014b4fb70..68f79d9bd386 100644 --- a/src/effects/effectslot.cpp +++ b/src/effects/effectslot.cpp @@ -1,5 +1,4 @@ #include "effects/effectslot.h" -#include "effects/effectxmlelements.h" #include diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index 172ce5519322..324b5caa2555 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -8,8 +8,8 @@ #include "effects/backends/builtin/builtinbackend.h" #include "effects/backends/lv2/lv2backend.h" #include "effects/effectslot.h" -#include "effects/effectxmlelements.h" #include "effects/presets/effectchainpreset.h" +#include "effects/presets/effectxmlelements.h" #include "engine/effects/engineeffect.h" #include "engine/effects/engineeffectchain.h" #include "engine/effects/engineeffectsmanager.h" diff --git a/src/effects/presets/effectchainpreset.cpp b/src/effects/presets/effectchainpreset.cpp index bf6fe42b01b1..e3e503f7e918 100644 --- a/src/effects/presets/effectchainpreset.cpp +++ b/src/effects/presets/effectchainpreset.cpp @@ -1,7 +1,7 @@ #include "effects/presets/effectchainpreset.h" #include "effects/effectchainslot.h" -#include "effects/effectxmlelements.h" +#include "effects/presets/effectxmlelements.h" #include "util/xml.h" EffectChainPreset::EffectChainPreset() { diff --git a/src/effects/presets/effectparameterpreset.cpp b/src/effects/presets/effectparameterpreset.cpp index d530967f2746..e84ff533db50 100644 --- a/src/effects/presets/effectparameterpreset.cpp +++ b/src/effects/presets/effectparameterpreset.cpp @@ -1,7 +1,7 @@ #include "effects/presets/effectparameterpreset.h" #include "effects/effectparameter.h" -#include "effects/effectxmlelements.h" +#include "effects/presets/effectxmlelements.h" #include "util/xml.h" EffectParameterPreset::EffectParameterPreset() { diff --git a/src/effects/presets/effectpreset.cpp b/src/effects/presets/effectpreset.cpp index 9a88b0c4b604..08741b17a45d 100644 --- a/src/effects/presets/effectpreset.cpp +++ b/src/effects/presets/effectpreset.cpp @@ -1,8 +1,8 @@ #include "effects/presets/effectpreset.h" -#include "effects/effectslot.h" #include "effects/backends/effectsbackend.h" -#include "effects/effectxmlelements.h" +#include "effects/effectslot.h" +#include "effects/presets/effectxmlelements.h" #include "util/xml.h" EffectPreset::EffectPreset() { diff --git a/src/effects/effectxmlelements.h b/src/effects/presets/effectxmlelements.h similarity index 97% rename from src/effects/effectxmlelements.h rename to src/effects/presets/effectxmlelements.h index 99ce13ecc7e8..64ff29447dd2 100644 --- a/src/effects/effectxmlelements.h +++ b/src/effects/presets/effectxmlelements.h @@ -30,4 +30,4 @@ const QString ParameterValue("Value"); const QString ParameterLinkType("LinkType"); const QString ParameterLinkInversion("LinkInversion"); const QString ParameterHidden("Hidden"); -} +} // namespace EffectXml From 68d88ccb774031d1f3abc93b114f06b0b9d5b455 Mon Sep 17 00:00:00 2001 From: Be Date: Sat, 4 Apr 2020 16:55:51 -0500 Subject: [PATCH 081/443] EffectSlot: make some public methods private --- src/effects/effectslot.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/effects/effectslot.h b/src/effects/effectslot.h index 0f83ef1135c1..e722aa7c9a65 100644 --- a/src/effects/effectslot.h +++ b/src/effects/effectslot.h @@ -135,9 +135,6 @@ class EffectSlot : public QObject { void setEnabled(bool enabled); - void addToEngine(std::unique_ptr, - const QSet& activeInputChannels); - void removeFromEngine(); public slots: void setMetaParameter(double v, bool force = false); @@ -159,6 +156,10 @@ class EffectSlot : public QObject { return QString("EffectSlot(%1)").arg(m_group); } + void addToEngine(std::unique_ptr, + const QSet& activeInputChannels); + void removeFromEngine(); + void loadParameters(); void unloadEffect(); From e1acbb30c5fce4740f0ff7c0f1de7e75e814c56a Mon Sep 17 00:00:00 2001 From: Be Date: Sat, 4 Apr 2020 17:34:39 -0500 Subject: [PATCH 082/443] Effect(Chain)Slot: refactor creation of EffectStatesMaps --- src/effects/effectchainslot.cpp | 31 ++++++++----------------------- src/effects/effectslot.cpp | 30 ++++++++++++++++++++++-------- src/effects/effectslot.h | 2 +- 3 files changed, 31 insertions(+), 32 deletions(-) diff --git a/src/effects/effectchainslot.cpp b/src/effects/effectchainslot.cpp index bd8bdb560f2c..8395031e08c6 100644 --- a/src/effects/effectchainslot.cpp +++ b/src/effects/effectchainslot.cpp @@ -341,32 +341,17 @@ void EffectChainSlot::enableForInputChannel(const ChannelHandleAndGroup& handle_ // EffectStates are passed to the EffectRequest and the EffectProcessorImpls // store the pointers. The containers of EffectState* pointers get deleted // by ~EffectsRequest, but the EffectStates are managed by EffectProcessorImpl. - auto pEffectStatesMapArray = new EffectStatesMapArray; - //TODO: get actual configuration of engine - const mixxx::EngineParameters bufferParameters( - mixxx::AudioSignal::SampleRate(96000), - MAX_BUFFER_LEN / mixxx::kEngineChannelCount); + // The EffectStates for one EngineEffectChain must be sent all together in + // the same message using an EffectStatesMapArray. If they were separated + // into a message for each effect, there would be a chance that the + // EngineEffectChain could get activated in one cycle of the audio callback + // thread but the EffectStates for an EngineEffect would not be received by + // EngineEffectsManager until the next audio callback cycle. - // TODO: Simplify by defining a method to create an EffectState for the input channel + auto pEffectStatesMapArray = new EffectStatesMapArray; for (int i = 0; i < m_effectSlots.size(); ++i) { - auto& statesMap = (*pEffectStatesMapArray)[i]; - if (m_effectSlots[i]->isLoaded()) { - for (const auto& outputChannel : m_pEffectsManager->registeredOutputChannels()) { - if (kEffectDebugOutput) { - qDebug() << debugString() << "EffectChain::enableForInputChannel creating EffectState for input" << handle_group << "output" << outputChannel; - } - statesMap.insert(outputChannel.handle(), - m_effectSlots[i]->createState(bufferParameters)); - } - } else { - for (EffectState* pState : statesMap) { - if (pState != nullptr) { - delete pState; - } - } - statesMap.clear(); - } + m_effectSlots[i]->fillEffectStatesMap(&(*pEffectStatesMapArray)[i]); } request->EnableInputChannelForChain.pEffectStatesMapArray = pEffectStatesMapArray; diff --git a/src/effects/effectslot.cpp b/src/effects/effectslot.cpp index 68f79d9bd386..820552a49b12 100644 --- a/src/effects/effectslot.cpp +++ b/src/effects/effectslot.cpp @@ -2,12 +2,12 @@ #include -#include "effects/defs.h" -#include "control/controlpushbutton.h" #include "control/controlencoder.h" #include "control/controlproxy.h" +#include "control/controlpushbutton.h" +#include "effects/defs.h" +#include "util/defs.h" #include "util/math.h" -#include "util/xml.h" // The maximum number of effect parameters we're going to support. const unsigned int kDefaultMaxParameters = 16; @@ -163,12 +163,26 @@ void EffectSlot::updateEngineState() { } } -EffectState* EffectSlot::createState(const mixxx::EngineParameters& bufferParameters) { - VERIFY_OR_DEBUG_ASSERT(m_pEngineEffect != nullptr) { - return new EffectState(bufferParameters); +void EffectSlot::fillEffectStatesMap(EffectStatesMap* pStatesMap) const { + //TODO: get actual configuration of engine + const mixxx::EngineParameters bufferParameters( + mixxx::AudioSignal::SampleRate(96000), + MAX_BUFFER_LEN / mixxx::kEngineChannelCount); + + if (isLoaded()) { + for (const auto& outputChannel : m_pEffectsManager->registeredOutputChannels()) { + pStatesMap->insert(outputChannel.handle(), + m_pEngineEffect->createState(bufferParameters)); + } + } else { + for (EffectState* pState : *pStatesMap) { + if (pState != nullptr) { + delete pState; + } + } + pStatesMap->clear(); } - return m_pEngineEffect->createState(bufferParameters); -} +}; EffectManifestPointer EffectSlot::getManifest() const { return m_pManifest; diff --git a/src/effects/effectslot.h b/src/effects/effectslot.h index e722aa7c9a65..5d1d618741dd 100644 --- a/src/effects/effectslot.h +++ b/src/effects/effectslot.h @@ -127,7 +127,7 @@ class EffectSlot : public QObject { return m_group; } - EffectState* createState(const mixxx::EngineParameters& bufferParameters); + void fillEffectStatesMap(EffectStatesMap* pStatesMap) const; EffectManifestPointer getManifest() const; From fa5a3a5d152beb97ac3ba35c11a14b2d89ed1e5c Mon Sep 17 00:00:00 2001 From: Be Date: Sat, 4 Apr 2020 17:50:03 -0500 Subject: [PATCH 083/443] EffectManifestParameter::setRange add comment and improve debug --- src/effects/backends/effectmanifestparameter.h | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/effects/backends/effectmanifestparameter.h b/src/effects/backends/effectmanifestparameter.h index 69518030f4db..4a2a26447bc1 100644 --- a/src/effects/backends/effectmanifestparameter.h +++ b/src/effects/backends/effectmanifestparameter.h @@ -12,7 +12,6 @@ class EffectManifestParameter; typedef QSharedPointer EffectManifestParameterPointer; - class EffectManifestParameter { public: enum class ParameterType { @@ -235,9 +234,15 @@ class EffectManifestParameter { return m_maximum; } + // Minimum, default, and maximum are set together in one function so their + // validity only needs to be checked once. void setRange(const double& minimum, const double& defaultValue, const double& maximum) { VERIFY_OR_DEBUG_ASSERT(minimum <= defaultValue && defaultValue <= maximum) { - qWarning() << "Invalid Parameter Range: " << minimum << ' ' << defaultValue << ' ' << maximum; + qWarning() << "EffectManifestParameter" << m_name + << "tried to set invalid parameter range:" + << "minimum" << minimum + << "default" << defaultValue + << "maximum" << maximum; return; } m_minimum = minimum; From fdc5008e2cbeeec477dc135994f0c4b04a2daed3 Mon Sep 17 00:00:00 2001 From: Be Date: Sat, 4 Apr 2020 18:20:17 -0500 Subject: [PATCH 084/443] use #pragma once for all headers in src/effects --- src/effects/backends/builtin/autopaneffect.h | 5 +---- src/effects/backends/builtin/balanceeffect.h | 5 +---- src/effects/backends/builtin/bessel4lvmixeqeffect.h | 6 +----- src/effects/backends/builtin/bessel8lvmixeqeffect.h | 5 +---- src/effects/backends/builtin/biquadfullkilleqeffect.h | 5 +---- src/effects/backends/builtin/bitcrushereffect.h | 5 +---- src/effects/backends/builtin/builtinbackend.h | 5 +---- src/effects/backends/builtin/echoeffect.h | 5 +---- src/effects/backends/builtin/equalizer_util.h | 6 +----- src/effects/backends/builtin/filtereffect.h | 5 +---- src/effects/backends/builtin/flangereffect.h | 5 +---- src/effects/backends/builtin/graphiceqeffect.h | 5 +---- src/effects/backends/builtin/linkwitzriley8eqeffect.h | 5 +---- src/effects/backends/builtin/loudnesscontoureffect.h | 6 +----- src/effects/backends/builtin/lvmixeqbase.h | 5 +---- src/effects/backends/builtin/metronomeclick.h | 7 +------ src/effects/backends/builtin/metronomeeffect.h | 7 +------ src/effects/backends/builtin/moogladder4filtereffect.h | 6 +----- src/effects/backends/builtin/parametriceqeffect.h | 5 +---- src/effects/backends/builtin/phasereffect.h | 5 +---- src/effects/backends/builtin/reverbeffect.h | 5 +---- src/effects/backends/builtin/threebandbiquadeqeffect.h | 5 +---- src/effects/backends/builtin/tremoloeffect.h | 6 +----- src/effects/backends/effectmanifest.h | 5 +---- src/effects/backends/effectmanifestparameter.h | 6 +----- src/effects/backends/effectprocessor.h | 5 +---- src/effects/backends/effectsbackend.h | 5 +---- src/effects/backends/lv2/lv2backend.h | 5 +---- src/effects/backends/lv2/lv2effectprocessor.h | 6 +----- src/effects/backends/lv2/lv2manifest.h | 5 +---- src/effects/effectbuttonparameterslot.h | 5 +---- src/effects/effectchainslot.h | 6 +----- src/effects/effectknobparameterslot.h | 5 +---- src/effects/effectparameter.h | 6 +----- src/effects/effectparameterslotbase.h | 5 +---- src/effects/effectslot.h | 5 +---- src/effects/effectsmanager.h | 6 +----- 37 files changed, 37 insertions(+), 162 deletions(-) diff --git a/src/effects/backends/builtin/autopaneffect.h b/src/effects/backends/builtin/autopaneffect.h index 640e5ff04deb..56e27406eaa4 100644 --- a/src/effects/backends/builtin/autopaneffect.h +++ b/src/effects/backends/builtin/autopaneffect.h @@ -1,5 +1,4 @@ -#ifndef AUTOPANEFFECT_H -#define AUTOPANEFFECT_H +#pragma once #include @@ -109,5 +108,3 @@ class AutoPanEffect : public EffectProcessorImpl { DISALLOW_COPY_AND_ASSIGN(AutoPanEffect); }; - -#endif /* AUTOPANEFFECT_H */ diff --git a/src/effects/backends/builtin/balanceeffect.h b/src/effects/backends/builtin/balanceeffect.h index 4df0ed66fa47..32c388e8cb1e 100644 --- a/src/effects/backends/builtin/balanceeffect.h +++ b/src/effects/backends/builtin/balanceeffect.h @@ -1,5 +1,4 @@ -#ifndef BALANCEEFFECT_H -#define BALANCEEFFECT_H +#pragma once #include "effects/backends/effectprocessor.h" #include "engine/effects/engineeffect.h" @@ -57,5 +56,3 @@ class BalanceEffect : public EffectProcessorImpl { DISALLOW_COPY_AND_ASSIGN(BalanceEffect); }; - -#endif /* BALANCEEFFECT_H */ diff --git a/src/effects/backends/builtin/bessel4lvmixeqeffect.h b/src/effects/backends/builtin/bessel4lvmixeqeffect.h index 90d119fd8ef8..daae4959989b 100644 --- a/src/effects/backends/builtin/bessel4lvmixeqeffect.h +++ b/src/effects/backends/builtin/bessel4lvmixeqeffect.h @@ -1,6 +1,4 @@ -#ifndef BESSEL4LVMIXEQEFFECT_H -#define BESSEL4LVMIXEQEFFECT_H - +#pragma once #include #include "control/controlproxy.h" @@ -58,5 +56,3 @@ class Bessel4LVMixEQEffect : public EffectProcessorImpl m_pLoFreqCorner; std::unique_ptr m_pHiFreqCorner; }; - -#endif // BIQUADFULLKILLEQEFFECT_H diff --git a/src/effects/backends/builtin/bitcrushereffect.h b/src/effects/backends/builtin/bitcrushereffect.h index 005502806b1e..bbd55230a43c 100644 --- a/src/effects/backends/builtin/bitcrushereffect.h +++ b/src/effects/backends/builtin/bitcrushereffect.h @@ -1,5 +1,4 @@ -#ifndef BITCRUSHEREFFECT_H -#define BITCRUSHEREFFECT_H +#pragma once #include @@ -50,5 +49,3 @@ class BitCrusherEffect : public EffectProcessorImpl { DISALLOW_COPY_AND_ASSIGN(BitCrusherEffect); }; - -#endif /* BITCRUSHEREFFECT_H */ diff --git a/src/effects/backends/builtin/builtinbackend.h b/src/effects/backends/builtin/builtinbackend.h index 69609a9f7730..d1f1532244da 100644 --- a/src/effects/backends/builtin/builtinbackend.h +++ b/src/effects/backends/builtin/builtinbackend.h @@ -1,5 +1,4 @@ -#ifndef BUILTINBACKEND_H -#define BUILTINBACKEND_H +#pragma once #include "effects/defs.h" #include "effects/backends/effectsbackend.h" @@ -75,5 +74,3 @@ class BuiltInBackend : public EffectsBackend { QMap m_registeredEffects; QList m_effectIds; }; - -#endif /* BUILTINBACKEND_H */ diff --git a/src/effects/backends/builtin/echoeffect.h b/src/effects/backends/builtin/echoeffect.h index b82c3149edb3..50d0e698b2e8 100644 --- a/src/effects/backends/builtin/echoeffect.h +++ b/src/effects/backends/builtin/echoeffect.h @@ -1,5 +1,4 @@ -#ifndef ECHOEFFECT_H -#define ECHOEFFECT_H +#pragma once #include @@ -77,5 +76,3 @@ class EchoEffect : public EffectProcessorImpl { DISALLOW_COPY_AND_ASSIGN(EchoEffect); }; - -#endif /* ECHOEFFECT_H */ diff --git a/src/effects/backends/builtin/equalizer_util.h b/src/effects/backends/builtin/equalizer_util.h index 96fc0823b337..efeb9e40eef9 100644 --- a/src/effects/backends/builtin/equalizer_util.h +++ b/src/effects/backends/builtin/equalizer_util.h @@ -1,5 +1,4 @@ -#ifndef EFFECTS_BUILTIN_EQUALIZER_UTIL_H -#define EFFECTS_BUILTIN_EQUALIZER_UTIL_H +#pragma once #include @@ -80,6 +79,3 @@ class EqualizerUtil { "To adjust frequency shelves, go to Preferences -> Equalizers."); } }; - - -#endif /* EFFECTS_BUILTIN_EQUALIZER_UTIL_H */ diff --git a/src/effects/backends/builtin/filtereffect.h b/src/effects/backends/builtin/filtereffect.h index 97737405856e..a30883b463f0 100644 --- a/src/effects/backends/builtin/filtereffect.h +++ b/src/effects/backends/builtin/filtereffect.h @@ -1,5 +1,4 @@ -#ifndef FILTEREFFECT_H -#define FILTEREFFECT_H +#pragma once #include "effects/backends/effectprocessor.h" #include "engine/effects/engineeffect.h" @@ -56,5 +55,3 @@ class FilterEffect : public EffectProcessorImpl { DISALLOW_COPY_AND_ASSIGN(FilterEffect); }; - -#endif /* FILTEREFFECT_H */ diff --git a/src/effects/backends/builtin/flangereffect.h b/src/effects/backends/builtin/flangereffect.h index bcdac48e1e79..710c8bbded40 100644 --- a/src/effects/backends/builtin/flangereffect.h +++ b/src/effects/backends/builtin/flangereffect.h @@ -1,5 +1,4 @@ -#ifndef FLANGEREFFECT_H -#define FLANGEREFFECT_H +#pragma once #include @@ -79,5 +78,3 @@ class FlangerEffect : public EffectProcessorImpl { DISALLOW_COPY_AND_ASSIGN(FlangerEffect); }; - -#endif /* FLANGEREFFECT_H */ diff --git a/src/effects/backends/builtin/graphiceqeffect.h b/src/effects/backends/builtin/graphiceqeffect.h index 029d1306892d..a0b7789350df 100644 --- a/src/effects/backends/builtin/graphiceqeffect.h +++ b/src/effects/backends/builtin/graphiceqeffect.h @@ -1,5 +1,4 @@ -#ifndef GRAPHICEQEFFECT_H -#define GRAPHICEQEFFECT_H +#pragma once #include @@ -60,5 +59,3 @@ class GraphicEQEffect : public EffectProcessorImpl { DISALLOW_COPY_AND_ASSIGN(GraphicEQEffect); }; - -#endif // GRAPHICEQEFFECT_H diff --git a/src/effects/backends/builtin/linkwitzriley8eqeffect.h b/src/effects/backends/builtin/linkwitzriley8eqeffect.h index c92bef831f2e..85e20ed1e6b8 100644 --- a/src/effects/backends/builtin/linkwitzriley8eqeffect.h +++ b/src/effects/backends/builtin/linkwitzriley8eqeffect.h @@ -1,5 +1,4 @@ -#ifndef LINKWITZRILEYEQEFFECT_H -#define LINKWITZRILEYEQEFFECT_H +#pragma once #include @@ -74,5 +73,3 @@ class LinkwitzRiley8EQEffect : public EffectProcessorImpl #include "effects/backends/effectprocessor.h" @@ -12,7 +10,6 @@ #include "util/sample.h" #include "util/types.h" - class MetronomeGroupState final : public EffectState { public: MetronomeGroupState(const mixxx::EngineParameters& bufferParameters) @@ -49,5 +46,3 @@ class MetronomeEffect : public EffectProcessorImpl { DISALLOW_COPY_AND_ASSIGN(MetronomeEffect); }; - -#endif /* METRONOMEEFFECT_H */ diff --git a/src/effects/backends/builtin/moogladder4filtereffect.h b/src/effects/backends/builtin/moogladder4filtereffect.h index ffe4bae9d4f5..7bcc2c941a82 100644 --- a/src/effects/backends/builtin/moogladder4filtereffect.h +++ b/src/effects/backends/builtin/moogladder4filtereffect.h @@ -1,6 +1,4 @@ -#ifndef MOOGLADDER4FILTEREFFECT_H -#define MOOGLADDER4FILTEREFFECT_H - +#pragma once #include "effects/backends/effectprocessor.h" #include "engine/effects/engineeffect.h" #include "engine/effects/engineeffectparameter.h" @@ -55,5 +53,3 @@ class MoogLadder4FilterEffect : public EffectProcessorImpl #include @@ -66,5 +65,3 @@ class ParametricEQEffect : public EffectProcessorImpl { DISALLOW_COPY_AND_ASSIGN(PhaserEffect); }; - -#endif diff --git a/src/effects/backends/builtin/reverbeffect.h b/src/effects/backends/builtin/reverbeffect.h index cee38b166155..8dcd9c86550c 100644 --- a/src/effects/backends/builtin/reverbeffect.h +++ b/src/effects/backends/builtin/reverbeffect.h @@ -1,8 +1,7 @@ // Ported from CAPS Reverb. // This effect is GPL code. -#ifndef REVERBEFFECT_H -#define REVERBEFFECT_H +#pragma once #include @@ -63,5 +62,3 @@ class ReverbEffect : public EffectProcessorImpl { DISALLOW_COPY_AND_ASSIGN(ReverbEffect); }; - -#endif /* REVERBEFFECT_H */ diff --git a/src/effects/backends/builtin/threebandbiquadeqeffect.h b/src/effects/backends/builtin/threebandbiquadeqeffect.h index de802d8b7d35..309eebe6f0b0 100644 --- a/src/effects/backends/builtin/threebandbiquadeqeffect.h +++ b/src/effects/backends/builtin/threebandbiquadeqeffect.h @@ -1,5 +1,4 @@ -#ifndef THREEBANDBIQUADEQEFFECT_H -#define THREEBANDBIQUADEQEFFECT_H +#pragma once #include "control/controlproxy.h" #include "effects/backends/effectprocessor.h" @@ -80,5 +79,3 @@ class ThreeBandBiquadEQEffect : public EffectProcessorImpl m_pLoFreqCorner; std::unique_ptr m_pHiFreqCorner; }; - -#endif // THREEBANDBIQUADEQEFFECT_H diff --git a/src/effects/backends/builtin/tremoloeffect.h b/src/effects/backends/builtin/tremoloeffect.h index 1f2cb63259d8..20eb4d6b301e 100644 --- a/src/effects/backends/builtin/tremoloeffect.h +++ b/src/effects/backends/builtin/tremoloeffect.h @@ -1,6 +1,4 @@ -#ifndef TREMOLOEFFECT_H -#define TREMOLOEFFECT_H - +#pragma once #include "effects/backends/effectprocessor.h" #include "engine/effects/engineeffect.h" #include "engine/effects/engineeffectparameter.h" @@ -52,5 +50,3 @@ class TremoloEffect : public EffectProcessorImpl { DISALLOW_COPY_AND_ASSIGN(TremoloEffect); }; - -#endif /* TREMOLOEFFECT_H */ diff --git a/src/effects/backends/effectmanifest.h b/src/effects/backends/effectmanifest.h index 421ae044cd66..2449e313c1a5 100644 --- a/src/effects/backends/effectmanifest.h +++ b/src/effects/backends/effectmanifest.h @@ -1,5 +1,4 @@ -#ifndef EFFECTMANIFEST_H -#define EFFECTMANIFEST_H +#pragma once #include #include @@ -216,5 +215,3 @@ class EffectManifest { bool m_bAddDryToWet; double m_metaknobDefault; }; - -#endif /* EFFECTMANIFEST_H */ diff --git a/src/effects/backends/effectmanifestparameter.h b/src/effects/backends/effectmanifestparameter.h index 4a2a26447bc1..4adfec649631 100644 --- a/src/effects/backends/effectmanifestparameter.h +++ b/src/effects/backends/effectmanifestparameter.h @@ -1,5 +1,4 @@ -#ifndef EFFECTMANIFESTPARAMETER_H -#define EFFECTMANIFESTPARAMETER_H +#pragma once #include #include @@ -294,6 +293,3 @@ inline uint qHash(const EffectManifestParameter::ParameterType& parameterType) { } QDebug operator<<(QDebug dbg, const EffectManifestParameter& parameter); - - -#endif /* EFFECTMANIFESTPARAMETER_H */ diff --git a/src/effects/backends/effectprocessor.h b/src/effects/backends/effectprocessor.h index 946f76052a51..60c7465ffd42 100644 --- a/src/effects/backends/effectprocessor.h +++ b/src/effects/backends/effectprocessor.h @@ -1,5 +1,4 @@ -#ifndef EFFECTPROCESSOR_H -#define EFFECTPROCESSOR_H +#pragma once #include #include @@ -275,5 +274,3 @@ class EffectProcessorImpl : public EffectProcessor { QSet m_registeredOutputChannels; ChannelHandleMap> m_channelStateMatrix; }; - -#endif /* EFFECTPROCESSOR_H */ diff --git a/src/effects/backends/effectsbackend.h b/src/effects/backends/effectsbackend.h index 30ba312ce2d3..c66ad26e80fd 100644 --- a/src/effects/backends/effectsbackend.h +++ b/src/effects/backends/effectsbackend.h @@ -1,5 +1,4 @@ -#ifndef EFFECTSBACKEND_H -#define EFFECTSBACKEND_H +#pragma once #include #include @@ -57,5 +56,3 @@ class EffectsBackend { } } }; - -#endif /* EFFECTSBACKEND_H */ diff --git a/src/effects/backends/lv2/lv2backend.h b/src/effects/backends/lv2/lv2backend.h index 8ed6019373e3..35994c206988 100644 --- a/src/effects/backends/lv2/lv2backend.h +++ b/src/effects/backends/lv2/lv2backend.h @@ -1,5 +1,4 @@ -#ifndef LV2BACKEND_H -#define LV2BACKEND_H +#pragma once #include "effects/defs.h" #include "effects/backends/effectsbackend.h" @@ -35,5 +34,3 @@ class LV2Backend : public EffectsBackend { return "LV2Backend"; } }; - -#endif // LV2BACKEND_H diff --git a/src/effects/backends/lv2/lv2effectprocessor.h b/src/effects/backends/lv2/lv2effectprocessor.h index 5d8cd647d5da..122599a31f04 100644 --- a/src/effects/backends/lv2/lv2effectprocessor.h +++ b/src/effects/backends/lv2/lv2effectprocessor.h @@ -1,5 +1,4 @@ -#ifndef LV2EFFECTPROCESSOR_H -#define LV2EFFECTPROCESSOR_H +#pragma once #include "effects/backends/effectprocessor.h" #include "effects/backends/lv2/lv2manifest.h" @@ -65,6 +64,3 @@ class LV2EffectProcessor final : public EffectProcessorImpl const QList m_audioPortIndices; const QList m_controlPortIndices; }; - - -#endif // LV2EFFECTPROCESSOR_H diff --git a/src/effects/backends/lv2/lv2manifest.h b/src/effects/backends/lv2/lv2manifest.h index 9be87ac3ea7c..926a67605c35 100644 --- a/src/effects/backends/lv2/lv2manifest.h +++ b/src/effects/backends/lv2/lv2manifest.h @@ -1,5 +1,4 @@ -#ifndef LV2MANIFEST_H -#define LV2MANIFEST_H +#pragma once #include @@ -47,5 +46,3 @@ class LV2Manifest : public EffectManifest { }; typedef QSharedPointer LV2EffectManifestPointer; - -#endif // LV2MANIFEST_H diff --git a/src/effects/effectbuttonparameterslot.h b/src/effects/effectbuttonparameterslot.h index b7ca06c7201a..522c1ac78e01 100644 --- a/src/effects/effectbuttonparameterslot.h +++ b/src/effects/effectbuttonparameterslot.h @@ -1,5 +1,4 @@ -#ifndef EFFECTBUTTONPARAMETERSLOT_H -#define EFFECTBUTTONPARAMETERSLOT_H +#pragma once #include #include @@ -42,5 +41,3 @@ class EffectButtonParameterSlot : public EffectParameterSlotBase { DISALLOW_COPY_AND_ASSIGN(EffectButtonParameterSlot); }; - -#endif // EFFECTBUTTONPARAMETERSLOT_H diff --git a/src/effects/effectchainslot.h b/src/effects/effectchainslot.h index 2b519ead2894..b1b6d8903e32 100644 --- a/src/effects/effectchainslot.h +++ b/src/effects/effectchainslot.h @@ -1,5 +1,4 @@ -#ifndef EFFECTCHAINSLOT_H -#define EFFECTCHAINSLOT_H +#pragma once #include #include @@ -217,6 +216,3 @@ class EffectChainSlot : public QObject { DISALLOW_COPY_AND_ASSIGN(EffectChainSlot); }; - - -#endif /* EFFECTCHAINSLOT_H */ diff --git a/src/effects/effectknobparameterslot.h b/src/effects/effectknobparameterslot.h index d622a8d62130..1399c081597f 100644 --- a/src/effects/effectknobparameterslot.h +++ b/src/effects/effectknobparameterslot.h @@ -1,5 +1,4 @@ -#ifndef EFFECTKNOBPARAMETERSLOT_H -#define EFFECTKNOBPARAMETERSLOT_H +#pragma once #include #include @@ -61,5 +60,3 @@ class EffectKnobParameterSlot : public EffectParameterSlotBase { DISALLOW_COPY_AND_ASSIGN(EffectKnobParameterSlot); }; - -#endif // EFFECTKNOBPARAMETERSLOT_H diff --git a/src/effects/effectparameter.h b/src/effects/effectparameter.h index 704857b19305..b9143823f5eb 100644 --- a/src/effects/effectparameter.h +++ b/src/effects/effectparameter.h @@ -1,5 +1,4 @@ -#ifndef EFFECTPARAMETER_H -#define EFFECTPARAMETER_H +#pragma once #include #include @@ -71,6 +70,3 @@ class EffectParameter { DISALLOW_COPY_AND_ASSIGN(EffectParameter); }; - - -#endif /* EFFECTPARAMETER_H */ diff --git a/src/effects/effectparameterslotbase.h b/src/effects/effectparameterslotbase.h index 8cd2ad44e55f..508d57a17252 100644 --- a/src/effects/effectparameterslotbase.h +++ b/src/effects/effectparameterslotbase.h @@ -1,5 +1,4 @@ -#ifndef EFFECTPARAMETERSLOTBASE_H -#define EFFECTPARAMETERSLOTBASE_H +#pragma once #include #include @@ -70,5 +69,3 @@ class EffectParameterSlotBase : public QObject { DISALLOW_COPY_AND_ASSIGN(EffectParameterSlotBase); }; - -#endif /* EFFECTPARAMETERSLOTBASE_H */ diff --git a/src/effects/effectslot.h b/src/effects/effectslot.h index 5d1d618741dd..395a7804b1b1 100644 --- a/src/effects/effectslot.h +++ b/src/effects/effectslot.h @@ -1,5 +1,4 @@ -#ifndef EFFECTSLOT_H -#define EFFECTSLOT_H +#pragma once #include #include @@ -189,5 +188,3 @@ class EffectSlot : public QObject { DISALLOW_COPY_AND_ASSIGN(EffectSlot); }; - -#endif /* EFFECTSLOT_H */ diff --git a/src/effects/effectsmanager.h b/src/effects/effectsmanager.h index 7ae9513ec6d6..6624563ef5b4 100644 --- a/src/effects/effectsmanager.h +++ b/src/effects/effectsmanager.h @@ -1,5 +1,4 @@ -#ifndef EFFECTSMANAGER_H -#define EFFECTSMANAGER_H +#pragma once #include #include @@ -226,6 +225,3 @@ class EffectsManager : public QObject { DISALLOW_COPY_AND_ASSIGN(EffectsManager); }; - - -#endif /* EFFECTSMANAGER_H */ From 68ed74d5edee6efc09bc113d2cf13388e8af4f3d Mon Sep 17 00:00:00 2001 From: Be Date: Sat, 4 Apr 2020 18:29:32 -0500 Subject: [PATCH 085/443] EffectChain/ParameterPreset: breakup long lines --- src/effects/presets/effectchainpreset.cpp | 25 +++++++++++++++---- src/effects/presets/effectparameterpreset.cpp | 25 +++++++++++++++---- 2 files changed, 40 insertions(+), 10 deletions(-) diff --git a/src/effects/presets/effectchainpreset.cpp b/src/effects/presets/effectchainpreset.cpp index e3e503f7e918..b83420f1c219 100644 --- a/src/effects/presets/effectchainpreset.cpp +++ b/src/effects/presets/effectchainpreset.cpp @@ -52,11 +52,26 @@ EffectChainPreset::EffectChainPreset(const EffectChainSlot* chain) { const QDomElement EffectChainPreset::toXml(QDomDocument* doc) const { QDomElement chainElement = doc->createElement(EffectXml::Chain); - XmlParse::addElement(*doc, chainElement, EffectXml::ChainId, m_id); - XmlParse::addElement(*doc, chainElement, EffectXml::ChainName, m_name); - XmlParse::addElement(*doc, chainElement, EffectXml::ChainDescription, m_description); - XmlParse::addElement(*doc, chainElement, EffectXml::ChainMixMode, EffectChainSlot::mixModeToString(m_mixMode)); - XmlParse::addElement(*doc, chainElement, EffectXml::ChainSuperParameter, QString::number(m_dSuper)); + XmlParse::addElement(*doc, + chainElement, + EffectXml::ChainId, + m_id); + XmlParse::addElement(*doc, + chainElement, + EffectXml::ChainName, + m_name); + XmlParse::addElement(*doc, + chainElement, + EffectXml::ChainDescription, + m_description); + XmlParse::addElement(*doc, + chainElement, + EffectXml::ChainMixMode, + EffectChainSlot::mixModeToString(m_mixMode)); + XmlParse::addElement(*doc, + chainElement, + EffectXml::ChainSuperParameter, + QString::number(m_dSuper)); QDomElement effectsElement = doc->createElement(EffectXml::EffectsRoot); for (const auto& pEffectPreset : m_effectPresets) { diff --git a/src/effects/presets/effectparameterpreset.cpp b/src/effects/presets/effectparameterpreset.cpp index e84ff533db50..4b8e28b111fe 100644 --- a/src/effects/presets/effectparameterpreset.cpp +++ b/src/effects/presets/effectparameterpreset.cpp @@ -54,11 +54,26 @@ const QDomElement EffectParameterPreset::toXml(QDomDocument* doc) const { QDomElement parameterElement; if (!m_id.isEmpty()) { parameterElement = doc->createElement(EffectXml::Parameter); - XmlParse::addElement(*doc, parameterElement, EffectXml::EffectId, m_id); - XmlParse::addElement(*doc, parameterElement, EffectXml::ParameterValue, QString::number(m_dValue)); - XmlParse::addElement(*doc, parameterElement, EffectXml::ParameterLinkType, EffectManifestParameter::LinkTypeToString(m_linkType)); - XmlParse::addElement(*doc, parameterElement, EffectXml::ParameterLinkInversion, QString::number(static_cast(m_linkInversion))); - XmlParse::addElement(*doc, parameterElement, EffectXml::ParameterHidden, QString::number(static_cast(m_bHidden))); + XmlParse::addElement(*doc, + parameterElement, + EffectXml::EffectId, + m_id); + XmlParse::addElement(*doc, + parameterElement, + EffectXml::ParameterValue, + QString::number(m_dValue)); + XmlParse::addElement(*doc, + parameterElement, + EffectXml::ParameterLinkType, + EffectManifestParameter::LinkTypeToString(m_linkType)); + XmlParse::addElement(*doc, + parameterElement, + EffectXml::ParameterLinkInversion, + QString::number(static_cast(m_linkInversion))); + XmlParse::addElement(*doc, + parameterElement, + EffectXml::ParameterHidden, + QString::number(static_cast(m_bHidden))); } return parameterElement; } From 2ff1ff8b02313f22a9e83742b9b22d5d1ae6f195 Mon Sep 17 00:00:00 2001 From: Be Date: Sat, 4 Apr 2020 19:19:52 -0500 Subject: [PATCH 086/443] EffectManifestParameter: track index in the EffectManifest This ensures that EffectParameter always controls the correct EngineEffectParameter. Before, EffectParameter took the manifest parameter index as an argument to its constructor, which left room for error when constructing EffectParameters in EffectSlot::loadEffect. When I was working on parameter hiding and rearrangement from EffectPresets (c8367b1), I got quite confused for a while when I accidentally messed up the index I was passing to the EffectParameter constructor. --- src/effects/backends/effectmanifest.h | 1 + src/effects/backends/effectmanifestparameter.h | 8 ++++++++ src/effects/effectparameter.cpp | 8 +++++--- src/effects/effectparameter.h | 6 ++++-- src/effects/effectslot.cpp | 4 +--- 5 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/effects/backends/effectmanifest.h b/src/effects/backends/effectmanifest.h index 2449e313c1a5..e2caa61f5c00 100644 --- a/src/effects/backends/effectmanifest.h +++ b/src/effects/backends/effectmanifest.h @@ -122,6 +122,7 @@ class EffectManifest { EffectManifestParameterPointer addParameter() { EffectManifestParameterPointer effectManifestParameterPointer( new EffectManifestParameter()); + effectManifestParameterPointer->setIndex(m_parameters.size()); m_parameters.append(effectManifestParameterPointer); return effectManifestParameterPointer; } diff --git a/src/effects/backends/effectmanifestparameter.h b/src/effects/backends/effectmanifestparameter.h index 4adfec649631..f2d341e9aabb 100644 --- a/src/effects/backends/effectmanifestparameter.h +++ b/src/effects/backends/effectmanifestparameter.h @@ -137,6 +137,13 @@ class EffectManifestParameter { m_description = description; } + int index() const { + return m_iIndex; + } + void setIndex(int index) { + m_iIndex = index; + } + //////////////////////////////////////////////////////////////////////////////// // Usage hints //////////////////////////////////////////////////////////////////////////////// @@ -265,6 +272,7 @@ class EffectManifestParameter { QString m_name; QString m_shortName; QString m_description; + int m_iIndex; ParameterType m_parameterType; ValueScaler m_valueScaler; diff --git a/src/effects/effectparameter.cpp b/src/effects/effectparameter.cpp index 9adb621bb5b0..c9c04161fabc 100644 --- a/src/effects/effectparameter.cpp +++ b/src/effects/effectparameter.cpp @@ -4,10 +4,12 @@ #include "effects/effectsmanager.h" #include "util/assert.h" -EffectParameter::EffectParameter(EngineEffect* pEngineEffect, EffectsManager* pEffectsManager, int iParameterNumber, EffectManifestParameterPointer pParameter, EffectParameterPreset preset) +EffectParameter::EffectParameter(EngineEffect* pEngineEffect, + EffectsManager* pEffectsManager, + EffectManifestParameterPointer pParameter, + EffectParameterPreset preset) : m_pEngineEffect(pEngineEffect), m_pEffectsManager(pEffectsManager), - m_iParameterNumber(iParameterNumber), m_pParameter(pParameter) { if (preset.isNull()) { setValue(pParameter->getDefault()); @@ -65,7 +67,7 @@ void EffectParameter::updateEngineState() { EffectsRequest* pRequest = new EffectsRequest(); pRequest->type = EffectsRequest::SET_PARAMETER_PARAMETERS; pRequest->pTargetEffect = m_pEngineEffect; - pRequest->SetParameterParameters.iParameter = m_iParameterNumber; + pRequest->SetParameterParameters.iParameter = m_pParameter->index(); pRequest->value = m_value; pRequest->minimum = m_pParameter->getMinimum(); pRequest->maximum = m_pParameter->getMaximum(); diff --git a/src/effects/effectparameter.h b/src/effects/effectparameter.h index b9143823f5eb..745dca7ef639 100644 --- a/src/effects/effectparameter.h +++ b/src/effects/effectparameter.h @@ -26,7 +26,10 @@ class EffectParameterPreset; // care of that difference. class EffectParameter { public: - EffectParameter(EngineEffect* pEngineEffect, EffectsManager* pEffectsManager, int iParameterNumber, EffectManifestParameterPointer pParameter, EffectParameterPreset preset); + EffectParameter(EngineEffect* pEngineEffect, + EffectsManager* pEffectsManager, + EffectManifestParameterPointer pParameter, + EffectParameterPreset preset); virtual ~EffectParameter(); EffectManifestParameterPointer manifest() const; @@ -60,7 +63,6 @@ class EffectParameter { EngineEffect* m_pEngineEffect; EffectsManager* m_pEffectsManager; - int m_iParameterNumber; EffectManifestParameterPointer m_pParameter; double m_value; // Hidden parameters cannot be linked to the metaknob, but EffectParameter diff --git a/src/effects/effectslot.cpp b/src/effects/effectslot.cpp index 820552a49b12..fcaa6c8a1793 100644 --- a/src/effects/effectslot.cpp +++ b/src/effects/effectslot.cpp @@ -250,7 +250,6 @@ void EffectSlot::loadEffect(const EffectManifestPointer pManifest, // Create EffectParameters. Every parameter listed in the manifest must have // an EffectParameter created, regardless of whether it is loaded in a slot. - int manifestIndex = 0; for (const auto& pManifestParameter: m_pManifest->parameters()) { // match the manifest parameter to the preset parameter EffectParameterPreset parameterPreset = EffectParameterPreset(); @@ -262,9 +261,8 @@ void EffectSlot::loadEffect(const EffectManifestPointer pManifest, } } EffectParameterPointer pParameter(new EffectParameter( - m_pEngineEffect, m_pEffectsManager, manifestIndex, pManifestParameter, parameterPreset)); + m_pEngineEffect, m_pEffectsManager, pManifestParameter, parameterPreset)); m_parameters[pManifestParameter->parameterType()].append(pParameter); - manifestIndex++; } // Map the parameter slots to the EffectParameters. From 42142bd2879019e8b82c3d8bf19962187166b226 Mon Sep 17 00:00:00 2001 From: Be Date: Sat, 4 Apr 2020 19:34:56 -0500 Subject: [PATCH 087/443] clarify distinction between parameters & parameter manifests --- src/effects/effectparameter.cpp | 18 +++++++++--------- src/effects/effectparameter.h | 6 +++--- src/engine/effects/engineeffectparameter.h | 18 +++++++++--------- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/effects/effectparameter.cpp b/src/effects/effectparameter.cpp index c9c04161fabc..e8d919359c7a 100644 --- a/src/effects/effectparameter.cpp +++ b/src/effects/effectparameter.cpp @@ -6,13 +6,13 @@ EffectParameter::EffectParameter(EngineEffect* pEngineEffect, EffectsManager* pEffectsManager, - EffectManifestParameterPointer pParameter, + EffectManifestParameterPointer pParameterManifest, EffectParameterPreset preset) : m_pEngineEffect(pEngineEffect), m_pEffectsManager(pEffectsManager), - m_pParameter(pParameter) { + m_pParameterManifest(pParameterManifest) { if (preset.isNull()) { - setValue(pParameter->getDefault()); + setValue(pParameterManifest->getDefault()); } else { setValue(preset.value()); m_linkType = preset.linkType(); @@ -25,7 +25,7 @@ EffectParameter::~EffectParameter() { } EffectManifestParameterPointer EffectParameter::manifest() const { - return m_pParameter; + return m_pParameterManifest; } // static @@ -42,7 +42,7 @@ bool EffectParameter::clampValue(double* pValue, } bool EffectParameter::clampValue() { - return clampValue(&m_value, m_pParameter->getMinimum(), m_pParameter->getMaximum()); + return clampValue(&m_value, m_pParameterManifest->getMinimum(), m_pParameterManifest->getMaximum()); } double EffectParameter::getValue() const { @@ -67,10 +67,10 @@ void EffectParameter::updateEngineState() { EffectsRequest* pRequest = new EffectsRequest(); pRequest->type = EffectsRequest::SET_PARAMETER_PARAMETERS; pRequest->pTargetEffect = m_pEngineEffect; - pRequest->SetParameterParameters.iParameter = m_pParameter->index(); + pRequest->SetParameterParameters.iParameter = m_pParameterManifest->index(); pRequest->value = m_value; - pRequest->minimum = m_pParameter->getMinimum(); - pRequest->maximum = m_pParameter->getMaximum(); - pRequest->default_value = m_pParameter->getDefault(); + pRequest->minimum = m_pParameterManifest->getMinimum(); + pRequest->maximum = m_pParameterManifest->getMaximum(); + pRequest->default_value = m_pParameterManifest->getDefault(); m_pEffectsManager->writeRequest(pRequest); } diff --git a/src/effects/effectparameter.h b/src/effects/effectparameter.h index 745dca7ef639..d5b9884e6a89 100644 --- a/src/effects/effectparameter.h +++ b/src/effects/effectparameter.h @@ -28,7 +28,7 @@ class EffectParameter { public: EffectParameter(EngineEffect* pEngineEffect, EffectsManager* pEffectsManager, - EffectManifestParameterPointer pParameter, + EffectManifestParameterPointer pParameterManifest, EffectParameterPreset preset); virtual ~EffectParameter(); @@ -54,7 +54,7 @@ class EffectParameter { private: QString debugString() const { - return QString("EffectParameter(%1)").arg(m_pParameter->name()); + return QString("EffectParameter(%1)").arg(m_pParameterManifest->name()); } static bool clampValue(double* pValue, @@ -63,7 +63,7 @@ class EffectParameter { EngineEffect* m_pEngineEffect; EffectsManager* m_pEffectsManager; - EffectManifestParameterPointer m_pParameter; + EffectManifestParameterPointer m_pParameterManifest; double m_value; // Hidden parameters cannot be linked to the metaknob, but EffectParameter // needs to maintain their state in case they are loaded into an EffectParameterSlot. diff --git a/src/engine/effects/engineeffectparameter.h b/src/engine/effects/engineeffectparameter.h index 72ab60108e57..e7d7ead89ed5 100644 --- a/src/engine/effects/engineeffectparameter.h +++ b/src/engine/effects/engineeffectparameter.h @@ -9,17 +9,17 @@ class EngineEffectParameter { public: - EngineEffectParameter(EffectManifestParameterPointer parameter) - : m_pParameter(parameter) { + EngineEffectParameter(EffectManifestParameterPointer pParameterManifest) + : m_pParameterManifest(pParameterManifest) { // NOTE(rryan): This is just to set the parameter values to sane // defaults. When an effect is loaded into the engine it is supposed to // immediately send a parameter update. Some effects will go crazy if // their parameters are not within the manifest's minimum/maximum bounds // so just to be safe we read the min/max/default from the manifest // here. - m_minimum = m_pParameter->getMinimum(); - m_maximum = m_pParameter->getMaximum(); - m_defaultValue = m_pParameter->getDefault(); + m_minimum = m_pParameterManifest->getMinimum(); + m_maximum = m_pParameterManifest->getMaximum(); + m_defaultValue = m_pParameterManifest->getDefault(); m_value = m_defaultValue; } virtual ~EngineEffectParameter() { } @@ -29,13 +29,13 @@ class EngineEffectParameter { /////////////////////////////////////////////////////////////////////////// const QString& id() const { - return m_pParameter->id(); + return m_pParameterManifest->id(); } const QString& name() const { - return m_pParameter->name(); + return m_pParameterManifest->name(); } const QString& description() const { - return m_pParameter->description(); + return m_pParameterManifest->description(); } /////////////////////////////////////////////////////////////////////////// @@ -77,7 +77,7 @@ class EngineEffectParameter { } private: - EffectManifestParameterPointer m_pParameter; + EffectManifestParameterPointer m_pParameterManifest; double m_value; double m_defaultValue; double m_minimum; From 30beeea4bcdf47fa8d7e90976dc8f17205fdf34d Mon Sep 17 00:00:00 2001 From: Be Date: Sat, 4 Apr 2020 20:04:26 -0500 Subject: [PATCH 088/443] remove unused features from EngineEffectParameter EngineEffectParameters have absolute minimum and maximum limits specified by the EffectParameterManifest. They cannot be changed after construction. If setting custom minimum and maximum values for parameters is implemented, that will be handled by EffectParameter in the main thread and those must be narrower than the absolute limits specified in the manifest, or the DSP logic of effects may not work. --- src/effects/effectparameter.cpp | 3 -- src/engine/effects/engineeffect.cpp | 6 --- src/engine/effects/engineeffectparameter.h | 55 +++------------------- src/engine/effects/message.h | 6 --- 4 files changed, 7 insertions(+), 63 deletions(-) diff --git a/src/effects/effectparameter.cpp b/src/effects/effectparameter.cpp index e8d919359c7a..9dfb0b68b789 100644 --- a/src/effects/effectparameter.cpp +++ b/src/effects/effectparameter.cpp @@ -69,8 +69,5 @@ void EffectParameter::updateEngineState() { pRequest->pTargetEffect = m_pEngineEffect; pRequest->SetParameterParameters.iParameter = m_pParameterManifest->index(); pRequest->value = m_value; - pRequest->minimum = m_pParameterManifest->getMinimum(); - pRequest->maximum = m_pParameterManifest->getMaximum(); - pRequest->default_value = m_pParameterManifest->getDefault(); m_pEffectsManager->writeRequest(pRequest); } diff --git a/src/engine/effects/engineeffect.cpp b/src/engine/effects/engineeffect.cpp index f106e4c8335f..e5f1c346138c 100644 --- a/src/engine/effects/engineeffect.cpp +++ b/src/engine/effects/engineeffect.cpp @@ -107,17 +107,11 @@ bool EngineEffect::processEffectsRequest(EffectsRequest& message, if (kEffectDebugOutput) { qDebug() << debugString() << "SET_PARAMETER_PARAMETERS" << "parameter" << message.SetParameterParameters.iParameter - << "minimum" << message.minimum - << "maximum" << message.maximum - << "default_value" << message.default_value << "value" << message.value; } pParameter = m_parameters.value( message.SetParameterParameters.iParameter, EngineEffectParameterPointer()); if (pParameter) { - pParameter->setMinimum(message.minimum); - pParameter->setMaximum(message.maximum); - pParameter->setDefaultValue(message.default_value); pParameter->setValue(message.value); response.success = true; } else { diff --git a/src/engine/effects/engineeffectparameter.h b/src/engine/effects/engineeffectparameter.h index e7d7ead89ed5..42348487be92 100644 --- a/src/engine/effects/engineeffectparameter.h +++ b/src/engine/effects/engineeffectparameter.h @@ -11,41 +11,24 @@ class EngineEffectParameter { public: EngineEffectParameter(EffectManifestParameterPointer pParameterManifest) : m_pParameterManifest(pParameterManifest) { - // NOTE(rryan): This is just to set the parameter values to sane - // defaults. When an effect is loaded into the engine it is supposed to - // immediately send a parameter update. Some effects will go crazy if - // their parameters are not within the manifest's minimum/maximum bounds - // so just to be safe we read the min/max/default from the manifest - // here. - m_minimum = m_pParameterManifest->getMinimum(); - m_maximum = m_pParameterManifest->getMaximum(); - m_defaultValue = m_pParameterManifest->getDefault(); - m_value = m_defaultValue; + m_value = m_pParameterManifest->getDefault(); } virtual ~EngineEffectParameter() { } - /////////////////////////////////////////////////////////////////////////// - // Parameter Information - /////////////////////////////////////////////////////////////////////////// - const QString& id() const { return m_pParameterManifest->id(); } - const QString& name() const { - return m_pParameterManifest->name(); - } - const QString& description() const { - return m_pParameterManifest->description(); - } - - /////////////////////////////////////////////////////////////////////////// - // Value Settings - /////////////////////////////////////////////////////////////////////////// inline double value() const { return m_value; } inline void setValue(const double value) { + // Values should be clamped by EffectParameter before sending to the engine. + VERIFY_OR_DEBUG_ASSERT( + value >= m_pParameterManifest->getMinimum() && + value <= m_pParameterManifest->getMaximum()) { + return; + } m_value = value; } inline int toInt() const { @@ -55,33 +38,9 @@ class EngineEffectParameter { return m_value > 0.0; } - inline double defaultValue() const { - return m_defaultValue; - } - inline void setDefaultValue(const double default_value) { - m_defaultValue = default_value; - } - - inline double minimum() const { - return m_minimum; - } - inline void setMinimum(const double minimum) { - m_minimum = minimum; - } - - inline double maximum() const { - return m_maximum; - } - inline void setMaximum(const double maximum) { - m_maximum = maximum; - } - private: EffectManifestParameterPointer m_pParameterManifest; double m_value; - double m_defaultValue; - double m_minimum; - double m_maximum; DISALLOW_COPY_AND_ASSIGN(EngineEffectParameter); }; diff --git a/src/engine/effects/message.h b/src/engine/effects/message.h index f5c558dce1f2..7a6a843600ed 100644 --- a/src/engine/effects/message.h +++ b/src/engine/effects/message.h @@ -37,9 +37,6 @@ struct EffectsRequest { EffectsRequest() : type(NUM_REQUEST_TYPES), request_id(-1), - minimum(0.0), - maximum(0.0), - default_value(0.0), value(0.0) { pTargetChain = nullptr; pTargetEffect = nullptr; @@ -127,9 +124,6 @@ struct EffectsRequest { }; // Used by SET_EFFECT_PARAMETER. - double minimum; - double maximum; - double default_value; double value; }; From fc20570c5afb335535627ba88eb90c4176b09e0d Mon Sep 17 00:00:00 2001 From: Be Date: Sat, 4 Apr 2020 20:07:10 -0500 Subject: [PATCH 089/443] EngineEffect: change check to VERIFY_OR_DEBUG_ASSERT --- src/engine/effects/engineeffect.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engine/effects/engineeffect.cpp b/src/engine/effects/engineeffect.cpp index e5f1c346138c..e4387ab87711 100644 --- a/src/engine/effects/engineeffect.cpp +++ b/src/engine/effects/engineeffect.cpp @@ -50,7 +50,7 @@ EngineEffect::~EngineEffect() { } EffectState* EngineEffect::createState(const mixxx::EngineParameters& bufferParameters) { - if (!m_pProcessor) { + VERIFY_OR_DEBUG_ASSERT(m_pProcessor) { return new EffectState(bufferParameters); } return m_pProcessor->createState(bufferParameters); From 97468735b587f5e3de7cd0287477ed3551552ad4 Mon Sep 17 00:00:00 2001 From: Be Date: Sat, 4 Apr 2020 21:39:07 -0500 Subject: [PATCH 090/443] breakup long lines in the effects system --- src/effects/effectchainslot.cpp | 7 ++++++- src/effects/effectslot.cpp | 8 +++++--- src/effects/effectsmanager.cpp | 36 ++++++++++++++++++++++++--------- 3 files changed, 38 insertions(+), 13 deletions(-) diff --git a/src/effects/effectchainslot.cpp b/src/effects/effectchainslot.cpp index 8395031e08c6..da059e2d0bff 100644 --- a/src/effects/effectchainslot.cpp +++ b/src/effects/effectchainslot.cpp @@ -190,7 +190,12 @@ void EffectChainSlot::loadEffect(const unsigned int iEffectSlotNumber, std::unique_ptr pProcessor, EffectPresetPointer pPreset, bool adoptMetaknobFromPreset) { - m_effectSlots[iEffectSlotNumber]->loadEffect(pManifest, std::move(pProcessor), pPreset, m_enabledInputChannels, adoptMetaknobFromPreset); + m_effectSlots[iEffectSlotNumber]->loadEffect( + pManifest, + std::move(pProcessor), + pPreset, + m_enabledInputChannels, + adoptMetaknobFromPreset); } void EffectChainSlot::sendParameterUpdate() { diff --git a/src/effects/effectslot.cpp b/src/effects/effectslot.cpp index fcaa6c8a1793..46638c912897 100644 --- a/src/effects/effectslot.cpp +++ b/src/effects/effectslot.cpp @@ -218,7 +218,8 @@ void EffectSlot::setEnabled(bool enabled) { EffectParameterSlotBasePointer EffectSlot::getEffectParameterSlot( EffectManifestParameter::ParameterType parameterType, unsigned int slotNumber) { - VERIFY_OR_DEBUG_ASSERT(slotNumber <= (unsigned)m_parameterSlots.value(parameterType).size()) { + VERIFY_OR_DEBUG_ASSERT( + slotNumber <= (unsigned)m_parameterSlots.value(parameterType).size()) { return nullptr; } return m_parameterSlots.value(parameterType).at(slotNumber); @@ -231,7 +232,7 @@ void EffectSlot::loadEffect(const EffectManifestPointer pManifest, bool adoptMetaknobFromPreset) { if (kEffectDebugOutput) { if (pManifest != nullptr) { - qDebug() << this << m_group << "loading effect" << pManifest->id() << pEffectPreset.get() << pProcessor.get(); + qDebug() << this << m_group << "loading effect" << pManifest->id(); } else { qDebug() << this << m_group << "unloading effect"; } @@ -459,7 +460,8 @@ void EffectSlot::slotEffectMetaParameter(double v, bool force) { } // Only knobs are linked to the metaknob; not buttons - for (const auto& pParameterSlot : m_parameterSlots.value(EffectManifestParameter::ParameterType::KNOB)) { + const auto& knobParameters = m_parameterSlots.value(EffectManifestParameter::ParameterType::KNOB); + for (const auto& pParameterSlot : knobParameters) { if (pParameterSlot->parameterType() == EffectManifestParameter::ParameterType::KNOB) { pParameterSlot->onEffectMetaParameterChanged(v, force); } diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index 324b5caa2555..3c7e99bdc6c0 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -25,7 +25,9 @@ const QString kGroupClose = "]"; const unsigned int kEffectMessagPipeFifoSize = 2048; } // anonymous namespace -EffectsManager::EffectsManager(QObject* pParent, UserSettingsPointer pConfig, ChannelHandleFactory* pChannelHandleFactory) +EffectsManager::EffectsManager(QObject* pParent, + UserSettingsPointer pConfig, + ChannelHandleFactory* pChannelHandleFactory) : QObject(pParent), m_pChannelHandleFactory(pChannelHandleFactory), m_nextRequestId(0), @@ -86,10 +88,12 @@ EffectsManager::~EffectsManager() { } bool alphabetizeEffectManifests(EffectManifestPointer pManifest1, - EffectManifestPointer pManifest2) { + EffectManifestPointer pManifest2) { // Sort built-in effects first before external plugins - int backendNameComparision = static_cast(pManifest1->backendType()) - static_cast(pManifest2->backendType()); - int displayNameComparision = QString::localeAwareCompare(pManifest1->displayName(), pManifest2->displayName()); + int backendNameComparision = static_cast(pManifest1->backendType()) - + static_cast(pManifest2->backendType()); + int displayNameComparision = QString::localeAwareCompare( + pManifest1->displayName(), pManifest2->displayName()); return (backendNameComparision ? (backendNameComparision < 0) : (displayNameComparision < 0)); } @@ -173,7 +177,12 @@ void EffectsManager::loadEffect(EffectChainSlotPointer pChainSlot, if (pPreset == nullptr) { pPreset = m_defaultPresets.value(pManifest); } - pChainSlot->loadEffect(iEffectSlotNumber, pManifest, createProcessor(pManifest), pPreset, adoptMetaknobFromPreset); + pChainSlot->loadEffect( + iEffectSlotNumber, + pManifest, + createProcessor(pManifest), + pPreset, + adoptMetaknobFromPreset); } std::unique_ptr EffectsManager::createProcessor( @@ -231,7 +240,12 @@ void EffectsManager::loadEffectChainPreset(EffectChainSlotPointer pChainSlot, continue; } EffectManifestPointer pManifest = pBackend->getManifest(pEffectPreset->id()); - pChainSlot->loadEffect(effectSlot, pManifest, createProcessor(pManifest), pEffectPreset, true); + pChainSlot->loadEffect( + effectSlot, + pManifest, + createProcessor(pManifest), + pEffectPreset, + true); effectSlot++; } pChainSlot->setMixMode(pPreset->mixMode()); @@ -332,7 +346,8 @@ EffectManifestPointer EffectsManager::getManifestFromUniqueId(const QString& uid uid.mid(-1, delimiterIndex+1)); } -EffectManifestPointer EffectsManager::getManifest(const QString& id, EffectBackendType backendType) const { +EffectManifestPointer EffectsManager::getManifest( + const QString& id, EffectBackendType backendType) const { return m_effectsBackends.value(backendType)->getManifest(id); } @@ -418,7 +433,8 @@ EffectSlotPointer EffectsManager::getEffectSlot( } EffectParameterSlotBasePointer EffectsManager::getEffectParameterSlot( - const EffectManifestParameter::ParameterType parameterType, const ConfigKey& configKey) { + const EffectManifestParameter::ParameterType parameterType, + const ConfigKey& configKey) { EffectSlotPointer pEffectSlot = getEffectSlot(configKey.group); VERIFY_OR_DEBUG_ASSERT(pEffectSlot) { @@ -531,7 +547,9 @@ void EffectsManager::collectGarbage(const EffectsRequest* pRequest) { delete pRequest->RemoveEffectChain.pChain; } else if (pRequest->type == EffectsRequest::DISABLE_EFFECT_CHAIN_FOR_INPUT_CHANNEL) { if (kEffectDebugOutput) { - qDebug() << debugString() << "deleting states for input channel" << pRequest->DisableInputChannelForChain.pChannelHandle << "for EngineEffectChain" << pRequest->pTargetChain; + qDebug() << debugString() << "deleting states for input channel" + << pRequest->DisableInputChannelForChain.pChannelHandle + << "for EngineEffectChain" << pRequest->pTargetChain; } pRequest->pTargetChain->deleteStatesForInputChannel( pRequest->DisableInputChannelForChain.pChannelHandle); From 298217d9576872f5a23db86ead6e1fe166e0c5a2 Mon Sep 17 00:00:00 2001 From: Be Date: Sat, 4 Apr 2020 23:39:28 -0500 Subject: [PATCH 091/443] typedef EffectManifestParameter::ParameterType EffectParameterType EffectManifestParameter::ParameterType is a really long type name --- .../backends/effectmanifestparameter.h | 8 ++-- src/effects/effectbuttonparameterslot.cpp | 7 ++-- src/effects/effectknobparameterslot.cpp | 5 +-- src/effects/effectparameterslotbase.cpp | 4 +- src/effects/effectparameterslotbase.h | 7 ++-- src/effects/effectslot.cpp | 40 +++++++++---------- src/effects/effectslot.h | 22 +++++----- src/effects/effectsmanager.cpp | 2 +- src/effects/effectsmanager.h | 4 +- src/effects/presets/effectpreset.cpp | 6 +-- 10 files changed, 52 insertions(+), 53 deletions(-) diff --git a/src/effects/backends/effectmanifestparameter.h b/src/effects/backends/effectmanifestparameter.h index f2d341e9aabb..042ac66c8ced 100644 --- a/src/effects/backends/effectmanifestparameter.h +++ b/src/effects/backends/effectmanifestparameter.h @@ -296,8 +296,10 @@ class EffectManifestParameter { bool m_showInParametertSlot; }; -inline uint qHash(const EffectManifestParameter::ParameterType& parameterType) { +QDebug operator<<(QDebug dbg, const EffectManifestParameter& parameter); + +typedef EffectManifestParameter::ParameterType EffectParameterType; + +inline uint qHash(const EffectParameterType& parameterType) { return static_cast(parameterType); } - -QDebug operator<<(QDebug dbg, const EffectManifestParameter& parameter); diff --git a/src/effects/effectbuttonparameterslot.cpp b/src/effects/effectbuttonparameterslot.cpp index 56b7754f0eb1..56465e415110 100644 --- a/src/effects/effectbuttonparameterslot.cpp +++ b/src/effects/effectbuttonparameterslot.cpp @@ -9,9 +9,8 @@ #include "util/xml.h" EffectButtonParameterSlot::EffectButtonParameterSlot(const QString& group, - const unsigned int iParameterSlotNumber) - : EffectParameterSlotBase(group, iParameterSlotNumber, - EffectManifestParameter::ParameterType::BUTTON) { + const unsigned int iParameterSlotNumber) + : EffectParameterSlotBase(group, iParameterSlotNumber, EffectParameterType::BUTTON) { QString itemPrefix = formatItemPrefix(iParameterSlotNumber); m_pControlLoaded = new ControlObject( ConfigKey(m_group, itemPrefix + QString("_loaded"))); @@ -44,7 +43,7 @@ void EffectButtonParameterSlot::loadParameter(EffectParameterPointer pEffectPara } VERIFY_OR_DEBUG_ASSERT(pEffectParameter->manifest()->parameterType() == - EffectManifestParameter::ParameterType::BUTTON) { + EffectParameterType::BUTTON) { return; } diff --git a/src/effects/effectknobparameterslot.cpp b/src/effects/effectknobparameterslot.cpp index 8675d7fd494f..c551db0c2438 100644 --- a/src/effects/effectknobparameterslot.cpp +++ b/src/effects/effectknobparameterslot.cpp @@ -11,8 +11,7 @@ #include "util/xml.h" EffectKnobParameterSlot::EffectKnobParameterSlot(const QString& group, const unsigned int iParameterSlotNumber) - : EffectParameterSlotBase(group, iParameterSlotNumber, - EffectManifestParameter::ParameterType::KNOB) { + : EffectParameterSlotBase(group, iParameterSlotNumber, EffectParameterType::KNOB) { QString itemPrefix = formatItemPrefix(iParameterSlotNumber); m_pControlValue = new ControlEffectKnob( @@ -61,7 +60,7 @@ void EffectKnobParameterSlot::loadParameter(EffectParameterPointer pEffectParame clear(); VERIFY_OR_DEBUG_ASSERT(pEffectParameter->manifest()->parameterType() == - EffectManifestParameter::ParameterType::KNOB) { + EffectParameterType::KNOB) { return; } diff --git a/src/effects/effectparameterslotbase.cpp b/src/effects/effectparameterslotbase.cpp index 81a8fc5c812d..527e3cf065a5 100644 --- a/src/effects/effectparameterslotbase.cpp +++ b/src/effects/effectparameterslotbase.cpp @@ -8,7 +8,7 @@ EffectParameterSlotBase::EffectParameterSlotBase(const QString& group, const unsigned int iParameterSlotNumber, - const EffectManifestParameter::ParameterType parameterType) + const EffectParameterType parameterType) : m_iParameterSlotNumber(iParameterSlotNumber), m_group(group), m_pEffectParameter(nullptr), @@ -48,7 +48,7 @@ QString EffectParameterSlotBase::description() const { return tr("No effect loaded."); } -EffectManifestParameter::ParameterType EffectParameterSlotBase::parameterType() const { +EffectParameterType EffectParameterSlotBase::parameterType() const { return m_parameterType; } diff --git a/src/effects/effectparameterslotbase.h b/src/effects/effectparameterslotbase.h index 508d57a17252..979df1387789 100644 --- a/src/effects/effectparameterslotbase.h +++ b/src/effects/effectparameterslotbase.h @@ -22,8 +22,7 @@ class EffectSlot; class EffectParameterSlotBase : public QObject { Q_OBJECT public: - EffectParameterSlotBase(const QString& group, const unsigned int iParameterSlotNumber, - const EffectManifestParameter::ParameterType parameterType); + EffectParameterSlotBase(const QString& group, const unsigned int iParameterSlotNumber, const EffectParameterType parameterType); virtual ~EffectParameterSlotBase(); @@ -39,7 +38,7 @@ class EffectParameterSlotBase : public QObject { QString name() const; QString shortName() const; QString description() const; - EffectManifestParameter::ParameterType parameterType() const; + EffectParameterType parameterType() const; EffectManifestParameterPointer getManifest(); inline bool isLoaded() const { return m_pManifestParameter != nullptr; @@ -60,7 +59,7 @@ class EffectParameterSlotBase : public QObject { EffectSlot* m_pEffectSlot; EffectParameterPointer m_pEffectParameter; EffectManifestParameterPointer m_pManifestParameter; - EffectManifestParameter::ParameterType m_parameterType; + EffectParameterType m_parameterType; // Controls exposed to the rest of Mixxx ControlObject* m_pControlLoaded; diff --git a/src/effects/effectslot.cpp b/src/effects/effectslot.cpp index 46638c912897..7af84041b180 100644 --- a/src/effects/effectslot.cpp +++ b/src/effects/effectslot.cpp @@ -28,17 +28,17 @@ EffectSlot::EffectSlot(const QString& group, m_pControlLoaded = new ControlObject(ConfigKey(m_group, "loaded")); m_pControlLoaded->setReadOnly(); - m_pControlNumParameters.insert(EffectManifestParameter::ParameterType::KNOB, + m_pControlNumParameters.insert(EffectParameterType::KNOB, new ControlObject(ConfigKey(m_group, "num_parameters"))); - m_pControlNumParameters.insert(EffectManifestParameter::ParameterType::BUTTON, + m_pControlNumParameters.insert(EffectParameterType::BUTTON, new ControlObject(ConfigKey(m_group, "num_button_parameters"))); for (const auto& pControlNumParameters : m_pControlNumParameters) { pControlNumParameters->setReadOnly(); } - m_pControlNumParameterSlots.insert(EffectManifestParameter::ParameterType::KNOB, + m_pControlNumParameterSlots.insert(EffectParameterType::KNOB, new ControlObject(ConfigKey(m_group, "num_parameterslots"))); - m_pControlNumParameterSlots.insert(EffectManifestParameter::ParameterType::BUTTON, + m_pControlNumParameterSlots.insert(EffectParameterType::BUTTON, new ControlObject(ConfigKey(m_group, "num_button_parameterslots"))); for (const auto& pControlNumParameterSlots : m_pControlNumParameterSlots) { pControlNumParameterSlots->setReadOnly(); @@ -69,8 +69,8 @@ EffectSlot::EffectSlot(const QString& group, this, &EffectSlot::slotClear); for (unsigned int i = 0; i < kDefaultMaxParameters; ++i) { - addEffectParameterSlot(EffectManifestParameter::ParameterType::KNOB); - addEffectParameterSlot(EffectManifestParameter::ParameterType::BUTTON); + addEffectParameterSlot(EffectParameterType::KNOB); + addEffectParameterSlot(EffectParameterType::BUTTON); } m_pControlMetaParameter = new ControlPotmeter(ConfigKey(m_group, "meta"), 0.0, 1.0); @@ -188,12 +188,12 @@ EffectManifestPointer EffectSlot::getManifest() const { return m_pManifest; } -void EffectSlot::addEffectParameterSlot(EffectManifestParameter::ParameterType parameterType) { +void EffectSlot::addEffectParameterSlot(EffectParameterType parameterType) { EffectParameterSlotBasePointer pParameterSlot = EffectParameterSlotBasePointer(); - if (parameterType == EffectManifestParameter::ParameterType::KNOB) { + if (parameterType == EffectParameterType::KNOB) { pParameterSlot = static_cast( new EffectKnobParameterSlot(m_group, m_iNumParameterSlots[parameterType])); - } else if (parameterType == EffectManifestParameter::ParameterType::BUTTON) { + } else if (parameterType == EffectParameterType::BUTTON) { pParameterSlot = static_cast( new EffectButtonParameterSlot(m_group, m_iNumParameterSlots[parameterType])); } @@ -207,7 +207,7 @@ void EffectSlot::addEffectParameterSlot(EffectManifestParameter::ParameterType p m_parameterSlots[parameterType].append(pParameterSlot); } -unsigned int EffectSlot::numParameters(EffectManifestParameter::ParameterType parameterType) const { +unsigned int EffectSlot::numParameters(EffectParameterType parameterType) const { return m_parameters.value(parameterType).size(); } @@ -216,7 +216,7 @@ void EffectSlot::setEnabled(bool enabled) { } EffectParameterSlotBasePointer EffectSlot::getEffectParameterSlot( - EffectManifestParameter::ParameterType parameterType, + EffectParameterType parameterType, unsigned int slotNumber) { VERIFY_OR_DEBUG_ASSERT( slotNumber <= (unsigned)m_parameterSlots.value(parameterType).size()) { @@ -268,10 +268,10 @@ void EffectSlot::loadEffect(const EffectManifestPointer pManifest, // Map the parameter slots to the EffectParameters. // The slot order is determined by the order parameters are listed in the preset. - int numTypes = static_cast(EffectManifestParameter::ParameterType::NUM_TYPES); + int numTypes = static_cast(EffectParameterType::NUM_TYPES); for (int parameterTypeId = 0; parameterTypeId < numTypes; ++parameterTypeId) { - const EffectManifestParameter::ParameterType parameterType = - static_cast(parameterTypeId); + const EffectParameterType parameterType = + static_cast(parameterTypeId); if (pEffectPreset != nullptr && !pEffectPreset.isNull()) { m_loadedParameters[parameterType].clear(); @@ -346,10 +346,10 @@ void EffectSlot::unloadEffect() { void EffectSlot::loadParameters() { //qDebug() << this << m_group << "loading parameters"; - int numTypes = static_cast(EffectManifestParameter::ParameterType::NUM_TYPES); + int numTypes = static_cast(EffectParameterType::NUM_TYPES); for (int parameterTypeId=0 ; parameterTypeId(parameterTypeId); + const EffectParameterType parameterType = + static_cast(parameterTypeId); m_pControlNumParameters[parameterType]->forceSet(numParameters(parameterType)); @@ -426,7 +426,7 @@ void EffectSlot::slotClear(double v) { void EffectSlot::syncSofttakeover() { for (const auto& parameterSlotList : m_parameterSlots) { for (const auto& pParameterSlot : parameterSlotList) { - if (pParameterSlot->parameterType() == EffectManifestParameter::ParameterType::KNOB) { + if (pParameterSlot->parameterType() == EffectParameterType::KNOB) { pParameterSlot->syncSofttakeover(); } } @@ -460,9 +460,9 @@ void EffectSlot::slotEffectMetaParameter(double v, bool force) { } // Only knobs are linked to the metaknob; not buttons - const auto& knobParameters = m_parameterSlots.value(EffectManifestParameter::ParameterType::KNOB); + const auto& knobParameters = m_parameterSlots.value(EffectParameterType::KNOB); for (const auto& pParameterSlot : knobParameters) { - if (pParameterSlot->parameterType() == EffectManifestParameter::ParameterType::KNOB) { + if (pParameterSlot->parameterType() == EffectParameterType::KNOB) { pParameterSlot->onEffectMetaParameterChanged(v, force); } } diff --git a/src/effects/effectslot.h b/src/effects/effectslot.h index 395a7804b1b1..d4c787863db5 100644 --- a/src/effects/effectslot.h +++ b/src/effects/effectslot.h @@ -29,7 +29,7 @@ class ControlProxy; class EffectParameter; class EffectKnobParameterSlot; -typedef QMap> ParameterMap; +typedef QMap> ParameterMap; // EffectSlot is a main thread class which creates EngineEffects and sends // updates to them in response to changes in ControlObjects. It owns the @@ -96,10 +96,10 @@ class EffectSlot : public QObject { const ParameterMap getHiddenParameters() const { ParameterMap hiddenParameters; - int numTypes = static_cast(EffectManifestParameter::ParameterType::NUM_TYPES); + int numTypes = static_cast(EffectParameterType::NUM_TYPES); for (int parameterTypeId = 0; parameterTypeId < numTypes; ++parameterTypeId) { - const EffectManifestParameter::ParameterType parameterType = - static_cast(parameterTypeId); + const EffectParameterType parameterType = + static_cast(parameterTypeId); for (const auto& pParameter : m_parameters.value(parameterType)) { if (!m_loadedParameters.value(parameterType).contains(pParameter)) { hiddenParameters[parameterType].append(pParameter); @@ -112,9 +112,9 @@ class EffectSlot : public QObject { void hideParameter(EffectParameterPointer pParameter); void showParameter(EffectParameterPointer pParameter); - void addEffectParameterSlot(EffectManifestParameter::ParameterType parameterType); + void addEffectParameterSlot(EffectParameterType parameterType); EffectParameterSlotBasePointer getEffectParameterSlot( - EffectManifestParameter::ParameterType parameterType, unsigned int slotNumber); + EffectParameterType parameterType, unsigned int slotNumber); double getMetaParameter() const; @@ -130,7 +130,7 @@ class EffectSlot : public QObject { EffectManifestPointer getManifest() const; - unsigned int numParameters(EffectManifestParameter::ParameterType parameterType) const; + unsigned int numParameters(EffectParameterType parameterType) const; void setEnabled(bool enabled); @@ -163,7 +163,7 @@ class EffectSlot : public QObject { void unloadEffect(); const unsigned int m_iEffectNumber; - QHash m_iNumParameterSlots; + QHash m_iNumParameterSlots; const QString m_group; UserSettingsPointer m_pConfig; EffectsManager* m_pEffectsManager; @@ -172,11 +172,11 @@ class EffectSlot : public QObject { EngineEffect* m_pEngineEffect; ParameterMap m_parameters; ParameterMap m_loadedParameters; - QMap> m_parameterSlots; + QMap> m_parameterSlots; ControlObject* m_pControlLoaded; - QHash m_pControlNumParameters; - QHash m_pControlNumParameterSlots; + QHash m_pControlNumParameters; + QHash m_pControlNumParameterSlots; ControlPushButton* m_pControlEnabled; ControlObject* m_pControlNextEffect; ControlObject* m_pControlPrevEffect; diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index 3c7e99bdc6c0..8c13e174c6ad 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -433,7 +433,7 @@ EffectSlotPointer EffectsManager::getEffectSlot( } EffectParameterSlotBasePointer EffectsManager::getEffectParameterSlot( - const EffectManifestParameter::ParameterType parameterType, + const EffectParameterType parameterType, const ConfigKey& configKey) { EffectSlotPointer pEffectSlot = getEffectSlot(configKey.group); diff --git a/src/effects/effectsmanager.h b/src/effects/effectsmanager.h index 6624563ef5b4..8b32b508235c 100644 --- a/src/effects/effectsmanager.h +++ b/src/effects/effectsmanager.h @@ -22,7 +22,7 @@ class EngineEffectsManager; class EffectManifest; -typedef QMap> ParameterMap; +typedef QMap> ParameterMap; // EffectsManager is the interface between the parts of the effects system in // the main thread and the rest of Mixxx. It creates/destroys a fixed @@ -138,7 +138,7 @@ class EffectsManager : public QObject { EffectSlotPointer getEffectSlot(const QString& group); EffectParameterSlotBasePointer getEffectParameterSlot( - const EffectManifestParameter::ParameterType parameterType, const ConfigKey& configKey); + const EffectParameterType parameterType, const ConfigKey& configKey); QString getNextEffectId(const QString& effectId); QString getPrevEffectId(const QString& effectId); diff --git a/src/effects/presets/effectpreset.cpp b/src/effects/presets/effectpreset.cpp index 08741b17a45d..fe62dcea0842 100644 --- a/src/effects/presets/effectpreset.cpp +++ b/src/effects/presets/effectpreset.cpp @@ -42,10 +42,10 @@ EffectPreset::EffectPreset(const EffectSlotPointer pEffectSlot) { m_dMetaParameter = pEffectSlot->getMetaParameter(); // Parameters are reloaded in the order they are saved, so the order of // loaded effects must be preserved. - int numTypes = static_cast(EffectManifestParameter::ParameterType::NUM_TYPES); + int numTypes = static_cast(EffectParameterType::NUM_TYPES); for (int parameterTypeId = 0; parameterTypeId < numTypes; ++parameterTypeId) { - const EffectManifestParameter::ParameterType parameterType = - static_cast(parameterTypeId); + const EffectParameterType parameterType = + static_cast(parameterTypeId); for (const auto& pParameter : pEffectSlot->getLoadedParameters().value(parameterType)) { m_effectParameterPresets.append(EffectParameterPreset(pParameter, false)); } From 22d649a318d02e3c40c0231ae7662adf3d3ae250 Mon Sep 17 00:00:00 2001 From: Be Date: Sat, 4 Apr 2020 23:58:42 -0500 Subject: [PATCH 092/443] EffectSlot: explicitly track hidden parameters This is easier to think about. --- src/effects/effectslot.cpp | 27 ++++++++++++++++++++------- src/effects/effectslot.h | 16 +++------------- 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/src/effects/effectslot.cpp b/src/effects/effectslot.cpp index 7af84041b180..07ba8835811a 100644 --- a/src/effects/effectslot.cpp +++ b/src/effects/effectslot.cpp @@ -156,7 +156,7 @@ void EffectSlot::updateEngineState() { pRequest->SetEffectParameters.enabled = m_pControlEnabled->get(); m_pEffectsManager->writeRequest(pRequest); - for (const auto& parameterList : m_parameters) { + for (const auto& parameterList : m_allParameters) { for (auto const& pParameter : parameterList) { pParameter->updateEngineState(); } @@ -208,7 +208,7 @@ void EffectSlot::addEffectParameterSlot(EffectParameterType parameterType) { } unsigned int EffectSlot::numParameters(EffectParameterType parameterType) const { - return m_parameters.value(parameterType).size(); + return m_allParameters.value(parameterType).size(); } void EffectSlot::setEnabled(bool enabled) { @@ -263,7 +263,7 @@ void EffectSlot::loadEffect(const EffectManifestPointer pManifest, } EffectParameterPointer pParameter(new EffectParameter( m_pEngineEffect, m_pEffectsManager, pManifestParameter, parameterPreset)); - m_parameters[pManifestParameter->parameterType()].append(pParameter); + m_allParameters[pManifestParameter->parameterType()].append(pParameter); } // Map the parameter slots to the EffectParameters. @@ -281,7 +281,7 @@ void EffectSlot::loadEffect(const EffectManifestPointer pManifest, continue; } - for (const auto& pParameter : m_parameters.value(parameterType)) { + for (const auto& pParameter : m_allParameters.value(parameterType)) { if (pParameter->manifest()->id() == parameterPreset.id()) { m_loadedParameters[parameterType].insert(slot, pParameter); break; @@ -332,12 +332,15 @@ void EffectSlot::unloadEffect() { pSlot->clear(); } } - for (auto& parameterList : m_parameters) { + for (auto& parameterList : m_allParameters) { parameterList.clear(); } for (auto& parameterList : m_loadedParameters) { parameterList.clear(); } + for (auto& parameterList : m_hiddenParameters) { + parameterList.clear(); + } m_pManifest.clear(); @@ -371,12 +374,22 @@ void EffectSlot::loadParameters() { for (; slot < m_parameterSlots.value(parameterType).size(); slot++) { m_parameterSlots.value(parameterType).at(slot)->clear(); } + + m_hiddenParameters[parameterType].clear(); + for (auto pParameter : m_allParameters.value(parameterType)) { + if (!m_loadedParameters.value(parameterType).contains(pParameter)) { + m_hiddenParameters[parameterType].append(pParameter); + } + } } } void EffectSlot::hideParameter(EffectParameterPointer pParameter) { auto parameterType = pParameter->manifest()->parameterType(); - VERIFY_OR_DEBUG_ASSERT(m_parameters.value(parameterType).contains(pParameter)) { + VERIFY_OR_DEBUG_ASSERT(m_allParameters.value(parameterType).contains(pParameter)) { + return; + } + VERIFY_OR_DEBUG_ASSERT(!m_hiddenParameters.value(parameterType).contains(pParameter)) { return; } m_loadedParameters[parameterType].removeAll(pParameter); @@ -385,7 +398,7 @@ void EffectSlot::hideParameter(EffectParameterPointer pParameter) { void EffectSlot::showParameter(EffectParameterPointer pParameter) { auto parameterType = pParameter->manifest()->parameterType(); - VERIFY_OR_DEBUG_ASSERT(m_parameters.value(parameterType).contains(pParameter)) { + VERIFY_OR_DEBUG_ASSERT(m_allParameters.value(parameterType).contains(pParameter)) { return; } VERIFY_OR_DEBUG_ASSERT(!m_loadedParameters.value(parameterType).contains(pParameter)) { diff --git a/src/effects/effectslot.h b/src/effects/effectslot.h index d4c787863db5..52d4e10012a0 100644 --- a/src/effects/effectslot.h +++ b/src/effects/effectslot.h @@ -95,18 +95,7 @@ class EffectSlot : public QObject { } const ParameterMap getHiddenParameters() const { - ParameterMap hiddenParameters; - int numTypes = static_cast(EffectParameterType::NUM_TYPES); - for (int parameterTypeId = 0; parameterTypeId < numTypes; ++parameterTypeId) { - const EffectParameterType parameterType = - static_cast(parameterTypeId); - for (const auto& pParameter : m_parameters.value(parameterType)) { - if (!m_loadedParameters.value(parameterType).contains(pParameter)) { - hiddenParameters[parameterType].append(pParameter); - } - } - } - return hiddenParameters; + return m_hiddenParameters; } void hideParameter(EffectParameterPointer pParameter); @@ -170,8 +159,9 @@ class EffectSlot : public QObject { EffectManifestPointer m_pManifest; EngineEffectChain* m_pEngineEffectChain; EngineEffect* m_pEngineEffect; - ParameterMap m_parameters; + ParameterMap m_allParameters; ParameterMap m_loadedParameters; + ParameterMap m_hiddenParameters; QMap> m_parameterSlots; ControlObject* m_pControlLoaded; From 626b770c166eb6b691f4bd69e3637eab90af8c4f Mon Sep 17 00:00:00 2001 From: Be Date: Sun, 5 Apr 2020 18:50:37 -0500 Subject: [PATCH 093/443] DlgPrefEffects: add QListWidget to set order of chain presets This order will soon be used by new ControlObjects to load them from controllers. --- src/effects/effectsmanager.cpp | 64 +++++++++++++++------ src/effects/effectsmanager.h | 4 ++ src/effects/presets/effectxmlelements.h | 3 + src/preferences/dialog/dlgprefeffects.cpp | 16 ++++++ src/preferences/dialog/dlgprefeffectsdlg.ui | 14 +++++ 5 files changed, 84 insertions(+), 17 deletions(-) diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index 8c13e174c6ad..3d253410bd89 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -55,7 +55,7 @@ EffectsManager::EffectsManager(QObject* pParent, EffectsManager::~EffectsManager() { m_underDestruction = true; - saveStandardEffectChains(); + saveEffectsXml(); for (const auto pEffectPreset : m_defaultPresets) { saveDefaultForEffect(pEffectPreset); } @@ -473,7 +473,7 @@ void EffectsManager::setup() { loadDefaultEffectPresets(); loadEffectChainPresets(); - reloadStandardEffectChains(); + readEffectsXml(); } bool EffectsManager::writeRequest(EffectsRequest* request) { @@ -659,11 +659,29 @@ void EffectsManager::loadEffectChainPresets() { EffectChainPresetPointer pEffectChainPreset(new EffectChainPreset(doc.documentElement())); if (!pEffectChainPreset->isNull()) { m_effectChainPresets.insert(pEffectChainPreset->name(), pEffectChainPreset); + m_effectChainPresetsSorted.append(pEffectChainPreset); } file.close(); } } +void EffectsManager::setChainPresetOrder(const QStringList& chainPresetList) { + m_effectChainPresetsSorted.clear(); + + for (const auto chainPresetName : chainPresetList) { + VERIFY_OR_DEBUG_ASSERT(m_effectChainPresets.contains(chainPresetName)) { + continue; + } + m_effectChainPresetsSorted.append(m_effectChainPresets.value(chainPresetName)); + } + + for (const auto pChainPreset : m_effectChainPresets) { + VERIFY_OR_DEBUG_ASSERT(m_effectChainPresetsSorted.contains(pChainPreset)) { + m_effectChainPresetsSorted.append(pChainPreset); + } + } +} + void EffectsManager::savePresetFromStandardEffectChain(int chainNumber) { StandardEffectChainSlotPointer pStandardChainSlot = m_standardEffectChainSlots.at(chainNumber); EffectChainSlot* genericChainSlot = static_cast(pStandardChainSlot.get()); @@ -702,21 +720,10 @@ void EffectsManager::savePresetFromStandardEffectChain(int chainNumber) { } const QList EffectsManager::getAvailableChainPresets() const { - // Sort available chain presets by name alphabetically - QStringList nameList; - for (const auto pChainPreset : m_effectChainPresets) { - nameList.append(pChainPreset->name()); - } - nameList.sort(); - - QList presetList; - for (const auto& name : nameList) { - presetList.append(m_effectChainPresets.value(name)); - } - return presetList; + return m_effectChainPresetsSorted; } -void EffectsManager::reloadStandardEffectChains() { +void EffectsManager::readEffectsXml() { QDir settingsPath(m_pConfig->getSettingsPath()); QFile file(settingsPath.absoluteFilePath("effects.xml")); QDomDocument doc; @@ -729,6 +736,7 @@ void EffectsManager::reloadStandardEffectChains() { } file.close(); + // Reload state of standard chains QDomElement root = doc.documentElement(); QDomElement rackElement = XmlParse::selectElement(root, EffectXml::Rack); QDomElement chainsElement = XmlParse::selectElement(rackElement, EffectXml::ChainsRoot); @@ -743,12 +751,25 @@ void EffectsManager::reloadStandardEffectChains() { loadEffectChainPreset(m_standardEffectChainSlots.value(i), pPreset); } } + + // Reload order of custom chain presets + QStringList chainPresetsSorted; + QDomElement chainPresetsElement = XmlParse::selectElement(root, EffectXml::ChainPresetList); + QDomNodeList presetNameList = chainPresetsElement.elementsByTagName(EffectXml::ChainPresetName); + for (int i = 0; i < presetNameList.count(); ++i) { + QDomNode presetNameNode = presetNameList.at(i); + if (presetNameNode.isElement()) { + chainPresetsSorted << presetNameNode.toElement().text(); + } + } + setChainPresetOrder(chainPresetsSorted); } -void EffectsManager::saveStandardEffectChains() { +void EffectsManager::saveEffectsXml() { QDomDocument doc("MixxxEffects"); doc.setContent(QString("\n")); + // Save presets for current state of standard chains QDomElement rootElement = doc.createElement("MixxxEffects"); rootElement.setAttribute("schemaVersion", QString::number(EffectXml::kXmlSchemaVersion)); doc.appendChild(rootElement); @@ -756,12 +777,21 @@ void EffectsManager::saveStandardEffectChains() { rootElement.appendChild(rackElement); QDomElement chainsElement = doc.createElement(EffectXml::ChainsRoot); rackElement.appendChild(chainsElement); - for (const auto pChainSlot : m_standardEffectChainSlots) { EffectChainSlot* genericChainSlot = static_cast(pChainSlot.get()); chainsElement.appendChild(EffectChainPreset(genericChainSlot).toXml(&doc)); } + // Save order of custom chain presets + QDomElement chainPresetListElement = doc.createElement(EffectXml::ChainPresetList); + for (const auto pChainPreset : m_effectChainPresetsSorted) { + XmlParse::addElement(doc, + chainPresetListElement, + EffectXml::ChainPresetName, + pChainPreset->name()); + } + doc.appendChild(chainPresetListElement); + QDir settingsPath(m_pConfig->getSettingsPath()); if (!settingsPath.exists()) { return; diff --git a/src/effects/effectsmanager.h b/src/effects/effectsmanager.h index 8b32b508235c..8ef7f8128bc7 100644 --- a/src/effects/effectsmanager.h +++ b/src/effects/effectsmanager.h @@ -123,6 +123,9 @@ class EffectsManager : public QObject { void loadEffectChainPreset(EffectChainSlotPointer pChainSlot, EffectChainPresetPointer pPreset); void loadPresetToStandardChain(int chainNumber, EffectChainPresetPointer pPreset); + + void setChainPresetOrder(const QStringList& chainPresetList); + void addStandardEffectChainSlots(); EffectChainSlotPointer getStandardEffectChainSlot(int unitNumber) const; @@ -221,6 +224,7 @@ class EffectsManager : public QObject { QHash m_quickEffectChainSlots; QHash m_effectChainPresets; + QList m_effectChainPresetsSorted; QHash m_defaultPresets; DISALLOW_COPY_AND_ASSIGN(EffectsManager); diff --git a/src/effects/presets/effectxmlelements.h b/src/effects/presets/effectxmlelements.h index 64ff29447dd2..5f8e95a4d3ef 100644 --- a/src/effects/presets/effectxmlelements.h +++ b/src/effects/presets/effectxmlelements.h @@ -9,6 +9,9 @@ const QString SchemaVersion("SchemaVersion"); const QString Rack("Rack"); const QString RackGroup("Group"); +const QString ChainPresetList("ChainPresetList"); +const QString ChainPresetName("ChainPresetName"); + const QString ChainsRoot("Chains"); const QString Chain("EffectChain"); const QString ChainSuperParameter("SuperParameterValue"); diff --git a/src/preferences/dialog/dlgprefeffects.cpp b/src/preferences/dialog/dlgprefeffects.cpp index 881aab3964ff..27bd7127a4ee 100644 --- a/src/preferences/dialog/dlgprefeffects.cpp +++ b/src/preferences/dialog/dlgprefeffects.cpp @@ -39,6 +39,11 @@ DlgPrefEffects::DlgPrefEffects(QWidget* pParent, availableEffectsList->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents); availableEffectsList->setColumnWidth(1, 200); availableEffectsList->horizontalHeader()->setSectionResizeMode(2, QHeaderView::ResizeToContents); + + chainListWidget->setDragEnabled(true); + chainListWidget->viewport()->setAcceptDrops(true); + chainListWidget->setDropIndicatorShown(true); + chainListWidget->setDragDropMode(QAbstractItemView::InternalMove); } DlgPrefEffects::~DlgPrefEffects() { @@ -51,6 +56,11 @@ void DlgPrefEffects::slotUpdate() { if (!m_availableEffectsModel.isEmpty()) { availableEffectsList->selectRow(0); } + + chainListWidget->clear(); + for (const auto& pChainPreset : m_pEffectsManager->getAvailableChainPresets()) { + chainListWidget->addItem(pChainPreset->name()); + } } void DlgPrefEffects::slotApply() { @@ -64,6 +74,12 @@ void DlgPrefEffects::slotApply() { m_pConfig->set(ConfigKey("[Visible " + pManifest->backendName() + " Effects]", pManifest->id()), ConfigValue(profile->bIsVisible)); } + + QStringList chainList; + for (int i = 0; i < chainListWidget->count(); ++i) { + chainList << chainListWidget->item(i)->text(); + } + m_pEffectsManager->setChainPresetOrder(chainList); } void DlgPrefEffects::slotResetToDefaults() { diff --git a/src/preferences/dialog/dlgprefeffectsdlg.ui b/src/preferences/dialog/dlgprefeffectsdlg.ui index 4719789a2afb..ed9f68b22804 100644 --- a/src/preferences/dialog/dlgprefeffectsdlg.ui +++ b/src/preferences/dialog/dlgprefeffectsdlg.ui @@ -271,6 +271,20 @@ + + + + + + Effect Chain Presets + + + + + + + + From 665320e2e2910e2c80d5957c033a03c73f063e15 Mon Sep 17 00:00:00 2001 From: Be Date: Sun, 5 Apr 2020 23:47:26 -0500 Subject: [PATCH 094/443] DlgPrefEffects: add effect chain preset management also rename isNull methods on Effect(Chain)Preset because it is too easy to get confused with QSharedPointer::isNull --- src/effects/effectsmanager.cpp | 164 ++++++++++++++- src/effects/effectsmanager.h | 15 +- src/effects/presets/effectchainpreset.h | 4 +- src/effects/presets/effectpreset.h | 4 +- src/preferences/dialog/dlgprefeffects.cpp | 113 +++++++++- src/preferences/dialog/dlgprefeffects.h | 10 + src/preferences/dialog/dlgprefeffectsdlg.ui | 219 ++++++++++++++------ 7 files changed, 453 insertions(+), 76 deletions(-) diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index 3d253410bd89..ca8a3d024767 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -1,6 +1,7 @@ #include "effects/effectsmanager.h" #include +#include #include #include #include @@ -230,7 +231,7 @@ void EffectsManager::loadEffectChainPreset(EffectChainSlotPointer pChainSlot, int effectSlot = 0; for (const auto& pEffectPreset : pPreset->effectPresets()) { - if (pEffectPreset->isNull()) { + if (pEffectPreset->isEmpty()) { effectSlot++; continue; } @@ -255,6 +256,141 @@ void EffectsManager::loadPresetToStandardChain(int chainNumber, EffectChainPrese loadEffectChainPreset(m_standardEffectChainSlots.at(chainNumber), pPreset); } +void EffectsManager::importChainPreset() { + QStringList fileNames = QFileDialog::getOpenFileNames(nullptr, + tr("Import effect chain preset"), + QString(), + tr("Mixxx Effect Chain Presets") + " (*.xml)"); + + QString importFailed = tr("Error importing effect chain preset"); + for (int i = 0; i < fileNames.size(); ++i) { + QString filePath = fileNames.at(i); + QDomDocument doc; + QFile file(filePath); + if (!file.open(QIODevice::ReadOnly)) { + QMessageBox::critical(nullptr, importFailed, importFailed + " " + filePath); + continue; + } else if (!doc.setContent(&file)) { + file.close(); + QMessageBox::critical(nullptr, importFailed, importFailed + " " + filePath); + continue; + } + file.close(); + + EffectChainPresetPointer pChainPreset(new EffectChainPreset(doc.documentElement())); + if (!pChainPreset->isEmpty()) { + if (m_effectChainPresets.contains(pChainPreset->name())) { + bool okay = false; + QString newName = QInputDialog::getText(nullptr, + tr("Rename effect chain preset"), + tr("An effect chain preset with the name") + " " + pChainPreset->name() + " " + tr("already exists. Choose a new name for the imported effect chain preset:"), + QLineEdit::Normal, + QString(), + &okay); + if (!okay) { + continue; + } + pChainPreset->setName(newName); + } + + // An imported chain preset might contain an LV2 plugin that the user does not + // have installed. + for (const auto pEffectPreset : pChainPreset->effectPresets()) { + if (pEffectPreset == nullptr || pEffectPreset->isEmpty()) { + continue; + } + + bool effectSupported = false; + for (EffectManifestPointer pManifest : m_availableEffectManifests) { + if (pManifest->id() == pEffectPreset->id() && + pManifest->backendType() == pEffectPreset->backendType()) { + effectSupported = true; + break; + } + } + if (!effectSupported) { + QMessageBox::critical(nullptr, importFailed, tr("The effect chain imported from") + " " + filePath + " " + tr("contains an effect that Mixxx does not support") + ":\n\n" + pEffectPreset->id() + "\n\n" + tr("If you load this chain preset, the unsupported effect will not be loaded with it.")); + } + } + + m_effectChainPresets.insert(pChainPreset->name(), pChainPreset); + m_effectChainPresetsSorted.append(pChainPreset); + } else { + QMessageBox::critical(nullptr, importFailed, importFailed + " " + filePath); + } + } +} + +void EffectsManager::exportChainPreset(const QString& chainPresetName) { + VERIFY_OR_DEBUG_ASSERT(m_effectChainPresets.contains(chainPresetName)) { + return; + } + + EffectChainPresetPointer pChainPreset = m_effectChainPresets.value(chainPresetName); + VERIFY_OR_DEBUG_ASSERT(!pChainPreset->isEmpty()) { + return; + } + + QString fileName = QFileDialog::getSaveFileName(nullptr, + tr("Save effect chain preset"), + QString(), + tr("Mixxx Effect Chain Presets") + " (*.xml)"); + + QFile file(fileName); + if (!file.open(QIODevice::Truncate | QIODevice::WriteOnly)) { + file.close(); + QMessageBox::critical(nullptr, + tr("Error exporting effect chain preset"), + tr("Could not save effect chain preset") + " " + chainPresetName + tr("to file") + " " + fileName); + return; + } + + QDomDocument doc(EffectXml::Chain); + doc.setContent(QString("\n")); + doc.appendChild(pChainPreset->toXml(&doc)); + file.write(doc.toString().toUtf8()); + file.close(); +} + +void EffectsManager::renameChainPreset(const QString& oldName) { + VERIFY_OR_DEBUG_ASSERT(m_effectChainPresets.contains(oldName)) { + return; + } + + bool okay = false; + QString newName = QInputDialog::getText(nullptr, + tr("Rename effect chain preset"), + tr("New name effect chain preset") + " " + oldName, + QLineEdit::Normal, + oldName, + &okay); + if (!okay) { + return; + } + + EffectChainPresetPointer pChainPreset = m_effectChainPresets.take(oldName); + int index = m_effectChainPresetsSorted.indexOf(pChainPreset); + pChainPreset->setName(newName); + m_effectChainPresets.insert(newName, pChainPreset); + m_effectChainPresetsSorted.removeAt(index); + m_effectChainPresetsSorted.insert(index, pChainPreset); +} + +void EffectsManager::deleteChainPreset(const QString& chainPresetName) { + VERIFY_OR_DEBUG_ASSERT(m_effectChainPresets.contains(chainPresetName)) { + return; + } + auto pressedButton = QMessageBox::question(nullptr, + tr("Remove effect chain preset"), + tr("Are you sure you want to delete the effect chain preset") + " " + chainPresetName + "?"); + if (pressedButton != QMessageBox::Yes) { + return; + } + + EffectChainPresetPointer pChainPreset = m_effectChainPresets.take(chainPresetName); + m_effectChainPresetsSorted.removeAll(pChainPreset); +} + const QList EffectsManager::getAvailableEffectManifestsFiltered( EffectManifestFilterFnc filter) const { if (filter == nullptr) { @@ -572,7 +708,7 @@ void EffectsManager::loadDefaultEffectPresets() { continue; } EffectPresetPointer pEffectPreset(new EffectPreset(doc.documentElement())); - if (!pEffectPreset->isNull()) { + if (!pEffectPreset->isEmpty()) { EffectManifestPointer pManifest = getManifest(pEffectPreset->id(), pEffectPreset->backendType()); m_defaultPresets.insert(pManifest, pEffectPreset); } @@ -591,7 +727,7 @@ void EffectsManager::loadDefaultEffectPresets() { } void EffectsManager::saveDefaultForEffect(EffectPresetPointer pEffectPreset) { - VERIFY_OR_DEBUG_ASSERT(!pEffectPreset.isNull()) { + VERIFY_OR_DEBUG_ASSERT(!pEffectPreset->isEmpty()) { return; } @@ -657,7 +793,7 @@ void EffectsManager::loadEffectChainPresets() { continue; } EffectChainPresetPointer pEffectChainPreset(new EffectChainPreset(doc.documentElement())); - if (!pEffectChainPreset->isNull()) { + if (!pEffectChainPreset->isEmpty()) { m_effectChainPresets.insert(pEffectChainPreset->name(), pEffectChainPreset); m_effectChainPresetsSorted.append(pEffectChainPreset); } @@ -682,6 +818,25 @@ void EffectsManager::setChainPresetOrder(const QStringList& chainPresetList) { } } +const QString EffectsManager::getDisplayNameForEffectPreset(EffectPresetPointer pPreset) { + QString displayName(tr("None")); + if (pPreset == nullptr || pPreset->isEmpty()) { + return displayName; + } + + bool manifestFound = false; + for (const auto pManifest : m_availableEffectManifests) { + if (pManifest->id() == pPreset->id() && + pManifest->backendType() == pPreset->backendType()) { + displayName = pManifest->name(); + manifestFound = true; + break; + } + } + DEBUG_ASSERT(manifestFound); + return displayName; +} + void EffectsManager::savePresetFromStandardEffectChain(int chainNumber) { StandardEffectChainSlotPointer pStandardChainSlot = m_standardEffectChainSlots.at(chainNumber); EffectChainSlot* genericChainSlot = static_cast(pStandardChainSlot.get()); @@ -700,6 +855,7 @@ void EffectsManager::savePresetFromStandardEffectChain(int chainNumber) { pChainPreset->setName(name); m_effectChainPresets.insert(name, pChainPreset); + m_effectChainPresetsSorted.append(pChainPreset); QString path(m_pConfig->getSettingsPath() + "/effects/chains"); QDir effectsChainsDir(path); diff --git a/src/effects/effectsmanager.h b/src/effects/effectsmanager.h index 8ef7f8128bc7..f43752d677e2 100644 --- a/src/effects/effectsmanager.h +++ b/src/effects/effectsmanager.h @@ -124,8 +124,19 @@ class EffectsManager : public QObject { EffectChainPresetPointer pPreset); void loadPresetToStandardChain(int chainNumber, EffectChainPresetPointer pPreset); + EffectChainPresetPointer getEffectChainPreset(const QString& name) { + return m_effectChainPresets.value(name); + } + + void importChainPreset(); + void exportChainPreset(const QString& chainPresetName); + void renameChainPreset(const QString& oldName); + void deleteChainPreset(const QString& chainPresetName); + void setChainPresetOrder(const QStringList& chainPresetList); + const QString getDisplayNameForEffectPreset(EffectPresetPointer pPreset); + void addStandardEffectChainSlots(); EffectChainSlotPointer getStandardEffectChainSlot(int unitNumber) const; @@ -188,8 +199,8 @@ class EffectsManager : public QObject { void loadDefaultEffectPresets(); void loadEffectChainPresets(); - void reloadStandardEffectChains(); - void saveStandardEffectChains(); + void readEffectsXml(); + void saveEffectsXml(); void processEffectsResponses(); void collectGarbage(const EffectsRequest* pResponse); diff --git a/src/effects/presets/effectchainpreset.h b/src/effects/presets/effectchainpreset.h index 15f6cff492ae..4193ff33bf66 100644 --- a/src/effects/presets/effectchainpreset.h +++ b/src/effects/presets/effectchainpreset.h @@ -19,8 +19,8 @@ class EffectChainPreset { const QDomElement toXml(QDomDocument* doc) const; - bool isNull() const { - return m_name.isEmpty(); + bool isEmpty() const { + return m_effectPresets.size() == 0; } // This is the only exception to EffectChainPreset being read-only. diff --git a/src/effects/presets/effectpreset.h b/src/effects/presets/effectpreset.h index 983a6e750ad8..bb95b0eaddff 100644 --- a/src/effects/presets/effectpreset.h +++ b/src/effects/presets/effectpreset.h @@ -23,8 +23,8 @@ class EffectPreset { return m_id; } - bool isNull() const { - return m_id.isEmpty(); + bool isEmpty() const { + return m_effectParameterPresets.size() == 0; } EffectBackendType backendType() const { diff --git a/src/preferences/dialog/dlgprefeffects.cpp b/src/preferences/dialog/dlgprefeffects.cpp index 27bd7127a4ee..8be8b7acb09c 100644 --- a/src/preferences/dialog/dlgprefeffects.cpp +++ b/src/preferences/dialog/dlgprefeffects.cpp @@ -44,6 +44,19 @@ DlgPrefEffects::DlgPrefEffects(QWidget* pParent, chainListWidget->viewport()->setAcceptDrops(true); chainListWidget->setDropIndicatorShown(true); chainListWidget->setDragDropMode(QAbstractItemView::InternalMove); + + connect(chainListWidget, &QListWidget::currentTextChanged, this, &DlgPrefEffects::slotChainPresetSelected); + + connect(chainPresetImportButton, &QPushButton::clicked, this, &DlgPrefEffects::slotImportPreset); + connect(chainPresetExportButton, &QPushButton::clicked, this, &DlgPrefEffects::slotExportPreset); + connect(chainPresetRenameButton, &QPushButton::clicked, this, &DlgPrefEffects::slotRenamePreset); + connect(chainPresetDeleteButton, &QPushButton::clicked, this, &DlgPrefEffects::slotDeletePreset); + connect(chainPresetMoveUpButton, &QPushButton::clicked, this, &DlgPrefEffects::slotPresetMoveUp); + connect(chainPresetMoveDownButton, &QPushButton::clicked, this, &DlgPrefEffects::slotPresetMoveDown); + + m_effectsLabels.append(effect1Name); + m_effectsLabels.append(effect2Name); + m_effectsLabels.append(effect3Name); } DlgPrefEffects::~DlgPrefEffects() { @@ -53,14 +66,21 @@ void DlgPrefEffects::slotUpdate() { clear(); m_availableEffectsModel.resetFromEffectManager(m_pEffectsManager); - if (!m_availableEffectsModel.isEmpty()) { - availableEffectsList->selectRow(0); + // No chain preset is selected when the preferences are opened + for (int i = 0; i < m_effectsLabels.size(); ++i) { + m_effectsLabels[i]->setText(QString::number(i + 1) + ": "); } - chainListWidget->clear(); - for (const auto& pChainPreset : m_pEffectsManager->getAvailableChainPresets()) { - chainListWidget->addItem(pChainPreset->name()); + chainPresetExportButton->setEnabled(false); + chainPresetRenameButton->setEnabled(false); + chainPresetDeleteButton->setEnabled(false); + chainPresetMoveUpButton->setEnabled(false); + chainPresetMoveDownButton->setEnabled(false); + + if (!m_availableEffectsModel.isEmpty()) { + availableEffectsList->selectRow(0); } + loadChainPresetList(); } void DlgPrefEffects::slotApply() { @@ -94,6 +114,13 @@ void DlgPrefEffects::clear() { effectType->clear(); } +void DlgPrefEffects::loadChainPresetList() { + chainListWidget->clear(); + for (const auto& pChainPreset : m_pEffectsManager->getAvailableChainPresets()) { + chainListWidget->addItem(pChainPreset->name()); + } +} + void DlgPrefEffects::availableEffectsListItemSelected(const QModelIndex& selected) { QString effectId = m_availableEffectsModel.data(selected, Qt::UserRole).toString(); @@ -108,3 +135,79 @@ void DlgPrefEffects::availableEffectsListItemSelected(const QModelIndex& selecte effectVersion->setText(pManifest->version()); effectType->setText(pManifest->translatedBackendName()); } + +void DlgPrefEffects::slotChainPresetSelected(const QString& chainPresetName) { + EffectChainPresetPointer pChainPreset = m_pEffectsManager->getEffectChainPreset(chainPresetName); + if (pChainPreset == nullptr || pChainPreset->isEmpty()) { + return; + } + + for (int i = 0; i < pChainPreset->effectPresets().size() - 1; ++i) { + EffectPresetPointer pEffectPreset = pChainPreset->effectPresets().at(i); + if (!pEffectPreset->isEmpty()) { + QString displayName = m_pEffectsManager->getDisplayNameForEffectPreset(pEffectPreset); + // Code uses 0-indexed numbers; users see 1 indexed numbers + m_effectsLabels[i]->setText(QString::number(i + 1) + ": " + displayName); + } else { + m_effectsLabels[i]->setText(QString::number(i + 1) + ": " + tr("None")); + } + } + + chainPresetExportButton->setEnabled(true); + chainPresetRenameButton->setEnabled(true); + chainPresetDeleteButton->setEnabled(true); + if (chainListWidget->currentRow() > 0) { + chainPresetMoveUpButton->setEnabled(true); + } else { + chainPresetMoveUpButton->setEnabled(false); + } + if (chainListWidget->currentRow() < chainListWidget->count() - 1) { + chainPresetMoveDownButton->setEnabled(true); + } else { + chainPresetMoveDownButton->setEnabled(false); + } +} + +void DlgPrefEffects::slotImportPreset() { + m_pEffectsManager->importChainPreset(); + loadChainPresetList(); +} + +void DlgPrefEffects::slotExportPreset() { + const QString& selectedPresetName = chainListWidget->currentItem()->text(); + m_pEffectsManager->exportChainPreset(selectedPresetName); +} + +void DlgPrefEffects::slotRenamePreset() { + const QString& selectedPresetName = chainListWidget->currentItem()->text(); + m_pEffectsManager->renameChainPreset(selectedPresetName); + loadChainPresetList(); +} + +void DlgPrefEffects::slotDeletePreset() { + const QString& selectedPresetName = chainListWidget->currentItem()->text(); + m_pEffectsManager->deleteChainPreset(selectedPresetName); + loadChainPresetList(); +} + +void DlgPrefEffects::slotPresetMoveUp() { + QListWidgetItem* item = chainListWidget->currentItem(); + int oldRow = chainListWidget->currentRow(); + if (oldRow == 0) { + return; + } + chainListWidget->takeItem(oldRow); + chainListWidget->insertItem(oldRow - 1, item); + chainListWidget->setCurrentRow(oldRow - 1); +} + +void DlgPrefEffects::slotPresetMoveDown() { + QListWidgetItem* item = chainListWidget->currentItem(); + int oldRow = chainListWidget->currentRow(); + if (oldRow == chainListWidget->count()) { + return; + } + chainListWidget->takeItem(oldRow); + chainListWidget->insertItem(oldRow + 1, item); + chainListWidget->setCurrentRow(oldRow + 1); +} diff --git a/src/preferences/dialog/dlgprefeffects.h b/src/preferences/dialog/dlgprefeffects.h index 5665c5f5a007..5e656d2fa28c 100644 --- a/src/preferences/dialog/dlgprefeffects.h +++ b/src/preferences/dialog/dlgprefeffects.h @@ -22,9 +22,19 @@ class DlgPrefEffects : public DlgPreferencePage, public Ui::DlgPrefEffectsDlg { private slots: void availableEffectsListItemSelected(const QModelIndex& selected); + void slotChainPresetSelected(const QString& chainPresetName); + void slotImportPreset(); + void slotExportPreset(); + void slotRenamePreset(); + void slotDeletePreset(); + void slotPresetMoveUp(); + void slotPresetMoveDown(); private: void clear(); + void loadChainPresetList(); + + QList m_effectsLabels; EffectSettingsModel m_availableEffectsModel; UserSettingsPointer m_pConfig; diff --git a/src/preferences/dialog/dlgprefeffectsdlg.ui b/src/preferences/dialog/dlgprefeffectsdlg.ui index ed9f68b22804..ab28d40a6b94 100644 --- a/src/preferences/dialog/dlgprefeffectsdlg.ui +++ b/src/preferences/dialog/dlgprefeffectsdlg.ui @@ -91,51 +91,51 @@ Effect Info - - + + - + 0 0 - (effect description) + Description: - - true + + Qt::AlignRight|Qt::AlignTop|Qt::AlignTrailing - - + + - + 0 0 - (effect name) + Author: - - true + + Qt::AlignRight|Qt::AlignTop|Qt::AlignTrailing - - + + - + 0 0 - Version: + (effect description) - - Qt::AlignRight|Qt::AlignTop|Qt::AlignTrailing + + true @@ -155,40 +155,40 @@ - - + + - + 0 0 - (effect author) + Type: - - true + + Qt::AlignRight|Qt::AlignTop|Qt::AlignTrailing - - + + - + 0 0 - Description: + (effect name) - - Qt::AlignRight|Qt::AlignTop|Qt::AlignTrailing + + true - - + + 0 @@ -196,26 +196,13 @@ - Author: + Version: Qt::AlignRight|Qt::AlignTop|Qt::AlignTrailing - - - - Qt::Vertical - - - - 20 - 40 - - - - @@ -232,19 +219,19 @@ - - + + - + 0 0 - Type: + (effect author) - - Qt::AlignRight|Qt::AlignTop|Qt::AlignTrailing + + true @@ -264,6 +251,19 @@ + + + + Qt::Vertical + + + + 20 + 40 + + + + @@ -272,19 +272,116 @@ - + + + Effect Chain Presets + + + + + - - - Effect Chain Presets - - + + + + + + + + Effects in this chain preset: + + + + + + + effect 1 name + + + + + + + effect 2 name + + + + + + + effect 3 name + + + + + + + + + false + + + Move Up + + + + + + + Import + + + + + + + false + + + Rename + + + + + + + + + + + false + + + Move Down + + + + + + + false + + + Export + + + + + + + false + + + Delete + + + + + + - - - From 093ce6edd543dd64e2f7963bc4268da79b76da2b Mon Sep 17 00:00:00 2001 From: Be Date: Mon, 6 Apr 2020 00:31:32 -0500 Subject: [PATCH 095/443] EffectsManager: fix incorrect debug assertion --- src/effects/effectsmanager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index ca8a3d024767..bbb3701efce9 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -727,7 +727,7 @@ void EffectsManager::loadDefaultEffectPresets() { } void EffectsManager::saveDefaultForEffect(EffectPresetPointer pEffectPreset) { - VERIFY_OR_DEBUG_ASSERT(!pEffectPreset->isEmpty()) { + if (pEffectPreset->isEmpty()) { return; } From 9a78a9bb4085757267b017068da3eb3a077b90ec Mon Sep 17 00:00:00 2001 From: Be Date: Mon, 6 Apr 2020 10:31:59 -0500 Subject: [PATCH 096/443] EffectsManager: fix loading of chain presets with empty effects --- src/effects/effectsmanager.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index bbb3701efce9..ddf71fe0a6f5 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -232,6 +232,12 @@ void EffectsManager::loadEffectChainPreset(EffectChainSlotPointer pChainSlot, int effectSlot = 0; for (const auto& pEffectPreset : pPreset->effectPresets()) { if (pEffectPreset->isEmpty()) { + pChainSlot->loadEffect( + effectSlot, + nullptr, + nullptr, + nullptr, + true); effectSlot++; continue; } From 4b6cb8a01280a5ae733d5826a02e45b8a59b942b Mon Sep 17 00:00:00 2001 From: Be Date: Wed, 15 Apr 2020 18:01:06 -0500 Subject: [PATCH 097/443] effects system: use /// for Doxygen-accessible documentation --- src/effects/backends/effectmanifest.h | 40 +++---- .../backends/effectmanifestparameter.h | 53 +++++---- src/effects/backends/effectprocessor.h | 102 +++++++++--------- src/effects/backends/effectsbackend.h | 30 +++--- src/effects/effectbuttonparameterslot.h | 2 +- src/effects/effectchainslot.h | 50 ++++----- src/effects/effectknobparameterslot.h | 2 +- src/effects/effectparameter.h | 24 ++--- src/effects/effectparameterslotbase.h | 12 +-- src/effects/effectslot.h | 48 ++++----- src/effects/effectsmanager.h | 50 ++++----- src/effects/presets/effectchainpreset.h | 10 +- src/effects/presets/effectparameterpreset.h | 10 +- src/effects/presets/effectpreset.h | 8 +- 14 files changed, 220 insertions(+), 221 deletions(-) diff --git a/src/effects/backends/effectmanifest.h b/src/effects/backends/effectmanifest.h index e2caa61f5c00..f9ab511875bf 100644 --- a/src/effects/backends/effectmanifest.h +++ b/src/effects/backends/effectmanifest.h @@ -8,19 +8,19 @@ #include "effects/backends/effectmanifestparameter.h" #include "effects/defs.h" -// An EffectManifest is a description of the metadata associated with an effect -// (ID, display name, author, description) and all the parameters of the effect. -// The pair of the ID string and EffectBackendType uniquely identifies an -// effect. EffectManifests are used by EffectBackends to create EffectProcessors -// which implement the DSP logic of the effect. The name string of effect -// parameters in the manifest is used to link EngineEffectParameters -// with member variables used in the DSP logic of the EffectProcessorImpl. - -// EffectManifest is composed purely of simple data types, and when an -// EffectManifest is const, it should be completely immutable. EffectManifest is -// meant to be used in most cases as a reference, and in Qt collections, so it -// is important that the implicit copy and assign constructors work, and that -// the no-argument constructor be non-explicit. +/// An EffectManifest is a description of the metadata associated with an effect +/// (ID, display name, author, description) and all the parameters of the effect. +/// The pair of the ID string and EffectBackendType uniquely identifies an +/// effect. EffectManifests are used by EffectBackends to create EffectProcessors +/// which implement the DSP logic of the effect. The name string of effect +/// parameters in the manifest is used to link EngineEffectParameters +/// with member variables used in the DSP logic of the EffectProcessorImpl. +/// +/// EffectManifest is composed purely of simple data types, and when an +/// EffectManifest is const, it should be completely immutable. EffectManifest is +/// meant to be used in most cases as a reference, and in Qt collections, so it +/// is important that the implicit copy and assign constructors work, and that +/// the no-argument constructor be non-explicit. class EffectManifest { public: EffectManifest() @@ -32,15 +32,15 @@ class EffectManifest { m_metaknobDefault(0.5) { } - // Hack to store unique IDs in QComboBox models + /// Hack to store unique IDs in QComboBox models const QString uniqueId() const { return m_id + " " + backendName(); } - // WARNING! Effects must not be identified solely by ID string or name. - // ID strings and names are only unique among EffectManifests from one - // EffectsBackend. Use EffectManifest::operator== to compare both ID string - // and EffectBackendType. + /// WARNING! Effects must not be identified solely by ID string or name. + /// ID strings and names are only unique among EffectManifests from one + /// EffectsBackend. Use EffectManifest::operator== to compare both ID string + /// and EffectBackendType. const QString& id() const { return m_id; } @@ -163,7 +163,7 @@ class EffectManifest { } } - // Use this when showing the string in the GUI + /// Use this when showing the string in the GUI QString translatedBackendName() const { switch (m_backendType) { case EffectBackendType::BuiltIn: @@ -208,7 +208,7 @@ class EffectManifest { QString m_author; QString m_version; QString m_description; - // This helps us at DlgPrefEQ's basic selection of Equalizers + /// This helps us at DlgPrefEQ's basic selection of Equalizers bool m_isMixingEQ; bool m_isMasterEQ; QList m_parameters; diff --git a/src/effects/backends/effectmanifestparameter.h b/src/effects/backends/effectmanifestparameter.h index 042ac66c8ced..31a0e741771c 100644 --- a/src/effects/backends/effectmanifestparameter.h +++ b/src/effects/backends/effectmanifestparameter.h @@ -26,10 +26,10 @@ class EffectManifestParameter { LINEAR_INVERSE, LOGARITHMIC, LOGARITHMIC_INVERSE, - INTEGRAL, // A step rotary, steps given by m_steps - // are arranged with equal distance on scale - TOGGLE // For button and enum controls, not accessible - // from many controllers, no linking to meta knob + INTEGRAL, /// A step rotary, steps given by m_steps + /// are arranged with equal distance on scale + TOGGLE /// For button and enum controls, not accessible + /// from many controllers, no linking to meta knob }; enum class SemanticHint { @@ -42,16 +42,16 @@ class EffectManifestParameter { UNKNOWN = 0, TIME, HERTZ, - SAMPLERATE, // fraction of the samplerate - BEATS, // multiples of a beat + SAMPLERATE, /// fraction of the samplerate + BEATS, /// multiples of a beat }; enum class LinkType { - NONE = 0, // Not controlled by the meta knob - LINKED, // Controlled by the meta knob as it is - LINKED_LEFT, // Controlled by the left side of the meta knob - LINKED_RIGHT, // Controlled by the right side of the meta knob - LINKED_LEFT_RIGHT, // Controlled by both sides of the meta knob + NONE = 0, /// Not controlled by the meta knob + LINKED, /// Controlled by the meta knob as it is + LINKED_LEFT, /// Controlled by the left side of the meta knob + LINKED_RIGHT, /// Controlled by the right side of the meta knob + LINKED_LEFT_RIGHT, /// Controlled by both sides of the meta knob NUM_LINK_TYPES }; @@ -196,15 +196,14 @@ class EffectManifestParameter { m_defaultLinkInversion = linkInversion; } - - // Neutral Point On Scale is the parameter in the range 0 .. 1 on the knob that - // is adopted as neutral when controlled by the meta knob. - // This is allows to link the meta knob in a way that two effects are - // cranked in simultaneous, or in case of a split filter like meta knob, - // both effects are neutral at meta knob center. - // A EQ Gain has usually a neutral point of 0.5 (0 dB) while a delay knob - // has a neutral point of 0.0 (no delay) - // A EQ Gain knob cannot be used on a split meta knob. + /// Neutral Point On Scale is the parameter in the range 0 .. 1 on the knob that + /// is adopted as neutral when controlled by the meta knob. + /// This is allows to link the meta knob in a way that two effects are + /// cranked in simultaneous, or in case of a split filter like meta knob, + /// both effects are neutral at meta knob center. + /// A EQ Gain has usually a neutral point of 0.5 (0 dB) while a delay knob + /// has a neutral point of 0.0 (no delay) + /// A EQ Gain knob cannot be used on a split meta knob. double neutralPointOnScale() const { return m_neutralPointOnScale; } @@ -240,8 +239,8 @@ class EffectManifestParameter { return m_maximum; } - // Minimum, default, and maximum are set together in one function so their - // validity only needs to be checked once. + /// Minimum, default, and maximum are set together in one function so their + /// validity only needs to be checked once. void setRange(const double& minimum, const double& defaultValue, const double& maximum) { VERIFY_OR_DEBUG_ASSERT(minimum <= defaultValue && defaultValue <= maximum) { qWarning() << "EffectManifestParameter" << m_name @@ -286,11 +285,11 @@ class EffectManifestParameter { double m_minimum; double m_maximum; - // Used to describe steps of - // CONTROL_INTEGRAL and CONTROL_TOGGLE - // effect parameters - // Each pair has the following form: - // name - value + /// Used to describe steps of + /// CONTROL_INTEGRAL and CONTROL_TOGGLE + /// effect parameters + /// Each pair has the following form: + /// name - value QList > m_steps; bool m_showInParametertSlot; diff --git a/src/effects/backends/effectprocessor.h b/src/effects/backends/effectprocessor.h index 60c7465ffd42..9f3d9e0d6cd7 100644 --- a/src/effects/backends/effectprocessor.h +++ b/src/effects/backends/effectprocessor.h @@ -12,27 +12,27 @@ #include "engine/effects/message.h" #include "engine/channelhandle.h" -// Effects are implemented as two separate classes, an EffectState subclass and -// an EffectProcessorImpl subclass. Separating state from the DSP code allows -// memory allocation and deletion, which is slow, to be done on the main thread -// instead of potentially blocking the audio engine callback thread and causing -// audible glitches. EffectStates allocated on the main thread are passed as -// pointers to the EffectProcessorImpl in the audio callback thread via the -// effect MessagePipe FIFO (see EngineEffectsManager::onCallbackStart). - -// Each EffectState instance is responsible for one routing of input signal to -// output signal. The base EffectProcessorImpl class handles the management -// of EffectStates. EffectProcessorImpl subclasses only need to be concerned -// with implementing the signal processing logic and providing metadata for -// describing the effect and its parameters. - -// Input signals can be any EngineChannel, but output channels are hardcoded in -// EngineMaster as the post-fader processing for the master mix and pre-fader -// processing for headphones. EffectStates are allocated when an input signal is -// enabled for a chain. Also, when a new effect is loaded to a chain, -// EffectStates are only allocated for input signals that are enabled at that -// time. This allows for scaling up to an arbitrary number of input signals -// without wasting a lot of memory. +/// Effects are implemented as two separate classes, an EffectState subclass and +/// an EffectProcessorImpl subclass. Separating state from the DSP code allows +/// memory allocation and deletion, which is slow, to be done on the main thread +/// instead of potentially blocking the audio engine callback thread and causing +/// audible glitches. EffectStates allocated on the main thread are passed as +/// pointers to the EffectProcessorImpl in the audio callback thread via the +/// effect MessagePipe FIFO (see EngineEffectsManager::onCallbackStart). +/// +/// Each EffectState instance is responsible for one routing of input signal to +/// output signal. The base EffectProcessorImpl class handles the management +/// of EffectStates. EffectProcessorImpl subclasses only need to be concerned +/// with implementing the signal processing logic and providing metadata for +/// describing the effect and its parameters. +/// +/// Input signals can be any EngineChannel, but output channels are hardcoded in +/// EngineMaster as the post-fader processing for the master mix and pre-fader +/// processing for headphones. EffectStates are allocated when an input signal is +/// enabled for a chain. Also, when a new effect is loaded to a chain, +/// EffectStates are only allocated for input signals that are enabled at that +/// time. This allows for scaling up to an arbitrary number of input signals +/// without wasting a lot of memory. class EffectState { public: EffectState(const mixxx::EngineParameters& bufferParameters) { @@ -42,14 +42,14 @@ class EffectState { virtual ~EffectState() {}; }; -// EffectProcessor is an abstract base class for interfacing with the main -// thread without needing to specify a specific EffectState subclass for the -// template in EffectProcessorImpl. +/// EffectProcessor is an abstract base class for interfacing with the main +/// thread without needing to specify a specific EffectState subclass for the +/// template in EffectProcessorImpl. class EffectProcessor { public: virtual ~EffectProcessor() { } - // Called from main thread to avoid allocating memory in the audio callback thread + /// Called from main thread to avoid allocating memory in the audio callback thread virtual void initialize( const QSet& activeInputChannels, const QSet& registeredOutputChannels, @@ -57,23 +57,23 @@ class EffectProcessor { virtual EffectState* createState(const mixxx::EngineParameters& bufferParameters) = 0; virtual bool loadStatesForInputChannel(const ChannelHandle* inputChannel, const EffectStatesMap* pStatesMap) = 0; - // Called from main thread for garbage collection after the last audio thread - // callback executes process() with EffectEnableState::Disabling + /// Called from main thread for garbage collection after the last audio thread + /// callback executes process() with EffectEnableState::Disabling virtual void deleteStatesForInputChannel(const ChannelHandle* inputChannel) = 0; virtual void loadEngineEffectParameters( const QMap& parameters) = 0; - // Take a buffer of audio samples as pInput, process the buffer according to - // Effect-specific logic, and output it to the buffer pOutput. Both pInput - // and pOutput are represented as stereo interleaved samples for now, but - // effects should not be written assuming this will remain true. The properties - // of the buffer necessary for determining how to process it (frames per - // buffer, number of channels, and sample rate) are available on the - // mixxx::EngineParameters argument. The provided channel handles allow - // EffectProcessorImpl::process to fetch the appropriate EffectState and - // pass it on to EffectProcessorImpl::processChannel, allowing one - // EffectProcessor instance to process multiple signals simultaneously. + /// Take a buffer of audio samples as pInput, process the buffer according to + /// Effect-specific logic, and output it to the buffer pOutput. Both pInput + /// and pOutput are represented as stereo interleaved samples for now, but + /// effects should not be written assuming this will remain true. The properties + /// of the buffer necessary for determining how to process it (frames per + /// buffer, number of channels, and sample rate) are available on the + /// mixxx::EngineParameters argument. The provided channel handles allow + /// EffectProcessorImpl::process to fetch the appropriate EffectState and + /// pass it on to EffectProcessorImpl::processChannel, allowing one + /// EffectProcessor instance to process multiple signals simultaneously. virtual void process(const ChannelHandle& inputHandle, const ChannelHandle& outputHandle, const CSAMPLE* pInput, CSAMPLE* pOutput, @@ -82,17 +82,17 @@ class EffectProcessor { const GroupFeatureState& groupFeatures) = 0; }; -// EffectProcessorImpl manages a separate EffectState for every routing of -// input channel to output channel. This allows for processing effects in -// parallel for PFL and post-fader for the master output. -// EffectSpecificState must be a subclass of EffectState. +/// EffectProcessorImpl manages a separate EffectState for every routing of +/// input channel to output channel. This allows for processing effects in +/// parallel for PFL and post-fader for the master output. +/// EffectSpecificState must be a subclass of EffectState. template class EffectProcessorImpl : public EffectProcessor { public: EffectProcessorImpl() { } - // Subclasses should not implement their own destructor. All state should - // be stored in the EffectState subclass, not the EffectProcessorImpl subclass. + /// Subclasses should not implement their own destructor. All state should + /// be stored in the EffectState subclass, not the EffectProcessorImpl subclass. ~EffectProcessorImpl() { if (kEffectDebugOutput) { qDebug() << "~EffectProcessorImpl" << this; @@ -118,12 +118,12 @@ class EffectProcessorImpl : public EffectProcessor { m_channelStateMatrix.clear(); }; - // NOTE: Subclasses must implement the following static methods for - // EffectInstantiator to work: - // static QString getId(); - // static EffectManifest getManifest(); + /// NOTE: Subclasses must implement the following static methods for + /// EffectInstantiator to work: + /// static QString getId(); + /// static EffectManifest getManifest(); - // This is the only non-static method that subclasses need to implement. + /// This is the only non-static method that subclasses need to implement. virtual void processChannel(EffectSpecificState* channelState, const CSAMPLE* pInput, CSAMPLE* pOutput, const mixxx::EngineParameters& bufferParameters, @@ -230,7 +230,7 @@ class EffectProcessorImpl : public EffectProcessor { return true; }; - // Called from main thread for garbage collection after an input channel is disabled + /// Called from main thread for garbage collection after an input channel is disabled void deleteStatesForInputChannel(const ChannelHandle* inputChannel) final { if (kEffectDebugOutput) { qDebug() << "EffectProcessorImpl::deleteStatesForInputChannel" @@ -259,8 +259,8 @@ class EffectProcessorImpl : public EffectProcessor { }; protected: - // Subclasses for external effects plugins may reimplement this, but - // subclasses for built-in effects should not. + /// Subclasses for external effects plugins may reimplement this, but + /// subclasses for built-in effects should not. virtual EffectSpecificState* createSpecificState( const mixxx::EngineParameters& bufferParameters) { EffectSpecificState* pState = new EffectSpecificState(bufferParameters); diff --git a/src/effects/backends/effectsbackend.h b/src/effects/backends/effectsbackend.h index c66ad26e80fd..ea925952403e 100644 --- a/src/effects/backends/effectsbackend.h +++ b/src/effects/backends/effectsbackend.h @@ -9,27 +9,27 @@ class EffectProcessor; -// EffectsBackend is an abstract base class that enumerates available effects -// which are identified by EffectManifests. EffectsBackend creates -// EffectProcessors when provided with an EffectManifest from EffectsManager -// indicating which specific EffectProcessor type to create. - -// The EffectProcessors implement the DSP logic specific to each effect. -// EffectManager sends the EffectProcessors down to the EffectChainSlot, which -// sends it down to the EffectSlot. The EffectSlot uses the EffectProcessor to -// create an EngineEffect and add/remove the EngineEffect from the engine. - -// Currently the implemented EffectsBackend subclasses are for the effects -// built into Mixxx and LV2 plugins. Other plugin types such as VSTs could be -// added in the future by creating new subclasses of EffectsBackend, -// EffectManifest, EffectState, and EffectProcessorImpl. +/// EffectsBackend is an abstract base class that enumerates available effects +/// which are identified by EffectManifests. EffectsBackend creates +/// EffectProcessors when provided with an EffectManifest from EffectsManager +/// indicating which specific EffectProcessor type to create. +/// +/// The EffectProcessors implement the DSP logic specific to each effect. +/// EffectManager sends the EffectProcessors down to the EffectChainSlot, which +/// sends it down to the EffectSlot. The EffectSlot uses the EffectProcessor to +/// create an EngineEffect and add/remove the EngineEffect from the engine. +/// +/// Currently the implemented EffectsBackend subclasses are for the effects +/// built into Mixxx and LV2 plugins. Other plugin types such as VSTs could be +/// added in the future by creating new subclasses of EffectsBackend, +/// EffectManifest, EffectState, and EffectProcessorImpl. class EffectsBackend { public: virtual ~EffectsBackend() {}; virtual EffectBackendType getType() const = 0; - // returns a list sorted like it should be displayed in the GUI + /// returns a list sorted like it should be displayed in the GUI virtual const QList getEffectIds() const = 0; virtual EffectManifestPointer getManifest(const QString& effectId) const = 0; virtual const QList getManifests() const = 0; diff --git a/src/effects/effectbuttonparameterslot.h b/src/effects/effectbuttonparameterslot.h index 522c1ac78e01..b8c8d3931618 100644 --- a/src/effects/effectbuttonparameterslot.h +++ b/src/effects/effectbuttonparameterslot.h @@ -11,7 +11,7 @@ class ControlObject; class ControlPushButton; -// Refer to EffectParameterSlotBase for documentation +/// Refer to EffectParameterSlotBase for documentation class EffectButtonParameterSlot : public EffectParameterSlotBase { Q_OBJECT public: diff --git a/src/effects/effectchainslot.h b/src/effects/effectchainslot.h index b1b6d8903e32..86d7bc5bf612 100644 --- a/src/effects/effectchainslot.h +++ b/src/effects/effectchainslot.h @@ -20,31 +20,31 @@ class EffectsManager; class EffectProcessor; class EngineEffectChain; -// EffectChainSlot is the main thread representation of an effect chain which -// adds/removes exactly one EngineEffectChain from the engine. Unlike EffectSlot, -// EffectChainSlot does not add/remove EngineEffectChains apart from Mixxx -// startup and shutdown. The lifetime of EngineEffectChain is coupled with -// EffectChainSlot. Do not change this relationship; there is no use case for -// that. - -// EffectChainSlot owns the ControlObjects for the routing switches that assign -// chains to process audio inputs (decks, microphones, auxiliary inputs, -// master mix). EffectChainSlot also owns the ControlObject for the superknob -// which manipulates the metaknob of each effect in the chain. - -// The state of an EffectChainSlot can be saved to and loaded from an -// EffectChainPreset, which can serialize/deserialize that state to/from XML. -// Loading state from an EffectChainPreset is done by -// EffectsManager::loadEffectChainPreset rather than directly by EffectChainSlot -// because loading effects requires access to the EffectsBackends and default -// EffectPresets which are maintained by EffectsManager. - -// Currently EffectChainSlot has a fixed number of EffectSlots. In the future -// this may be extended to create an Effect class to decouple an EngineEffect's -// state from the ControlObjects so that EffectChainSlot could arbitrarily hide -// and rearrange Effects by loading/unloading them from EffectSlots. This would -// be similar to the relationship between EffectSlot and -// EffectParameterSlotBase/EffectParameter. +/// EffectChainSlot is the main thread representation of an effect chain which +/// adds/removes exactly one EngineEffectChain from the engine. Unlike EffectSlot, +/// EffectChainSlot does not add/remove EngineEffectChains apart from Mixxx +/// startup and shutdown. The lifetime of EngineEffectChain is coupled with +/// EffectChainSlot. Do not change this relationship; there is no use case for +/// that. +/// +/// EffectChainSlot owns the ControlObjects for the routing switches that assign +/// chains to process audio inputs (decks, microphones, auxiliary inputs, +/// master mix). EffectChainSlot also owns the ControlObject for the superknob +/// which manipulates the metaknob of each effect in the chain. +/// +/// The state of an EffectChainSlot can be saved to and loaded from an +/// EffectChainPreset, which can serialize/deserialize that state to/from XML. +/// Loading state from an EffectChainPreset is done by +/// EffectsManager::loadEffectChainPreset rather than directly by EffectChainSlot +/// because loading effects requires access to the EffectsBackends and default +/// EffectPresets which are maintained by EffectsManager. +/// +/// Currently EffectChainSlot has a fixed number of EffectSlots. In the future +/// this may be extended to create an Effect class to decouple an EngineEffect's +/// state from the ControlObjects so that EffectChainSlot could arbitrarily hide +/// and rearrange Effects by loading/unloading them from EffectSlots. This would +/// be similar to the relationship between EffectSlot and +/// EffectParameterSlotBase/EffectParameter. class EffectChainSlot : public QObject { Q_OBJECT public: diff --git a/src/effects/effectknobparameterslot.h b/src/effects/effectknobparameterslot.h index 1399c081597f..aae91773c462 100644 --- a/src/effects/effectknobparameterslot.h +++ b/src/effects/effectknobparameterslot.h @@ -14,7 +14,7 @@ class ControlEffectKnob; class SoftTakeover; class EffectSlot; -// Refer to EffectParameterSlotBase for documentation +/// Refer to EffectParameterSlotBase for documentation class EffectKnobParameterSlot : public EffectParameterSlotBase { Q_OBJECT public: diff --git a/src/effects/effectparameter.h b/src/effects/effectparameter.h index d5b9884e6a89..3763e92079dc 100644 --- a/src/effects/effectparameter.h +++ b/src/effects/effectparameter.h @@ -12,18 +12,18 @@ class EffectsManager; class EngineEffect; class EffectParameterPreset; -// An EffectParameter is a main thread representation of the state of an -// EngineEffectParameter. EffectParameter tracks a mutable value state and -// communicates that state to the engine. Separating this from the parameterX -// ControlObjects in EffectParameterSlotBase allows for decoupling the state of -// the parameters from the ControlObject states, which is required for -// EffectSlot to do parameter hiding and rearrangement. EffectParameter is -// responsible for manipulating the value of knob parameters when the metaknob -// of the EffectSlot is changed (button parameters cannot be linked to the -// metaknob). For EffectParameter, there is no difference between knobs and -// buttons; only EffectSlot and -// EffectKnobParameterSlot/EffectButtonParameterSlot are responsible for taking -// care of that difference. +/// An EffectParameter is a main thread representation of the state of an +/// EngineEffectParameter. EffectParameter tracks a mutable value state and +/// communicates that state to the engine. Separating this from the parameterX +/// ControlObjects in EffectParameterSlotBase allows for decoupling the state of +/// the parameters from the ControlObject states, which is required for +/// EffectSlot to do parameter hiding and rearrangement. EffectParameter is +/// responsible for manipulating the value of knob parameters when the metaknob +/// of the EffectSlot is changed (button parameters cannot be linked to the +/// metaknob). For EffectParameter, there is no difference between knobs and +/// buttons; only EffectSlot and +/// EffectKnobParameterSlot/EffectButtonParameterSlot are responsible for taking +/// care of that difference. class EffectParameter { public: EffectParameter(EngineEffect* pEngineEffect, diff --git a/src/effects/effectparameterslotbase.h b/src/effects/effectparameterslotbase.h index 979df1387789..1bdfa2b889ea 100644 --- a/src/effects/effectparameterslotbase.h +++ b/src/effects/effectparameterslotbase.h @@ -13,12 +13,12 @@ class ControlPushButton; class EffectParameter; class EffectSlot; -// EffectParameterSlotBase is a wrapper around the parameterX ControlObject. -// EffectSlot loads/unloads an EffectParameter from the EffectParameterSlotBase. -// The EffectParameter is responsible for communicating changes in the parameter -// value to the EngineEffectParameter. The separation of EffectParameter and -// EffectParameterSlotBase allows EffectSlot to arbitrarily hide and rearrange -// parameters. +/// EffectParameterSlotBase is a wrapper around the parameterX ControlObject. +/// EffectSlot loads/unloads an EffectParameter from the EffectParameterSlotBase. +/// The EffectParameter is responsible for communicating changes in the parameter +/// value to the EngineEffectParameter. The separation of EffectParameter and +/// EffectParameterSlotBase allows EffectSlot to arbitrarily hide and rearrange +/// parameters. class EffectParameterSlotBase : public QObject { Q_OBJECT public: diff --git a/src/effects/effectslot.h b/src/effects/effectslot.h index 52d4e10012a0..4e322ec2d75b 100644 --- a/src/effects/effectslot.h +++ b/src/effects/effectslot.h @@ -31,27 +31,27 @@ class EffectKnobParameterSlot; typedef QMap> ParameterMap; -// EffectSlot is a main thread class which creates EngineEffects and sends -// updates to them in response to changes in ControlObjects. It owns the -// ControlObjects for enabling/disabling the effect and the effect metaknob. - -// EffectSlot owns a list of EffectParameterSlotBases and EffectParameters. -// The EffectParameters are the main thread representation of the state of an -// EngineEffectParameter. EffectSlot creates and destroys EffectParameters -// together with the EngineEffect as it loads/unloads EngineEffects. The -// EffectParameterSlotBases own the ControlObjects for manipulating the -// EffectParameters and showing them in skins. The EffectParameterSlotBases are -// permanent for the lifetime the EffectSlot; they are not created or destroyed -// when loading/unloading effects. - -// The separation of EffectParameters from EffectParameterSlotBases decouples -// the parameters available from manipulation via ControlObjects from the -// parameters of EngineEffects. This allows EffectSlot to arbitrarily hide and -// rearrange EffectParameters by loading/unloading them from the -// EffectParameterSlotBases without changing the audio processing in the engine. - -// The state of an EffectSlot is loaded from an EffectPreset and a snapshot -// of EffectSlot's state can be serialized into a EffectPreset. +/// EffectSlot is a main thread class which creates EngineEffects and sends +/// updates to them in response to changes in ControlObjects. It owns the +/// ControlObjects for enabling/disabling the effect and the effect metaknob. +/// +/// EffectSlot owns a list of EffectParameterSlotBases and EffectParameters. +/// The EffectParameters are the main thread representation of the state of an +/// EngineEffectParameter. EffectSlot creates and destroys EffectParameters +/// together with the EngineEffect as it loads/unloads EngineEffects. The +/// EffectParameterSlotBases own the ControlObjects for manipulating the +/// EffectParameters and showing them in skins. The EffectParameterSlotBases are +/// permanent for the lifetime the EffectSlot; they are not created or destroyed +/// when loading/unloading effects. +/// +/// The separation of EffectParameters from EffectParameterSlotBases decouples +/// the parameters available from manipulation via ControlObjects from the +/// parameters of EngineEffects. This allows EffectSlot to arbitrarily hide and +/// rearrange EffectParameters by loading/unloading them from the +/// EffectParameterSlotBases without changing the audio processing in the engine. +/// +/// The state of an EffectSlot is loaded from an EffectPreset and a snapshot +/// of EffectSlot's state can be serialized into a EffectPreset. class EffectSlot : public QObject { Q_OBJECT public: @@ -61,7 +61,7 @@ class EffectSlot : public QObject { EngineEffectChain* pEngineEffectChain); virtual ~EffectSlot(); - // Call with nullptr for pManifest and pProcessor to unload an effect + /// Call with nullptr for pManifest and pProcessor to unload an effect void loadEffect(const EffectManifestPointer pManifest, std::unique_ptr pProcessor, EffectPresetPointer pPreset, @@ -107,8 +107,8 @@ class EffectSlot : public QObject { double getMetaParameter() const; - // Ensures that Softtakover is bypassed for the following - // ChainParameterChange. Uses for testing only + /// Ensures that Softtakover is bypassed for the following + /// ChainParameterChange. Uses for testing only void syncSofttakeover(); const QString& getGroup() const { diff --git a/src/effects/effectsmanager.h b/src/effects/effectsmanager.h index f43752d677e2..a9b70f9de31c 100644 --- a/src/effects/effectsmanager.h +++ b/src/effects/effectsmanager.h @@ -24,26 +24,26 @@ class EffectManifest; typedef QMap> ParameterMap; -// EffectsManager is the interface between the parts of the effects system in -// the main thread and the rest of Mixxx. It creates/destroys a fixed -// set of EffectChainSlots on Mixxx startup/shutdown. EffectManager uses -// EffectBackends and EffectManifests to create EffectProcessors. The -// EffectProcessors are sent down to the EffectChainSlots, then down to the -// EffectSlots which use the EffectProcessors to create EngineEffects and add -// them to the audio engine. - -// EffectsManager saves/loads EffectChainPresets and EffectPresets. -// EffectsManager maintains a list of custom EffectChainPresets in the -// "effects/chains" folder in the user settings folder. The state of loaded -// effects are saved as EffectChainPresets in the effects.xml file in the user -// settings folder, which is used to restore the state of effects on startup. -// Additionally, EffectsManager saves/loads EffectPresets in the -// "effects/defaults" folder in the user settings folder to allow users to -// specify default states when each effect is loaded. - -// To maintain clear separation of responsibilities, GUI classes should NOT -// access the EffectChainSlots or EffectSlots directly. They should interface -// with them indirectly through EffectsManager. +/// EffectsManager is the interface between the parts of the effects system in +/// the main thread and the rest of Mixxx. It creates/destroys a fixed +/// set of EffectChainSlots on Mixxx startup/shutdown. EffectManager uses +/// EffectBackends and EffectManifests to create EffectProcessors. The +/// EffectProcessors are sent down to the EffectChainSlots, then down to the +/// EffectSlots which use the EffectProcessors to create EngineEffects and add +/// them to the audio engine. +/// +/// EffectsManager saves/loads EffectChainPresets and EffectPresets. +/// EffectsManager maintains a list of custom EffectChainPresets in the +/// "effects/chains" folder in the user settings folder. The state of loaded +/// effects are saved as EffectChainPresets in the effects.xml file in the user +/// settings folder, which is used to restore the state of effects on startup. +/// Additionally, EffectsManager saves/loads EffectPresets in the +/// "effects/defaults" folder in the user settings folder to allow users to +/// specify default states when each effect is loaded. +/// +/// To maintain clear separation of responsibilities, GUI classes should NOT +/// access the EffectChainSlots or EffectSlots directly. They should interface +/// with them indirectly through EffectsManager. class EffectsManager : public QObject { Q_OBJECT public: @@ -61,9 +61,9 @@ class EffectsManager : public QObject { return m_pChannelHandleFactory->getOrCreateHandle("[Master]"); } - // Add an effect backend to be managed by EffectsManager. EffectsManager - // takes ownership of the backend, and will delete it when EffectsManager is - // being deleted. Not thread safe -- use only from the GUI thread. + /// Add an effect backend to be managed by EffectsManager. EffectsManager + /// takes ownership of the backend, and will delete it when EffectsManager is + /// being deleted. Not thread safe -- use only from the GUI thread. void addEffectsBackend(EffectsBackendPointer pEffectsBackend); // To support cycling through effect chains, there is a global ordering of @@ -184,8 +184,8 @@ class EffectsManager : public QObject { void setup(); - // Write an EffectsRequest to the EngineEffectsManager. EffectsManager takes - // ownership of request and deletes it once a response is received. + /// Write an EffectsRequest to the EngineEffectsManager. EffectsManager takes + /// ownership of request and deletes it once a response is received. bool writeRequest(EffectsRequest* request); signals: diff --git a/src/effects/presets/effectchainpreset.h b/src/effects/presets/effectchainpreset.h index 4193ff33bf66..e2019bdb1c8c 100644 --- a/src/effects/presets/effectchainpreset.h +++ b/src/effects/presets/effectchainpreset.h @@ -6,10 +6,10 @@ class EffectChainSlot; -// EffectChainPreset is a read-only snapshot of the state of an effect chain -// that can be serialized to/deserialized from XML. It is used by EffectsManager -// to easily save/load user-defined chain presets as well as save the state of -// loaded effects when Mixxx shuts down and restarts. +/// EffectChainPreset is a read-only snapshot of the state of an effect chain +/// that can be serialized to/deserialized from XML. It is used by EffectsManager +/// to easily save/load user-defined chain presets as well as save the state of +/// loaded effects when Mixxx shuts down and restarts. class EffectChainPreset { public: EffectChainPreset(); @@ -23,7 +23,7 @@ class EffectChainPreset { return m_effectPresets.size() == 0; } - // This is the only exception to EffectChainPreset being read-only. + /// This is the only exception to EffectChainPreset being read-only. void setName(const QString& newName) { m_name = newName; } diff --git a/src/effects/presets/effectparameterpreset.h b/src/effects/presets/effectparameterpreset.h index 30af16bac532..39641cfab3ee 100644 --- a/src/effects/presets/effectparameterpreset.h +++ b/src/effects/presets/effectparameterpreset.h @@ -5,16 +5,16 @@ #include "effects/defs.h" #include "effects/backends/effectmanifestparameter.h" -// EffectParameterPreset is a read-only snapshot of the state of an effect -// parameter that can be serialized to/deserialized from XML. It is only used -// as a component of an EffectPreset; never on its own. +/// EffectParameterPreset is a read-only snapshot of the state of an effect +/// parameter that can be serialized to/deserialized from XML. It is only used +/// as a component of an EffectPreset; never on its own. class EffectParameterPreset { public: EffectParameterPreset(); EffectParameterPreset(const QDomElement& parameterElement); - // The hidden state is stored in the EffectSlot, not the EffectParameter + /// The hidden state is stored in the EffectSlot, not the EffectParameter EffectParameterPreset(const EffectParameterPointer pParameter, bool hidden); - // read defaults from manifest + /// read defaults from manifest EffectParameterPreset(const EffectManifestParameterPointer pManifestParameter); ~EffectParameterPreset(); diff --git a/src/effects/presets/effectpreset.h b/src/effects/presets/effectpreset.h index bb95b0eaddff..212d905aeb74 100644 --- a/src/effects/presets/effectpreset.h +++ b/src/effects/presets/effectpreset.h @@ -5,10 +5,10 @@ #include "effects/backends/effectmanifest.h" #include "effects/presets/effectparameterpreset.h" -// EffectPreset is a read-only snapshot of the state of an effect that can be -// serialized to/deserialized from XML. It is used by EffectChainPreset to -// save/load chain presets. It is also used by EffectsManager to save custom -// defaults for each effect. +/// EffectPreset is a read-only snapshot of the state of an effect that can be +/// serialized to/deserialized from XML. It is used by EffectChainPreset to +/// save/load chain presets. It is also used by EffectsManager to save custom +/// defaults for each effect. class EffectPreset { public: EffectPreset(); From 0dbf1fe0d1b9a427256f05d184772507e90a36ae Mon Sep 17 00:00:00 2001 From: Be Date: Sat, 25 Apr 2020 14:03:07 -0500 Subject: [PATCH 098/443] EffectChainSlot: add load_preset ControlObject --- src/effects/effectchainslot.cpp | 12 ++++++++++++ src/effects/effectchainslot.h | 3 +++ src/effects/effectsmanager.cpp | 26 ++++++++++++++++++++++---- src/effects/effectsmanager.h | 7 ++++++- 4 files changed, 43 insertions(+), 5 deletions(-) diff --git a/src/effects/effectchainslot.cpp b/src/effects/effectchainslot.cpp index 691537e1977b..f7d8b895f981 100644 --- a/src/effects/effectchainslot.cpp +++ b/src/effects/effectchainslot.cpp @@ -76,6 +76,12 @@ EffectChainSlot::EffectChainSlot(const QString& group, connect(m_pControlChainMixMode, &ControlObject::valueChanged, this, &EffectChainSlot::sendParameterUpdate); + m_pControlLoadPreset = new ControlObject(ConfigKey(m_group, "load_preset"), false); + connect(m_pControlLoadPreset, + &ControlObject::valueChanged, + this, + &EffectChainSlot::slotControlLoadChainPreset); + m_pControlChainNextPreset = new ControlPushButton(ConfigKey(m_group, "next_chain")); connect(m_pControlChainNextPreset, &ControlObject::valueChanged, this, &EffectChainSlot::slotControlChainNextPreset); @@ -128,6 +134,7 @@ EffectChainSlot::~EffectChainSlot() { delete m_pControlChainMix; delete m_pControlChainSuperParameter; delete m_pControlChainMixMode; + delete m_pControlLoadPreset; delete m_pControlChainPrevPreset; delete m_pControlChainNextPreset; delete m_pControlChainSelector; @@ -310,6 +317,11 @@ void EffectChainSlot::slotControlChainSelector(double v) { // } } +void EffectChainSlot::slotControlLoadChainPreset(double value) { + // subtract 1 to make the ControlObject 1-indexed like other ControlObjects + emit loadChainPreset(this, value - 1); +} + void EffectChainSlot::slotControlChainNextPreset(double v) { // qDebug() << debugString() << "slotControlChainNextPreset" << v; if (v > 0) { diff --git a/src/effects/effectchainslot.h b/src/effects/effectchainslot.h index 07268b188482..f824089238c8 100644 --- a/src/effects/effectchainslot.h +++ b/src/effects/effectchainslot.h @@ -131,6 +131,7 @@ class EffectChainSlot : public QObject { // Signal that whoever is in charge of this EffectChainSlot should clear // this EffectChain (by removing the chain from this EffectChainSlot). void clearChain(unsigned int iChainNumber, EffectChainSlotPointer pEffectChain); + void loadChainPreset(EffectChainSlot* pChainSlot, int listIndex); // Signal that indicates that the EffectChainSlot has been updated. void updated(); @@ -156,6 +157,7 @@ class EffectChainSlot : public QObject { void slotControlChainSelector(double v); void slotControlChainNextPreset(double v); void slotControlChainPrevPreset(double v); + void slotControlLoadChainPreset(double value); void slotChannelStatusChanged(const QString& group); private: @@ -174,6 +176,7 @@ class EffectChainSlot : public QObject { ControlObject* m_pControlChainLoaded; ControlPushButton* m_pControlChainEnabled; ControlPushButton* m_pControlChainMixMode; + ControlObject* m_pControlLoadPreset; ControlEncoder* m_pControlChainSelector; ControlPushButton* m_pControlChainNextPreset; ControlPushButton* m_pControlChainPrevPreset; diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index ddf71fe0a6f5..a3e57a3080c5 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -217,7 +217,7 @@ void EffectsManager::showParameter(int chainNumber, int effectNumber, EffectPara // This needs to be in EffectsManager rather than EffectChainSlot because it // needs access to the EffectsBackends. -void EffectsManager::loadEffectChainPreset(EffectChainSlotPointer pChainSlot, +void EffectsManager::loadEffectChainPreset(EffectChainSlot* pChainSlot, EffectChainPresetPointer pPreset) { VERIFY_OR_DEBUG_ASSERT(pChainSlot) { return; @@ -259,7 +259,7 @@ void EffectsManager::loadEffectChainPreset(EffectChainSlotPointer pChainSlot, } void EffectsManager::loadPresetToStandardChain(int chainNumber, EffectChainPresetPointer pPreset) { - loadEffectChainPreset(m_standardEffectChainSlots.at(chainNumber), pPreset); + loadEffectChainPreset(m_standardEffectChainSlots.at(chainNumber).get(), pPreset); } void EffectsManager::importChainPreset() { @@ -502,6 +502,7 @@ void EffectsManager::addStandardEffectChainSlots() { auto pChainSlot = StandardEffectChainSlotPointer( new StandardEffectChainSlot(i, this)); + connectChainSlotSignals(pChainSlot); m_standardEffectChainSlots.append(pChainSlot); m_effectChainSlotsByGroup.insert(pChainSlot->group(), pChainSlot); @@ -510,6 +511,7 @@ void EffectsManager::addStandardEffectChainSlots() { void EffectsManager::addOutputEffectChainSlot() { m_outputEffectChainSlot = OutputEffectChainSlotPointer(new OutputEffectChainSlot(this)); + connectChainSlotSignals(m_outputEffectChainSlot); m_effectChainSlotsByGroup.insert(m_outputEffectChainSlot->group(), m_outputEffectChainSlot); } @@ -532,8 +534,9 @@ void EffectsManager::addEqualizerEffectChainSlot(const QString& deckGroupName) { auto pChainSlot = EqualizerEffectChainSlotPointer( new EqualizerEffectChainSlot(deckGroupName, this)); - m_equalizerEffectChainSlots.insert(deckGroupName, pChainSlot); + connectChainSlotSignals(pChainSlot); + m_equalizerEffectChainSlots.insert(deckGroupName, pChainSlot); m_effectChainSlotsByGroup.insert(pChainSlot->group(), pChainSlot); } @@ -545,11 +548,26 @@ void EffectsManager::addQuickEffectChainSlot(const QString& deckGroupName) { auto pChainSlot = QuickEffectChainSlotPointer( new QuickEffectChainSlot(deckGroupName, this)); + connectChainSlotSignals(pChainSlot); m_quickEffectChainSlots.insert(deckGroupName, pChainSlot); m_effectChainSlotsByGroup.insert(pChainSlot->group(), pChainSlot); } +void EffectsManager::connectChainSlotSignals(EffectChainSlotPointer pChainSlot) { + connect(pChainSlot.get(), + &EffectChainSlot::loadChainPreset, + this, + &EffectsManager::loadChainPresetFromList); +} + +void EffectsManager::loadChainPresetFromList(EffectChainSlot* pChainSlot, int listIndex) { + if (listIndex < 0 || listIndex >= m_effectChainPresets.size()) { + listIndex = 0; + } + loadEffectChainPreset(pChainSlot, + m_effectChainPresetsSorted.at(listIndex)); +} EffectChainSlotPointer EffectsManager::getEffectChainSlot( const QString& group) const { return m_effectChainSlotsByGroup.value(group); @@ -910,7 +928,7 @@ void EffectsManager::readEffectsXml() { if (chainNode.isElement()) { QDomElement chainElement = chainNode.toElement(); EffectChainPresetPointer pPreset(new EffectChainPreset(chainElement)); - loadEffectChainPreset(m_standardEffectChainSlots.value(i), pPreset); + loadEffectChainPreset(m_standardEffectChainSlots.value(i).get(), pPreset); } } diff --git a/src/effects/effectsmanager.h b/src/effects/effectsmanager.h index a9b70f9de31c..f3e18fbbe64c 100644 --- a/src/effects/effectsmanager.h +++ b/src/effects/effectsmanager.h @@ -120,7 +120,7 @@ class EffectsManager : public QObject { void hideParameter(int chainNumber, int effectNumber, EffectParameterPointer pParameter); void showParameter(int chainNumber, int effectNumber, EffectParameterPointer pParameter); - void loadEffectChainPreset(EffectChainSlotPointer pChainSlot, + void loadEffectChainPreset(EffectChainSlot* pChainSlot, EffectChainPresetPointer pPreset); void loadPresetToStandardChain(int chainNumber, EffectChainPresetPointer pPreset); @@ -191,11 +191,16 @@ class EffectsManager : public QObject { signals: void visibleEffectsUpdated(); + private slots: + void loadChainPresetFromList(EffectChainSlot* pChainSlot, int listIndex); + private: QString debugString() const { return "EffectsManager"; } + void connectChainSlotSignals(EffectChainSlotPointer pChainSlot); + void loadDefaultEffectPresets(); void loadEffectChainPresets(); From 6a0980111dbb6d0ea3d6b678e07e51e05f4dce57 Mon Sep 17 00:00:00 2001 From: Be Date: Sat, 25 Apr 2020 14:33:04 -0500 Subject: [PATCH 099/443] EffectChainSlot: reimplement chain_selector and next/prev_chain Now they are actually useful for the first time. --- src/effects/effectchainslot.cpp | 27 ++++++++++++--------------- src/effects/effectchainslot.h | 22 +++++----------------- src/effects/effectsmanager.cpp | 24 ++++++++++++++++++++++++ src/effects/effectsmanager.h | 1 + 4 files changed, 42 insertions(+), 32 deletions(-) diff --git a/src/effects/effectchainslot.cpp b/src/effects/effectchainslot.cpp index f7d8b895f981..378361986eec 100644 --- a/src/effects/effectchainslot.cpp +++ b/src/effects/effectchainslot.cpp @@ -308,13 +308,12 @@ void EffectChainSlot::slotControlChainSuperParameter(double v, bool force) { } } -void EffectChainSlot::slotControlChainSelector(double v) { -// qDebug() << debugString() << "slotControlChainSelector" << v; -// if (v > 0) { -// emit nextChain(m_iChainSlotNumber, m_pEffectChain); -// } else if (v < 0) { -// emit prevChain(m_iChainSlotNumber, m_pEffectChain); -// } +void EffectChainSlot::slotControlChainSelector(double value) { + if (value > 0) { + emit selectChainPreset(this, 1); + } else { + emit selectChainPreset(this, -1); + } } void EffectChainSlot::slotControlLoadChainPreset(double value) { @@ -322,17 +321,15 @@ void EffectChainSlot::slotControlLoadChainPreset(double value) { emit loadChainPreset(this, value - 1); } -void EffectChainSlot::slotControlChainNextPreset(double v) { - // qDebug() << debugString() << "slotControlChainNextPreset" << v; - if (v > 0) { - slotControlChainSelector(1); +void EffectChainSlot::slotControlChainNextPreset(double value) { + if (value > 0) { + emit selectChainPreset(this, 1); } } -void EffectChainSlot::slotControlChainPrevPreset(double v) { - //qDebug() << debugString() << "slotControlChainPrevPreset" << v; - if (v > 0) { - slotControlChainSelector(-1); +void EffectChainSlot::slotControlChainPrevPreset(double value) { + if (value > 0) { + emit selectChainPreset(this, -1); } } diff --git a/src/effects/effectchainslot.h b/src/effects/effectchainslot.h index f824089238c8..0d5e0147b4f0 100644 --- a/src/effects/effectchainslot.h +++ b/src/effects/effectchainslot.h @@ -118,20 +118,8 @@ class EffectChainSlot : public QObject { bool adoptMetaknobFromPreset = false); signals: - // Signal that whoever is in charge of this EffectChainSlot should load the - // next EffectChain into it. - void nextChain(unsigned int iChainSlotNumber, - EffectChainSlotPointer pEffectChain); - - // Signal that whoever is in charge of this EffectChainSlot should load the - // previous EffectChain into it. - void prevChain(unsigned int iChainSlotNumber, - EffectChainSlotPointer pEffectChain); - - // Signal that whoever is in charge of this EffectChainSlot should clear - // this EffectChain (by removing the chain from this EffectChainSlot). - void clearChain(unsigned int iChainNumber, EffectChainSlotPointer pEffectChain); void loadChainPreset(EffectChainSlot* pChainSlot, int listIndex); + void selectChainPreset(EffectChainSlot* pChainSlot, int delta); // Signal that indicates that the EffectChainSlot has been updated. void updated(); @@ -153,11 +141,11 @@ class EffectChainSlot : public QObject { QList m_effectSlots; private slots: - void slotControlClear(double v); - void slotControlChainSelector(double v); - void slotControlChainNextPreset(double v); - void slotControlChainPrevPreset(double v); + void slotControlClear(double value); void slotControlLoadChainPreset(double value); + void slotControlChainSelector(double value); + void slotControlChainNextPreset(double value); + void slotControlChainPrevPreset(double value); void slotChannelStatusChanged(const QString& group); private: diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index a3e57a3080c5..953094aa948c 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -256,6 +256,7 @@ void EffectsManager::loadEffectChainPreset(EffectChainSlot* pChainSlot, effectSlot++; } pChainSlot->setMixMode(pPreset->mixMode()); + pChainSlot->setName(pPreset->name()); } void EffectsManager::loadPresetToStandardChain(int chainNumber, EffectChainPresetPointer pPreset) { @@ -559,6 +560,10 @@ void EffectsManager::connectChainSlotSignals(EffectChainSlotPointer pChainSlot) &EffectChainSlot::loadChainPreset, this, &EffectsManager::loadChainPresetFromList); + connect(pChainSlot.get(), + &EffectChainSlot::selectChainPreset, + this, + &EffectsManager::loadChainPresetSelector); } void EffectsManager::loadChainPresetFromList(EffectChainSlot* pChainSlot, int listIndex) { @@ -568,6 +573,25 @@ void EffectsManager::loadChainPresetFromList(EffectChainSlot* pChainSlot, int li loadEffectChainPreset(pChainSlot, m_effectChainPresetsSorted.at(listIndex)); } + +void EffectsManager::loadChainPresetSelector(EffectChainSlot* pChainSlot, int delta) { + int listIndex = 0; + if (m_effectChainPresets.contains(pChainSlot->name())) { + EffectChainPresetPointer pLoadedPreset = m_effectChainPresets.value(pChainSlot->name()); + listIndex = m_effectChainPresetsSorted.indexOf(pLoadedPreset); + } + + listIndex += delta; + if (listIndex >= m_effectChainPresetsSorted.size()) { + listIndex = 0; + } else if (listIndex < 0) { + listIndex = m_effectChainPresetsSorted.size() - 1; + } + + loadEffectChainPreset(pChainSlot, + m_effectChainPresetsSorted.at(listIndex)); +} + EffectChainSlotPointer EffectsManager::getEffectChainSlot( const QString& group) const { return m_effectChainSlotsByGroup.value(group); diff --git a/src/effects/effectsmanager.h b/src/effects/effectsmanager.h index f3e18fbbe64c..dbb9a05810c7 100644 --- a/src/effects/effectsmanager.h +++ b/src/effects/effectsmanager.h @@ -193,6 +193,7 @@ class EffectsManager : public QObject { private slots: void loadChainPresetFromList(EffectChainSlot* pChainSlot, int listIndex); + void loadChainPresetSelector(EffectChainSlot* pChainSlot, int listIndex); private: QString debugString() const { From d7c6eeea6fd9820fdf14eb95b5df21eb18a1d386 Mon Sep 17 00:00:00 2001 From: Be Date: Sat, 25 Apr 2020 19:36:22 -0500 Subject: [PATCH 100/443] EffectKnobParameterSlot: load metaknob link from preset --- src/effects/effectknobparameterslot.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/effects/effectknobparameterslot.cpp b/src/effects/effectknobparameterslot.cpp index c551db0c2438..e8850664ff3e 100644 --- a/src/effects/effectknobparameterslot.cpp +++ b/src/effects/effectknobparameterslot.cpp @@ -91,9 +91,9 @@ void EffectKnobParameterSlot::loadParameter(EffectParameterPointer pEffectParame m_pControlLoaded->forceSet(1.0); m_pControlLinkType->set( - static_cast(m_pManifestParameter->defaultLinkType())); + static_cast(pEffectParameter->linkType())); m_pControlLinkInverse->set( - static_cast(m_pManifestParameter->defaultLinkInversion())); + static_cast(pEffectParameter->linkInversion())); } emit(updated()); From 9675358dc35d64b2bd034be38aca2f0d3fb7ea9d Mon Sep 17 00:00:00 2001 From: Be Date: Sun, 26 Apr 2020 16:24:38 -0500 Subject: [PATCH 101/443] WEffectSelector: use Qt5 functor signal-slot syntax --- src/widget/weffectselector.cpp | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/widget/weffectselector.cpp b/src/widget/weffectselector.cpp index 558f33ba8060..eee7e5d64362 100644 --- a/src/widget/weffectselector.cpp +++ b/src/widget/weffectselector.cpp @@ -25,12 +25,18 @@ void WEffectSelector::setup(const QDomNode& node, const SkinContext& context) { node, context, m_pChainSlot); if (m_pEffectSlot != nullptr) { - connect(m_pEffectsManager, SIGNAL(visibleEffectsUpdated()), - this, SLOT(populate())); - connect(m_pEffectSlot.data(), SIGNAL(effectChanged()), - this, SLOT(slotEffectUpdated())); - connect(this, SIGNAL(activated(int)), - this, SLOT(slotEffectSelected(int))); + connect(m_pEffectsManager, + &EffectsManager::visibleEffectsUpdated, + this, + &WEffectSelector::populate); + connect(m_pEffectSlot.data(), + &EffectSlot::effectChanged, + this, + &WEffectSelector::slotEffectUpdated); + connect(this, + QOverload::of(&QComboBox::activated), + this, + &WEffectSelector::slotEffectSelected); } else { SKIN_WARNING(node, context) << "EffectSelector node could not attach to effect slot."; From af933a399b67074d31ef2794fa2af08806311262 Mon Sep 17 00:00:00 2001 From: Be Date: Sun, 26 Apr 2020 16:47:57 -0500 Subject: [PATCH 102/443] WEffectSelector: remove legacy hacks for Qt4 scaling --- src/widget/weffectselector.cpp | 26 +------------------------- src/widget/weffectselector.h | 10 +--------- 2 files changed, 2 insertions(+), 34 deletions(-) diff --git a/src/widget/weffectselector.cpp b/src/widget/weffectselector.cpp index eee7e5d64362..90a16ea11a6f 100644 --- a/src/widget/weffectselector.cpp +++ b/src/widget/weffectselector.cpp @@ -8,16 +8,13 @@ WEffectSelector::WEffectSelector(QWidget* pParent, EffectsManager* pEffectsManager) : QComboBox(pParent), WBaseWidget(this), - m_pEffectsManager(pEffectsManager), - m_scaleFactor(1.0) { + m_pEffectsManager(pEffectsManager) { // Prevent this widget from getting focused to avoid // interfering with using the library via keyboard. setFocusPolicy(Qt::NoFocus); } void WEffectSelector::setup(const QDomNode& node, const SkinContext& context) { - m_scaleFactor = context.getScaleFactor(); - // EffectWidgetUtils propagates NULLs so this is all safe. m_pChainSlot = EffectWidgetUtils::getEffectChainSlotFromNode( node, context, m_pEffectsManager); @@ -63,8 +60,6 @@ void WEffectSelector::populate() { // NOTE(Be): Using \n instead of : as the separator does not work in // QComboBox item tooltips. - // TODO(Be): Check if this is also the case with Qt5. - //: %1 = effect name; %2 = effect description QString description = tr("%1: %2").arg(pManifest->name(), pManifest->description()); // The is a hack to get Qt to treat the string as rich text so @@ -119,22 +114,3 @@ void WEffectSelector::slotEffectUpdated() { setBaseTooltip(itemData(newIndex, Qt::ToolTipRole).toString()); } } - -bool WEffectSelector::event(QEvent* pEvent) { - if (pEvent->type() == QEvent::ToolTip) { - updateTooltip(); - } else if (pEvent->type() == QEvent::FontChange) { - const QFont& fonti = font(); - // Change the new font on the fly by casting away its constancy - // using setFont() here, would results into a recursive loop - // resetting the font to the original css values. - // Only scale pixel size fonts, point size fonts are scaled by the OS - if (fonti.pixelSize() > 0) { - const_cast(fonti).setPixelSize(fonti.pixelSize() * m_scaleFactor); - } - // repopulate to add text according to the new font measures - populate(); - } - - return QComboBox::event(pEvent); -} diff --git a/src/widget/weffectselector.h b/src/widget/weffectselector.h index 264748491980..815536b7d11d 100644 --- a/src/widget/weffectselector.h +++ b/src/widget/weffectselector.h @@ -1,5 +1,4 @@ -#ifndef WEFFECTSELECTOR_H -#define WEFFECTSELECTOR_H +#pragma once #include #include @@ -15,9 +14,6 @@ class WEffectSelector : public QComboBox, public WBaseWidget { void setup(const QDomNode& node, const SkinContext& context); - protected: - bool event(QEvent* pEvent) override; - private slots: void slotEffectUpdated(); void slotEffectSelected(int newIndex); @@ -27,8 +23,4 @@ class WEffectSelector : public QComboBox, public WBaseWidget { EffectsManager* m_pEffectsManager; EffectSlotPointer m_pEffectSlot; EffectChainSlotPointer m_pChainSlot; - double m_scaleFactor; }; - - -#endif /* WEFFECTSELECTOR_H */ From 7dc939d38171855eaa031945c87111ed32696c83 Mon Sep 17 00:00:00 2001 From: Be Date: Sun, 26 Apr 2020 17:43:01 -0500 Subject: [PATCH 103/443] EffectChain[Slot, Preset]: remove unused id and description and rename "name" to "presetName" --- src/effects/effectchainslot.cpp | 34 +++++++---------------- src/effects/effectchainslot.h | 18 +++++------- src/effects/effectsmanager.cpp | 7 +++-- src/effects/presets/effectchainpreset.cpp | 14 +--------- src/effects/presets/effectchainpreset.h | 2 -- src/engine/effects/engineeffectchain.cpp | 8 +++--- src/engine/effects/engineeffectchain.h | 14 ++++------ src/widget/weffectchain.cpp | 5 +--- 8 files changed, 32 insertions(+), 70 deletions(-) diff --git a/src/effects/effectchainslot.cpp b/src/effects/effectchainslot.cpp index 378361986eec..7b5af433104d 100644 --- a/src/effects/effectchainslot.cpp +++ b/src/effects/effectchainslot.cpp @@ -24,9 +24,7 @@ EffectChainSlot::EffectChainSlot(const QString& group, // is 0-indexed. m_pEffectsManager(pEffectsManager), m_group(group), - m_id(id), - m_name(""), - m_description(""), + m_presetName(""), m_mixMode(EffectChainMixMode::DrySlashWet), m_signalProcessingStage(stage), m_pEngineEffectChain(nullptr) { @@ -153,9 +151,10 @@ EffectChainSlot::~EffectChainSlot() { } void EffectChainSlot::addToEngine() { - m_pEngineEffectChain = new EngineEffectChain(m_id, - m_pEffectsManager->registeredInputChannels(), - m_pEffectsManager->registeredOutputChannels()); + m_pEngineEffectChain = new EngineEffectChain( + m_group, + m_pEffectsManager->registeredInputChannels(), + m_pEffectsManager->registeredOutputChannels()); EffectsRequest* pRequest = new EffectsRequest(); pRequest->type = EffectsRequest::ADD_EFFECT_CHAIN; pRequest->AddEffectChain.signalProcessingStage = m_signalProcessingStage; @@ -179,22 +178,13 @@ void EffectChainSlot::removeFromEngine() { m_pEngineEffectChain = nullptr; } -const QString& EffectChainSlot::name() const { - return m_name; +const QString& EffectChainSlot::presetName() const { + return m_presetName; } -void EffectChainSlot::setName(const QString& name) { - m_name = name; - emit updated(); -} - -QString EffectChainSlot::description() const { - return m_description; -} - -void EffectChainSlot::setDescription(const QString& description) { - m_description = description; - emit updated(); +void EffectChainSlot::setPresetName(const QString& name) { + m_presetName = name; + emit nameChanged(name); } void EffectChainSlot::loadEffect(const unsigned int iEffectSlotNumber, @@ -221,10 +211,6 @@ void EffectChainSlot::sendParameterUpdate() { m_pEffectsManager->writeRequest(pRequest); } -QString EffectChainSlot::id() const { - return m_id; -} - QString EffectChainSlot::group() const { return m_group; } diff --git a/src/effects/effectchainslot.h b/src/effects/effectchainslot.h index 0d5e0147b4f0..55f43b21fa4c 100644 --- a/src/effects/effectchainslot.h +++ b/src/effects/effectchainslot.h @@ -54,8 +54,6 @@ class EffectChainSlot : public QObject { const QString& id = QString()); virtual ~EffectChainSlot(); - // Get the ID of the loaded EffectChain - QString id() const; QString group() const; EffectSlotPointer getEffectSlot(unsigned int slotNumber); @@ -79,9 +77,8 @@ class EffectChainSlot : public QObject { return m_group; } - // Get the human-readable name of the EffectChain - const QString& name() const; - void setName(const QString& name); + const QString& presetName() const; + void setPresetName(const QString& name); // Get the human-readable description of the EffectChain QString description() const; @@ -117,12 +114,14 @@ class EffectChainSlot : public QObject { EffectPresetPointer pPreset, bool adoptMetaknobFromPreset = false); + public slots: + void slotControlClear(double value); + signals: void loadChainPreset(EffectChainSlot* pChainSlot, int listIndex); void selectChainPreset(EffectChainSlot* pChainSlot, int delta); - // Signal that indicates that the EffectChainSlot has been updated. - void updated(); + void nameChanged(const QString& name); protected slots: void sendParameterUpdate(); @@ -141,7 +140,6 @@ class EffectChainSlot : public QObject { QList m_effectSlots; private slots: - void slotControlClear(double value); void slotControlLoadChainPreset(double value); void slotControlChainSelector(double value); void slotControlChainNextPreset(double value); @@ -198,9 +196,7 @@ class EffectChainSlot : public QObject { QMap m_channelInfoByName; QSignalMapper m_channelStatusMapper; - QString m_id; - QString m_name; - QString m_description; + QString m_presetName; EffectChainMixMode m_mixMode; SignalProcessingStage m_signalProcessingStage; QSet m_enabledInputChannels; diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index 953094aa948c..b36b5dcde4ab 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -256,7 +256,7 @@ void EffectsManager::loadEffectChainPreset(EffectChainSlot* pChainSlot, effectSlot++; } pChainSlot->setMixMode(pPreset->mixMode()); - pChainSlot->setName(pPreset->name()); + pChainSlot->setPresetName(pPreset->name()); } void EffectsManager::loadPresetToStandardChain(int chainNumber, EffectChainPresetPointer pPreset) { @@ -576,8 +576,9 @@ void EffectsManager::loadChainPresetFromList(EffectChainSlot* pChainSlot, int li void EffectsManager::loadChainPresetSelector(EffectChainSlot* pChainSlot, int delta) { int listIndex = 0; - if (m_effectChainPresets.contains(pChainSlot->name())) { - EffectChainPresetPointer pLoadedPreset = m_effectChainPresets.value(pChainSlot->name()); + if (m_effectChainPresets.contains(pChainSlot->presetName())) { + EffectChainPresetPointer pLoadedPreset = + m_effectChainPresets.value(pChainSlot->presetName()); listIndex = m_effectChainPresetsSorted.indexOf(pLoadedPreset); } diff --git a/src/effects/presets/effectchainpreset.cpp b/src/effects/presets/effectchainpreset.cpp index b83420f1c219..c3b1dafc22b7 100644 --- a/src/effects/presets/effectchainpreset.cpp +++ b/src/effects/presets/effectchainpreset.cpp @@ -16,9 +16,7 @@ EffectChainPreset::EffectChainPreset(const QDomElement& chainElement) { return; } - m_id = XmlParse::selectNodeQString(chainElement, EffectXml::ChainId); m_name = XmlParse::selectNodeQString(chainElement, EffectXml::ChainName); - m_description = XmlParse::selectNodeQString(chainElement, EffectXml::ChainDescription); QString mixModeStr = XmlParse::selectNodeQString(chainElement, EffectXml::ChainMixMode); m_mixMode = EffectChainSlot::mixModeFromString(mixModeStr); @@ -39,9 +37,7 @@ EffectChainPreset::EffectChainPreset(const QDomElement& chainElement) { } EffectChainPreset::EffectChainPreset(const EffectChainSlot* chain) { - m_id = chain->id(); - m_name = chain->name(); - m_description = chain->description(); + m_name = chain->presetName(); m_mixMode = chain->mixMode(); m_dSuper = chain->getSuperParameter(); for (const auto& pEffectSlot : chain->getEffectSlots()) { @@ -52,18 +48,10 @@ EffectChainPreset::EffectChainPreset(const EffectChainSlot* chain) { const QDomElement EffectChainPreset::toXml(QDomDocument* doc) const { QDomElement chainElement = doc->createElement(EffectXml::Chain); - XmlParse::addElement(*doc, - chainElement, - EffectXml::ChainId, - m_id); XmlParse::addElement(*doc, chainElement, EffectXml::ChainName, m_name); - XmlParse::addElement(*doc, - chainElement, - EffectXml::ChainDescription, - m_description); XmlParse::addElement(*doc, chainElement, EffectXml::ChainMixMode, diff --git a/src/effects/presets/effectchainpreset.h b/src/effects/presets/effectchainpreset.h index e2019bdb1c8c..55d2052bc98f 100644 --- a/src/effects/presets/effectchainpreset.h +++ b/src/effects/presets/effectchainpreset.h @@ -42,9 +42,7 @@ class EffectChainPreset { } private: - QString m_id; QString m_name; - QString m_description; double m_dSuper; EffectChainMixMode m_mixMode; QList m_effectPresets; diff --git a/src/engine/effects/engineeffectchain.cpp b/src/engine/effects/engineeffectchain.cpp index 051415fc9ec0..1ed9a3457dd4 100644 --- a/src/engine/effects/engineeffectchain.cpp +++ b/src/engine/effects/engineeffectchain.cpp @@ -4,10 +4,10 @@ #include "util/defs.h" #include "util/sample.h" -EngineEffectChain::EngineEffectChain(const QString& id, - const QSet& registeredInputChannels, - const QSet& registeredOutputChannels) - : m_id(id), +EngineEffectChain::EngineEffectChain(const QString& group, + const QSet& registeredInputChannels, + const QSet& registeredOutputChannels) + : m_group(group), m_enableState(EffectEnableState::Enabled), m_mixMode(EffectChainMixMode::DrySlashWet), m_dMix(0), diff --git a/src/engine/effects/engineeffectchain.h b/src/engine/effects/engineeffectchain.h index 1908c9f9628b..c74fd7a68f14 100644 --- a/src/engine/effects/engineeffectchain.h +++ b/src/engine/effects/engineeffectchain.h @@ -17,9 +17,9 @@ class EngineEffect; class EngineEffectChain : public EffectsRequestHandler { public: - EngineEffectChain(const QString& id, - const QSet& registeredInputChannels, - const QSet& registeredOutputChannels); + EngineEffectChain(const QString& group, + const QSet& registeredInputChannels, + const QSet& registeredOutputChannels); virtual ~EngineEffectChain(); bool processEffectsRequest( @@ -33,10 +33,6 @@ class EngineEffectChain : public EffectsRequestHandler { const unsigned int sampleRate, const GroupFeatureState& groupFeatures); - const QString& id() const { - return m_id; - } - bool enabledForChannel(const ChannelHandle& handle) const; void deleteStatesForInputChannel(const ChannelHandle* channel); @@ -52,7 +48,7 @@ class EngineEffectChain : public EffectsRequestHandler { }; QString debugString() const { - return QString("EngineEffectChain(%1)").arg(m_id); + return QString("EngineEffectChain(%1)").arg(m_group); } bool updateParameters(const EffectsRequest& message); @@ -67,7 +63,7 @@ class EngineEffectChain : public EffectsRequestHandler { ChannelStatus& getChannelStatus(const ChannelHandle& inputHandle, const ChannelHandle& outputHandle); - QString m_id; + QString m_group; EffectEnableState m_enableState; EffectChainMixMode m_mixMode; CSAMPLE m_dMix; diff --git a/src/widget/weffectchain.cpp b/src/widget/weffectchain.cpp index b0441779c87d..b7bc27dc5352 100644 --- a/src/widget/weffectchain.cpp +++ b/src/widget/weffectchain.cpp @@ -35,11 +35,8 @@ void WEffectChain::setEffectChainSlot(EffectChainSlotPointer pEffectChainSlot) { void WEffectChain::chainUpdated() { // qDebug() << "chainUpdated()"; QString name = tr("None"); - QString description = tr("No effect chain loaded."); if (m_pEffectChainSlot) { - name = m_pEffectChainSlot->name(); - description = m_pEffectChainSlot->description(); + name = m_pEffectChainSlot->presetName(); } setText(name); - setBaseTooltip(description); } From a7b30ca9523b899c4324d7faf43c7408731d56f1 Mon Sep 17 00:00:00 2001 From: Be Date: Sun, 26 Apr 2020 21:37:59 -0500 Subject: [PATCH 104/443] EffectsManager: use named constants for directory paths --- src/effects/effectsmanager.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index b36b5dcde4ab..2e0b301f7085 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -17,6 +17,9 @@ #include "util/assert.h" namespace { +const QString kEffectPresetDirectory = "/effects"; +const QString kEffectChainPresetDirectory = kEffectPresetDirectory + "/chains"; +const QString kEffectDefaultsDirectory = kEffectPresetDirectory + "/defaults"; const QString kStandardEffectRackGroup = "[EffectRack1]"; const QString kOutputEffectRackGroup = "[OutputEffectRack]"; const QString kQuickEffectRackGroup = "[QuickEffectRack1]"; @@ -743,7 +746,7 @@ void EffectsManager::collectGarbage(const EffectsRequest* pRequest) { void EffectsManager::loadDefaultEffectPresets() { // Load saved defaults from settings directory - QString dirPath(m_pConfig->getSettingsPath() + "/effects/defaults"); + QString dirPath(m_pConfig->getSettingsPath() + kEffectDefaultsDirectory); QDir effectsDefaultsDir(dirPath); effectsDefaultsDir.setFilter(QDir::Files | QDir::Readable); for (const auto& filePath : effectsDefaultsDir.entryList()) { @@ -788,7 +791,7 @@ void EffectsManager::saveDefaultForEffect(EffectPresetPointer pEffectPreset) { doc.setContent(QString("\n")); doc.appendChild(pEffectPreset->toXml(&doc)); - QString path(m_pConfig->getSettingsPath() + "/effects/defaults"); + QString path(m_pConfig->getSettingsPath() + kEffectDefaultsDirectory); QDir effectsDefaultsDir(path); if (!effectsDefaultsDir.exists()) { effectsDefaultsDir.mkpath(path); @@ -828,7 +831,7 @@ void EffectsManager::saveDefaultForEffect(int unitNumber, int effectNumber) { } void EffectsManager::loadEffectChainPresets() { - QString dirPath(m_pConfig->getSettingsPath() + "/effects/chains"); + QString dirPath(m_pConfig->getSettingsPath() + kEffectChainPresetDirectory); QDir effectsDefaultsDir(dirPath); effectsDefaultsDir.setFilter(QDir::Files | QDir::Readable); for (const auto& filePath : effectsDefaultsDir.entryList()) { @@ -906,7 +909,7 @@ void EffectsManager::savePresetFromStandardEffectChain(int chainNumber) { m_effectChainPresets.insert(name, pChainPreset); m_effectChainPresetsSorted.append(pChainPreset); - QString path(m_pConfig->getSettingsPath() + "/effects/chains"); + QString path(m_pConfig->getSettingsPath() + kEffectChainPresetDirectory); QDir effectsChainsDir(path); if (!effectsChainsDir.exists()) { effectsChainsDir.mkpath(path); From 8a2133eef2c6f25661c0fe3fe56497b0ca089b33 Mon Sep 17 00:00:00 2001 From: Be Date: Mon, 27 Apr 2020 11:27:52 -0500 Subject: [PATCH 105/443] EffectsManager: fix saving of effects state to effects.xml XML documents must have exactly one root element. --- src/effects/effectsmanager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index 2e0b301f7085..1c5ac8eda90f 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -998,7 +998,7 @@ void EffectsManager::saveEffectsXml() { EffectXml::ChainPresetName, pChainPreset->name()); } - doc.appendChild(chainPresetListElement); + rootElement.appendChild(chainPresetListElement); QDir settingsPath(m_pConfig->getSettingsPath()); if (!settingsPath.exists()) { From 0073b845167426da549a0c63f8dff32f03af773b Mon Sep 17 00:00:00 2001 From: Be Date: Mon, 27 Apr 2020 13:05:43 -0500 Subject: [PATCH 106/443] QuickEffectChainSlot: add as many EffectSlots as standard chains This will allow loading chain presets into QuickEffectChainSlots. --- src/effects/specialeffectchainslots.cpp | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/effects/specialeffectchainslots.cpp b/src/effects/specialeffectchainslots.cpp index 2eab61765ead..1761a51d7b7c 100644 --- a/src/effects/specialeffectchainslots.cpp +++ b/src/effects/specialeffectchainslots.cpp @@ -103,13 +103,10 @@ QuickEffectChainSlot::QuickEffectChainSlot(const QString& group, EffectsManager* pEffectsManager) : PerGroupEffectChainSlot(group, formatEffectChainSlotGroup(group), pEffectsManager) { - // Add a single effect slot - addEffectSlot(formatEffectSlotGroup(group)); - m_effectSlots[0]->setEnabled(true); - // DlgPrefEq loads the Effect with loadEffectToGroup - - setSuperParameter(0.5); - setSuperParameterDefaultValue(0.5); + for (int i = 0; i < kNumEffectsPerUnit; ++i) { + addEffectSlot(formatEffectSlotGroup(group, i)); + m_effectSlots.at(i)->setEnabled(true); + } } void QuickEffectChainSlot::loadEffect( From d0bfe9ffe4d6a4b1925704dc1564e4628ebb988c Mon Sep 17 00:00:00 2001 From: Be Date: Mon, 27 Apr 2020 13:07:13 -0500 Subject: [PATCH 107/443] EffectsManager: clear EffectChainSlot before loading preset --- src/effects/effectsmanager.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index 1c5ac8eda90f..3aa3e4b8013b 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -228,6 +228,8 @@ void EffectsManager::loadEffectChainPreset(EffectChainSlot* pChainSlot, VERIFY_OR_DEBUG_ASSERT(pPreset) { return; } + pChainSlot->slotControlClear(1); + // Set the superknob before loading the effects so it does not change their // metaknobs pChainSlot->setSuperParameter(pPreset->superKnob()); From ae97f5104a4baf040e3c7e4ec09dd2b09f972cad Mon Sep 17 00:00:00 2001 From: Be Date: Mon, 27 Apr 2020 13:08:05 -0500 Subject: [PATCH 108/443] EffectsManager: set superknob default from chain preset --- src/effects/effectsmanager.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index 3aa3e4b8013b..9a4e51d33b0c 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -233,6 +233,7 @@ void EffectsManager::loadEffectChainPreset(EffectChainSlot* pChainSlot, // Set the superknob before loading the effects so it does not change their // metaknobs pChainSlot->setSuperParameter(pPreset->superKnob()); + pChainSlot->setSuperParameterDefaultValue(pPreset->superKnob()); int effectSlot = 0; for (const auto& pEffectPreset : pPreset->effectPresets()) { From edd23434d5c467a6eefd9f09dfa44ec2a89b0666 Mon Sep 17 00:00:00 2001 From: Be Date: Mon, 27 Apr 2020 13:42:41 -0500 Subject: [PATCH 109/443] EffectsManager: load mix mode from chain presets --- src/effects/effectsmanager.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index 9a4e51d33b0c..5b6d4b33278a 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -234,6 +234,7 @@ void EffectsManager::loadEffectChainPreset(EffectChainSlot* pChainSlot, // metaknobs pChainSlot->setSuperParameter(pPreset->superKnob()); pChainSlot->setSuperParameterDefaultValue(pPreset->superKnob()); + pChainSlot->setMixMode(pPreset->mixMode()); int effectSlot = 0; for (const auto& pEffectPreset : pPreset->effectPresets()) { From 4c613383be0ff12357aa31bd85b5c022838d760e Mon Sep 17 00:00:00 2001 From: Be Date: Mon, 27 Apr 2020 13:09:36 -0500 Subject: [PATCH 110/443] EffectsManager: copy default chain presets from resource folder on first run of Mixxx --- CMakeLists.txt | 8 ++++++++ src/effects/effectsmanager.cpp | 36 +++++++++++++++++++++++++++++----- 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 309e09ebfb71..66176c8812b6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -882,6 +882,14 @@ install( "${MIXXX_INSTALL_DATADIR}" ) +# Effect presets +install( + DIRECTORY + "${CMAKE_CURRENT_SOURCE_DIR}/res/effects" + DESTINATION + "${MIXXX_INSTALL_DATADIR}" +) + # Translation files install( DIRECTORY diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index 5b6d4b33278a..c0e8d4a433c6 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -835,11 +835,37 @@ void EffectsManager::saveDefaultForEffect(int unitNumber, int effectNumber) { } void EffectsManager::loadEffectChainPresets() { - QString dirPath(m_pConfig->getSettingsPath() + kEffectChainPresetDirectory); - QDir effectsDefaultsDir(dirPath); - effectsDefaultsDir.setFilter(QDir::Files | QDir::Readable); - for (const auto& filePath : effectsDefaultsDir.entryList()) { - QFile file(dirPath + "/" + filePath); + QString savedPresetsPath(m_pConfig->getSettingsPath() + kEffectChainPresetDirectory); + QDir savedPresetsDir(savedPresetsPath); + + // On first run of Mixxx, copy chain presets from the resource folder to the + // user settings folder. This allows us to ship default chain presets with + // Mixxx while letting the user delete our defaults if they do not want them. + // The user can always copy the files again manually or use the Import + // button in DlgPrefEffects. + if (!savedPresetsDir.exists()) { + savedPresetsDir.mkpath(savedPresetsPath); + QString defaultPresetsPath(m_pConfig->getResourcePath() + kEffectChainPresetDirectory); + QDir defaultChainPresetsDir(defaultPresetsPath); + defaultChainPresetsDir.setFilter(QDir::Files | QDir::Readable); + for (const auto& fileName : defaultChainPresetsDir.entryList()) { + QFile::copy(defaultPresetsPath + "/" + fileName, savedPresetsPath + "/" + fileName); + } + + QFile file(savedPresetsPath + "/" + m_defaultQuickEffectChainPreset->name() + ".xml"); + if (file.open(QIODevice::Truncate | QIODevice::WriteOnly)) { + QDomDocument doc(EffectXml::Chain); + doc.setContent(QString("\n")); + doc.appendChild(m_defaultQuickEffectChainPreset->toXml(&doc)); + file.write(doc.toString().toUtf8()); + } + file.close(); + } + + savedPresetsDir.setFilter(QDir::Files | QDir::Readable); + QStringList fileList = savedPresetsDir.entryList(); + for (const auto& filePath : fileList) { + QFile file(savedPresetsPath + "/" + filePath); if (!file.open(QIODevice::ReadOnly)) { continue; } From 34fc767b0c1ca35d20fb501f821930af5cb8d214 Mon Sep 17 00:00:00 2001 From: Be Date: Mon, 27 Apr 2020 13:43:14 -0500 Subject: [PATCH 111/443] add HP Echoverb default effect chain preset --- res/effects/chains/HP Echoverb.xml | 142 +++++++++++++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100644 res/effects/chains/HP Echoverb.xml diff --git a/res/effects/chains/HP Echoverb.xml b/res/effects/chains/HP Echoverb.xml new file mode 100644 index 000000000000..74deaacebd68 --- /dev/null +++ b/res/effects/chains/HP Echoverb.xml @@ -0,0 +1,142 @@ + + + HP Echoverb + DRY+WET + 0 + + + 0 + org.mixxx.effects.threebandbiquadeq + BuiltIn + + + low + 0.34375 + NONE + 0 + 0 + + + mid + 1 + NONE + 0 + 0 + + + high + 1 + NONE + 0 + 0 + + + killLow + 0 + NONE + 0 + 0 + + + killMid + 0 + NONE + 0 + 0 + + + killHigh + 0 + NONE + 0 + 0 + + + + + 0 + org.mixxx.effects.echo + BuiltIn + + + delay_time + 0.5 + NONE + 0 + 0 + + + feedback_amount + 0.707946 + NONE + 0 + 0 + + + pingpong_amount + 0 + NONE + 0 + 0 + + + send_amount + 0 + LINKED + 0 + 0 + + + quantize + 1 + NONE + 0 + 0 + + + triplet + 0 + NONE + 0 + 0 + + + + + 0 + org.mixxx.effects.reverb + BuiltIn + + + decay + 0.5 + NONE + 0 + 0 + + + bandwidth + 1 + NONE + 0 + 0 + + + damping + 0.277905 + NONE + 0 + 0 + + + send_amount + 1 + NONE + 0 + 0 + + + + + + From 91be4d36b892a44d04652c9f7aa5f7d8f555b7cd Mon Sep 17 00:00:00 2001 From: Be Date: Mon, 27 Apr 2020 13:44:17 -0500 Subject: [PATCH 112/443] add Smooth Growl default effect chain preset --- res/effects/chains/Smooth Growl.xml | 107 ++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 res/effects/chains/Smooth Growl.xml diff --git a/res/effects/chains/Smooth Growl.xml b/res/effects/chains/Smooth Growl.xml new file mode 100644 index 000000000000..464aa87b5063 --- /dev/null +++ b/res/effects/chains/Smooth Growl.xml @@ -0,0 +1,107 @@ + + + Smooth Growl + DRY/WET + 0 + + + 0 + org.mixxx.effects.bitcrusher + BuiltIn + + + bit_depth + 16 + LINKED + 1 + 0 + + + downsample + 1 + LINKED + 1 + 0 + + + + + 0 + org.mixxx.effects.moogladder4filter + BuiltIn + + + lpf + 0.5 + LINKED + 1 + 0 + + + resonance + 1.54534 + NONE + 0 + 0 + + + hpf + 0.0003 + NONE + 0 + 0 + + + + + 0 + org.mixxx.effects.echo + BuiltIn + + + delay_time + 0.996914 + NONE + 0 + 0 + + + feedback_amount + 0.707946 + NONE + 0 + 0 + + + pingpong_amount + 0.169252 + NONE + 0 + 0 + + + send_amount + 0 + LINKED + 0 + 0 + + + quantize + 1 + NONE + 0 + 0 + + + triplet + 0 + NONE + 0 + 0 + + + + + + From a21592db8ae1736bf54c546af17bd176bcaded39 Mon Sep 17 00:00:00 2001 From: Be Date: Mon, 27 Apr 2020 13:46:38 -0500 Subject: [PATCH 113/443] EffectChainPreset: add constructor for a single EffectPreset --- src/effects/presets/effectchainpreset.cpp | 10 +++++++++- src/effects/presets/effectchainpreset.h | 2 ++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/effects/presets/effectchainpreset.cpp b/src/effects/presets/effectchainpreset.cpp index c3b1dafc22b7..faf9e644af5a 100644 --- a/src/effects/presets/effectchainpreset.cpp +++ b/src/effects/presets/effectchainpreset.cpp @@ -4,7 +4,8 @@ #include "effects/presets/effectxmlelements.h" #include "util/xml.h" -EffectChainPreset::EffectChainPreset() { +EffectChainPreset::EffectChainPreset() + : m_name(QObject::tr("None")) { } EffectChainPreset::EffectChainPreset(const QDomElement& chainElement) { @@ -45,6 +46,13 @@ EffectChainPreset::EffectChainPreset(const EffectChainSlot* chain) { } } +EffectChainPreset::EffectChainPreset(EffectPresetPointer pEffectPreset) { + m_name = pEffectPreset->id(); + m_mixMode = EffectChainMixMode::DrySlashWet; + m_dSuper = pEffectPreset->metaParameter(); + m_effectPresets.append(pEffectPreset); +} + const QDomElement EffectChainPreset::toXml(QDomDocument* doc) const { QDomElement chainElement = doc->createElement(EffectXml::Chain); diff --git a/src/effects/presets/effectchainpreset.h b/src/effects/presets/effectchainpreset.h index 55d2052bc98f..1882c63f1652 100644 --- a/src/effects/presets/effectchainpreset.h +++ b/src/effects/presets/effectchainpreset.h @@ -15,6 +15,8 @@ class EffectChainPreset { EffectChainPreset(); EffectChainPreset(const QDomElement& chainElement); EffectChainPreset(const EffectChainSlot* pChain); + /// make a chain preset with just one effect + EffectChainPreset(EffectPresetPointer pEffectPreset); ~EffectChainPreset(); const QDomElement toXml(QDomDocument* doc) const; From a0dbe3b917414fa4f5d281b9c4d08b79313aa2e1 Mon Sep 17 00:00:00 2001 From: Be Date: Mon, 27 Apr 2020 13:47:52 -0500 Subject: [PATCH 114/443] EffectsManager: add overload to load chain preset by name --- src/effects/effectsmanager.cpp | 11 +++++++++++ src/effects/effectsmanager.h | 1 + 2 files changed, 12 insertions(+) diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index c0e8d4a433c6..57a358b1e9b5 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -266,6 +266,17 @@ void EffectsManager::loadEffectChainPreset(EffectChainSlot* pChainSlot, pChainSlot->setPresetName(pPreset->name()); } +void EffectsManager::loadEffectChainPreset(EffectChainSlot* pChainSlot, const QString& name) { + VERIFY_OR_DEBUG_ASSERT(pChainSlot != nullptr) { + return; + } + EffectChainPresetPointer pChainPreset = m_effectChainPresets.value(name); + VERIFY_OR_DEBUG_ASSERT(pChainPreset != nullptr) { + return; + } + loadEffectChainPreset(pChainSlot, pChainPreset); +} + void EffectsManager::loadPresetToStandardChain(int chainNumber, EffectChainPresetPointer pPreset) { loadEffectChainPreset(m_standardEffectChainSlots.at(chainNumber).get(), pPreset); } diff --git a/src/effects/effectsmanager.h b/src/effects/effectsmanager.h index dbb9a05810c7..60b5722e7ea0 100644 --- a/src/effects/effectsmanager.h +++ b/src/effects/effectsmanager.h @@ -122,6 +122,7 @@ class EffectsManager : public QObject { void loadEffectChainPreset(EffectChainSlot* pChainSlot, EffectChainPresetPointer pPreset); + void loadEffectChainPreset(EffectChainSlot* pChainSlot, const QString& name); void loadPresetToStandardChain(int chainNumber, EffectChainPresetPointer pPreset); EffectChainPresetPointer getEffectChainPreset(const QString& name) { From 297d34f6cfaa865f481b19cb05529f7332c50f78 Mon Sep 17 00:00:00 2001 From: Be Date: Mon, 27 Apr 2020 13:51:28 -0500 Subject: [PATCH 115/443] EffectsManager: save/load QuickEffect presets from effects.xml --- src/effects/effectsmanager.cpp | 56 +++++++++++++++++++++++++ src/effects/effectsmanager.h | 3 ++ src/effects/presets/effectxmlelements.h | 1 + 3 files changed, 60 insertions(+) diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index 57a358b1e9b5..1d5b73920a13 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -7,6 +7,7 @@ #include #include "effects/backends/builtin/builtinbackend.h" +#include "effects/backends/builtin/filtereffect.h" #include "effects/backends/lv2/lv2backend.h" #include "effects/effectslot.h" #include "effects/presets/effectchainpreset.h" @@ -54,6 +55,14 @@ EffectsManager::EffectsManager(QObject* pParent, #ifdef __LILV__ addEffectsBackend(EffectsBackendPointer(new LV2Backend())); #endif + + // Generate the default QuickEffect chain preset instead of shipping it in + // res/effects/chains because this uses the translated name. + EffectManifestPointer filterEffectManifest = getManifest(FilterEffect::getId(), + EffectBackendType::BuiltIn); + m_defaultQuickEffectChainPreset = EffectChainPresetPointer(new EffectChainPreset( + EffectPresetPointer(new EffectPreset(filterEffectManifest)))); + m_defaultQuickEffectChainPreset->setName(filterEffectManifest->displayName()); } EffectsManager::~EffectsManager() { @@ -978,9 +987,15 @@ void EffectsManager::readEffectsXml() { QDomDocument doc; if (!file.open(QIODevice::ReadOnly)) { + for (auto pQuickEffectChainSlot : m_quickEffectChainSlots) { + loadEffectChainPreset(pQuickEffectChainSlot.get(), m_defaultQuickEffectChainPreset); + } return; } else if (!doc.setContent(&file)) { file.close(); + for (auto pQuickEffectChainSlot : m_quickEffectChainSlots) { + loadEffectChainPreset(pQuickEffectChainSlot.get(), m_defaultQuickEffectChainPreset); + } return; } file.close(); @@ -1012,6 +1027,35 @@ void EffectsManager::readEffectsXml() { } } setChainPresetOrder(chainPresetsSorted); + + // Load QuickEffect presets + QDomElement quickEffectPresetsElement = XmlParse::selectElement( + root, + EffectXml::QuickEffectChainPresets); + QDomNodeList quickEffectPresetList = + quickEffectPresetsElement.elementsByTagName(EffectXml::ChainPresetName); + if (quickEffectPresetList.count() == 0) { + for (const auto pChainSlot : m_quickEffectChainSlots) { + loadEffectChainPreset(pChainSlot.get(), m_defaultQuickEffectChainPreset); + } + } + auto unloadedQuickEffectChainSlots = m_quickEffectChainSlots; + for (int i = 0; i < quickEffectPresetList.count(); ++i) { + QDomElement presetNameElement = quickEffectPresetList.at(i).toElement(); + if (!presetNameElement.isNull()) { + QString deckGroup = presetNameElement.attribute("group"); + auto pQuickEffectChainSlot = m_quickEffectChainSlots.value(deckGroup); + QString presetName = presetNameElement.text(); + loadEffectChainPreset(pQuickEffectChainSlot.get(), presetName); + if (pQuickEffectChainSlot != nullptr && !presetName.isEmpty() && + m_effectChainPresets.contains(presetName)) { + unloadedQuickEffectChainSlots.remove(deckGroup); + } + } + } + for (auto pQuickEffectChainSlot : unloadedQuickEffectChainSlots) { + loadEffectChainPreset(pQuickEffectChainSlot.get(), m_defaultQuickEffectChainPreset); + } } void EffectsManager::saveEffectsXml() { @@ -1041,6 +1085,18 @@ void EffectsManager::saveEffectsXml() { } rootElement.appendChild(chainPresetListElement); + // Save which presets are loaded to QuickEffects + QDomElement quickEffectPresetsElement = doc.createElement(EffectXml::QuickEffectChainPresets); + for (auto it = m_quickEffectChainSlots.begin(); it != m_quickEffectChainSlots.end(); it++) { + QDomElement quickEffectElement = XmlParse::addElement( + doc, + quickEffectPresetsElement, + EffectXml::ChainPresetName, + it.value()->presetName()); + quickEffectElement.setAttribute("group", it.key()); + } + rootElement.appendChild(quickEffectPresetsElement); + QDir settingsPath(m_pConfig->getSettingsPath()); if (!settingsPath.exists()) { return; diff --git a/src/effects/effectsmanager.h b/src/effects/effectsmanager.h index 60b5722e7ea0..4c1df98d1298 100644 --- a/src/effects/effectsmanager.h +++ b/src/effects/effectsmanager.h @@ -243,6 +243,9 @@ class EffectsManager : public QObject { QHash m_effectChainPresets; QList m_effectChainPresetsSorted; + + EffectChainPresetPointer m_defaultQuickEffectChainPreset; + QHash m_defaultPresets; DISALLOW_COPY_AND_ASSIGN(EffectsManager); diff --git a/src/effects/presets/effectxmlelements.h b/src/effects/presets/effectxmlelements.h index 5f8e95a4d3ef..aa3f60bdab55 100644 --- a/src/effects/presets/effectxmlelements.h +++ b/src/effects/presets/effectxmlelements.h @@ -10,6 +10,7 @@ const QString Rack("Rack"); const QString RackGroup("Group"); const QString ChainPresetList("ChainPresetList"); +const QString QuickEffectChainPresets("QuickEffectChains"); const QString ChainPresetName("ChainPresetName"); const QString ChainsRoot("Chains"); From 082f0c70c5731108675103e2144b87acde087cc7 Mon Sep 17 00:00:00 2001 From: Be Date: Mon, 27 Apr 2020 13:52:29 -0500 Subject: [PATCH 116/443] DlgPrefEQ: remove comboboxes for QuickEffects The QuickEffect chains are now loaded from presets saved in effects.xml by EffectsManager. --- src/effects/effectsmanager.cpp | 9 ----- src/effects/effectsmanager.h | 5 --- src/preferences/dialog/dlgprefeq.cpp | 54 ---------------------------- src/preferences/dialog/dlgprefeq.h | 3 -- 4 files changed, 71 deletions(-) diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index 1d5b73920a13..ba89b41b4395 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -164,15 +164,6 @@ void EffectsManager::loadOutputEffect(const int iEffectSlotNumber, } } -void EffectsManager::loadQuickEffect(const QString& deckGroup, - const int iEffectSlotNumber, const EffectManifestPointer pManifest) { - auto pChainSlot = m_quickEffectChainSlots.value(deckGroup); - VERIFY_OR_DEBUG_ASSERT(pChainSlot) { - return; - } - loadEffect(pChainSlot, iEffectSlotNumber, pManifest); -} - void EffectsManager::loadEqualizerEffect(const QString& deckGroup, const int iEffectSlotNumber, const EffectManifestPointer pManifest) { auto pChainSlot = m_equalizerEffectChainSlots.value(deckGroup); diff --git a/src/effects/effectsmanager.h b/src/effects/effectsmanager.h index 4c1df98d1298..64bd7832c811 100644 --- a/src/effects/effectsmanager.h +++ b/src/effects/effectsmanager.h @@ -95,11 +95,6 @@ class EffectsManager : public QObject { const int iEffectSlotNumber, const EffectManifestPointer pManifest); - void loadQuickEffect( - const QString& group, - const int iEffectSlotNumber, - const EffectManifestPointer pManifest); - void loadEqualizerEffect(const QString& group, const int iEffectSlotNumber, const EffectManifestPointer pManifest); diff --git a/src/preferences/dialog/dlgprefeq.cpp b/src/preferences/dialog/dlgprefeq.cpp index 1f680ffd8982..7980716e8a79 100644 --- a/src/preferences/dialog/dlgprefeq.cpp +++ b/src/preferences/dialog/dlgprefeq.cpp @@ -36,7 +36,6 @@ const QString kEqsOnly = "EQsOnly"; const QString kSingleEq = "SingleEQEffect"; const QString kDefaultEqId = BiquadFullKillEQEffect::getId() + " Built-in"; const QString kDefaultMasterEqId = QString(); -const QString kDefaultQuickEffectId = FilterEffect::getId() + " Built-in"; const int kFrequencyUpperLimit = 20050; const int kFrequencyLowerLimit = 16; @@ -91,9 +90,6 @@ DlgPrefEQ::DlgPrefEQ(QWidget* pParent, EffectsManager* pEffectsManager, DlgPrefEQ::~DlgPrefEQ() { qDeleteAll(m_deckEqEffectSelectors); m_deckEqEffectSelectors.clear(); - - qDeleteAll(m_deckQuickEffectSelectors); - m_deckQuickEffectSelectors.clear(); } void DlgPrefEQ::slotNumDecksChanged(double numDecks) { @@ -113,12 +109,6 @@ void DlgPrefEQ::slotNumDecksChanged(double numDecks) { connect(eqComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(slotEffectChangedOnDeck(int))); - // Create the drop down list for EQs - QComboBox* quickEffectComboBox = new QComboBox(this); - m_deckQuickEffectSelectors.append(quickEffectComboBox); - connect(quickEffectComboBox, SIGNAL(currentIndexChanged(int)), - this, SLOT(slotEffectChangedOnDeck(int))); - if (deckNo == 1) { m_firstSelectorLabel = label; if (CheckBoxEqOnly->isChecked()) { @@ -129,7 +119,6 @@ void DlgPrefEQ::slotNumDecksChanged(double numDecks) { // Setup the GUI gridLayout_3->addWidget(label, deckNo, 0); gridLayout_3->addWidget(eqComboBox, deckNo, 1); - gridLayout_3->addWidget(quickEffectComboBox, deckNo, 2); gridLayout_3->addItem(new QSpacerItem( 40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum), deckNo, 3, 1, 1); @@ -155,21 +144,6 @@ void DlgPrefEQ::slotNumDecksChanged(double numDecks) { } m_deckEqEffectSelectors[i]->setCurrentIndex(selectedEQEffectIndex); - - QString configuredQuickEffect = m_pConfig->getValue(ConfigKey(kConfigKey, - "QuickEffectForGroup_" + group), kDefaultQuickEffectId); - const EffectManifestPointer pQuickEffectManifest = - m_pEffectsManager->getManifestFromUniqueId(configuredQuickEffect); - - int selectedQuickEffectIndex = 0; - if (pQuickEffectManifest) { - selectedQuickEffectIndex = m_deckQuickEffectSelectors[i]->findData( - QVariant(pQuickEffectManifest->uniqueId())); - } else { - // Select "None" - selectedQuickEffectIndex = m_deckQuickEffectSelectors[i]->count() - 1; - } - m_deckQuickEffectSelectors[i]->setCurrentIndex(selectedQuickEffectIndex); } applySelections(); slotSingleEqChecked(CheckBoxSingleEqEffect->isChecked()); @@ -206,7 +180,6 @@ void DlgPrefEQ::slotPopulateDeckEffectSelectors() { } populateDeckBoxList(m_deckEqEffectSelectors, filterEQ); - populateDeckBoxList(m_deckQuickEffectSelectors, hasSuperKnobLinking); m_inSlotPopulateDeckEffectSelectors = false; } @@ -255,18 +228,14 @@ void DlgPrefEQ::slotSingleEqChecked(int checked) { m_pConfig->set(ConfigKey(kConfigKey, kSingleEq), do_hide ? QString("yes") : QString("no")); int deck1EQIndex = m_deckEqEffectSelectors.at(0)->currentIndex(); - int deck1QuickEffectIndex = m_deckQuickEffectSelectors.at(0)->currentIndex(); for (int i = 2; i < m_deckEqEffectSelectors.size() + 1; ++i) { if (do_hide) { m_deckEqEffectSelectors.at(i-1)->setCurrentIndex(deck1EQIndex); - m_deckQuickEffectSelectors.at(i-1)->setCurrentIndex(deck1QuickEffectIndex); gridLayout_3->itemAtPosition(i, 0)->widget()->hide(); gridLayout_3->itemAtPosition(i, 1)->widget()->hide(); - gridLayout_3->itemAtPosition(i, 2)->widget()->hide(); } else { gridLayout_3->itemAtPosition(i, 0)->widget()->show(); gridLayout_3->itemAtPosition(i, 1)->widget()->show(); - gridLayout_3->itemAtPosition(i, 2)->widget()->show(); } } @@ -344,10 +313,6 @@ void DlgPrefEQ::slotResetToDefaults() { pCombo->setCurrentIndex( pCombo->findData(kDefaultEqId)); } - for (QComboBox* pCombo : m_deckQuickEffectSelectors) { - pCombo->setCurrentIndex( - pCombo->findData(kDefaultQuickEffectId)); - } loadSettings(); CheckBoxBypass->setChecked(Qt::Unchecked); CheckBoxEqOnly->setChecked(Qt::Checked); @@ -368,10 +333,6 @@ void DlgPrefEQ::slotEffectChangedOnDeck(int effectIndex) { } QList* pBoxList = &m_deckEqEffectSelectors; - if (m_deckQuickEffectSelectors.contains(c)) { - pBoxList = &m_deckQuickEffectSelectors; - } - int deckNumber = pBoxList->indexOf(c); // If we are in single-effect mode and the first effect was changed, // change the others as well. @@ -399,11 +360,6 @@ void DlgPrefEQ::applySelections() { std::placeholders::_1, std::placeholders::_2, std::placeholders::_3); applySelectionsToDecks(m_deckEqEffectSelectors, m_eqIndiciesOnUpdate, loadFunc, "EffectForGroup_"); - - loadFunc = std::bind(&EffectsManager::loadQuickEffect, m_pEffectsManager, - std::placeholders::_1, std::placeholders::_2, std::placeholders::_3); - applySelectionsToDecks(m_deckQuickEffectSelectors, m_quickEffectIndiciesOnUpdate, - loadFunc, "QuickEffectForGroup_"); } void DlgPrefEQ::applySelectionsToDecks( @@ -545,11 +501,6 @@ void DlgPrefEQ::slotUpdate() { for (const auto& box : m_deckEqEffectSelectors) { m_eqIndiciesOnUpdate.append(box->currentIndex()); } - - m_quickEffectIndiciesOnUpdate.clear(); - for (const auto& box : m_deckQuickEffectSelectors) { - m_quickEffectIndiciesOnUpdate.append(box->currentIndex()); - } } void DlgPrefEQ::slotUpdateEqAutoReset(int i) { @@ -748,11 +699,6 @@ QString DlgPrefEQ::getEQEffectGroupForDeck(int deck) const { PlayerManager::groupForDeck(deck)); } -QString DlgPrefEQ::getQuickEffectGroupForDeck(int deck) const { - return QuickEffectChainSlot::formatEffectSlotGroup( - PlayerManager::groupForDeck(deck)); -} - void DlgPrefEQ::slotMasterEQToDefault() { EffectSlotPointer pEffectSlot(m_pEffectMasterEQ); if (!pEffectSlot.isNull()) { diff --git a/src/preferences/dialog/dlgprefeq.h b/src/preferences/dialog/dlgprefeq.h index a3f57ee8a085..1fa001b3ac0d 100644 --- a/src/preferences/dialog/dlgprefeq.h +++ b/src/preferences/dialog/dlgprefeq.h @@ -40,7 +40,6 @@ class DlgPrefEQ : public DlgPreferencePage, public Ui::DlgPrefEQDlg { virtual ~DlgPrefEQ(); QString getEQEffectGroupForDeck(int deck) const; - QString getQuickEffectGroupForDeck(int deck) const; public slots: // Apply changes to widget @@ -96,7 +95,6 @@ class DlgPrefEQ : public DlgPreferencePage, public Ui::DlgPrefEQDlg { EffectsManager* m_pEffectsManager; QLabel* m_firstSelectorLabel; QList m_deckEqEffectSelectors; - QList m_deckQuickEffectSelectors; ControlProxy* m_pNumDecks; bool m_inSlotPopulateDeckEffectSelectors; @@ -111,7 +109,6 @@ class DlgPrefEQ : public DlgPreferencePage, public Ui::DlgPrefEQDlg { bool m_bGainAutoReset; QList m_eqIndiciesOnUpdate; - QList m_quickEffectIndiciesOnUpdate; }; #endif From c38eea96840bcb18ede751866d1f2b3bc3360627 Mon Sep 17 00:00:00 2001 From: Be Date: Mon, 27 Apr 2020 13:56:47 -0500 Subject: [PATCH 117/443] add WEffectChainPresetSelector widget so chain presets can be loaded to QuickEffects from skins --- CMakeLists.txt | 1 + src/effects/effectsmanager.cpp | 5 ++ src/effects/effectsmanager.h | 1 + src/skin/legacyskinparser.cpp | 11 ++++ src/skin/legacyskinparser.h | 1 + src/widget/weffectchainpresetselector.cpp | 67 +++++++++++++++++++++++ src/widget/weffectchainpresetselector.h | 26 +++++++++ 7 files changed, 112 insertions(+) create mode 100644 src/widget/weffectchainpresetselector.cpp create mode 100644 src/widget/weffectchainpresetselector.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 66176c8812b6..2b5e4f3c9fdf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -683,6 +683,7 @@ add_library(mixxx-lib STATIC EXCLUDE_FROM_ALL src/widget/weffectbuttonparameter.cpp src/widget/weffectchain.cpp src/widget/weffectchainpresetbutton.cpp + src/widget/weffectchainpresetselector.cpp src/widget/weffectparameter.cpp src/widget/weffectparameterbase.cpp src/widget/weffectparameterknob.cpp diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index ba89b41b4395..3081810dc25c 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -399,6 +399,7 @@ void EffectsManager::renameChainPreset(const QString& oldName) { m_effectChainPresets.insert(newName, pChainPreset); m_effectChainPresetsSorted.removeAt(index); m_effectChainPresetsSorted.insert(index, pChainPreset); + emit effectChainPresetListUpdated(); } void EffectsManager::deleteChainPreset(const QString& chainPresetName) { @@ -414,6 +415,7 @@ void EffectsManager::deleteChainPreset(const QString& chainPresetName) { EffectChainPresetPointer pChainPreset = m_effectChainPresets.take(chainPresetName); m_effectChainPresetsSorted.removeAll(pChainPreset); + emit effectChainPresetListUpdated(); } const QList EffectsManager::getAvailableEffectManifestsFiltered( @@ -892,6 +894,7 @@ void EffectsManager::loadEffectChainPresets() { } file.close(); } + emit effectChainPresetListUpdated(); } void EffectsManager::setChainPresetOrder(const QStringList& chainPresetList) { @@ -909,6 +912,7 @@ void EffectsManager::setChainPresetOrder(const QStringList& chainPresetList) { m_effectChainPresetsSorted.append(pChainPreset); } } + emit effectChainPresetListUpdated(); } const QString EffectsManager::getDisplayNameForEffectPreset(EffectPresetPointer pPreset) { @@ -949,6 +953,7 @@ void EffectsManager::savePresetFromStandardEffectChain(int chainNumber) { pChainPreset->setName(name); m_effectChainPresets.insert(name, pChainPreset); m_effectChainPresetsSorted.append(pChainPreset); + emit effectChainPresetListUpdated(); QString path(m_pConfig->getSettingsPath() + kEffectChainPresetDirectory); QDir effectsChainsDir(path); diff --git a/src/effects/effectsmanager.h b/src/effects/effectsmanager.h index 64bd7832c811..913bebb692a3 100644 --- a/src/effects/effectsmanager.h +++ b/src/effects/effectsmanager.h @@ -186,6 +186,7 @@ class EffectsManager : public QObject { signals: void visibleEffectsUpdated(); + void effectChainPresetListUpdated(); private slots: void loadChainPresetFromList(EffectChainSlot* pChainSlot, int listIndex); diff --git a/src/skin/legacyskinparser.cpp b/src/skin/legacyskinparser.cpp index 25576559496d..c038b0695eb3 100644 --- a/src/skin/legacyskinparser.cpp +++ b/src/skin/legacyskinparser.cpp @@ -42,6 +42,7 @@ #include "widget/weffectbuttonparameter.h" #include "widget/weffectchain.h" #include "widget/weffectchainpresetbutton.h" +#include "widget/weffectchainpresetselector.h" #include "widget/weffectparameter.h" #include "widget/weffectparameterbase.h" #include "widget/weffectparameterknob.h" @@ -555,6 +556,8 @@ QList LegacySkinParser::parseNode(const QDomElement& node) { result = wrapWidget(parseEffectChainName(node)); } else if (nodeName == "EffectChainPresetButton") { result = wrapWidget(parseEffectChainPresetButton(node)); + } else if (nodeName == "EffectChainPresetSelector") { + result = wrapWidget(parseEffectChainPresetSelector(node)); } else if (nodeName == "EffectName") { result = wrapWidget(parseEffectName(node)); } else if (nodeName == "EffectSelector") { @@ -1591,6 +1594,14 @@ QWidget* LegacySkinParser::parseEffectChainPresetButton(const QDomElement& node) return pButton; } +QWidget* LegacySkinParser::parseEffectChainPresetSelector(const QDomElement& node) { + WEffectChainPresetSelector* pSelector = new WEffectChainPresetSelector( + m_pParent, m_pEffectsManager); + commonWidgetSetup(node, pSelector); + pSelector->setup(node, *m_pContext); + return pSelector; +} + QWidget* LegacySkinParser::parseEffectName(const QDomElement& node) { WEffect* pEffect = new WEffect(m_pParent, m_pEffectsManager); setupLabelWidget(node, pEffect); diff --git a/src/skin/legacyskinparser.h b/src/skin/legacyskinparser.h index f1aa95a21ef0..5e264ce7a019 100644 --- a/src/skin/legacyskinparser.h +++ b/src/skin/legacyskinparser.h @@ -82,6 +82,7 @@ class LegacySkinParser : public QObject, public SkinParser { QWidget* parseBeatSpinBox(const QDomElement& node); QWidget* parseEffectChainName(const QDomElement& node); QWidget* parseEffectChainPresetButton(const QDomElement& node); + QWidget* parseEffectChainPresetSelector(const QDomElement& node); QWidget* parseEffectName(const QDomElement& node); QWidget* parseEffectParameterName(const QDomElement& node); QWidget* parseEffectParameterKnob(const QDomElement& node); diff --git a/src/widget/weffectchainpresetselector.cpp b/src/widget/weffectchainpresetselector.cpp new file mode 100644 index 000000000000..cfb89a91600a --- /dev/null +++ b/src/widget/weffectchainpresetselector.cpp @@ -0,0 +1,67 @@ +#include "widget/weffectchainpresetselector.h" + +#include + +#include "effects/effectsmanager.h" +#include "widget/effectwidgetutils.h" + +WEffectChainPresetSelector::WEffectChainPresetSelector( + QWidget* pParent, EffectsManager* pEffectsManager) + : QComboBox(pParent), + WBaseWidget(this), + m_pEffectsManager(pEffectsManager) { + // Prevent this widget from getting focused to avoid + // interfering with using the library via keyboard. + setFocusPolicy(Qt::NoFocus); +} + +void WEffectChainPresetSelector::setup(const QDomNode& node, const SkinContext& context) { + m_pChainSlot = EffectWidgetUtils::getEffectChainSlotFromNode( + node, context, m_pEffectsManager); + + VERIFY_OR_DEBUG_ASSERT(m_pChainSlot != nullptr) { + SKIN_WARNING(node, context) + << "EffectChainPresetSelector node could not attach to EffectChainSlot"; + return; + } + + connect(m_pEffectsManager, + &EffectsManager::effectChainPresetListUpdated, + this, + &WEffectChainPresetSelector::populate); + connect(m_pChainSlot.data(), + &EffectChainSlot::nameChanged, + this, + &WEffectChainPresetSelector::slotEffectChainNameChanged); + connect(this, + QOverload::of(&QComboBox::activated), + this, + &WEffectChainPresetSelector::slotEffectChainPresetSelected); + + populate(); +} + +void WEffectChainPresetSelector::populate() { + blockSignals(true); + clear(); + + QFontMetrics metrics(font()); + + for (const auto& pChainPreset : m_pEffectsManager->getAvailableChainPresets()) { + QString elidedDisplayName = metrics.elidedText(pChainPreset->name(), + Qt::ElideMiddle, + width() - 2); + addItem(elidedDisplayName, QVariant(pChainPreset->name())); + } + + slotEffectChainNameChanged(m_pChainSlot->presetName()); + blockSignals(false); +} + +void WEffectChainPresetSelector::slotEffectChainPresetSelected(int index) { + m_pEffectsManager->loadEffectChainPreset(m_pChainSlot.get(), currentData().toString()); +} + +void WEffectChainPresetSelector::slotEffectChainNameChanged(const QString& name) { + setCurrentIndex(findData(name)); +} diff --git a/src/widget/weffectchainpresetselector.h b/src/widget/weffectchainpresetselector.h new file mode 100644 index 000000000000..d54a632246df --- /dev/null +++ b/src/widget/weffectchainpresetselector.h @@ -0,0 +1,26 @@ +#pragma once + +#include +#include + +#include "effects/effectchainslot.h" +#include "skin/skincontext.h" + +class EffectsManager; + +class WEffectChainPresetSelector : public QComboBox, public WBaseWidget { + Q_OBJECT + public: + WEffectChainPresetSelector(QWidget* pParent, EffectsManager* pEffectsManager); + + void setup(const QDomNode& node, const SkinContext& context); + + private slots: + void populate(); + void slotEffectChainPresetSelected(int index); + void slotEffectChainNameChanged(const QString& name); + + private: + EffectsManager* m_pEffectsManager; + EffectChainSlotPointer m_pChainSlot; +}; From 30b88aa07dabe538bdded6c2b87529225e5da6a3 Mon Sep 17 00:00:00 2001 From: Be Date: Mon, 27 Apr 2020 14:18:51 -0500 Subject: [PATCH 118/443] QuickEffectChainSlot: move processing postfader so echo and reverb work as expected --- src/effects/specialeffectchainslots.cpp | 56 ++++++++++++++----------- src/effects/specialeffectchainslots.h | 5 ++- 2 files changed, 35 insertions(+), 26 deletions(-) diff --git a/src/effects/specialeffectchainslots.cpp b/src/effects/specialeffectchainslots.cpp index 1761a51d7b7c..75a97247f21d 100644 --- a/src/effects/specialeffectchainslots.cpp +++ b/src/effects/specialeffectchainslots.cpp @@ -72,13 +72,14 @@ QString OutputEffectChainSlot::formatEffectChainSlotGroup(const QString& group) return QString("[OutputEffectRack_%1]").arg(group); } - PerGroupEffectChainSlot::PerGroupEffectChainSlot(const QString& group, - const QString& chainSlotGroup, - EffectsManager* pEffectsManager) - : EffectChainSlot(chainSlotGroup, pEffectsManager, - SignalProcessingStage::Prefader, - chainSlotGroup) { + const QString& chainSlotGroup, + SignalProcessingStage stage, + EffectsManager* pEffectsManager) + : EffectChainSlot(chainSlotGroup, + pEffectsManager, + stage, + chainSlotGroup) { // Set the chain to be fully wet. m_pControlChainMix->set(1.0); sendParameterUpdate(); @@ -99,23 +100,28 @@ PerGroupEffectChainSlot::PerGroupEffectChainSlot(const QString& group, enableForInputChannel(*handleAndGroup); } -QuickEffectChainSlot::QuickEffectChainSlot(const QString& group, - EffectsManager* pEffectsManager) - : PerGroupEffectChainSlot(group, formatEffectChainSlotGroup(group), - pEffectsManager) { +QuickEffectChainSlot::QuickEffectChainSlot( + const QString& group, EffectsManager* pEffectsManager) + : PerGroupEffectChainSlot(group, + formatEffectChainSlotGroup(group), + SignalProcessingStage::Postfader, + pEffectsManager) { for (int i = 0; i < kNumEffectsPerUnit; ++i) { addEffectSlot(formatEffectSlotGroup(group, i)); m_effectSlots.at(i)->setEnabled(true); } } -void QuickEffectChainSlot::loadEffect( - const unsigned int iEffectSlotNumber, +void QuickEffectChainSlot::loadEffect(const unsigned int iEffectSlotNumber, const EffectManifestPointer pManifest, std::unique_ptr pProcessor, EffectPresetPointer pPreset, bool adoptMetaknobFromPreset) { - EffectChainSlot::loadEffect(iEffectSlotNumber, pManifest, std::move(pProcessor), pPreset, adoptMetaknobFromPreset); + EffectChainSlot::loadEffect(iEffectSlotNumber, + pManifest, + std::move(pProcessor), + pPreset, + adoptMetaknobFromPreset); slotControlChainSuperParameter(m_pControlChainSuperParameter->get(), true); } @@ -123,19 +129,21 @@ QString QuickEffectChainSlot::formatEffectChainSlotGroup(const QString& group) { return QString("[QuickEffectRack1_%1]").arg(group); } -QString QuickEffectChainSlot::formatEffectSlotGroup(const QString& group, - const int iEffectSlotNumber) { - return QString("[QuickEffectRack1_%1_Effect%2]") - .arg(group) - .arg(QString::number(iEffectSlotNumber + 1)); +QString QuickEffectChainSlot::formatEffectSlotGroup( + const QString& group, const int iEffectSlotNumber) { + return QString("[QuickEffectRack1_%1_Effect%2]") + .arg(group) + .arg(QString::number(iEffectSlotNumber + 1)); } - -EqualizerEffectChainSlot::EqualizerEffectChainSlot(const QString& group, - EffectsManager* pEffectsManager) - : PerGroupEffectChainSlot(group, formatEffectChainSlotGroup(group), - pEffectsManager), - m_pCOFilterWaveform(new ControlObject(ConfigKey(group, "filterWaveformEnable"))) { +EqualizerEffectChainSlot::EqualizerEffectChainSlot( + const QString& group, EffectsManager* pEffectsManager) + : PerGroupEffectChainSlot(group, + formatEffectChainSlotGroup(group), + SignalProcessingStage::Prefader, + pEffectsManager), + m_pCOFilterWaveform( + new ControlObject(ConfigKey(group, "filterWaveformEnable"))) { // Add a single effect slot addEffectSlot(formatEffectSlotGroup(group)); m_effectSlots[0]->setEnabled(true); diff --git a/src/effects/specialeffectchainslots.h b/src/effects/specialeffectchainslots.h index 4036b2bd1260..1bc61a9e6378 100644 --- a/src/effects/specialeffectchainslots.h +++ b/src/effects/specialeffectchainslots.h @@ -28,8 +28,9 @@ class OutputEffectChainSlot : public EffectChainSlot { class PerGroupEffectChainSlot : public EffectChainSlot { public: PerGroupEffectChainSlot(const QString& group, - const QString& chainSlotGroup, - EffectsManager* pEffectsManager); + const QString& chainSlotGroup, + SignalProcessingStage stage, + EffectsManager* pEffectsManager); }; class QuickEffectChainSlot : public PerGroupEffectChainSlot { From 2710889d962408c98913d3108964f7b46188d307 Mon Sep 17 00:00:00 2001 From: Be Date: Mon, 27 Apr 2020 14:32:23 -0500 Subject: [PATCH 119/443] EffectsManager: use old state of superknob for new chain presets and set QuickEffect superknobs to default state from their loaded chain presets on startup --- src/effects/effectsmanager.cpp | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index 3081810dc25c..b5d99dcc420f 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -230,12 +230,6 @@ void EffectsManager::loadEffectChainPreset(EffectChainSlot* pChainSlot, } pChainSlot->slotControlClear(1); - // Set the superknob before loading the effects so it does not change their - // metaknobs - pChainSlot->setSuperParameter(pPreset->superKnob()); - pChainSlot->setSuperParameterDefaultValue(pPreset->superKnob()); - pChainSlot->setMixMode(pPreset->mixMode()); - int effectSlot = 0; for (const auto& pEffectPreset : pPreset->effectPresets()) { if (pEffectPreset->isEmpty()) { @@ -262,7 +256,10 @@ void EffectsManager::loadEffectChainPreset(EffectChainSlot* pChainSlot, true); effectSlot++; } + pChainSlot->setMixMode(pPreset->mixMode()); + pChainSlot->setSuperParameterDefaultValue(pPreset->superKnob()); + pChainSlot->setSuperParameter(pChainSlot->getSuperParameter()); pChainSlot->setPresetName(pPreset->name()); } @@ -1041,10 +1038,10 @@ void EffectsManager::readEffectsXml() { if (!presetNameElement.isNull()) { QString deckGroup = presetNameElement.attribute("group"); auto pQuickEffectChainSlot = m_quickEffectChainSlots.value(deckGroup); - QString presetName = presetNameElement.text(); - loadEffectChainPreset(pQuickEffectChainSlot.get(), presetName); - if (pQuickEffectChainSlot != nullptr && !presetName.isEmpty() && - m_effectChainPresets.contains(presetName)) { + auto pChainPreset = m_effectChainPresets.value(presetNameElement.text()); + loadEffectChainPreset(pQuickEffectChainSlot.get(), pChainPreset); + if (pQuickEffectChainSlot != nullptr && pChainPreset != nullptr) { + pQuickEffectChainSlot->setSuperParameter(pChainPreset->superKnob()); unloadedQuickEffectChainSlots.remove(deckGroup); } } From e4a56ca1f3ee56d986b94e226c7b64256e635cec Mon Sep 17 00:00:00 2001 From: Be Date: Mon, 27 Apr 2020 14:33:34 -0500 Subject: [PATCH 120/443] Tango: add new WEffectChainPresetSelector widgets for QuickEffects This is just an ugly proof-of-concept right now. --- res/skins/Tango/quick_fx_knob_left.xml | 16 ++++++++++------ res/skins/Tango/quick_fx_knob_right.xml | 16 ++++++++++------ 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/res/skins/Tango/quick_fx_knob_left.xml b/res/skins/Tango/quick_fx_knob_left.xml index 98b20a7bb152..6f89aca51409 100644 --- a/res/skins/Tango/quick_fx_knob_left.xml +++ b/res/skins/Tango/quick_fx_knob_left.xml @@ -40,7 +40,7 @@ Variables: QuickEffectRack_enabled QuickFXButton 12f,24f - ,enabled + ,enabled @@ -80,7 +80,7 @@ Variables: - + @@ -99,7 +99,7 @@ Variables: QuickEffectRack_enabled QuickFXButton 24f,12f - ,enabled + ,enabled @@ -126,7 +126,7 @@ Variables: QuickEffectRack_enabled QuickFXButton 24f,12f - ,enabled + ,enabled @@ -139,15 +139,19 @@ Variables: - ,loaded + ,loaded visible + + + + 0min,30f - ,loaded + ,loaded visible diff --git a/res/skins/Tango/quick_fx_knob_right.xml b/res/skins/Tango/quick_fx_knob_right.xml index e0e783e4fda8..890d3d6bded5 100644 --- a/res/skins/Tango/quick_fx_knob_right.xml +++ b/res/skins/Tango/quick_fx_knob_right.xml @@ -45,7 +45,7 @@ Variables: @@ -66,7 +66,7 @@ Variables: QuickEffectRack_enabled QuickFXButton 12f,24f - ,enabled + ,enabled @@ -80,7 +80,7 @@ Variables: visible - + @@ -99,7 +99,7 @@ Variables: QuickEffectRack_enabled QuickFXButton 24f,12f - ,enabled + ,enabled @@ -126,7 +126,7 @@ Variables: QuickEffectRack_enabled QuickFXButton 24f,12f - ,enabled + ,enabled @@ -144,10 +144,14 @@ Variables: + + + + 0min,30f - ,loaded + ,loaded visible From 840a95085ab3b020b93335adfc9e14d50a081424 Mon Sep 17 00:00:00 2001 From: Be Date: Mon, 27 Apr 2020 15:00:54 -0500 Subject: [PATCH 121/443] rename HP Echoverb default effect chain preset to Echoverb HP --- res/effects/chains/{HP Echoverb.xml => Echoverb HP.xml} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename res/effects/chains/{HP Echoverb.xml => Echoverb HP.xml} (99%) diff --git a/res/effects/chains/HP Echoverb.xml b/res/effects/chains/Echoverb HP.xml similarity index 99% rename from res/effects/chains/HP Echoverb.xml rename to res/effects/chains/Echoverb HP.xml index 74deaacebd68..061c02ee1358 100644 --- a/res/effects/chains/HP Echoverb.xml +++ b/res/effects/chains/Echoverb HP.xml @@ -1,6 +1,6 @@ - HP Echoverb + Echoverb HP DRY+WET 0 From 41ed834cdc66119dd6fcb0822d9835a3eaa3f9a3 Mon Sep 17 00:00:00 2001 From: Be Date: Mon, 27 Apr 2020 15:06:35 -0500 Subject: [PATCH 122/443] DlgPrefEQ: remove remaining references to QuickEffects --- src/preferences/dialog/dlgprefeqdlg.ui | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/src/preferences/dialog/dlgprefeqdlg.ui b/src/preferences/dialog/dlgprefeqdlg.ui index 0313ed7824f5..ed8789d49f35 100644 --- a/src/preferences/dialog/dlgprefeqdlg.ui +++ b/src/preferences/dialog/dlgprefeqdlg.ui @@ -17,7 +17,7 @@ - Deck Equalizers and Quick Effects + Deck Equalizers @@ -78,19 +78,6 @@ - - - - - 75 - true - - - - Quick Effect - - - From 8a04fafca492bb8173638bf6d97451e2476f84a7 Mon Sep 17 00:00:00 2001 From: Be Date: Mon, 27 Apr 2020 16:29:32 -0500 Subject: [PATCH 123/443] EffectChainSlot: add loaded_preset indicator ControlObject Controllers such as the Kontrol S4 Mk3 can use this to indicate which preset is loaded in a QuickEffect chain. --- src/effects/effectchainslot.cpp | 8 ++++++++ src/effects/effectchainslot.h | 2 ++ src/effects/effectsmanager.cpp | 1 + 3 files changed, 11 insertions(+) diff --git a/src/effects/effectchainslot.cpp b/src/effects/effectchainslot.cpp index 7b5af433104d..8548d8e2509d 100644 --- a/src/effects/effectchainslot.cpp +++ b/src/effects/effectchainslot.cpp @@ -80,6 +80,9 @@ EffectChainSlot::EffectChainSlot(const QString& group, this, &EffectChainSlot::slotControlLoadChainPreset); + m_pControlLoadedPreset = new ControlObject(ConfigKey(m_group, "loaded_preset")); + m_pControlLoadedPreset->setReadOnly(); + m_pControlChainNextPreset = new ControlPushButton(ConfigKey(m_group, "next_chain")); connect(m_pControlChainNextPreset, &ControlObject::valueChanged, this, &EffectChainSlot::slotControlChainNextPreset); @@ -133,6 +136,7 @@ EffectChainSlot::~EffectChainSlot() { delete m_pControlChainSuperParameter; delete m_pControlChainMixMode; delete m_pControlLoadPreset; + delete m_pControlLoadedPreset; delete m_pControlChainPrevPreset; delete m_pControlChainNextPreset; delete m_pControlChainSelector; @@ -187,6 +191,10 @@ void EffectChainSlot::setPresetName(const QString& name) { emit nameChanged(name); } +void EffectChainSlot::setLoadedPresetIndex(int index) { + m_pControlLoadedPreset->setAndConfirm(index); +} + void EffectChainSlot::loadEffect(const unsigned int iEffectSlotNumber, const EffectManifestPointer pManifest, std::unique_ptr pProcessor, diff --git a/src/effects/effectchainslot.h b/src/effects/effectchainslot.h index 55f43b21fa4c..2a32723f4777 100644 --- a/src/effects/effectchainslot.h +++ b/src/effects/effectchainslot.h @@ -79,6 +79,7 @@ class EffectChainSlot : public QObject { const QString& presetName() const; void setPresetName(const QString& name); + void setLoadedPresetIndex(int index); // Get the human-readable description of the EffectChain QString description() const; @@ -163,6 +164,7 @@ class EffectChainSlot : public QObject { ControlPushButton* m_pControlChainEnabled; ControlPushButton* m_pControlChainMixMode; ControlObject* m_pControlLoadPreset; + ControlObject* m_pControlLoadedPreset; ControlEncoder* m_pControlChainSelector; ControlPushButton* m_pControlChainNextPreset; ControlPushButton* m_pControlChainPrevPreset; diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index b5d99dcc420f..184f1cbe121f 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -261,6 +261,7 @@ void EffectsManager::loadEffectChainPreset(EffectChainSlot* pChainSlot, pChainSlot->setSuperParameterDefaultValue(pPreset->superKnob()); pChainSlot->setSuperParameter(pChainSlot->getSuperParameter()); pChainSlot->setPresetName(pPreset->name()); + pChainSlot->setLoadedPresetIndex(m_effectChainPresetsSorted.indexOf(pPreset)); } void EffectsManager::loadEffectChainPreset(EffectChainSlot* pChainSlot, const QString& name) { From 0113906b58e6c89d71cc6f83f97135691ef59d07 Mon Sep 17 00:00:00 2001 From: Be Date: Mon, 27 Apr 2020 18:53:48 -0500 Subject: [PATCH 124/443] EffectsManager: switch back to setting superknob from chain preset After mapping the QuickEffect superknob on my controller, it is clear that this is important to avoid accidents when switching between chain presets where the neutral point is with the knob centered or with the knob turned left. --- src/effects/effectsmanager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index 184f1cbe121f..01657beb4a61 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -259,7 +259,7 @@ void EffectsManager::loadEffectChainPreset(EffectChainSlot* pChainSlot, pChainSlot->setMixMode(pPreset->mixMode()); pChainSlot->setSuperParameterDefaultValue(pPreset->superKnob()); - pChainSlot->setSuperParameter(pChainSlot->getSuperParameter()); + pChainSlot->setSuperParameter(pPreset->superKnob()); pChainSlot->setPresetName(pPreset->name()); pChainSlot->setLoadedPresetIndex(m_effectChainPresetsSorted.indexOf(pPreset)); } From 50a45e73372a0f68c781e03ce7068e1c765a3ae0 Mon Sep 17 00:00:00 2001 From: Be Date: Mon, 27 Apr 2020 20:58:03 -0500 Subject: [PATCH 125/443] add Filter Echo default effect chain preset --- res/effects/chains/Filter Echo.xml | 87 ++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 res/effects/chains/Filter Echo.xml diff --git a/res/effects/chains/Filter Echo.xml b/res/effects/chains/Filter Echo.xml new file mode 100644 index 000000000000..0dc535c055f9 --- /dev/null +++ b/res/effects/chains/Filter Echo.xml @@ -0,0 +1,87 @@ + + + Filter Echo + DRY/WET + 0.5 + + + 0.5 + org.mixxx.effects.filter + BuiltIn + + + lpf + 22050 + LINKED_LEFT + 0 + 0 + + + q + 0.707107 + NONE + 0 + 0 + + + hpf + 13 + LINKED_RIGHT + 0 + 0 + + + + + 0.5 + org.mixxx.effects.echo + BuiltIn + + + delay_time + 1.0 + NONE + 0 + 0 + + + feedback_amount + 0.707946 + NONE + 0 + 0 + + + pingpong_amount + 0 + NONE + 0 + 0 + + + send_amount + 0 + LINKED_LEFT_RIGHT + 0 + 0 + + + quantize + 1 + NONE + 0 + 0 + + + triplet + 0 + NONE + 0 + 0 + + + + + + + From f671f9a58b49088c13cc4f7e72e5c9d723af7645 Mon Sep 17 00:00:00 2001 From: Be Date: Wed, 29 Apr 2020 09:51:50 -0500 Subject: [PATCH 126/443] EffectManifestParameter: remove unused functions --- src/effects/backends/effectmanifestparameter.h | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/src/effects/backends/effectmanifestparameter.h b/src/effects/backends/effectmanifestparameter.h index 31a0e741771c..d4a810d5ef54 100644 --- a/src/effects/backends/effectmanifestparameter.h +++ b/src/effects/backends/effectmanifestparameter.h @@ -97,8 +97,7 @@ class EffectManifestParameter { m_neutralPointOnScale(0.0), m_default(0), m_minimum(0), - m_maximum(1.0), - m_showInParametertSlot(true) { + m_maximum(1.0) { } ~EffectManifestParameter() { @@ -211,18 +210,6 @@ class EffectManifestParameter { m_neutralPointOnScale = neutralPoint; } - - // These store the mapping between the parameter slot and - // the effective parameter which is loaded onto the slot. - // This is required because we have only 8 parameter slots, but - // LV2 or VST effects can have more then 8. - bool showInParameterSlot() const { - return m_showInParametertSlot; - } - void setShowInParameterSlot(double show) { - m_showInParametertSlot = show; - } - //////////////////////////////////////////////////////////////////////////////// // Value Settings //////////////////////////////////////////////////////////////////////////////// @@ -291,8 +278,6 @@ class EffectManifestParameter { /// Each pair has the following form: /// name - value QList > m_steps; - - bool m_showInParametertSlot; }; QDebug operator<<(QDebug dbg, const EffectManifestParameter& parameter); From 4a6a60ebe80514322b6fbb39c6e3c581bb936135 Mon Sep 17 00:00:00 2001 From: Be Date: Fri, 1 May 2020 13:09:33 -0500 Subject: [PATCH 127/443] extract EffectChainPresetManager class from EffectsManager EffectsManager got way too big. --- CMakeLists.txt | 1 + src/effects/effectsmanager.cpp | 418 ++-------------- src/effects/effectsmanager.h | 42 +- .../presets/effectchainpresetmanager.cpp | 453 ++++++++++++++++++ .../presets/effectchainpresetmanager.h | 69 +++ src/effects/presets/effectxmlelements.h | 1 + src/preferences/dialog/dlgprefeffects.cpp | 21 +- src/preferences/dialog/dlgprefeffects.h | 1 + src/widget/weffectchainpresetbutton.cpp | 2 +- src/widget/weffectchainpresetselector.cpp | 3 +- 10 files changed, 584 insertions(+), 427 deletions(-) create mode 100644 src/effects/presets/effectchainpresetmanager.cpp create mode 100644 src/effects/presets/effectchainpresetmanager.h diff --git a/CMakeLists.txt b/CMakeLists.txt index e94e324d0d91..c8a8d724f036 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -269,6 +269,7 @@ add_library(mixxx-lib STATIC EXCLUDE_FROM_ALL src/effects/backends/builtin/tremoloeffect.cpp src/effects/presets/effectpreset.cpp src/effects/presets/effectchainpreset.cpp + src/effects/presets/effectchainpresetmanager.cpp src/effects/presets/effectparameterpreset.cpp src/encoder/encoder.cpp src/encoder/encoderbroadcastsettings.cpp diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index 01657beb4a61..caba9c4adf83 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -1,8 +1,6 @@ #include "effects/effectsmanager.h" #include -#include -#include #include #include @@ -56,13 +54,10 @@ EffectsManager::EffectsManager(QObject* pParent, addEffectsBackend(EffectsBackendPointer(new LV2Backend())); #endif - // Generate the default QuickEffect chain preset instead of shipping it in - // res/effects/chains because this uses the translated name. EffectManifestPointer filterEffectManifest = getManifest(FilterEffect::getId(), EffectBackendType::BuiltIn); - m_defaultQuickEffectChainPreset = EffectChainPresetPointer(new EffectChainPreset( - EffectPresetPointer(new EffectPreset(filterEffectManifest)))); - m_defaultQuickEffectChainPreset->setName(filterEffectManifest->displayName()); + m_pChainPresetManager = EffectChainPresetManagerPointer( + new EffectChainPresetManager(pConfig, this, filterEffectManifest)); } EffectsManager::~EffectsManager() { @@ -261,14 +256,14 @@ void EffectsManager::loadEffectChainPreset(EffectChainSlot* pChainSlot, pChainSlot->setSuperParameterDefaultValue(pPreset->superKnob()); pChainSlot->setSuperParameter(pPreset->superKnob()); pChainSlot->setPresetName(pPreset->name()); - pChainSlot->setLoadedPresetIndex(m_effectChainPresetsSorted.indexOf(pPreset)); + pChainSlot->setLoadedPresetIndex(m_pChainPresetManager->presetIndex(pPreset)); } void EffectsManager::loadEffectChainPreset(EffectChainSlot* pChainSlot, const QString& name) { VERIFY_OR_DEBUG_ASSERT(pChainSlot != nullptr) { return; } - EffectChainPresetPointer pChainPreset = m_effectChainPresets.value(name); + EffectChainPresetPointer pChainPreset = m_pChainPresetManager->getPreset(name); VERIFY_OR_DEBUG_ASSERT(pChainPreset != nullptr) { return; } @@ -279,143 +274,6 @@ void EffectsManager::loadPresetToStandardChain(int chainNumber, EffectChainPrese loadEffectChainPreset(m_standardEffectChainSlots.at(chainNumber).get(), pPreset); } -void EffectsManager::importChainPreset() { - QStringList fileNames = QFileDialog::getOpenFileNames(nullptr, - tr("Import effect chain preset"), - QString(), - tr("Mixxx Effect Chain Presets") + " (*.xml)"); - - QString importFailed = tr("Error importing effect chain preset"); - for (int i = 0; i < fileNames.size(); ++i) { - QString filePath = fileNames.at(i); - QDomDocument doc; - QFile file(filePath); - if (!file.open(QIODevice::ReadOnly)) { - QMessageBox::critical(nullptr, importFailed, importFailed + " " + filePath); - continue; - } else if (!doc.setContent(&file)) { - file.close(); - QMessageBox::critical(nullptr, importFailed, importFailed + " " + filePath); - continue; - } - file.close(); - - EffectChainPresetPointer pChainPreset(new EffectChainPreset(doc.documentElement())); - if (!pChainPreset->isEmpty()) { - if (m_effectChainPresets.contains(pChainPreset->name())) { - bool okay = false; - QString newName = QInputDialog::getText(nullptr, - tr("Rename effect chain preset"), - tr("An effect chain preset with the name") + " " + pChainPreset->name() + " " + tr("already exists. Choose a new name for the imported effect chain preset:"), - QLineEdit::Normal, - QString(), - &okay); - if (!okay) { - continue; - } - pChainPreset->setName(newName); - } - - // An imported chain preset might contain an LV2 plugin that the user does not - // have installed. - for (const auto pEffectPreset : pChainPreset->effectPresets()) { - if (pEffectPreset == nullptr || pEffectPreset->isEmpty()) { - continue; - } - - bool effectSupported = false; - for (EffectManifestPointer pManifest : m_availableEffectManifests) { - if (pManifest->id() == pEffectPreset->id() && - pManifest->backendType() == pEffectPreset->backendType()) { - effectSupported = true; - break; - } - } - if (!effectSupported) { - QMessageBox::critical(nullptr, importFailed, tr("The effect chain imported from") + " " + filePath + " " + tr("contains an effect that Mixxx does not support") + ":\n\n" + pEffectPreset->id() + "\n\n" + tr("If you load this chain preset, the unsupported effect will not be loaded with it.")); - } - } - - m_effectChainPresets.insert(pChainPreset->name(), pChainPreset); - m_effectChainPresetsSorted.append(pChainPreset); - } else { - QMessageBox::critical(nullptr, importFailed, importFailed + " " + filePath); - } - } -} - -void EffectsManager::exportChainPreset(const QString& chainPresetName) { - VERIFY_OR_DEBUG_ASSERT(m_effectChainPresets.contains(chainPresetName)) { - return; - } - - EffectChainPresetPointer pChainPreset = m_effectChainPresets.value(chainPresetName); - VERIFY_OR_DEBUG_ASSERT(!pChainPreset->isEmpty()) { - return; - } - - QString fileName = QFileDialog::getSaveFileName(nullptr, - tr("Save effect chain preset"), - QString(), - tr("Mixxx Effect Chain Presets") + " (*.xml)"); - - QFile file(fileName); - if (!file.open(QIODevice::Truncate | QIODevice::WriteOnly)) { - file.close(); - QMessageBox::critical(nullptr, - tr("Error exporting effect chain preset"), - tr("Could not save effect chain preset") + " " + chainPresetName + tr("to file") + " " + fileName); - return; - } - - QDomDocument doc(EffectXml::Chain); - doc.setContent(QString("\n")); - doc.appendChild(pChainPreset->toXml(&doc)); - file.write(doc.toString().toUtf8()); - file.close(); -} - -void EffectsManager::renameChainPreset(const QString& oldName) { - VERIFY_OR_DEBUG_ASSERT(m_effectChainPresets.contains(oldName)) { - return; - } - - bool okay = false; - QString newName = QInputDialog::getText(nullptr, - tr("Rename effect chain preset"), - tr("New name effect chain preset") + " " + oldName, - QLineEdit::Normal, - oldName, - &okay); - if (!okay) { - return; - } - - EffectChainPresetPointer pChainPreset = m_effectChainPresets.take(oldName); - int index = m_effectChainPresetsSorted.indexOf(pChainPreset); - pChainPreset->setName(newName); - m_effectChainPresets.insert(newName, pChainPreset); - m_effectChainPresetsSorted.removeAt(index); - m_effectChainPresetsSorted.insert(index, pChainPreset); - emit effectChainPresetListUpdated(); -} - -void EffectsManager::deleteChainPreset(const QString& chainPresetName) { - VERIFY_OR_DEBUG_ASSERT(m_effectChainPresets.contains(chainPresetName)) { - return; - } - auto pressedButton = QMessageBox::question(nullptr, - tr("Remove effect chain preset"), - tr("Are you sure you want to delete the effect chain preset") + " " + chainPresetName + "?"); - if (pressedButton != QMessageBox::Yes) { - return; - } - - EffectChainPresetPointer pChainPreset = m_effectChainPresets.take(chainPresetName); - m_effectChainPresetsSorted.removeAll(pChainPreset); - emit effectChainPresetListUpdated(); -} - const QList EffectsManager::getAvailableEffectManifestsFiltered( EffectManifestFilterFnc filter) const { if (filter == nullptr) { @@ -585,30 +443,13 @@ void EffectsManager::connectChainSlotSignals(EffectChainSlotPointer pChainSlot) } void EffectsManager::loadChainPresetFromList(EffectChainSlot* pChainSlot, int listIndex) { - if (listIndex < 0 || listIndex >= m_effectChainPresets.size()) { - listIndex = 0; - } - loadEffectChainPreset(pChainSlot, - m_effectChainPresetsSorted.at(listIndex)); + loadEffectChainPreset(pChainSlot, m_pChainPresetManager->presetAtIndex(listIndex)); } void EffectsManager::loadChainPresetSelector(EffectChainSlot* pChainSlot, int delta) { - int listIndex = 0; - if (m_effectChainPresets.contains(pChainSlot->presetName())) { - EffectChainPresetPointer pLoadedPreset = - m_effectChainPresets.value(pChainSlot->presetName()); - listIndex = m_effectChainPresetsSorted.indexOf(pLoadedPreset); - } - - listIndex += delta; - if (listIndex >= m_effectChainPresetsSorted.size()) { - listIndex = 0; - } else if (listIndex < 0) { - listIndex = m_effectChainPresetsSorted.size() - 1; - } - - loadEffectChainPreset(pChainSlot, - m_effectChainPresetsSorted.at(listIndex)); + int listIndex = m_pChainPresetManager->presetIndex(pChainSlot->presetName()); + auto pChainPreset = m_pChainPresetManager->presetAtIndex(listIndex + delta); + loadEffectChainPreset(pChainSlot, pChainPreset); } EffectChainSlotPointer EffectsManager::getEffectChainSlot( @@ -674,7 +515,6 @@ void EffectsManager::setup() { addOutputEffectChainSlot(); loadDefaultEffectPresets(); - loadEffectChainPresets(); readEffectsXml(); } @@ -845,74 +685,6 @@ void EffectsManager::saveDefaultForEffect(int unitNumber, int effectNumber) { saveDefaultForEffect(pPreset); } -void EffectsManager::loadEffectChainPresets() { - QString savedPresetsPath(m_pConfig->getSettingsPath() + kEffectChainPresetDirectory); - QDir savedPresetsDir(savedPresetsPath); - - // On first run of Mixxx, copy chain presets from the resource folder to the - // user settings folder. This allows us to ship default chain presets with - // Mixxx while letting the user delete our defaults if they do not want them. - // The user can always copy the files again manually or use the Import - // button in DlgPrefEffects. - if (!savedPresetsDir.exists()) { - savedPresetsDir.mkpath(savedPresetsPath); - QString defaultPresetsPath(m_pConfig->getResourcePath() + kEffectChainPresetDirectory); - QDir defaultChainPresetsDir(defaultPresetsPath); - defaultChainPresetsDir.setFilter(QDir::Files | QDir::Readable); - for (const auto& fileName : defaultChainPresetsDir.entryList()) { - QFile::copy(defaultPresetsPath + "/" + fileName, savedPresetsPath + "/" + fileName); - } - - QFile file(savedPresetsPath + "/" + m_defaultQuickEffectChainPreset->name() + ".xml"); - if (file.open(QIODevice::Truncate | QIODevice::WriteOnly)) { - QDomDocument doc(EffectXml::Chain); - doc.setContent(QString("\n")); - doc.appendChild(m_defaultQuickEffectChainPreset->toXml(&doc)); - file.write(doc.toString().toUtf8()); - } - file.close(); - } - - savedPresetsDir.setFilter(QDir::Files | QDir::Readable); - QStringList fileList = savedPresetsDir.entryList(); - for (const auto& filePath : fileList) { - QFile file(savedPresetsPath + "/" + filePath); - if (!file.open(QIODevice::ReadOnly)) { - continue; - } - QDomDocument doc; - if (!doc.setContent(&file)) { - file.close(); - continue; - } - EffectChainPresetPointer pEffectChainPreset(new EffectChainPreset(doc.documentElement())); - if (!pEffectChainPreset->isEmpty()) { - m_effectChainPresets.insert(pEffectChainPreset->name(), pEffectChainPreset); - m_effectChainPresetsSorted.append(pEffectChainPreset); - } - file.close(); - } - emit effectChainPresetListUpdated(); -} - -void EffectsManager::setChainPresetOrder(const QStringList& chainPresetList) { - m_effectChainPresetsSorted.clear(); - - for (const auto chainPresetName : chainPresetList) { - VERIFY_OR_DEBUG_ASSERT(m_effectChainPresets.contains(chainPresetName)) { - continue; - } - m_effectChainPresetsSorted.append(m_effectChainPresets.value(chainPresetName)); - } - - for (const auto pChainPreset : m_effectChainPresets) { - VERIFY_OR_DEBUG_ASSERT(m_effectChainPresetsSorted.contains(pChainPreset)) { - m_effectChainPresetsSorted.append(pChainPreset); - } - } - emit effectChainPresetListUpdated(); -} - const QString EffectsManager::getDisplayNameForEffectPreset(EffectPresetPointer pPreset) { QString displayName(tr("None")); if (pPreset == nullptr || pPreset->isEmpty()) { @@ -935,170 +707,42 @@ const QString EffectsManager::getDisplayNameForEffectPreset(EffectPresetPointer void EffectsManager::savePresetFromStandardEffectChain(int chainNumber) { StandardEffectChainSlotPointer pStandardChainSlot = m_standardEffectChainSlots.at(chainNumber); EffectChainSlot* genericChainSlot = static_cast(pStandardChainSlot.get()); - EffectChainPresetPointer pChainPreset(new EffectChainPreset(genericChainSlot)); - - bool okay = false; - QString name = QInputDialog::getText(nullptr, - tr("Save preset for effect chain %1").arg(QString::number(chainNumber)), - tr("Name for new effect chain preset"), - QLineEdit::Normal, - pChainPreset->name(), - &okay); - if (!okay) { - return; - } - - pChainPreset->setName(name); - m_effectChainPresets.insert(name, pChainPreset); - m_effectChainPresetsSorted.append(pChainPreset); - emit effectChainPresetListUpdated(); - - QString path(m_pConfig->getSettingsPath() + kEffectChainPresetDirectory); - QDir effectsChainsDir(path); - if (!effectsChainsDir.exists()) { - effectsChainsDir.mkpath(path); - } - // TODO: sanitize file name? - QFile file(path + "/" + name + ".xml"); - if (!file.open(QIODevice::Truncate | QIODevice::WriteOnly)) { - return; - } - - QDomDocument doc(EffectXml::Chain); - doc.setContent(QString("\n")); - doc.appendChild(pChainPreset->toXml(&doc)); - file.write(doc.toString().toUtf8()); - file.close(); -} - -const QList EffectsManager::getAvailableChainPresets() const { - return m_effectChainPresetsSorted; + EffectChainPresetPointer pPreset(new EffectChainPreset(genericChainSlot)); + m_pChainPresetManager->savePreset(pPreset); } void EffectsManager::readEffectsXml() { - QDir settingsPath(m_pConfig->getSettingsPath()); - QFile file(settingsPath.absoluteFilePath("effects.xml")); - QDomDocument doc; - - if (!file.open(QIODevice::ReadOnly)) { - for (auto pQuickEffectChainSlot : m_quickEffectChainSlots) { - loadEffectChainPreset(pQuickEffectChainSlot.get(), m_defaultQuickEffectChainPreset); - } - return; - } else if (!doc.setContent(&file)) { - file.close(); - for (auto pQuickEffectChainSlot : m_quickEffectChainSlots) { - loadEffectChainPreset(pQuickEffectChainSlot.get(), m_defaultQuickEffectChainPreset); - } - return; + QStringList deckStrings; + for (auto it = m_quickEffectChainSlots.begin(); it != m_quickEffectChainSlots.end(); it++) { + deckStrings << it.key(); } - file.close(); - - // Reload state of standard chains - QDomElement root = doc.documentElement(); - QDomElement rackElement = XmlParse::selectElement(root, EffectXml::Rack); - QDomElement chainsElement = XmlParse::selectElement(rackElement, EffectXml::ChainsRoot); - QDomNodeList chainsList = chainsElement.elementsByTagName(EffectXml::Chain); + EffectsXmlData data = m_pChainPresetManager->readEffectsXml(deckStrings); - for (int i=0; isetSuperParameter(pChainPreset->superKnob()); - unloadedQuickEffectChainSlots.remove(deckGroup); - } - } - } - for (auto pQuickEffectChainSlot : unloadedQuickEffectChainSlots) { - loadEffectChainPreset(pQuickEffectChainSlot.get(), m_defaultQuickEffectChainPreset); + for (auto it = data.quickEffectChainPresets.begin(); + it != data.quickEffectChainPresets.end(); + it++) { + loadEffectChainPreset(m_quickEffectChainSlots.value(it.key()).get(), it.value()); } } void EffectsManager::saveEffectsXml() { - QDomDocument doc("MixxxEffects"); - doc.setContent(QString("\n")); - - // Save presets for current state of standard chains - QDomElement rootElement = doc.createElement("MixxxEffects"); - rootElement.setAttribute("schemaVersion", QString::number(EffectXml::kXmlSchemaVersion)); - doc.appendChild(rootElement); - QDomElement rackElement = doc.createElement(EffectXml::Rack); - rootElement.appendChild(rackElement); - QDomElement chainsElement = doc.createElement(EffectXml::ChainsRoot); - rackElement.appendChild(chainsElement); - for (const auto pChainSlot : m_standardEffectChainSlots) { - EffectChainSlot* genericChainSlot = static_cast(pChainSlot.get()); - chainsElement.appendChild(EffectChainPreset(genericChainSlot).toXml(&doc)); - } - - // Save order of custom chain presets - QDomElement chainPresetListElement = doc.createElement(EffectXml::ChainPresetList); - for (const auto pChainPreset : m_effectChainPresetsSorted) { - XmlParse::addElement(doc, - chainPresetListElement, - EffectXml::ChainPresetName, - pChainPreset->name()); - } - rootElement.appendChild(chainPresetListElement); - - // Save which presets are loaded to QuickEffects - QDomElement quickEffectPresetsElement = doc.createElement(EffectXml::QuickEffectChainPresets); + QHash quickEffectChainPresets; for (auto it = m_quickEffectChainSlots.begin(); it != m_quickEffectChainSlots.end(); it++) { - QDomElement quickEffectElement = XmlParse::addElement( - doc, - quickEffectPresetsElement, - EffectXml::ChainPresetName, - it.value()->presetName()); - quickEffectElement.setAttribute("group", it.key()); + auto pPreset = EffectChainPresetPointer(new EffectChainPreset(it.value().get())); + quickEffectChainPresets.insert(it.key(), pPreset); } - rootElement.appendChild(quickEffectPresetsElement); - QDir settingsPath(m_pConfig->getSettingsPath()); - if (!settingsPath.exists()) { - return; - } - QFile file(settingsPath.absoluteFilePath("effects.xml")); - if (!file.open(QIODevice::Truncate | QIODevice::WriteOnly)) { - return; + QList standardEffectChainPresets; + for (const auto& pChainSlot : m_standardEffectChainSlots) { + auto pPreset = EffectChainPresetPointer(new EffectChainPreset(pChainSlot.get())); + standardEffectChainPresets.append(pPreset); } - file.write(doc.toString().toUtf8()); - file.close(); + + m_pChainPresetManager->saveEffectsXml(EffectsXmlData{ + quickEffectChainPresets, standardEffectChainPresets}); } diff --git a/src/effects/effectsmanager.h b/src/effects/effectsmanager.h index 913bebb692a3..091b3a0c87ff 100644 --- a/src/effects/effectsmanager.h +++ b/src/effects/effectsmanager.h @@ -1,16 +1,17 @@ #pragma once -#include #include #include -#include -#include +#include #include +#include +#include #include "control/controlpotmeter.h" #include "control/controlpushbutton.h" -#include "effects/specialeffectchainslots.h" #include "effects/backends/effectmanifestparameter.h" +#include "effects/presets/effectchainpresetmanager.h" +#include "effects/specialeffectchainslots.h" #include "engine/channelhandle.h" #include "engine/effects/message.h" #include "preferences/usersettings.h" @@ -32,14 +33,9 @@ typedef QMap> ParameterMap; /// EffectSlots which use the EffectProcessors to create EngineEffects and add /// them to the audio engine. /// -/// EffectsManager saves/loads EffectChainPresets and EffectPresets. -/// EffectsManager maintains a list of custom EffectChainPresets in the -/// "effects/chains" folder in the user settings folder. The state of loaded -/// effects are saved as EffectChainPresets in the effects.xml file in the user -/// settings folder, which is used to restore the state of effects on startup. -/// Additionally, EffectsManager saves/loads EffectPresets in the -/// "effects/defaults" folder in the user settings folder to allow users to -/// specify default states when each effect is loaded. +/// EffectsManager saves/loads EffectPresets in the "effects/defaults" folder in +/// the user settings folder to allow users to specify default states when each +/// effect is loaded. /// /// To maintain clear separation of responsibilities, GUI classes should NOT /// access the EffectChainSlots or EffectSlots directly. They should interface @@ -61,6 +57,10 @@ class EffectsManager : public QObject { return m_pChannelHandleFactory->getOrCreateHandle("[Master]"); } + const EffectChainPresetManagerPointer getChainPresetManager() const { + return m_pChainPresetManager; + } + /// Add an effect backend to be managed by EffectsManager. EffectsManager /// takes ownership of the backend, and will delete it when EffectsManager is /// being deleted. Not thread safe -- use only from the GUI thread. @@ -120,17 +120,6 @@ class EffectsManager : public QObject { void loadEffectChainPreset(EffectChainSlot* pChainSlot, const QString& name); void loadPresetToStandardChain(int chainNumber, EffectChainPresetPointer pPreset); - EffectChainPresetPointer getEffectChainPreset(const QString& name) { - return m_effectChainPresets.value(name); - } - - void importChainPreset(); - void exportChainPreset(const QString& chainPresetName); - void renameChainPreset(const QString& oldName); - void deleteChainPreset(const QString& chainPresetName); - - void setChainPresetOrder(const QStringList& chainPresetList); - const QString getDisplayNameForEffectPreset(EffectPresetPointer pPreset); void addStandardEffectChainSlots(); @@ -176,7 +165,6 @@ class EffectsManager : public QObject { void saveDefaultForEffect(int chainNumber, int effcectNumber); void savePresetFromStandardEffectChain(int chainNumber); - const QList getAvailableChainPresets() const; void setup(); @@ -200,7 +188,6 @@ class EffectsManager : public QObject { void connectChainSlotSignals(EffectChainSlotPointer pChainSlot); void loadDefaultEffectPresets(); - void loadEffectChainPresets(); void readEffectsXml(); void saveEffectsXml(); @@ -237,12 +224,11 @@ class EffectsManager : public QObject { QHash m_equalizerEffectChainSlots; QHash m_quickEffectChainSlots; - QHash m_effectChainPresets; - QList m_effectChainPresetsSorted; - EffectChainPresetPointer m_defaultQuickEffectChainPreset; QHash m_defaultPresets; + EffectChainPresetManagerPointer m_pChainPresetManager; + DISALLOW_COPY_AND_ASSIGN(EffectsManager); }; diff --git a/src/effects/presets/effectchainpresetmanager.cpp b/src/effects/presets/effectchainpresetmanager.cpp new file mode 100644 index 000000000000..ff832b6f08c3 --- /dev/null +++ b/src/effects/presets/effectchainpresetmanager.cpp @@ -0,0 +1,453 @@ +#include "effects/presets/effectchainpresetmanager.h" + +#include +#include +#include +#include + +#include "effects/effectsmanager.h" +#include "effects/presets/effectxmlelements.h" + +namespace { +const QString kEffectChainPresetDirectory = "/effects/chains"; +const QString kEffectsXmlFile = "effects.xml"; +} // anonymous namespace + +EffectChainPresetManager::EffectChainPresetManager(UserSettingsPointer pConfig, + EffectsManager* pEffectsManager, + EffectManifestPointer pDefaultQuickEffectManifest) + : m_pConfig(pConfig), m_pEffectsManager(pEffectsManager) { + // Generate the default QuickEffect chain preset instead of shipping it in + // res/effects/chains because this uses the translated name. + m_pDefaultQuickEffectChainPreset = + EffectChainPresetPointer(new EffectChainPreset(EffectPresetPointer( + new EffectPreset(pDefaultQuickEffectManifest)))); + m_pDefaultQuickEffectChainPreset->setName( + pDefaultQuickEffectManifest->displayName()); + + loadEffectChainPresets(); +} + +int EffectChainPresetManager::presetIndex(const QString& presetName) const { + if (m_effectChainPresets.contains(presetName)) { + EffectChainPresetPointer pPreset = + m_effectChainPresets.value(presetName); + return m_effectChainPresetsSorted.indexOf(pPreset); + } + return -1; +} + +int EffectChainPresetManager::presetIndex( + EffectChainPresetPointer pPreset) const { + return m_effectChainPresetsSorted.indexOf(pPreset); +} + +EffectChainPresetPointer EffectChainPresetManager::presetAtIndex( + int index) const { + if (index < 0) { + index = m_effectChainPresetsSorted.size() - 1; + } else if (index >= m_effectChainPresetsSorted.size()) { + index = 0; + } + return m_effectChainPresetsSorted.at(index); +} + +void EffectChainPresetManager::importPreset() { + QStringList fileNames = QFileDialog::getOpenFileNames(nullptr, + tr("Import effect chain preset"), + QString(), + tr("Mixxx Effect Chain Presets") + " (*.xml)"); + + QString importFailed = tr("Error importing effect chain preset"); + for (int i = 0; i < fileNames.size(); ++i) { + QString filePath = fileNames.at(i); + QDomDocument doc; + QFile file(filePath); + if (!file.open(QIODevice::ReadOnly)) { + QMessageBox::critical( + nullptr, importFailed, importFailed + " " + filePath); + continue; + } else if (!doc.setContent(&file)) { + file.close(); + QMessageBox::critical( + nullptr, importFailed, importFailed + " " + filePath); + continue; + } + file.close(); + + EffectChainPresetPointer pPreset( + new EffectChainPreset(doc.documentElement())); + if (!pPreset->isEmpty()) { + if (m_effectChainPresets.contains(pPreset->name())) { + bool okay = false; + QString newName = QInputDialog::getText(nullptr, + tr("Rename effect chain preset"), + tr("An effect chain preset with the name") + " " + + pPreset->name() + " " + + tr("already exists. Choose a new name for the " + "imported effect chain preset:"), + QLineEdit::Normal, + QString(), + &okay); + if (!okay) { + continue; + } + pPreset->setName(newName); + } + + // An imported chain preset might contain an LV2 plugin that the user does not + // have installed. + for (const auto pEffectPreset : pPreset->effectPresets()) { + if (pEffectPreset == nullptr || pEffectPreset->isEmpty()) { + continue; + } + + bool effectSupported = false; + for (EffectManifestPointer pManifest : + m_pEffectsManager->getAvailableEffectManifests()) { + if (pManifest->id() == pEffectPreset->id() && + pManifest->backendType() == + pEffectPreset->backendType()) { + effectSupported = true; + break; + } + } + if (!effectSupported) { + QMessageBox::critical(nullptr, + importFailed, + tr("The effect chain imported from") + " " + + filePath + " " + + tr("contains an effect that Mixxx does not " + "support") + + ":\n\n" + pEffectPreset->id() + "\n\n" + + tr("If you load this chain preset, the " + "unsupported effect will not be loaded " + "with it.")); + } + } + + m_effectChainPresets.insert(pPreset->name(), pPreset); + m_effectChainPresetsSorted.append(pPreset); + } else { + QMessageBox::critical( + nullptr, importFailed, importFailed + " " + filePath); + } + } +} + +void EffectChainPresetManager::exportPreset(const QString& chainPresetName) { + VERIFY_OR_DEBUG_ASSERT(m_effectChainPresets.contains(chainPresetName)) { + return; + } + + EffectChainPresetPointer pPreset = + m_effectChainPresets.value(chainPresetName); + VERIFY_OR_DEBUG_ASSERT(!pPreset->isEmpty()) { + return; + } + + QString fileName = QFileDialog::getSaveFileName(nullptr, + tr("Save effect chain preset"), + QString(), + tr("Mixxx Effect Chain Presets") + " (*.xml)"); + + QFile file(fileName); + if (!file.open(QIODevice::Truncate | QIODevice::WriteOnly)) { + file.close(); + QMessageBox::critical(nullptr, + tr("Error exporting effect chain preset"), + tr("Could not save effect chain preset") + " " + + chainPresetName + tr("to file") + " " + fileName); + return; + } + + QDomDocument doc(EffectXml::Chain); + doc.setContent(EffectXml::FileHeader); + doc.appendChild(pPreset->toXml(&doc)); + file.write(doc.toString().toUtf8()); + file.close(); +} + +void EffectChainPresetManager::renamePreset(const QString& oldName) { + VERIFY_OR_DEBUG_ASSERT(m_effectChainPresets.contains(oldName)) { + return; + } + + bool okay = false; + QString newName = QInputDialog::getText(nullptr, + tr("Rename effect chain preset"), + tr("New name effect chain preset") + " " + oldName, + QLineEdit::Normal, + oldName, + &okay); + if (!okay) { + return; + } + + EffectChainPresetPointer pPreset = m_effectChainPresets.take(oldName); + int index = m_effectChainPresetsSorted.indexOf(pPreset); + pPreset->setName(newName); + m_effectChainPresets.insert(newName, pPreset); + m_effectChainPresetsSorted.removeAt(index); + m_effectChainPresetsSorted.insert(index, pPreset); + emit effectChainPresetListUpdated(); +} + +void EffectChainPresetManager::deletePreset(const QString& chainPresetName) { + VERIFY_OR_DEBUG_ASSERT(m_effectChainPresets.contains(chainPresetName)) { + return; + } + auto pressedButton = QMessageBox::question(nullptr, + tr("Remove effect chain preset"), + tr("Are you sure you want to delete the effect chain preset") + + " " + chainPresetName + "?"); + if (pressedButton != QMessageBox::Yes) { + return; + } + + EffectChainPresetPointer pPreset = + m_effectChainPresets.take(chainPresetName); + m_effectChainPresetsSorted.removeAll(pPreset); + emit effectChainPresetListUpdated(); +} + +void EffectChainPresetManager::setPresetOrder( + const QStringList& chainPresetList) { + m_effectChainPresetsSorted.clear(); + + for (const auto chainPresetName : chainPresetList) { + VERIFY_OR_DEBUG_ASSERT(m_effectChainPresets.contains(chainPresetName)) { + continue; + } + m_effectChainPresetsSorted.append( + m_effectChainPresets.value(chainPresetName)); + } + + for (const auto pPreset : m_effectChainPresets) { + VERIFY_OR_DEBUG_ASSERT(m_effectChainPresetsSorted.contains(pPreset)) { + m_effectChainPresetsSorted.append(pPreset); + } + } + emit effectChainPresetListUpdated(); +} + +void EffectChainPresetManager::loadEffectChainPresets() { + QString savedPresetsPath( + m_pConfig->getSettingsPath() + kEffectChainPresetDirectory); + QDir savedPresetsDir(savedPresetsPath); + + // On first run of Mixxx, copy chain presets from the resource folder to the + // user settings folder. This allows us to ship default chain presets with + // Mixxx while letting the user delete our defaults if they do not want them. + // The user can always copy the files again manually or use the Import + // button in DlgPrefEffects. + if (!savedPresetsDir.exists()) { + savedPresetsDir.mkpath(savedPresetsPath); + QString defaultPresetsPath( + m_pConfig->getResourcePath() + kEffectChainPresetDirectory); + QDir defaultChainPresetsDir(defaultPresetsPath); + defaultChainPresetsDir.setFilter(QDir::Files | QDir::Readable); + for (const auto& fileName : defaultChainPresetsDir.entryList()) { + QFile::copy(defaultPresetsPath + "/" + fileName, + savedPresetsPath + "/" + fileName); + } + + QFile file(savedPresetsPath + "/" + + m_pDefaultQuickEffectChainPreset->name() + ".xml"); + if (file.open(QIODevice::Truncate | QIODevice::WriteOnly)) { + QDomDocument doc(EffectXml::Chain); + doc.setContent(EffectXml::FileHeader); + doc.appendChild(m_pDefaultQuickEffectChainPreset->toXml(&doc)); + file.write(doc.toString().toUtf8()); + } + file.close(); + } + + savedPresetsDir.setFilter(QDir::Files | QDir::Readable); + QStringList fileList = savedPresetsDir.entryList(); + for (const auto& filePath : fileList) { + QFile file(savedPresetsPath + "/" + filePath); + if (!file.open(QIODevice::ReadOnly)) { + continue; + } + QDomDocument doc; + if (!doc.setContent(&file)) { + file.close(); + continue; + } + EffectChainPresetPointer pEffectChainPreset( + new EffectChainPreset(doc.documentElement())); + if (!pEffectChainPreset->isEmpty()) { + m_effectChainPresets.insert( + pEffectChainPreset->name(), pEffectChainPreset); + m_effectChainPresetsSorted.append(pEffectChainPreset); + } + file.close(); + } + emit effectChainPresetListUpdated(); +} + +void EffectChainPresetManager::savePreset(EffectChainPresetPointer pPreset) { + bool okay = false; + QString name = QInputDialog::getText(nullptr, + tr("Save preset for effect chain"), + tr("Name for new effect chain preset"), + QLineEdit::Normal, + pPreset->name(), + &okay); + if (!okay) { + return; + } + + pPreset->setName(name); + m_effectChainPresets.insert(name, pPreset); + m_effectChainPresetsSorted.append(pPreset); + emit effectChainPresetListUpdated(); + + QString path(m_pConfig->getSettingsPath() + kEffectChainPresetDirectory); + QDir effectsChainsDir(path); + if (!effectsChainsDir.exists()) { + effectsChainsDir.mkpath(path); + } + // TODO: sanitize file name? + QFile file(path + "/" + name + ".xml"); + if (!file.open(QIODevice::Truncate | QIODevice::WriteOnly)) { + return; + } + + QDomDocument doc(EffectXml::Chain); + doc.setContent(EffectXml::FileHeader); + doc.appendChild(pPreset->toXml(&doc)); + file.write(doc.toString().toUtf8()); + file.close(); +} + +EffectsXmlData EffectChainPresetManager::readEffectsXml( + QStringList deckStrings) { + DEBUG_ASSERT(!m_effectChainPresets.isEmpty()); + + QList standardEffectChainPresets; + QHash quickEffectPresets; + for (const auto& deckString : deckStrings) { + quickEffectPresets.insert(deckString, m_pDefaultQuickEffectChainPreset); + } + + QDir settingsPath(m_pConfig->getSettingsPath()); + QFile file(settingsPath.absoluteFilePath(kEffectsXmlFile)); + QDomDocument doc; + + if (!file.open(QIODevice::ReadOnly)) { + file.close(); + return EffectsXmlData{quickEffectPresets, standardEffectChainPresets}; + } else if (!doc.setContent(&file)) { + file.close(); + return EffectsXmlData{quickEffectPresets, standardEffectChainPresets}; + } + file.close(); + + // Reload state of standard chains + QDomElement root = doc.documentElement(); + QDomElement rackElement = XmlParse::selectElement(root, EffectXml::Rack); + QDomElement chainsElement = + XmlParse::selectElement(rackElement, EffectXml::ChainsRoot); + QDomNodeList chainsList = chainsElement.elementsByTagName(EffectXml::Chain); + + for (int i = 0; i < chainsList.count(); ++i) { + QDomNode chainNode = chainsList.at(i); + + if (chainNode.isElement()) { + QDomElement chainElement = chainNode.toElement(); + EffectChainPresetPointer pPreset( + new EffectChainPreset(chainElement)); + standardEffectChainPresets.append(pPreset); + } + } + + // Reload order of custom chain presets + QStringList chainPresetsSorted; + QDomElement chainPresetsElement = + XmlParse::selectElement(root, EffectXml::ChainPresetList); + QDomNodeList presetNameList = + chainPresetsElement.elementsByTagName(EffectXml::ChainPresetName); + for (int i = 0; i < presetNameList.count(); ++i) { + QDomNode presetNameNode = presetNameList.at(i); + if (presetNameNode.isElement()) { + chainPresetsSorted << presetNameNode.toElement().text(); + } + } + setPresetOrder(chainPresetsSorted); + + // Load QuickEffect presets + QDomElement quickEffectPresetsElement = + XmlParse::selectElement(root, EffectXml::QuickEffectChainPresets); + QDomNodeList quickEffectNodeList = + quickEffectPresetsElement.elementsByTagName( + EffectXml::ChainPresetName); + for (int i = 0; i < quickEffectNodeList.count(); ++i) { + QDomElement presetNameElement = quickEffectNodeList.at(i).toElement(); + if (!presetNameElement.isNull()) { + QString deckGroup = presetNameElement.attribute("group"); + auto pPreset = m_effectChainPresets.value(presetNameElement.text()); + if (pPreset != nullptr) { + quickEffectPresets.insert(deckGroup, pPreset); + } + } + } + + return EffectsXmlData{quickEffectPresets, standardEffectChainPresets}; +} + +void EffectChainPresetManager::saveEffectsXml(EffectsXmlData data) { + QDomDocument doc(EffectXml::Root); + doc.setContent(EffectXml::FileHeader); + + // Save presets for current state of standard chains + QDomElement rootElement = doc.createElement(EffectXml::Root); + rootElement.setAttribute( + "schemaVersion", QString::number(EffectXml::kXmlSchemaVersion)); + doc.appendChild(rootElement); + QDomElement rackElement = doc.createElement(EffectXml::Rack); + rootElement.appendChild(rackElement); + QDomElement chainsElement = doc.createElement(EffectXml::ChainsRoot); + rackElement.appendChild(chainsElement); + for (const auto pPreset : data.standardEffectChainPresets) { + chainsElement.appendChild(pPreset->toXml(&doc)); + } + + // Save order of custom chain presets + QDomElement chainPresetListElement = + doc.createElement(EffectXml::ChainPresetList); + for (const auto pPreset : m_effectChainPresetsSorted) { + XmlParse::addElement(doc, + chainPresetListElement, + EffectXml::ChainPresetName, + pPreset->name()); + } + rootElement.appendChild(chainPresetListElement); + + // Save which presets are loaded to QuickEffects + QDomElement quickEffectPresetsElement = + doc.createElement(EffectXml::QuickEffectChainPresets); + for (auto it = data.quickEffectChainPresets.begin(); + it != data.quickEffectChainPresets.end(); + it++) { + QDomElement quickEffectElement = XmlParse::addElement( + doc, + quickEffectPresetsElement, + EffectXml::ChainPresetName, + it.value()->name()); + quickEffectElement.setAttribute("group", it.key()); + } + rootElement.appendChild(quickEffectPresetsElement); + + QDir settingsPath(m_pConfig->getSettingsPath()); + if (!settingsPath.exists()) { + return; + } + QFile file(settingsPath.absoluteFilePath(kEffectsXmlFile)); + if (!file.open(QIODevice::Truncate | QIODevice::WriteOnly)) { + return; + } + file.write(doc.toString().toUtf8()); + file.close(); +} diff --git a/src/effects/presets/effectchainpresetmanager.h b/src/effects/presets/effectchainpresetmanager.h new file mode 100644 index 000000000000..0983a91a3f69 --- /dev/null +++ b/src/effects/presets/effectchainpresetmanager.h @@ -0,0 +1,69 @@ +#pragma once + +#include +#include + +#include "effects/presets/effectchainpreset.h" +#include "preferences/usersettings.h" + +class EffectsManager; + +struct EffectsXmlData { + QHash quickEffectChainPresets; + QList standardEffectChainPresets; +}; + +/// EffectChainPresetManager maintains a list of custom EffectChainPresets in the +/// "effects/chains" folder in the user settings folder. The state of loaded +/// effects are saved as EffectChainPresets in the effects.xml file in the user +/// settings folder, which is used to restore the state of effects on startup. +class EffectChainPresetManager : public QObject { + Q_OBJECT + + public: + EffectChainPresetManager( + UserSettingsPointer pConfig, + EffectsManager* pEffectsManager, + EffectManifestPointer pDefaultQuickEffectManifest); + ~EffectChainPresetManager() = default; + + const QList getPresetsSorted() const { + return m_effectChainPresetsSorted; + } + + int presetIndex(const QString& presetName) const; + int presetIndex(EffectChainPresetPointer pChainPreset) const; + EffectChainPresetPointer presetAtIndex(int index) const; + + void importPreset(); + void exportPreset(const QString& chainPresetName); + void renamePreset(const QString& oldName); + void deletePreset(const QString& chainPresetName); + + void setPresetOrder(const QStringList& chainPresetList); + + EffectChainPresetPointer getPreset(const QString& name) const { + return m_effectChainPresets.value(name); + } + + void savePreset(EffectChainPresetPointer pPreset); + + EffectsXmlData readEffectsXml(QStringList deckStrings); + void saveEffectsXml(EffectsXmlData data); + + signals: + void effectChainPresetListUpdated(); + + private: + void loadEffectChainPresets(); + + QHash m_effectChainPresets; + QList m_effectChainPresetsSorted; + + UserSettingsPointer m_pConfig; + EffectsManager* m_pEffectsManager; + + EffectChainPresetPointer m_pDefaultQuickEffectChainPreset; +}; + +typedef QSharedPointer EffectChainPresetManagerPointer; diff --git a/src/effects/presets/effectxmlelements.h b/src/effects/presets/effectxmlelements.h index aa3f60bdab55..b9ba93962234 100644 --- a/src/effects/presets/effectxmlelements.h +++ b/src/effects/presets/effectxmlelements.h @@ -1,4 +1,5 @@ namespace EffectXml { +const QString FileHeader("\n"); // Version history: // 0 (Mixxx 2.1.0): initial support for saving state of effects const int kXmlSchemaVersion = 0; diff --git a/src/preferences/dialog/dlgprefeffects.cpp b/src/preferences/dialog/dlgprefeffects.cpp index 8be8b7acb09c..f5b8712fb151 100644 --- a/src/preferences/dialog/dlgprefeffects.cpp +++ b/src/preferences/dialog/dlgprefeffects.cpp @@ -5,11 +5,12 @@ #include "effects/backends/effectsbackend.h" DlgPrefEffects::DlgPrefEffects(QWidget* pParent, - UserSettingsPointer pConfig, - EffectsManager* pEffectsManager) + UserSettingsPointer pConfig, + EffectsManager* pEffectsManager) : DlgPreferencePage(pParent), m_pConfig(pConfig), - m_pEffectsManager(pEffectsManager) { + m_pEffectsManager(pEffectsManager), + m_pChainPresetManager(pEffectsManager->getChainPresetManager()) { setupUi(this); m_availableEffectsModel.resetFromEffectManager(pEffectsManager); @@ -99,7 +100,7 @@ void DlgPrefEffects::slotApply() { for (int i = 0; i < chainListWidget->count(); ++i) { chainList << chainListWidget->item(i)->text(); } - m_pEffectsManager->setChainPresetOrder(chainList); + m_pChainPresetManager->setPresetOrder(chainList); } void DlgPrefEffects::slotResetToDefaults() { @@ -116,7 +117,7 @@ void DlgPrefEffects::clear() { void DlgPrefEffects::loadChainPresetList() { chainListWidget->clear(); - for (const auto& pChainPreset : m_pEffectsManager->getAvailableChainPresets()) { + for (const auto& pChainPreset : m_pChainPresetManager->getPresetsSorted()) { chainListWidget->addItem(pChainPreset->name()); } } @@ -137,7 +138,7 @@ void DlgPrefEffects::availableEffectsListItemSelected(const QModelIndex& selecte } void DlgPrefEffects::slotChainPresetSelected(const QString& chainPresetName) { - EffectChainPresetPointer pChainPreset = m_pEffectsManager->getEffectChainPreset(chainPresetName); + EffectChainPresetPointer pChainPreset = m_pChainPresetManager->getPreset(chainPresetName); if (pChainPreset == nullptr || pChainPreset->isEmpty()) { return; } @@ -169,24 +170,24 @@ void DlgPrefEffects::slotChainPresetSelected(const QString& chainPresetName) { } void DlgPrefEffects::slotImportPreset() { - m_pEffectsManager->importChainPreset(); + m_pChainPresetManager->importPreset(); loadChainPresetList(); } void DlgPrefEffects::slotExportPreset() { const QString& selectedPresetName = chainListWidget->currentItem()->text(); - m_pEffectsManager->exportChainPreset(selectedPresetName); + m_pChainPresetManager->exportPreset(selectedPresetName); } void DlgPrefEffects::slotRenamePreset() { const QString& selectedPresetName = chainListWidget->currentItem()->text(); - m_pEffectsManager->renameChainPreset(selectedPresetName); + m_pChainPresetManager->renamePreset(selectedPresetName); loadChainPresetList(); } void DlgPrefEffects::slotDeletePreset() { const QString& selectedPresetName = chainListWidget->currentItem()->text(); - m_pEffectsManager->deleteChainPreset(selectedPresetName); + m_pChainPresetManager->deletePreset(selectedPresetName); loadChainPresetList(); } diff --git a/src/preferences/dialog/dlgprefeffects.h b/src/preferences/dialog/dlgprefeffects.h index 5e656d2fa28c..6380afb289b1 100644 --- a/src/preferences/dialog/dlgprefeffects.h +++ b/src/preferences/dialog/dlgprefeffects.h @@ -39,6 +39,7 @@ class DlgPrefEffects : public DlgPreferencePage, public Ui::DlgPrefEffectsDlg { EffectSettingsModel m_availableEffectsModel; UserSettingsPointer m_pConfig; EffectsManager* m_pEffectsManager; + EffectChainPresetManagerPointer m_pChainPresetManager; EffectSettingsModel* m_pAvailableEffectsModel; }; diff --git a/src/widget/weffectchainpresetbutton.cpp b/src/widget/weffectchainpresetbutton.cpp index 657c0f8b8e77..35d2c56c4895 100644 --- a/src/widget/weffectchainpresetbutton.cpp +++ b/src/widget/weffectchainpresetbutton.cpp @@ -24,7 +24,7 @@ void WEffectChainPresetButton::setup(const QDomNode& node, const SkinContext& co void WEffectChainPresetButton::populateMenu() { m_pMenu->clear(); - for (const auto pChainPreset : m_pEffectsManager->getAvailableChainPresets()) { + for (const auto pChainPreset : m_pEffectsManager->getChainPresetManager()->getPresetsSorted()) { m_pMenu->addAction(pChainPreset->name(), [=]() { m_pEffectsManager->loadPresetToStandardChain(m_iChainNumber, pChainPreset); }); diff --git a/src/widget/weffectchainpresetselector.cpp b/src/widget/weffectchainpresetselector.cpp index cfb89a91600a..cbd7c7fcbcfe 100644 --- a/src/widget/weffectchainpresetselector.cpp +++ b/src/widget/weffectchainpresetselector.cpp @@ -47,7 +47,8 @@ void WEffectChainPresetSelector::populate() { QFontMetrics metrics(font()); - for (const auto& pChainPreset : m_pEffectsManager->getAvailableChainPresets()) { + for (const auto& pChainPreset : + m_pEffectsManager->getChainPresetManager()->getPresetsSorted()) { QString elidedDisplayName = metrics.elidedText(pChainPreset->name(), Qt::ElideMiddle, width() - 2); From 5de9ffd149d29ccd954d9b61694d689cdeaa2d1a Mon Sep 17 00:00:00 2001 From: Be Date: Fri, 1 May 2020 15:30:56 -0500 Subject: [PATCH 128/443] extract EffectsMessenger class from EffectsManager --- CMakeLists.txt | 3 +- src/effects/defs.h | 3 + src/effects/effectchainslot.cpp | 22 +++-- src/effects/effectchainslot.h | 8 +- src/effects/effectparameter.cpp | 11 ++- src/effects/effectparameter.h | 4 +- src/effects/effectslot.cpp | 17 ++-- src/effects/effectslot.h | 8 +- src/effects/effectsmanager.cpp | 121 +++--------------------- src/effects/effectsmanager.h | 17 +--- src/effects/effectsmessenger.cpp | 102 ++++++++++++++++++++ src/effects/effectsmessenger.h | 30 ++++++ src/effects/specialeffectchainslots.cpp | 48 ++++++---- src/effects/specialeffectchainslots.h | 17 ++-- 14 files changed, 235 insertions(+), 176 deletions(-) create mode 100644 src/effects/effectsmessenger.cpp create mode 100644 src/effects/effectsmessenger.h diff --git a/CMakeLists.txt b/CMakeLists.txt index c8a8d724f036..f6f6ed560101 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -244,6 +244,7 @@ add_library(mixxx-lib STATIC EXCLUDE_FROM_ALL src/effects/effectparameterslotbase.cpp src/effects/effectslot.cpp src/effects/effectsmanager.cpp + src/effects/effectsmessenger.cpp src/effects/specialeffectchainslots.cpp src/effects/backends/effectmanifest.cpp src/effects/backends/effectmanifestparameter.cpp @@ -267,10 +268,10 @@ add_library(mixxx-lib STATIC EXCLUDE_FROM_ALL src/effects/backends/builtin/reverbeffect.cpp src/effects/backends/builtin/threebandbiquadeqeffect.cpp src/effects/backends/builtin/tremoloeffect.cpp - src/effects/presets/effectpreset.cpp src/effects/presets/effectchainpreset.cpp src/effects/presets/effectchainpresetmanager.cpp src/effects/presets/effectparameterpreset.cpp + src/effects/presets/effectpreset.cpp src/encoder/encoder.cpp src/encoder/encoderbroadcastsettings.cpp src/encoder/encoderflacsettings.cpp diff --git a/src/effects/defs.h b/src/effects/defs.h index 3e8e470d3a41..3e83c353e22a 100644 --- a/src/effects/defs.h +++ b/src/effects/defs.h @@ -47,6 +47,9 @@ constexpr bool kEffectDebugOutput = false; class EffectsBackend; typedef QSharedPointer EffectsBackendPointer; +class EffectsMessenger; +typedef QSharedPointer EffectsMessengerPointer; + class EffectState; // For sending EffectStates along the MessagePipe typedef ChannelHandleMap EffectStatesMap; diff --git a/src/effects/effectchainslot.cpp b/src/effects/effectchainslot.cpp index 8548d8e2509d..24c5d1e9a307 100644 --- a/src/effects/effectchainslot.cpp +++ b/src/effects/effectchainslot.cpp @@ -6,9 +6,8 @@ #include "effects/backends/effectprocessor.h" #include "effects/effectslot.h" #include "effects/effectsmanager.h" -#include "effects/specialeffectchainslots.h" +#include "effects/effectsmessenger.h" #include "engine/effects/engineeffectchain.h" -#include "engine/effects/message.h" #include "engine/engine.h" #include "mixer/playermanager.h" #include "util/defs.h" @@ -18,11 +17,13 @@ EffectChainSlot::EffectChainSlot(const QString& group, EffectsManager* pEffectsManager, + EffectsMessengerPointer pEffectsMessenger, SignalProcessingStage stage, const QString& id) : // The control group names are 1-indexed while internally everything // is 0-indexed. m_pEffectsManager(pEffectsManager), + m_pMessenger(pEffectsMessenger), m_group(group), m_presetName(""), m_mixMode(EffectChainMixMode::DrySlashWet), @@ -163,7 +164,7 @@ void EffectChainSlot::addToEngine() { pRequest->type = EffectsRequest::ADD_EFFECT_CHAIN; pRequest->AddEffectChain.signalProcessingStage = m_signalProcessingStage; pRequest->AddEffectChain.pChain = m_pEngineEffectChain; - m_pEffectsManager->writeRequest(pRequest); + m_pMessenger->writeRequest(pRequest); sendParameterUpdate(); } @@ -177,7 +178,7 @@ void EffectChainSlot::removeFromEngine() { pRequest->type = EffectsRequest::REMOVE_EFFECT_CHAIN; pRequest->RemoveEffectChain.signalProcessingStage = m_signalProcessingStage; pRequest->RemoveEffectChain.pChain = m_pEngineEffectChain; - m_pEffectsManager->writeRequest(pRequest); + m_pMessenger->writeRequest(pRequest); m_pEngineEffectChain = nullptr; } @@ -216,7 +217,7 @@ void EffectChainSlot::sendParameterUpdate() { pRequest->SetEffectChainParameters.mix_mode = static_cast( static_cast(m_pControlChainMixMode->get())); pRequest->SetEffectChainParameters.mix = m_pControlChainMix->get(); - m_pEffectsManager->writeRequest(pRequest); + m_pMessenger->writeRequest(pRequest); } QString EffectChainSlot::group() const { @@ -245,8 +246,11 @@ EffectSlotPointer EffectChainSlot::addEffectSlot(const QString& group) { if (kEffectDebugOutput) { qDebug() << debugString() << "addEffectSlot" << group; } - EffectSlotPointer pEffectSlot = EffectSlotPointer( - new EffectSlot(group, m_pEffectsManager, m_effectSlots.size(), m_pEngineEffectChain)); + EffectSlotPointer pEffectSlot = EffectSlotPointer(new EffectSlot(group, + m_pEffectsManager, + m_pMessenger, + m_effectSlots.size(), + m_pEngineEffectChain)); m_effectSlots.append(pEffectSlot); int numEffectSlots = m_pControlNumEffectSlots->get() + 1; @@ -368,7 +372,7 @@ void EffectChainSlot::enableForInputChannel(const ChannelHandleAndGroup& handle_ } request->EnableInputChannelForChain.pEffectStatesMapArray = pEffectStatesMapArray; - m_pEffectsManager->writeRequest(request); + m_pMessenger->writeRequest(request); m_enabledInputChannels.insert(handle_group); } @@ -382,5 +386,5 @@ void EffectChainSlot::disableForInputChannel(const ChannelHandleAndGroup& handle request->type = EffectsRequest::DISABLE_EFFECT_CHAIN_FOR_INPUT_CHANNEL; request->pTargetChain = m_pEngineEffectChain; request->DisableInputChannelForChain.pChannelHandle = &handle_group.handle(); - m_pEffectsManager->writeRequest(request); + m_pMessenger->writeRequest(request); } diff --git a/src/effects/effectchainslot.h b/src/effects/effectchainslot.h index 2a32723f4777..d8e5bc080336 100644 --- a/src/effects/effectchainslot.h +++ b/src/effects/effectchainslot.h @@ -49,9 +49,10 @@ class EffectChainSlot : public QObject { Q_OBJECT public: EffectChainSlot(const QString& group, - EffectsManager* pEffectsManager, - SignalProcessingStage stage = SignalProcessingStage::Postfader, - const QString& id = QString()); + EffectsManager* pEffectsManager, + EffectsMessengerPointer pEffectsMessenger, + SignalProcessingStage stage = SignalProcessingStage::Postfader, + const QString& id = QString()); virtual ~EffectChainSlot(); QString group() const; @@ -136,6 +137,7 @@ class EffectChainSlot : public QObject { void disableForInputChannel(const ChannelHandleAndGroup& handle_group); EffectsManager* m_pEffectsManager; + EffectsMessengerPointer m_pMessenger; ControlObject* m_pControlChainMix; ControlObject* m_pControlChainSuperParameter; QList m_effectSlots; diff --git a/src/effects/effectparameter.cpp b/src/effects/effectparameter.cpp index 9dfb0b68b789..72637c3b297c 100644 --- a/src/effects/effectparameter.cpp +++ b/src/effects/effectparameter.cpp @@ -1,15 +1,16 @@ +#include "effects/effectparameter.h" + #include -#include "effects/effectparameter.h" -#include "effects/effectsmanager.h" +#include "effects/effectsmessenger.h" #include "util/assert.h" EffectParameter::EffectParameter(EngineEffect* pEngineEffect, - EffectsManager* pEffectsManager, + EffectsMessengerPointer pEffectsMessenger, EffectManifestParameterPointer pParameterManifest, EffectParameterPreset preset) : m_pEngineEffect(pEngineEffect), - m_pEffectsManager(pEffectsManager), + m_pMessenger(pEffectsMessenger), m_pParameterManifest(pParameterManifest) { if (preset.isNull()) { setValue(pParameterManifest->getDefault()); @@ -69,5 +70,5 @@ void EffectParameter::updateEngineState() { pRequest->pTargetEffect = m_pEngineEffect; pRequest->SetParameterParameters.iParameter = m_pParameterManifest->index(); pRequest->value = m_value; - m_pEffectsManager->writeRequest(pRequest); + m_pMessenger->writeRequest(pRequest); } diff --git a/src/effects/effectparameter.h b/src/effects/effectparameter.h index 3763e92079dc..72a624253152 100644 --- a/src/effects/effectparameter.h +++ b/src/effects/effectparameter.h @@ -27,7 +27,7 @@ class EffectParameterPreset; class EffectParameter { public: EffectParameter(EngineEffect* pEngineEffect, - EffectsManager* pEffectsManager, + EffectsMessengerPointer pEffectsMessenger, EffectManifestParameterPointer pParameterManifest, EffectParameterPreset preset); virtual ~EffectParameter(); @@ -62,7 +62,7 @@ class EffectParameter { bool clampValue(); EngineEffect* m_pEngineEffect; - EffectsManager* m_pEffectsManager; + EffectsMessengerPointer m_pMessenger; EffectManifestParameterPointer m_pParameterManifest; double m_value; // Hidden parameters cannot be linked to the metaknob, but EffectParameter diff --git a/src/effects/effectslot.cpp b/src/effects/effectslot.cpp index e07c15dde362..5f6e592bc573 100644 --- a/src/effects/effectslot.cpp +++ b/src/effects/effectslot.cpp @@ -7,6 +7,7 @@ #include "control/controlproxy.h" #include "control/controlpushbutton.h" #include "effects/defs.h" +#include "effects/effectsmessenger.h" #include "util/defs.h" #include "util/math.h" @@ -14,12 +15,14 @@ const unsigned int kDefaultMaxParameters = 16; EffectSlot::EffectSlot(const QString& group, - EffectsManager* pEffectsManager, - const unsigned int iEffectnumber, - EngineEffectChain* pEngineEffectChain) + EffectsManager* pEffectsManager, + EffectsMessengerPointer pEffectsMessenger, + const unsigned int iEffectnumber, + EngineEffectChain* pEngineEffectChain) : m_iEffectNumber(iEffectnumber), m_group(group), m_pEffectsManager(pEffectsManager), + m_pMessenger(pEffectsMessenger), m_pEngineEffectChain(pEngineEffectChain), m_pEngineEffect(nullptr) { VERIFY_OR_DEBUG_ASSERT(m_pEngineEffectChain != nullptr) { @@ -128,7 +131,7 @@ void EffectSlot::addToEngine(std::unique_ptr pProcessor, request->pTargetChain = m_pEngineEffectChain; request->AddEffectToChain.pEffect = m_pEngineEffect; request->AddEffectToChain.iIndex = m_iEffectNumber; - m_pEffectsManager->writeRequest(request); + m_pMessenger->writeRequest(request); } void EffectSlot::removeFromEngine() { @@ -141,7 +144,7 @@ void EffectSlot::removeFromEngine() { request->pTargetChain = m_pEngineEffectChain; request->RemoveEffectFromChain.pEffect = m_pEngineEffect; request->RemoveEffectFromChain.iIndex = m_iEffectNumber; - m_pEffectsManager->writeRequest(request); + m_pMessenger->writeRequest(request); m_pEngineEffect = nullptr; } @@ -155,7 +158,7 @@ void EffectSlot::updateEngineState() { pRequest->type = EffectsRequest::SET_EFFECT_PARAMETERS; pRequest->pTargetEffect = m_pEngineEffect; pRequest->SetEffectParameters.enabled = m_pControlEnabled->get(); - m_pEffectsManager->writeRequest(pRequest); + m_pMessenger->writeRequest(pRequest); for (const auto& parameterList : m_allParameters) { for (auto const& pParameter : parameterList) { @@ -263,7 +266,7 @@ void EffectSlot::loadEffect(const EffectManifestPointer pManifest, } } EffectParameterPointer pParameter(new EffectParameter( - m_pEngineEffect, m_pEffectsManager, pManifestParameter, parameterPreset)); + m_pEngineEffect, m_pMessenger, pManifestParameter, parameterPreset)); m_allParameters[pManifestParameter->parameterType()].append(pParameter); } diff --git a/src/effects/effectslot.h b/src/effects/effectslot.h index 4e322ec2d75b..eb0c4bb2e82b 100644 --- a/src/effects/effectslot.h +++ b/src/effects/effectslot.h @@ -56,9 +56,10 @@ class EffectSlot : public QObject { Q_OBJECT public: EffectSlot(const QString& group, - EffectsManager* pEffectsManager, - const unsigned int iEffectNumber, - EngineEffectChain* pEngineEffectChain); + EffectsManager* pEffectsManager, + EffectsMessengerPointer pEffectsMessenger, + const unsigned int iEffectNumber, + EngineEffectChain* pEngineEffectChain); virtual ~EffectSlot(); /// Call with nullptr for pManifest and pProcessor to unload an effect @@ -156,6 +157,7 @@ class EffectSlot : public QObject { const QString m_group; UserSettingsPointer m_pConfig; EffectsManager* m_pEffectsManager; + EffectsMessengerPointer m_pMessenger; EffectManifestPointer m_pManifest; EngineEffectChain* m_pEngineEffectChain; EngineEffect* m_pEngineEffect; diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index caba9c4adf83..db320b3fa75d 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -8,24 +8,20 @@ #include "effects/backends/builtin/filtereffect.h" #include "effects/backends/lv2/lv2backend.h" #include "effects/effectslot.h" +#include "effects/effectsmessenger.h" #include "effects/presets/effectchainpreset.h" #include "effects/presets/effectxmlelements.h" -#include "engine/effects/engineeffect.h" -#include "engine/effects/engineeffectchain.h" -#include "engine/effects/engineeffectsmanager.h" #include "util/assert.h" namespace { -const QString kEffectPresetDirectory = "/effects"; -const QString kEffectChainPresetDirectory = kEffectPresetDirectory + "/chains"; -const QString kEffectDefaultsDirectory = kEffectPresetDirectory + "/defaults"; +const QString kEffectDefaultsDirectory = "/effects/defaults"; const QString kStandardEffectRackGroup = "[EffectRack1]"; const QString kOutputEffectRackGroup = "[OutputEffectRack]"; const QString kQuickEffectRackGroup = "[QuickEffectRack1]"; const QString kEqualizerEffectRackGroup = "[EqualizerRack1]"; const QString kEffectGroupSeparator = "_"; const QString kGroupClose = "]"; -const unsigned int kEffectMessagPipeFifoSize = 2048; +const unsigned int kEffectMessagePipeFifoSize = 2048; } // anonymous namespace EffectsManager::EffectsManager(QObject* pParent, @@ -33,17 +29,16 @@ EffectsManager::EffectsManager(QObject* pParent, ChannelHandleFactory* pChannelHandleFactory) : QObject(pParent), m_pChannelHandleFactory(pChannelHandleFactory), - m_nextRequestId(0), m_loEqFreq(ConfigKey("[Mixer Profile]", "LoEQFrequency"), 0., 22040), m_hiEqFreq(ConfigKey("[Mixer Profile]", "HiEQFrequency"), 0., 22040), - m_underDestruction(false), m_pConfig(pConfig) { qRegisterMetaType("EffectChainMixMode"); + QPair requestPipes = TwoWayMessagePipe::makeTwoWayMessagePipe( - kEffectMessagPipeFifoSize, kEffectMessagPipeFifoSize); - - m_pRequestPipe.reset(requestPipes.first); + kEffectMessagePipeFifoSize, kEffectMessagePipeFifoSize); + m_pMessenger = EffectsMessengerPointer(new EffectsMessenger( + requestPipes.first, requestPipes.second)); m_pEngineEffectsManager = new EngineEffectsManager(requestPipes.second); m_pNumEffectsAvailable = new ControlObject(ConfigKey("[Master]", "num_effectsavailable")); @@ -61,7 +56,7 @@ EffectsManager::EffectsManager(QObject* pParent, } EffectsManager::~EffectsManager() { - m_underDestruction = true; + m_pMessenger->startShutdownProcess(); saveEffectsXml(); for (const auto pEffectPreset : m_defaultPresets) { @@ -77,22 +72,13 @@ EffectsManager::~EffectsManager() { m_standardEffectChainSlots.clear(); m_outputEffectChainSlot.clear(); m_effectChainSlotsByGroup.clear(); - processEffectsResponses(); + m_pMessenger->processEffectsResponses(); m_effectsBackends.clear(); - for (QHash::iterator it = m_activeRequests.begin(); - it != m_activeRequests.end();) { - delete it.value(); - it = m_activeRequests.erase(it); - } // delete m_pHiEqFreq; // delete m_pLoEqFreq; delete m_pNumEffectsAvailable; - // Safe because the Engine is deleted before EffectsManager. Also, it holds - // a bare pointer to m_pRequestPipe so it is critical that it does not - // outlast us. - delete m_pEngineEffectsManager; } bool alphabetizeEffectManifests(EffectManifestPointer pManifest1, @@ -378,7 +364,7 @@ void EffectsManager::addStandardEffectChainSlots() { } auto pChainSlot = StandardEffectChainSlotPointer( - new StandardEffectChainSlot(i, this)); + new StandardEffectChainSlot(i, this, m_pMessenger)); connectChainSlotSignals(pChainSlot); m_standardEffectChainSlots.append(pChainSlot); @@ -387,7 +373,8 @@ void EffectsManager::addStandardEffectChainSlots() { } void EffectsManager::addOutputEffectChainSlot() { - m_outputEffectChainSlot = OutputEffectChainSlotPointer(new OutputEffectChainSlot(this)); + m_outputEffectChainSlot = OutputEffectChainSlotPointer( + new OutputEffectChainSlot(this, m_pMessenger)); connectChainSlotSignals(m_outputEffectChainSlot); m_effectChainSlotsByGroup.insert(m_outputEffectChainSlot->group(), m_outputEffectChainSlot); } @@ -410,7 +397,7 @@ void EffectsManager::addEqualizerEffectChainSlot(const QString& deckGroupName) { } auto pChainSlot = EqualizerEffectChainSlotPointer( - new EqualizerEffectChainSlot(deckGroupName, this)); + new EqualizerEffectChainSlot(deckGroupName, this, m_pMessenger)); connectChainSlotSignals(pChainSlot); m_equalizerEffectChainSlots.insert(deckGroupName, pChainSlot); @@ -424,7 +411,7 @@ void EffectsManager::addQuickEffectChainSlot(const QString& deckGroupName) { } auto pChainSlot = QuickEffectChainSlotPointer( - new QuickEffectChainSlot(deckGroupName, this)); + new QuickEffectChainSlot(deckGroupName, this, m_pMessenger)); connectChainSlotSignals(pChainSlot); m_quickEffectChainSlots.insert(deckGroupName, pChainSlot); @@ -519,86 +506,6 @@ void EffectsManager::setup() { readEffectsXml(); } -bool EffectsManager::writeRequest(EffectsRequest* request) { - if (m_underDestruction) { - // Catch all delete Messages since the engine is already down - // and we cannot wait for a communication cycle - collectGarbage(request); - } - - if (m_pRequestPipe.isNull()) { - delete request; - return false; - } - - // This is effectively only garbage collection at this point so only deal - // with responses when writing new requests. - processEffectsResponses(); - - request->request_id = m_nextRequestId++; - // TODO(XXX) use preallocated requests to avoid delete calls from engine - if (m_pRequestPipe->writeMessage(request)) { - m_activeRequests[request->request_id] = request; - return true; - } - delete request; - return false; -} - -void EffectsManager::processEffectsResponses() { - if (m_pRequestPipe.isNull()) { - return; - } - - EffectsResponse response; - while (m_pRequestPipe->readMessage(&response)) { - QHash::iterator it = - m_activeRequests.find(response.request_id); - - VERIFY_OR_DEBUG_ASSERT(it != m_activeRequests.end()) { - qWarning() << debugString() - << "WARNING: EffectsResponse with an inactive request_id:" - << response.request_id; - } - - while (it != m_activeRequests.end() && - it.key() == response.request_id) { - EffectsRequest* pRequest = it.value(); - - // Don't check whether the response was successful here because - // specific errors should be caught with DEBUG_ASSERTs in - // EngineEffectsManager and functions it calls to handle requests. - - collectGarbage(pRequest); - - delete pRequest; - it = m_activeRequests.erase(it); - } - } -} - -void EffectsManager::collectGarbage(const EffectsRequest* pRequest) { - if (pRequest->type == EffectsRequest::REMOVE_EFFECT_FROM_CHAIN) { - if (kEffectDebugOutput) { - qDebug() << debugString() << "delete" << pRequest->RemoveEffectFromChain.pEffect; - } - delete pRequest->RemoveEffectFromChain.pEffect; - } else if (pRequest->type == EffectsRequest::REMOVE_EFFECT_CHAIN) { - if (kEffectDebugOutput) { - qDebug() << debugString() << "delete" << pRequest->RemoveEffectChain.pChain; - } - delete pRequest->RemoveEffectChain.pChain; - } else if (pRequest->type == EffectsRequest::DISABLE_EFFECT_CHAIN_FOR_INPUT_CHANNEL) { - if (kEffectDebugOutput) { - qDebug() << debugString() << "deleting states for input channel" - << pRequest->DisableInputChannelForChain.pChannelHandle - << "for EngineEffectChain" << pRequest->pTargetChain; - } - pRequest->pTargetChain->deleteStatesForInputChannel( - pRequest->DisableInputChannelForChain.pChannelHandle); - } -} - void EffectsManager::loadDefaultEffectPresets() { // Load saved defaults from settings directory QString dirPath(m_pConfig->getSettingsPath() + kEffectDefaultsDirectory); diff --git a/src/effects/effectsmanager.h b/src/effects/effectsmanager.h index 091b3a0c87ff..0798f67e75bf 100644 --- a/src/effects/effectsmanager.h +++ b/src/effects/effectsmanager.h @@ -13,7 +13,7 @@ #include "effects/presets/effectchainpresetmanager.h" #include "effects/specialeffectchainslots.h" #include "engine/channelhandle.h" -#include "engine/effects/message.h" +#include "engine/effects/engineeffectsmanager.h" #include "preferences/usersettings.h" #include "util/class.h" #include "util/fifo.h" @@ -168,10 +168,6 @@ class EffectsManager : public QObject { void setup(); - /// Write an EffectsRequest to the EngineEffectsManager. EffectsManager takes - /// ownership of request and deletes it once a response is received. - bool writeRequest(EffectsRequest* request); - signals: void visibleEffectsUpdated(); void effectChainPresetListUpdated(); @@ -192,21 +188,12 @@ class EffectsManager : public QObject { void readEffectsXml(); void saveEffectsXml(); - void processEffectsResponses(); - void collectGarbage(const EffectsRequest* pResponse); - ChannelHandleFactory* m_pChannelHandleFactory; QHash m_effectsBackends; QList m_availableEffectManifests; QList m_visibleEffectManifests; - EngineEffectsManager* m_pEngineEffectsManager; - - QScopedPointer m_pRequestPipe; - qint64 m_nextRequestId; - QHash m_activeRequests; - ControlObject* m_pNumEffectsAvailable; // We need to create Control Objects for Equalizers' frequencies ControlPotmeter m_loEqFreq; @@ -228,6 +215,8 @@ class EffectsManager : public QObject { QHash m_defaultPresets; + EngineEffectsManager* m_pEngineEffectsManager; + EffectsMessengerPointer m_pMessenger; EffectChainPresetManagerPointer m_pChainPresetManager; DISALLOW_COPY_AND_ASSIGN(EffectsManager); diff --git a/src/effects/effectsmessenger.cpp b/src/effects/effectsmessenger.cpp new file mode 100644 index 000000000000..3dd17ee7f85b --- /dev/null +++ b/src/effects/effectsmessenger.cpp @@ -0,0 +1,102 @@ +#include "effects/effectsmessenger.h" + +#include "engine/effects/engineeffect.h" +#include "engine/effects/engineeffectchain.h" + +EffectsMessenger::EffectsMessenger( + EffectsRequestPipe* pRequestPipe, EffectsResponsePipe* pResponsePipe) + : m_bShuttingDown(false), + m_pRequestPipe(pRequestPipe), + m_pResponsePipe(pResponsePipe), + m_nextRequestId(0) { +} + +EffectsMessenger::~EffectsMessenger() { + for (auto it = m_activeRequests.begin(); it != m_activeRequests.end(); it++) { + delete it.value(); + } +} + +void EffectsMessenger::startShutdownProcess() { + m_bShuttingDown = true; +} + +bool EffectsMessenger::writeRequest(EffectsRequest* request) { + if (m_bShuttingDown) { + // Catch all delete Messages since the engine is already down + // and we cannot wait for a communication cycle + collectGarbage(request); + } + + if (m_pRequestPipe.isNull()) { + delete request; + return false; + } + + // This is effectively only garbage collection at this point so only deal + // with responses when writing new requests. + processEffectsResponses(); + + request->request_id = m_nextRequestId++; + // TODO(XXX) use preallocated requests to avoid delete calls from engine + if (m_pRequestPipe->writeMessage(request)) { + m_activeRequests[request->request_id] = request; + return true; + } + delete request; + return false; +} + +void EffectsMessenger::processEffectsResponses() { + if (m_pRequestPipe.isNull()) { + return; + } + + EffectsResponse response; + while (m_pRequestPipe->readMessage(&response)) { + QHash::iterator it = + m_activeRequests.find(response.request_id); + + VERIFY_OR_DEBUG_ASSERT(it != m_activeRequests.end()) { + qWarning() << debugString() + << "WARNING: EffectsResponse with an inactive request_id:" + << response.request_id; + } + + while (it != m_activeRequests.end() && + it.key() == response.request_id) { + EffectsRequest* pRequest = it.value(); + + // Don't check whether the response was successful here because + // specific errors should be caught with DEBUG_ASSERTs in + // EngineEffectsMessenger and functions it calls to handle requests. + + collectGarbage(pRequest); + + delete pRequest; + it = m_activeRequests.erase(it); + } + } +} + +void EffectsMessenger::collectGarbage(const EffectsRequest* pRequest) { + if (pRequest->type == EffectsRequest::REMOVE_EFFECT_FROM_CHAIN) { + if (kEffectDebugOutput) { + qDebug() << debugString() << "delete" << pRequest->RemoveEffectFromChain.pEffect; + } + delete pRequest->RemoveEffectFromChain.pEffect; + } else if (pRequest->type == EffectsRequest::REMOVE_EFFECT_CHAIN) { + if (kEffectDebugOutput) { + qDebug() << debugString() << "delete" << pRequest->RemoveEffectChain.pChain; + } + delete pRequest->RemoveEffectChain.pChain; + } else if (pRequest->type == EffectsRequest::DISABLE_EFFECT_CHAIN_FOR_INPUT_CHANNEL) { + if (kEffectDebugOutput) { + qDebug() << debugString() << "deleting states for input channel" + << pRequest->DisableInputChannelForChain.pChannelHandle + << "for EngineEffectChain" << pRequest->pTargetChain; + } + pRequest->pTargetChain->deleteStatesForInputChannel( + pRequest->DisableInputChannelForChain.pChannelHandle); + } +} diff --git a/src/effects/effectsmessenger.h b/src/effects/effectsmessenger.h new file mode 100644 index 000000000000..5c0f9f008797 --- /dev/null +++ b/src/effects/effectsmessenger.h @@ -0,0 +1,30 @@ +#pragma once + +#include "engine/effects/message.h" + +/// EffectsMessenger sends EffectsRequest and receives EffectsResponses +class EffectsMessenger { + public: + EffectsMessenger(EffectsRequestPipe* pRequestPipe, EffectsResponsePipe* m_pResponsePipe); + ~EffectsMessenger(); + /// Write an EffectsRequest to the EngineEffectsManager. EffectsMessenger takes + /// ownership of request and deletes it once a response is received. + bool writeRequest(EffectsRequest* request); + + void startShutdownProcess(); + void processEffectsResponses(); + + private: + void collectGarbage(const EffectsRequest* pRequest); + + QString debugString() const { + return "EffectsMessenger"; + } + + bool m_bShuttingDown; + + QScopedPointer m_pRequestPipe; + QScopedPointer m_pResponsePipe; + qint64 m_nextRequestId; + QHash m_activeRequests; +}; diff --git a/src/effects/specialeffectchainslots.cpp b/src/effects/specialeffectchainslots.cpp index 75a97247f21d..b21286fd88b5 100644 --- a/src/effects/specialeffectchainslots.cpp +++ b/src/effects/specialeffectchainslots.cpp @@ -4,12 +4,14 @@ #include "mixer/playermanager.h" StandardEffectChainSlot::StandardEffectChainSlot(unsigned int iChainNumber, - EffectsManager* pEffectsManager, - const QString& id) + EffectsManager* pEffectsManager, + EffectsMessengerPointer pEffectsMessenger, + const QString& id) : EffectChainSlot(formatEffectChainSlotGroup(iChainNumber), - pEffectsManager, - SignalProcessingStage::Postfader, - formatEffectChainSlotGroup(iChainNumber)) { + pEffectsManager, + pEffectsMessenger, + SignalProcessingStage::Postfader, + formatEffectChainSlotGroup(iChainNumber)) { for (int i = 0; i < kNumEffectsPerUnit; ++i) { addEffectSlot(formatEffectSlotGroup(iChainNumber, i)); } @@ -39,12 +41,13 @@ QString StandardEffectChainSlot::formatEffectSlotGroup(const int iChainSlotNumbe .arg(QString::number(iEffectSlotNumber + 1)); } - -OutputEffectChainSlot::OutputEffectChainSlot(EffectsManager* pEffectsManager) +OutputEffectChainSlot::OutputEffectChainSlot(EffectsManager* pEffectsManager, + EffectsMessengerPointer pEffectsMessenger) : EffectChainSlot(formatEffectChainSlotGroup("[Master]"), - pEffectsManager, - SignalProcessingStage::Postfader, - formatEffectChainSlotGroup("[Master]")) { + pEffectsManager, + pEffectsMessenger, + SignalProcessingStage::Postfader, + formatEffectChainSlotGroup("[Master]")) { addEffectSlot("[OutputEffectRack_[Master]_Effect1]"); m_effectSlots[0]->setEnabled(true); @@ -68,16 +71,19 @@ OutputEffectChainSlot::OutputEffectChainSlot(EffectsManager* pEffectsManager) sendParameterUpdate(); } -QString OutputEffectChainSlot::formatEffectChainSlotGroup(const QString& group) { +QString OutputEffectChainSlot::formatEffectChainSlotGroup( + const QString& group) { return QString("[OutputEffectRack_%1]").arg(group); } PerGroupEffectChainSlot::PerGroupEffectChainSlot(const QString& group, const QString& chainSlotGroup, SignalProcessingStage stage, - EffectsManager* pEffectsManager) + EffectsManager* pEffectsManager, + EffectsMessengerPointer pEffectsMessenger) : EffectChainSlot(chainSlotGroup, pEffectsManager, + pEffectsMessenger, stage, chainSlotGroup) { // Set the chain to be fully wet. @@ -87,7 +93,7 @@ PerGroupEffectChainSlot::PerGroupEffectChainSlot(const QString& group, // TODO(rryan): remove. const ChannelHandleAndGroup* handleAndGroup = nullptr; for (const ChannelHandleAndGroup& handle_group : - m_pEffectsManager->registeredInputChannels()) { + m_pEffectsManager->registeredInputChannels()) { if (handle_group.name() == group) { handleAndGroup = &handle_group; break; @@ -100,12 +106,14 @@ PerGroupEffectChainSlot::PerGroupEffectChainSlot(const QString& group, enableForInputChannel(*handleAndGroup); } -QuickEffectChainSlot::QuickEffectChainSlot( - const QString& group, EffectsManager* pEffectsManager) +QuickEffectChainSlot::QuickEffectChainSlot(const QString& group, + EffectsManager* pEffectsManager, + EffectsMessengerPointer pEffectsMessenger) : PerGroupEffectChainSlot(group, formatEffectChainSlotGroup(group), SignalProcessingStage::Postfader, - pEffectsManager) { + pEffectsManager, + pEffectsMessenger) { for (int i = 0; i < kNumEffectsPerUnit; ++i) { addEffectSlot(formatEffectSlotGroup(group, i)); m_effectSlots.at(i)->setEnabled(true); @@ -136,12 +144,14 @@ QString QuickEffectChainSlot::formatEffectSlotGroup( .arg(QString::number(iEffectSlotNumber + 1)); } -EqualizerEffectChainSlot::EqualizerEffectChainSlot( - const QString& group, EffectsManager* pEffectsManager) +EqualizerEffectChainSlot::EqualizerEffectChainSlot(const QString& group, + EffectsManager* pEffectsManager, + EffectsMessengerPointer pEffectsMessenger) : PerGroupEffectChainSlot(group, formatEffectChainSlotGroup(group), SignalProcessingStage::Prefader, - pEffectsManager), + pEffectsManager, + pEffectsMessenger), m_pCOFilterWaveform( new ControlObject(ConfigKey(group, "filterWaveformEnable"))) { // Add a single effect slot diff --git a/src/effects/specialeffectchainslots.h b/src/effects/specialeffectchainslots.h index 1bc61a9e6378..663259f8d441 100644 --- a/src/effects/specialeffectchainslots.h +++ b/src/effects/specialeffectchainslots.h @@ -10,8 +10,9 @@ class StandardEffectChainSlot : public EffectChainSlot { public: StandardEffectChainSlot(unsigned int iChainNumber, - EffectsManager* pEffectsManager, - const QString& id = QString()); + EffectsManager* pEffectsManager, + EffectsMessengerPointer pEffectsMessenger, + const QString& id = QString()); static QString formatEffectChainSlotGroup(const int iChainNumber); static QString formatEffectSlotGroup(const int iChainSlotNumber, const int iEffectSlotNumber); @@ -19,7 +20,8 @@ class StandardEffectChainSlot : public EffectChainSlot { class OutputEffectChainSlot : public EffectChainSlot { public: - OutputEffectChainSlot(EffectsManager* pEffectsManager); + OutputEffectChainSlot(EffectsManager* pEffectsManager, + EffectsMessengerPointer pEffectsMessenger); private: static QString formatEffectChainSlotGroup(const QString& group); @@ -30,13 +32,15 @@ class PerGroupEffectChainSlot : public EffectChainSlot { PerGroupEffectChainSlot(const QString& group, const QString& chainSlotGroup, SignalProcessingStage stage, - EffectsManager* pEffectsManager); + EffectsManager* pEffectsManager, + EffectsMessengerPointer pEffectsMessenger); }; class QuickEffectChainSlot : public PerGroupEffectChainSlot { public: QuickEffectChainSlot(const QString& group, - EffectsManager* pEffectsManager); + EffectsManager* pEffectsManager, + EffectsMessengerPointer pEffectsMessenger); void loadEffect(const unsigned int iEffectSlotNumber, const EffectManifestPointer pManifest, @@ -52,7 +56,8 @@ class QuickEffectChainSlot : public PerGroupEffectChainSlot { class EqualizerEffectChainSlot : public PerGroupEffectChainSlot { public: EqualizerEffectChainSlot(const QString& group, - EffectsManager* pEffectsManager); + EffectsManager* pEffectsManager, + EffectsMessengerPointer pEffectsMessenger); void loadEffect(const unsigned int iEffectSlotNumber, const EffectManifestPointer pManifest, From 0b22eb8a0fd1358aaa3bd9679fbea2d5d450e5a6 Mon Sep 17 00:00:00 2001 From: Be Date: Fri, 1 May 2020 15:36:25 -0500 Subject: [PATCH 129/443] EffectsManager: remove old commented out code --- src/effects/effectsmanager.h | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/effects/effectsmanager.h b/src/effects/effectsmanager.h index 0798f67e75bf..a35d74b7380a 100644 --- a/src/effects/effectsmanager.h +++ b/src/effects/effectsmanager.h @@ -65,13 +65,6 @@ class EffectsManager : public QObject { /// takes ownership of the backend, and will delete it when EffectsManager is /// being deleted. Not thread safe -- use only from the GUI thread. void addEffectsBackend(EffectsBackendPointer pEffectsBackend); - - // To support cycling through effect chains, there is a global ordering of - // chains. These methods allow you to get the next or previous chain given - // your current chain. - // EffectChainSlotPointer getNextEffectChain(EffectChainSlotPointer pEffectChainSlot); - // EffectChainSlotPointer getPrevEffectChain(EffectChainSlotPointer pEffectChainSlot); - static const int kNumStandardEffectChains = 4; bool isAdoptMetaknobValueEnabled() const; From 82ea197b0c3c23f814ea5da2483d303e065aa455 Mon Sep 17 00:00:00 2001 From: Be Date: Fri, 1 May 2020 15:36:55 -0500 Subject: [PATCH 130/443] EffectsManager: make addEffectsBackend method private This was previously public because MixxxMainWindow created the EffectsBackends so DlgPrefLV2 had access to LV2Backend, but DlgPrefLV2 has been removed. --- src/effects/effectsmanager.h | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/effects/effectsmanager.h b/src/effects/effectsmanager.h index a35d74b7380a..486d68d41f32 100644 --- a/src/effects/effectsmanager.h +++ b/src/effects/effectsmanager.h @@ -61,10 +61,6 @@ class EffectsManager : public QObject { return m_pChainPresetManager; } - /// Add an effect backend to be managed by EffectsManager. EffectsManager - /// takes ownership of the backend, and will delete it when EffectsManager is - /// being deleted. Not thread safe -- use only from the GUI thread. - void addEffectsBackend(EffectsBackendPointer pEffectsBackend); static const int kNumStandardEffectChains = 4; bool isAdoptMetaknobValueEnabled() const; @@ -174,6 +170,8 @@ class EffectsManager : public QObject { return "EffectsManager"; } + void addEffectsBackend(EffectsBackendPointer pEffectsBackend); + void connectChainSlotSignals(EffectChainSlotPointer pChainSlot); void loadDefaultEffectPresets(); From a9e963fc431dbc52f4704faec94f07906c32643d Mon Sep 17 00:00:00 2001 From: Be Date: Fri, 1 May 2020 17:41:42 -0500 Subject: [PATCH 131/443] extract EffectsBackendManager from EffectsManager EffectsManager got too big. --- CMakeLists.txt | 1 + src/effects/backends/effectmanifest.cpp | 10 + src/effects/backends/effectmanifest.h | 2 + .../backends/effectsbackendmanager.cpp | 104 +++++++++++ src/effects/backends/effectsbackendmanager.h | 33 ++++ src/effects/effectsmanager.cpp | 172 ++---------------- src/effects/effectsmanager.h | 30 +-- .../presets/effectchainpresetmanager.cpp | 16 +- .../presets/effectchainpresetmanager.h | 6 +- src/preferences/dialog/dlgprefeffects.cpp | 7 +- src/preferences/dialog/dlgprefeffects.h | 1 + src/preferences/dialog/dlgprefeq.cpp | 45 +++-- src/preferences/dialog/dlgprefeq.h | 7 +- src/preferences/effectsettingsmodel.cpp | 2 +- src/widget/weffectselector.cpp | 2 +- 15 files changed, 229 insertions(+), 209 deletions(-) create mode 100644 src/effects/backends/effectsbackendmanager.cpp create mode 100644 src/effects/backends/effectsbackendmanager.h diff --git a/CMakeLists.txt b/CMakeLists.txt index f6f6ed560101..5a2ef32ac14d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -268,6 +268,7 @@ add_library(mixxx-lib STATIC EXCLUDE_FROM_ALL src/effects/backends/builtin/reverbeffect.cpp src/effects/backends/builtin/threebandbiquadeqeffect.cpp src/effects/backends/builtin/tremoloeffect.cpp + src/effects/backends/effectsbackendmanager.cpp src/effects/presets/effectchainpreset.cpp src/effects/presets/effectchainpresetmanager.cpp src/effects/presets/effectparameterpreset.cpp diff --git a/src/effects/backends/effectmanifest.cpp b/src/effects/backends/effectmanifest.cpp index d1c0666b8244..a33b5aff0a6f 100644 --- a/src/effects/backends/effectmanifest.cpp +++ b/src/effects/backends/effectmanifest.cpp @@ -3,3 +3,13 @@ QDebug operator<<(QDebug dbg, const EffectManifest& manifest) { return dbg.maybeSpace() << QString("EffectManifest(%1)").arg(manifest.id()); } + +bool EffectManifest::alphabetize( + EffectManifestPointer pManifest1, EffectManifestPointer pManifest2) { + // Sort built-in effects first before external plugins + int backendNameComparision = static_cast(pManifest1->backendType()) - + static_cast(pManifest2->backendType()); + int displayNameComparision = QString::localeAwareCompare( + pManifest1->displayName(), pManifest2->displayName()); + return (backendNameComparision ? (backendNameComparision < 0) : (displayNameComparision < 0)); +} diff --git a/src/effects/backends/effectmanifest.h b/src/effects/backends/effectmanifest.h index f9ab511875bf..e815f3c5fddf 100644 --- a/src/effects/backends/effectmanifest.h +++ b/src/effects/backends/effectmanifest.h @@ -196,6 +196,8 @@ class EffectManifest { return other.id() < m_id; } + static bool alphabetize(EffectManifestPointer pManifest1, EffectManifestPointer pManifest2); + private: QString debugString() const { return QString("EffectManifest(%1)").arg(m_id); diff --git a/src/effects/backends/effectsbackendmanager.cpp b/src/effects/backends/effectsbackendmanager.cpp new file mode 100644 index 000000000000..d668e32fcc51 --- /dev/null +++ b/src/effects/backends/effectsbackendmanager.cpp @@ -0,0 +1,104 @@ +#include "effects/backends/effectsbackendmanager.h" + +#include "control/controlobject.h" +#include "effects/backends/builtin/builtinbackend.h" +#include "effects/backends/effectprocessor.h" +#ifdef __LILV__ +#include "effects/backends/lv2/lv2backend.h" +#endif +#include "effects/presets/effectpreset.h" + +EffectsBackendManager::EffectsBackendManager() { + m_pNumEffectsAvailable = std::make_unique( + ConfigKey("[Master]", "num_effectsavailable")); + m_pNumEffectsAvailable->setReadOnly(); + + addBackend(EffectsBackendPointer(new BuiltInBackend())); +#ifdef __LILV__ + addBackend(EffectsBackendPointer(new LV2Backend())); +#endif +} + +void EffectsBackendManager::addBackend(EffectsBackendPointer pBackend) { + VERIFY_OR_DEBUG_ASSERT(pBackend) { + return; + } + + m_effectsBackends.insert(pBackend->getType(), pBackend); + + QList backendEffects = pBackend->getEffectIds(); + for (const QString& effectId : backendEffects) { + m_manifests.append(pBackend->getManifest(effectId)); + } + + m_pNumEffectsAvailable->forceSet(m_manifests.size()); + + std::sort(m_manifests.begin(), + m_manifests.end(), + EffectManifest::alphabetize); +} + +EffectManifestPointer EffectsBackendManager::getManifestFromUniqueId( + const QString& uid) const { + if (kEffectDebugOutput) { + //qDebug() << "EffectsBackendManager::getManifestFromUniqueId" << uid; + } + if (uid.isEmpty()) { + // Do not DEBUG_ASSERT, this may be a valid request for a nullptr to + // unload an effect. + return EffectManifestPointer(); + } + int delimiterIndex = uid.lastIndexOf(" "); + EffectBackendType backendType = + EffectManifest::backendTypeFromString(uid.mid(delimiterIndex + 1)); + VERIFY_OR_DEBUG_ASSERT(backendType != EffectBackendType::Unknown) { + // Mixxx 2.0 - 2.2 did not store the backend type in mixxx.cfg, + // so this code will be executed once when upgrading to Mixxx 2.3. + // This debug assertion is safe to ignore in that case. If it is + // triggered at any later time, there is a bug somewhere. + // Do not manipulate the string passed to this function, just pass + // it directly to BuiltInBackend. + return m_effectsBackends.value(EffectBackendType::BuiltIn) + ->getManifest(uid); + } + return m_effectsBackends.value(backendType) + ->getManifest(uid.mid(-1, delimiterIndex + 1)); +} + +EffectManifestPointer EffectsBackendManager::getManifest( + const QString& id, EffectBackendType backendType) const { + return m_effectsBackends.value(backendType)->getManifest(id); +} + +const QString EffectsBackendManager::getDisplayNameForEffectPreset( + EffectPresetPointer pPreset) const { + QString displayName(QObject::tr("None")); + if (pPreset == nullptr || pPreset->isEmpty()) { + return displayName; + } + + bool manifestFound = false; + for (const auto pManifest : m_manifests) { + if (pManifest->id() == pPreset->id() && + pManifest->backendType() == pPreset->backendType()) { + displayName = pManifest->name(); + manifestFound = true; + break; + } + } + DEBUG_ASSERT(manifestFound); + return displayName; +} + +std::unique_ptr EffectsBackendManager::createProcessor( + const EffectManifestPointer pManifest) { + if (!pManifest) { + // This can be a valid request to unload an effect, so do not DEBUG_ASSERT. + return std::unique_ptr(nullptr); + } + EffectsBackendPointer pBackend = m_effectsBackends.value(pManifest->backendType()); + VERIFY_OR_DEBUG_ASSERT(pBackend) { + return std::unique_ptr(nullptr); + } + return pBackend->createProcessor(pManifest); +} diff --git a/src/effects/backends/effectsbackendmanager.h b/src/effects/backends/effectsbackendmanager.h new file mode 100644 index 000000000000..a200543340d0 --- /dev/null +++ b/src/effects/backends/effectsbackendmanager.h @@ -0,0 +1,33 @@ +#pragma once + +#include "effects/backends/effectsbackend.h" + +class ControlObject; + +/// EffectsBackendManager initializes EffectsBackends, maintains the list of +/// available EffectManifests, and creates EffectProcessors from EffectManifests. +class EffectsBackendManager { + public: + EffectsBackendManager(); + ~EffectsBackendManager() = default; + + inline const QList& getManifests() const { + return m_manifests; + }; + EffectManifestPointer getManifestFromUniqueId(const QString& uid) const; + EffectManifestPointer getManifest(const QString& id, EffectBackendType backendType) const; + const QString getDisplayNameForEffectPreset(EffectPresetPointer pPreset) const; + bool isEQ(const QString& effectId) const; + + std::unique_ptr createProcessor(const EffectManifestPointer pManifest); + + private: + void addBackend(EffectsBackendPointer pEffectsBackend); + + std::unique_ptr m_pNumEffectsAvailable; + + QHash m_effectsBackends; + QList m_manifests; +}; + +typedef QSharedPointer EffectsBackendManagerPointer; diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index db320b3fa75d..c2ee9109180e 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -4,9 +4,6 @@ #include #include -#include "effects/backends/builtin/builtinbackend.h" -#include "effects/backends/builtin/filtereffect.h" -#include "effects/backends/lv2/lv2backend.h" #include "effects/effectslot.h" #include "effects/effectsmessenger.h" #include "effects/presets/effectchainpreset.h" @@ -34,6 +31,8 @@ EffectsManager::EffectsManager(QObject* pParent, m_pConfig(pConfig) { qRegisterMetaType("EffectChainMixMode"); + m_pBackendManager = EffectsBackendManagerPointer(new EffectsBackendManager()); + QPair requestPipes = TwoWayMessagePipe::makeTwoWayMessagePipe( kEffectMessagePipeFifoSize, kEffectMessagePipeFifoSize); @@ -41,18 +40,8 @@ EffectsManager::EffectsManager(QObject* pParent, requestPipes.first, requestPipes.second)); m_pEngineEffectsManager = new EngineEffectsManager(requestPipes.second); - m_pNumEffectsAvailable = new ControlObject(ConfigKey("[Master]", "num_effectsavailable")); - m_pNumEffectsAvailable->setReadOnly(); - - addEffectsBackend(EffectsBackendPointer(new BuiltInBackend())); -#ifdef __LILV__ - addEffectsBackend(EffectsBackendPointer(new LV2Backend())); -#endif - - EffectManifestPointer filterEffectManifest = getManifest(FilterEffect::getId(), - EffectBackendType::BuiltIn); m_pChainPresetManager = EffectChainPresetManagerPointer( - new EffectChainPresetManager(pConfig, this, filterEffectManifest)); + new EffectChainPresetManager(pConfig, m_pBackendManager)); } EffectsManager::~EffectsManager() { @@ -73,39 +62,6 @@ EffectsManager::~EffectsManager() { m_outputEffectChainSlot.clear(); m_effectChainSlotsByGroup.clear(); m_pMessenger->processEffectsResponses(); - - m_effectsBackends.clear(); - - // delete m_pHiEqFreq; - // delete m_pLoEqFreq; - delete m_pNumEffectsAvailable; -} - -bool alphabetizeEffectManifests(EffectManifestPointer pManifest1, - EffectManifestPointer pManifest2) { - // Sort built-in effects first before external plugins - int backendNameComparision = static_cast(pManifest1->backendType()) - - static_cast(pManifest2->backendType()); - int displayNameComparision = QString::localeAwareCompare( - pManifest1->displayName(), pManifest2->displayName()); - return (backendNameComparision ? (backendNameComparision < 0) : (displayNameComparision < 0)); -} - -void EffectsManager::addEffectsBackend(EffectsBackendPointer pBackend) { - VERIFY_OR_DEBUG_ASSERT(pBackend) { - return; - } - m_effectsBackends.insert(pBackend->getType(), pBackend); - - QList backendEffects = pBackend->getEffectIds(); - for (const QString& effectId : backendEffects) { - m_availableEffectManifests.append(pBackend->getManifest(effectId)); - } - - m_pNumEffectsAvailable->forceSet(m_availableEffectManifests.size()); - - std::sort(m_availableEffectManifests.begin(), m_availableEffectManifests.end(), - alphabetizeEffectManifests); } bool EffectsManager::isAdoptMetaknobValueEnabled() const { @@ -165,24 +121,11 @@ void EffectsManager::loadEffect(EffectChainSlotPointer pChainSlot, pChainSlot->loadEffect( iEffectSlotNumber, pManifest, - createProcessor(pManifest), + m_pBackendManager->createProcessor(pManifest), pPreset, adoptMetaknobFromPreset); } -std::unique_ptr EffectsManager::createProcessor( - const EffectManifestPointer pManifest) { - if (!pManifest) { - // This can be a valid request to unload an effect, so do not DEBUG_ASSERT. - return std::unique_ptr(nullptr); - } - EffectsBackendPointer pBackend = m_effectsBackends.value(pManifest->backendType()); - VERIFY_OR_DEBUG_ASSERT(pBackend) { - return std::unique_ptr(nullptr); - } - return pBackend->createProcessor(pManifest); -} - ParameterMap EffectsManager::getLoadedParameters(int chainNumber, int effectNumber) const { return m_standardEffectChainSlots.at(chainNumber)->getEffectSlot(effectNumber)->getLoadedParameters(); } @@ -223,16 +166,12 @@ void EffectsManager::loadEffectChainPreset(EffectChainSlot* pChainSlot, effectSlot++; continue; } - EffectsBackendPointer pBackend = m_effectsBackends.value(pEffectPreset->backendType()); - VERIFY_OR_DEBUG_ASSERT(pBackend) { - effectSlot++; - continue; - } - EffectManifestPointer pManifest = pBackend->getManifest(pEffectPreset->id()); + EffectManifestPointer pManifest = m_pBackendManager->getManifest( + pEffectPreset->id(), pEffectPreset->backendType()); pChainSlot->loadEffect( effectSlot, pManifest, - createProcessor(pManifest), + m_pBackendManager->createProcessor(pManifest), pEffectPreset, true); effectSlot++; @@ -260,21 +199,6 @@ void EffectsManager::loadPresetToStandardChain(int chainNumber, EffectChainPrese loadEffectChainPreset(m_standardEffectChainSlots.at(chainNumber).get(), pPreset); } -const QList EffectsManager::getAvailableEffectManifestsFiltered( - EffectManifestFilterFnc filter) const { - if (filter == nullptr) { - return m_availableEffectManifests; - } - - QList list; - for (const auto& pManifest : m_availableEffectManifests) { - if (filter(pManifest.data())) { - list.append(pManifest); - } - } - return list; -} - QString EffectsManager::getNextEffectId(const QString& effectId) { if (m_visibleEffectManifests.isEmpty()) { return QString(); @@ -315,47 +239,6 @@ QString EffectsManager::getPrevEffectId(const QString& effectId) { return m_visibleEffectManifests.at(index)->id(); } -void EffectsManager::getEffectManifestAndBackend( - const QString& effectId, - EffectManifestPointer* ppManifest, EffectsBackend** ppBackend) const { - for (const auto& pBackend : m_effectsBackends) { - if (pBackend->canInstantiateEffect(effectId)) { - *ppManifest = pBackend->getManifest(effectId); - *ppBackend = pBackend.data(); - } - } -} - -EffectManifestPointer EffectsManager::getManifestFromUniqueId(const QString& uid) const { - if (kEffectDebugOutput) { - //qDebug() << "EffectsManager::getManifestFromUniqueId" << uid; - } - if (uid.isEmpty()) { - // Do not DEBUG_ASSERT, this may be a valid request for a nullptr to - // unload an effect. - return EffectManifestPointer(); - } - int delimiterIndex = uid.lastIndexOf(" "); - EffectBackendType backendType = EffectManifest::backendTypeFromString( - uid.mid(delimiterIndex+1)); - VERIFY_OR_DEBUG_ASSERT(backendType != EffectBackendType::Unknown) { - // Mixxx 2.0 - 2.2 did not store the backend type in mixxx.cfg, - // so this code will be executed once when upgrading to Mixxx 2.3. - // This debug assertion is safe to ignore in that case. If it is - // triggered at any later time, there is a bug somewhere. - // Do not manipulate the string passed to this function, just pass - // it directly to BuiltInBackend. - return m_effectsBackends.value(EffectBackendType::BuiltIn)->getManifest(uid); - } - return m_effectsBackends.value(backendType)->getManifest( - uid.mid(-1, delimiterIndex+1)); -} - -EffectManifestPointer EffectsManager::getManifest( - const QString& id, EffectBackendType backendType) const { - return m_effectsBackends.value(backendType)->getManifest(id); -} - void EffectsManager::addStandardEffectChainSlots() { for (int i = 0; i < EffectsManager::kNumStandardEffectChains; ++i) { VERIFY_OR_DEBUG_ASSERT(!m_effectChainSlotsByGroup.contains( @@ -482,8 +365,9 @@ EffectParameterSlotBasePointer EffectsManager::getEffectParameterSlot( void EffectsManager::setEffectVisibility(EffectManifestPointer pManifest, bool visible) { if (visible && !m_visibleEffectManifests.contains(pManifest)) { auto insertion_point = std::lower_bound(m_visibleEffectManifests.begin(), - m_visibleEffectManifests.end(), - pManifest, alphabetizeEffectManifests); + m_visibleEffectManifests.end(), + pManifest, + EffectManifest::alphabetize); m_visibleEffectManifests.insert(insertion_point, pManifest); emit visibleEffectsUpdated(); } else if (!visible) { @@ -523,19 +407,18 @@ void EffectsManager::loadDefaultEffectPresets() { } EffectPresetPointer pEffectPreset(new EffectPreset(doc.documentElement())); if (!pEffectPreset->isEmpty()) { - EffectManifestPointer pManifest = getManifest(pEffectPreset->id(), pEffectPreset->backendType()); + EffectManifestPointer pManifest = m_pBackendManager->getManifest( + pEffectPreset->id(), pEffectPreset->backendType()); m_defaultPresets.insert(pManifest, pEffectPreset); } file.close(); } // If no preset was found, generate one from the manifest - for (const auto pBackend : m_effectsBackends) { - for (const auto pManifest : pBackend->getManifests()) { - if (!m_defaultPresets.contains(pManifest)) { - m_defaultPresets.insert(pManifest, - EffectPresetPointer(new EffectPreset(pManifest))); - } + for (const auto& pManifest : m_pBackendManager->getManifests()) { + if (!m_defaultPresets.contains(pManifest)) { + m_defaultPresets.insert(pManifest, + EffectPresetPointer(new EffectPreset(pManifest))); } } } @@ -545,8 +428,8 @@ void EffectsManager::saveDefaultForEffect(EffectPresetPointer pEffectPreset) { return; } - const auto pBackend = m_effectsBackends.value(pEffectPreset->backendType()); - const auto pManifest = pBackend->getManifest(pEffectPreset->id()); + const auto pManifest = m_pBackendManager->getManifest( + pEffectPreset->id(), pEffectPreset->backendType()); m_defaultPresets.insert(pManifest, pEffectPreset); QDomDocument doc(EffectXml::Effect); @@ -592,25 +475,6 @@ void EffectsManager::saveDefaultForEffect(int unitNumber, int effectNumber) { saveDefaultForEffect(pPreset); } -const QString EffectsManager::getDisplayNameForEffectPreset(EffectPresetPointer pPreset) { - QString displayName(tr("None")); - if (pPreset == nullptr || pPreset->isEmpty()) { - return displayName; - } - - bool manifestFound = false; - for (const auto pManifest : m_availableEffectManifests) { - if (pManifest->id() == pPreset->id() && - pManifest->backendType() == pPreset->backendType()) { - displayName = pManifest->name(); - manifestFound = true; - break; - } - } - DEBUG_ASSERT(manifestFound); - return displayName; -} - void EffectsManager::savePresetFromStandardEffectChain(int chainNumber) { StandardEffectChainSlotPointer pStandardChainSlot = m_standardEffectChainSlots.at(chainNumber); EffectChainSlot* genericChainSlot = static_cast(pStandardChainSlot.get()); diff --git a/src/effects/effectsmanager.h b/src/effects/effectsmanager.h index 486d68d41f32..aca801802eda 100644 --- a/src/effects/effectsmanager.h +++ b/src/effects/effectsmanager.h @@ -10,6 +10,7 @@ #include "control/controlpotmeter.h" #include "control/controlpushbutton.h" #include "effects/backends/effectmanifestparameter.h" +#include "effects/backends/effectsbackendmanager.h" #include "effects/presets/effectchainpresetmanager.h" #include "effects/specialeffectchainslots.h" #include "engine/channelhandle.h" @@ -43,8 +44,6 @@ typedef QMap> ParameterMap; class EffectsManager : public QObject { Q_OBJECT public: - typedef bool (*EffectManifestFilterFnc)(EffectManifest* pManifest); - EffectsManager(QObject* pParent, UserSettingsPointer pConfig, ChannelHandleFactory* pChannelHandleFactory); virtual ~EffectsManager(); @@ -61,6 +60,10 @@ class EffectsManager : public QObject { return m_pChainPresetManager; } + const EffectsBackendManagerPointer getBackendManager() const { + return m_pBackendManager; + } + static const int kNumStandardEffectChains = 4; bool isAdoptMetaknobValueEnabled() const; @@ -95,9 +98,6 @@ class EffectsManager : public QObject { EffectPresetPointer pPreset = nullptr, bool adoptMetaknobFromPreset = false); - std::unique_ptr createProcessor( - const EffectManifestPointer pManifest); - ParameterMap getLoadedParameters(int chainNumber, int effectNumber) const; ParameterMap getHiddenParameters(int chainNumber, int effectNumber) const; @@ -109,8 +109,6 @@ class EffectsManager : public QObject { void loadEffectChainPreset(EffectChainSlot* pChainSlot, const QString& name); void loadPresetToStandardChain(int chainNumber, EffectChainPresetPointer pPreset); - const QString getDisplayNameForEffectPreset(EffectPresetPointer pPreset); - void addStandardEffectChainSlots(); EffectChainSlotPointer getStandardEffectChainSlot(int unitNumber) const; @@ -131,21 +129,9 @@ class EffectsManager : public QObject { QString getNextEffectId(const QString& effectId); QString getPrevEffectId(const QString& effectId); - inline const QList& getAvailableEffectManifests() const { - return m_availableEffectManifests; - }; inline const QList& getVisibleEffectManifests() const { return m_visibleEffectManifests; }; - const QList getAvailableEffectManifestsFiltered( - EffectManifestFilterFnc filter) const; - bool isEQ(const QString& effectId) const; - - void getEffectManifestAndBackend( - const QString& effectId, - EffectManifestPointer* ppManifest, EffectsBackend** ppBackend) const; - EffectManifestPointer getManifestFromUniqueId(const QString& uid) const; - EffectManifestPointer getManifest(const QString& id, EffectBackendType backendType) const; void setEffectVisibility(EffectManifestPointer pManifest, bool visibility); bool getEffectVisibility(EffectManifestPointer pManifest); @@ -170,8 +156,6 @@ class EffectsManager : public QObject { return "EffectsManager"; } - void addEffectsBackend(EffectsBackendPointer pEffectsBackend); - void connectChainSlotSignals(EffectChainSlotPointer pChainSlot); void loadDefaultEffectPresets(); @@ -181,11 +165,8 @@ class EffectsManager : public QObject { ChannelHandleFactory* m_pChannelHandleFactory; - QHash m_effectsBackends; - QList m_availableEffectManifests; QList m_visibleEffectManifests; - ControlObject* m_pNumEffectsAvailable; // We need to create Control Objects for Equalizers' frequencies ControlPotmeter m_loEqFreq; ControlPotmeter m_hiEqFreq; @@ -206,6 +187,7 @@ class EffectsManager : public QObject { QHash m_defaultPresets; + EffectsBackendManagerPointer m_pBackendManager; EngineEffectsManager* m_pEngineEffectsManager; EffectsMessengerPointer m_pMessenger; EffectChainPresetManagerPointer m_pChainPresetManager; diff --git a/src/effects/presets/effectchainpresetmanager.cpp b/src/effects/presets/effectchainpresetmanager.cpp index ff832b6f08c3..233bd768b968 100644 --- a/src/effects/presets/effectchainpresetmanager.cpp +++ b/src/effects/presets/effectchainpresetmanager.cpp @@ -5,6 +5,7 @@ #include #include +#include "effects/backends/builtin/filtereffect.h" #include "effects/effectsmanager.h" #include "effects/presets/effectxmlelements.h" @@ -14,13 +15,15 @@ const QString kEffectsXmlFile = "effects.xml"; } // anonymous namespace EffectChainPresetManager::EffectChainPresetManager(UserSettingsPointer pConfig, - EffectsManager* pEffectsManager, - EffectManifestPointer pDefaultQuickEffectManifest) - : m_pConfig(pConfig), m_pEffectsManager(pEffectsManager) { + EffectsBackendManagerPointer pBackendManager) + : m_pConfig(pConfig), + m_pBackendManager(pBackendManager) { // Generate the default QuickEffect chain preset instead of shipping it in // res/effects/chains because this uses the translated name. - m_pDefaultQuickEffectChainPreset = - EffectChainPresetPointer(new EffectChainPreset(EffectPresetPointer( + EffectManifestPointer pDefaultQuickEffectManifest = m_pBackendManager->getManifest( + FilterEffect::getId(), EffectBackendType::BuiltIn); + m_pDefaultQuickEffectChainPreset = EffectChainPresetPointer( + new EffectChainPreset(EffectPresetPointer( new EffectPreset(pDefaultQuickEffectManifest)))); m_pDefaultQuickEffectChainPreset->setName( pDefaultQuickEffectManifest->displayName()); @@ -103,8 +106,7 @@ void EffectChainPresetManager::importPreset() { } bool effectSupported = false; - for (EffectManifestPointer pManifest : - m_pEffectsManager->getAvailableEffectManifests()) { + for (EffectManifestPointer pManifest : m_pBackendManager->getManifests()) { if (pManifest->id() == pEffectPreset->id() && pManifest->backendType() == pEffectPreset->backendType()) { diff --git a/src/effects/presets/effectchainpresetmanager.h b/src/effects/presets/effectchainpresetmanager.h index 0983a91a3f69..b5f23a0eb556 100644 --- a/src/effects/presets/effectchainpresetmanager.h +++ b/src/effects/presets/effectchainpresetmanager.h @@ -3,6 +3,7 @@ #include #include +#include "effects/backends/effectsbackendmanager.h" #include "effects/presets/effectchainpreset.h" #include "preferences/usersettings.h" @@ -23,8 +24,7 @@ class EffectChainPresetManager : public QObject { public: EffectChainPresetManager( UserSettingsPointer pConfig, - EffectsManager* pEffectsManager, - EffectManifestPointer pDefaultQuickEffectManifest); + EffectsBackendManagerPointer pBackendManager); ~EffectChainPresetManager() = default; const QList getPresetsSorted() const { @@ -61,7 +61,7 @@ class EffectChainPresetManager : public QObject { QList m_effectChainPresetsSorted; UserSettingsPointer m_pConfig; - EffectsManager* m_pEffectsManager; + EffectsBackendManagerPointer m_pBackendManager; EffectChainPresetPointer m_pDefaultQuickEffectChainPreset; }; diff --git a/src/preferences/dialog/dlgprefeffects.cpp b/src/preferences/dialog/dlgprefeffects.cpp index f5b8712fb151..ff63b3668ba6 100644 --- a/src/preferences/dialog/dlgprefeffects.cpp +++ b/src/preferences/dialog/dlgprefeffects.cpp @@ -10,7 +10,8 @@ DlgPrefEffects::DlgPrefEffects(QWidget* pParent, : DlgPreferencePage(pParent), m_pConfig(pConfig), m_pEffectsManager(pEffectsManager), - m_pChainPresetManager(pEffectsManager->getChainPresetManager()) { + m_pChainPresetManager(pEffectsManager->getChainPresetManager()), + m_pBackendManager(pEffectsManager->getBackendManager()) { setupUi(this); m_availableEffectsModel.resetFromEffectManager(pEffectsManager); @@ -128,7 +129,7 @@ void DlgPrefEffects::availableEffectsListItemSelected(const QModelIndex& selecte if (effectId == QVariant().toString()) return; - EffectManifestPointer pManifest = m_pEffectsManager->getManifestFromUniqueId(effectId); + EffectManifestPointer pManifest = m_pBackendManager->getManifestFromUniqueId(effectId); effectName->setText(pManifest->name()); effectAuthor->setText(pManifest->author()); @@ -146,7 +147,7 @@ void DlgPrefEffects::slotChainPresetSelected(const QString& chainPresetName) { for (int i = 0; i < pChainPreset->effectPresets().size() - 1; ++i) { EffectPresetPointer pEffectPreset = pChainPreset->effectPresets().at(i); if (!pEffectPreset->isEmpty()) { - QString displayName = m_pEffectsManager->getDisplayNameForEffectPreset(pEffectPreset); + QString displayName = m_pBackendManager->getDisplayNameForEffectPreset(pEffectPreset); // Code uses 0-indexed numbers; users see 1 indexed numbers m_effectsLabels[i]->setText(QString::number(i + 1) + ": " + displayName); } else { diff --git a/src/preferences/dialog/dlgprefeffects.h b/src/preferences/dialog/dlgprefeffects.h index 6380afb289b1..06da6ad81a22 100644 --- a/src/preferences/dialog/dlgprefeffects.h +++ b/src/preferences/dialog/dlgprefeffects.h @@ -40,6 +40,7 @@ class DlgPrefEffects : public DlgPreferencePage, public Ui::DlgPrefEffectsDlg { UserSettingsPointer m_pConfig; EffectsManager* m_pEffectsManager; EffectChainPresetManagerPointer m_pChainPresetManager; + EffectsBackendManagerPointer m_pBackendManager; EffectSettingsModel* m_pAvailableEffectsModel; }; diff --git a/src/preferences/dialog/dlgprefeq.cpp b/src/preferences/dialog/dlgprefeq.cpp index a67f0c841ed4..14fff9a5a802 100644 --- a/src/preferences/dialog/dlgprefeq.cpp +++ b/src/preferences/dialog/dlgprefeq.cpp @@ -39,8 +39,7 @@ const QString kDefaultMasterEqId = QString(); const int kFrequencyUpperLimit = 20050; const int kFrequencyLowerLimit = 16; -DlgPrefEQ::DlgPrefEQ(QWidget* pParent, EffectsManager* pEffectsManager, - UserSettingsPointer pConfig) +DlgPrefEQ::DlgPrefEQ(QWidget* pParent, EffectsManager* pEffectsManager, UserSettingsPointer pConfig) : DlgPreferencePage(pParent), m_COLoFreq(kConfigKey, "LoEQFrequency"), m_COHiFreq(kConfigKey, "HiEQFrequency"), @@ -48,6 +47,7 @@ DlgPrefEQ::DlgPrefEQ(QWidget* pParent, EffectsManager* pEffectsManager, m_lowEqFreq(0.0), m_highEqFreq(0.0), m_pEffectsManager(pEffectsManager), + m_pBackendManager(pEffectsManager->getBackendManager()), m_firstSelectorLabel(NULL), m_pNumDecks(NULL), m_inSlotPopulateDeckEffectSelectors(false), @@ -131,7 +131,7 @@ void DlgPrefEQ::slotNumDecksChanged(double numDecks) { "EffectForGroup_" + group), kDefaultEqId); const EffectManifestPointer pEQManifest = - m_pEffectsManager->getManifestFromUniqueId(configuredEffect); + m_pBackendManager->getManifestFromUniqueId(configuredEffect); int selectedEQEffectIndex = 0; if (pEQManifest) { @@ -169,7 +169,7 @@ static bool hasSuperKnobLinking(EffectManifest* pManifest) { void DlgPrefEQ::slotPopulateDeckEffectSelectors() { m_inSlotPopulateDeckEffectSelectors = true; // prevents a recursive call - EffectsManager::EffectManifestFilterFnc filterEQ; + EffectManifestFilterFnc filterEQ; if (CheckBoxEqOnly->isChecked()) { m_pConfig->set(ConfigKey(kConfigKey, kEqsOnly), QString("yes")); filterEQ = isMixingEQ; @@ -184,15 +184,14 @@ void DlgPrefEQ::slotPopulateDeckEffectSelectors() { } void DlgPrefEQ::populateDeckBoxList( - const QList boxList, - EffectsManager::EffectManifestFilterFnc filterFunc) { - const QList pManifestList = - m_pEffectsManager->getAvailableEffectManifestsFiltered(filterFunc); + const QList boxList, + EffectManifestFilterFnc filterFunc) { + const QList pManifestList = getFilteredManifests(filterFunc); for (QComboBox* box : boxList) { // Populate comboboxes with all available effects // Save current selection const EffectManifestPointer pCurrentlySelectedManifest = - m_pEffectsManager->getManifestFromUniqueId( + m_pBackendManager->getManifestFromUniqueId( box->itemData(box->currentIndex()).toString()); box->clear(); @@ -373,7 +372,7 @@ void DlgPrefEQ::applySelectionsToDecks( int deck = 0; for (QComboBox* box : boxList) { const EffectManifestPointer pManifest = - m_pEffectsManager->getManifestFromUniqueId( + m_pBackendManager->getManifestFromUniqueId( box->itemData(box->currentIndex()).toString()); QString group = PlayerManager::groupForDeck(deck); @@ -552,10 +551,10 @@ void DlgPrefEQ::setUpMasterEQ() { const QString configuredEffectId = m_pConfig->getValue(ConfigKey(kConfigKey, "EffectForGroup_[Master]"), kDefaultMasterEqId); const EffectManifestPointer configuredEffectManifest = - m_pEffectsManager->getManifestFromUniqueId(configuredEffectId); + m_pBackendManager->getManifestFromUniqueId(configuredEffectId); const QList availableMasterEQEffects = - m_pEffectsManager->getAvailableEffectManifestsFiltered(isMasterEQ); + getFilteredManifests(isMasterEQ); for (const auto& pManifest : availableMasterEQEffects) { comboBoxMasterEq->addItem(pManifest->name(), QVariant(pManifest->uniqueId())); @@ -600,9 +599,8 @@ void DlgPrefEQ::slotMasterEqEffectChanged(int effectIndex) { m_masterEQLabels.clear(); const EffectManifestPointer pManifest = - m_pEffectsManager->getManifestFromUniqueId( - comboBoxMasterEq->itemData( - effectIndex).toString()); + m_pBackendManager->getManifestFromUniqueId( + comboBoxMasterEq->itemData(effectIndex).toString()); if (pManifest == nullptr) { pbResetMasterEq->hide(); @@ -736,3 +734,20 @@ void DlgPrefEQ::setMasterEQParameter(int i, double value) { } } } + +const QList DlgPrefEQ::getFilteredManifests( + EffectManifestFilterFnc filterFunc) const { + const QList allManifests = + m_pBackendManager->getManifests(); + if (filterFunc == nullptr) { + return allManifests; + } + + QList list; + for (const auto& pManifest : allManifests) { + if (filterFunc(pManifest.data())) { + list.append(pManifest); + } + } + return list; +} diff --git a/src/preferences/dialog/dlgprefeq.h b/src/preferences/dialog/dlgprefeq.h index b4f4d3d02802..963e951a78a3 100644 --- a/src/preferences/dialog/dlgprefeq.h +++ b/src/preferences/dialog/dlgprefeq.h @@ -77,9 +77,13 @@ class DlgPrefEQ : public DlgPreferencePage, public Ui::DlgPrefEQDlg { void updateBandFilter(int index, double value); void setUpMasterEQ(); void applySelections(); + + typedef bool (*EffectManifestFilterFnc)(EffectManifest* pManifest); + const QList getFilteredManifests( + EffectManifestFilterFnc filterFunc) const; void populateDeckBoxList( const QList boxList, - EffectsManager::EffectManifestFilterFnc filterFunc); + EffectManifestFilterFnc filterFunc); typedef std::function loadEffectFunction; void applySelectionsToDecks( @@ -95,6 +99,7 @@ class DlgPrefEQ : public DlgPreferencePage, public Ui::DlgPrefEQDlg { // Members needed for changing the effects loaded on the EQ Effect Rack EffectsManager* m_pEffectsManager; + EffectsBackendManagerPointer m_pBackendManager; QLabel* m_firstSelectorLabel; QList m_deckEqEffectSelectors; ControlProxy* m_pNumDecks; diff --git a/src/preferences/effectsettingsmodel.cpp b/src/preferences/effectsettingsmodel.cpp index 4213816d686b..1ee6af0b4932 100644 --- a/src/preferences/effectsettingsmodel.cpp +++ b/src/preferences/effectsettingsmodel.cpp @@ -25,7 +25,7 @@ void EffectSettingsModel::resetFromEffectManager(EffectsManager* pEffectsManager m_profiles.clear(); } - for (EffectManifestPointer pManifest : pEffectsManager->getAvailableEffectManifests()) { + for (EffectManifestPointer pManifest : pEffectsManager->getBackendManager()->getManifests()) { const bool visibility = pEffectsManager->getEffectVisibility(pManifest); addProfileToModel(EffectProfilePtr(new EffectProfile(pManifest, visibility))); } diff --git a/src/widget/weffectselector.cpp b/src/widget/weffectselector.cpp index 90a16ea11a6f..140bfec08dac 100644 --- a/src/widget/weffectselector.cpp +++ b/src/widget/weffectselector.cpp @@ -78,7 +78,7 @@ void WEffectSelector::populate() { void WEffectSelector::slotEffectSelected(int newIndex) { const EffectManifestPointer pManifest = - m_pEffectsManager->getManifestFromUniqueId( + m_pEffectsManager->getBackendManager()->getManifestFromUniqueId( itemData(newIndex).toString()); m_pEffectsManager->loadEffect( From 9b8aeebd256f3f77d5f7f33c944f2f6f19c72a2b Mon Sep 17 00:00:00 2001 From: Be Date: Fri, 1 May 2020 18:19:55 -0500 Subject: [PATCH 132/443] move loadEffectChainPreset from EffectsManager to EffectChainSlot This allows for getting rid of the signaling back and forth between EffectChainSlot and EffectsManager, significantly simplifying the code. --- src/effects/defs.h | 6 ++ src/effects/effectchainslot.cpp | 54 ++++++++++---- src/effects/effectchainslot.h | 9 ++- src/effects/effectsmanager.cpp | 85 +---------------------- src/effects/effectsmanager.h | 7 -- src/widget/weffectchainpresetselector.cpp | 5 +- src/widget/weffectchainpresetselector.h | 1 + 7 files changed, 59 insertions(+), 108 deletions(-) diff --git a/src/effects/defs.h b/src/effects/defs.h index 3e83c353e22a..3b64e622a9f9 100644 --- a/src/effects/defs.h +++ b/src/effects/defs.h @@ -50,6 +50,12 @@ typedef QSharedPointer EffectsBackendPointer; class EffectsMessenger; typedef QSharedPointer EffectsMessengerPointer; +class EffectsBackendManager; +typedef QSharedPointer EffectsBackendManagerPointer; + +class EffectChainPresetManager; +typedef QSharedPointer EffectChainPresetManagerPointer; + class EffectState; // For sending EffectStates along the MessagePipe typedef ChannelHandleMap EffectStatesMap; diff --git a/src/effects/effectchainslot.cpp b/src/effects/effectchainslot.cpp index 24c5d1e9a307..befca4e74904 100644 --- a/src/effects/effectchainslot.cpp +++ b/src/effects/effectchainslot.cpp @@ -4,9 +4,11 @@ #include "control/controlpotmeter.h" #include "control/controlpushbutton.h" #include "effects/backends/effectprocessor.h" +#include "effects/backends/effectsbackendmanager.h" #include "effects/effectslot.h" #include "effects/effectsmanager.h" #include "effects/effectsmessenger.h" +#include "effects/presets/effectchainpresetmanager.h" #include "engine/effects/engineeffectchain.h" #include "engine/engine.h" #include "mixer/playermanager.h" @@ -23,6 +25,8 @@ EffectChainSlot::EffectChainSlot(const QString& group, : // The control group names are 1-indexed while internally everything // is 0-indexed. m_pEffectsManager(pEffectsManager), + m_pBackendManager(pEffectsManager->getBackendManager()), + m_pChainPresetManager(pEffectsManager->getChainPresetManager()), m_pMessenger(pEffectsMessenger), m_group(group), m_presetName(""), @@ -192,10 +196,6 @@ void EffectChainSlot::setPresetName(const QString& name) { emit nameChanged(name); } -void EffectChainSlot::setLoadedPresetIndex(int index) { - m_pControlLoadedPreset->setAndConfirm(index); -} - void EffectChainSlot::loadEffect(const unsigned int iEffectSlotNumber, const EffectManifestPointer pManifest, std::unique_ptr pProcessor, @@ -209,6 +209,34 @@ void EffectChainSlot::loadEffect(const unsigned int iEffectSlotNumber, adoptMetaknobFromPreset); } +void EffectChainSlot::loadChainPreset(EffectChainPresetPointer pPreset) { + VERIFY_OR_DEBUG_ASSERT(pPreset) { + return; + } + slotControlClear(1); + + int effectSlot = 0; + for (const auto& pEffectPreset : pPreset->effectPresets()) { + if (pEffectPreset->isEmpty()) { + loadEffect(effectSlot, nullptr, nullptr, nullptr, true); + effectSlot++; + continue; + } + EffectManifestPointer pManifest = m_pBackendManager->getManifest( + pEffectPreset->id(), pEffectPreset->backendType()); + std::unique_ptr pProcessor = m_pBackendManager->createProcessor(pManifest); + loadEffect(effectSlot, pManifest, std::move(pProcessor), pEffectPreset, true); + effectSlot++; + } + + setMixMode(pPreset->mixMode()); + setSuperParameter(pPreset->superKnob()); + m_pControlChainSuperParameter->setDefaultValue(pPreset->superKnob()); + + setPresetName(pPreset->name()); + m_pControlLoadedPreset->setAndConfirm(m_pChainPresetManager->presetIndex(pPreset)); +} + void EffectChainSlot::sendParameterUpdate() { EffectsRequest* pRequest = new EffectsRequest(); pRequest->type = EffectsRequest::SET_EFFECT_CHAIN_PARAMETERS; @@ -233,10 +261,6 @@ void EffectChainSlot::setSuperParameter(double value, bool force) { slotControlChainSuperParameter(value, force); } -void EffectChainSlot::setSuperParameterDefaultValue(double value) { - m_pControlChainSuperParameter->setDefaultValue(value); -} - void EffectChainSlot::setMixMode(EffectChainMixMode mixMode) { m_pControlChainMixMode->set(static_cast(mixMode)); sendParameterUpdate(); @@ -307,27 +331,31 @@ void EffectChainSlot::slotControlChainSuperParameter(double v, bool force) { } void EffectChainSlot::slotControlChainSelector(double value) { + int presetIndex = m_pChainPresetManager->presetIndex(m_presetName); if (value > 0) { - emit selectChainPreset(this, 1); + presetIndex++; } else { - emit selectChainPreset(this, -1); + presetIndex--; } + loadChainPreset(m_pChainPresetManager->presetAtIndex(presetIndex)); } void EffectChainSlot::slotControlLoadChainPreset(double value) { // subtract 1 to make the ControlObject 1-indexed like other ControlObjects - emit loadChainPreset(this, value - 1); + loadChainPreset(m_pChainPresetManager->presetAtIndex(value - 1)); } void EffectChainSlot::slotControlChainNextPreset(double value) { if (value > 0) { - emit selectChainPreset(this, 1); + int presetIndex = m_pChainPresetManager->presetIndex(m_presetName); + loadChainPreset(m_pChainPresetManager->presetAtIndex(presetIndex + 1)); } } void EffectChainSlot::slotControlChainPrevPreset(double value) { if (value > 0) { - emit selectChainPreset(this, -1); + int presetIndex = m_pChainPresetManager->presetIndex(m_presetName); + loadChainPreset(m_pChainPresetManager->presetAtIndex(presetIndex - 1)); } } diff --git a/src/effects/effectchainslot.h b/src/effects/effectchainslot.h index d8e5bc080336..3cfa20de753d 100644 --- a/src/effects/effectchainslot.h +++ b/src/effects/effectchainslot.h @@ -67,7 +67,6 @@ class EffectChainSlot : public QObject { double getSuperParameter() const; void setSuperParameter(double value, bool force = false); - void setSuperParameterDefaultValue(double value); EffectChainMixMode mixMode() const { return m_mixMode; @@ -80,7 +79,6 @@ class EffectChainSlot : public QObject { const QString& presetName() const; void setPresetName(const QString& name); - void setLoadedPresetIndex(int index); // Get the human-readable description of the EffectChain QString description() const; @@ -116,13 +114,12 @@ class EffectChainSlot : public QObject { EffectPresetPointer pPreset, bool adoptMetaknobFromPreset = false); + void loadChainPreset(EffectChainPresetPointer pPreset); + public slots: void slotControlClear(double value); signals: - void loadChainPreset(EffectChainSlot* pChainSlot, int listIndex); - void selectChainPreset(EffectChainSlot* pChainSlot, int delta); - void nameChanged(const QString& name); protected slots: @@ -137,6 +134,8 @@ class EffectChainSlot : public QObject { void disableForInputChannel(const ChannelHandleAndGroup& handle_group); EffectsManager* m_pEffectsManager; + EffectsBackendManagerPointer m_pBackendManager; + EffectChainPresetManagerPointer m_pChainPresetManager; EffectsMessengerPointer m_pMessenger; ControlObject* m_pControlChainMix; ControlObject* m_pControlChainSuperParameter; diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index c2ee9109180e..01a52c6890a8 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -142,61 +142,8 @@ void EffectsManager::showParameter(int chainNumber, int effectNumber, EffectPara m_standardEffectChainSlots.at(chainNumber)->getEffectSlot(effectNumber)->showParameter(pParameter); } -// This needs to be in EffectsManager rather than EffectChainSlot because it -// needs access to the EffectsBackends. -void EffectsManager::loadEffectChainPreset(EffectChainSlot* pChainSlot, - EffectChainPresetPointer pPreset) { - VERIFY_OR_DEBUG_ASSERT(pChainSlot) { - return; - } - VERIFY_OR_DEBUG_ASSERT(pPreset) { - return; - } - pChainSlot->slotControlClear(1); - - int effectSlot = 0; - for (const auto& pEffectPreset : pPreset->effectPresets()) { - if (pEffectPreset->isEmpty()) { - pChainSlot->loadEffect( - effectSlot, - nullptr, - nullptr, - nullptr, - true); - effectSlot++; - continue; - } - EffectManifestPointer pManifest = m_pBackendManager->getManifest( - pEffectPreset->id(), pEffectPreset->backendType()); - pChainSlot->loadEffect( - effectSlot, - pManifest, - m_pBackendManager->createProcessor(pManifest), - pEffectPreset, - true); - effectSlot++; - } - - pChainSlot->setMixMode(pPreset->mixMode()); - pChainSlot->setSuperParameterDefaultValue(pPreset->superKnob()); - pChainSlot->setSuperParameter(pPreset->superKnob()); - pChainSlot->setPresetName(pPreset->name()); - pChainSlot->setLoadedPresetIndex(m_pChainPresetManager->presetIndex(pPreset)); -} - -void EffectsManager::loadEffectChainPreset(EffectChainSlot* pChainSlot, const QString& name) { - VERIFY_OR_DEBUG_ASSERT(pChainSlot != nullptr) { - return; - } - EffectChainPresetPointer pChainPreset = m_pChainPresetManager->getPreset(name); - VERIFY_OR_DEBUG_ASSERT(pChainPreset != nullptr) { - return; - } - loadEffectChainPreset(pChainSlot, pChainPreset); -} - void EffectsManager::loadPresetToStandardChain(int chainNumber, EffectChainPresetPointer pPreset) { - loadEffectChainPreset(m_standardEffectChainSlots.at(chainNumber).get(), pPreset); + m_standardEffectChainSlots.at(chainNumber)->loadChainPreset(pPreset); } QString EffectsManager::getNextEffectId(const QString& effectId) { @@ -248,7 +195,6 @@ void EffectsManager::addStandardEffectChainSlots() { auto pChainSlot = StandardEffectChainSlotPointer( new StandardEffectChainSlot(i, this, m_pMessenger)); - connectChainSlotSignals(pChainSlot); m_standardEffectChainSlots.append(pChainSlot); m_effectChainSlotsByGroup.insert(pChainSlot->group(), pChainSlot); @@ -258,7 +204,6 @@ void EffectsManager::addStandardEffectChainSlots() { void EffectsManager::addOutputEffectChainSlot() { m_outputEffectChainSlot = OutputEffectChainSlotPointer( new OutputEffectChainSlot(this, m_pMessenger)); - connectChainSlotSignals(m_outputEffectChainSlot); m_effectChainSlotsByGroup.insert(m_outputEffectChainSlot->group(), m_outputEffectChainSlot); } @@ -281,7 +226,6 @@ void EffectsManager::addEqualizerEffectChainSlot(const QString& deckGroupName) { auto pChainSlot = EqualizerEffectChainSlotPointer( new EqualizerEffectChainSlot(deckGroupName, this, m_pMessenger)); - connectChainSlotSignals(pChainSlot); m_equalizerEffectChainSlots.insert(deckGroupName, pChainSlot); m_effectChainSlotsByGroup.insert(pChainSlot->group(), pChainSlot); @@ -295,33 +239,11 @@ void EffectsManager::addQuickEffectChainSlot(const QString& deckGroupName) { auto pChainSlot = QuickEffectChainSlotPointer( new QuickEffectChainSlot(deckGroupName, this, m_pMessenger)); - connectChainSlotSignals(pChainSlot); m_quickEffectChainSlots.insert(deckGroupName, pChainSlot); m_effectChainSlotsByGroup.insert(pChainSlot->group(), pChainSlot); } -void EffectsManager::connectChainSlotSignals(EffectChainSlotPointer pChainSlot) { - connect(pChainSlot.get(), - &EffectChainSlot::loadChainPreset, - this, - &EffectsManager::loadChainPresetFromList); - connect(pChainSlot.get(), - &EffectChainSlot::selectChainPreset, - this, - &EffectsManager::loadChainPresetSelector); -} - -void EffectsManager::loadChainPresetFromList(EffectChainSlot* pChainSlot, int listIndex) { - loadEffectChainPreset(pChainSlot, m_pChainPresetManager->presetAtIndex(listIndex)); -} - -void EffectsManager::loadChainPresetSelector(EffectChainSlot* pChainSlot, int delta) { - int listIndex = m_pChainPresetManager->presetIndex(pChainSlot->presetName()); - auto pChainPreset = m_pChainPresetManager->presetAtIndex(listIndex + delta); - loadEffectChainPreset(pChainSlot, pChainPreset); -} - EffectChainSlotPointer EffectsManager::getEffectChainSlot( const QString& group) const { return m_effectChainSlotsByGroup.value(group); @@ -490,14 +412,13 @@ void EffectsManager::readEffectsXml() { EffectsXmlData data = m_pChainPresetManager->readEffectsXml(deckStrings); for (int i = 0; i < data.standardEffectChainPresets.size(); i++) { - loadEffectChainPreset( - m_standardEffectChainSlots.value(i).get(), data.standardEffectChainPresets.at(i)); + m_standardEffectChainSlots.value(i)->loadChainPreset(data.standardEffectChainPresets.at(i)); } for (auto it = data.quickEffectChainPresets.begin(); it != data.quickEffectChainPresets.end(); it++) { - loadEffectChainPreset(m_quickEffectChainSlots.value(it.key()).get(), it.value()); + m_quickEffectChainSlots.value(it.key())->loadChainPreset(it.value()); } } diff --git a/src/effects/effectsmanager.h b/src/effects/effectsmanager.h index aca801802eda..8a3c41f330e3 100644 --- a/src/effects/effectsmanager.h +++ b/src/effects/effectsmanager.h @@ -104,9 +104,6 @@ class EffectsManager : public QObject { void hideParameter(int chainNumber, int effectNumber, EffectParameterPointer pParameter); void showParameter(int chainNumber, int effectNumber, EffectParameterPointer pParameter); - void loadEffectChainPreset(EffectChainSlot* pChainSlot, - EffectChainPresetPointer pPreset); - void loadEffectChainPreset(EffectChainSlot* pChainSlot, const QString& name); void loadPresetToStandardChain(int chainNumber, EffectChainPresetPointer pPreset); void addStandardEffectChainSlots(); @@ -147,10 +144,6 @@ class EffectsManager : public QObject { void visibleEffectsUpdated(); void effectChainPresetListUpdated(); - private slots: - void loadChainPresetFromList(EffectChainSlot* pChainSlot, int listIndex); - void loadChainPresetSelector(EffectChainSlot* pChainSlot, int listIndex); - private: QString debugString() const { return "EffectsManager"; diff --git a/src/widget/weffectchainpresetselector.cpp b/src/widget/weffectchainpresetselector.cpp index cbd7c7fcbcfe..350eba81523b 100644 --- a/src/widget/weffectchainpresetselector.cpp +++ b/src/widget/weffectchainpresetselector.cpp @@ -9,6 +9,7 @@ WEffectChainPresetSelector::WEffectChainPresetSelector( QWidget* pParent, EffectsManager* pEffectsManager) : QComboBox(pParent), WBaseWidget(this), + m_pChainPresetManager(pEffectsManager->getChainPresetManager()), m_pEffectsManager(pEffectsManager) { // Prevent this widget from getting focused to avoid // interfering with using the library via keyboard. @@ -60,7 +61,9 @@ void WEffectChainPresetSelector::populate() { } void WEffectChainPresetSelector::slotEffectChainPresetSelected(int index) { - m_pEffectsManager->loadEffectChainPreset(m_pChainSlot.get(), currentData().toString()); + Q_UNUSED(index); + m_pChainSlot->loadChainPreset( + m_pChainPresetManager->getPreset(currentData().toString())); } void WEffectChainPresetSelector::slotEffectChainNameChanged(const QString& name) { diff --git a/src/widget/weffectchainpresetselector.h b/src/widget/weffectchainpresetselector.h index d54a632246df..0704adf98a20 100644 --- a/src/widget/weffectchainpresetselector.h +++ b/src/widget/weffectchainpresetselector.h @@ -21,6 +21,7 @@ class WEffectChainPresetSelector : public QComboBox, public WBaseWidget { void slotEffectChainNameChanged(const QString& name); private: + EffectChainPresetManagerPointer m_pChainPresetManager; EffectsManager* m_pEffectsManager; EffectChainSlotPointer m_pChainSlot; }; From e242d4c0cbf970c893c9b8645c8265ea388a371c Mon Sep 17 00:00:00 2001 From: Be Date: Fri, 1 May 2020 18:23:15 -0500 Subject: [PATCH 133/443] EffectsManager: add clarifying comment --- src/effects/effectsmanager.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index 01a52c6890a8..bec460ce186c 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -74,7 +74,10 @@ void EffectsManager::registerInputChannel(const ChannelHandleAndGroup& handle_gr } m_registeredInputChannels.insert(handle_group); - foreach (EffectChainSlotPointer pChainSlot, m_standardEffectChainSlots) { + // EqualizerEffectChainSlots, QuickEffectChainSlots, and OutputEffectChainSlots + // only process one input channel, so they do not need to have new input + // channels registered. + for (EffectChainSlotPointer pChainSlot : m_standardEffectChainSlots) { pChainSlot->registerInputChannel(handle_group); } } From 5321df64f9a523a74b296dc644aceac6d4b863b7 Mon Sep 17 00:00:00 2001 From: Be Date: Fri, 1 May 2020 19:01:55 -0500 Subject: [PATCH 134/443] extract EffectPresetManager from EffectsManager --- CMakeLists.txt | 1 + src/effects/defs.h | 3 + src/effects/effectsmanager.cpp | 93 ++---------------- src/effects/effectsmanager.h | 7 +- src/effects/presets/effectpresetmanager.cpp | 102 ++++++++++++++++++++ src/effects/presets/effectpresetmanager.h | 26 +++++ 6 files changed, 143 insertions(+), 89 deletions(-) create mode 100644 src/effects/presets/effectpresetmanager.cpp create mode 100644 src/effects/presets/effectpresetmanager.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 5a2ef32ac14d..ca8115d86f45 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -273,6 +273,7 @@ add_library(mixxx-lib STATIC EXCLUDE_FROM_ALL src/effects/presets/effectchainpresetmanager.cpp src/effects/presets/effectparameterpreset.cpp src/effects/presets/effectpreset.cpp + src/effects/presets/effectpresetmanager.cpp src/encoder/encoder.cpp src/encoder/encoderbroadcastsettings.cpp src/encoder/encoderflacsettings.cpp diff --git a/src/effects/defs.h b/src/effects/defs.h index 3b64e622a9f9..a7863b4f2feb 100644 --- a/src/effects/defs.h +++ b/src/effects/defs.h @@ -53,6 +53,9 @@ typedef QSharedPointer EffectsMessengerPointer; class EffectsBackendManager; typedef QSharedPointer EffectsBackendManagerPointer; +class EffectPresetManager; +typedef QSharedPointer EffectPresetManagerPointer; + class EffectChainPresetManager; typedef QSharedPointer EffectChainPresetManagerPointer; diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index bec460ce186c..ed8447d6d1d5 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -7,11 +7,11 @@ #include "effects/effectslot.h" #include "effects/effectsmessenger.h" #include "effects/presets/effectchainpreset.h" +#include "effects/presets/effectpresetmanager.h" #include "effects/presets/effectxmlelements.h" #include "util/assert.h" namespace { -const QString kEffectDefaultsDirectory = "/effects/defaults"; const QString kStandardEffectRackGroup = "[EffectRack1]"; const QString kOutputEffectRackGroup = "[OutputEffectRack]"; const QString kQuickEffectRackGroup = "[QuickEffectRack1]"; @@ -40,6 +40,9 @@ EffectsManager::EffectsManager(QObject* pParent, requestPipes.first, requestPipes.second)); m_pEngineEffectsManager = new EngineEffectsManager(requestPipes.second); + m_pEffectPresetManager = EffectPresetManagerPointer( + new EffectPresetManager(pConfig, m_pBackendManager)); + m_pChainPresetManager = EffectChainPresetManagerPointer( new EffectChainPresetManager(pConfig, m_pBackendManager)); } @@ -48,9 +51,6 @@ EffectsManager::~EffectsManager() { m_pMessenger->startShutdownProcess(); saveEffectsXml(); - for (const auto pEffectPreset : m_defaultPresets) { - saveDefaultForEffect(pEffectPreset); - } // The EffectChainSlots must be deleted before the EffectsBackends in case // there is an LV2 effect currently loaded. @@ -119,7 +119,7 @@ void EffectsManager::loadEffect(EffectChainSlotPointer pChainSlot, EffectPresetPointer pPreset, bool adoptMetaknobFromPreset) { if (pPreset == nullptr) { - pPreset = m_defaultPresets.value(pManifest); + pPreset = m_pEffectPresetManager->getDefaultPreset(pManifest); } pChainSlot->loadEffect( iEffectSlotNumber, @@ -310,94 +310,13 @@ void EffectsManager::setup() { addStandardEffectChainSlots(); addOutputEffectChainSlot(); - loadDefaultEffectPresets(); - readEffectsXml(); } -void EffectsManager::loadDefaultEffectPresets() { - // Load saved defaults from settings directory - QString dirPath(m_pConfig->getSettingsPath() + kEffectDefaultsDirectory); - QDir effectsDefaultsDir(dirPath); - effectsDefaultsDir.setFilter(QDir::Files | QDir::Readable); - for (const auto& filePath : effectsDefaultsDir.entryList()) { - QFile file(dirPath + "/" + filePath); - if (!file.open(QIODevice::ReadOnly)) { - continue; - } - QDomDocument doc; - if (!doc.setContent(&file)) { - file.close(); - continue; - } - EffectPresetPointer pEffectPreset(new EffectPreset(doc.documentElement())); - if (!pEffectPreset->isEmpty()) { - EffectManifestPointer pManifest = m_pBackendManager->getManifest( - pEffectPreset->id(), pEffectPreset->backendType()); - m_defaultPresets.insert(pManifest, pEffectPreset); - } - file.close(); - } - - // If no preset was found, generate one from the manifest - for (const auto& pManifest : m_pBackendManager->getManifests()) { - if (!m_defaultPresets.contains(pManifest)) { - m_defaultPresets.insert(pManifest, - EffectPresetPointer(new EffectPreset(pManifest))); - } - } -} - -void EffectsManager::saveDefaultForEffect(EffectPresetPointer pEffectPreset) { - if (pEffectPreset->isEmpty()) { - return; - } - - const auto pManifest = m_pBackendManager->getManifest( - pEffectPreset->id(), pEffectPreset->backendType()); - m_defaultPresets.insert(pManifest, pEffectPreset); - - QDomDocument doc(EffectXml::Effect); - doc.setContent(QString("\n")); - doc.appendChild(pEffectPreset->toXml(&doc)); - - QString path(m_pConfig->getSettingsPath() + kEffectDefaultsDirectory); - QDir effectsDefaultsDir(path); - if (!effectsDefaultsDir.exists()) { - effectsDefaultsDir.mkpath(path); - } - - // The file name does not matter as long as it is unique. The actual id string - // is safely stored in the UTF8 document, regardless of what the filesystem - // supports for file names. - QString fileName = pEffectPreset->id(); - // LV2 ids are URLs - fileName.replace("/", "-"); - QStringList forbiddenCharacters; - forbiddenCharacters << "<" - << ">" - << ":" - << "\"" - << "\'" - << "|" - << "?" - << "*" - << "\\"; - for (const auto& character : forbiddenCharacters) { - fileName.remove(character); - } - QFile file(path + "/" + fileName + ".xml"); - if (!file.open(QIODevice::Truncate | QIODevice::WriteOnly)) { - return; - } - file.write(doc.toString().toUtf8()); - file.close(); -} - void EffectsManager::saveDefaultForEffect(int unitNumber, int effectNumber) { auto pSlot = m_standardEffectChainSlots.at(unitNumber)->getEffectSlot(effectNumber); EffectPresetPointer pPreset(new EffectPreset(pSlot)); - saveDefaultForEffect(pPreset); + m_pEffectPresetManager->saveDefaultForEffect(pPreset); } void EffectsManager::savePresetFromStandardEffectChain(int chainNumber) { diff --git a/src/effects/effectsmanager.h b/src/effects/effectsmanager.h index 8a3c41f330e3..5c7935490606 100644 --- a/src/effects/effectsmanager.h +++ b/src/effects/effectsmanager.h @@ -60,6 +60,10 @@ class EffectsManager : public QObject { return m_pChainPresetManager; } + const EffectPresetManagerPointer getEffectPresetManager() const { + return m_pEffectPresetManager; + } + const EffectsBackendManagerPointer getBackendManager() const { return m_pBackendManager; } @@ -178,11 +182,10 @@ class EffectsManager : public QObject { EffectChainPresetPointer m_defaultQuickEffectChainPreset; - QHash m_defaultPresets; - EffectsBackendManagerPointer m_pBackendManager; EngineEffectsManager* m_pEngineEffectsManager; EffectsMessengerPointer m_pMessenger; + EffectPresetManagerPointer m_pEffectPresetManager; EffectChainPresetManagerPointer m_pChainPresetManager; DISALLOW_COPY_AND_ASSIGN(EffectsManager); diff --git a/src/effects/presets/effectpresetmanager.cpp b/src/effects/presets/effectpresetmanager.cpp new file mode 100644 index 000000000000..a2166c5ae80d --- /dev/null +++ b/src/effects/presets/effectpresetmanager.cpp @@ -0,0 +1,102 @@ +#include "effects/presets/effectpresetmanager.h" + +#include + +#include "effects/backends/effectsbackendmanager.h" +#include "effects/presets/effectxmlelements.h" + +namespace { +const QString kEffectDefaultsDirectory = "/effects/defaults"; +} + +EffectPresetManager::EffectPresetManager(UserSettingsPointer pConfig, + EffectsBackendManagerPointer pBackendManager) + : m_pConfig(pConfig), + m_pBackendManager(pBackendManager) { + loadDefaultEffectPresets(); +} + +EffectPresetManager::~EffectPresetManager() { + for (const auto pEffectPreset : m_defaultPresets) { + saveDefaultForEffect(pEffectPreset); + } +} + +void EffectPresetManager::loadDefaultEffectPresets() { + // Load saved defaults from settings directory + QString dirPath(m_pConfig->getSettingsPath() + kEffectDefaultsDirectory); + QDir effectsDefaultsDir(dirPath); + effectsDefaultsDir.setFilter(QDir::Files | QDir::Readable); + for (const auto& filePath : effectsDefaultsDir.entryList()) { + QFile file(dirPath + "/" + filePath); + if (!file.open(QIODevice::ReadOnly)) { + continue; + } + QDomDocument doc; + if (!doc.setContent(&file)) { + file.close(); + continue; + } + EffectPresetPointer pEffectPreset(new EffectPreset(doc.documentElement())); + if (!pEffectPreset->isEmpty()) { + EffectManifestPointer pManifest = m_pBackendManager->getManifest( + pEffectPreset->id(), pEffectPreset->backendType()); + m_defaultPresets.insert(pManifest, pEffectPreset); + } + file.close(); + } + + // If no preset was found, generate one from the manifest + for (const auto& pManifest : m_pBackendManager->getManifests()) { + if (!m_defaultPresets.contains(pManifest)) { + m_defaultPresets.insert(pManifest, + EffectPresetPointer(new EffectPreset(pManifest))); + } + } +} + +void EffectPresetManager::saveDefaultForEffect(EffectPresetPointer pEffectPreset) { + if (pEffectPreset->isEmpty()) { + return; + } + + const auto pManifest = m_pBackendManager->getManifest( + pEffectPreset->id(), pEffectPreset->backendType()); + m_defaultPresets.insert(pManifest, pEffectPreset); + + QDomDocument doc(EffectXml::Effect); + doc.setContent(EffectXml::FileHeader); + doc.appendChild(pEffectPreset->toXml(&doc)); + + QString path(m_pConfig->getSettingsPath() + kEffectDefaultsDirectory); + QDir effectsDefaultsDir(path); + if (!effectsDefaultsDir.exists()) { + effectsDefaultsDir.mkpath(path); + } + + // The file name does not matter as long as it is unique. The actual id string + // is safely stored in the UTF8 document, regardless of what the filesystem + // supports for file names. + QString fileName = pEffectPreset->id(); + // LV2 ids are URLs + fileName.replace("/", "-"); + QStringList forbiddenCharacters; + forbiddenCharacters << "<" + << ">" + << ":" + << "\"" + << "\'" + << "|" + << "?" + << "*" + << "\\"; + for (const auto& character : forbiddenCharacters) { + fileName.remove(character); + } + QFile file(path + "/" + fileName + ".xml"); + if (!file.open(QIODevice::Truncate | QIODevice::WriteOnly)) { + return; + } + file.write(doc.toString().toUtf8()); + file.close(); +} diff --git a/src/effects/presets/effectpresetmanager.h b/src/effects/presets/effectpresetmanager.h new file mode 100644 index 000000000000..be17b43461d5 --- /dev/null +++ b/src/effects/presets/effectpresetmanager.h @@ -0,0 +1,26 @@ +#pragma once + +#include "effects/presets/effectpreset.h" +#include "preferences/usersettings.h" + +/// EffectPresetManager loads and saves default EffectPresets for each type of +/// effect in the "effects/defaults" folder of the user settings folder. +class EffectPresetManager { + public: + EffectPresetManager(UserSettingsPointer pConfig, EffectsBackendManagerPointer pBackendManager); + ~EffectPresetManager(); + + EffectPresetPointer getDefaultPreset(EffectManifestPointer pManifest) { + return m_defaultPresets.value(pManifest); + } + + void saveDefaultForEffect(EffectPresetPointer pEffectPreset); + + private: + void loadDefaultEffectPresets(); + + QHash m_defaultPresets; + + UserSettingsPointer m_pConfig; + EffectsBackendManagerPointer m_pBackendManager; +}; From ee3220d849a90ceff1c005f2484464019e6f658b Mon Sep 17 00:00:00 2001 From: Be Date: Fri, 1 May 2020 19:15:09 -0500 Subject: [PATCH 135/443] EngineEffect: remove dependency on EffectsManager --- src/effects/effectslot.cpp | 3 ++- src/engine/effects/engineeffect.cpp | 19 ++++++++----------- src/engine/effects/engineeffect.h | 7 ++++--- 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/effects/effectslot.cpp b/src/effects/effectslot.cpp index 5f6e592bc573..2f26914164da 100644 --- a/src/effects/effectslot.cpp +++ b/src/effects/effectslot.cpp @@ -123,7 +123,8 @@ void EffectSlot::addToEngine(std::unique_ptr pProcessor, m_pEngineEffect = new EngineEffect(m_pManifest, activeInputChannels, - m_pEffectsManager, + m_pEffectsManager->registeredInputChannels(), + m_pEffectsManager->registeredOutputChannels(), std::move(pProcessor)); EffectsRequest* request = new EffectsRequest(); diff --git a/src/engine/effects/engineeffect.cpp b/src/engine/effects/engineeffect.cpp index 6c178900a719..8f76701a1a84 100644 --- a/src/engine/effects/engineeffect.cpp +++ b/src/engine/effects/engineeffect.cpp @@ -5,13 +5,13 @@ #include "util/sample.h" EngineEffect::EngineEffect(EffectManifestPointer pManifest, - const QSet& activeInputChannels, - EffectsManager* pEffectsManager, - std::unique_ptr pProcessor) + const QSet& activeInputChannels, + const QSet& registeredInputChannels, + const QSet& registeredOutputChannels, + std::unique_ptr pProcessor) : m_pManifest(pManifest), m_pProcessor(std::move(pProcessor)), - m_parameters(pManifest->parameters().size()), - m_pEffectsManager(pEffectsManager) { + m_parameters(pManifest->parameters().size()) { const QList& parameters = m_pManifest->parameters(); for (int i = 0; i < parameters.size(); ++i) { EffectManifestParameterPointer param = parameters.at(i); @@ -20,11 +20,9 @@ EngineEffect::EngineEffect(EffectManifestPointer pManifest, m_parametersById[param->id()] = pParameter; } - for (const ChannelHandleAndGroup& inputChannel : - pEffectsManager->registeredInputChannels()) { + for (const ChannelHandleAndGroup& inputChannel : registeredInputChannels) { ChannelHandleMap outputChannelMap; - for (const ChannelHandleAndGroup& outputChannel : - pEffectsManager->registeredOutputChannels()) { + for (const ChannelHandleAndGroup& outputChannel : registeredOutputChannels) { outputChannelMap.insert(outputChannel.handle(), EffectEnableState::Disabled); } m_effectEnableStateForChannelMatrix.insert(inputChannel.handle(), outputChannelMap); @@ -36,8 +34,7 @@ EngineEffect::EngineEffect(EffectManifestPointer pManifest, const mixxx::EngineParameters bufferParameters( mixxx::audio::SampleRate(96000), MAX_BUFFER_LEN / mixxx::kEngineChannelCount); - m_pProcessor->initialize(activeInputChannels, - pEffectsManager->registeredOutputChannels(), bufferParameters); + m_pProcessor->initialize(activeInputChannels, registeredOutputChannels, bufferParameters); m_effectRampsFromDry = pManifest->effectRampsFromDry(); } diff --git a/src/engine/effects/engineeffect.h b/src/engine/effects/engineeffect.h index a08cc7d40a16..2174ca7d3087 100644 --- a/src/engine/effects/engineeffect.h +++ b/src/engine/effects/engineeffect.h @@ -21,9 +21,10 @@ class EngineEffect : public EffectsRequestHandler { public: EngineEffect(EffectManifestPointer pManifest, - const QSet& activeInputChannels, - EffectsManager* pEffectsManager, - std::unique_ptr pProcessor); + const QSet& activeInputChannels, + const QSet& registeredInputChannels, + const QSet& registeredOutputChannels, + std::unique_ptr pProcessor); virtual ~EngineEffect(); const QString& name() const { From 42e6f287302597be75b1671f36c7c2e50b56ddce Mon Sep 17 00:00:00 2001 From: Be Date: Fri, 1 May 2020 19:47:37 -0500 Subject: [PATCH 136/443] do not pass EffectProcessor around for effect loading process Now that EffectsBackendManager can create EffectProcessors independently of EffectsManager, pass EffectsBackendManager to EngineEffect constructor so it can create the EffectProcessor at the place it is needed. --- src/effects/effectchainslot.cpp | 14 ++++++-------- src/effects/effectchainslot.h | 1 - src/effects/effectslot.cpp | 14 +++++++------- src/effects/effectslot.h | 5 ++--- src/effects/effectsmanager.cpp | 1 - src/effects/specialeffectchainslots.cpp | 16 +--------------- src/effects/specialeffectchainslots.h | 7 ------- src/engine/effects/engineeffect.cpp | 6 +++--- src/engine/effects/engineeffect.h | 4 ++-- 9 files changed, 21 insertions(+), 47 deletions(-) diff --git a/src/effects/effectchainslot.cpp b/src/effects/effectchainslot.cpp index befca4e74904..a4e61d54c667 100644 --- a/src/effects/effectchainslot.cpp +++ b/src/effects/effectchainslot.cpp @@ -198,12 +198,10 @@ void EffectChainSlot::setPresetName(const QString& name) { void EffectChainSlot::loadEffect(const unsigned int iEffectSlotNumber, const EffectManifestPointer pManifest, - std::unique_ptr pProcessor, EffectPresetPointer pPreset, bool adoptMetaknobFromPreset) { m_effectSlots[iEffectSlotNumber]->loadEffect( pManifest, - std::move(pProcessor), pPreset, m_enabledInputChannels, adoptMetaknobFromPreset); @@ -215,18 +213,18 @@ void EffectChainSlot::loadChainPreset(EffectChainPresetPointer pPreset) { } slotControlClear(1); - int effectSlot = 0; + int effectSlotIndex = 0; for (const auto& pEffectPreset : pPreset->effectPresets()) { + EffectSlotPointer pEffectSlot = m_effectSlots.at(effectSlotIndex); if (pEffectPreset->isEmpty()) { - loadEffect(effectSlot, nullptr, nullptr, nullptr, true); - effectSlot++; + loadEffect(effectSlotIndex, nullptr, nullptr, true); + effectSlotIndex++; continue; } EffectManifestPointer pManifest = m_pBackendManager->getManifest( pEffectPreset->id(), pEffectPreset->backendType()); - std::unique_ptr pProcessor = m_pBackendManager->createProcessor(pManifest); - loadEffect(effectSlot, pManifest, std::move(pProcessor), pEffectPreset, true); - effectSlot++; + loadEffect(effectSlotIndex, pManifest, pEffectPreset, true); + effectSlotIndex++; } setMixMode(pPreset->mixMode()); diff --git a/src/effects/effectchainslot.h b/src/effects/effectchainslot.h index 3cfa20de753d..b530059ae4fd 100644 --- a/src/effects/effectchainslot.h +++ b/src/effects/effectchainslot.h @@ -110,7 +110,6 @@ class EffectChainSlot : public QObject { virtual void loadEffect(const unsigned int iEffectSlotNumber, const EffectManifestPointer pManifest, - std::unique_ptr pProcessor, EffectPresetPointer pPreset, bool adoptMetaknobFromPreset = false); diff --git a/src/effects/effectslot.cpp b/src/effects/effectslot.cpp index 2f26914164da..2bfb770795c2 100644 --- a/src/effects/effectslot.cpp +++ b/src/effects/effectslot.cpp @@ -22,6 +22,7 @@ EffectSlot::EffectSlot(const QString& group, : m_iEffectNumber(iEffectnumber), m_group(group), m_pEffectsManager(pEffectsManager), + m_pPresetManager(pEffectsManager->getEffectPresetManager()), m_pMessenger(pEffectsMessenger), m_pEngineEffectChain(pEngineEffectChain), m_pEngineEffect(nullptr) { @@ -111,8 +112,7 @@ EffectSlot::~EffectSlot() { delete m_pMetaknobSoftTakeover; } -void EffectSlot::addToEngine(std::unique_ptr pProcessor, - const QSet& activeInputChannels) { +void EffectSlot::addToEngine(const QSet& activeInputChannels) { VERIFY_OR_DEBUG_ASSERT(!isLoaded()) { return; } @@ -121,11 +121,12 @@ void EffectSlot::addToEngine(std::unique_ptr pProcessor, return; } - m_pEngineEffect = new EngineEffect(m_pManifest, + m_pEngineEffect = new EngineEffect( + m_pManifest, + m_pEffectsManager->getBackendManager(), activeInputChannels, m_pEffectsManager->registeredInputChannels(), - m_pEffectsManager->registeredOutputChannels(), - std::move(pProcessor)); + m_pEffectsManager->registeredOutputChannels()); EffectsRequest* request = new EffectsRequest(); request->type = EffectsRequest::ADD_EFFECT_TO_CHAIN; @@ -231,7 +232,6 @@ EffectParameterSlotBasePointer EffectSlot::getEffectParameterSlot( } void EffectSlot::loadEffect(const EffectManifestPointer pManifest, - std::unique_ptr pProcessor, EffectPresetPointer pEffectPreset, const QSet& activeChannels, bool adoptMetaknobFromPreset) { @@ -252,7 +252,7 @@ void EffectSlot::loadEffect(const EffectManifestPointer pManifest, return; } - addToEngine(std::move(pProcessor), activeChannels); + addToEngine(activeChannels); // Create EffectParameters. Every parameter listed in the manifest must have // an EffectParameter created, regardless of whether it is loaded in a slot. diff --git a/src/effects/effectslot.h b/src/effects/effectslot.h index eb0c4bb2e82b..a3e1314eaea9 100644 --- a/src/effects/effectslot.h +++ b/src/effects/effectslot.h @@ -64,7 +64,6 @@ class EffectSlot : public QObject { /// Call with nullptr for pManifest and pProcessor to unload an effect void loadEffect(const EffectManifestPointer pManifest, - std::unique_ptr pProcessor, EffectPresetPointer pPreset, const QSet& activeChannels, bool adoptMetaknobFromPreset = false); @@ -145,8 +144,7 @@ class EffectSlot : public QObject { return QString("EffectSlot(%1)").arg(m_group); } - void addToEngine(std::unique_ptr, - const QSet& activeInputChannels); + void addToEngine(const QSet& activeInputChannels); void removeFromEngine(); void loadParameters(); @@ -157,6 +155,7 @@ class EffectSlot : public QObject { const QString m_group; UserSettingsPointer m_pConfig; EffectsManager* m_pEffectsManager; + EffectPresetManagerPointer m_pPresetManager; EffectsMessengerPointer m_pMessenger; EffectManifestPointer m_pManifest; EngineEffectChain* m_pEngineEffectChain; diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index ed8447d6d1d5..eaf52829b25c 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -124,7 +124,6 @@ void EffectsManager::loadEffect(EffectChainSlotPointer pChainSlot, pChainSlot->loadEffect( iEffectSlotNumber, pManifest, - m_pBackendManager->createProcessor(pManifest), pPreset, adoptMetaknobFromPreset); } diff --git a/src/effects/specialeffectchainslots.cpp b/src/effects/specialeffectchainslots.cpp index b21286fd88b5..a183551b1f65 100644 --- a/src/effects/specialeffectchainslots.cpp +++ b/src/effects/specialeffectchainslots.cpp @@ -120,19 +120,6 @@ QuickEffectChainSlot::QuickEffectChainSlot(const QString& group, } } -void QuickEffectChainSlot::loadEffect(const unsigned int iEffectSlotNumber, - const EffectManifestPointer pManifest, - std::unique_ptr pProcessor, - EffectPresetPointer pPreset, - bool adoptMetaknobFromPreset) { - EffectChainSlot::loadEffect(iEffectSlotNumber, - pManifest, - std::move(pProcessor), - pPreset, - adoptMetaknobFromPreset); - slotControlChainSuperParameter(m_pControlChainSuperParameter->get(), true); -} - QString QuickEffectChainSlot::formatEffectChainSlotGroup(const QString& group) { return QString("[QuickEffectRack1_%1]").arg(group); } @@ -165,12 +152,11 @@ EqualizerEffectChainSlot::EqualizerEffectChainSlot(const QString& group, void EqualizerEffectChainSlot::loadEffect( const unsigned int iEffectSlotNumber, const EffectManifestPointer pManifest, - std::unique_ptr pProcessor, EffectPresetPointer pPreset, bool adoptMetaknobFromPreset) { // TODO: preserve effect parameters when loading new effect. This will allow // for easy comparison of the sound of different equalizer effects. - EffectChainSlot::loadEffect(iEffectSlotNumber, pManifest, std::move(pProcessor), pPreset, adoptMetaknobFromPreset); + EffectChainSlot::loadEffect(iEffectSlotNumber, pManifest, pPreset, adoptMetaknobFromPreset); m_pCOFilterWaveform->set(pManifest->isMixingEQ()); } diff --git a/src/effects/specialeffectchainslots.h b/src/effects/specialeffectchainslots.h index 663259f8d441..d0718ae1c834 100644 --- a/src/effects/specialeffectchainslots.h +++ b/src/effects/specialeffectchainslots.h @@ -42,12 +42,6 @@ class QuickEffectChainSlot : public PerGroupEffectChainSlot { EffectsManager* pEffectsManager, EffectsMessengerPointer pEffectsMessenger); - void loadEffect(const unsigned int iEffectSlotNumber, - const EffectManifestPointer pManifest, - std::unique_ptr pProcessor, - EffectPresetPointer pPreset, - bool adoptMetaknobFromPreset = false) override; - static QString formatEffectChainSlotGroup(const QString& group); static QString formatEffectSlotGroup(const QString& group, const int iEffectSlotNumber = 0); @@ -61,7 +55,6 @@ class EqualizerEffectChainSlot : public PerGroupEffectChainSlot { void loadEffect(const unsigned int iEffectSlotNumber, const EffectManifestPointer pManifest, - std::unique_ptr pProcessor, EffectPresetPointer pPreset, bool adoptMetaknobFromPreset = false) override; diff --git a/src/engine/effects/engineeffect.cpp b/src/engine/effects/engineeffect.cpp index 8f76701a1a84..8d63ab1c62df 100644 --- a/src/engine/effects/engineeffect.cpp +++ b/src/engine/effects/engineeffect.cpp @@ -5,12 +5,12 @@ #include "util/sample.h" EngineEffect::EngineEffect(EffectManifestPointer pManifest, + EffectsBackendManagerPointer pBackendManager, const QSet& activeInputChannels, const QSet& registeredInputChannels, - const QSet& registeredOutputChannels, - std::unique_ptr pProcessor) + const QSet& registeredOutputChannels) : m_pManifest(pManifest), - m_pProcessor(std::move(pProcessor)), + m_pProcessor(pBackendManager->createProcessor(pManifest)), m_parameters(pManifest->parameters().size()) { const QList& parameters = m_pManifest->parameters(); for (int i = 0; i < parameters.size(); ++i) { diff --git a/src/engine/effects/engineeffect.h b/src/engine/effects/engineeffect.h index 2174ca7d3087..1b0cca72bed0 100644 --- a/src/engine/effects/engineeffect.h +++ b/src/engine/effects/engineeffect.h @@ -21,10 +21,10 @@ class EngineEffect : public EffectsRequestHandler { public: EngineEffect(EffectManifestPointer pManifest, + EffectsBackendManagerPointer pBackendManager, const QSet& activeInputChannels, const QSet& registeredInputChannels, - const QSet& registeredOutputChannels, - std::unique_ptr pProcessor); + const QSet& registeredOutputChannels); virtual ~EngineEffect(); const QString& name() const { From c08b282aa4599625c7a38c1b989a18c93aa127df Mon Sep 17 00:00:00 2001 From: Be Date: Fri, 1 May 2020 20:55:06 -0500 Subject: [PATCH 137/443] EffectsManager: remove effect loading methods Now that EffectsBackendManager and EffectPresetManager have been extracted from EffectsManager, there is no need for EffectsManager to be responsible for loading effects anymore. --- src/effects/effectchainslot.cpp | 19 +++++------- src/effects/effectchainslot.h | 7 ++--- src/effects/effectslot.cpp | 27 ++++++++++++++++- src/effects/effectslot.h | 22 ++++++++++---- src/effects/effectsmanager.cpp | 39 ------------------------- src/effects/effectsmanager.h | 23 ++------------- src/effects/specialeffectchainslots.cpp | 8 ++--- src/effects/specialeffectchainslots.h | 7 ++--- src/preferences/dialog/dlgprefeq.cpp | 33 ++++++++++----------- src/preferences/dialog/dlgprefeq.h | 7 +---- src/widget/effectwidgetutils.h | 21 ++++++++----- src/widget/weffectselector.cpp | 8 ++--- src/widget/weffectselector.h | 1 + 13 files changed, 96 insertions(+), 126 deletions(-) diff --git a/src/effects/effectchainslot.cpp b/src/effects/effectchainslot.cpp index a4e61d54c667..07676a0ff2b5 100644 --- a/src/effects/effectchainslot.cpp +++ b/src/effects/effectchainslot.cpp @@ -196,15 +196,12 @@ void EffectChainSlot::setPresetName(const QString& name) { emit nameChanged(name); } -void EffectChainSlot::loadEffect(const unsigned int iEffectSlotNumber, - const EffectManifestPointer pManifest, - EffectPresetPointer pPreset, - bool adoptMetaknobFromPreset) { - m_effectSlots[iEffectSlotNumber]->loadEffect( +void EffectChainSlot::loadEffectWithDefaults( + const unsigned int iEffectSlotNumber, + const EffectManifestPointer pManifest) { + m_effectSlots[iEffectSlotNumber]->loadEffectWithDefaults( pManifest, - pPreset, - m_enabledInputChannels, - adoptMetaknobFromPreset); + m_enabledInputChannels); } void EffectChainSlot::loadChainPreset(EffectChainPresetPointer pPreset) { @@ -217,13 +214,11 @@ void EffectChainSlot::loadChainPreset(EffectChainPresetPointer pPreset) { for (const auto& pEffectPreset : pPreset->effectPresets()) { EffectSlotPointer pEffectSlot = m_effectSlots.at(effectSlotIndex); if (pEffectPreset->isEmpty()) { - loadEffect(effectSlotIndex, nullptr, nullptr, true); + pEffectSlot->loadEffectFromPreset(nullptr, m_enabledInputChannels); effectSlotIndex++; continue; } - EffectManifestPointer pManifest = m_pBackendManager->getManifest( - pEffectPreset->id(), pEffectPreset->backendType()); - loadEffect(effectSlotIndex, pManifest, pEffectPreset, true); + pEffectSlot->loadEffectFromPreset(pEffectPreset, m_enabledInputChannels); effectSlotIndex++; } diff --git a/src/effects/effectchainslot.h b/src/effects/effectchainslot.h index b530059ae4fd..03551a974ad4 100644 --- a/src/effects/effectchainslot.h +++ b/src/effects/effectchainslot.h @@ -108,10 +108,9 @@ class EffectChainSlot : public QObject { return m_effectSlots; } - virtual void loadEffect(const unsigned int iEffectSlotNumber, - const EffectManifestPointer pManifest, - EffectPresetPointer pPreset, - bool adoptMetaknobFromPreset = false); + virtual void loadEffectWithDefaults( + const unsigned int iEffectSlotNumber, + const EffectManifestPointer pManifest); void loadChainPreset(EffectChainPresetPointer pPreset); diff --git a/src/effects/effectslot.cpp b/src/effects/effectslot.cpp index 2bfb770795c2..951c32f36812 100644 --- a/src/effects/effectslot.cpp +++ b/src/effects/effectslot.cpp @@ -8,6 +8,7 @@ #include "control/controlpushbutton.h" #include "effects/defs.h" #include "effects/effectsmessenger.h" +#include "effects/presets/effectpresetmanager.h" #include "util/defs.h" #include "util/math.h" @@ -23,6 +24,7 @@ EffectSlot::EffectSlot(const QString& group, m_group(group), m_pEffectsManager(pEffectsManager), m_pPresetManager(pEffectsManager->getEffectPresetManager()), + m_pBackendManager(pEffectsManager->getBackendManager()), m_pMessenger(pEffectsMessenger), m_pEngineEffectChain(pEngineEffectChain), m_pEngineEffect(nullptr) { @@ -231,7 +233,30 @@ EffectParameterSlotBasePointer EffectSlot::getEffectParameterSlot( return m_parameterSlots.value(parameterType).at(slotNumber); } -void EffectSlot::loadEffect(const EffectManifestPointer pManifest, +void EffectSlot::loadEffectFromPreset( + const EffectPresetPointer pPreset, + const QSet& activeChannels) { + if (pPreset == nullptr) { + loadEffectInner(nullptr, nullptr, activeChannels, true); + return; + } + EffectManifestPointer pManifest = m_pBackendManager->getManifest( + pPreset->id(), pPreset->backendType()); + loadEffectInner(pManifest, pPreset, activeChannels, true); +} + +void EffectSlot::loadEffectWithDefaults( + const EffectManifestPointer pManifest, + const QSet& activeChannels) { + if (pManifest == nullptr) { + loadEffectInner(nullptr, nullptr, activeChannels, false); + return; + } + EffectPresetPointer pPreset = m_pPresetManager->getDefaultPreset(pManifest); + loadEffectInner(pManifest, pPreset, activeChannels, false); +} + +void EffectSlot::loadEffectInner(const EffectManifestPointer pManifest, EffectPresetPointer pEffectPreset, const QSet& activeChannels, bool adoptMetaknobFromPreset) { diff --git a/src/effects/effectslot.h b/src/effects/effectslot.h index a3e1314eaea9..f74d1c31e876 100644 --- a/src/effects/effectslot.h +++ b/src/effects/effectslot.h @@ -62,12 +62,6 @@ class EffectSlot : public QObject { EngineEffectChain* pEngineEffectChain); virtual ~EffectSlot(); - /// Call with nullptr for pManifest and pProcessor to unload an effect - void loadEffect(const EffectManifestPointer pManifest, - EffectPresetPointer pPreset, - const QSet& activeChannels, - bool adoptMetaknobFromPreset = false); - inline int getEffectSlotNumber() const { return m_iEffectNumber; } @@ -98,6 +92,15 @@ class EffectSlot : public QObject { return m_hiddenParameters; } + /// Call with nullptr for pPreset to unload an effect + void loadEffectFromPreset( + const EffectPresetPointer pPreset, + const QSet& activeChannels); + /// Call with nullptr for pManifest to unload an effect + void loadEffectWithDefaults( + const EffectManifestPointer pManifest, + const QSet& activeChannels); + void hideParameter(EffectParameterPointer pParameter); void showParameter(EffectParameterPointer pParameter); @@ -147,6 +150,12 @@ class EffectSlot : public QObject { void addToEngine(const QSet& activeInputChannels); void removeFromEngine(); + /// Call with nullptr for pManifest and pPreset to unload an effect + void loadEffectInner(const EffectManifestPointer pManifest, + EffectPresetPointer pPreset, + const QSet& activeChannels, + bool adoptMetaknobFromPreset = false); + void loadParameters(); void unloadEffect(); @@ -156,6 +165,7 @@ class EffectSlot : public QObject { UserSettingsPointer m_pConfig; EffectsManager* m_pEffectsManager; EffectPresetManagerPointer m_pPresetManager; + EffectsBackendManagerPointer m_pBackendManager; EffectsMessengerPointer m_pMessenger; EffectManifestPointer m_pManifest; EngineEffectChain* m_pEngineEffectChain; diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index eaf52829b25c..17ae87b89e22 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -89,45 +89,6 @@ void EffectsManager::registerOutputChannel(const ChannelHandleAndGroup& handle_g m_registeredOutputChannels.insert(handle_group); } -void EffectsManager::loadStandardEffect(const int iChainSlotNumber, - const int iEffectSlotNumber, const EffectManifestPointer pManifest) { - auto pChainSlot = getStandardEffectChainSlot(iChainSlotNumber); - if (pChainSlot) { - loadEffect(pChainSlot, iEffectSlotNumber, pManifest); - } -} - -void EffectsManager::loadOutputEffect(const int iEffectSlotNumber, - const EffectManifestPointer pManifest) { - if (m_outputEffectChainSlot) { - loadEffect(m_outputEffectChainSlot, iEffectSlotNumber, pManifest); - } -} - -void EffectsManager::loadEqualizerEffect(const QString& deckGroup, - const int iEffectSlotNumber, const EffectManifestPointer pManifest) { - auto pChainSlot = m_equalizerEffectChainSlots.value(deckGroup); - VERIFY_OR_DEBUG_ASSERT(pChainSlot) { - return; - } - loadEffect(pChainSlot, iEffectSlotNumber, pManifest); -} - -void EffectsManager::loadEffect(EffectChainSlotPointer pChainSlot, - const int iEffectSlotNumber, - const EffectManifestPointer pManifest, - EffectPresetPointer pPreset, - bool adoptMetaknobFromPreset) { - if (pPreset == nullptr) { - pPreset = m_pEffectPresetManager->getDefaultPreset(pManifest); - } - pChainSlot->loadEffect( - iEffectSlotNumber, - pManifest, - pPreset, - adoptMetaknobFromPreset); -} - ParameterMap EffectsManager::getLoadedParameters(int chainNumber, int effectNumber) const { return m_standardEffectChainSlots.at(chainNumber)->getEffectSlot(effectNumber)->getLoadedParameters(); } diff --git a/src/effects/effectsmanager.h b/src/effects/effectsmanager.h index 5c7935490606..7fdf0d867bdf 100644 --- a/src/effects/effectsmanager.h +++ b/src/effects/effectsmanager.h @@ -82,26 +82,6 @@ class EffectsManager : public QObject { return m_registeredOutputChannels; } - void loadStandardEffect( - const int iChainSlotNumber, - const int iEffectSlotNumber, - const EffectManifestPointer pManifest); - - void loadOutputEffect( - const int iEffectSlotNumber, - const EffectManifestPointer pManifest); - - void loadEqualizerEffect(const QString& group, - const int iEffectSlotNumber, - const EffectManifestPointer pManifest); - - void loadEffect( - EffectChainSlotPointer pChainSlot, - const int iEffectSlotNumber, - const EffectManifestPointer pManifest, - EffectPresetPointer pPreset = nullptr, - bool adoptMetaknobFromPreset = false); - ParameterMap getLoadedParameters(int chainNumber, int effectNumber) const; ParameterMap getHiddenParameters(int chainNumber, int effectNumber) const; @@ -117,6 +97,9 @@ class EffectsManager : public QObject { EffectChainSlotPointer getOutputEffectChainSlot() const; void addEqualizerEffectChainSlot(const QString& deckGroupName); + EffectChainSlotPointer getEqualizerEffectChainSlot(const QString& deckGroupName) { + return m_equalizerEffectChainSlots.value(deckGroupName); + } void addQuickEffectChainSlot(const QString& deckGroupName); // TODO: Remove these methods to reduce coupling between GUI and diff --git a/src/effects/specialeffectchainslots.cpp b/src/effects/specialeffectchainslots.cpp index a183551b1f65..425be9c854c7 100644 --- a/src/effects/specialeffectchainslots.cpp +++ b/src/effects/specialeffectchainslots.cpp @@ -149,14 +149,12 @@ EqualizerEffectChainSlot::EqualizerEffectChainSlot(const QString& group, setupLegacyAliasesForGroup(group); } -void EqualizerEffectChainSlot::loadEffect( +void EqualizerEffectChainSlot::loadEffectWithDefaults( const unsigned int iEffectSlotNumber, - const EffectManifestPointer pManifest, - EffectPresetPointer pPreset, - bool adoptMetaknobFromPreset) { + const EffectManifestPointer pManifest) { // TODO: preserve effect parameters when loading new effect. This will allow // for easy comparison of the sound of different equalizer effects. - EffectChainSlot::loadEffect(iEffectSlotNumber, pManifest, pPreset, adoptMetaknobFromPreset); + EffectChainSlot::loadEffectWithDefaults(iEffectSlotNumber, pManifest); m_pCOFilterWaveform->set(pManifest->isMixingEQ()); } diff --git a/src/effects/specialeffectchainslots.h b/src/effects/specialeffectchainslots.h index d0718ae1c834..396fff47fbb4 100644 --- a/src/effects/specialeffectchainslots.h +++ b/src/effects/specialeffectchainslots.h @@ -53,10 +53,9 @@ class EqualizerEffectChainSlot : public PerGroupEffectChainSlot { EffectsManager* pEffectsManager, EffectsMessengerPointer pEffectsMessenger); - void loadEffect(const unsigned int iEffectSlotNumber, - const EffectManifestPointer pManifest, - EffectPresetPointer pPreset, - bool adoptMetaknobFromPreset = false) override; + void loadEffectWithDefaults( + const unsigned int iEffectSlotNumber, + const EffectManifestPointer pManifest) override; static QString formatEffectChainSlotGroup(const QString& group); static QString formatEffectSlotGroup(const QString& group); diff --git a/src/preferences/dialog/dlgprefeq.cpp b/src/preferences/dialog/dlgprefeq.cpp index 14fff9a5a802..eac8096bd5ce 100644 --- a/src/preferences/dialog/dlgprefeq.cpp +++ b/src/preferences/dialog/dlgprefeq.cpp @@ -29,7 +29,9 @@ #include "effects/specialeffectchainslots.h" #include "mixer/playermanager.h" +namespace { const QString kConfigKey = "[Mixer Profile]"; +const QString kConfigKeyPrefix = "EffectForGroup_"; const QString kEnableEqs = "EnableEQs"; const QString kEqsOnly = "EQsOnly"; const QString kSingleEq = "SingleEQEffect"; @@ -38,6 +40,7 @@ const QString kDefaultMasterEqId = QString(); const int kFrequencyUpperLimit = 20050; const int kFrequencyLowerLimit = 16; +} // anonymous namespace DlgPrefEQ::DlgPrefEQ(QWidget* pParent, EffectsManager* pEffectsManager, UserSettingsPointer pConfig) : DlgPreferencePage(pParent), @@ -128,7 +131,8 @@ void DlgPrefEQ::slotNumDecksChanged(double numDecks) { // if none is configured QString group = PlayerManager::groupForDeck(i); QString configuredEffect = m_pConfig->getValue(ConfigKey(kConfigKey, - "EffectForGroup_" + group), kDefaultEqId); + kConfigKeyPrefix + group), + kDefaultEqId); const EffectManifestPointer pEQManifest = m_pBackendManager->getManifestFromUniqueId(configuredEffect); @@ -357,20 +361,12 @@ void DlgPrefEQ::applySelections() { return; } - loadEffectFunction loadFunc = std::bind( - &EffectsManager::loadEqualizerEffect, m_pEffectsManager, - std::placeholders::_1, std::placeholders::_2, std::placeholders::_3); - applySelectionsToDecks(m_deckEqEffectSelectors, m_eqIndiciesOnUpdate, - loadFunc, "EffectForGroup_"); + applySelectionsToDecks(); } -void DlgPrefEQ::applySelectionsToDecks( - const QList& boxList, - QList& indiciesOnUpdate, - loadEffectFunction loadFunc, - const QString& configKeyPrefix) { +void DlgPrefEQ::applySelectionsToDecks() { int deck = 0; - for (QComboBox* box : boxList) { + for (QComboBox* box : m_deckEqEffectSelectors) { const EffectManifestPointer pManifest = m_pBackendManager->getManifestFromUniqueId( box->itemData(box->currentIndex()).toString()); @@ -378,22 +374,23 @@ void DlgPrefEQ::applySelectionsToDecks( QString group = PlayerManager::groupForDeck(deck); bool needLoad = true; - bool startingUp = (indiciesOnUpdate.size() < (deck + 1)); + bool startingUp = (m_eqIndiciesOnUpdate.size() < (deck + 1)); if (!startingUp) { - needLoad = (box->currentIndex() != indiciesOnUpdate[deck]); + needLoad = (box->currentIndex() != m_eqIndiciesOnUpdate[deck]); } if (needLoad) { - loadFunc(group, 0, pManifest); + auto pChainSlot = m_pEffectsManager->getEqualizerEffectChainSlot(group); + pChainSlot->loadEffectWithDefaults(0, pManifest); if (!startingUp) { - indiciesOnUpdate[deck] = box->currentIndex(); + m_eqIndiciesOnUpdate[deck] = box->currentIndex(); } QString configString; if (pManifest) { configString = pManifest->uniqueId(); } - m_pConfig->set(ConfigKey(kConfigKey, configKeyPrefix + group), + m_pConfig->set(ConfigKey(kConfigKey, kConfigKeyPrefix + group), configString); // This is required to remove a previous selected effect that does not @@ -610,7 +607,7 @@ void DlgPrefEQ::slotMasterEqEffectChanged(int effectIndex) { auto pChainSlot = m_pEffectsManager->getOutputEffectChainSlot(); if (pChainSlot) { - m_pEffectsManager->loadOutputEffect(0, pManifest); + pChainSlot->loadEffectWithDefaults(0, pManifest); auto pEffectSlot = pChainSlot->getEffectSlot(0); diff --git a/src/preferences/dialog/dlgprefeq.h b/src/preferences/dialog/dlgprefeq.h index 963e951a78a3..6041d58cced4 100644 --- a/src/preferences/dialog/dlgprefeq.h +++ b/src/preferences/dialog/dlgprefeq.h @@ -85,12 +85,7 @@ class DlgPrefEQ : public DlgPreferencePage, public Ui::DlgPrefEQDlg { const QList boxList, EffectManifestFilterFnc filterFunc); - typedef std::function loadEffectFunction; - void applySelectionsToDecks( - const QList& boxList, - QList& indiciesOnUpdate, - loadEffectFunction loadFunc, - const QString& configKeyPrefix); + void applySelectionsToDecks(); ControlProxy m_COLoFreq; ControlProxy m_COHiFreq; diff --git a/src/widget/effectwidgetutils.h b/src/widget/effectwidgetutils.h index 8ed1742f69b3..4882e26f5d72 100644 --- a/src/widget/effectwidgetutils.h +++ b/src/widget/effectwidgetutils.h @@ -44,6 +44,18 @@ class EffectWidgetUtils { return pEffectsManager->getEffectChainSlot(unitGroup); } + static int getEffectSlotIndexFromNode( + const QDomNode& node, + const SkinContext& context) { + bool effectSlotOk = false; + int effectSlotIndex = context.selectInt(node, "Effect", &effectSlotOk); + if (effectSlotOk) { + // XML effect nodes are 1-indexed. + return effectSlotIndex - 1; + } + return -1; + } + static EffectSlotPointer getEffectSlotFromNode( const QDomNode& node, const SkinContext& context, @@ -52,13 +64,8 @@ class EffectWidgetUtils { return EffectSlotPointer(); } - bool effectSlotOk = false; - int effectSlot = context.selectInt(node, "Effect", &effectSlotOk); - if (effectSlotOk) { - // XML effect nodes are 1-indexed. - return pChainSlot->getEffectSlot(effectSlot - 1); - } - return EffectSlotPointer(); + int effectSlotIndex = getEffectSlotIndexFromNode(node, context); + return pChainSlot->getEffectSlot(effectSlotIndex); } static EffectParameterSlotBasePointer getParameterSlotFromNode( diff --git a/src/widget/weffectselector.cpp b/src/widget/weffectselector.cpp index 140bfec08dac..b893c38c370b 100644 --- a/src/widget/weffectselector.cpp +++ b/src/widget/weffectselector.cpp @@ -8,6 +8,7 @@ WEffectSelector::WEffectSelector(QWidget* pParent, EffectsManager* pEffectsManager) : QComboBox(pParent), WBaseWidget(this), + m_iEffectSlotIndex(-1), m_pEffectsManager(pEffectsManager) { // Prevent this widget from getting focused to avoid // interfering with using the library via keyboard. @@ -20,6 +21,8 @@ void WEffectSelector::setup(const QDomNode& node, const SkinContext& context) { node, context, m_pEffectsManager); m_pEffectSlot = EffectWidgetUtils::getEffectSlotFromNode( node, context, m_pChainSlot); + m_iEffectSlotIndex = EffectWidgetUtils::getEffectSlotIndexFromNode( + node, context); if (m_pEffectSlot != nullptr) { connect(m_pEffectsManager, @@ -81,10 +84,7 @@ void WEffectSelector::slotEffectSelected(int newIndex) { m_pEffectsManager->getBackendManager()->getManifestFromUniqueId( itemData(newIndex).toString()); - m_pEffectsManager->loadEffect( - m_pChainSlot, - m_pEffectSlot->getEffectSlotNumber(), - pManifest); + m_pChainSlot->loadEffectWithDefaults(m_iEffectSlotIndex, pManifest); setBaseTooltip(itemData(newIndex, Qt::ToolTipRole).toString()); } diff --git a/src/widget/weffectselector.h b/src/widget/weffectselector.h index 815536b7d11d..14ad5d89f4a4 100644 --- a/src/widget/weffectselector.h +++ b/src/widget/weffectselector.h @@ -20,6 +20,7 @@ class WEffectSelector : public QComboBox, public WBaseWidget { void populate(); private: + int m_iEffectSlotIndex; EffectsManager* m_pEffectsManager; EffectSlotPointer m_pEffectSlot; EffectChainSlotPointer m_pChainSlot; From 9cd36bacec5b24b9c13f8b77dc9678a382628f96 Mon Sep 17 00:00:00 2001 From: Be Date: Fri, 1 May 2020 21:12:47 -0500 Subject: [PATCH 138/443] effects system: update documentation --- src/effects/backends/effectprocessor.h | 16 ++++++++-------- src/effects/backends/effectsbackend.h | 12 ++++-------- src/effects/effectchainslot.h | 4 ---- src/effects/effectsmanager.h | 18 +++--------------- src/effects/effectsmessenger.h | 8 +++++++- 5 files changed, 22 insertions(+), 36 deletions(-) diff --git a/src/effects/backends/effectprocessor.h b/src/effects/backends/effectprocessor.h index 9f3d9e0d6cd7..adcd5c3f8402 100644 --- a/src/effects/backends/effectprocessor.h +++ b/src/effects/backends/effectprocessor.h @@ -14,22 +14,22 @@ /// Effects are implemented as two separate classes, an EffectState subclass and /// an EffectProcessorImpl subclass. Separating state from the DSP code allows -/// memory allocation and deletion, which is slow, to be done on the main thread -/// instead of potentially blocking the audio engine callback thread and causing -/// audible glitches. EffectStates allocated on the main thread are passed as -/// pointers to the EffectProcessorImpl in the audio callback thread via the -/// effect MessagePipe FIFO (see EngineEffectsManager::onCallbackStart). +/// memory allocation and deletion on the heap, which is slow, to be done on the +/// main thread instead of potentially blocking the audio engine callback thread +/// and causing audible glitches. EffectStates allocated on the main thread are +/// passed as pointers to the EffectProcessorImpl in the audio callback thread +/// via the EffectsMessenger. /// /// Each EffectState instance is responsible for one routing of input signal to /// output signal. The base EffectProcessorImpl class handles the management /// of EffectStates. EffectProcessorImpl subclasses only need to be concerned /// with implementing the signal processing logic and providing metadata for -/// describing the effect and its parameters. +/// describing the effect and its parameters with an EffectManifest. /// /// Input signals can be any EngineChannel, but output channels are hardcoded in /// EngineMaster as the post-fader processing for the master mix and pre-fader -/// processing for headphones. EffectStates are allocated when an input signal is -/// enabled for a chain. Also, when a new effect is loaded to a chain, +/// processing for headphones. EffectStates are allocated when an input signal +/// is enabled for a chain. Also, when a new effect is loaded to a chain, /// EffectStates are only allocated for input signals that are enabled at that /// time. This allows for scaling up to an arbitrary number of input signals /// without wasting a lot of memory. diff --git a/src/effects/backends/effectsbackend.h b/src/effects/backends/effectsbackend.h index ea925952403e..bbb02ab5517f 100644 --- a/src/effects/backends/effectsbackend.h +++ b/src/effects/backends/effectsbackend.h @@ -10,14 +10,10 @@ class EffectProcessor; /// EffectsBackend is an abstract base class that enumerates available effects -/// which are identified by EffectManifests. EffectsBackend creates -/// EffectProcessors when provided with an EffectManifest from EffectsManager -/// indicating which specific EffectProcessor type to create. -/// -/// The EffectProcessors implement the DSP logic specific to each effect. -/// EffectManager sends the EffectProcessors down to the EffectChainSlot, which -/// sends it down to the EffectSlot. The EffectSlot uses the EffectProcessor to -/// create an EngineEffect and add/remove the EngineEffect from the engine. +/// which are identified by EffectManifests. EffectsBackend create an +/// EffectProcessor when provided with an EffectManifest indicating which +/// specific EffectProcessor type to create. EffectProcessors implement the DSP +/// logic specific to each effect. /// /// Currently the implemented EffectsBackend subclasses are for the effects /// built into Mixxx and LV2 plugins. Other plugin types such as VSTs could be diff --git a/src/effects/effectchainslot.h b/src/effects/effectchainslot.h index 03551a974ad4..f94dac8e404d 100644 --- a/src/effects/effectchainslot.h +++ b/src/effects/effectchainslot.h @@ -34,10 +34,6 @@ class EngineEffectChain; /// /// The state of an EffectChainSlot can be saved to and loaded from an /// EffectChainPreset, which can serialize/deserialize that state to/from XML. -/// Loading state from an EffectChainPreset is done by -/// EffectsManager::loadEffectChainPreset rather than directly by EffectChainSlot -/// because loading effects requires access to the EffectsBackends and default -/// EffectPresets which are maintained by EffectsManager. /// /// Currently EffectChainSlot has a fixed number of EffectSlots. In the future /// this may be extended to create an Effect class to decouple an EngineEffect's diff --git a/src/effects/effectsmanager.h b/src/effects/effectsmanager.h index 7fdf0d867bdf..aa3af2b5bcf7 100644 --- a/src/effects/effectsmanager.h +++ b/src/effects/effectsmanager.h @@ -26,21 +26,9 @@ class EffectManifest; typedef QMap> ParameterMap; -/// EffectsManager is the interface between the parts of the effects system in -/// the main thread and the rest of Mixxx. It creates/destroys a fixed -/// set of EffectChainSlots on Mixxx startup/shutdown. EffectManager uses -/// EffectBackends and EffectManifests to create EffectProcessors. The -/// EffectProcessors are sent down to the EffectChainSlots, then down to the -/// EffectSlots which use the EffectProcessors to create EngineEffects and add -/// them to the audio engine. -/// -/// EffectsManager saves/loads EffectPresets in the "effects/defaults" folder in -/// the user settings folder to allow users to specify default states when each -/// effect is loaded. -/// -/// To maintain clear separation of responsibilities, GUI classes should NOT -/// access the EffectChainSlots or EffectSlots directly. They should interface -/// with them indirectly through EffectsManager. +/// EffectsManager creates/destroys a fixed set of EffectChainSlots on Mixxx +/// startup/shutdown and creates a QuickEffectChainSlot and EqualizerEffectChainSlot +/// for each deck. class EffectsManager : public QObject { Q_OBJECT public: diff --git a/src/effects/effectsmessenger.h b/src/effects/effectsmessenger.h index 5c0f9f008797..7db63758b0d8 100644 --- a/src/effects/effectsmessenger.h +++ b/src/effects/effectsmessenger.h @@ -2,7 +2,13 @@ #include "engine/effects/message.h" -/// EffectsMessenger sends EffectsRequest and receives EffectsResponses +/// EffectsMessenger sends EffectsRequests from the main thread and receives +/// EffectsResponses from the audio thread. This allows memory allocation and +/// deallocation on the heap, which is slow, to be done in the main thread to +/// avoid blocking the audio thread and causing audible glitches. +/// Refer to +/// http://www.rossbencina.com/code/real-time-audio-programming-101-time-waits-for-nothing +/// for background information. class EffectsMessenger { public: EffectsMessenger(EffectsRequestPipe* pRequestPipe, EffectsResponsePipe* m_pResponsePipe); From 3a187c9c2b845cc56c1547dab413468fc5fe41e0 Mon Sep 17 00:00:00 2001 From: Be Date: Fri, 1 May 2020 21:45:26 -0500 Subject: [PATCH 139/443] WEffectChainPresetSelector: fix broken signal connection --- src/effects/effectsmanager.h | 1 - src/widget/weffectchainpresetselector.cpp | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/effects/effectsmanager.h b/src/effects/effectsmanager.h index aa3af2b5bcf7..30dc9fb87a36 100644 --- a/src/effects/effectsmanager.h +++ b/src/effects/effectsmanager.h @@ -117,7 +117,6 @@ class EffectsManager : public QObject { signals: void visibleEffectsUpdated(); - void effectChainPresetListUpdated(); private: QString debugString() const { diff --git a/src/widget/weffectchainpresetselector.cpp b/src/widget/weffectchainpresetselector.cpp index 350eba81523b..4a64aa219b80 100644 --- a/src/widget/weffectchainpresetselector.cpp +++ b/src/widget/weffectchainpresetselector.cpp @@ -26,8 +26,8 @@ void WEffectChainPresetSelector::setup(const QDomNode& node, const SkinContext& return; } - connect(m_pEffectsManager, - &EffectsManager::effectChainPresetListUpdated, + connect(m_pChainPresetManager.get(), + &EffectChainPresetManager::effectChainPresetListUpdated, this, &WEffectChainPresetSelector::populate); connect(m_pChainSlot.data(), From 55dbb08a909035de927bb0f733e7637fba4fafc2 Mon Sep 17 00:00:00 2001 From: Be Date: Fri, 1 May 2020 22:47:43 -0500 Subject: [PATCH 140/443] EffectsManager & WEffectChainPresetButton cleanup --- src/effects/effectslot.cpp | 2 + src/effects/effectslot.h | 1 + src/effects/effectsmanager.cpp | 27 ------- src/effects/effectsmanager.h | 10 --- .../presets/effectchainpresetmanager.cpp | 5 ++ .../presets/effectchainpresetmanager.h | 1 + src/effects/presets/effectpresetmanager.cpp | 5 ++ src/effects/presets/effectpresetmanager.h | 1 + src/widget/weffectchainpresetbutton.cpp | 70 +++++++++++++------ src/widget/weffectchainpresetbutton.h | 5 +- 10 files changed, 68 insertions(+), 59 deletions(-) diff --git a/src/effects/effectslot.cpp b/src/effects/effectslot.cpp index 951c32f36812..9352e83f8c5f 100644 --- a/src/effects/effectslot.cpp +++ b/src/effects/effectslot.cpp @@ -424,6 +424,7 @@ void EffectSlot::hideParameter(EffectParameterPointer pParameter) { } m_loadedParameters[parameterType].removeAll(pParameter); loadParameters(); + emit parametersChanged(); } void EffectSlot::showParameter(EffectParameterPointer pParameter) { @@ -436,6 +437,7 @@ void EffectSlot::showParameter(EffectParameterPointer pParameter) { } m_loadedParameters[parameterType].append(pParameter); loadParameters(); + emit parametersChanged(); } void EffectSlot::slotPrevEffect(double v) { diff --git a/src/effects/effectslot.h b/src/effects/effectslot.h index f74d1c31e876..5f19a9e5c21f 100644 --- a/src/effects/effectslot.h +++ b/src/effects/effectslot.h @@ -138,6 +138,7 @@ class EffectSlot : public QObject { signals: void effectChanged(); + void parametersChanged(); private slots: void updateEngineState(); diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index 17ae87b89e22..835049d270a3 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -89,26 +89,6 @@ void EffectsManager::registerOutputChannel(const ChannelHandleAndGroup& handle_g m_registeredOutputChannels.insert(handle_group); } -ParameterMap EffectsManager::getLoadedParameters(int chainNumber, int effectNumber) const { - return m_standardEffectChainSlots.at(chainNumber)->getEffectSlot(effectNumber)->getLoadedParameters(); -} - -ParameterMap EffectsManager::getHiddenParameters(int chainNumber, int effectNumber) const { - return m_standardEffectChainSlots.at(chainNumber)->getEffectSlot(effectNumber)->getHiddenParameters(); -} - -void EffectsManager::hideParameter(int chainNumber, int effectNumber, EffectParameterPointer pParameter) { - m_standardEffectChainSlots.at(chainNumber)->getEffectSlot(effectNumber)->hideParameter(pParameter); -} - -void EffectsManager::showParameter(int chainNumber, int effectNumber, EffectParameterPointer pParameter) { - m_standardEffectChainSlots.at(chainNumber)->getEffectSlot(effectNumber)->showParameter(pParameter); -} - -void EffectsManager::loadPresetToStandardChain(int chainNumber, EffectChainPresetPointer pPreset) { - m_standardEffectChainSlots.at(chainNumber)->loadChainPreset(pPreset); -} - QString EffectsManager::getNextEffectId(const QString& effectId) { if (m_visibleEffectManifests.isEmpty()) { return QString(); @@ -279,13 +259,6 @@ void EffectsManager::saveDefaultForEffect(int unitNumber, int effectNumber) { m_pEffectPresetManager->saveDefaultForEffect(pPreset); } -void EffectsManager::savePresetFromStandardEffectChain(int chainNumber) { - StandardEffectChainSlotPointer pStandardChainSlot = m_standardEffectChainSlots.at(chainNumber); - EffectChainSlot* genericChainSlot = static_cast(pStandardChainSlot.get()); - EffectChainPresetPointer pPreset(new EffectChainPreset(genericChainSlot)); - m_pChainPresetManager->savePreset(pPreset); -} - void EffectsManager::readEffectsXml() { QStringList deckStrings; for (auto it = m_quickEffectChainSlots.begin(); it != m_quickEffectChainSlots.end(); it++) { diff --git a/src/effects/effectsmanager.h b/src/effects/effectsmanager.h index 30dc9fb87a36..45d3e782f001 100644 --- a/src/effects/effectsmanager.h +++ b/src/effects/effectsmanager.h @@ -70,14 +70,6 @@ class EffectsManager : public QObject { return m_registeredOutputChannels; } - ParameterMap getLoadedParameters(int chainNumber, int effectNumber) const; - ParameterMap getHiddenParameters(int chainNumber, int effectNumber) const; - - void hideParameter(int chainNumber, int effectNumber, EffectParameterPointer pParameter); - void showParameter(int chainNumber, int effectNumber, EffectParameterPointer pParameter); - - void loadPresetToStandardChain(int chainNumber, EffectChainPresetPointer pPreset); - void addStandardEffectChainSlots(); EffectChainSlotPointer getStandardEffectChainSlot(int unitNumber) const; @@ -111,8 +103,6 @@ class EffectsManager : public QObject { void saveDefaultForEffect(EffectPresetPointer pEffectPreset); void saveDefaultForEffect(int chainNumber, int effcectNumber); - void savePresetFromStandardEffectChain(int chainNumber); - void setup(); signals: diff --git a/src/effects/presets/effectchainpresetmanager.cpp b/src/effects/presets/effectchainpresetmanager.cpp index 233bd768b968..14f6c4fcc3d3 100644 --- a/src/effects/presets/effectchainpresetmanager.cpp +++ b/src/effects/presets/effectchainpresetmanager.cpp @@ -289,6 +289,11 @@ void EffectChainPresetManager::loadEffectChainPresets() { emit effectChainPresetListUpdated(); } +void EffectChainPresetManager::savePreset(EffectChainSlotPointer pChainSlot) { + EffectChainPresetPointer pPreset(new EffectChainPreset(pChainSlot.get())); + savePreset(pPreset); +} + void EffectChainPresetManager::savePreset(EffectChainPresetPointer pPreset) { bool okay = false; QString name = QInputDialog::getText(nullptr, diff --git a/src/effects/presets/effectchainpresetmanager.h b/src/effects/presets/effectchainpresetmanager.h index b5f23a0eb556..8a2aa0ba0134 100644 --- a/src/effects/presets/effectchainpresetmanager.h +++ b/src/effects/presets/effectchainpresetmanager.h @@ -47,6 +47,7 @@ class EffectChainPresetManager : public QObject { } void savePreset(EffectChainPresetPointer pPreset); + void savePreset(EffectChainSlotPointer pChainSlot); EffectsXmlData readEffectsXml(QStringList deckStrings); void saveEffectsXml(EffectsXmlData data); diff --git a/src/effects/presets/effectpresetmanager.cpp b/src/effects/presets/effectpresetmanager.cpp index a2166c5ae80d..28d39c7eecf9 100644 --- a/src/effects/presets/effectpresetmanager.cpp +++ b/src/effects/presets/effectpresetmanager.cpp @@ -55,6 +55,11 @@ void EffectPresetManager::loadDefaultEffectPresets() { } } +void EffectPresetManager::saveDefaultForEffect(EffectSlotPointer pEffectSlot) { + EffectPresetPointer pPreset(new EffectPreset(pEffectSlot)); + saveDefaultForEffect(pPreset); +} + void EffectPresetManager::saveDefaultForEffect(EffectPresetPointer pEffectPreset) { if (pEffectPreset->isEmpty()) { return; diff --git a/src/effects/presets/effectpresetmanager.h b/src/effects/presets/effectpresetmanager.h index be17b43461d5..9c5fd236407f 100644 --- a/src/effects/presets/effectpresetmanager.h +++ b/src/effects/presets/effectpresetmanager.h @@ -15,6 +15,7 @@ class EffectPresetManager { } void saveDefaultForEffect(EffectPresetPointer pEffectPreset); + void saveDefaultForEffect(EffectSlotPointer pEffectSlot); private: void loadDefaultEffectPresets(); diff --git a/src/widget/weffectchainpresetbutton.cpp b/src/widget/weffectchainpresetbutton.cpp index 35d2c56c4895..0a2efe1c193a 100644 --- a/src/widget/weffectchainpresetbutton.cpp +++ b/src/widget/weffectchainpresetbutton.cpp @@ -3,42 +3,75 @@ #include #include +#include "effects/presets/effectpresetmanager.h" #include "widget/effectwidgetutils.h" WEffectChainPresetButton::WEffectChainPresetButton(QWidget* parent, EffectsManager* pEffectsManager) : QPushButton(parent), WBaseWidget(this), m_pEffectsManager(pEffectsManager), + m_pChainPresetManager(pEffectsManager->getChainPresetManager()), m_pMenu(make_parented(new QMenu(this))) { setMenu(m_pMenu.get()); connect(this, &QPushButton::pressed, this, + &QPushButton::showMenu); + connect(m_pChainPresetManager.get(), + &EffectChainPresetManager::effectChainPresetListUpdated, + this, &WEffectChainPresetButton::populateMenu); } void WEffectChainPresetButton::setup(const QDomNode& node, const SkinContext& context) { m_iChainNumber = EffectWidgetUtils::getEffectUnitNumberFromNode(node, context); + m_pChainSlot = EffectWidgetUtils::getEffectChainSlotFromNode( + node, context, m_pEffectsManager); + for (const auto& pEffectSlot : m_pChainSlot->getEffectSlots()) { + connect(pEffectSlot.get(), + &EffectSlot::effectChanged, + this, + &WEffectChainPresetButton::populateMenu); + connect(pEffectSlot.get(), + &EffectSlot::parametersChanged, + this, + &WEffectChainPresetButton::populateMenu); + } + populateMenu(); // TODO: set icon } void WEffectChainPresetButton::populateMenu() { m_pMenu->clear(); - for (const auto pChainPreset : m_pEffectsManager->getChainPresetManager()->getPresetsSorted()) { + + // Chain preset items + for (const auto pChainPreset : m_pChainPresetManager->getPresetsSorted()) { m_pMenu->addAction(pChainPreset->name(), [=]() { - m_pEffectsManager->loadPresetToStandardChain(m_iChainNumber, pChainPreset); + m_pChainSlot->loadChainPreset(pChainPreset); }); } m_pMenu->addSeparator(); - m_pMenu->addAction(tr("Save preset"), this, &WEffectChainPresetButton::saveChainPreset); + m_pMenu->addAction(tr("Save preset"), this, [this]() { + m_pChainPresetManager->savePreset(m_pChainSlot); + }); m_pMenu->addSeparator(); - for (int i = 0; i < 3; ++i) { - const ParameterMap loadedParameters = m_pEffectsManager->getLoadedParameters(m_iChainNumber, i); - const ParameterMap hiddenParameters = m_pEffectsManager->getHiddenParameters(m_iChainNumber, i); + + // Effect parameter hiding/showing and saving snapshots + int effectSlotIndex = 0; + for (const auto pEffectSlot : m_pChainSlot->getEffectSlots()) { + const ParameterMap loadedParameters = pEffectSlot->getLoadedParameters(); + const ParameterMap hiddenParameters = pEffectSlot->getHiddenParameters(); + + auto pManifest = pEffectSlot->getManifest(); + if (pManifest == nullptr) { + m_pMenu->addAction(tr("Empty Effect Slot %1").arg(effectSlotIndex)); + effectSlotIndex++; + continue; + } auto pEffectMenu = make_parented(m_pMenu); - pEffectMenu->setTitle(tr("Effect") + " " + QString::number(i + 1)); + pEffectMenu->setTitle(pEffectSlot->getManifest()->displayName()); int numTypes = static_cast(EffectManifestParameter::ParameterType::NUM_TYPES); for (int parameterTypeId = 0; parameterTypeId < numTypes; ++parameterTypeId) { @@ -48,11 +81,11 @@ void WEffectChainPresetButton::populateMenu() { auto pCheckbox = make_parented(pEffectMenu); pCheckbox->setChecked(true); pCheckbox->setText(pParameter->manifest()->name()); - auto handler = [this, pCheckbox{pCheckbox.get()}, i, pParameter] { + auto handler = [pCheckbox{pCheckbox.get()}, pEffectSlot, pParameter] { if (pCheckbox->isChecked()) { - m_pEffectsManager->showParameter(m_iChainNumber, i, pParameter); + pEffectSlot->showParameter(pParameter); } else { - m_pEffectsManager->hideParameter(m_iChainNumber, i, pParameter); + pEffectSlot->hideParameter(pParameter); } }; connect(pCheckbox.get(), &QCheckBox::stateChanged, this, handler); @@ -68,11 +101,11 @@ void WEffectChainPresetButton::populateMenu() { auto pCheckbox = make_parented(pEffectMenu); pCheckbox->setChecked(false); pCheckbox->setText(pParameter->manifest()->name()); - auto handler = [this, pCheckbox{pCheckbox.get()}, i, pParameter] { + auto handler = [pCheckbox{pCheckbox.get()}, pEffectSlot, pParameter] { if (pCheckbox->isChecked()) { - m_pEffectsManager->showParameter(m_iChainNumber, i, pParameter); + pEffectSlot->showParameter(pParameter); } else { - m_pEffectsManager->hideParameter(m_iChainNumber, i, pParameter); + pEffectSlot->hideParameter(pParameter); } }; connect(pCheckbox.get(), &QCheckBox::stateChanged, this, handler); @@ -85,15 +118,10 @@ void WEffectChainPresetButton::populateMenu() { } pEffectMenu->addSeparator(); } - pEffectMenu->addAction(tr("Save snapshot"), [=] { - m_pEffectsManager->saveDefaultForEffect(m_iChainNumber, i); + pEffectMenu->addAction(tr("Save snapshot"), [this, pEffectSlot] { + m_pEffectsManager->getEffectPresetManager()->saveDefaultForEffect(pEffectSlot); }); m_pMenu->addMenu(pEffectMenu); + effectSlotIndex++; } - - showMenu(); -} - -void WEffectChainPresetButton::saveChainPreset() { - m_pEffectsManager->savePresetFromStandardEffectChain(m_iChainNumber); } diff --git a/src/widget/weffectchainpresetbutton.h b/src/widget/weffectchainpresetbutton.h index 439ba7eb0507..4ff2c8653e54 100644 --- a/src/widget/weffectchainpresetbutton.h +++ b/src/widget/weffectchainpresetbutton.h @@ -4,6 +4,7 @@ #include #include "effects/effectsmanager.h" +#include "effects/presets/effectchainpresetmanager.h" #include "skin/skincontext.h" #include "util/parented_ptr.h" #include "widget/wbasewidget.h" @@ -17,10 +18,12 @@ class WEffectChainPresetButton : public QPushButton, public WBaseWidget { private slots: void populateMenu(); - void saveChainPreset(); private: int m_iChainNumber; + EffectChainSlotPointer m_pChainSlot; + EffectsManager* m_pEffectsManager; + EffectChainPresetManagerPointer m_pChainPresetManager; parented_ptr m_pMenu; }; From 44f7125cfa5cfc3ffc2602122e7818df5ef53254 Mon Sep 17 00:00:00 2001 From: Be Date: Fri, 1 May 2020 22:57:02 -0500 Subject: [PATCH 141/443] EffectChainPresetManager: actually delete preset files --- src/effects/presets/effectchainpresetmanager.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/effects/presets/effectchainpresetmanager.cpp b/src/effects/presets/effectchainpresetmanager.cpp index 14f6c4fcc3d3..775d73c29373 100644 --- a/src/effects/presets/effectchainpresetmanager.cpp +++ b/src/effects/presets/effectchainpresetmanager.cpp @@ -206,6 +206,14 @@ void EffectChainPresetManager::deletePreset(const QString& chainPresetName) { if (pressedButton != QMessageBox::Yes) { return; } + QFile file(m_pConfig->getSettingsPath() + kEffectChainPresetDirectory + + "/" + chainPresetName + ".xml"); + if (!file.remove()) { + QMessageBox::critical( + nullptr, + tr("Could not delete effect chain preset"), + tr("Could not delete effect chain preset \"%1\"").arg(chainPresetName)); + } EffectChainPresetPointer pPreset = m_effectChainPresets.take(chainPresetName); From e2099b8bd761a0865fbb999452759fb474e1adde Mon Sep 17 00:00:00 2001 From: Be Date: Fri, 1 May 2020 23:11:27 -0500 Subject: [PATCH 142/443] EffectChainPresetManager: quotes around preset names in dialogs --- src/effects/presets/effectchainpresetmanager.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/effects/presets/effectchainpresetmanager.cpp b/src/effects/presets/effectchainpresetmanager.cpp index 775d73c29373..9e98f116022b 100644 --- a/src/effects/presets/effectchainpresetmanager.cpp +++ b/src/effects/presets/effectchainpresetmanager.cpp @@ -85,8 +85,8 @@ void EffectChainPresetManager::importPreset() { bool okay = false; QString newName = QInputDialog::getText(nullptr, tr("Rename effect chain preset"), - tr("An effect chain preset with the name") + " " + - pPreset->name() + " " + + tr("An effect chain preset with the name") + " \"" + + pPreset->name() + "\" " + tr("already exists. Choose a new name for the " "imported effect chain preset:"), QLineEdit::Normal, @@ -158,8 +158,8 @@ void EffectChainPresetManager::exportPreset(const QString& chainPresetName) { file.close(); QMessageBox::critical(nullptr, tr("Error exporting effect chain preset"), - tr("Could not save effect chain preset") + " " + - chainPresetName + tr("to file") + " " + fileName); + tr("Could not save effect chain preset") + " \"" + + chainPresetName + "\" " + tr("to file") + " " + fileName); return; } @@ -178,7 +178,7 @@ void EffectChainPresetManager::renamePreset(const QString& oldName) { bool okay = false; QString newName = QInputDialog::getText(nullptr, tr("Rename effect chain preset"), - tr("New name effect chain preset") + " " + oldName, + tr("New name for effect chain preset") + " \"" + oldName + "\"", QLineEdit::Normal, oldName, &okay); @@ -202,10 +202,11 @@ void EffectChainPresetManager::deletePreset(const QString& chainPresetName) { auto pressedButton = QMessageBox::question(nullptr, tr("Remove effect chain preset"), tr("Are you sure you want to delete the effect chain preset") + - " " + chainPresetName + "?"); + " \"" + chainPresetName + "\"?"); if (pressedButton != QMessageBox::Yes) { return; } + QFile file(m_pConfig->getSettingsPath() + kEffectChainPresetDirectory + "/" + chainPresetName + ".xml"); if (!file.remove()) { From e6c23f0b20b2e7df39d4f33d3425827dce05bb24 Mon Sep 17 00:00:00 2001 From: Be Date: Fri, 1 May 2020 23:11:57 -0500 Subject: [PATCH 143/443] EffectChainPresetManager: actually rename preset files --- src/effects/presets/effectchainpresetmanager.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/effects/presets/effectchainpresetmanager.cpp b/src/effects/presets/effectchainpresetmanager.cpp index 9e98f116022b..10982f3bceaf 100644 --- a/src/effects/presets/effectchainpresetmanager.cpp +++ b/src/effects/presets/effectchainpresetmanager.cpp @@ -186,6 +186,15 @@ void EffectChainPresetManager::renamePreset(const QString& oldName) { return; } + QString directoryPath = m_pConfig->getSettingsPath() + kEffectChainPresetDirectory + "/"; + QFile file(directoryPath + oldName + ".xml"); + if (!file.rename(directoryPath + newName + ".xml")) { + QMessageBox::critical( + nullptr, + tr("Could not rename effect chain preset"), + tr("Could not rename effect chain preset \"%1\"").arg(oldName)); + } + EffectChainPresetPointer pPreset = m_effectChainPresets.take(oldName); int index = m_effectChainPresetsSorted.indexOf(pPreset); pPreset->setName(newName); From acc5585416c347d0cd0fac5b29b1c3396bf6d65d Mon Sep 17 00:00:00 2001 From: Be Date: Fri, 1 May 2020 23:23:27 -0500 Subject: [PATCH 144/443] EffectsManager: remove unused code --- src/effects/effectsmanager.cpp | 46 ---------------------------------- src/effects/effectsmanager.h | 8 ------ 2 files changed, 54 deletions(-) diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index 835049d270a3..9fb73fa3b43f 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -89,46 +89,6 @@ void EffectsManager::registerOutputChannel(const ChannelHandleAndGroup& handle_g m_registeredOutputChannels.insert(handle_group); } -QString EffectsManager::getNextEffectId(const QString& effectId) { - if (m_visibleEffectManifests.isEmpty()) { - return QString(); - } - if (effectId.isNull()) { - return m_visibleEffectManifests.first()->id(); - } - - int index; - for (index = 0; index < m_visibleEffectManifests.size(); ++index) { - if (effectId == m_visibleEffectManifests.at(index)->id()) { - break; - } - } - if (++index >= m_visibleEffectManifests.size()) { - index = 0; - } - return m_visibleEffectManifests.at(index)->id(); -} - -QString EffectsManager::getPrevEffectId(const QString& effectId) { - if (m_visibleEffectManifests.isEmpty()) { - return QString(); - } - if (effectId.isNull()) { - return m_visibleEffectManifests.last()->id(); - } - - int index; - for (index = 0; index < m_visibleEffectManifests.size(); ++index) { - if (effectId == m_visibleEffectManifests.at(index)->id()) { - break; - } - } - if (--index < 0) { - index = m_visibleEffectManifests.size() - 1; - } - return m_visibleEffectManifests.at(index)->id(); -} - void EffectsManager::addStandardEffectChainSlots() { for (int i = 0; i < EffectsManager::kNumStandardEffectChains; ++i) { VERIFY_OR_DEBUG_ASSERT(!m_effectChainSlotsByGroup.contains( @@ -253,12 +213,6 @@ void EffectsManager::setup() { readEffectsXml(); } -void EffectsManager::saveDefaultForEffect(int unitNumber, int effectNumber) { - auto pSlot = m_standardEffectChainSlots.at(unitNumber)->getEffectSlot(effectNumber); - EffectPresetPointer pPreset(new EffectPreset(pSlot)); - m_pEffectPresetManager->saveDefaultForEffect(pPreset); -} - void EffectsManager::readEffectsXml() { QStringList deckStrings; for (auto it = m_quickEffectChainSlots.begin(); it != m_quickEffectChainSlots.end(); it++) { diff --git a/src/effects/effectsmanager.h b/src/effects/effectsmanager.h index 45d3e782f001..9942fb2547b9 100644 --- a/src/effects/effectsmanager.h +++ b/src/effects/effectsmanager.h @@ -82,17 +82,12 @@ class EffectsManager : public QObject { } void addQuickEffectChainSlot(const QString& deckGroupName); - // TODO: Remove these methods to reduce coupling between GUI and - // effects system implementation details. EffectChainSlotPointer getEffectChainSlot(const QString& group) const; EffectSlotPointer getEffectSlot(const QString& group); EffectParameterSlotBasePointer getEffectParameterSlot( const EffectParameterType parameterType, const ConfigKey& configKey); - QString getNextEffectId(const QString& effectId); - QString getPrevEffectId(const QString& effectId); - inline const QList& getVisibleEffectManifests() const { return m_visibleEffectManifests; }; @@ -100,9 +95,6 @@ class EffectsManager : public QObject { void setEffectVisibility(EffectManifestPointer pManifest, bool visibility); bool getEffectVisibility(EffectManifestPointer pManifest); - void saveDefaultForEffect(EffectPresetPointer pEffectPreset); - void saveDefaultForEffect(int chainNumber, int effcectNumber); - void setup(); signals: From b2788d3ad7510cc0994357476f184005b69c5831 Mon Sep 17 00:00:00 2001 From: Be Date: Fri, 1 May 2020 23:37:47 -0500 Subject: [PATCH 145/443] EffectChainSlot: remove speculation about future use cases That does not belong in documentation. --- src/effects/effectchainslot.h | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/effects/effectchainslot.h b/src/effects/effectchainslot.h index f94dac8e404d..447b60e603f7 100644 --- a/src/effects/effectchainslot.h +++ b/src/effects/effectchainslot.h @@ -34,13 +34,6 @@ class EngineEffectChain; /// /// The state of an EffectChainSlot can be saved to and loaded from an /// EffectChainPreset, which can serialize/deserialize that state to/from XML. -/// -/// Currently EffectChainSlot has a fixed number of EffectSlots. In the future -/// this may be extended to create an Effect class to decouple an EngineEffect's -/// state from the ControlObjects so that EffectChainSlot could arbitrarily hide -/// and rearrange Effects by loading/unloading them from EffectSlots. This would -/// be similar to the relationship between EffectSlot and -/// EffectParameterSlotBase/EffectParameter. class EffectChainSlot : public QObject { Q_OBJECT public: From ddcf004a5f08f32afa9395530af8523b37703f99 Mon Sep 17 00:00:00 2001 From: Be Date: Sat, 2 May 2020 00:07:11 -0500 Subject: [PATCH 146/443] EffectChainSlot: remove unused code EffectChainSlot no longer needs access to the EffectsBackendManager now that the effect loading process has been cleaned up. --- src/effects/effectchainslot.cpp | 3 --- src/effects/effectchainslot.h | 1 - 2 files changed, 4 deletions(-) diff --git a/src/effects/effectchainslot.cpp b/src/effects/effectchainslot.cpp index 07676a0ff2b5..60281fbe5e1c 100644 --- a/src/effects/effectchainslot.cpp +++ b/src/effects/effectchainslot.cpp @@ -3,8 +3,6 @@ #include "control/controlencoder.h" #include "control/controlpotmeter.h" #include "control/controlpushbutton.h" -#include "effects/backends/effectprocessor.h" -#include "effects/backends/effectsbackendmanager.h" #include "effects/effectslot.h" #include "effects/effectsmanager.h" #include "effects/effectsmessenger.h" @@ -25,7 +23,6 @@ EffectChainSlot::EffectChainSlot(const QString& group, : // The control group names are 1-indexed while internally everything // is 0-indexed. m_pEffectsManager(pEffectsManager), - m_pBackendManager(pEffectsManager->getBackendManager()), m_pChainPresetManager(pEffectsManager->getChainPresetManager()), m_pMessenger(pEffectsMessenger), m_group(group), diff --git a/src/effects/effectchainslot.h b/src/effects/effectchainslot.h index 447b60e603f7..5a44821e6d3c 100644 --- a/src/effects/effectchainslot.h +++ b/src/effects/effectchainslot.h @@ -121,7 +121,6 @@ class EffectChainSlot : public QObject { void disableForInputChannel(const ChannelHandleAndGroup& handle_group); EffectsManager* m_pEffectsManager; - EffectsBackendManagerPointer m_pBackendManager; EffectChainPresetManagerPointer m_pChainPresetManager; EffectsMessengerPointer m_pMessenger; ControlObject* m_pControlChainMix; From 40c5aa5e069a53dfd1c1d2aeb6ba33b1b1a81108 Mon Sep 17 00:00:00 2001 From: Be Date: Sat, 2 May 2020 00:16:53 -0500 Subject: [PATCH 147/443] EffectPreset: update documentation --- src/effects/presets/effectpreset.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/effects/presets/effectpreset.h b/src/effects/presets/effectpreset.h index 212d905aeb74..a70f2c2dda50 100644 --- a/src/effects/presets/effectpreset.h +++ b/src/effects/presets/effectpreset.h @@ -7,7 +7,7 @@ /// EffectPreset is a read-only snapshot of the state of an effect that can be /// serialized to/deserialized from XML. It is used by EffectChainPreset to -/// save/load chain presets. It is also used by EffectsManager to save custom +/// save/load chain presets. It is also used by EffectPresetManager to save custom /// defaults for each effect. class EffectPreset { public: From 619e44e7b73e9aea217a306c05b32c525ec82e97 Mon Sep 17 00:00:00 2001 From: Be Date: Sat, 2 May 2020 00:28:51 -0500 Subject: [PATCH 148/443] EffectsManager: remove unused #includes --- src/effects/effectsmanager.cpp | 5 +---- src/effects/effectsmanager.h | 7 ------- src/effects/presets/effectchainpresetmanager.cpp | 1 + 3 files changed, 2 insertions(+), 11 deletions(-) diff --git a/src/effects/effectsmanager.cpp b/src/effects/effectsmanager.cpp index 9fb73fa3b43f..827effdf398e 100644 --- a/src/effects/effectsmanager.cpp +++ b/src/effects/effectsmanager.cpp @@ -1,14 +1,11 @@ #include "effects/effectsmanager.h" -#include #include -#include +#include "control/controlpotmeter.h" #include "effects/effectslot.h" #include "effects/effectsmessenger.h" -#include "effects/presets/effectchainpreset.h" #include "effects/presets/effectpresetmanager.h" -#include "effects/presets/effectxmlelements.h" #include "util/assert.h" namespace { diff --git a/src/effects/effectsmanager.h b/src/effects/effectsmanager.h index 9942fb2547b9..a73d4bbfa803 100644 --- a/src/effects/effectsmanager.h +++ b/src/effects/effectsmanager.h @@ -2,13 +2,9 @@ #include #include -#include -#include -#include #include #include "control/controlpotmeter.h" -#include "control/controlpushbutton.h" #include "effects/backends/effectmanifestparameter.h" #include "effects/backends/effectsbackendmanager.h" #include "effects/presets/effectchainpresetmanager.h" @@ -17,9 +13,6 @@ #include "engine/effects/engineeffectsmanager.h" #include "preferences/usersettings.h" #include "util/class.h" -#include "util/fifo.h" -#include "util/memory.h" -#include "util/xml.h" class EngineEffectsManager; class EffectManifest; diff --git a/src/effects/presets/effectchainpresetmanager.cpp b/src/effects/presets/effectchainpresetmanager.cpp index 10982f3bceaf..c3470e5d85f8 100644 --- a/src/effects/presets/effectchainpresetmanager.cpp +++ b/src/effects/presets/effectchainpresetmanager.cpp @@ -8,6 +8,7 @@ #include "effects/backends/builtin/filtereffect.h" #include "effects/effectsmanager.h" #include "effects/presets/effectxmlelements.h" +#include "util/xml.h" namespace { const QString kEffectChainPresetDirectory = "/effects/chains"; From 535a717e2b0793c566dfe1aea8de292d330c1ec5 Mon Sep 17 00:00:00 2001 From: Be Date: Sat, 2 May 2020 01:13:14 -0500 Subject: [PATCH 149/443] EffectChainSlot: remove unused num_effects ControlObject I don't even know what it's supposed to mean. --- src/effects/effectchainslot.cpp | 4 ---- src/effects/effectchainslot.h | 1 - 2 files changed, 5 deletions(-) diff --git a/src/effects/effectchainslot.cpp b/src/effects/effectchainslot.cpp index 60281fbe5e1c..4600a59d5e02 100644 --- a/src/effects/effectchainslot.cpp +++ b/src/effects/effectchainslot.cpp @@ -36,9 +36,6 @@ EffectChainSlot::EffectChainSlot(const QString& group, connect(m_pControlClear, &ControlObject::valueChanged, this, &EffectChainSlot::slotControlClear); - m_pControlNumEffects = new ControlObject(ConfigKey(m_group, "num_effects")); - m_pControlNumEffects->setReadOnly(); - m_pControlNumEffectSlots = new ControlObject(ConfigKey(m_group, "num_effectslots")); m_pControlNumEffectSlots->setReadOnly(); @@ -130,7 +127,6 @@ EffectChainSlot::~EffectChainSlot() { m_effectSlots.clear(); delete m_pControlClear; - delete m_pControlNumEffects; delete m_pControlNumEffectSlots; delete m_pControlChainLoaded; delete m_pControlChainEnabled; diff --git a/src/effects/effectchainslot.h b/src/effects/effectchainslot.h index 5a44821e6d3c..573103a37464 100644 --- a/src/effects/effectchainslot.h +++ b/src/effects/effectchainslot.h @@ -145,7 +145,6 @@ class EffectChainSlot : public QObject { const QString m_group; ControlPushButton* m_pControlClear; - ControlObject* m_pControlNumEffects; ControlObject* m_pControlNumEffectSlots; ControlObject* m_pControlChainLoaded; ControlPushButton* m_pControlChainEnabled; From 1ea7c78cb8ec27d85ad7142e079fb9ae84e0f912 Mon Sep 17 00:00:00 2001 From: Be Date: Sat, 2 May 2020 12:09:13 -0500 Subject: [PATCH 150/443] remove getEffectParameterSlot from EffectsManager EffectParameterSlots should be retrieved from EffectSlots. This required cleaning up initialization of effect parameter knob and button widgets. --- res/skins/Deere/effect_parameter_button.xml | 4 + res/skins/Deere/effect_parameter_knob.xml | 4 + .../Deere/equalizer_rack_parameter_left.xml | 6 + .../Deere/equalizer_rack_parameter_right.xml | 6 + res/skins/LateNight/eq_knob_4decks.xml | 7 + res/skins/LateNight/eq_knob_left.xml | 15 +- res/skins/LateNight/eq_knob_right.xml | 16 +- res/skins/LateNight/fx_parameter_button.xml | 7 +- res/skins/LateNight/fx_parameter_knob.xml | 3 + res/skins/Shade/effect_parameter_button.xml | 111 +++++----- res/skins/Shade/effect_parameter_knob.xml | 209 +++++++++--------- res/skins/Shade/mixer_panel.xml | 36 +++ res/skins/Tango/eq_knob_left.xml | 14 +- res/skins/Tango/eq_knob_right.xml | 14 +- res/skins/Tango/fx_button.xml | 5 +- res/skins/Tango/fx_parameter_button.xml | 12 +- res/skins/Tango/fx_parameter_knob.xml | 3 + src/effects/effectslot.cpp | 2 +- src/effects/effectsmanager.cpp | 40 +--- src/effects/effectsmanager.h | 4 - src/skin/legacyskinparser.cpp | 24 -- src/widget/wdisplay.h | 2 +- src/widget/weffectbuttonparameter.cpp | 5 +- src/widget/weffectparameter.cpp | 5 +- src/widget/weffectparameterknob.cpp | 33 ++- src/widget/weffectparameterknob.h | 7 +- src/widget/weffectparameterknobcomposed.cpp | 38 ++-- src/widget/weffectparameterknobcomposed.h | 7 +- src/widget/weffectpushbutton.cpp | 41 ++-- src/widget/weffectpushbutton.h | 6 - src/widget/wknobcomposed.h | 2 +- 31 files changed, 348 insertions(+), 340 deletions(-) diff --git a/res/skins/Deere/effect_parameter_button.xml b/res/skins/Deere/effect_parameter_button.xml index 220679253bef..0a65466d64ee 100644 --- a/res/skins/Deere/effect_parameter_button.xml +++ b/res/skins/Deere/effect_parameter_button.xml @@ -9,6 +9,7 @@ EffectButtonParameter: the button parameter -->