1 /*                                                     -*- linux-c -*-
2     Copyright (C) 2004 Tom Szilagyi
3 
4     This program is free software; you can redistribute it and/or modify
5     it under the terms of the GNU General Public License as published by
6     the Free Software Foundation; either version 2 of the License, or
7     (at your option) any later version.
8 
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12     GNU General Public License for more details.
13 
14     You should have received a copy of the GNU General Public License
15     along with this program; if not, write to the Free Software
16     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17 
18     $Id: tap_eq.c,v 1.8 2009/08/17 11:16:19 tszilagyi Exp $
19 */
20 
21 
22 /* Please note that this plugin was inspired by and its code based
23 upon Steve Harris's "DJ EQ" plugin (no. 1901).  While I give him
24 credit for his excellent work, I reserve myself to be blamed for any
25 bugs or malfunction. */
26 
27 
28 #include <stdlib.h>
29 #include <string.h>
30 #include <math.h>
31 
32 #include "ladspa.h"
33 #include "tap_utils.h"
34 
35 /* The Unique ID of the plugin */
36 #define ID_MONO        2141
37 
38 
39 /* Bandwidth of EQ filters in octaves */
40 #define BWIDTH        1.0f
41 
42 
43 /* Port numbers */
44 
45 #define EQ_CH0G                     0
46 #define EQ_CH1G                     1
47 #define EQ_CH2G                     2
48 #define EQ_CH3G                     3
49 #define EQ_CH4G                     4
50 #define EQ_CH5G                     5
51 #define EQ_CH6G                     6
52 #define EQ_CH7G                     7
53 
54 #define EQ_CH0F                     8
55 #define EQ_CH1F                     9
56 #define EQ_CH2F                     10
57 #define EQ_CH3F                     11
58 #define EQ_CH4F                     12
59 #define EQ_CH5F                     13
60 #define EQ_CH6F                     14
61 #define EQ_CH7F                     15
62 
63 #define EQ_INPUT                    16
64 #define EQ_OUTPUT                   17
65 
66 
67 /* Total number of ports */
68 #define PORTCOUNT_MONO  18
69 
70 
71 static LADSPA_Descriptor *eqDescriptor = NULL;
72 
73 typedef struct {
74 	LADSPA_Data *ch0f;
75 	LADSPA_Data *ch0g;
76 	LADSPA_Data *ch1f;
77 	LADSPA_Data *ch1g;
78 	LADSPA_Data *ch2f;
79 	LADSPA_Data *ch2g;
80 	LADSPA_Data *ch3f;
81 	LADSPA_Data *ch3g;
82 	LADSPA_Data *ch4f;
83 	LADSPA_Data *ch4g;
84 	LADSPA_Data *ch5f;
85 	LADSPA_Data *ch5g;
86 	LADSPA_Data *ch6f;
87 	LADSPA_Data *ch6g;
88 	LADSPA_Data *ch7f;
89 	LADSPA_Data *ch7g;
90 	LADSPA_Data *input;
91 	LADSPA_Data *output;
92 	biquad *     filters;
93 	float        fs;
94 	LADSPA_Data old_ch0f;
95 	LADSPA_Data old_ch0g;
96 	LADSPA_Data old_ch1f;
97 	LADSPA_Data old_ch1g;
98 	LADSPA_Data old_ch2f;
99 	LADSPA_Data old_ch2g;
100 	LADSPA_Data old_ch3f;
101 	LADSPA_Data old_ch3g;
102 	LADSPA_Data old_ch4f;
103 	LADSPA_Data old_ch4g;
104 	LADSPA_Data old_ch5f;
105 	LADSPA_Data old_ch5g;
106 	LADSPA_Data old_ch6f;
107 	LADSPA_Data old_ch6g;
108 	LADSPA_Data old_ch7f;
109 	LADSPA_Data old_ch7g;
110 
111 	LADSPA_Data run_adding_gain;
112 } eq;
113 
114 const
115 LADSPA_Descriptor *
ladspa_descriptor(unsigned long index)116 ladspa_descriptor(unsigned long index) {
117 
118 	switch (index) {
119 	case 0:
120 		return eqDescriptor;
121 	default:
122 	        return NULL;
123 	}
124 }
125 
126 static
127 void
activate_eq(LADSPA_Handle instance)128 activate_eq(LADSPA_Handle instance) {
129 
130         eq *ptr = (eq *)instance;
131         biquad *filters = ptr->filters;
132 
133 	biquad_init(&filters[0]);
134 	biquad_init(&filters[1]);
135 	biquad_init(&filters[2]);
136 	biquad_init(&filters[3]);
137 	biquad_init(&filters[4]);
138 	biquad_init(&filters[5]);
139 	biquad_init(&filters[6]);
140 	biquad_init(&filters[7]);
141 }
142 
143 
144 
145 static
146 void
cleanup_eq(LADSPA_Handle instance)147 cleanup_eq(LADSPA_Handle instance) {
148 
149 	free(instance);
150 }
151 
152 
153 static
154 void
connectPort_eq(LADSPA_Handle instance,unsigned long port,LADSPA_Data * data)155 connectPort_eq(LADSPA_Handle instance, unsigned long port, LADSPA_Data *data) {
156 
157 	eq *plugin;
158 
159 	plugin = (eq *)instance;
160 	switch (port) {
161 	case EQ_CH0F:
162 		plugin->ch0f = data;
163 		break;
164 	case EQ_CH0G:
165 		plugin->ch0g = data;
166 		break;
167 	case EQ_CH1F:
168 		plugin->ch1f = data;
169 		break;
170 	case EQ_CH1G:
171 		plugin->ch1g = data;
172 		break;
173 	case EQ_CH2F:
174 		plugin->ch2f = data;
175 		break;
176 	case EQ_CH2G:
177 		plugin->ch2g = data;
178 		break;
179 	case EQ_CH3F:
180 		plugin->ch3f = data;
181 		break;
182 	case EQ_CH3G:
183 		plugin->ch3g = data;
184 		break;
185 	case EQ_CH4F:
186 		plugin->ch4f = data;
187 		break;
188 	case EQ_CH4G:
189 		plugin->ch4g = data;
190 		break;
191 	case EQ_CH5F:
192 		plugin->ch5f = data;
193 		break;
194 	case EQ_CH5G:
195 		plugin->ch5g = data;
196 		break;
197 	case EQ_CH6F:
198 		plugin->ch6f = data;
199 		break;
200 	case EQ_CH6G:
201 		plugin->ch6g = data;
202 		break;
203 	case EQ_CH7F:
204 		plugin->ch7f = data;
205 		break;
206 	case EQ_CH7G:
207 		plugin->ch7g = data;
208 		break;
209 	case EQ_INPUT:
210 		plugin->input = data;
211 		break;
212 	case EQ_OUTPUT:
213 		plugin->output = data;
214 		break;
215 	}
216 }
217 
218 static
219 LADSPA_Handle
instantiate_eq(const LADSPA_Descriptor * descriptor,unsigned long s_rate)220 instantiate_eq(const LADSPA_Descriptor *descriptor, unsigned long s_rate) {
221 
222 	eq *ptr = (eq *)malloc(sizeof(eq));
223 	biquad *filters = NULL;
224 	float fs;
225 
226 	fs = s_rate;
227 
228 	memset(ptr, 0, sizeof(eq));
229 
230 	filters = calloc(8, sizeof(biquad));
231 
232 	ptr->filters = filters;
233 	ptr->fs = fs;
234 	ptr->run_adding_gain = 1.0f;
235 
236 	ptr->old_ch0f = 100.0f;
237 	ptr->old_ch0g = 0;
238 
239 	ptr->old_ch1f = 200.0f;
240 	ptr->old_ch1g = 0;
241 
242 	ptr->old_ch2f = 400.0f;
243 	ptr->old_ch2g = 0;
244 
245 	ptr->old_ch3f = 1000.0f;
246 	ptr->old_ch3g = 0;
247 
248 	ptr->old_ch4f = 3000.0f;
249 	ptr->old_ch4g = 0;
250 
251 	ptr->old_ch5f = 6000.0f;
252 	ptr->old_ch5g = 0;
253 
254 	ptr->old_ch6f = 12000.0f;
255 	ptr->old_ch6g = 0;
256 
257 	ptr->old_ch7f = 15000.0f;
258 	ptr->old_ch7g = 0;
259 
260 	eq_set_params(&filters[0], 100.0f, 0.0f, BWIDTH, fs);
261 	eq_set_params(&filters[1], 200.0f, 0.0f, BWIDTH, fs);
262 	eq_set_params(&filters[2], 400.0f, 0.0f, BWIDTH, fs);
263 	eq_set_params(&filters[3], 1000.0f, 0.0f, BWIDTH, fs);
264 	eq_set_params(&filters[4], 3000.0f, 0.0f, BWIDTH, fs);
265 	eq_set_params(&filters[5], 6000.0f, 0.0f, BWIDTH, fs);
266 	eq_set_params(&filters[6], 12000.0f, 0.0f, BWIDTH, fs);
267 	eq_set_params(&filters[7], 15000.0f, 0.0f, BWIDTH, fs);
268 
269 	return (LADSPA_Handle)ptr;
270 }
271 
272 
273 static
274 void
run_eq(LADSPA_Handle instance,unsigned long sample_count)275 run_eq(LADSPA_Handle instance, unsigned long sample_count) {
276 
277 	eq * ptr = (eq *)instance;
278 
279 	const LADSPA_Data ch0f = LIMIT(*(ptr->ch0f),40.0f,280.0f);
280 	const LADSPA_Data ch0g = LIMIT(*(ptr->ch0g),-50.0f,20.0f);
281 	const LADSPA_Data ch1f = LIMIT(*(ptr->ch1f),100.0f,500.0f);
282 	const LADSPA_Data ch1g = LIMIT(*(ptr->ch1g),-50.0f,20.0f);
283 	const LADSPA_Data ch2f = LIMIT(*(ptr->ch2f),200.0f,1000.0f);
284 	const LADSPA_Data ch2g = LIMIT(*(ptr->ch2g),-50.0f,20.0f);
285 	const LADSPA_Data ch3f = LIMIT(*(ptr->ch3f),400.0f,2800.0f);
286 	const LADSPA_Data ch3g = LIMIT(*(ptr->ch3g),-50.0f,20.0f);
287 	const LADSPA_Data ch4f = LIMIT(*(ptr->ch4f),1000.0f,5000.0f);
288 	const LADSPA_Data ch4g = LIMIT(*(ptr->ch4g),-50.0f,20.0f);
289 	const LADSPA_Data ch5f = LIMIT(*(ptr->ch5f),3000.0f,9000.0f);
290 	const LADSPA_Data ch5g = LIMIT(*(ptr->ch5g),-50.0f,20.0f);
291 	const LADSPA_Data ch6f = LIMIT(*(ptr->ch6f),6000.0f,18000.0f);
292 	const LADSPA_Data ch6g = LIMIT(*(ptr->ch6g),-50.0f,20.0f);
293 	const LADSPA_Data ch7f = LIMIT(*(ptr->ch7f),10000.0f,20000.0f);
294 	const LADSPA_Data ch7g = LIMIT(*(ptr->ch7g),-50.0f,20.0f);
295 
296 	const LADSPA_Data * input = ptr->input;
297 	LADSPA_Data * output = ptr->output;
298 
299 	biquad * filters = ptr->filters;
300 	float fs = ptr->fs;
301 
302 	unsigned long pos;
303 	float samp;
304 
305 
306 	if ((ch0f != ptr->old_ch0f) ||
307 	    (ch0g != ptr->old_ch0g)) {
308 		ptr->old_ch0f = ch0f;
309 		ptr->old_ch0g = ch0g;
310 		eq_set_params(&filters[0], ch0f, ch0g, BWIDTH, fs);
311 	}
312 	if ((ch1f != ptr->old_ch1f) ||
313 	    (ch1g != ptr->old_ch1g)) {
314 		ptr->old_ch1f = ch1f;
315 		ptr->old_ch1g = ch1g;
316 		eq_set_params(&filters[1], ch1f, ch1g, BWIDTH, fs);
317 	}
318 	if ((ch2f != ptr->old_ch2f) ||
319 	    (ch2g != ptr->old_ch2g)) {
320 		ptr->old_ch2f = ch2f;
321 		ptr->old_ch2g = ch2g;
322 		eq_set_params(&filters[2], ch2f, ch2g, BWIDTH, fs);
323 	}
324 	if ((ch3f != ptr->old_ch3f) ||
325 	    (ch3g != ptr->old_ch3g)) {
326 		ptr->old_ch3f = ch3f;
327 		ptr->old_ch3g = ch3g;
328 		eq_set_params(&filters[3], ch3f, ch3g, BWIDTH, fs);
329 	}
330 	if ((ch4f != ptr->old_ch4f) ||
331 	    (ch4g != ptr->old_ch4g)) {
332 		ptr->old_ch4f = ch4f;
333 		ptr->old_ch4g = ch4g;
334 		eq_set_params(&filters[4], ch4f, ch4g, BWIDTH, fs);
335 	}
336 	if ((ch5f != ptr->old_ch5f) ||
337 	    (ch5g != ptr->old_ch5g)) {
338 		ptr->old_ch5f = ch5f;
339 		ptr->old_ch5g = ch5g;
340 		eq_set_params(&filters[5], ch5f, ch5g, BWIDTH, fs);
341 	}
342 	if ((ch6f != ptr->old_ch6f) ||
343 	    (ch6g != ptr->old_ch6g)) {
344 		ptr->old_ch6f = ch6f;
345 		ptr->old_ch6g = ch6g;
346 		eq_set_params(&filters[6], ch6f, ch6g, BWIDTH, fs);
347 	}
348 	if ((ch7f != ptr->old_ch7f) ||
349 	    (ch7g != ptr->old_ch7g)) {
350 		ptr->old_ch7f = ch7f;
351 		ptr->old_ch7g = ch7g;
352 		eq_set_params(&filters[7], ch7f, ch7g, BWIDTH, fs);
353 	}
354 
355 	for (pos = 0; pos < sample_count; pos++) {
356 		samp = input[pos];
357 		if (ch0g != 0.0f)
358 			samp = biquad_run(&filters[0], samp);
359 		if (ch1g != 0.0f)
360 			samp = biquad_run(&filters[1], samp);
361 		if (ch2g != 0.0f)
362 			samp = biquad_run(&filters[2], samp);
363 		if (ch3g != 0.0f)
364 			samp = biquad_run(&filters[3], samp);
365 		if (ch4g != 0.0f)
366 			samp = biquad_run(&filters[4], samp);
367 		if (ch5g != 0.0f)
368 			samp = biquad_run(&filters[5], samp);
369 		if (ch6g != 0.0f)
370 			samp = biquad_run(&filters[6], samp);
371 		if (ch7g != 0.0f)
372 			samp = biquad_run(&filters[7], samp);
373 		output[pos] = samp;
374 	}
375 }
376 
377 
378 
379 void
set_run_adding_gain(LADSPA_Handle instance,LADSPA_Data gain)380 set_run_adding_gain(LADSPA_Handle instance, LADSPA_Data gain) {
381 
382 	eq * ptr = (eq *)instance;
383 
384 	ptr->run_adding_gain = gain;
385 }
386 
387 
388 
389 static
390 void
run_adding_eq(LADSPA_Handle instance,unsigned long sample_count)391 run_adding_eq(LADSPA_Handle instance, unsigned long sample_count) {
392 
393 	eq * ptr = (eq *)instance;
394 
395 	const LADSPA_Data ch0f = LIMIT(*(ptr->ch0f),40.0f,280.0f);
396 	const LADSPA_Data ch0g = LIMIT(*(ptr->ch0g),-50.0f,20.0f);
397 	const LADSPA_Data ch1f = LIMIT(*(ptr->ch1f),100.0f,500.0f);
398 	const LADSPA_Data ch1g = LIMIT(*(ptr->ch1g),-50.0f,20.0f);
399 	const LADSPA_Data ch2f = LIMIT(*(ptr->ch2f),200.0f,1000.0f);
400 	const LADSPA_Data ch2g = LIMIT(*(ptr->ch2g),-50.0f,20.0f);
401 	const LADSPA_Data ch3f = LIMIT(*(ptr->ch3f),400.0f,2800.0f);
402 	const LADSPA_Data ch3g = LIMIT(*(ptr->ch3g),-50.0f,20.0f);
403 	const LADSPA_Data ch4f = LIMIT(*(ptr->ch4f),1000.0f,5000.0f);
404 	const LADSPA_Data ch4g = LIMIT(*(ptr->ch4g),-50.0f,20.0f);
405 	const LADSPA_Data ch5f = LIMIT(*(ptr->ch5f),3000.0f,9000.0f);
406 	const LADSPA_Data ch5g = LIMIT(*(ptr->ch5g),-50.0f,20.0f);
407 	const LADSPA_Data ch6f = LIMIT(*(ptr->ch6f),6000.0f,18000.0f);
408 	const LADSPA_Data ch6g = LIMIT(*(ptr->ch6g),-50.0f,20.0f);
409 	const LADSPA_Data ch7f = LIMIT(*(ptr->ch7f),10000.0f,20000.0f);
410 	const LADSPA_Data ch7g = LIMIT(*(ptr->ch7g),-50.0f,20.0f);
411 
412 	const LADSPA_Data * input = ptr->input;
413 	LADSPA_Data * output = ptr->output;
414 
415 	biquad * filters = ptr->filters;
416 	float fs = ptr->fs;
417 
418 	unsigned long pos;
419 	float samp;
420 
421 
422 	if ((ch0f != ptr->old_ch0f) ||
423 	    (ch0g != ptr->old_ch0g)) {
424 		ptr->old_ch0f = ch0f;
425 		ptr->old_ch0g = ch0g;
426 		eq_set_params(&filters[0], ch0f, ch0g, BWIDTH, fs);
427 	}
428 	if ((ch1f != ptr->old_ch1f) ||
429 	    (ch1g != ptr->old_ch1g)) {
430 		ptr->old_ch1f = ch1f;
431 		ptr->old_ch1g = ch1g;
432 		eq_set_params(&filters[1], ch1f, ch1g, BWIDTH, fs);
433 	}
434 	if ((ch2f != ptr->old_ch2f) ||
435 	    (ch2g != ptr->old_ch2g)) {
436 		ptr->old_ch2f = ch2f;
437 		ptr->old_ch2g = ch2g;
438 		eq_set_params(&filters[2], ch2f, ch2g, BWIDTH, fs);
439 	}
440 	if ((ch3f != ptr->old_ch3f) ||
441 	    (ch3g != ptr->old_ch3g)) {
442 		ptr->old_ch3f = ch3f;
443 		ptr->old_ch3g = ch3g;
444 		eq_set_params(&filters[3], ch3f, ch3g, BWIDTH, fs);
445 	}
446 	if ((ch4f != ptr->old_ch4f) ||
447 	    (ch4g != ptr->old_ch4g)) {
448 		ptr->old_ch4f = ch4f;
449 		ptr->old_ch4g = ch4g;
450 		eq_set_params(&filters[4], ch4f, ch4g, BWIDTH, fs);
451 	}
452 	if ((ch5f != ptr->old_ch5f) ||
453 	    (ch5g != ptr->old_ch5g)) {
454 		ptr->old_ch5f = ch5f;
455 		ptr->old_ch5g = ch5g;
456 		eq_set_params(&filters[5], ch5f, ch5g, BWIDTH, fs);
457 	}
458 	if ((ch6f != ptr->old_ch6f) ||
459 	    (ch6g != ptr->old_ch6g)) {
460 		ptr->old_ch6f = ch6f;
461 		ptr->old_ch6g = ch6g;
462 		eq_set_params(&filters[6], ch6f, ch6g, BWIDTH, fs);
463 	}
464 	if ((ch7f != ptr->old_ch7f) ||
465 	    (ch7g != ptr->old_ch7g)) {
466 		ptr->old_ch7f = ch7f;
467 		ptr->old_ch7g = ch7g;
468 		eq_set_params(&filters[7], ch7f, ch7g, BWIDTH, fs);
469 	}
470 
471 	for (pos = 0; pos < sample_count; pos++) {
472 		samp = input[pos];
473 		if (ch0g != 0.0f)
474 			samp = biquad_run(&filters[0], samp);
475 		if (ch1g != 0.0f)
476 			samp = biquad_run(&filters[1], samp);
477 		if (ch2g != 0.0f)
478 			samp = biquad_run(&filters[2], samp);
479 		if (ch3g != 0.0f)
480 			samp = biquad_run(&filters[3], samp);
481 		if (ch4g != 0.0f)
482 			samp = biquad_run(&filters[4], samp);
483 		if (ch5g != 0.0f)
484 			samp = biquad_run(&filters[5], samp);
485 		if (ch6g != 0.0f)
486 			samp = biquad_run(&filters[6], samp);
487 		if (ch7g != 0.0f)
488 			samp = biquad_run(&filters[7], samp);
489 		output[pos] += ptr->run_adding_gain * samp;
490 	}
491 }
492 
493 
494 
495 
496 void
_init()497 _init() {
498 
499 	char **port_names;
500 	LADSPA_PortDescriptor *port_descriptors;
501 	LADSPA_PortRangeHint *port_range_hints;
502 
503 	eqDescriptor =
504 	 (LADSPA_Descriptor *)malloc(sizeof(LADSPA_Descriptor));
505 
506 	if (eqDescriptor) {
507 		eqDescriptor->UniqueID = ID_MONO;
508 		eqDescriptor->Label = "tap_equalizer";
509 		eqDescriptor->Properties = 0;
510 		eqDescriptor->Name = "TAP Equalizer";
511 		eqDescriptor->Maker = "Tom Szilagyi";
512 		eqDescriptor->Copyright = "GPL";
513 		eqDescriptor->PortCount = PORTCOUNT_MONO;
514 
515 		port_descriptors =
516 			(LADSPA_PortDescriptor *)calloc(PORTCOUNT_MONO,
517 			 sizeof(LADSPA_PortDescriptor));
518 		eqDescriptor->PortDescriptors =
519 			(const LADSPA_PortDescriptor *)port_descriptors;
520 
521 		port_range_hints =
522 			(LADSPA_PortRangeHint *)calloc(PORTCOUNT_MONO,
523 			 sizeof(LADSPA_PortRangeHint));
524 		eqDescriptor->PortRangeHints =
525 			(const LADSPA_PortRangeHint *)port_range_hints;
526 
527 		port_names = (char **)calloc(PORTCOUNT_MONO, sizeof(char*));
528 		eqDescriptor->PortNames =
529 			(const char **)port_names;
530 
531 
532 
533 		/* Parameters for CH0 freq [Hz] */
534 		port_descriptors[EQ_CH0F] =
535 		 LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL;
536 		port_names[EQ_CH0F] =
537 		 "Band 1 Freq [Hz]";
538 		port_range_hints[EQ_CH0F].HintDescriptor =
539 			LADSPA_HINT_BOUNDED_BELOW |
540 			LADSPA_HINT_BOUNDED_ABOVE |
541 			LADSPA_HINT_DEFAULT_LOW;
542 		port_range_hints[EQ_CH0F].LowerBound = 40;
543 		port_range_hints[EQ_CH0F].UpperBound = 280;
544 		/* Parameters for CH0 gain [dB] */
545 		port_descriptors[EQ_CH0G] =
546 		 LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL;
547 		port_names[EQ_CH0G] =
548 		 "Band 1 Gain [dB]";
549 		port_range_hints[EQ_CH0G].HintDescriptor =
550 			LADSPA_HINT_BOUNDED_BELOW |
551 			LADSPA_HINT_BOUNDED_ABOVE |
552 			LADSPA_HINT_DEFAULT_0;
553 		port_range_hints[EQ_CH0G].LowerBound = -50;
554 		port_range_hints[EQ_CH0G].UpperBound = +20;
555 
556 
557 
558 
559 		/* Parameters for CH1 freq [Hz] */
560 		port_descriptors[EQ_CH1F] =
561 		 LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL;
562 		port_names[EQ_CH1F] =
563 		 "Band 2 Freq [Hz]";
564 		port_range_hints[EQ_CH1F].HintDescriptor =
565 			LADSPA_HINT_BOUNDED_BELOW |
566 			LADSPA_HINT_BOUNDED_ABOVE |
567 			LADSPA_HINT_DEFAULT_LOW;
568 		port_range_hints[EQ_CH1F].LowerBound = 100;
569 		port_range_hints[EQ_CH1F].UpperBound = 500;
570 		/* Parameters for CH1 gain [dB] */
571 		port_descriptors[EQ_CH1G] =
572 		 LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL;
573 		port_names[EQ_CH1G] =
574 		 "Band 2 Gain [dB]";
575 		port_range_hints[EQ_CH1G].HintDescriptor =
576 			LADSPA_HINT_BOUNDED_BELOW |
577 			LADSPA_HINT_BOUNDED_ABOVE |
578 			LADSPA_HINT_DEFAULT_0;
579 		port_range_hints[EQ_CH1G].LowerBound = -50;
580 		port_range_hints[EQ_CH1G].UpperBound = +20;
581 
582 
583 
584 
585 		/* Parameters for CH2 freq [Hz] */
586 		port_descriptors[EQ_CH2F] =
587 		 LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL;
588 		port_names[EQ_CH2F] =
589 		 "Band 3 Freq [Hz]";
590 		port_range_hints[EQ_CH2F].HintDescriptor =
591 			LADSPA_HINT_BOUNDED_BELOW |
592 			LADSPA_HINT_BOUNDED_ABOVE |
593 			LADSPA_HINT_DEFAULT_LOW;
594 		port_range_hints[EQ_CH2F].LowerBound = 200;
595 		port_range_hints[EQ_CH2F].UpperBound = 1000;
596 		/* Parameters for CH2 gain [dB] */
597 		port_descriptors[EQ_CH2G] =
598 		 LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL;
599 		port_names[EQ_CH2G] =
600 		 "Band 3 Gain [dB]";
601 		port_range_hints[EQ_CH2G].HintDescriptor =
602 			LADSPA_HINT_BOUNDED_BELOW |
603 			LADSPA_HINT_BOUNDED_ABOVE |
604 			LADSPA_HINT_DEFAULT_0;
605 		port_range_hints[EQ_CH2G].LowerBound = -50;
606 		port_range_hints[EQ_CH2G].UpperBound = +20;
607 
608 
609 
610 
611 		/* Parameters for CH3 freq [Hz] */
612 		port_descriptors[EQ_CH3F] =
613 		 LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL;
614 		port_names[EQ_CH3F] =
615 		 "Band 4 Freq [Hz]";
616 		port_range_hints[EQ_CH3F].HintDescriptor =
617 			LADSPA_HINT_BOUNDED_BELOW |
618 			LADSPA_HINT_BOUNDED_ABOVE |
619 			LADSPA_HINT_DEFAULT_LOW;
620 		port_range_hints[EQ_CH3F].LowerBound = 400;
621 		port_range_hints[EQ_CH3F].UpperBound = 2800;
622 		/* Parameters for CH3 gain [dB] */
623 		port_descriptors[EQ_CH3G] =
624 		 LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL;
625 		port_names[EQ_CH3G] =
626 		 "Band 4 Gain [dB]";
627 		port_range_hints[EQ_CH3G].HintDescriptor =
628 			LADSPA_HINT_BOUNDED_BELOW |
629 			LADSPA_HINT_BOUNDED_ABOVE |
630 			LADSPA_HINT_DEFAULT_0;
631 		port_range_hints[EQ_CH3G].LowerBound = -50;
632 		port_range_hints[EQ_CH3G].UpperBound = +20;
633 
634 
635 
636 
637 		/* Parameters for CH4 freq [Hz] */
638 		port_descriptors[EQ_CH4F] =
639 		 LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL;
640 		port_names[EQ_CH4F] =
641 		 "Band 5 Freq [Hz]";
642 		port_range_hints[EQ_CH4F].HintDescriptor =
643 			LADSPA_HINT_BOUNDED_BELOW |
644 			LADSPA_HINT_BOUNDED_ABOVE |
645 			LADSPA_HINT_DEFAULT_MIDDLE;
646 		port_range_hints[EQ_CH4F].LowerBound = 1000;
647 		port_range_hints[EQ_CH4F].UpperBound = 5000;
648 		/* Parameters for CH4 gain [dB] */
649 		port_descriptors[EQ_CH4G] =
650 		 LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL;
651 		port_names[EQ_CH4G] =
652 		 "Band 5 Gain [dB]";
653 		port_range_hints[EQ_CH4G].HintDescriptor =
654 			LADSPA_HINT_BOUNDED_BELOW |
655 			LADSPA_HINT_BOUNDED_ABOVE |
656 			LADSPA_HINT_DEFAULT_0;
657 		port_range_hints[EQ_CH4G].LowerBound = -50;
658 		port_range_hints[EQ_CH4G].UpperBound = +20;
659 
660 
661 
662 
663 		/* Parameters for CH5 freq [Hz] */
664 		port_descriptors[EQ_CH5F] =
665 		 LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL;
666 		port_names[EQ_CH5F] =
667 		 "Band 6 Freq [Hz]";
668 		port_range_hints[EQ_CH5F].HintDescriptor =
669 			LADSPA_HINT_BOUNDED_BELOW |
670 			LADSPA_HINT_BOUNDED_ABOVE |
671 			LADSPA_HINT_DEFAULT_MIDDLE;
672 		port_range_hints[EQ_CH5F].LowerBound = 3000;
673 		port_range_hints[EQ_CH5F].UpperBound = 9000;
674 		/* Parameters for CH5 gain [dB] */
675 		port_descriptors[EQ_CH5G] =
676 		 LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL;
677 		port_names[EQ_CH5G] =
678 		 "Band 6 Gain [dB]";
679 		port_range_hints[EQ_CH5G].HintDescriptor =
680 			LADSPA_HINT_BOUNDED_BELOW |
681 			LADSPA_HINT_BOUNDED_ABOVE |
682 			LADSPA_HINT_DEFAULT_0;
683 		port_range_hints[EQ_CH5G].LowerBound = -50;
684 		port_range_hints[EQ_CH5G].UpperBound = +20;
685 
686 
687 
688 
689 		/* Parameters for CH6 freq [Hz] */
690 		port_descriptors[EQ_CH6F] =
691 		 LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL;
692 		port_names[EQ_CH6F] =
693 		 "Band 7 Freq [Hz]";
694 		port_range_hints[EQ_CH6F].HintDescriptor =
695 			LADSPA_HINT_BOUNDED_BELOW |
696 			LADSPA_HINT_BOUNDED_ABOVE |
697 			LADSPA_HINT_DEFAULT_MIDDLE;
698 		port_range_hints[EQ_CH6F].LowerBound = 6000;
699 		port_range_hints[EQ_CH6F].UpperBound = 18000;
700 		/* Parameters for CH6 gain [dB] */
701 		port_descriptors[EQ_CH6G] =
702 		 LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL;
703 		port_names[EQ_CH6G] =
704 		 "Band 7 Gain [dB]";
705 		port_range_hints[EQ_CH6G].HintDescriptor =
706 			LADSPA_HINT_BOUNDED_BELOW |
707 			LADSPA_HINT_BOUNDED_ABOVE |
708 			LADSPA_HINT_DEFAULT_0;
709 		port_range_hints[EQ_CH6G].LowerBound = -50;
710 		port_range_hints[EQ_CH6G].UpperBound = +20;
711 
712 
713 
714 
715 		/* Parameters for CH7 freq [Hz] */
716 		port_descriptors[EQ_CH7F] =
717 		 LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL;
718 		port_names[EQ_CH7F] =
719 		 "Band 8 Freq [Hz]";
720 		port_range_hints[EQ_CH7F].HintDescriptor =
721 			LADSPA_HINT_BOUNDED_BELOW |
722 			LADSPA_HINT_BOUNDED_ABOVE |
723 			LADSPA_HINT_DEFAULT_MIDDLE;
724 		port_range_hints[EQ_CH7F].LowerBound = 10000;
725 		port_range_hints[EQ_CH7F].UpperBound = 20000;
726 		/* Parameters for CH7 gain [dB] */
727 		port_descriptors[EQ_CH7G] =
728 		 LADSPA_PORT_INPUT | LADSPA_PORT_CONTROL;
729 		port_names[EQ_CH7G] =
730 		 "Band 8 Gain [dB]";
731 		port_range_hints[EQ_CH7G].HintDescriptor =
732 			LADSPA_HINT_BOUNDED_BELOW |
733 			LADSPA_HINT_BOUNDED_ABOVE |
734 			LADSPA_HINT_DEFAULT_0;
735 		port_range_hints[EQ_CH7G].LowerBound = -50;
736 		port_range_hints[EQ_CH7G].UpperBound = +20;
737 
738 
739 
740 
741 		/* Parameters for Input */
742 		port_descriptors[EQ_INPUT] =
743 		 LADSPA_PORT_INPUT | LADSPA_PORT_AUDIO;
744 		port_names[EQ_INPUT] =
745 		 "Input";
746 		port_range_hints[EQ_INPUT].HintDescriptor = 0;
747 
748 		/* Parameters for Output */
749 		port_descriptors[EQ_OUTPUT] =
750 		 LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO;
751 		port_names[EQ_OUTPUT] =
752 		 "Output";
753 		port_range_hints[EQ_OUTPUT].HintDescriptor = 0;
754 
755 		eqDescriptor->activate = activate_eq;
756 		eqDescriptor->cleanup = cleanup_eq;
757 		eqDescriptor->connect_port = connectPort_eq;
758 		eqDescriptor->deactivate = NULL;
759 		eqDescriptor->instantiate = instantiate_eq;
760 		eqDescriptor->run = run_eq;
761 		eqDescriptor->run_adding = run_adding_eq;
762 		eqDescriptor->set_run_adding_gain = set_run_adding_gain;
763 	}
764 }
765 
766 
767 void
_fini()768 _fini() {
769 
770 	if (eqDescriptor) {
771 		free((LADSPA_PortDescriptor *)eqDescriptor->PortDescriptors);
772 		free((char **)eqDescriptor->PortNames);
773 		free((LADSPA_PortRangeHint *)eqDescriptor->PortRangeHints);
774 		free(eqDescriptor);
775 	}
776 
777 }
778