1
#include "noatunarts.h"
4
#include <flowsystem.h>
5
#include <stdsynthmodule.h>
13
class StereoEffectStack_impl : public StereoEffectStack_skel, public StdSynthModule
24
list<EffectEntry *> fx;
26
void xconnect(bool connect, Object from, string fromP, Object to, string toP)
29
from._node()->connect(fromP,to._node(),toP);
31
from._node()->disconnect(fromP,to._node(),toP);
34
void xvirtualize(bool connect, string myPort, Object impl, string implPort)
37
_node()->virtualize(myPort,impl._node(),implPort);
39
_node()->devirtualize(myPort,impl._node(),implPort);
42
void internalconnect(bool c)
46
/* no effects - forward input through to output */
47
xvirtualize(c,"outleft",Object::_from_base(this->_copy()),"inleft");
48
xvirtualize(c,"outright",Object::_from_base(this->_copy()),"inright");
52
list<EffectEntry *>::iterator ei;
53
EffectEntry *laste = 0;
56
for(ei = fx.begin(); ei != fx.end(); ei++, count++)
59
if(count == 0) /* top of chain? virtualize to effect */
61
xvirtualize(c,"inleft",e->effect,"inleft");
62
xvirtualize(c,"inright",e->effect,"inright");
64
else /* not top? connect last effect to current effect */
66
xconnect(c,laste->effect,"outleft",e->effect,"inleft");
67
xconnect(c,laste->effect,"outright",e->effect,"inright");
71
/* end: virtualize effect output to our output */
72
xvirtualize(c,"outleft",laste->effect,"outleft");
73
xvirtualize(c,"outright",laste->effect,"outright");
76
void disconnect() { internalconnect(false); }
77
void reconnect() { internalconnect(true); }
80
long insertAfter(long after, StereoEffect effect, const string &name)
82
arts_return_val_if_fail(!effect.isNull(),0);
85
list<EffectEntry*>::iterator i = fx.begin();
88
// seek through until we find 'after'
102
EffectEntry *e = new EffectEntry;
110
arts_warning("StereoEffectStack::insertAfter failed. "
111
"id %d not found?", after);
118
void move(long after, long item)
120
arts_return_if_fail(item != 0);
123
list<EffectEntry*>::iterator iAfter=fx.begin();
126
while(iAfter != fx.end())
127
if((*iAfter)->id == after)
138
list<EffectEntry*>::iterator iItem=fx.begin();
139
while (iItem != fx.end())
140
if((*iItem)->id == item)
148
arts_warning("StereoEffectStack::move couldn't find items");
151
fx.insert(iAfter, *iItem);
159
vector<long> *effectList()
161
vector<long> *items=new vector<long>;
162
for (list<EffectEntry*>::iterator i=fx.begin(); i!=fx.end();i++)
163
items->push_back((*i)->id);
167
// as stolen from stereoeffectstack_impl.cc
168
StereoEffectStack_impl() : nextID(1)
173
~StereoEffectStack_impl()
175
// disconnect remaining effects
176
EffectEntry *laste = 0;
177
list<EffectEntry *>::iterator ei;
179
for(ei = fx.begin(); ei != fx.end(); ei++)
181
EffectEntry *e = *ei;
184
xconnect(false,laste->effect,"outleft",e->effect,"inleft");
185
xconnect(false,laste->effect,"outright",e->effect,"inright");
189
// delete remaining effect entries
190
for(ei = fx.begin(); ei != fx.end(); ei++)
194
long insertTop(StereoEffect effect, const string& name)
196
arts_return_val_if_fail(!effect.isNull(),0);
199
EffectEntry *e = new EffectEntry();
207
long insertBottom(StereoEffect effect, const string& name)
209
arts_return_val_if_fail(!effect.isNull(),0);
212
EffectEntry *e = new EffectEntry();
223
arts_return_if_fail(ID != 0);
227
list<EffectEntry *>::iterator ei = fx.begin();
229
while(ei != fx.end())
231
if((*ei)->id == ID) {
240
arts_warning("StereoEffectStack::remove failed. id %d not found?",
246
AutoSuspendState autoSuspend() { return asSuspend; }
250
REGISTER_IMPLEMENTATION(StereoEffectStack_impl);