LadspaProcessingExporter.cxx
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <cstdlib>
00023 #include <cstring>
00024
00025 #include "LadspaProcessingExporter.hxx"
00026
00027
00028 extern "C"
00029 {
00030
00031 static LADSPA_Handle Instantiate(const struct _LADSPA_Descriptor * descriptor, unsigned long sampleRate)
00032 {
00033 std::string className = std::string(descriptor->Name).substr(5);
00034 CLAM::Hidden::ProcessingClass2LadspaBase * adapter =
00035 new CLAM::Hidden::ProcessingClass2LadspaBase(className);
00036 adapter->Instantiate();
00037 return adapter;
00038 }
00039
00040 static void ConnectPort(LADSPA_Handle instance, unsigned long port, LADSPA_Data * data)
00041 {
00042 CLAM::Hidden::ProcessingClass2LadspaBase * adapter = (CLAM::Hidden::ProcessingClass2LadspaBase*)instance;
00043 adapter->ConnectPort(port, data);
00044 }
00045
00046 static void Activate(LADSPA_Handle instance)
00047 {
00048 CLAM::Hidden::ProcessingClass2LadspaBase* adapter = (CLAM::Hidden::ProcessingClass2LadspaBase*)instance;
00049 adapter->Activate();
00050 }
00051
00052 static void Run(LADSPA_Handle instance, unsigned long sampleCount)
00053 {
00054 CLAM::Hidden::ProcessingClass2LadspaBase * adapter = (CLAM::Hidden::ProcessingClass2LadspaBase*)instance;
00055 adapter->Run(sampleCount);
00056 }
00057
00058 static void Deactivate(LADSPA_Handle instance)
00059 {
00060 CLAM::Hidden::ProcessingClass2LadspaBase * adapter = (CLAM::Hidden::ProcessingClass2LadspaBase*)instance;
00061 adapter->Deactivate();
00062 }
00063
00064 static void CleanUp(LADSPA_Handle instance)
00065 {
00066 CLAM::Hidden::ProcessingClass2LadspaBase * adapter = (CLAM::Hidden::ProcessingClass2LadspaBase*)instance;
00067 delete adapter;
00068 }
00069 }
00070
00071 namespace CLAM
00072 {
00073 namespace Hidden
00074 {
00075
00076 LADSPA_Descriptor * ProcessingClass2LadspaBase::CreateDescriptor(unsigned long id,
00077 const std::string & maker, const std::string & copyright)
00078 {
00079 LADSPA_Descriptor * descriptor = new LADSPA_Descriptor;
00080 std::string className = _proc->GetClassName();
00081 descriptor->UniqueID = id;
00082 descriptor->Label = LadspaLibrary::dupstr(("CLAM_"+className).c_str());
00083 descriptor->Name = LadspaLibrary::dupstr(("CLAM "+className).c_str());
00084 descriptor->Maker = LadspaLibrary::dupstr(maker.c_str());
00085 descriptor->Copyright = LadspaLibrary::dupstr(copyright.c_str());
00086 descriptor->Properties = LADSPA_PROPERTY_HARD_RT_CAPABLE;
00087 descriptor->PortCount = NPorts();
00088
00089 descriptor->instantiate = ::Instantiate;
00090 descriptor->connect_port = ::ConnectPort;
00091 descriptor->activate = ::Activate;
00092 descriptor->run = ::Run;
00093 descriptor->run_adding = 0;
00094 descriptor->set_run_adding_gain = 0;
00095 descriptor->deactivate = ::Deactivate;
00096 descriptor->cleanup = ::CleanUp;
00097
00098 SetPortsAndControls(descriptor);
00099
00100 return descriptor;
00101 }
00102
00103 void ProcessingClass2LadspaBase::SetPortsAndControls(LADSPA_Descriptor *& descriptor)
00104 {
00105 LADSPA_PortDescriptor *& portDescriptors = const_cast<LADSPA_PortDescriptor*&>(descriptor->PortDescriptors);
00106 const char **& portNames = const_cast<const char **&>(descriptor->PortNames);
00107 LADSPA_PortRangeHint *& portRangeHints = const_cast<LADSPA_PortRangeHint *&>(descriptor->PortRangeHints);
00108
00109 typedef const char * ConstCharPtr;
00110 portNames = new ConstCharPtr[NPorts()];
00111 portDescriptors = new LADSPA_PortDescriptor[NPorts()];
00112 portRangeHints = new LADSPA_PortRangeHint[NPorts()];
00113
00114 unsigned i=0;
00115 for(unsigned j=0; j<_nInControls; i++, j++)
00116 {
00117 portDescriptors[i] = LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL;
00118 portNames[i] = LadspaLibrary::dupstr(GetInControlName(j));
00119 portRangeHints[i].HintDescriptor = 0;
00120 }
00121
00122 for(unsigned j=0; j<_nOutControls; i++, j++)
00123 {
00124 portDescriptors[i] = LADSPA_PORT_OUTPUT | LADSPA_PORT_CONTROL;
00125 portNames[i] = LadspaLibrary::dupstr(GetOutControlName(j));
00126 portRangeHints[i].HintDescriptor = 0;
00127 }
00128 for(unsigned j=0; j<_nInPorts; i++, j++)
00129 {
00130 portDescriptors[i] = LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO;
00131 portNames[i] = LadspaLibrary::dupstr(GetInPortName(j));
00132 portRangeHints[i].HintDescriptor = 0;
00133 }
00134 for(unsigned j=0; j<_nOutPorts; i++, j++)
00135 {
00136 portDescriptors[i] = LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO;
00137 portNames[i] = LadspaLibrary::dupstr(GetOutPortName(j));
00138 portRangeHints[i].HintDescriptor = 0;
00139 }
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162 }
00163
00164 void ProcessingClass2LadspaBase::DoControls()
00165 {
00166 for(unsigned i=0;i<_nInControls;i++)
00167 SendFloatToInControl(*_proc, i,(CLAM::TData)*_incontrolBuffers[i]);
00168
00169 }
00170
00171 void ProcessingClass2LadspaBase::SetPortSizes(int size)
00172 {
00173 for(int i=0;i<_nInControls;i++)
00174 {
00175 if(_proc->GetInPort(i).GetSize() == size ) continue;
00176 _proc->GetInPort(i).SetSize( size );
00177 mWrappersList[i]->SetSize( size );
00178 }
00179
00180 for(int i=0;i<_nOutPorts;i++)
00181 {
00182 if(_proc->GetOutPort(i).GetSize() == size ) continue;
00183 _proc->GetOutPort(i).SetSize( size );
00184 }
00185 }
00186
00187 void ProcessingClass2LadspaBase::DoProc(unsigned long nSamples)
00188 {
00189 for(int i=0;i<_nInPorts;i++)
00190 {
00191 memcpy( &(mWrappersList[i]->GetData()), _inportBuffers[i], nSamples*sizeof(CLAM::TData) );
00192 mWrappersList[i]->Produce();
00193 }
00194
00195 std::vector<CLAM::TData*> dataList(_nOutPorts);
00196 for(int i=0;i<_nOutPorts;i++)
00197 {
00198 CLAM::OutPortBase & port = _proc->GetOutPort(i);
00199 CLAM::AudioOutPort & audioPort = dynamic_cast<CLAM::AudioOutPort&>(port);
00200 dataList[i] = &(audioPort.GetData());
00201 }
00202
00203 _proc->Do();
00204
00205 for(int i=0; i<_nOutControls; i++)
00206 memcpy(_outcontrolBuffers[i], dataList[i], nSamples*sizeof(CLAM::TData) );
00207 }
00208
00209
00210
00211 const char * ProcessingClass2LadspaBase::GetInControlName(int id) const
00212 {
00213 return _proc->GetInControl(id).GetName().c_str();
00214 }
00215 const char * ProcessingClass2LadspaBase::GetOutControlName(int id) const
00216 {
00217 return _proc->GetOutControl(id).GetName().c_str();
00218 }
00219 const char * ProcessingClass2LadspaBase::GetInPortName(int id) const
00220 {
00221 return _proc->GetInPort(id).GetName().c_str();
00222 }
00223 const char * ProcessingClass2LadspaBase::GetOutPortName(int id) const
00224 {
00225 return _proc->GetOutPort(id).GetName().c_str();
00226 }
00227
00228 }
00229 }
00230