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