1 #pragma once 2 3 #include <QObject> 4 #include <QMap> 5 #include <QList> 6 #include <QDomDocument> 7 8 #include "effects/defs.h" 9 #include "engine/channelhandle.h" 10 #include "effects/effect.h" 11 #include "util/class.h" 12 13 class EffectsManager; 14 class EngineEffectRack; 15 class EngineEffectChain; 16 class EffectChain; 17 typedef QSharedPointer<EffectChain> EffectChainPointer; 18 19 // The main-thread representation of an effect chain. This class is NOT 20 // thread-safe and must only be used from the main thread. 21 class EffectChain : public QObject { 22 Q_OBJECT 23 public: 24 EffectChain(EffectsManager* pEffectsManager, const QString& id, 25 EffectChainPointer prototype=EffectChainPointer()); 26 virtual ~EffectChain(); 27 28 void addToEngine(EngineEffectRack* pRack, int iIndex); 29 void removeFromEngine(EngineEffectRack* pRack, int iIndex); 30 void updateEngineState(); 31 32 // The ID of an EffectChain is a unique ID given to it to help associate it 33 // with the preset from which it was loaded. 34 const QString& id() const; 35 36 // Whether the chain is enabled (eligible for processing). 37 bool enabled() const; 38 void setEnabled(bool enabled); 39 40 // Activates EffectChain processing for the provided channel. 41 void enableForInputChannel(const ChannelHandleAndGroup& handle_group); 42 bool enabledForChannel(const ChannelHandleAndGroup& handle_group) const; 43 const QSet<ChannelHandleAndGroup>& enabledChannels() const; 44 void disableForInputChannel(const ChannelHandleAndGroup& handle_group); 45 46 EffectChainPointer prototype() const; 47 48 // Get the human-readable name of the EffectChain 49 const QString& name() const; 50 void setName(const QString& name); 51 52 // Get the human-readable description of the EffectChain 53 QString description() const; 54 void setDescription(const QString& description); 55 56 double mix() const; 57 void setMix(const double& dMix); 58 mixModeToString(EffectChainMixMode type)59 static QString mixModeToString(EffectChainMixMode type) { 60 switch (type) { 61 case EffectChainMixMode::DrySlashWet: 62 return "DRY/WET"; 63 case EffectChainMixMode::DryPlusWet: 64 return "DRY+WET"; 65 default: 66 return "UNKNOWN"; 67 } 68 } mixModeFromString(const QString & typeStr)69 static EffectChainMixMode mixModeFromString(const QString& typeStr) { 70 if (typeStr == "DRY/WET") { 71 return EffectChainMixMode::DrySlashWet; 72 } else if (typeStr == "DRY+WET") { 73 return EffectChainMixMode::DryPlusWet; 74 } else { 75 return EffectChainMixMode::NumMixModes; 76 } 77 } 78 79 EffectChainMixMode mixMode() const; 80 void setMixMode(EffectChainMixMode type); 81 82 void addEffect(EffectPointer pEffect); 83 void replaceEffect(unsigned int effectSlotNumber, EffectPointer pEffect); 84 void removeEffect(unsigned int effectSlotNumber); 85 void refreshAllEffects(); 86 87 const QList<EffectPointer>& effects() const; 88 unsigned int numEffects() const; 89 90 EngineEffectChain* getEngineEffectChain(); 91 92 static EffectChainPointer createFromXml(EffectsManager* pEffectsManager, 93 const QDomElement& element); 94 static EffectChainPointer clone(EffectChainPointer pChain); 95 96 signals: 97 // Signal that indicates that an effect has been added or removed. 98 void effectChanged(unsigned int effectSlotNumber); 99 void nameChanged(const QString& name); 100 void descriptionChanged(const QString& name); 101 void enabledChanged(bool enabled); 102 void mixChanged(double v); 103 void mixModeChanged(EffectChainMixMode type); 104 void channelStatusChanged(const QString& group, bool enabled); 105 106 private: debugString()107 QString debugString() const { 108 return QString("EffectChain(%1)").arg(m_id); 109 } 110 111 void sendParameterUpdate(); 112 113 EffectsManager* m_pEffectsManager; 114 EffectChainPointer m_pPrototype; 115 116 bool m_bEnabled; 117 QString m_id; 118 QString m_name; 119 QString m_description; 120 EffectChainMixMode m_mixMode; 121 double m_dMix; 122 123 QSet<ChannelHandleAndGroup> m_enabledInputChannels; 124 QList<EffectPointer> m_effects; 125 EngineEffectChain* m_pEngineEffectChain; 126 bool m_bAddedToEngine; 127 128 DISALLOW_COPY_AND_ASSIGN(EffectChain); 129 }; 130