11 class LadspaNetworkPlayer :
public NetworkPlayer
19 LADSPA_Data *dataBuffer;
24 typedef std::vector< LADSPAInfo<ControlSource> > LADSPAInControlList;
25 typedef std::vector< LADSPAInfo<ControlSink> > LADSPAOutControlList;
26 typedef std::vector<LADSPA_Data * > Buffers;
29 Buffers _sourceBuffers;
31 Buffers _inControlBuffers;
32 Buffers _outControlBuffers;
33 LADSPAInControlList mInControlList;
34 LADSPAOutControlList mOutControlList;
35 unsigned long mClamBufferSize;
36 unsigned long mExternBufferSize;
38 virtual bool IsWorking() {
return true; }
39 virtual std::string NonWorkingReason() {
return ""; }
40 virtual void Start() {}
41 virtual void Stop() {}
43 virtual bool IsRealTime()
const {
return true; }
47 LadspaNetworkPlayer(
const std::string & label,
const std::string & networkXmlContent);
48 ~LadspaNetworkPlayer();
53 void LocateConnections();
54 void UpdatePortFrameAndHopSize();
55 void FillPortInfo( LADSPA_PortDescriptor* descriptors,
char** names, LADSPA_PortRangeHint* rangehints );
56 void ConnectTo(
unsigned long port, LADSPA_Data * data);
58 void Run(
unsigned long nsamples );
59 void EstablishLadspaBuffersToAudioSources(
const unsigned long nframes);
60 void EstablishLadspaBuffersToAudioSinks(
const unsigned long nframes);
61 void ProcessInControlValues();
62 void ProcessOutControlValues();
63 static LADSPA_Descriptor * CreateLADSPADescriptor(
64 const std::string & networkXmlContent,
66 const std::string & label,
67 const std::string & name,
68 const std::string & maker,
69 const std::string & copyright
79 static LADSPA_Handle
Instantiate(
const LADSPA_Descriptor * descriptor,
unsigned long sampleRate)
82 return new CLAM::LadspaNetworkPlayer(descriptor->Label, (
const char*)descriptor->ImplementationData);
88 delete (CLAM::LadspaNetworkPlayer*) handle;
92 static void Run(LADSPA_Handle handle,
unsigned long sampleCount)
94 CLAM::LadspaNetworkPlayer *p = (CLAM::LadspaNetworkPlayer*) handle;
95 p->Run( sampleCount );
101 CLAM::LadspaNetworkPlayer *p = (CLAM::LadspaNetworkPlayer*) handle;
108 CLAM::LadspaNetworkPlayer *p = (CLAM::LadspaNetworkPlayer*) handle;
113 static void ConnectTo(LADSPA_Handle handle,
unsigned long port, LADSPA_Data * dataLocation)
116 CLAM::LadspaNetworkPlayer *p = (CLAM::LadspaNetworkPlayer*) handle;
117 p->ConnectTo( port, dataLocation );
125 LadspaNetworkPlayer::LadspaNetworkPlayer(
const std::string & name,
const std::string & networkXmlContent)
128 mExternBufferSize=mClamBufferSize;
130 std::istringstream xmlfile(networkXmlContent);
135 catch ( XmlStorageErr err)
137 std::cerr <<
"CLAM LADSPA: Error while loading CLAM network based plugin '" << name <<
"'." <<std::endl;
138 std::cerr << err.what() << std::endl;
139 std::cerr <<
"Plugin not loaded." << std::endl;
142 if (_network.HasMisconfiguredProcessings())
144 std::cerr <<
"CLAM LADSPA: Error while configuring CLAM network based plugin '" << name <<
"'." <<std::endl;
145 std::cerr << _network.GetConfigurationErrors() << std::endl;
146 std::cerr <<
"Plugin not loaded." << std::endl;
149 if (_network.HasUnconnectedInPorts())
151 std::cerr <<
"CLAM LADSPA: Error loading CLAM network based plugin '" << name <<
"'." <<std::endl;
152 std::cerr <<
"Plugin not loaded because internal network inports were unconnected." <<std::endl;
153 std::cerr << _network.GetUnconnectedInPorts() << std::flush;
160 SetNetworkBackLink(_network);
164 LadspaNetworkPlayer::~LadspaNetworkPlayer()
171 CLAM_WARNING(_network.SupportsVariableAudioSize(),
"Network don't support variable audio size");
180 void LadspaNetworkPlayer::LocateConnections()
182 CacheSourcesAndSinks();
184 CLAM_ASSERT( mInControlList.empty(),
"LadspaNetworkPlayer::LocateConnections() : there are already registered controls");
185 CLAM_ASSERT( mOutControlList.empty(),
"LadspaNetworkPlayer::LocateConnections() : there are already registered controls");
190 _sourceBuffers.resize(GetNSources());
191 _sinkBuffers.resize(GetNSinks());
193 for (Network::ControlSources::const_iterator it=controlSources.begin(); it!=controlSources.end(); it++)
195 LADSPAInfo<ControlSource> info;
196 info.name = _network.GetNetworkId(*it).c_str();
198 mInControlList.push_back(info);
200 _inControlBuffers.resize(mInControlList.size());
202 for (Network::ControlSinks::const_iterator it=controlSinks.begin(); it!=controlSinks.end(); it++)
204 LADSPAInfo<ControlSink> info;
205 info.name = _network.GetNetworkId( *it ).c_str();
206 info.processing =*it;
207 mOutControlList.push_back(info);
209 _outControlBuffers.resize(mOutControlList.size());
211 UpdatePortFrameAndHopSize();
214 void LadspaNetworkPlayer::UpdatePortFrameAndHopSize()
217 for (
unsigned i=0; i<GetNSources(); i++)
219 SetSourceFrameSize(i, mExternBufferSize);
221 for (
unsigned i=0; i<GetNSinks(); i++)
223 SetSinkFrameSize(i, mExternBufferSize);
227 void LadspaNetworkPlayer::FillPortInfo( LADSPA_PortDescriptor* descriptors,
char** names, LADSPA_PortRangeHint* rangehints )
232 for (
unsigned i=0; i<GetNSources(); i++)
234 descriptors[currentport] = (LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO);
236 rangehints[currentport].HintDescriptor = 0;
241 for (
unsigned i=0; i<GetNSinks(); i++)
243 descriptors[currentport] = (LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO);
245 rangehints[currentport].HintDescriptor = 0;
250 for (LADSPAInControlList::iterator it=mInControlList.begin(); it!=mInControlList.end(); it++)
252 descriptors[currentport] = (LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL);
256 ControlSourceConfig conf =
dynamic_cast<const ControlSourceConfig&
>(it->processing->GetConfig() );
258 rangehints[currentport].LowerBound=(LADSPA_Data)conf.GetMinValue();
259 rangehints[currentport].UpperBound=(LADSPA_Data)conf.GetMaxValue();
261 unsigned defaultHintValue=LADSPA_HINT_DEFAULT_MIDDLE;
263 if (conf.GetDefaultValue() == conf.GetMinValue() ) defaultHintValue=LADSPA_HINT_DEFAULT_MINIMUM;
264 else if (conf.GetDefaultValue() == conf.GetMaxValue() ) defaultHintValue=LADSPA_HINT_DEFAULT_MAXIMUM;
265 else if (conf.GetDefaultValue() == 0) defaultHintValue = LADSPA_HINT_DEFAULT_0;
266 else if (conf.GetDefaultValue() == 1) defaultHintValue = LADSPA_HINT_DEFAULT_1;
267 else if (conf.GetDefaultValue() == 100) defaultHintValue = LADSPA_HINT_DEFAULT_100;
268 else if (conf.GetDefaultValue() == 440) defaultHintValue = LADSPA_HINT_DEFAULT_440;
270 rangehints[currentport].HintDescriptor = (LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE | defaultHintValue);
276 for (LADSPAOutControlList::iterator it=mOutControlList.begin(); it!=mOutControlList.end(); it++)
278 descriptors[currentport] = (LADSPA_PORT_OUTPUT | LADSPA_PORT_CONTROL);
280 rangehints[currentport].LowerBound=(LADSPA_Data)0;
281 rangehints[currentport].UpperBound=(LADSPA_Data)1000;
282 rangehints[currentport].HintDescriptor = (LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE);
291 if (nsamples!=mExternBufferSize)
293 mExternBufferSize=nsamples;
296 UpdatePortFrameAndHopSize();
299 ProcessInControlValues();
301 EstablishLadspaBuffersToAudioSources(nsamples);
302 EstablishLadspaBuffersToAudioSinks(nsamples);
310 ProcessOutControlValues();
313 void LadspaNetworkPlayer::ProcessInControlValues()
315 for (LADSPAInControlList::iterator it=mInControlList.begin(); it!=mInControlList.end(); it++)
316 it->processing->Do( (
float) *(it->dataBuffer) );
319 void LadspaNetworkPlayer::ProcessOutControlValues()
321 for (LADSPAOutControlList::iterator it=mOutControlList.begin(); it!=mOutControlList.end(); it++)
322 *(it->dataBuffer)=it->processing->GetControlValue();
325 void LadspaNetworkPlayer::EstablishLadspaBuffersToAudioSources(
const unsigned long nframes)
327 for (
unsigned i=0; i<GetNSources(); i++)
328 SetSourceBuffer(i, _sourceBuffers[i], nframes);
331 void LadspaNetworkPlayer::EstablishLadspaBuffersToAudioSinks(
const unsigned long nframes)
333 for (
unsigned i=0; i<GetNSinks(); i++)
334 SetSinkBuffer(i, _sinkBuffers[i], nframes);
340 unsigned nSources = GetNSources();
341 unsigned nSinks = GetNSinks();
342 unsigned nInControls = mInControlList.size();
343 unsigned nOutControls = mInControlList.size();
345 if ( port < nSources )
347 _sourceBuffers[port]=data;
353 _sinkBuffers[port]=data;
357 if ( port < nInControls)
359 mInControlList.at( port ).dataBuffer=data;
363 if (port < nOutControls)
365 mOutControlList.at( port ).dataBuffer=data;
372 LADSPA_Descriptor * LadspaNetworkPlayer::CreateLADSPADescriptor(
373 const std::string & networkXmlContent,
375 const std::string & label,
376 const std::string & name,
377 const std::string & maker,
378 const std::string & copyright
381 CLAM::LadspaNetworkPlayer plugin(label, networkXmlContent);
383 unsigned numports = plugin.GetNSources() + plugin.GetNSinks() +
384 plugin.mInControlList.size() + plugin.mOutControlList.size();
386 if (numports == 0)
return 0;
388 LADSPA_Descriptor * descriptor =
new LADSPA_Descriptor;
390 descriptor->UniqueID = id;
392 descriptor->Properties = LADSPA_PROPERTY_HARD_RT_CAPABLE;
397 descriptor->PortCount = numports;
399 LADSPA_PortDescriptor * piPortDescriptors =
new LADSPA_PortDescriptor[ numports ];
400 descriptor->PortDescriptors = (
const LADSPA_PortDescriptor *)piPortDescriptors;
402 char ** pcPortNames =
new char*[ numports ];
404 descriptor->PortNames = (
const char **)pcPortNames;
406 LADSPA_PortRangeHint * psPortRangeHints =
new LADSPA_PortRangeHint[ numports ];
407 descriptor->PortRangeHints = (
const LADSPA_PortRangeHint *)psPortRangeHints;
409 plugin.FillPortInfo( piPortDescriptors, pcPortNames, psPortRangeHints);
414 descriptor->run =
::Run;
422 LadspaLibrary & library,
const std::string & networkXmlContent,
424 const std::string & label,
425 const std::string & name,
426 const std::string & maker,
427 const std::string & copyright
430 LADSPA_Descriptor * descriptor = LadspaNetworkPlayer::CreateLADSPADescriptor(
431 networkXmlContent,
id, label, name,
433 if (not descriptor)
return;