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