1 //-----------------------------------------------------
2 // name: "emptty"
3 // version: "0.01"
4 // author: "brummer"
5 // license: "BSD"
6 // copyright: "(c)brummer 2008"
7 //
8 // Code generated with Faust 0.9.9.4k-par (http://faust.grame.fr)
9 //-----------------------------------------------------
10 /* link with  */
11 #include <math.h>
12 #include <math.h>
13 #include <stdlib.h>
14 #include <string.h>
15 #include <stdio.h>
16 
17 #include <stack>
18 #include <string>
19 #include <iostream>
20 #include <map>
21 
22 #include "ladspa.h"
23 
24 
25 using namespace std;
26 
27 struct Meta : map<const char*, const char*>
28 {
declareMeta29     void declare (const char* key, const char* value) { (*this)[key]=value; }
30 };
31 
32 
33 #define max(x,y) (((x)>(y)) ? (x) : (y))
34 #define min(x,y) (((x)<(y)) ? (x) : (y))
35 
36 #define sym(name) xsym(name)
37 #define xsym(name) #name
38 
39 
40 // abs is now predefined
41 //template<typename T> T abs (T a)			{ return (a<T(0)) ? -a : a; }
42 
43 
lsr(int x,int n)44 inline int		lsr (int x, int n)			{ return int(((unsigned int)x) >> n); }
45 
int2pow2(int x)46 inline int 		int2pow2 (int x)	{ int r=0; while ((1<<r)<x) r++; return r; }
47 
48 
49 
50 /******************************************************************************
51 *******************************************************************************
52 
53 							       VECTOR INTRINSICS
54 
55 *******************************************************************************
56 *******************************************************************************/
57 
58 //inline void *aligned_calloc(size_t nmemb, size_t size) { return (void*)((unsigned)(calloc((nmemb*size)+15,sizeof(char)))+15 & 0xfffffff0); }
59 //inline void *aligned_calloc(size_t nmemb, size_t size) { return (void*)((size_t)(calloc((nmemb*size)+15,sizeof(char)))+15 & ~15); }
60 
61 
62 
63 
64 
65 
66 
67 //---------------------Abstract User Interface--------------------
68 //
69 // Abstract definitdision of a User Interface to be passed to the
70 // buildUserInterface methoddis of a Faust Signal Processor
71 //
72 //----------------------------------------------------------------
73 
74 class UI
75 {
76 	bool	fStopped;
77 public:
78 
UI()79 	UI() : fStopped(false) {}
~UI()80 	virtual ~UI() {}
81 
82 	virtual void addButton(const char* label, float* zone) = 0;
83 	virtual void addToggleButton(const char* label, float* zone) = 0;
84 	virtual void addCheckButton(const char* label, float* zone) = 0;
85 	virtual void addVerticalSlider(const char* label, float* zone, float initdis, float min, float max, float step) = 0;
86 	virtual void addVerticalSlider1(const char* label, float* zone, float initdis, float min, float max, float step) = 0;
87 	virtual void addVerticalSlider0(const char* label, float* zone, float initdis, float min, float max, float step) = 0;
88 	virtual void addHorizontalSlider(const char* label, float* zone, float initdis, float min, float max, float step) = 0;
89 	virtual void addNumEntry(const char* label, float* zone, float initdis, float min, float max, float step) = 0;
90 
91 	// -- passive widgets
92 
93 	virtual void addNumDisplay(const char* label, float* zone, int precision) = 0;
94 	virtual void addTextDisplay(const char* label, float* zone, char* names[], float min, float max) = 0;
95 	virtual void addHorizontalBargraph(const char* label, float* zone, float min, float max) = 0;
96 	virtual void addVerticalBargraph(const char* label, float* zone, float min, float max) = 0;
97 
98 	// -- frames and labels
99 
100 	virtual void openFrameBox(const char* label) = 0;
101 	virtual void openTabBox(const char* label) = 0;
102 	virtual void openHorizontalBox(const char* label) = 0;
103 	virtual void openVerticalBox(const char* label) = 0;
104 	virtual void closeBox() = 0;
105 
106 	virtual void show() = 0;
107 	virtual void run() = 0;
108 
stop()109 	void stop()		{ fStopped = true; }
stopped()110 	bool stopped() 	{ return fStopped; }
111 
declare(float * zone,const char * key,const char * value)112     virtual void declare(float* zone, const char* key, const char* value) {}
113 };
114 
115 
116 
117 //------------------Abstract Signal Processor---------------------
118 //
119 //  Abstract definitdision of a Faust Signal Processor
120 //
121 //----------------------------------------------------------------
122 
123 class dsp {
124  protected:
125 	int fSamplingFreq;
126  public:
dsp()127 	dsp() {}
~dsp()128 	virtual ~dsp() {}
129 	virtual int getNumInputs() 										= 0;
130 	virtual int getNumOutputs() 									= 0;
131 	virtual void buildUserInterface(UI* interface) 					= 0;
132 	virtual void initdis(int samplingRate) 							= 0;
133  	virtual void compute(int len, float** inputs, float** outputs) 	= 0;
134 };
135 
136 
137 //----------------------------------------------------------------------------
138 // 	FAUST generated code
139 //----------------------------------------------------------------------------
140 
141 
142 class distdsp : public dsp {
143   private:
144         float drive;
145         float overdrive4;
146 
147 	float 	fslider5;
148 	float 	fslider4;
149 	float 	fVec5[2];
150 	float 	fRec0[2];
151 	float 	fslider6;
152 	float 	fentry0;
153 	float 	fConst0;
154 	float 	fVec1[2];
155 	float 	fRec3[2];
156 	float 	fentry1;
157 	float 	fcheckbox0;
158 	float 	fslider0;
159 	int 	IOTA;
160 	float 	fVec0[4096];
161 	float 	fslider1;
162 	float 	fRec1[2];
163 
164 	float 	fConst1;
165 	float 	fConst2;
166 	float 	fVec2[2];
167 	float 	fRec2[2];
168 	float 	fslider2;
169 	float 	fslider3;
170 	float 	fVec3[2];
171 	float 	fRec7[2];
172 	float 	fVec4[2];
173 	float 	fRec6[2];
174 	float 	fRec5[3];
175 	float 	fRec4[3];
176 	float 	fcheckbox1;
177 	float 	fRec8[2];
178 	float 	fVec6[2];
179 	float 	fRec12[2];
180 	float 	fVec7[2];
181 	float 	fRec11[2];
182 	float 	fRec10[3];
183 	float 	fRec9[3];
184 	float 	fRecover0[2];
185 
186   public:
metadata(Meta * m)187 	static void metadata(Meta* m) 	{
188 		m->declare("name", "distortion");
189 		m->declare("version", "0.1");
190 		m->declare("author", "brummer");
191 		m->declare("license", "GPL");
192 	}
193 
getNumInputs()194 	virtual int getNumInputs() 	{ return 1; }
getNumOutputs()195 	virtual int getNumOutputs() 	{ return 1; }
classinitdis(int samplingFreq)196 	static void classinitdis(int samplingFreq) {
197 	}
instanceinitdis(int samplingFreq)198 	virtual void instanceinitdis(int samplingFreq) {
199 		fSamplingFreq = samplingFreq;
200 		fslider0 = 0.12f;
201 		IOTA = 0;
202 		for (int i=0; i<4096; i++) fVec0[i] = 0;
203 		fslider1 = 0.5f;
204 		for (int i=0; i<2; i++) fRec1[i] = 0;
205 		fentry0 = 5000.0f;
206 		fConst0 = (3.141593f / fSamplingFreq);
207 		for (int i=0; i<2; i++) fVec1[i] = 0;
208 		for (int i=0; i<2; i++) fRec3[i] = 0;
209 		fentry1 = 130.0f;
210 		fConst1 = (3.141593f * fSamplingFreq);
211 		fConst2 = (0.5f / fSamplingFreq);
212 		for (int i=0; i<2; i++) fVec2[i] = 0;
213 		for (int i=0; i<2; i++) fRec2[i] = 0;
214 		fcheckbox0 = 1.0;
215 		fslider2 = 5000.0f;
216 		fslider3 = 130.0f;
217 		for (int i=0; i<2; i++) fVec3[i] = 0;
218 		for (int i=0; i<2; i++) fRec7[i] = 0;
219 		for (int i=0; i<2; i++) fVec4[i] = 0;
220 		for (int i=0; i<2; i++) fRec6[i] = 0;
221 		for (int i=0; i<3; i++) fRec5[i] = 0;
222 		for (int i=0; i<3; i++) fRec4[i] = 0;
223 		fcheckbox1 = 1.0;
224 		fslider4 = 0.0f;
225 		fslider5 = 0.64f;
226 		for (int i=0; i<2; i++) fVec5[i] = 0;
227 		for (int i=0; i<2; i++) fRec0[i] = 0;
228 		fslider6 = 0.0f;
229 		for (int i=0; i<2; i++) fRec8[i] = 0;
230 		for (int i=0; i<2; i++) fVec6[i] = 0;
231 		for (int i=0; i<2; i++) fRec12[i] = 0;
232 		for (int i=0; i<2; i++) fVec7[i] = 0;
233 		for (int i=0; i<2; i++) fRec11[i] = 0;
234 		for (int i=0; i<3; i++) fRec10[i] = 0;
235 		for (int i=0; i<3; i++) fRec9[i] = 0;
236 		drive = 0.0f;
237 		overdrive4 = 0.0;
238 		for (int i=0; i<2; i++) fRecover0[i] = 0;
239 	}
initdis(int samplingFreq)240 	virtual void initdis(int samplingFreq) {
241 		classinitdis(samplingFreq);
242 		instanceinitdis(samplingFreq);
243 	}
buildUserInterface(UI * interface)244 	virtual void buildUserInterface(UI* interface) {
245 		interface->openHorizontalBox("distortion");
246                // interface->openVerticalBox("overdrive");
247                 interface->addVerticalSlider("overdrive ", &drive, 0.0f, 1.0f, 20.0f, 0.1f);
248                 interface->addToggleButton("driveover", &overdrive4);
249                // interface->closeBox();
250 		interface->addVerticalSlider("drive", &fslider5, 0.64f, 0.0f, 1.0f, 0.01f);
251 		interface->addVerticalSlider0("drivelevel", &fslider4, 0.0f, 0.0f, 1.0f, 0.01f);
252 		interface->addVerticalSlider("drivegain", &fslider6, 0.0f, -20.0f, 20.0f, 0.1f);
253 		//interface->openHorizontalBox("low/highpass");
254 		//interface->openVerticalBox("");
255 		interface->addHorizontalSlider("highpass", &fentry1, 130.0f, 8.0f, 1000.0f, 1.0f);
256 		interface->addVerticalSlider("lowpass", &fentry0, 5000.0f, 1000.0f, 10000.0f, 1.0f);
257 		//interface->closeBox();
258 		interface->addCheckButton("low_highpass", &fcheckbox0);
259 		//interface->closeBox();
260 		//interface->openHorizontalBox("low/highcut");
261 		interface->addVerticalSlider("highcut", &fslider2, 5000.0f, 1000.0f, 10000.0f, 1.0f);
262 		interface->addHorizontalSlider("lowcut", &fslider3, 130.0f, 8.0f, 1000.0f, 1.0f);
263 		interface->addCheckButton("low_highcut", &fcheckbox1);
264 		//interface->closeBox();
265 		//interface->openVerticalBox("resonanz");
266 		interface->addVerticalSlider1("trigger", &fslider0, 1.0f, 0.0f, 1.0f,0.01f);
267 		interface->addVerticalSlider1("vibrato", &fslider1, 0.5f, 0.01f, 1.0f, 0.01f);
268 		//interface->closeBox();
269 		interface->closeBox();
270 	}
compute(int count,float ** input,float ** output)271 		virtual void compute (int count, float** input, float** output) {
272 			float 	fSlow0 = (1.0f - fslider0);
273 			float 	fSlow1 = fslider1;
274 			int 	iSlow2 = int((int((fSlow1 - 1)) & 4095));
275 			int 	iSlow3 = int((int(fSlow1) & 4095));
276 			float 	fSlow4 = (1.0f / tanf((fConst0 * fentry0)));
277 			float 	fSlow5 = (fSlow4 - 1);
278 			float 	fSlow6 = (1.0f / (1 + fSlow4));
279 			float 	fSlow7 = (1.0f / tanf((fConst2 * (fConst1 - (6.283185f * fentry1)))));
280 			float 	fSlow8 = (1 + fSlow7);
281 			float 	fSlow9 = (1.0f / fSlow8);
282 			float 	fSlow10 = (0 - ((fSlow7 - 1) / fSlow8));
283 			int 	iSlow11 = int(fcheckbox0);
284 			float 	fSlow12 = tanf((fConst0 * fslider2));
285 			float 	fSlow13 = (2 * (1 - (1.0f / (fSlow12 * fSlow12))));
286 			float 	fSlow14 = (1.0f / fSlow12);
287 			float 	fSlow15 = (1 + ((fSlow14 - 0.765367f) / fSlow12));
288 			float 	fSlow16 = (1.0f / (1 + ((0.765367f + fSlow14) / fSlow12)));
289 			float 	fSlow17 = (1 + ((fSlow14 - 1.847759f) / fSlow12));
290 			float 	fSlow18 = (1.0f / (1 + ((1.847759f + fSlow14) / fSlow12)));
291 			float 	fSlow19 = (fConst0 * fslider3);
292 			float 	fSlow20 = (1.0f / (1 + fSlow19));
293 			float 	fSlow21 = (1 - fSlow19);
294 			int 	iSlow22 = int(fcheckbox1);
295 			float 	fSlow23 = fslider4;
296 	                float drivem1 = drive - 1.0f;
297 			float 	fSlow24 = powf(10.0f, (2 * fslider5));
298 			float 	fSlow25 = (9.999871e-04f * powf(10, (5.000000e-02f * (fslider6 - 10))));
299 	   		float fSlowover0 = (9.999871e-04f * powf(10, (5.000000e-02f * (drive*-0.5))));
300 			float* input0 = input[0];
301 			float* output0 = output[0];
302 			for (int i=0; i<count; i++) {
303 				float 	S0[2];
304 				float 	S1[2];
305 				float 	S2[2];
306 				float fTempi0 = input0[i];
307 				if (overdrive4 == 1.0)     // overdrive
308                 		{
309 		    			float fTempdr0 = fTempi0 ;
310 		    			float fTempdr1 = fabs(fTempdr0);
311 		    			fRecover0[0] = (fSlowover0 + (0.999000f * fRecover0[1]));
312 		    			fTempi0 = (fTempdr0*(fTempdr1 + drive)/(fTempdr0*fTempdr0 + drivem1*fTempdr1 + 1.0f))*fRecover0[0];
313 				}
314 				float fTemp0 = (fTempi0 + (fSlow0 * fRec1[1]));
315 				fVec0[IOTA&4095] = fTemp0;
316 				fRec1[0] = (0.5f * (fVec0[(IOTA-iSlow3)&4095] + fVec0[(IOTA-iSlow2)&4095]));
317 				S2[0] = fRec1[0];
318 				fVec1[0] = (fSlow6 * fRec1[0]);
319 				fRec3[0] = (fVec1[1] + (fSlow6 * (fRec1[0] + (fSlow5 * fRec3[1]))));
320 				float fTemp1 = (fSlow9 * fRec3[0]);
321 				fVec2[0] = fTemp1;
322 				fRec2[0] = ((fVec2[0] + (fSlow10 * fRec2[1])) - fVec2[1]);
323 				S2[1] = fRec2[0];
324 				float fTemp2 = S2[iSlow11];
325 				S1[0] = fTemp2;
326 				fVec3[0] = (fSlow20 * fTemp2);
327 				fRec7[0] = ((fSlow20 * (fTemp2 + (fSlow21 * fRec7[1]))) - fVec3[1]);
328 				fVec4[0] = (fSlow20 * fRec7[0]);
329 				fRec6[0] = ((fSlow20 * (fRec7[0] + (fSlow21 * fRec6[1]))) - fVec4[1]);
330 				fRec5[0] = (fRec6[0] - (fSlow18 * ((fSlow17 * fRec5[2]) + (fSlow13 * fRec5[1]))));
331 				fRec4[0] = ((fSlow18 * (fRec5[2] + (fRec5[0] + (2 * fRec5[1])))) - (fSlow16 * ((fSlow15 * fRec4[2]) + (fSlow13 * fRec4[1]))));
332 				S1[1] = (fSlow16 * (fRec4[2] + (fRec4[0] + (2 * fRec4[1]))));
333 				float fTemp3 = max(-1, min(1, (fSlow24 * (fSlow23 + S1[iSlow22]))));
334 				float fTemp4 = (fTemp3 * (1 - (0.333333f * (fTemp3 * fTemp3))));
335 				fVec5[0] = fTemp4;
336 				fRec0[0] = ((fVec5[0] + (0.995f * fRec0[1])) - fVec5[1]);
337 				fRec8[0] = (fSlow25 + (0.999f * fRec8[1]));
338 				float fTemp5 = (fRec8[0] * fRec0[0]);
339 				S0[0] = fTemp5;
340 				fVec6[0] = (fSlow20 * fTemp5);
341 				fRec12[0] = ((fSlow20 * (fTemp5 + (fSlow21 * fRec12[1]))) - fVec6[1]);
342 				fVec7[0] = (fSlow20 * fRec12[0]);
343 				fRec11[0] = ((fSlow20 * (fRec12[0] + (fSlow21 * fRec11[1]))) - fVec7[1]);
344 				fRec10[0] = (fRec11[0] - (fSlow18 * ((fSlow17 * fRec10[2]) + (fSlow13 * fRec10[1]))));
345 				fRec9[0] = ((fSlow18 * (fRec10[2] + (fRec10[0] + (2 * fRec10[1])))) - (fSlow16 * ((fSlow15 * fRec9[2]) + (fSlow13 * fRec9[1]))));
346 				S0[1] = (fSlow16 * (fRec9[2] + (fRec9[0] + (2 * fRec9[1]))));
347 				output0[i] = S0[iSlow22];
348 				// post processing
349 				fRec9[2] = fRec9[1]; fRec9[1] = fRec9[0];
350 				fRec10[2] = fRec10[1]; fRec10[1] = fRec10[0];
351 				fRec11[1] = fRec11[0];
352 				fVec7[1] = fVec7[0];
353 				fRec12[1] = fRec12[0];
354 				fVec6[1] = fVec6[0];
355 				fRec8[1] = fRec8[0];
356 				fRec0[1] = fRec0[0];
357 				fVec5[1] = fVec5[0];
358 				fRec4[2] = fRec4[1]; fRec4[1] = fRec4[0];
359 				fRec5[2] = fRec5[1]; fRec5[1] = fRec5[0];
360 				fRec6[1] = fRec6[0];
361 				fVec4[1] = fVec4[0];
362 				fRec7[1] = fRec7[0];
363 				fVec3[1] = fVec3[0];
364 				fRec2[1] = fRec2[0];
365 				fVec2[1] = fVec2[0];
366 				fRec3[1] = fRec3[0];
367 				fVec1[1] = fVec1[0];
368 				fRec1[1] = fRec1[0];
369 				fRecover0[1] = fRecover0[0];
370 				IOTA = IOTA+1;
371 			}
372 		}
373 };
374 
375 
376 
377 
378 
379 
380 
381 //-----------------------------------portCollectord--------------------------------------
382 //
383 // portCollectord is passed to the buildUserInterface methoddis of a dsp object
384 // in order to build a description of its inputs, outputs and control ports.
385 // This description is used to fill a LADSPA_Descriptor
386 //
387 //--------------------------------------------------------------------------------------
388 
389 
390 
391 //--------------------------------useful constants--------------------------------------
392 
393 #define MAXPORT 1024
394 static const int ICONTROL 	= LADSPA_PORT_INPUT|LADSPA_PORT_CONTROL;
395 static const int OCONTROL 	= LADSPA_PORT_OUTPUT|LADSPA_PORT_CONTROL;
396 static const int RANGE 		= LADSPA_PORT_INPUT|LADSPA_PORT_CONTROL;
397 
398 static const char* inames[] = {
399 					"input00", "input01", "input02", "input03", "input04",
400 					"input05", "input06", "input07", "input08", "input09",
401 					"input10", "input11", "input12", "input13", "input14",
402 					"input15", "input16", "input17", "input18", "input19",
403 					"input20", "input21", "input22", "input23", "input24",
404 					"input25", "input26", "input27", "input28", "input29",
405 					"input30", "input31", "input32", "input33", "input34",
406 					"input35", "input36", "input37", "input38", "input39"
407 };
408 
409 static const char* onames[] = {
410 					"output00", "output01", "output02", "output03", "output04",
411 					"output05", "output06", "output07", "output08", "output09",
412 					"output10", "output11", "output12", "output13", "output14",
413 					"output15", "output16", "output17", "output18", "output19",
414 					"output20", "output21", "output22", "output23", "output24",
415 					"output25", "output26", "output27", "output28", "output29",
416 					"output30", "output31", "output32", "output33", "output34",
417 					"output35", "output36", "output37", "output38", "output39"
418 };
419 
420 
421 
422 class portCollectord : public UI
423 {
424  private:
425 
426 	//--------------------------------------------------------------------------------------
427 
428 	const int				fInsCount;					// number of audio input ports
429 	const int				fOutsCount;					// number of audio output ports
430 	int						fCtrlCount;					// number of control ports
431 
432 	LADSPA_PortDescriptor 	fPortDescs[MAXPORT];		// table of port descriptors to be used in a LADSPA_Descriptor
433 	const char* 			fPortNames[MAXPORT];		// table of port names to be used in a LADSPA_Descriptor
434 	LADSPA_PortRangeHint 	fPortHints[MAXPORT];		// table of port hints to be used in a LADSPA_Descriptor
435 
436 	string					fPluginName;				// toplevel prefix used as plugin name
437 	stack<string>			fPrefix;					// current prefix for controls name
438 
439 
440 	//--------------------------------------------------------------------------------------
simplify(const string & src)441 	string simplify(const string& src)
442 	{
443 		int		i=0;
444 		int		level=2;
445 		string	dst;
446 
447 		while (src[i] ) {
448 
449 			switch (level) {
450 
451 				case 0 :
452 				case 1 :
453 				case 2 :
454 					// Skip the begin of the label "--foo-"
455 					// until 3 '-' have been read
456 					if (src[i]=='-') { level++; }
457 					break;
458 
459 				case 3 :
460 					// copy the content, but skip non alphnum
461 					// and content in parenthesis
462 					switch (src[i]) {
463 						case '(' :
464 						case '[' :
465 							level++;
466 							break;
467 
468 						case '-' :
469 							dst += '-';
470 							break;
471 
472 						default :
473 							if (isalnum(src[i])) {
474 								dst+= tolower(src[i]);
475 							}
476 
477 					}
478 					break;
479 
480 				default :
481 					// here we are inside parenthesis and
482 					// we skip the content until we are back to
483 					// level 3
484 					switch (src[i]) {
485 
486 						case '(' :
487 						case '[' :
488 							level++;
489 							break;
490 
491 						case ')' :
492 						case ']' :
493 							level--;
494 							break;
495 
496 						default :
497 							break;
498 					}
499 
500 			}
501 			i++;
502 		}
503 		return (dst.size() > 0) ? dst :src;
504 	}
505 
addPortDescrdis(int type,const char * label,int hint,float min=0.0,float max=0.0)506 	void addPortDescrdis(int type, const char* label, int hint, float min=0.0, float max=0.0)
507 	{
508 		string fullname = simplify(fPrefix.top() + "-" + label);
509 		char * str = strdup(fullname.c_str());
510 
511 		fPortDescs[fInsCount + fOutsCount + fCtrlCount] = type;
512 		fPortNames[fInsCount + fOutsCount + fCtrlCount] = str;
513 		fPortHints[fInsCount + fOutsCount + fCtrlCount].HintDescriptor = hint;
514 		fPortHints[fInsCount + fOutsCount + fCtrlCount].LowerBound = min;
515 		fPortHints[fInsCount + fOutsCount + fCtrlCount].UpperBound = max;
516 		fCtrlCount++;
517 	}
518 
openAnyBox(const char * label)519 	void openAnyBox(const char* label)
520 	{
521 		if (fPrefix.size() == 0) {
522 			// top level label is used as plugin name
523 			fPluginName = label;
524 			fPrefix.push(label);
525 
526 		} else {
527 			string s;
528 			if (label && label[0]) {
529 				s = fPrefix.top() + "-" + label;
530 			} else {
531 				s = fPrefix.top();
532 			}
533 			fPrefix.push(s);
534 		}
535 
536 	}
537 
538 
539 
540  public:
541 
542 
543 	//--------------------------------Collect the audio ports-------------------------------
544 
portCollectord(int ins,int outs)545 	portCollectord(int ins, int outs) : UI(), fInsCount(ins), fOutsCount(outs), fCtrlCount(0)
546 	{
547 		for (int i = 0; i < ins; i++) {
548 			fPortDescs[i] = LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO | LADSPA_HINT_DEFAULT_NONE;
549 			fPortNames[i] = inames[i];
550 			fPortHints[i].HintDescriptor = 0;
551 		}
552 		for (int j = 0; j < outs; j++) {
553 			fPortDescs[ins + j] = LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO | LADSPA_HINT_DEFAULT_NONE;
554 			fPortNames[ins + j] = onames[j];
555 			fPortHints[ins + j].HintDescriptor = 0;
556 		}
557 	};
558 
~portCollectord()559 	virtual ~portCollectord() {}
560 
561 
562 
563 	//------------------------------Collect the control ports-------------------------------
564 
addButton(const char * label,float * zone)565 	virtual void addButton(const char* label, float* zone) {
566 		addPortDescrdis(ICONTROL, label, LADSPA_HINT_TOGGLED);
567 	}
568 
addToggleButton(const char * label,float * zone)569 	virtual void addToggleButton(const char* label, float* zone) {
570 		addPortDescrdis(ICONTROL, label, LADSPA_HINT_TOGGLED|  LADSPA_HINT_DEFAULT_0 );
571 	}
572 
addCheckButton(const char * label,float * zone)573 	virtual void addCheckButton(const char* label, float* zone) {
574 		addPortDescrdis(ICONTROL, label, LADSPA_HINT_TOGGLED| LADSPA_HINT_DEFAULT_1 );
575 	}
576 
addVerticalSlider(const char * label,float * zone,float initdis,float min,float max,float step)577 	virtual void addVerticalSlider(const char* label, float* zone, float initdis, float min, float max, float step) {
578 		addPortDescrdis(ICONTROL, label, LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_DEFAULT_MIDDLE , min, max);
579 	}
580 
addVerticalSlider0(const char * label,float * zone,float initdis,float min,float max,float step)581 	virtual void addVerticalSlider0(const char* label, float* zone, float initdis, float min, float max, float step) {
582 		addPortDescrdis(ICONTROL, label, LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_DEFAULT_MINIMUM , min, max);
583 	}
584 
addVerticalSlider1(const char * label,float * zone,float initdis,float min,float max,float step)585 	virtual void addVerticalSlider1(const char* label, float* zone, float initdis, float min, float max, float step) {
586 		addPortDescrdis(ICONTROL, label, LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_DEFAULT_MAXIMUM, min, max);
587 	}
588 
addHorizontalSlider(const char * label,float * zone,float initdis,float min,float max,float step)589 	virtual void addHorizontalSlider(const char* label, float* zone, float initdis, float min, float max, float step) {
590 		addPortDescrdis(ICONTROL, label, LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE  | LADSPA_HINT_DEFAULT_LOW, min, max);
591 	}
592 
addNumEntry(const char * label,float * zone,float initdis,float min,float max,float step)593 	virtual void addNumEntry(const char* label, float* zone, float initdis, float min, float max, float step) {
594 		addPortDescrdis(ICONTROL, label, LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE, min, max);
595 	}
596 
597 	// -- passive widgets
598 
addNumDisplay(const char * label,float * zone,int precision)599 	virtual void addNumDisplay(const char* label, float* zone, int precision) {
600 		addPortDescrdis(OCONTROL, label, 0, -10000, +10000);
601 	}
addTextDisplay(const char * label,float * zone,char * names[],float min,float max)602 	virtual void addTextDisplay(const char* label, float* zone, char* names[], float min, float max) {
603 		addPortDescrdis(OCONTROL, label, LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE, min, max);
604 	}
addHorizontalBargraph(const char * label,float * zone,float min,float max)605 	virtual void addHorizontalBargraph(const char* label, float* zone, float min, float max) {
606 		addPortDescrdis(OCONTROL, label, LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE, min, max);
607 	}
addVerticalBargraph(const char * label,float * zone,float min,float max)608 	virtual void addVerticalBargraph(const char* label, float* zone, float min, float max){
609 		addPortDescrdis(OCONTROL, label, LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE, min, max);
610 	}
611 
openFrameBox(const char * label)612 	virtual void openFrameBox(const char* label)		{ openAnyBox(label); }
openTabBox(const char * label)613 	virtual void openTabBox(const char* label)		{ openAnyBox(label); }
openHorizontalBox(const char * label)614 	virtual void openHorizontalBox(const char* label)	{ openAnyBox(label); }
openVerticalBox(const char * label)615 	virtual void openVerticalBox(const char* label)	{ openAnyBox(label); }
616 
closeBox()617 	virtual void closeBox() 					{ fPrefix.pop(); }
618 
show()619 	virtual void show() {}
run()620 	virtual void run() 	{}
621 
622 
623 
624 	//---------------------------------Fill the LADSPA descriptor---------------------------
625 
626 	// generate an ID from a plugin name
makeID(const char * s)627 	int makeID (const char* s) {
628 		int h = 0;
629 		for (int i = 0; s[i]; i++) {
630 			h = (h << 3) + (s[i] & 7);
631 		}
632 		return 1+h%1000;
633 	}
634 
635 	// fill a ladspa descriptor with the information collected on ports
fillPortDescription(LADSPA_Descriptor * descriptor)636 	void fillPortDescription (LADSPA_Descriptor * descriptor) {
637 		const char* name = sym(distdsp);
638 		descriptor->PortCount 			= fCtrlCount+fInsCount+fOutsCount;
639 		descriptor->PortDescriptors 	= fPortDescs;
640 		descriptor->PortNames 			= fPortNames;
641 		descriptor->PortRangeHints 		= fPortHints;
642 
643 		descriptor->Label = "guitarix-distortion";
644 		descriptor->UniqueID = 4061;
645 //		descriptor->Label = strdup(fPluginName.c_str());
646 //		descriptor->UniqueID = makeID(fPluginName.c_str());
647 		descriptor->Properties = LADSPA_PROPERTY_HARD_RT_CAPABLE;
648 		descriptor->Name = name;
649 //		descriptor->Name = strdup(fPluginName.c_str());
650 		descriptor->Maker = "brummer";
651 		descriptor->Copyright = "GPL";
652 	}
653 };
654 
655 
656 
657 
658 //--------------------------------------portData----------------------------------------
659 //
660 // portData : a user interface used to associate the data buffers and the ports
661 //
662 //--------------------------------------------------------------------------------------
663 
664 
665 class portData : public UI
666 {
667 
668 
669  private:
670 
671 
672 	//--------------------------------------------------------------------------------------
673 
674 	const int				fInsCount;					// number of audio input ports
675 	const int				fOutsCount;					// number of audio output ports
676 	int						fCtrlCount;					// number of control ports
677 
678 	float* 					fPortZone[MAXPORT];			//
679 	float* 					fPortData[MAXPORT];
680 
681 
682 	//--------------------------------------------------------------------------------------
683 
addZone(float * zone)684 	void addZone(float* zone)
685 	{
686 		fPortZone[fInsCount + fOutsCount + fCtrlCount] = zone;
687 		fCtrlCount++;
688 	}
689 
690 
691 
692  public:
693 
694 
695 	//--------------------------------Collect the audio ports-------------------------------
696 
portData(int ins,int outs)697 	portData(int ins, int outs) : UI(), fInsCount(ins), fOutsCount(outs), fCtrlCount(0) {};
~portData()698 	virtual ~portData() {}
699 
700 
701 	//------------------------------Collect the control zones-------------------------------
702 
addButton(const char * label,float * zone)703 	virtual void addButton(const char* label, float* zone) 			{ addZone(zone); }
addToggleButton(const char * label,float * zone)704 	virtual void addToggleButton(const char* label, float* zone)  	{ addZone(zone); }
addCheckButton(const char * label,float * zone)705 	virtual void addCheckButton(const char* label, float* zone)  		{ addZone(zone); }
706 
707 
addVerticalSlider(const char * label,float * zone,float initdis,float min,float max,float step)708 	virtual void addVerticalSlider(const char* label, float* zone, float initdis, float min, float max, float step) 		{ addZone(zone); }
addVerticalSlider1(const char * label,float * zone,float initdis,float min,float max,float step)709 	virtual void addVerticalSlider1(const char* label, float* zone, float initdis, float min, float max, float step) 		{ addZone(zone); }
addVerticalSlider0(const char * label,float * zone,float initdis,float min,float max,float step)710 	virtual void addVerticalSlider0(const char* label, float* zone, float initdis, float min, float max, float step) 		{ addZone(zone); }
addHorizontalSlider(const char * label,float * zone,float initdis,float min,float max,float step)711 	virtual void addHorizontalSlider(const char* label, float* zone, float initdis, float min, float max, float step) 	{ addZone(zone); }
addNumEntry(const char * label,float * zone,float initdis,float min,float max,float step)712 	virtual void addNumEntry(const char* label, float* zone, float initdis, float min, float max, float step)  			{ addZone(zone); }
713 
714 	// -- passive widgets
715 
addNumDisplay(const char * label,float * zone,int precision)716 	virtual void addNumDisplay(const char* label, float* zone, int precision) 						{ addZone(zone); }
addTextDisplay(const char * label,float * zone,char * names[],float min,float max)717 	virtual void addTextDisplay(const char* label, float* zone, char* names[], float min, float max) 	{ addZone(zone); }
addHorizontalBargraph(const char * label,float * zone,float min,float max)718 	virtual void addHorizontalBargraph(const char* label, float* zone, float min, float max) 			{ addZone(zone); }
addVerticalBargraph(const char * label,float * zone,float min,float max)719 	virtual void addVerticalBargraph(const char* label, float* zone, float min, float max)			{ addZone(zone); }
720 
openFrameBox(const char * label)721 	virtual void openFrameBox(const char* label)		{ }
openTabBox(const char * label)722 	virtual void openTabBox(const char* label)		{ }
openHorizontalBox(const char * label)723 	virtual void openHorizontalBox(const char* label)	{ }
openVerticalBox(const char * label)724 	virtual void openVerticalBox(const char* label)	{ }
closeBox()725 	virtual void closeBox() 					{ }
726 
show()727 	virtual void show() {}
run()728 	virtual void run() 	{}
729 
730 
731 	//---------------------------------interaction with LADSPA------------------------------
732 
setPortData(unsigned long port,LADSPA_Data * data)733 	void setPortData (unsigned long port, LADSPA_Data* data) {
734 		fPortData[port] = data;
735 	}
736 
updateCtrlZones()737 	void updateCtrlZones() {
738 		for (int i = fInsCount+fOutsCount; i < fInsCount+fOutsCount+fCtrlCount; i++)	*fPortZone[i] = *fPortData[i];
739 	}
740 
getInputs()741 	float** getInputs() {
742 		return &fPortData[0];
743 	}
744 
getOutputs()745 	float** getOutputs() {
746 		return &fPortData[fInsCount];
747 	}
748 };
749 
750 
751 
752 
753 //--------------------------------Faust-LADSPA plugin-----------------------------------
754 //
755 // Plugin structure, callbacks and LADSPA_descriptor(i) entry point
756 //
757 //--------------------------------------------------------------------------------------
758 
759 LADSPA_Descriptor* 	gDescriptord = 0;
760 
761 struct PLUGIN
762 {
763 	unsigned long	fSampleRate;
764 	portData*		fPortData;
765 	dsp*			fDsp;
766 
PLUGINPLUGIN767 	PLUGIN(unsigned long r, portData* d, dsp* p) : fSampleRate(r), fPortData(d), fDsp(p) {}
768 };
769 
instantiate_methoddis(const struct _LADSPA_Descriptor * Descriptor,unsigned long SampleRate)770 LADSPA_Handle instantiate_methoddis (const struct _LADSPA_Descriptor * Descriptor, unsigned long SampleRate)
771 {
772 	dsp*		p = new distdsp();
773 	portData* 	d = new portData(p->getNumInputs(), p->getNumOutputs());
774 
775 	p->buildUserInterface(d);
776 	return new PLUGIN (SampleRate, d, p);
777 }
778 
connect_methoddis(LADSPA_Handle Instance,unsigned long Port,LADSPA_Data * DataLocation)779 void connect_methoddis (LADSPA_Handle Instance, unsigned long Port, LADSPA_Data * DataLocation)
780 {
781 	PLUGIN* p = (PLUGIN*) Instance;
782 	p->fPortData->setPortData(Port, DataLocation);
783 }
784 
activate_methoddis(LADSPA_Handle Instance)785 void activate_methoddis (LADSPA_Handle Instance)
786 {
787 	PLUGIN* p = (PLUGIN*) Instance;
788 	p->fDsp->initdis(p->fSampleRate);
789 }
790 
run_methoddis(LADSPA_Handle Instance,unsigned long SampleCount)791 void run_methoddis (LADSPA_Handle Instance, unsigned long SampleCount)
792 {
793 	PLUGIN* p = (PLUGIN*) Instance;
794 	p->fPortData->updateCtrlZones();
795 	p->fDsp->compute(SampleCount, p->fPortData->getInputs(), p->fPortData->getOutputs());
796 }
797 
deactivate_methoddis(LADSPA_Handle Instance)798 void deactivate_methoddis (LADSPA_Handle Instance)
799 {
800 }
801 
cleanup_methoddis(LADSPA_Handle Instance)802 void cleanup_methoddis (LADSPA_Handle Instance)
803 {
804 	PLUGIN* p = (PLUGIN*) Instance;
805 	delete p->fPortData;
806 	delete p->fDsp;
807 	delete p;
808 }
809 
810 
811 //--------------------------------------------------------------------------------------
812 
initdis_descriptor(LADSPA_Descriptor * descriptor)813 void initdis_descriptor(LADSPA_Descriptor* descriptor)
814 {
815 	descriptor->UniqueID = 4061;
816 	descriptor->Label = "distortion";
817 	descriptor->Properties = LADSPA_PROPERTY_HARD_RT_CAPABLE;
818 	descriptor->Name = "distortion";
819 	descriptor->Maker = "brummer";
820 	descriptor->Copyright = "GPL";
821 
822 	descriptor->ImplementationData = 0;
823 
824 	// description des methoddiss
825 	descriptor->instantiate = instantiate_methoddis;
826 	descriptor->connect_port = connect_methoddis;
827 	descriptor->activate = activate_methoddis;
828 	descriptor->run = run_methoddis;
829 	descriptor->run_adding = 0;
830 	descriptor->set_run_adding_gain = 0;
831 	descriptor->deactivate = deactivate_methoddis;
832 	descriptor->cleanup = cleanup_methoddis;
833 }
834 
835 
836 
837 //--------------------------------------------------------------------------------------
838 
ladspa_descriptor(unsigned long Index)839 const LADSPA_Descriptor * ladspa_descriptor(unsigned long Index)
840 {
841     if (Index == 0) {
842 		if (gDescriptord == 0)
843 		{
844 			// allocate temporaries dsp and portCollectord to build the plugin description
845 			distdsp* p = new distdsp();
846 			if (p) {
847 				portCollectord*	c=new portCollectord(p->getNumInputs(), p->getNumOutputs());
848 				p->buildUserInterface(c);
849 				gDescriptord = new LADSPA_Descriptor;
850 				initdis_descriptor(gDescriptord);
851 				c->fillPortDescription(gDescriptord);
852 				delete p;
853 			} else {
854 				printf("Memory Error : unable to allocate the dsp object\n");
855 			}
856 		}
857 		return gDescriptord;
858 	} else {
859 		return NULL;
860 	}
861 }
862 
863