1 /*
2     Copyright (C) 2009-2010 Fons Adriaensen  <fons@kokkinizita.net>
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 
19 
20 //-----------------------------------------------------------------------------------
21 // Common definitions
22 //-----------------------------------------------------------------------------------
23 
24 
25 #include "ambisonic0.h"
26 
27 
28 #define NMODS 4
29 #define VERSION "0.8.1"
30 
31 
32 static const char* maker = "Fons Adriaensen <fons@kokkinizita.net>";
33 static const char* copyr = "GPL";
34 
35 
pconnect(LADSPA_Handle H,unsigned long port,LADSPA_Data * data)36 static void pconnect (LADSPA_Handle H, unsigned long port, LADSPA_Data *data)
37 {
38     ((LadspaPlugin *)H)->setport (port, data);
39 }
40 
activate(LADSPA_Handle H)41 static void activate (LADSPA_Handle H)
42 {
43     ((LadspaPlugin *)H)->active (true);
44 }
45 
runplugin(LADSPA_Handle H,unsigned long k)46 static void runplugin (LADSPA_Handle H, unsigned long k)
47 {
48     ((LadspaPlugin *)H)->runproc (k, false);
49 }
50 /*
51 static void runadding (LADSPA_Handle H, unsigned long k)
52 {
53     ((LadspaPlugin *)H)->runproc (k, true);
54 }
55 
56 static void setadding (LADSPA_Handle H, LADSPA_Data gain)
57 {
58     ((LadspaPlugin *)H)->setgain (gain);
59 }
60 */
deactivate(LADSPA_Handle H)61 static void deactivate (LADSPA_Handle H)
62 {
63     ((LadspaPlugin *)H)->active (false);
64 }
65 
cleanup(LADSPA_Handle H)66 static void cleanup (LADSPA_Handle H)
67 {
68     delete (LadspaPlugin *) H;
69 }
70 
71 
72 //-----------------------------------------------------------------------------------
73 // Plugin definitions
74 //-----------------------------------------------------------------------------------
75 
76 
77 static const char* label0 = "Tricardioid-to-AMB";
78 static const char* name0  = "Three cardioids to AMB matrix";
79 
80 
instant0(const struct _LADSPA_Descriptor * desc,unsigned long rate)81 static LADSPA_Handle instant0 (const struct _LADSPA_Descriptor *desc, unsigned long rate)
82 {
83     return new Ladspa_Tricard2amb (rate);
84 }
85 
86 
87 static const LADSPA_PortDescriptor pdesc0 [Ladspa_Tricard2amb::NPORT] =
88 {
89     LADSPA_PORT_INPUT  | LADSPA_PORT_AUDIO,
90     LADSPA_PORT_INPUT  | LADSPA_PORT_AUDIO,
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 };
97 
98 static const char * const pname0 [Ladspa_Tricard2amb::NPORT] =
99 {
100   "In-L",
101   "In-R",
102   "In-B",
103   "Out-W",
104   "Out-X",
105   "Out-Y",
106   "Out-Z"
107 };
108 
109 static const LADSPA_PortRangeHint phint0 [Ladspa_Tricard2amb::NPORT] =
110 {
111   { 0, 0, 0 },
112   { 0, 0, 0 },
113   { 0, 0, 0 },
114   { 0, 0, 0 },
115   { 0, 0, 0 },
116   { 0, 0, 0 },
117   { 0, 0, 0 }
118 };
119 
120 
121 //-----------------------------------------------------------------------------------
122 
123 
124 static const char* label1 = "Virtualmic";
125 static const char* name1  = "Virtual stereo microphone";
126 
127 
instant1(const struct _LADSPA_Descriptor * desc,unsigned long rate)128 static LADSPA_Handle instant1 (const struct _LADSPA_Descriptor *desc, unsigned long rate)
129 {
130     return new Ladspa_Virtualmic (rate);
131 }
132 
133 
134 static const LADSPA_PortDescriptor pdesc1 [Ladspa_Virtualmic::NPORT] =
135 {
136     LADSPA_PORT_INPUT  | LADSPA_PORT_AUDIO,
137     LADSPA_PORT_INPUT  | LADSPA_PORT_AUDIO,
138     LADSPA_PORT_INPUT  | LADSPA_PORT_AUDIO,
139     LADSPA_PORT_INPUT  | LADSPA_PORT_AUDIO,
140     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
141     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
142     LADSPA_PORT_INPUT  | LADSPA_PORT_CONTROL,
143     LADSPA_PORT_INPUT  | LADSPA_PORT_CONTROL,
144     LADSPA_PORT_INPUT  | LADSPA_PORT_CONTROL,
145     LADSPA_PORT_INPUT  | LADSPA_PORT_CONTROL
146 };
147 
148 static const char * const pname1 [Ladspa_Virtualmic::NPORT] =
149 {
150     "In-W",
151     "In-X",
152     "In-Y",
153     "In-Z",
154     "Out-L",
155     "Out-R",
156     "Elevation",
157     "Azimuth",
158     "Angle",
159     "Polar"
160 };
161 
162 static const LADSPA_PortRangeHint phint1 [Ladspa_Virtualmic::NPORT] =
163 {
164     { 0, 0, 0 },
165     { 0, 0, 0 },
166     { 0, 0, 0 },
167     { 0, 0, 0 },
168     { 0, 0, 0 },
169     { 0, 0, 0 },
170     { LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_DEFAULT_0, -90, 90 },
171     { LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_DEFAULT_0, -180, 180 },
172     { LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_DEFAULT_MIDDLE, 0, 180 },
173     { LADSPA_HINT_BOUNDED_BELOW | LADSPA_HINT_BOUNDED_ABOVE | LADSPA_HINT_DEFAULT_MAXIMUM, 0, 1 }
174 };
175 
176 
177 //-----------------------------------------------------------------------------------
178 
179 
180 static const char* label2 = "UHJ-encoder";
181 static const char* name2  = "UHJ Encoder";
182 
183 
instant2(const struct _LADSPA_Descriptor * desc,unsigned long rate)184 static LADSPA_Handle instant2 (const struct _LADSPA_Descriptor *desc, unsigned long rate)
185 {
186     return new Ladspa_UHJ_encoder (rate);
187 }
188 
189 
190 static const LADSPA_PortDescriptor pdesc2 [Ladspa_UHJ_encoder::NPORT] =
191 {
192     LADSPA_PORT_INPUT  | LADSPA_PORT_AUDIO,
193     LADSPA_PORT_INPUT  | LADSPA_PORT_AUDIO,
194     LADSPA_PORT_INPUT  | LADSPA_PORT_AUDIO,
195     LADSPA_PORT_INPUT  | LADSPA_PORT_AUDIO,
196     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
197     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO
198 };
199 
200 static const char * const pname2 [Ladspa_UHJ_encoder::NPORT] =
201 {
202     "In-W",
203     "In-X",
204     "In-Y",
205     "In-Z",
206     "Out-L",
207     "Out-R"
208 };
209 
210 static const LADSPA_PortRangeHint phint2 [Ladspa_UHJ_encoder::NPORT] =
211 {
212     { 0, 0, 0 },
213     { 0, 0, 0 },
214     { 0, 0, 0 },
215     { 0, 0, 0 },
216     { 0, 0, 0 },
217     { 0, 0, 0 }
218 };
219 
220 
221 //-----------------------------------------------------------------------------------
222 
223 
224 static const char* label3 = "UHJ-decoder";
225 static const char* name3  = "UHJ Decoder";
226 
227 
instant3(const struct _LADSPA_Descriptor * desc,unsigned long rate)228 static LADSPA_Handle instant3 (const struct _LADSPA_Descriptor *desc, unsigned long rate)
229 {
230     return new Ladspa_UHJ_decoder (rate);
231 }
232 
233 
234 static const LADSPA_PortDescriptor pdesc3 [Ladspa_UHJ_decoder::NPORT] =
235 {
236     LADSPA_PORT_INPUT  | LADSPA_PORT_AUDIO,
237     LADSPA_PORT_INPUT  | LADSPA_PORT_AUDIO,
238     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
239     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
240     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO,
241     LADSPA_PORT_OUTPUT | LADSPA_PORT_AUDIO
242 };
243 
244 static const char * const pname3 [Ladspa_UHJ_decoder::NPORT] =
245 {
246     "In-L",
247     "In-R",
248     "Out-W",
249     "Out-X",
250     "Out-Y",
251     "Out-Z"
252 };
253 
254 static const LADSPA_PortRangeHint phint3 [Ladspa_UHJ_decoder::NPORT] =
255 {
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 };
263 
264 
265 //-----------------------------------------------------------------------------------
266 //  LADSPA dlsym interface
267 //-----------------------------------------------------------------------------------
268 
269 
270 static const LADSPA_Descriptor moddescr [NMODS] =
271 {
272   {
273     1961,
274     label0,
275     LADSPA_PROPERTY_REALTIME | LADSPA_PROPERTY_HARD_RT_CAPABLE,
276     name0,
277     maker,
278     copyr,
279     Ladspa_Tricard2amb::NPORT,
280     pdesc0,
281     pname0,
282     phint0,
283     0,
284     instant0,
285     pconnect,
286     activate,
287     runplugin,
288     0,
289     0,
290     deactivate,
291     cleanup
292   },
293   {
294     1962,
295     label1,
296     LADSPA_PROPERTY_REALTIME | LADSPA_PROPERTY_HARD_RT_CAPABLE,
297     name1,
298     maker,
299     copyr,
300     Ladspa_Virtualmic::NPORT,
301     pdesc1,
302     pname1,
303     phint1,
304     0,
305     instant1,
306     pconnect,
307     activate,
308     runplugin,
309     0,
310     0,
311     deactivate,
312     cleanup
313   },
314   {
315     1957,
316     label2,
317     LADSPA_PROPERTY_REALTIME | LADSPA_PROPERTY_HARD_RT_CAPABLE,
318     name2,
319     maker,
320     copyr,
321     Ladspa_UHJ_encoder::NPORT,
322     pdesc2,
323     pname2,
324     phint2,
325     0,
326     instant2,
327     pconnect,
328     activate,
329     runplugin,
330     0,
331     0,
332     deactivate,
333     cleanup
334   },
335   {
336     1958,
337     label3,
338     LADSPA_PROPERTY_REALTIME | LADSPA_PROPERTY_HARD_RT_CAPABLE,
339     name3,
340     maker,
341     copyr,
342     Ladspa_UHJ_decoder::NPORT,
343     pdesc3,
344     pname3,
345     phint3,
346     0,
347     instant3,
348     pconnect,
349     activate,
350     runplugin,
351     0,
352     0,
353     deactivate,
354     cleanup
355   }
356 };
357 
358 
ladspa_descriptor(unsigned long i)359 extern "C" const LADSPA_Descriptor *ladspa_descriptor (unsigned long i)
360 {
361   if (i >= NMODS) return 0;
362   return moddescr + i;
363 }
364 
365 
366 //-----------------------------------------------------------------------------------
367