Large nasty commit in the form of a 5000 line patch chock-full of completely
[ardour.git] / libs / ardour / ladspa_plugin.cc
1 /*
2     Copyright (C) 2000-2002 Paul Davis 
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$
19 */
20
21 #include <vector>
22 #include <string>
23
24 #include <cstdlib>
25 #include <cstdio> // so libraptor doesn't complain
26 #include <cmath>
27 #include <dirent.h>
28 #include <sys/stat.h>
29 #include <cerrno>
30
31 #include <lrdf.h>
32
33 #include <pbd/compose.h>
34 #include <pbd/error.h>
35 #include <pbd/pathscanner.h>
36 #include <pbd/xml++.h>
37
38 #include <midi++/manager.h>
39
40 #include <ardour/ardour.h>
41 #include <ardour/session.h>
42 #include <ardour/audioengine.h>
43 #include <ardour/ladspa_plugin.h>
44
45 #include <pbd/stl_delete.h>
46
47 #include "i18n.h"
48 #include <locale.h>
49
50 using namespace std;
51 using namespace ARDOUR;
52 using namespace PBD;
53
54 LadspaPlugin::LadspaPlugin (void *mod, AudioEngine& e, Session& session, uint32_t index, jack_nframes_t rate)
55         : Plugin (e, session)
56 {
57         init (mod, index, rate);
58 }
59
60 LadspaPlugin::LadspaPlugin (const LadspaPlugin &other)
61         : Plugin (other)
62 {
63         init (other.module, other._index, other.sample_rate);
64
65         for (uint32_t i = 0; i < parameter_count(); ++i) {
66                 control_data[i] = other.shadow_data[i];
67                 shadow_data[i] = other.shadow_data[i];
68         }
69 }
70
71 void
72 LadspaPlugin::init (void *mod, uint32_t index, jack_nframes_t rate)
73 {
74         LADSPA_Descriptor_Function dfunc;
75         uint32_t i, port_cnt;
76         const char *errstr;
77
78         module = mod;
79         control_data = 0;
80         shadow_data = 0;
81         latency_control_port = 0;
82         was_activated = false;
83
84         dfunc = (LADSPA_Descriptor_Function) dlsym (module, "ladspa_descriptor");
85
86         if ((errstr = dlerror()) != NULL) {
87                 error << _("LADSPA: module has no descriptor function.") << endmsg;
88                 throw failed_constructor();
89         }
90
91         if ((descriptor = dfunc (index)) == 0) {
92                 error << _("LADSPA: plugin has gone away since discovery!") << endmsg;
93                 throw failed_constructor();
94         }
95
96         _index = index;
97
98         if (LADSPA_IS_INPLACE_BROKEN(descriptor->Properties)) {
99                 error << string_compose(_("LADSPA: \"%1\" cannot be used, since it cannot do inplace processing"), descriptor->Name) << endmsg;
100                 throw failed_constructor();
101         }
102         
103         sample_rate = rate;
104
105         if (descriptor->instantiate == 0) {
106                 throw failed_constructor();
107         }
108
109         if ((handle = descriptor->instantiate (descriptor, rate)) == 0) {
110                 throw failed_constructor();
111         }
112
113         port_cnt = parameter_count();
114
115         control_data = new LADSPA_Data[port_cnt];
116         shadow_data = new LADSPA_Data[port_cnt];
117
118         for (i = 0; i < port_cnt; ++i) {
119                 if (LADSPA_IS_PORT_CONTROL(port_descriptor (i))) {
120                         connect_port (i, &control_data[i]);
121                         
122                         if (LADSPA_IS_PORT_OUTPUT(port_descriptor (i)) &&
123                             strcmp (port_names()[i], X_("latency")) == 0) {
124                                 latency_control_port = &control_data[i];
125                                 *latency_control_port = 0;
126                         }
127
128                         if (!LADSPA_IS_PORT_INPUT(port_descriptor (i))) {
129                                 continue;
130                         }
131                 
132                         shadow_data[i] = default_value (i);
133                 }
134         }
135
136         Plugin::setup_midi_controls ();
137
138         latency_compute_run ();
139
140         MIDI::Controllable *mcontrol;
141
142         for (uint32_t i = 0; i < parameter_count(); ++i) {
143                 if (LADSPA_IS_PORT_INPUT(port_descriptor (i)) &&
144                     LADSPA_IS_PORT_CONTROL(port_descriptor (i))) {
145                         if ((mcontrol = get_nth_midi_control (i)) != 0) {
146                                 mcontrol->midi_rebind (_session.midi_port(), 0);
147                         }
148                 }
149         }
150 }
151
152 LadspaPlugin::~LadspaPlugin ()
153 {
154         deactivate ();
155         cleanup ();
156
157         GoingAway (this); /* EMIT SIGNAL */
158         
159         /* XXX who should close a plugin? */
160
161         // dlclose (module);
162
163         if (control_data) {
164                 delete [] control_data;
165         }
166
167         if (shadow_data) {
168                 delete [] shadow_data;
169         }
170 }
171
172 void
173 LadspaPlugin::store_state (PluginState& state)
174 {
175         state.parameters.clear ();
176         
177         for (uint32_t i = 0; i < parameter_count(); ++i){
178
179                 if (LADSPA_IS_PORT_INPUT(port_descriptor (i)) && 
180                     LADSPA_IS_PORT_CONTROL(port_descriptor (i))){
181                         pair<uint32_t,float> datum;
182
183                         datum.first = i;
184                         datum.second = shadow_data[i];
185
186                         state.parameters.insert (datum);
187                 }
188         }
189 }
190
191 void
192 LadspaPlugin::restore_state (PluginState& state)
193 {
194         for (map<uint32_t,float>::iterator i = state.parameters.begin(); i != state.parameters.end(); ++i) {
195                 set_parameter (i->first, i->second);
196         }
197 }
198
199 float
200 LadspaPlugin::default_value (uint32_t port)
201 {
202         const LADSPA_PortRangeHint *prh = port_range_hints();
203         float ret = 0.0f;
204         bool bounds_given = false;
205         bool sr_scaling = false;
206
207         /* defaults - case 1 */
208         
209         if (LADSPA_IS_HINT_HAS_DEFAULT(prh[port].HintDescriptor)) {
210                 if (LADSPA_IS_HINT_DEFAULT_MINIMUM(prh[port].HintDescriptor)) {
211                         ret = prh[port].LowerBound;
212                         bounds_given = true;
213                         sr_scaling = true;
214                 }
215                 
216                 /* FIXME: add support for logarithmic defaults */
217                 
218                 else if (LADSPA_IS_HINT_DEFAULT_LOW(prh[port].HintDescriptor)) {
219                         ret = prh[port].LowerBound * 0.75f + prh[port].UpperBound * 0.25f;
220                         bounds_given = true;
221                         sr_scaling = true;
222                 }
223                 else if (LADSPA_IS_HINT_DEFAULT_MIDDLE(prh[port].HintDescriptor)) {
224                         ret = prh[port].LowerBound * 0.50f + prh[port].UpperBound * 0.50f;
225                         bounds_given = true;
226                         sr_scaling = true;
227                 }
228                 else if (LADSPA_IS_HINT_DEFAULT_HIGH(prh[port].HintDescriptor)) {
229                         ret = prh[port].LowerBound * 0.25f + prh[port].UpperBound * 0.75f;
230                         bounds_given = true;
231                         sr_scaling = true;
232                 }
233                 else if (LADSPA_IS_HINT_DEFAULT_MAXIMUM(prh[port].HintDescriptor)) {
234                         ret = prh[port].UpperBound;
235                         bounds_given = true;
236                         sr_scaling = true;
237                 }
238                 else if (LADSPA_IS_HINT_DEFAULT_0(prh[port].HintDescriptor)) {
239                         ret = 0.0f;
240                 }
241                 else if (LADSPA_IS_HINT_DEFAULT_1(prh[port].HintDescriptor)) {
242                         ret = 1.0f;
243                 }
244                 else if (LADSPA_IS_HINT_DEFAULT_100(prh[port].HintDescriptor)) {
245                         ret = 100.0f;
246                 }
247                 else if (LADSPA_IS_HINT_DEFAULT_440(prh[port].HintDescriptor)) {
248                         ret = 440.0f;
249                 }
250                 else {
251                         /* no hint found */
252                         ret = 0.0f;
253                 }
254         }
255         
256         /* defaults - case 2 */
257         else if (LADSPA_IS_HINT_BOUNDED_BELOW(prh[port].HintDescriptor) &&
258                  !LADSPA_IS_HINT_BOUNDED_ABOVE(prh[port].HintDescriptor)) {
259                 
260                 if (prh[port].LowerBound < 0) {
261                         ret = 0.0f;
262                 } else {
263                         ret = prh[port].LowerBound;
264                 }
265
266                 bounds_given = true;
267                 sr_scaling = true;
268         }
269         
270         /* defaults - case 3 */
271         else if (!LADSPA_IS_HINT_BOUNDED_BELOW(prh[port].HintDescriptor) &&
272                  LADSPA_IS_HINT_BOUNDED_ABOVE(prh[port].HintDescriptor)) {
273                 
274                 if (prh[port].UpperBound > 0) {
275                         ret = 0.0f;
276                 } else {
277                         ret = prh[port].UpperBound;
278                 }
279
280                 bounds_given = true;
281                 sr_scaling = true;
282         }
283         
284         /* defaults - case 4 */
285         else if (LADSPA_IS_HINT_BOUNDED_BELOW(prh[port].HintDescriptor) &&
286                  LADSPA_IS_HINT_BOUNDED_ABOVE(prh[port].HintDescriptor)) {
287                 
288                 if (prh[port].LowerBound < 0 && prh[port].UpperBound > 0) {
289                         ret = 0.0f;
290                 } else if (prh[port].LowerBound < 0 && prh[port].UpperBound < 0) {
291                         ret = prh[port].UpperBound;
292                 } else {
293                         ret = prh[port].LowerBound;
294                 }
295                 bounds_given = true;    
296                 sr_scaling = true;
297         }
298         
299         /* defaults - case 5 */
300                 
301         if (LADSPA_IS_HINT_SAMPLE_RATE(prh[port].HintDescriptor)) {
302                 if (bounds_given) {
303                         if (sr_scaling) {
304                                 ret *= sample_rate;
305                         }
306                 } else {
307                         ret = sample_rate;
308                 }
309         }
310
311         return ret;
312 }       
313
314 void
315 LadspaPlugin::set_parameter (uint32_t which, float val)
316 {
317         if (which < descriptor->PortCount) {
318                 shadow_data[which] = (LADSPA_Data) val;
319                 ParameterChanged (which, val); /* EMIT SIGNAL */
320
321                 if (session().get_midi_feedback()) {
322
323                         if (which < parameter_count() && midi_controls[which]) {
324                                 midi_controls[which]->send_feedback (val);
325                         }
326                 }
327
328         } else {
329                 warning << string_compose (_("illegal parameter number used with plugin \"%1\". This may"
330                                       "indicate a change in the plugin design, and presets may be"
331                                       "invalid"), name())
332                         << endmsg;
333         }
334 }
335
336 float
337 LadspaPlugin::get_parameter (uint32_t which) const
338 {
339         if (LADSPA_IS_PORT_INPUT(port_descriptor (which))) {
340                 return (float) shadow_data[which];
341         } else {
342                 return (float) control_data[which];
343         }
344 }
345
346 uint32_t
347 LadspaPlugin::nth_parameter (uint32_t n, bool& ok) const
348 {
349         uint32_t x, c;
350
351         ok = false;
352
353         for (c = 0, x = 0; x < descriptor->PortCount; ++x) {
354                 if (LADSPA_IS_PORT_CONTROL (port_descriptor (x))) {
355                         if (c++ == n) {
356                                 ok = true;
357                                 return x;
358                         }
359                 }
360         }
361         return 0;
362 }
363
364 XMLNode&
365 LadspaPlugin::get_state()
366 {
367         XMLNode *root = new XMLNode(state_node_name());
368         XMLNode *child;
369         char buf[16];
370         LocaleGuard lg (X_("POSIX"));
371
372         for (uint32_t i = 0; i < parameter_count(); ++i){
373
374                 if (LADSPA_IS_PORT_INPUT(port_descriptor (i)) && 
375                     LADSPA_IS_PORT_CONTROL(port_descriptor (i))){
376
377                         child = new XMLNode("port");
378                         snprintf(buf, sizeof(buf), "%u", i);
379                         child->add_property("number", string(buf));
380                         snprintf(buf, sizeof(buf), "%+f", shadow_data[i]);
381                         child->add_property("value", string(buf));
382                         root->add_child_nocopy (*child);
383
384                         MIDI::Controllable *pcontrol = get_nth_midi_control (i);
385                         
386                         if (pcontrol) {
387
388                                 MIDI::eventType ev;
389                                 MIDI::byte      additional;
390                                 MIDI::channel_t chn;
391                                 XMLNode*        midi_node;
392
393                                 if (pcontrol->get_control_info (chn, ev, additional)) {
394
395                                         midi_node = child->add_child ("midi-control");
396                 
397                                         snprintf (buf, sizeof(buf), "0x%x", ev);
398                                         midi_node->add_property ("event", buf);
399                                         snprintf (buf, sizeof(buf), "%d", chn);
400                                         midi_node->add_property ("channel", buf);
401                                         snprintf (buf, sizeof(buf), "0x%x", additional);
402                                         midi_node->add_property ("additional", buf);
403                                 }
404                         }
405                 }
406         }
407
408         return *root;
409 }
410
411 bool
412 LadspaPlugin::save_preset (string name)
413 {
414         return Plugin::save_preset (name, "ladspa");
415 }
416
417 int
418 LadspaPlugin::set_state(const XMLNode& node)
419 {
420         XMLNodeList nodes;
421         XMLProperty *prop;
422         XMLNodeConstIterator iter;
423         XMLNode *child;
424         const char *port;
425         const char *data;
426         uint32_t port_id;
427         LocaleGuard lg (X_("POSIX"));
428
429         if (node.name() != state_node_name()) {
430                 error << _("Bad node sent to LadspaPlugin::set_state") << endmsg;
431                 return -1;
432         }
433
434         nodes = node.children ("port");
435
436         for(iter = nodes.begin(); iter != nodes.end(); ++iter){
437
438                 child = *iter;
439
440                 if ((prop = child->property("number")) != 0) {
441                         port = prop->value().c_str();
442                 } else {
443                         warning << _("LADSPA: no ladspa port number") << endmsg;
444                         continue;
445                 }
446                 if ((prop = child->property("value")) != 0) {
447                         data = prop->value().c_str();
448                 } else {
449                         warning << _("LADSPA: no ladspa port data") << endmsg;
450                         continue;
451                 }
452
453                 sscanf (port, "%" PRIu32, &port_id);
454                 set_parameter (port_id, atof(data));
455
456                 XMLNodeList midi_kids;
457                 XMLNodeConstIterator iter;
458                 
459                 midi_kids = child->children ("midi-control");
460                 
461                 for (iter = midi_kids.begin(); iter != midi_kids.end(); ++iter) {
462                         
463                         child = *iter;
464
465                         MIDI::eventType ev = MIDI::on; /* initialize to keep gcc happy */
466                         MIDI::byte additional = 0; /* initialize to keep gcc happy */
467                         MIDI::channel_t chn = 0; /* initialize to keep gcc happy */
468                         bool ok = true;
469                         int xx;
470                         
471                         if ((prop = child->property ("event")) != 0) {
472                                 sscanf (prop->value().c_str(), "0x%x", &xx);
473                                 ev = (MIDI::eventType) xx;
474                         } else {
475                                 ok = false;
476                         }
477                         
478                         if (ok && ((prop = child->property ("channel")) != 0)) {
479                                 sscanf (prop->value().c_str(), "%d", &xx);
480                                 chn = (MIDI::channel_t) xx;
481                         } else {
482                                 ok = false;
483                         }
484                         
485                         if (ok && ((prop = child->property ("additional")) != 0)) {
486                                 sscanf (prop->value().c_str(), "0x%x", &xx);
487                                 additional = (MIDI::byte) xx;
488                         }
489                         
490                         if (ok) {
491                                 MIDI::Controllable* pcontrol = get_nth_midi_control (port_id);
492
493                                 if (pcontrol) {
494                                         pcontrol->set_control_type (chn, ev, additional);
495                                 }
496
497                         } else {
498                                 error << string_compose(_("LADSPA LadspaPlugin MIDI control specification for port %1 is incomplete, so it has been ignored"), port) << endl;
499                         }
500                 }
501         }
502
503         latency_compute_run ();
504
505         return 0;
506 }
507
508 int
509 LadspaPlugin::get_parameter_descriptor (uint32_t which, ParameterDescriptor& desc) const
510 {
511         LADSPA_PortRangeHint prh;
512
513         prh  = port_range_hints()[which];
514         
515
516         if (LADSPA_IS_HINT_BOUNDED_BELOW(prh.HintDescriptor)) {
517                 desc.min_unbound = false;
518                 if (LADSPA_IS_HINT_SAMPLE_RATE(prh.HintDescriptor)) {
519                         desc.lower = prh.LowerBound * _session.frame_rate();
520                 } else {
521                         desc.lower = prh.LowerBound;
522                 }
523         } else {
524                 desc.min_unbound = true;
525                 desc.lower = 0;
526         }
527         
528
529         if (LADSPA_IS_HINT_BOUNDED_ABOVE(prh.HintDescriptor)) {
530                 desc.max_unbound = false;
531                 if (LADSPA_IS_HINT_SAMPLE_RATE(prh.HintDescriptor)) {
532                         desc.upper = prh.UpperBound * _session.frame_rate();
533                 } else {
534                         desc.upper = prh.UpperBound;
535                 }
536         } else {
537                 desc.max_unbound = true;
538                 desc.upper = 4; /* completely arbitrary */
539         }
540         
541         if (LADSPA_IS_HINT_INTEGER (prh.HintDescriptor)) {
542                 desc.step = 1.0;
543                 desc.smallstep = 0.1;
544                 desc.largestep = 10.0;
545         } else {
546                 float delta = desc.upper - desc.lower;
547                 desc.step = delta / 1000.0f;
548                 desc.smallstep = delta / 10000.0f;
549                 desc.largestep = delta/10.0f;
550         }
551         
552         desc.toggled = LADSPA_IS_HINT_TOGGLED (prh.HintDescriptor);
553         desc.logarithmic = LADSPA_IS_HINT_LOGARITHMIC (prh.HintDescriptor);
554         desc.sr_dependent = LADSPA_IS_HINT_SAMPLE_RATE (prh.HintDescriptor);
555         desc.integer_step = LADSPA_IS_HINT_INTEGER (prh.HintDescriptor);
556
557         desc.label = port_names()[which];
558
559
560         return 0;
561 }
562
563
564 string
565 LadspaPlugin::describe_parameter (uint32_t which)
566 {
567         if (which < parameter_count()) {
568                 return port_names()[which];
569         } else {
570                 return "??";
571         }
572 }
573
574 jack_nframes_t
575 LadspaPlugin::latency () const
576 {
577         if (latency_control_port) {
578                 return (jack_nframes_t) floor (*latency_control_port);
579         } else {
580                 return 0;
581         }
582 }
583
584 set<uint32_t>
585 LadspaPlugin::automatable () const
586 {
587         set<uint32_t> ret;
588
589         for (uint32_t i = 0; i < parameter_count(); ++i){
590                 if (LADSPA_IS_PORT_INPUT(port_descriptor (i)) && 
591                     LADSPA_IS_PORT_CONTROL(port_descriptor (i))){
592                         
593                         ret.insert (ret.end(), i);
594                 }
595         }
596
597         return ret;
598 }
599
600 int
601 LadspaPlugin::connect_and_run (vector<Sample*>& bufs, uint32_t nbufs, int32_t& in_index, int32_t& out_index, jack_nframes_t nframes, jack_nframes_t offset)
602 {
603         uint32_t port_index;
604         cycles_t then, now;
605
606         port_index = 0;
607
608         then = get_cycles ();
609
610         while (port_index < parameter_count()) {
611                 if (LADSPA_IS_PORT_AUDIO (port_descriptor(port_index))) {
612                         if (LADSPA_IS_PORT_INPUT (port_descriptor(port_index))) {
613                                 connect_port (port_index, bufs[min((uint32_t) in_index,nbufs - 1)] + offset);
614                                 //cerr << this << ' ' << name() << " @ " << offset << " inport " << in_index << " = buf " 
615                                 //     << min((uint32_t)in_index,nbufs) << " = " << &bufs[min((uint32_t)in_index,nbufs)][offset] << endl;
616                                 in_index++;
617
618
619                         } else if (LADSPA_IS_PORT_OUTPUT (port_descriptor (port_index))) {
620                                 connect_port (port_index, bufs[min((uint32_t) out_index,nbufs - 1)] + offset);
621                                 // cerr << this << ' ' << name() << " @ " << offset << " outport " << out_index << " = buf " 
622                                 //     << min((uint32_t)out_index,nbufs) << " = " << &bufs[min((uint32_t)out_index,nbufs)][offset] << endl;
623                                 out_index++;
624                         }
625                 }
626                 port_index++;
627         }
628         
629         run (nframes);
630         now = get_cycles ();
631         set_cycles ((uint32_t) (now - then));
632
633         return 0;
634 }
635
636 bool
637 LadspaPlugin::parameter_is_control (uint32_t param) const
638 {
639         return LADSPA_IS_PORT_CONTROL(port_descriptor (param));
640 }
641
642 bool
643 LadspaPlugin::parameter_is_audio (uint32_t param) const
644 {
645         return LADSPA_IS_PORT_AUDIO(port_descriptor (param));
646 }
647
648 bool
649 LadspaPlugin::parameter_is_output (uint32_t param) const
650 {
651         return LADSPA_IS_PORT_OUTPUT(port_descriptor (param));
652 }
653
654 bool
655 LadspaPlugin::parameter_is_input (uint32_t param) const
656 {
657         return LADSPA_IS_PORT_INPUT(port_descriptor (param));
658 }
659
660 void
661 LadspaPlugin::print_parameter (uint32_t param, char *buf, uint32_t len) const
662 {
663         if (buf && len) {
664                 if (param < parameter_count()) {
665                         snprintf (buf, len, "%.3f", get_parameter (param));
666                 } else {
667                         strcat (buf, "0");
668                 }
669         }
670 }
671
672 void
673 LadspaPlugin::run (jack_nframes_t nframes)
674 {
675         for (uint32_t i = 0; i < parameter_count(); ++i) {
676                 if (LADSPA_IS_PORT_INPUT(port_descriptor (i)) && LADSPA_IS_PORT_CONTROL(port_descriptor (i))) {
677                         control_data[i] = shadow_data[i];
678                 }
679         }
680         descriptor->run (handle, nframes);
681 }
682
683 void
684 LadspaPlugin::latency_compute_run ()
685 {
686         if (!latency_control_port) {
687                 return;
688         }
689
690         /* we need to run the plugin so that it can set its latency
691            parameter.
692         */
693         
694         activate ();
695         
696         uint32_t port_index = 0;
697         uint32_t in_index = 0;
698         uint32_t out_index = 0;
699         const jack_nframes_t bufsize = 1024;
700         LADSPA_Data buffer[bufsize];
701
702         memset(buffer,0,sizeof(LADSPA_Data)*bufsize);
703                 
704         /* Note that we've already required that plugins
705            be able to handle in-place processing.
706         */
707         
708         port_index = 0;
709         
710         while (port_index < parameter_count()) {
711                 if (LADSPA_IS_PORT_AUDIO (port_descriptor (port_index))) {
712                         if (LADSPA_IS_PORT_INPUT (port_descriptor (port_index))) {
713                                 connect_port (port_index, buffer);
714                                 in_index++;
715                         } else if (LADSPA_IS_PORT_OUTPUT (port_descriptor (port_index))) {
716                                 connect_port (port_index, buffer);
717                                 out_index++;
718                         }
719                 }
720                 port_index++;
721         }
722         
723         run (bufsize);
724         deactivate ();
725 }