1 #include <stdlib.h>
2 #include <string.h>
3 #ifndef WIN32
4 #include "config.h"
5 #endif
6 
7 #ifdef ENABLE_NLS
8 #include <libintl.h>
9 #endif
10 
11 #define         _ISOC9X_SOURCE  1
12 #define         _ISOC99_SOURCE  1
13 #define         __USE_ISOC99    1
14 #define         __USE_ISOC9X    1
15 
16 #include <math.h>
17 
18 #include "ladspa.h"
19 
20 #ifdef WIN32
21 #define _WINDOWS_DLL_EXPORT_ __declspec(dllexport)
22 int bIsFirstTime = 1;
23 static void __attribute__((constructor)) swh_init(); // forward declaration
24 #else
25 #define _WINDOWS_DLL_EXPORT_
26 #endif
27 
28 #line 9 "butterworth_1902.xml"
29 
30 #include "config.h"
31 #include "util/iir.h"
32 #include "util/buffer.h"
33 
34 #define BWXOVER_IIR_CUTOFF             0
35 #define BWXOVER_IIR_RESONANCE          1
36 #define BWXOVER_IIR_INPUT              2
37 #define BWXOVER_IIR_LPOUTPUT           3
38 #define BWXOVER_IIR_HPOUTPUT           4
39 #define BUTTLOW_IIR_CUTOFF             0
40 #define BUTTLOW_IIR_RESONANCE          1
41 #define BUTTLOW_IIR_INPUT              2
42 #define BUTTLOW_IIR_OUTPUT             3
43 #define BUTTHIGH_IIR_CUTOFF            0
44 #define BUTTHIGH_IIR_RESONANCE         1
45 #define BUTTHIGH_IIR_INPUT             2
46 #define BUTTHIGH_IIR_OUTPUT            3
47 
48 static LADSPA_Descriptor *bwxover_iirDescriptor = NULL;
49 
50 typedef struct {
51 	LADSPA_Data *cutoff;
52 	LADSPA_Data *resonance;
53 	LADSPA_Data *input;
54 	LADSPA_Data *lpoutput;
55 	LADSPA_Data *hpoutput;
56 	iir_stage_t* gt;
57 	iirf_t*      iirf;
58 	long         sample_rate;
59 	LADSPA_Data run_adding_gain;
60 } Bwxover_iir;
61 
62 static LADSPA_Descriptor *buttlow_iirDescriptor = NULL;
63 
64 typedef struct {
65 	LADSPA_Data *cutoff;
66 	LADSPA_Data *resonance;
67 	LADSPA_Data *input;
68 	LADSPA_Data *output;
69 	iir_stage_t* gt;
70 	iirf_t*      iirf;
71 	long         sample_rate;
72 	LADSPA_Data run_adding_gain;
73 } Buttlow_iir;
74 
75 static LADSPA_Descriptor *butthigh_iirDescriptor = NULL;
76 
77 typedef struct {
78 	LADSPA_Data *cutoff;
79 	LADSPA_Data *resonance;
80 	LADSPA_Data *input;
81 	LADSPA_Data *output;
82 	iir_stage_t* gt;
83 	iirf_t*      iirf;
84 	long         sample_rate;
85 	LADSPA_Data run_adding_gain;
86 } Butthigh_iir;
87 
88 _WINDOWS_DLL_EXPORT_
ladspa_descriptor(unsigned long index)89 const LADSPA_Descriptor *ladspa_descriptor(unsigned long index) {
90 
91 #ifdef WIN32
92 	if (bIsFirstTime) {
93 		swh_init();
94 		bIsFirstTime = 0;
95 	}
96 #endif
97 	switch (index) {
98 	case 0:
99 		return bwxover_iirDescriptor;
100 	case 1:
101 		return buttlow_iirDescriptor;
102 	case 2:
103 		return butthigh_iirDescriptor;
104 	default:
105 		return NULL;
106 	}
107 }
108 
activateBwxover_iir(LADSPA_Handle instance)109 static void activateBwxover_iir(LADSPA_Handle instance) {
110 	Bwxover_iir *plugin_data = (Bwxover_iir *)instance;
111 	iir_stage_t*gt = plugin_data->gt;
112 	iirf_t*iirf = plugin_data->iirf;
113 	long sample_rate = plugin_data->sample_rate;
114 #line 34 "butterworth_1902.xml"
115 
116 	gt = init_iir_stage(IIR_STAGE_LOWPASS,1,3,2);
117 	iirf = init_iirf_t(gt);
118 	butterworth_stage(gt, 0, *(plugin_data->cutoff),
119 	                           *(plugin_data->resonance),
120 	                         sample_rate);
121 	plugin_data->gt = gt;
122 	plugin_data->iirf = iirf;
123 	plugin_data->sample_rate = sample_rate;
124 
125 }
126 
cleanupBwxover_iir(LADSPA_Handle instance)127 static void cleanupBwxover_iir(LADSPA_Handle instance) {
128 #line 42 "butterworth_1902.xml"
129 	Bwxover_iir *plugin_data = (Bwxover_iir *)instance;
130 	free_iirf_t(plugin_data->iirf, plugin_data->gt);
131 	free_iir_stage(plugin_data->gt);
132 	free(instance);
133 }
134 
connectPortBwxover_iir(LADSPA_Handle instance,unsigned long port,LADSPA_Data * data)135 static void connectPortBwxover_iir(
136  LADSPA_Handle instance,
137  unsigned long port,
138  LADSPA_Data *data) {
139 	Bwxover_iir *plugin;
140 
141 	plugin = (Bwxover_iir *)instance;
142 	switch (port) {
143 	case BWXOVER_IIR_CUTOFF:
144 		plugin->cutoff = data;
145 		break;
146 	case BWXOVER_IIR_RESONANCE:
147 		plugin->resonance = data;
148 		break;
149 	case BWXOVER_IIR_INPUT:
150 		plugin->input = data;
151 		break;
152 	case BWXOVER_IIR_LPOUTPUT:
153 		plugin->lpoutput = data;
154 		break;
155 	case BWXOVER_IIR_HPOUTPUT:
156 		plugin->hpoutput = data;
157 		break;
158 	}
159 }
160 
instantiateBwxover_iir(const LADSPA_Descriptor * descriptor,unsigned long s_rate)161 static LADSPA_Handle instantiateBwxover_iir(
162  const LADSPA_Descriptor *descriptor,
163  unsigned long s_rate) {
164 	Bwxover_iir *plugin_data = (Bwxover_iir *)calloc(1, sizeof(Bwxover_iir));
165 	iir_stage_t*gt = NULL;
166 	iirf_t*iirf = NULL;
167 	long sample_rate;
168 
169 #line 22 "butterworth_1902.xml"
170 	sample_rate = s_rate;
171 
172 	plugin_data->gt = gt;
173 	plugin_data->iirf = iirf;
174 	plugin_data->sample_rate = sample_rate;
175 
176 	return (LADSPA_Handle)plugin_data;
177 }
178 
179 #undef buffer_write
180 #undef RUN_ADDING
181 #undef RUN_REPLACING
182 
183 #define buffer_write(b, v) (b = v)
184 #define RUN_ADDING    0
185 #define RUN_REPLACING 1
186 
runBwxover_iir(LADSPA_Handle instance,unsigned long sample_count)187 static void runBwxover_iir(LADSPA_Handle instance, unsigned long sample_count) {
188 	Bwxover_iir *plugin_data = (Bwxover_iir *)instance;
189 	LADSPA_Data run_adding_gain = plugin_data->run_adding_gain;
190 
191 	/* Cutoff Frequency (Hz) (float value) */
192 	const LADSPA_Data cutoff = *(plugin_data->cutoff);
193 
194 	/* Resonance (float value) */
195 	const LADSPA_Data resonance = *(plugin_data->resonance);
196 
197 	/* Input (array of floats of length sample_count) */
198 	const LADSPA_Data * const input = plugin_data->input;
199 
200 	/* LP-Output (array of floats of length sample_count) */
201 	LADSPA_Data * const lpoutput = plugin_data->lpoutput;
202 
203 	/* HP-Output (array of floats of length sample_count) */
204 	LADSPA_Data * const hpoutput = plugin_data->hpoutput;
205 	iir_stage_t* gt = plugin_data->gt;
206 	iirf_t* iirf = plugin_data->iirf;
207 	long sample_rate = plugin_data->sample_rate;
208 
209 #line 25 "butterworth_1902.xml"
210 	butterworth_stage(gt, 0, cutoff, resonance, sample_rate);
211 	iir_process_buffer_1s_5(iirf, gt, input, lpoutput, sample_count,0);
212 	buffer_sub(input, lpoutput, hpoutput, sample_count);
213 
214 	// Unused variable
215 	(void)(run_adding_gain);
216 }
217 #undef buffer_write
218 #undef RUN_ADDING
219 #undef RUN_REPLACING
220 
221 #define buffer_write(b, v) (b += (v) * run_adding_gain)
222 #define RUN_ADDING    1
223 #define RUN_REPLACING 0
224 
setRunAddingGainBwxover_iir(LADSPA_Handle instance,LADSPA_Data gain)225 static void setRunAddingGainBwxover_iir(LADSPA_Handle instance, LADSPA_Data gain) {
226 	((Bwxover_iir *)instance)->run_adding_gain = gain;
227 }
228 
runAddingBwxover_iir(LADSPA_Handle instance,unsigned long sample_count)229 static void runAddingBwxover_iir(LADSPA_Handle instance, unsigned long sample_count) {
230 	Bwxover_iir *plugin_data = (Bwxover_iir *)instance;
231 	LADSPA_Data run_adding_gain = plugin_data->run_adding_gain;
232 
233 	/* Cutoff Frequency (Hz) (float value) */
234 	const LADSPA_Data cutoff = *(plugin_data->cutoff);
235 
236 	/* Resonance (float value) */
237 	const LADSPA_Data resonance = *(plugin_data->resonance);
238 
239 	/* Input (array of floats of length sample_count) */
240 	const LADSPA_Data * const input = plugin_data->input;
241 
242 	/* LP-Output (array of floats of length sample_count) */
243 	LADSPA_Data * const lpoutput = plugin_data->lpoutput;
244 
245 	/* HP-Output (array of floats of length sample_count) */
246 	LADSPA_Data * const hpoutput = plugin_data->hpoutput;
247 	iir_stage_t* gt = plugin_data->gt;
248 	iirf_t* iirf = plugin_data->iirf;
249 	long sample_rate = plugin_data->sample_rate;
250 
251 #line 25 "butterworth_1902.xml"
252 	butterworth_stage(gt, 0, cutoff, resonance, sample_rate);
253 	iir_process_buffer_1s_5(iirf, gt, input, lpoutput, sample_count,0);
254 	buffer_sub(input, lpoutput, hpoutput, sample_count);
255 
256 	// Unused variable
257 	(void)(run_adding_gain);
258 }
259 
activateButtlow_iir(LADSPA_Handle instance)260 static void activateButtlow_iir(LADSPA_Handle instance) {
261 	Buttlow_iir *plugin_data = (Buttlow_iir *)instance;
262 	iir_stage_t*gt = plugin_data->gt;
263 	iirf_t*iirf = plugin_data->iirf;
264 	long sample_rate = plugin_data->sample_rate;
265 #line 34 "butterworth_1902.xml"
266 
267 	gt = init_iir_stage(IIR_STAGE_LOWPASS,1,3,2);
268 	iirf = init_iirf_t(gt);
269 	butterworth_stage(gt, 0, *(plugin_data->cutoff),
270 	                           *(plugin_data->resonance),
271 	                         sample_rate);
272 	plugin_data->gt = gt;
273 	plugin_data->iirf = iirf;
274 	plugin_data->sample_rate = sample_rate;
275 
276 }
277 
cleanupButtlow_iir(LADSPA_Handle instance)278 static void cleanupButtlow_iir(LADSPA_Handle instance) {
279 #line 42 "butterworth_1902.xml"
280 	Buttlow_iir *plugin_data = (Buttlow_iir *)instance;
281 	free_iirf_t(plugin_data->iirf, plugin_data->gt);
282 	free_iir_stage(plugin_data->gt);
283 	free(instance);
284 }
285 
connectPortButtlow_iir(LADSPA_Handle instance,unsigned long port,LADSPA_Data * data)286 static void connectPortButtlow_iir(
287  LADSPA_Handle instance,
288  unsigned long port,
289  LADSPA_Data *data) {
290 	Buttlow_iir *plugin;
291 
292 	plugin = (Buttlow_iir *)instance;
293 	switch (port) {
294 	case BUTTLOW_IIR_CUTOFF:
295 		plugin->cutoff = data;
296 		break;
297 	case BUTTLOW_IIR_RESONANCE:
298 		plugin->resonance = data;
299 		break;
300 	case BUTTLOW_IIR_INPUT:
301 		plugin->input = data;
302 		break;
303 	case BUTTLOW_IIR_OUTPUT:
304 		plugin->output = data;
305 		break;
306 	}
307 }
308 
instantiateButtlow_iir(const LADSPA_Descriptor * descriptor,unsigned long s_rate)309 static LADSPA_Handle instantiateButtlow_iir(
310  const LADSPA_Descriptor *descriptor,
311  unsigned long s_rate) {
312 	Buttlow_iir *plugin_data = (Buttlow_iir *)calloc(1, sizeof(Buttlow_iir));
313 	iir_stage_t*gt = NULL;
314 	iirf_t*iirf = NULL;
315 	long sample_rate;
316 
317 #line 22 "butterworth_1902.xml"
318 	sample_rate = s_rate;
319 
320 	plugin_data->gt = gt;
321 	plugin_data->iirf = iirf;
322 	plugin_data->sample_rate = sample_rate;
323 
324 	return (LADSPA_Handle)plugin_data;
325 }
326 
327 #undef buffer_write
328 #undef RUN_ADDING
329 #undef RUN_REPLACING
330 
331 #define buffer_write(b, v) (b = v)
332 #define RUN_ADDING    0
333 #define RUN_REPLACING 1
334 
runButtlow_iir(LADSPA_Handle instance,unsigned long sample_count)335 static void runButtlow_iir(LADSPA_Handle instance, unsigned long sample_count) {
336 	Buttlow_iir *plugin_data = (Buttlow_iir *)instance;
337 	LADSPA_Data run_adding_gain = plugin_data->run_adding_gain;
338 
339 	/* Cutoff Frequency (Hz) (float value) */
340 	const LADSPA_Data cutoff = *(plugin_data->cutoff);
341 
342 	/* Resonance (float value) */
343 	const LADSPA_Data resonance = *(plugin_data->resonance);
344 
345 	/* Input (array of floats of length sample_count) */
346 	const LADSPA_Data * const input = plugin_data->input;
347 
348 	/* Output (array of floats of length sample_count) */
349 	LADSPA_Data * const output = plugin_data->output;
350 	iir_stage_t* gt = plugin_data->gt;
351 	iirf_t* iirf = plugin_data->iirf;
352 	long sample_rate = plugin_data->sample_rate;
353 
354 #line 25 "butterworth_1902.xml"
355 	butterworth_stage(gt, 0, cutoff, resonance, sample_rate);
356 	iir_process_buffer_1s_5(iirf, gt, input, output, sample_count,0);
357 
358 	// Unused variable
359 	(void)(run_adding_gain);
360 }
361 #undef buffer_write
362 #undef RUN_ADDING
363 #undef RUN_REPLACING
364 
365 #define buffer_write(b, v) (b += (v) * run_adding_gain)
366 #define RUN_ADDING    1
367 #define RUN_REPLACING 0
368 
setRunAddingGainButtlow_iir(LADSPA_Handle instance,LADSPA_Data gain)369 static void setRunAddingGainButtlow_iir(LADSPA_Handle instance, LADSPA_Data gain) {
370 	((Buttlow_iir *)instance)->run_adding_gain = gain;
371 }
372 
runAddingButtlow_iir(LADSPA_Handle instance,unsigned long sample_count)373 static void runAddingButtlow_iir(LADSPA_Handle instance, unsigned long sample_count) {
374 	Buttlow_iir *plugin_data = (Buttlow_iir *)instance;
375 	LADSPA_Data run_adding_gain = plugin_data->run_adding_gain;
376 
377 	/* Cutoff Frequency (Hz) (float value) */
378 	const LADSPA_Data cutoff = *(plugin_data->cutoff);
379 
380 	/* Resonance (float value) */
381 	const LADSPA_Data resonance = *(plugin_data->resonance);
382 
383 	/* Input (array of floats of length sample_count) */
384 	const LADSPA_Data * const input = plugin_data->input;
385 
386 	/* Output (array of floats of length sample_count) */
387 	LADSPA_Data * const output = plugin_data->output;
388 	iir_stage_t* gt = plugin_data->gt;
389 	iirf_t* iirf = plugin_data->iirf;
390 	long sample_rate = plugin_data->sample_rate;
391 
392 #line 25 "butterworth_1902.xml"
393 	butterworth_stage(gt, 0, cutoff, resonance, sample_rate);
394 	iir_process_buffer_1s_5(iirf, gt, input, output, sample_count,0);
395 
396 	// Unused variable
397 	(void)(run_adding_gain);
398 }
399 
activateButthigh_iir(LADSPA_Handle instance)400 static void activateButthigh_iir(LADSPA_Handle instance) {
401 	Butthigh_iir *plugin_data = (Butthigh_iir *)instance;
402 	iir_stage_t*gt = plugin_data->gt;
403 	iirf_t*iirf = plugin_data->iirf;
404 	long sample_rate = plugin_data->sample_rate;
405 #line 34 "butterworth_1902.xml"
406 
407 	gt = init_iir_stage(IIR_STAGE_LOWPASS,1,3,2);
408 	iirf = init_iirf_t(gt);
409 	butterworth_stage(gt, 1, *(plugin_data->cutoff),
410 	                           *(plugin_data->resonance),
411 	                         sample_rate);
412 	plugin_data->gt = gt;
413 	plugin_data->iirf = iirf;
414 	plugin_data->sample_rate = sample_rate;
415 
416 }
417 
cleanupButthigh_iir(LADSPA_Handle instance)418 static void cleanupButthigh_iir(LADSPA_Handle instance) {
419 #line 42 "butterworth_1902.xml"
420 	Butthigh_iir *plugin_data = (Butthigh_iir *)instance;
421 	free_iirf_t(plugin_data->iirf, plugin_data->gt);
422 	free_iir_stage(plugin_data->gt);
423 	free(instance);
424 }
425 
connectPortButthigh_iir(LADSPA_Handle instance,unsigned long port,LADSPA_Data * data)426 static void connectPortButthigh_iir(
427  LADSPA_Handle instance,
428  unsigned long port,
429  LADSPA_Data *data) {
430 	Butthigh_iir *plugin;
431 
432 	plugin = (Butthigh_iir *)instance;
433 	switch (port) {
434 	case BUTTHIGH_IIR_CUTOFF:
435 		plugin->cutoff = data;
436 		break;
437 	case BUTTHIGH_IIR_RESONANCE:
438 		plugin->resonance = data;
439 		break;
440 	case BUTTHIGH_IIR_INPUT:
441 		plugin->input = data;
442 		break;
443 	case BUTTHIGH_IIR_OUTPUT:
444 		plugin->output = data;
445 		break;
446 	}
447 }
448 
instantiateButthigh_iir(const LADSPA_Descriptor * descriptor,unsigned long s_rate)449 static LADSPA_Handle instantiateButthigh_iir(
450  const LADSPA_Descriptor *descriptor,
451  unsigned long s_rate) {
452 	Butthigh_iir *plugin_data = (Butthigh_iir *)calloc(1, sizeof(Butthigh_iir));
453 	iir_stage_t*gt = NULL;
454 	iirf_t*iirf = NULL;
455 	long sample_rate;
456 
457 #line 22 "butterworth_1902.xml"
458 	sample_rate = s_rate;
459 
460 	plugin_data->gt = gt;
461 	plugin_data->iirf = iirf;
462 	plugin_data->sample_rate = sample_rate;
463 
464 	return (LADSPA_Handle)plugin_data;
465 }
466 
467 #undef buffer_write
468 #undef RUN_ADDING
469 #undef RUN_REPLACING
470 
471 #define buffer_write(b, v) (b = v)
472 #define RUN_ADDING    0
473 #define RUN_REPLACING 1
474 
runButthigh_iir(LADSPA_Handle instance,unsigned long sample_count)475 static void runButthigh_iir(LADSPA_Handle instance, unsigned long sample_count) {
476 	Butthigh_iir *plugin_data = (Butthigh_iir *)instance;
477 	LADSPA_Data run_adding_gain = plugin_data->run_adding_gain;
478 
479 	/* Cutoff Frequency (Hz) (float value) */
480 	const LADSPA_Data cutoff = *(plugin_data->cutoff);
481 
482 	/* Resonance (float value) */
483 	const LADSPA_Data resonance = *(plugin_data->resonance);
484 
485 	/* Input (array of floats of length sample_count) */
486 	const LADSPA_Data * const input = plugin_data->input;
487 
488 	/* Output (array of floats of length sample_count) */
489 	LADSPA_Data * const output = plugin_data->output;
490 	iir_stage_t* gt = plugin_data->gt;
491 	iirf_t* iirf = plugin_data->iirf;
492 	long sample_rate = plugin_data->sample_rate;
493 
494 #line 25 "butterworth_1902.xml"
495 	butterworth_stage(gt, 1, cutoff, resonance, sample_rate);
496 	iir_process_buffer_1s_5(iirf, gt, input, output, sample_count,0);
497 
498 	// Unused variable
499 	(void)(run_adding_gain);
500 }
501 #undef buffer_write
502 #undef RUN_ADDING
503 #undef RUN_REPLACING
504 
505 #define buffer_write(b, v) (b += (v) * run_adding_gain)
506 #define RUN_ADDING    1
507 #define RUN_REPLACING 0
508 
setRunAddingGainButthigh_iir(LADSPA_Handle instance,LADSPA_Data gain)509 static void setRunAddingGainButthigh_iir(LADSPA_Handle instance, LADSPA_Data gain) {
510 	((Butthigh_iir *)instance)->run_adding_gain = gain;
511 }
512 
runAddingButthigh_iir(LADSPA_Handle instance,unsigned long sample_count)513 static void runAddingButthigh_iir(LADSPA_Handle instance, unsigned long sample_count) {
514 	Butthigh_iir *plugin_data = (Butthigh_iir *)instance;
515 	LADSPA_Data run_adding_gain = plugin_data->run_adding_gain;
516 
517 	/* Cutoff Frequency (Hz) (float value) */
518 	const LADSPA_Data cutoff = *(plugin_data->cutoff);
519 
520 	/* Resonance (float value) */
521 	const LADSPA_Data resonance = *(plugin_data->resonance);
522 
523 	/* Input (array of floats of length sample_count) */
524 	const LADSPA_Data * const input = plugin_data->input;
525 
526 	/* Output (array of floats of length sample_count) */
527 	LADSPA_Data * const output = plugin_data->output;
528 	iir_stage_t* gt = plugin_data->gt;
529 	iirf_t* iirf = plugin_data->iirf;
530 	long sample_rate = plugin_data->sample_rate;
531 
532 #line 25 "butterworth_1902.xml"
533 	butterworth_stage(gt, 1, cutoff, resonance, sample_rate);
534 	iir_process_buffer_1s_5(iirf, gt, input, output, sample_count,0);
535 
536 	// Unused variable
537 	(void)(run_adding_gain);
538 }
539 
swh_init()540 static void __attribute__((constructor)) swh_init() {
541 	char **port_names;
542 	LADSPA_PortDescriptor *port_descriptors;
543 	LADSPA_PortRangeHint *port_range_hints;
544 
545 #ifdef ENABLE_NLS
546 #define D_(s) dgettext(PACKAGE, s)
547 	bindtextdomain(PACKAGE, PACKAGE_LOCALE_DIR);
548 #else
549 #define D_(s) (s)
550 #endif
551 
552 
553 	bwxover_iirDescriptor =
554 	 (LADSPA_Descriptor *)malloc(sizeof(LADSPA_Descriptor));
555 
556 	if (bwxover_iirDescriptor) {
557 		bwxover_iirDescriptor->UniqueID = 1902;
558 		bwxover_iirDescriptor->Label = "bwxover_iir";
559 		bwxover_iirDescriptor->Properties =
560 		 LADSPA_PROPERTY_HARD_RT_CAPABLE;
561 		bwxover_iirDescriptor->Name =
562 		 D_("Glame Butterworth X-over Filter");
563 		bwxover_iirDescriptor->Maker =
564 		 "Alexander Ehlert <mag@glame.de>";
565 		bwxover_iirDescriptor->Copyright =
566 		 "GPL";
567 		bwxover_iirDescriptor->PortCount = 5;
568 
569 		port_descriptors = (LADSPA_PortDescriptor *)calloc(5,
570 		 sizeof(LADSPA_PortDescriptor));
571 		bwxover_iirDescriptor->PortDescriptors =
572 		 (const LADSPA_PortDescriptor *)port_descriptors;
573 
574 		port_range_hints = (LADSPA_PortRangeHint *)calloc(5,
575 		 sizeof(LADSPA_PortRangeHint));
576 		bwxover_iirDescriptor->PortRangeHints =
577 		 (const LADSPA_PortRangeHint *)port_range_hints;
578 
579 		port_names = (char **)calloc(5, sizeof(char*));
580 		bwxover_iirDescriptor->PortNames =
581 		 (const char **)port_names;
582 
583 		/* Parameters for Cutoff Frequency (Hz) */
584 		port_descriptors[BWXOVER_IIR_CUTOFF] =
585 		 LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL;
586 		port_names[BWXOVER_IIR_CUTOFF] =
587 		 D_("Cutoff Frequency (Hz)");
588 		port_range_hints[BWXOVER_IIR_CUTOFF].HintDescriptor =
589 		 LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_DEFAULT_LOW | LADSPA_HINT_SAMPLE_RATE | LADSPA_HINT_LOGARITHMIC;
590 		port_range_hints[BWXOVER_IIR_CUTOFF].LowerBound = 0.0001;
591 		port_range_hints[BWXOVER_IIR_CUTOFF].UpperBound = 0.45;
592 
593 		/* Parameters for Resonance */
594 		port_descriptors[BWXOVER_IIR_RESONANCE] =
595 		 LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL;
596 		port_names[BWXOVER_IIR_RESONANCE] =
597 		 D_("Resonance");
598 		port_range_hints[BWXOVER_IIR_RESONANCE].HintDescriptor =
599 		 LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_DEFAULT_MIDDLE;
600 		port_range_hints[BWXOVER_IIR_RESONANCE].LowerBound = 0.1;
601 		port_range_hints[BWXOVER_IIR_RESONANCE].UpperBound = 1.41;
602 
603 		/* Parameters for Input */
604 		port_descriptors[BWXOVER_IIR_INPUT] =
605 		 LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO;
606 		port_names[BWXOVER_IIR_INPUT] =
607 		 D_("Input");
608 		port_range_hints[BWXOVER_IIR_INPUT].HintDescriptor = 0;
609 
610 		/* Parameters for LP-Output */
611 		port_descriptors[BWXOVER_IIR_LPOUTPUT] =
612 		 LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO;
613 		port_names[BWXOVER_IIR_LPOUTPUT] =
614 		 D_("LP-Output");
615 		port_range_hints[BWXOVER_IIR_LPOUTPUT].HintDescriptor = 0;
616 
617 		/* Parameters for HP-Output */
618 		port_descriptors[BWXOVER_IIR_HPOUTPUT] =
619 		 LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO;
620 		port_names[BWXOVER_IIR_HPOUTPUT] =
621 		 D_("HP-Output");
622 		port_range_hints[BWXOVER_IIR_HPOUTPUT].HintDescriptor = 0;
623 
624 		bwxover_iirDescriptor->activate = activateBwxover_iir;
625 		bwxover_iirDescriptor->cleanup = cleanupBwxover_iir;
626 		bwxover_iirDescriptor->connect_port = connectPortBwxover_iir;
627 		bwxover_iirDescriptor->deactivate = NULL;
628 		bwxover_iirDescriptor->instantiate = instantiateBwxover_iir;
629 		bwxover_iirDescriptor->run = runBwxover_iir;
630 		bwxover_iirDescriptor->run_adding = runAddingBwxover_iir;
631 		bwxover_iirDescriptor->set_run_adding_gain = setRunAddingGainBwxover_iir;
632 	}
633 
634 	buttlow_iirDescriptor =
635 	 (LADSPA_Descriptor *)malloc(sizeof(LADSPA_Descriptor));
636 
637 	if (buttlow_iirDescriptor) {
638 		buttlow_iirDescriptor->UniqueID = 1903;
639 		buttlow_iirDescriptor->Label = "buttlow_iir";
640 		buttlow_iirDescriptor->Properties =
641 		 LADSPA_PROPERTY_HARD_RT_CAPABLE;
642 		buttlow_iirDescriptor->Name =
643 		 D_("GLAME Butterworth Lowpass");
644 		buttlow_iirDescriptor->Maker =
645 		 "Alexander Ehlert <mag@glame.de>";
646 		buttlow_iirDescriptor->Copyright =
647 		 "GPL";
648 		buttlow_iirDescriptor->PortCount = 4;
649 
650 		port_descriptors = (LADSPA_PortDescriptor *)calloc(4,
651 		 sizeof(LADSPA_PortDescriptor));
652 		buttlow_iirDescriptor->PortDescriptors =
653 		 (const LADSPA_PortDescriptor *)port_descriptors;
654 
655 		port_range_hints = (LADSPA_PortRangeHint *)calloc(4,
656 		 sizeof(LADSPA_PortRangeHint));
657 		buttlow_iirDescriptor->PortRangeHints =
658 		 (const LADSPA_PortRangeHint *)port_range_hints;
659 
660 		port_names = (char **)calloc(4, sizeof(char*));
661 		buttlow_iirDescriptor->PortNames =
662 		 (const char **)port_names;
663 
664 		/* Parameters for Cutoff Frequency (Hz) */
665 		port_descriptors[BUTTLOW_IIR_CUTOFF] =
666 		 LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL;
667 		port_names[BUTTLOW_IIR_CUTOFF] =
668 		 D_("Cutoff Frequency (Hz)");
669 		port_range_hints[BUTTLOW_IIR_CUTOFF].HintDescriptor =
670 		 LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_DEFAULT_LOW | LADSPA_HINT_SAMPLE_RATE | LADSPA_HINT_LOGARITHMIC;
671 		port_range_hints[BUTTLOW_IIR_CUTOFF].LowerBound = 0.0001;
672 		port_range_hints[BUTTLOW_IIR_CUTOFF].UpperBound = 0.45;
673 
674 		/* Parameters for Resonance */
675 		port_descriptors[BUTTLOW_IIR_RESONANCE] =
676 		 LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL;
677 		port_names[BUTTLOW_IIR_RESONANCE] =
678 		 D_("Resonance");
679 		port_range_hints[BUTTLOW_IIR_RESONANCE].HintDescriptor =
680 		 LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_DEFAULT_MIDDLE;
681 		port_range_hints[BUTTLOW_IIR_RESONANCE].LowerBound = 0.1;
682 		port_range_hints[BUTTLOW_IIR_RESONANCE].UpperBound = 1.41;
683 
684 		/* Parameters for Input */
685 		port_descriptors[BUTTLOW_IIR_INPUT] =
686 		 LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO;
687 		port_names[BUTTLOW_IIR_INPUT] =
688 		 D_("Input");
689 		port_range_hints[BUTTLOW_IIR_INPUT].HintDescriptor = 0;
690 
691 		/* Parameters for Output */
692 		port_descriptors[BUTTLOW_IIR_OUTPUT] =
693 		 LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO;
694 		port_names[BUTTLOW_IIR_OUTPUT] =
695 		 D_("Output");
696 		port_range_hints[BUTTLOW_IIR_OUTPUT].HintDescriptor = 0;
697 
698 		buttlow_iirDescriptor->activate = activateButtlow_iir;
699 		buttlow_iirDescriptor->cleanup = cleanupButtlow_iir;
700 		buttlow_iirDescriptor->connect_port = connectPortButtlow_iir;
701 		buttlow_iirDescriptor->deactivate = NULL;
702 		buttlow_iirDescriptor->instantiate = instantiateButtlow_iir;
703 		buttlow_iirDescriptor->run = runButtlow_iir;
704 		buttlow_iirDescriptor->run_adding = runAddingButtlow_iir;
705 		buttlow_iirDescriptor->set_run_adding_gain = setRunAddingGainButtlow_iir;
706 	}
707 
708 	butthigh_iirDescriptor =
709 	 (LADSPA_Descriptor *)malloc(sizeof(LADSPA_Descriptor));
710 
711 	if (butthigh_iirDescriptor) {
712 		butthigh_iirDescriptor->UniqueID = 1904;
713 		butthigh_iirDescriptor->Label = "butthigh_iir";
714 		butthigh_iirDescriptor->Properties =
715 		 LADSPA_PROPERTY_HARD_RT_CAPABLE;
716 		butthigh_iirDescriptor->Name =
717 		 D_("GLAME Butterworth Highpass");
718 		butthigh_iirDescriptor->Maker =
719 		 "Alexander Ehlert <mag@glame.de>";
720 		butthigh_iirDescriptor->Copyright =
721 		 "GPL";
722 		butthigh_iirDescriptor->PortCount = 4;
723 
724 		port_descriptors = (LADSPA_PortDescriptor *)calloc(4,
725 		 sizeof(LADSPA_PortDescriptor));
726 		butthigh_iirDescriptor->PortDescriptors =
727 		 (const LADSPA_PortDescriptor *)port_descriptors;
728 
729 		port_range_hints = (LADSPA_PortRangeHint *)calloc(4,
730 		 sizeof(LADSPA_PortRangeHint));
731 		butthigh_iirDescriptor->PortRangeHints =
732 		 (const LADSPA_PortRangeHint *)port_range_hints;
733 
734 		port_names = (char **)calloc(4, sizeof(char*));
735 		butthigh_iirDescriptor->PortNames =
736 		 (const char **)port_names;
737 
738 		/* Parameters for Cutoff Frequency (Hz) */
739 		port_descriptors[BUTTHIGH_IIR_CUTOFF] =
740 		 LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL;
741 		port_names[BUTTHIGH_IIR_CUTOFF] =
742 		 D_("Cutoff Frequency (Hz)");
743 		port_range_hints[BUTTHIGH_IIR_CUTOFF].HintDescriptor =
744 		 LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_DEFAULT_LOW | LADSPA_HINT_SAMPLE_RATE | LADSPA_HINT_LOGARITHMIC;
745 		port_range_hints[BUTTHIGH_IIR_CUTOFF].LowerBound = 0.0001;
746 		port_range_hints[BUTTHIGH_IIR_CUTOFF].UpperBound = 0.45;
747 
748 		/* Parameters for Resonance */
749 		port_descriptors[BUTTHIGH_IIR_RESONANCE] =
750 		 LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL;
751 		port_names[BUTTHIGH_IIR_RESONANCE] =
752 		 D_("Resonance");
753 		port_range_hints[BUTTHIGH_IIR_RESONANCE].HintDescriptor =
754 		 LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_DEFAULT_MIDDLE;
755 		port_range_hints[BUTTHIGH_IIR_RESONANCE].LowerBound = 0.1;
756 		port_range_hints[BUTTHIGH_IIR_RESONANCE].UpperBound = 1.41;
757 
758 		/* Parameters for Input */
759 		port_descriptors[BUTTHIGH_IIR_INPUT] =
760 		 LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO;
761 		port_names[BUTTHIGH_IIR_INPUT] =
762 		 D_("Input");
763 		port_range_hints[BUTTHIGH_IIR_INPUT].HintDescriptor = 0;
764 
765 		/* Parameters for Output */
766 		port_descriptors[BUTTHIGH_IIR_OUTPUT] =
767 		 LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO;
768 		port_names[BUTTHIGH_IIR_OUTPUT] =
769 		 D_("Output");
770 		port_range_hints[BUTTHIGH_IIR_OUTPUT].HintDescriptor = 0;
771 
772 		butthigh_iirDescriptor->activate = activateButthigh_iir;
773 		butthigh_iirDescriptor->cleanup = cleanupButthigh_iir;
774 		butthigh_iirDescriptor->connect_port = connectPortButthigh_iir;
775 		butthigh_iirDescriptor->deactivate = NULL;
776 		butthigh_iirDescriptor->instantiate = instantiateButthigh_iir;
777 		butthigh_iirDescriptor->run = runButthigh_iir;
778 		butthigh_iirDescriptor->run_adding = runAddingButthigh_iir;
779 		butthigh_iirDescriptor->set_run_adding_gain = setRunAddingGainButthigh_iir;
780 	}
781 }
782 
swh_fini()783 static void __attribute__((destructor)) swh_fini() {
784 	if (bwxover_iirDescriptor) {
785 		free((LADSPA_PortDescriptor *)bwxover_iirDescriptor->PortDescriptors);
786 		free((char **)bwxover_iirDescriptor->PortNames);
787 		free((LADSPA_PortRangeHint *)bwxover_iirDescriptor->PortRangeHints);
788 		free(bwxover_iirDescriptor);
789 	}
790 	bwxover_iirDescriptor = NULL;
791 	if (buttlow_iirDescriptor) {
792 		free((LADSPA_PortDescriptor *)buttlow_iirDescriptor->PortDescriptors);
793 		free((char **)buttlow_iirDescriptor->PortNames);
794 		free((LADSPA_PortRangeHint *)buttlow_iirDescriptor->PortRangeHints);
795 		free(buttlow_iirDescriptor);
796 	}
797 	buttlow_iirDescriptor = NULL;
798 	if (butthigh_iirDescriptor) {
799 		free((LADSPA_PortDescriptor *)butthigh_iirDescriptor->PortDescriptors);
800 		free((char **)butthigh_iirDescriptor->PortNames);
801 		free((LADSPA_PortRangeHint *)butthigh_iirDescriptor->PortRangeHints);
802 		free(butthigh_iirDescriptor);
803 	}
804 	butthigh_iirDescriptor = NULL;
805 
806 }
807