22 , _libraryFileName(
"")
32 , _libraryFileName(
"")
37 LoadLibraryFunction( libraryFileName, index, key);
46 if (_descriptor->cleanup) _descriptor->cleanup(_instance);
49 RemovePortsAndControls();
51 if (_sharedObject && (_libraryFileName!=
""))
55 std::cout<<
"[LADSPA] error unloading library handle of: "<<_libraryFileName<<std::endl;
63 if (_descriptor->activate)
64 _descriptor->activate(_instance);
69 if (_descriptor->deactivate)
70 _descriptor->deactivate(_instance);
76 DoUpdatePortsPointers();
78 _descriptor->run(_instance, _bufferSize );
80 for(
unsigned int i=0;i<_outputControlValues.size();i++)
83 for(
unsigned int i=0;i<_inputPorts.size();i++)
84 _inputPorts[i]->Consume();
85 for(
unsigned int i=0;i<_outputPorts.size();i++)
86 _outputPorts[i]->Produce();
96 std::string error =
"[LADSPA] can't open library: " + libraryFileName;
97 throw ErrFactory(error.c_str());
99 _descriptor =
function(index);
100 _instance = _descriptor->instantiate(_descriptor, 44100);
101 _factoryKey = factoryKey;
102 _libraryFileName=libraryFileName;
108 ConfigurePortsAndControls();
109 ConfigureControlsPointers();
112 void LadspaWrapper::RemovePortsAndControls()
114 std::vector< AudioInPort* >::iterator itInPort;
115 for(itInPort=_inputPorts.begin(); itInPort!=_inputPorts.end(); itInPort++)
119 std::vector< AudioOutPort* >::iterator itOutPort;
120 for(itOutPort=_outputPorts.begin(); itOutPort!=_outputPorts.end(); itOutPort++)
122 _outputPorts.clear();
124 std::vector< FloatInControl* >::iterator itInControl;
125 for(itInControl=_inputControls.begin(); itInControl!=_inputControls.end(); itInControl++)
127 _inputControls.clear();
129 std::vector< FloatOutControl* >::iterator itOutControl;
130 for(itOutControl=_outputControls.begin(); itOutControl!=_outputControls.end(); itOutControl++)
131 delete *itOutControl;
132 _outputControls.clear();
134 _outputControlValues.clear();
142 void LadspaWrapper::ConfigurePortsAndControls()
144 RemovePortsAndControls();
145 for(
unsigned int i=0;i<_descriptor->PortCount;i++)
147 const LADSPA_PortDescriptor portDescriptor = _descriptor->PortDescriptors[i];
149 if(LADSPA_IS_PORT_INPUT(portDescriptor) && LADSPA_IS_PORT_AUDIO(portDescriptor))
151 AudioInPort * port =
new AudioInPort(_descriptor->PortNames[i],
this );
152 port->SetSize( _bufferSize );
153 _inputPorts.push_back(port);
156 if(LADSPA_IS_PORT_OUTPUT(portDescriptor) && LADSPA_IS_PORT_AUDIO(portDescriptor))
158 AudioOutPort * port =
new AudioOutPort(_descriptor->PortNames[i],
this );
159 port->SetSize( _bufferSize );
160 _outputPorts.push_back(port);
164 if(LADSPA_IS_PORT_INPUT(portDescriptor) && LADSPA_IS_PORT_CONTROL(portDescriptor))
168 const LADSPA_PortRangeHint & hint = _descriptor->PortRangeHints[i];
170 LADSPA_IS_HINT_BOUNDED_ABOVE(hint.HintDescriptor) &&
171 LADSPA_IS_HINT_BOUNDED_BELOW(hint.HintDescriptor)
175 control->SetBounds( hint.LowerBound, hint.UpperBound );
176 control->DoControl( control->DefaultValue() );
178 _inputControls.push_back(control);
181 if (LADSPA_IS_PORT_OUTPUT(portDescriptor) && LADSPA_IS_PORT_CONTROL(portDescriptor))
184 _outputControlValues.push_back(LADSPA_Data());
185 _outputControls.push_back(control);
190 void LadspaWrapper::ConfigureControlsPointers()
192 int inControlIndex = 0;
193 int outControlIndex = 0;
194 for(
unsigned int i=0;i<_descriptor->PortCount;i++)
196 const LADSPA_PortDescriptor portDescriptor = _descriptor->PortDescriptors[i];
197 if (LADSPA_IS_PORT_CONTROL(portDescriptor))
199 if (LADSPA_IS_PORT_INPUT(portDescriptor))
201 LADSPA_Data* inControlValue =
const_cast<LADSPA_Data*
>( &(_inputControls[inControlIndex]->GetLastValue()) );
202 _descriptor->connect_port(_instance, i, inControlValue);
206 _descriptor->connect_port(_instance, i, & _outputControlValues[outControlIndex++]);
211 void LadspaWrapper::DoUpdatePortsPointers()
214 int outPortIndex = 0;
215 for(
unsigned int i=0;i<_descriptor->PortCount;i++)
217 const LADSPA_PortDescriptor portDescriptor = _descriptor->PortDescriptors[i];
218 if (!LADSPA_IS_PORT_CONTROL(portDescriptor))
220 if (LADSPA_IS_PORT_INPUT(portDescriptor))
221 _descriptor->connect_port(_instance, i, _inputPorts[inPortIndex++]->GetAudio().GetBuffer().GetPtr());
223 _descriptor->connect_port(_instance, i, _outputPorts[outPortIndex++]->GetAudio().GetBuffer().GetPtr());
231 return _factoryKey.c_str();