1 /*
2     Copyright (C) 2009 Fons Adriaensen <fons@kokkinizita.net>
3     and Jörn Nettingsmeier <nettings@stackingdwarves.net>
4 
5     This program is free software; you can redistribute it and/or modify
6     it under the terms of the GNU General Public License as published by
7     the Free Software Foundation; either version 2 of the License, or
8     (at your option) any later version.
9 
10     This program is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13     GNU General Public License for more details.
14 
15     You should have received a copy of the GNU General Public License
16     along with this program; if not, write to the Free Software
17     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 */
19 
20 
21 //-----------------------------------------------------------------------------------
22 // Common definitions
23 //-----------------------------------------------------------------------------------
24 
25 
26 #include "ambisonic3.h"
27 
28 
29 #define NMODS 4
30 #define VERSION "0.6.1"
31 
32 
33 static const char* maker = "Joern Nettingsmeier <nettings@stackingdwarves.net>";
34 static const char* copyr = "GPL";
35 
36 
pconnect(LADSPA_Handle H,unsigned long port,LADSPA_Data * data)37 static void pconnect (LADSPA_Handle H, unsigned long port, LADSPA_Data *data)
38 {
39     ((LadspaPlugin *)H)->setport (port, data);
40 }
41 
activate(LADSPA_Handle H)42 static void activate (LADSPA_Handle H)
43 {
44     ((LadspaPlugin *)H)->active (true);
45 }
46 
runplugin(LADSPA_Handle H,unsigned long k)47 static void runplugin (LADSPA_Handle H, unsigned long k)
48 {
49     ((LadspaPlugin *)H)->runproc (k, false);
50 }
51 /*
52   static void runadding (LADSPA_Handle H, unsigned long k)
53   {
54   ((LadspaPlugin *)H)->runproc (k, true);
55   }
56 
57   static void setadding (LADSPA_Handle H, LADSPA_Data gain)
58   {
59   ((LadspaPlugin *)H)->setgain (gain);
60   }
61 */
deactivate(LADSPA_Handle H)62 static void deactivate (LADSPA_Handle H)
63 {
64     ((LadspaPlugin *)H)->active (false);
65 }
66 
cleanup(LADSPA_Handle H)67 static void cleanup (LADSPA_Handle H)
68 {
69     delete (LadspaPlugin *) H;
70 }
71 
72 
73 //-----------------------------------------------------------------------------------
74 // Plugin definitions
75 //-----------------------------------------------------------------------------------
76 
77 
78 static const char* label0 = "Ambisonics-31-panner";
79 static const char* name0  = "AMB order 3,1 panner";
80 
81 
82 
instant0(const struct _LADSPA_Descriptor * desc,unsigned long rate)83 static LADSPA_Handle instant0 (const struct _LADSPA_Descriptor *desc, unsigned long rate)
84 {
85     return new Ladspa_Monopan31 (rate);
86 }
87 
88 
89 static const LADSPA_PortDescriptor pdesc0 [Ladspa_Monopan31::NPORT] =
90 {
91     LADSPA_PORT_INPUT  | LADSPA_PORT_AUDIO,
92     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
93     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
94     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
95     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
96     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
97     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
98     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
99     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
100     LADSPA_PORT_INPUT  | LADSPA_PORT_CONTROL,
101     LADSPA_PORT_INPUT  | LADSPA_PORT_CONTROL
102 };
103 
104 static const char * const pname0 [Ladspa_Monopan31::NPORT] =
105 {
106     "In",
107     "Out-W",
108     "Out-X", "Out-Y",
109     "Out-U", "Out-V",
110     "OUT-P", "OUT-Q",
111     "Out-Z",
112     "Elevation",
113     "Azimuth"
114 };
115 
116 static const LADSPA_PortRangeHint phint0 [Ladspa_Monopan31::NPORT] =
117 {
118     { 0, 0, 0 },
119     { 0, 0, 0 },
120     { 0, 0, 0 },
121     { 0, 0, 0 },
122     { 0, 0, 0 },
123     { 0, 0, 0 },
124     { 0, 0, 0 },
125     { 0, 0, 0 },
126     { 0, 0, 0 },
127     { LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_DEFAULT_0, -90, 90 },
128     { LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_DEFAULT_0, -180, 180 }
129 };
130 
131 
132 //-----------------------------------------------------------------------------------
133 
134 
135 static const char* label1 = "Ambisonics-31-rotator";
136 static const char* name1  = "AMB order 3,1 rotator";
137 
138 
instant1(const struct _LADSPA_Descriptor * desc,unsigned long rate)139 static LADSPA_Handle instant1 (const struct _LADSPA_Descriptor *desc, unsigned long rate)
140 {
141     return new Ladspa_Rotator31 (rate);
142 }
143 
144 
145 static const LADSPA_PortDescriptor pdesc1 [Ladspa_Rotator31::NPORT] =
146 {
147     LADSPA_PORT_INPUT  | LADSPA_PORT_AUDIO,
148     LADSPA_PORT_INPUT  | LADSPA_PORT_AUDIO,
149     LADSPA_PORT_INPUT  | LADSPA_PORT_AUDIO,
150     LADSPA_PORT_INPUT  | LADSPA_PORT_AUDIO,
151     LADSPA_PORT_INPUT  | LADSPA_PORT_AUDIO,
152     LADSPA_PORT_INPUT  | LADSPA_PORT_AUDIO,
153     LADSPA_PORT_INPUT  | LADSPA_PORT_AUDIO,
154     LADSPA_PORT_INPUT  | LADSPA_PORT_AUDIO,
155     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
156     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
157     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
158     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
159     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
160     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
161     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
162     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
163     LADSPA_PORT_INPUT  | LADSPA_PORT_CONTROL
164 };
165 
166 static const char * const pname1 [Ladspa_Rotator31::NPORT] =
167 {
168     "In-W",
169     "In-X", "In-Y",
170     "In-U", "In-V",
171     "In-P", "In-Q",
172     "In-Z",
173     "Out-W",
174     "Out-X", "Out-Y",
175     "Out-U", "Out-V",
176     "Out-P", "Out-Q",
177     "Out-Z",
178     "Angle"
179 };
180 
181 static const LADSPA_PortRangeHint phint1 [Ladspa_Rotator31::NPORT] =
182 {
183     { 0, 0, 0 },
184     { 0, 0, 0 },
185     { 0, 0, 0 },
186     { 0, 0, 0 },
187     { 0, 0, 0 },
188     { 0, 0, 0 },
189     { 0, 0, 0 },
190     { 0, 0, 0 },
191     { 0, 0, 0 },
192     { 0, 0, 0 },
193     { 0, 0, 0 },
194     { 0, 0, 0 },
195     { 0, 0, 0 },
196     { 0, 0, 0 },
197     { 0, 0, 0 },
198     { 0, 0, 0 },
199     { LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_DEFAULT_0, -180, 180 }
200 };
201 
202 //-----------------------------------------------------------------------------------
203 
204 
205 static const char* label2 = "Ambisonics-33-panner";
206 static const char* name2  = "AMB order 3,3 panner";
207 
208 
instant2(const struct _LADSPA_Descriptor * desc,unsigned long rate)209 static LADSPA_Handle instant2 (const struct _LADSPA_Descriptor *desc, unsigned long rate)
210 {
211     return new Ladspa_Monopan33 (rate);
212 }
213 
214 
215 static const LADSPA_PortDescriptor pdesc2 [Ladspa_Monopan33::NPORT] =
216 {
217     LADSPA_PORT_INPUT  | LADSPA_PORT_AUDIO,
218     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
219     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
220     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
221     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
222     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
223     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
224     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
225     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
226     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
227     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
228     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
229     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
230     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
231     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
232     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
233     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
234     LADSPA_PORT_INPUT  | LADSPA_PORT_CONTROL,
235     LADSPA_PORT_INPUT  | LADSPA_PORT_CONTROL
236 };
237 
238 static const char * const pname2 [Ladspa_Monopan33::NPORT] =
239 {
240     "In",
241     "Out-W",
242     "Out-X", "Out-Y", "Out-Z",
243     "Out-R", "Out-S", "Out-T", "Out-U", "Out-V",
244     "Out-K", "Out-L", "Out-M", "Out-N", "Out-O", "Out-P", "Out-Q",
245     "Elevation",
246     "Azimuth"
247 };
248 
249 static const LADSPA_PortRangeHint phint2 [Ladspa_Monopan33::NPORT] =
250 {
251     { 0, 0, 0 },
252     { 0, 0, 0 },
253     { 0, 0, 0 },
254     { 0, 0, 0 },
255     { 0, 0, 0 },
256     { 0, 0, 0 },
257     { 0, 0, 0 },
258     { 0, 0, 0 },
259     { 0, 0, 0 },
260     { 0, 0, 0 },
261     { 0, 0, 0 },
262     { 0, 0, 0 },
263     { 0, 0, 0 },
264     { 0, 0, 0 },
265     { 0, 0, 0 },
266     { 0, 0, 0 },
267     { 0, 0, 0 },
268     { LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_DEFAULT_0, -90, 90 },
269     { LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_DEFAULT_0, -180, 180 }
270 };
271 
272 
273 //-----------------------------------------------------------------------------------
274 
275 
276 static const char* label3 = "Ambisonics-33-rotator";
277 static const char* name3  = "AMB order 3,3 rotator";
278 
279 
instant3(const struct _LADSPA_Descriptor * desc,unsigned long rate)280 static LADSPA_Handle instant3 (const struct _LADSPA_Descriptor *desc, unsigned long rate)
281 {
282     return new Ladspa_Rotator33 (rate);
283 }
284 
285 
286 static const LADSPA_PortDescriptor pdesc3 [Ladspa_Rotator33::NPORT] =
287 {
288     LADSPA_PORT_INPUT  | LADSPA_PORT_AUDIO,
289     LADSPA_PORT_INPUT  | LADSPA_PORT_AUDIO,
290     LADSPA_PORT_INPUT  | LADSPA_PORT_AUDIO,
291     LADSPA_PORT_INPUT  | LADSPA_PORT_AUDIO,
292     LADSPA_PORT_INPUT  | LADSPA_PORT_AUDIO,
293     LADSPA_PORT_INPUT  | LADSPA_PORT_AUDIO,
294     LADSPA_PORT_INPUT  | LADSPA_PORT_AUDIO,
295     LADSPA_PORT_INPUT  | LADSPA_PORT_AUDIO,
296     LADSPA_PORT_INPUT  | LADSPA_PORT_AUDIO,
297     LADSPA_PORT_INPUT  | LADSPA_PORT_AUDIO,
298     LADSPA_PORT_INPUT  | LADSPA_PORT_AUDIO,
299     LADSPA_PORT_INPUT  | LADSPA_PORT_AUDIO,
300     LADSPA_PORT_INPUT  | LADSPA_PORT_AUDIO,
301     LADSPA_PORT_INPUT  | LADSPA_PORT_AUDIO,
302     LADSPA_PORT_INPUT  | LADSPA_PORT_AUDIO,
303     LADSPA_PORT_INPUT  | LADSPA_PORT_AUDIO,
304     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
305     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
306     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
307     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
308     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
309     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
310     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
311     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
312     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
313     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
314     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
315     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
316     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
317     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
318     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
319     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
320     LADSPA_PORT_INPUT  | LADSPA_PORT_CONTROL
321 };
322 
323 static const char * const pname3 [Ladspa_Rotator33::NPORT] =
324 {
325     "In-W",
326     "In-X", "In-Y", "In-Z",
327     "In-R", "In-S", "In-T", "In-U", "In-V",
328     "In-K", "In-L", "In-M", "In-N", "In-O", "In-P", "In-Q",
329     "Out-W",
330     "Out-X", "Out-Y", "Out-Z",
331     "Out-R", "Out-S", "Out-T", "Out-U", "Out-V",
332     "Out-K", "Out-L", "Out-M", "Out-N", "Out-O", "Out-P", "Out-Q",
333     "Angle"
334 };
335 
336 static const LADSPA_PortRangeHint phint3 [Ladspa_Rotator33::NPORT] =
337 {
338     { 0, 0, 0 },
339     { 0, 0, 0 },
340     { 0, 0, 0 },
341     { 0, 0, 0 },
342     { 0, 0, 0 },
343     { 0, 0, 0 },
344     { 0, 0, 0 },
345     { 0, 0, 0 },
346     { 0, 0, 0 },
347     { 0, 0, 0 },
348     { 0, 0, 0 },
349     { 0, 0, 0 },
350     { 0, 0, 0 },
351     { 0, 0, 0 },
352     { 0, 0, 0 },
353     { 0, 0, 0 },
354     { 0, 0, 0 },
355     { 0, 0, 0 },
356     { 0, 0, 0 },
357     { 0, 0, 0 },
358     { 0, 0, 0 },
359     { 0, 0, 0 },
360     { 0, 0, 0 },
361     { 0, 0, 0 },
362     { 0, 0, 0 },
363     { 0, 0, 0 },
364     { 0, 0, 0 },
365     { 0, 0, 0 },
366     { 0, 0, 0 },
367     { 0, 0, 0 },
368     { 0, 0, 0 },
369     { 0, 0, 0 },
370     { LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_DEFAULT_0, -180, 180 }
371 };
372 
373 
374 //-----------------------------------------------------------------------------------
375 //  LADSPA dlsym interface
376 //-----------------------------------------------------------------------------------
377 
378 
379 static const LADSPA_Descriptor moddescr [NMODS] =
380 {
381     {
382 	1963,
383 	label0,
384 	LADSPA_PROPERTY_REALTIME | LADSPA_PROPERTY_HARD_RT_CAPABLE,
385 	name0,
386 	maker,
387 	copyr,
388 	Ladspa_Monopan31::NPORT,
389 	pdesc0,
390 	pname0,
391 	phint0,
392 	0,
393 	instant0,
394 	pconnect,
395 	activate,
396 	runplugin,
397 	0,
398 	0,
399 	deactivate,
400 	cleanup
401     },
402     {
403 	1964,
404 	label1,
405 	LADSPA_PROPERTY_REALTIME | LADSPA_PROPERTY_HARD_RT_CAPABLE,
406 	name1,
407 	maker,
408 	copyr,
409 	Ladspa_Rotator31::NPORT,
410 	pdesc1,
411 	pname1,
412 	phint1,
413 	0,
414 	instant1,
415 	pconnect,
416 	activate,
417 	runplugin,
418 	0,
419 	0,
420 	deactivate,
421 	cleanup
422     },
423     {
424 	1965,
425 	label2,
426 	LADSPA_PROPERTY_REALTIME | LADSPA_PROPERTY_HARD_RT_CAPABLE,
427 	name2,
428 	maker,
429 	copyr,
430 	Ladspa_Monopan33::NPORT,
431 	pdesc2,
432 	pname2,
433 	phint2,
434 	0,
435 	instant2,
436 	pconnect,
437 	activate,
438 	runplugin,
439 	0,
440 	0,
441 	deactivate,
442 	cleanup
443     },
444     {
445 	1966,
446 	label3,
447 	LADSPA_PROPERTY_REALTIME | LADSPA_PROPERTY_HARD_RT_CAPABLE,
448 	name3,
449 	maker,
450 	copyr,
451 	Ladspa_Rotator33::NPORT,
452 	pdesc3,
453 	pname3,
454 	phint3,
455 	0,
456 	instant3,
457 	pconnect,
458 	activate,
459 	runplugin,
460 	0,
461 	0,
462 	deactivate,
463 	cleanup
464     }
465 };
466 
467 
ladspa_descriptor(unsigned long i)468 extern "C" const LADSPA_Descriptor *ladspa_descriptor (unsigned long i)
469 {
470     if (i >= NMODS) return 0;
471     return moddescr + i;
472 }
473 
474 
475