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