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