24 , _libraryFileName(
"")
34 , _libraryFileName(
"")
48 if (_descriptor->cleanup) _descriptor->cleanup(_instance);
51 RemovePortsAndControls();
53 if (_sharedObject && (_libraryFileName!=
""))
57 std::cout<<
"[LADSPA] error unloading library handle of: "<<_libraryFileName<<std::endl;
65 if (_descriptor->activate)
66 _descriptor->activate(_instance);
71 if (_descriptor->deactivate)
72 _descriptor->deactivate(_instance);
78 _bufferSize = _inputPorts[0]->GetData().GetSize();
80 bool eachInputPortUsingSameSize=
true;
81 for(
unsigned int i=1;i<_inputPorts.size()&&eachInputPortUsingSameSize;i++)
82 eachInputPortUsingSameSize = eachInputPortUsingSameSize && (_inputPorts[i-1]->GetData().GetSize() == _inputPorts[i]->GetData().GetSize());
84 CLAM_ASSERT(eachInputPortUsingSameSize,
"Some InputPorts have not the same buffer size.");
86 for(
unsigned int i=0;i<_outputPorts.size();i++)
87 _outputPorts[i]->GetData().SetSize(_bufferSize);
89 DoUpdatePortsPointers();
90 _descriptor->run(_instance, _bufferSize);
92 for(
unsigned int i=0;i<_outputControlValues.size();i++)
95 for(
unsigned int i=0;i<_inputPorts.size();i++)
97 _inputPorts[i]->Consume();
99 for(
unsigned int i=0;i<_outputPorts.size();i++)
101 _outputPorts[i]->Produce();
112 std::string error =
"[LADSPA] can't open library: " + libraryFileName;
113 throw ErrFactory(error.c_str());
115 _descriptor =
function(index);
116 _instance = _descriptor->instantiate(_descriptor, 44100);
117 _factoryKey = factoryKey;
118 _libraryFileName=libraryFileName;
124 ConfigurePortsAndControls();
125 ConfigureControlsPointers();
128 void LadspaWrapperBuffer::RemovePortsAndControls()
130 std::vector< InPort<Audio>* >::iterator itInPort;
131 for(itInPort=_inputPorts.begin(); itInPort!=_inputPorts.end(); itInPort++)
135 std::vector< OutPort<Audio>* >::iterator itOutPort;
136 for(itOutPort=_outputPorts.begin(); itOutPort!=_outputPorts.end(); itOutPort++)
138 _outputPorts.clear();
140 std::vector< FloatInControl* >::iterator itInControl;
141 for(itInControl=_inputControls.begin(); itInControl!=_inputControls.end(); itInControl++)
143 _inputControls.clear();
145 std::vector< FloatOutControl* >::iterator itOutControl;
146 for(itOutControl=_outputControls.begin(); itOutControl!=_outputControls.end(); itOutControl++)
147 delete *itOutControl;
148 _outputControls.clear();
150 _outputControlValues.clear();
158 void LadspaWrapperBuffer::ConfigurePortsAndControls()
160 RemovePortsAndControls();
161 for(
unsigned int i=0;i<_descriptor->PortCount;i++)
163 const LADSPA_PortDescriptor portDescriptor = _descriptor->PortDescriptors[i];
165 if(LADSPA_IS_PORT_INPUT(portDescriptor) && LADSPA_IS_PORT_AUDIO(portDescriptor))
167 InPort<Audio> * port =
new InPort<Audio>(_descriptor->PortNames[i],this );
170 _inputPorts.push_back(port);
173 if(LADSPA_IS_PORT_OUTPUT(portDescriptor) && LADSPA_IS_PORT_AUDIO(portDescriptor))
175 OutPort<Audio> * port =
new OutPort<Audio>(_descriptor->PortNames[i],this );
178 _outputPorts.push_back(port);
182 if(LADSPA_IS_PORT_INPUT(portDescriptor) && LADSPA_IS_PORT_CONTROL(portDescriptor))
186 const LADSPA_PortRangeHint & hint = _descriptor->PortRangeHints[i];
188 LADSPA_IS_HINT_BOUNDED_ABOVE(hint.HintDescriptor) &&
189 LADSPA_IS_HINT_BOUNDED_BELOW(hint.HintDescriptor)
193 control->SetBounds( hint.LowerBound, hint.UpperBound );
194 control->DoControl( control->DefaultValue() );
196 _inputControls.push_back(control);
199 if (LADSPA_IS_PORT_OUTPUT(portDescriptor) && LADSPA_IS_PORT_CONTROL(portDescriptor))
202 _outputControlValues.push_back(LADSPA_Data());
203 _outputControls.push_back(control);
208 void LadspaWrapperBuffer::ConfigureControlsPointers()
210 int inControlIndex = 0;
211 int outControlIndex = 0;
212 for(
unsigned int i=0;i<_descriptor->PortCount;i++)
214 const LADSPA_PortDescriptor portDescriptor = _descriptor->PortDescriptors[i];
215 if (LADSPA_IS_PORT_CONTROL(portDescriptor))
217 if (LADSPA_IS_PORT_INPUT(portDescriptor))
219 LADSPA_Data* inControlValue =
const_cast<LADSPA_Data*
>( &(_inputControls[inControlIndex]->GetLastValue()) );
220 _descriptor->connect_port(_instance, i, inControlValue);
224 _descriptor->connect_port(_instance, i, & _outputControlValues[outControlIndex++]);
229 void LadspaWrapperBuffer::DoUpdatePortsPointers()
232 int outPortIndex = 0;
233 for(
unsigned int i=0;i<_descriptor->PortCount;i++)
235 const LADSPA_PortDescriptor portDescriptor = _descriptor->PortDescriptors[i];
236 if (!LADSPA_IS_PORT_CONTROL(portDescriptor))
238 if (LADSPA_IS_PORT_INPUT(portDescriptor))
239 _descriptor->connect_port(_instance, i, _inputPorts[inPortIndex++]->GetData().GetBuffer().GetPtr());
241 _descriptor->connect_port(_instance, i, _outputPorts[outPortIndex++]->GetData().GetBuffer().GetPtr());
248 return _factoryKey.c_str();