ardour
ladspa_plugin.cc
Go to the documentation of this file.
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 #ifdef WAF_BUILD
21 #include "libardour-config.h"
22 #endif
23 
24 #include <inttypes.h>
25 
26 #include <vector>
27 #include <string>
28 
29 #include <cstdlib>
30 #include <cstdio> // so libraptor doesn't complain
31 #include <cmath>
32 #ifndef COMPILER_MSVC
33 #include <dirent.h>
34 #endif
35 #include <sys/stat.h>
36 #include <cerrno>
37 
38 #ifdef HAVE_LRDF
39 #include <lrdf.h>
40 #endif
41 
42 #include "pbd/compose.h"
43 #include "pbd/error.h"
44 #include "pbd/xml++.h"
45 #include "pbd/stacktrace.h"
46 
47 #include "ardour/session.h"
48 #include "ardour/ladspa_plugin.h"
49 #include "ardour/buffer_set.h"
50 #include "ardour/audio_buffer.h"
51 
52 #include "pbd/stl_delete.h"
53 
54 #include "i18n.h"
55 #include <locale.h>
56 
57 using namespace std;
58 using namespace ARDOUR;
59 using namespace PBD;
60 
61 LadspaPlugin::LadspaPlugin (string module_path, AudioEngine& e, Session& session, uint32_t index, framecnt_t rate)
62  : Plugin (e, session)
63 {
64  init (module_path, index, rate);
65 }
66 
67 LadspaPlugin::LadspaPlugin (const LadspaPlugin &other)
68  : Plugin (other)
69 {
70  init (other._module_path, other._index, other._sample_rate);
71 
72  for (uint32_t i = 0; i < parameter_count(); ++i) {
73  _control_data[i] = other._shadow_data[i];
74  _shadow_data[i] = other._shadow_data[i];
75  }
76 }
77 
78 void
79 LadspaPlugin::init (string module_path, uint32_t index, framecnt_t rate)
80 {
81  void* func;
83  uint32_t i, port_cnt;
84 
85  _module_path = module_path;
86  _module = new Glib::Module(_module_path);
87  _control_data = 0;
88  _shadow_data = 0;
90  _was_activated = false;
91 
92  if (!(*_module)) {
93  error << _("LADSPA: Unable to open module: ") << Glib::Module::get_last_error() << endmsg;
94  delete _module;
95  throw failed_constructor();
96  }
97 
98  if (!_module->get_symbol("ladspa_descriptor", func)) {
99  error << _("LADSPA: module has no descriptor function.") << endmsg;
100  throw failed_constructor();
101  }
102 
103  dfunc = (LADSPA_Descriptor_Function)func;
104 
105  if ((_descriptor = dfunc (index)) == 0) {
106  error << _("LADSPA: plugin has gone away since discovery!") << endmsg;
107  throw failed_constructor();
108  }
109 
110  _index = index;
111 
113  error << string_compose(_("LADSPA: \"%1\" cannot be used, since it cannot do inplace processing"), _descriptor->Name) << endmsg;
114  throw failed_constructor();
115  }
116 
117  _sample_rate = rate;
118 
119  if (_descriptor->instantiate == 0) {
120  throw failed_constructor();
121  }
122 
123  if ((_handle = _descriptor->instantiate (_descriptor, rate)) == 0) {
124  throw failed_constructor();
125  }
126 
127  port_cnt = parameter_count();
128 
129  _control_data = new LADSPA_Data[port_cnt];
130  memset (_control_data, 0, sizeof (LADSPA_Data) * port_cnt);
131  _shadow_data = new LADSPA_Data[port_cnt];
132  memset (_shadow_data, 0, sizeof (LADSPA_Data) * port_cnt);
133 
134  for (i = 0; i < port_cnt; ++i) {
136  connect_port (i, &_control_data[i]);
137 
139  strcmp (port_names()[i], X_("latency")) == 0) {
142  }
143 
145  continue;
146  }
147 
148  _shadow_data[i] = _default_value (i);
149  }
150  }
151 
153 }
154 
156 {
157  deactivate ();
158  cleanup ();
159 
160  // glib has internal reference counting on modules so this is ok
161  delete _module;
162 
163  delete [] _control_data;
164  delete [] _shadow_data;
165 }
166 
167 string
169 {
170  char buf[32];
171  snprintf (buf, sizeof (buf), "%lu", _descriptor->UniqueID);
172  return string (buf);
173 }
174 
175 float
176 LadspaPlugin::_default_value (uint32_t port) const
177 {
178  const LADSPA_PortRangeHint *prh = port_range_hints();
179  float ret = 0.0f;
180  bool bounds_given = false;
181  bool sr_scaling = false;
182  bool earlier_hint = false;
183 
184  /* defaults - case 1 */
185 
186  if (LADSPA_IS_HINT_HAS_DEFAULT(prh[port].HintDescriptor)) {
187  if (LADSPA_IS_HINT_DEFAULT_MINIMUM(prh[port].HintDescriptor)) {
188  ret = prh[port].LowerBound;
189  bounds_given = true;
190  sr_scaling = true;
191  }
192 
193  else if (LADSPA_IS_HINT_DEFAULT_LOW(prh[port].HintDescriptor)) {
194  ret = prh[port].LowerBound * 0.75f + prh[port].UpperBound * 0.25f;
195  bounds_given = true;
196  sr_scaling = true;
197  }
198  else if (LADSPA_IS_HINT_DEFAULT_MIDDLE(prh[port].HintDescriptor)) {
199  ret = prh[port].LowerBound * 0.5f + prh[port].UpperBound * 0.5f;
200  bounds_given = true;
201  sr_scaling = true;
202  }
203  else if (LADSPA_IS_HINT_DEFAULT_HIGH(prh[port].HintDescriptor)) {
204  ret = prh[port].LowerBound * 0.25f + prh[port].UpperBound * 0.75f;
205  bounds_given = true;
206  sr_scaling = true;
207  }
208  else if (LADSPA_IS_HINT_DEFAULT_MAXIMUM(prh[port].HintDescriptor)) {
209  ret = prh[port].UpperBound;
210  bounds_given = true;
211  sr_scaling = true;
212  }
213  else if (LADSPA_IS_HINT_DEFAULT_0(prh[port].HintDescriptor)) {
214  ret = 0.0f;
215  earlier_hint = true;
216  }
217  else if (LADSPA_IS_HINT_DEFAULT_1(prh[port].HintDescriptor)) {
218  ret = 1.0f;
219  earlier_hint = true;
220  }
221  else if (LADSPA_IS_HINT_DEFAULT_100(prh[port].HintDescriptor)) {
222  ret = 100.0f;
223  earlier_hint = true;
224  }
225  else if (LADSPA_IS_HINT_DEFAULT_440(prh[port].HintDescriptor)) {
226  ret = 440.0f;
227  earlier_hint = true;
228  }
229  else {
230  /* no hint found */
231  ret = 0.0f;
232  }
233  }
234 
235  /* defaults - case 2 */
236  else if (LADSPA_IS_HINT_BOUNDED_BELOW(prh[port].HintDescriptor) &&
237  !LADSPA_IS_HINT_BOUNDED_ABOVE(prh[port].HintDescriptor)) {
238 
239  if (prh[port].LowerBound < 0) {
240  ret = 0.0f;
241  } else {
242  ret = prh[port].LowerBound;
243  }
244 
245  bounds_given = true;
246  sr_scaling = true;
247  }
248 
249  /* defaults - case 3 */
250  else if (!LADSPA_IS_HINT_BOUNDED_BELOW(prh[port].HintDescriptor) &&
251  LADSPA_IS_HINT_BOUNDED_ABOVE(prh[port].HintDescriptor)) {
252 
253  if (prh[port].UpperBound > 0) {
254  ret = 0.0f;
255  } else {
256  ret = prh[port].UpperBound;
257  }
258 
259  bounds_given = true;
260  sr_scaling = true;
261  }
262 
263  /* defaults - case 4 */
264  else if (LADSPA_IS_HINT_BOUNDED_BELOW(prh[port].HintDescriptor) &&
265  LADSPA_IS_HINT_BOUNDED_ABOVE(prh[port].HintDescriptor)) {
266 
267  if (prh[port].LowerBound < 0 && prh[port].UpperBound > 0) {
268  ret = 0.0f;
269  } else if (prh[port].LowerBound < 0 && prh[port].UpperBound < 0) {
270  ret = prh[port].UpperBound;
271  } else {
272  ret = prh[port].LowerBound;
273  }
274  bounds_given = true;
275  sr_scaling = true;
276  }
277 
278  /* defaults - case 5 */
279 
280  if (LADSPA_IS_HINT_SAMPLE_RATE(prh[port].HintDescriptor) && !earlier_hint) {
281  if (bounds_given) {
282  if (sr_scaling) {
283  ret *= _sample_rate;
284  }
285  } else {
286  ret = _sample_rate;
287  }
288  }
289 
290  return ret;
291 }
292 
293 void
294 LadspaPlugin::set_parameter (uint32_t which, float val)
295 {
296  if (which < _descriptor->PortCount) {
297 
298  if (get_parameter (which) == val) {
299  return;
300  }
301 
302  _shadow_data[which] = (LADSPA_Data) val;
303 
304 #if 0
305  if (which < parameter_count() && controls[which]) {
306  controls[which]->Changed ();
307  }
308 #endif
309 
310  } else {
311  warning << string_compose (_("illegal parameter number used with plugin \"%1\". This may "
312  "indicate a change in the plugin design, and presets may be "
313  "invalid"), name())
314  << endmsg;
315  }
316 
317  Plugin::set_parameter (which, val);
318 }
319 
321 float
322 LadspaPlugin::get_parameter (uint32_t which) const
323 {
324  if (LADSPA_IS_PORT_INPUT(port_descriptor (which))) {
325  return (float) _shadow_data[which];
326  } else {
327  return (float) _control_data[which];
328  }
329 }
330 
331 uint32_t
332 LadspaPlugin::nth_parameter (uint32_t n, bool& ok) const
333 {
334  uint32_t x, c;
335 
336  ok = false;
337 
338  for (c = 0, x = 0; x < _descriptor->PortCount; ++x) {
340  if (c++ == n) {
341  ok = true;
342  return x;
343  }
344  }
345  }
346  return 0;
347 }
348 
349 void
351 {
352  XMLNode *child;
353  char buf[16];
354  LocaleGuard lg (X_("C"));
355 
356  for (uint32_t i = 0; i < parameter_count(); ++i){
357 
360 
361  child = new XMLNode("Port");
362  snprintf(buf, sizeof(buf), "%u", i);
363  child->add_property("number", string(buf));
364  snprintf(buf, sizeof(buf), "%+f", _shadow_data[i]);
365  child->add_property("value", string(buf));
366  root->add_child_nocopy (*child);
367  }
368  }
369 }
370 
371 int
372 LadspaPlugin::set_state (const XMLNode& node, int version)
373 {
374  if (version < 3000) {
375  return set_state_2X (node, version);
376  }
377 
378 #ifndef NO_PLUGIN_STATE
379  XMLNodeList nodes;
380  XMLProperty *prop;
382  XMLNode *child;
383  const char *port;
384  const char *data;
385  uint32_t port_id;
386 #endif
387  LocaleGuard lg (X_("C"));
388 
389  if (node.name() != state_node_name()) {
390  error << _("Bad node sent to LadspaPlugin::set_state") << endmsg;
391  return -1;
392  }
393 
394 #ifndef NO_PLUGIN_STATE
395 
396  nodes = node.children ("Port");
397 
398  for (iter = nodes.begin(); iter != nodes.end(); ++iter) {
399 
400  child = *iter;
401 
402  if ((prop = child->property("number")) != 0) {
403  port = prop->value().c_str();
404  } else {
405  warning << _("LADSPA: no ladspa port number") << endmsg;
406  continue;
407  }
408  if ((prop = child->property("value")) != 0) {
409  data = prop->value().c_str();
410  } else {
411  warning << _("LADSPA: no ladspa port data") << endmsg;
412  continue;
413  }
414 
415  sscanf (port, "%" PRIu32, &port_id);
416  set_parameter (port_id, atof(data));
417  }
418 #endif
419 
421 
422  return Plugin::set_state (node, version);
423 }
424 
425 int
426 LadspaPlugin::set_state_2X (const XMLNode& node, int /* version */)
427 {
428 #ifndef NO_PLUGIN_STATE
429  XMLNodeList nodes;
430  XMLProperty *prop;
432  XMLNode *child;
433  const char *port;
434  const char *data;
435  uint32_t port_id;
436 #endif
437  LocaleGuard lg (X_("C"));
438 
439  if (node.name() != state_node_name()) {
440  error << _("Bad node sent to LadspaPlugin::set_state") << endmsg;
441  return -1;
442  }
443 
444 #ifndef NO_PLUGIN_STATE
445  nodes = node.children ("port");
446 
447  for(iter = nodes.begin(); iter != nodes.end(); ++iter){
448 
449  child = *iter;
450 
451  if ((prop = child->property("number")) != 0) {
452  port = prop->value().c_str();
453  } else {
454  warning << _("LADSPA: no ladspa port number") << endmsg;
455  continue;
456  }
457  if ((prop = child->property("value")) != 0) {
458  data = prop->value().c_str();
459  } else {
460  warning << _("LADSPA: no ladspa port data") << endmsg;
461  continue;
462  }
463 
464  sscanf (port, "%" PRIu32, &port_id);
465  set_parameter (port_id, atof(data));
466  }
467 
469 #endif
470 
471  return 0;
472 }
473 
474 int
476 {
478 
479  prh = port_range_hints()[which];
480 
481 
483  desc.min_unbound = false;
485  desc.lower = prh.LowerBound * _session.frame_rate();
486  } else {
487  desc.lower = prh.LowerBound;
488  }
489  } else {
490  desc.min_unbound = true;
491  desc.lower = 0;
492  }
493 
494 
496  desc.max_unbound = false;
498  desc.upper = prh.UpperBound * _session.frame_rate();
499  } else {
500  desc.upper = prh.UpperBound;
501  }
502  } else {
503  desc.max_unbound = true;
504  desc.upper = 4; /* completely arbitrary */
505  }
506 
508  desc.normal = _default_value(which);
509  } else {
510  /* if there is no explicit hint for the default
511  * value, use lower bound. This is not great but
512  * better than just assuming '0' which may be out-of range.
513  */
514  desc.normal = desc.lower;
515  }
516 
521 
522  desc.label = port_names()[which];
523 
524  desc.scale_points = get_scale_points(which);
525  desc.update_steps();
526 
527  return 0;
528 }
529 
530 string
532 {
533  if (which.type() == PluginAutomation && which.id() < parameter_count()) {
534  return port_names()[which.id()];
535  } else {
536  return "??";
537  }
538 }
539 
542 {
543  if (_user_latency) {
544  return _user_latency;
545  }
546 
547  if (_latency_control_port) {
548  return (framecnt_t) floor (*_latency_control_port);
549  } else {
550  return 0;
551  }
552 }
553 
554 set<Evoral::Parameter>
556 {
557  set<Evoral::Parameter> ret;
558 
559  for (uint32_t i = 0; i < parameter_count(); ++i){
562 
563  ret.insert (ret.end(), Evoral::Parameter(PluginAutomation, 0, i));
564  }
565  }
566 
567  return ret;
568 }
569 
570 int
572  ChanMapping in_map, ChanMapping out_map,
573  pframes_t nframes, framecnt_t offset)
574 {
575  Plugin::connect_and_run (bufs, in_map, out_map, nframes, offset);
576 
577  cycles_t now;
578  cycles_t then = get_cycles ();
579 
582 
583  uint32_t audio_in_index = 0;
584  uint32_t audio_out_index = 0;
585  bool valid;
586  for (uint32_t port_index = 0; port_index < parameter_count(); ++port_index) {
587  if (LADSPA_IS_PORT_AUDIO(port_descriptor(port_index))) {
588  if (LADSPA_IS_PORT_INPUT(port_descriptor(port_index))) {
589  const uint32_t buf_index = in_map.get(DataType::AUDIO, audio_in_index++, &valid);
590  connect_port(port_index,
591  valid ? bufs.get_audio(buf_index).data(offset)
592  : silent_bufs.get_audio(0).data(offset));
593  } else if (LADSPA_IS_PORT_OUTPUT(port_descriptor(port_index))) {
594  const uint32_t buf_index = out_map.get(DataType::AUDIO, audio_out_index++, &valid);
595  connect_port(port_index,
596  valid ? bufs.get_audio(buf_index).data(offset)
597  : scratch_bufs.get_audio(0).data(offset));
598  }
599  }
600  }
601 
602  run_in_place (nframes);
603  now = get_cycles ();
604  set_cycles ((uint32_t) (now - then));
605 
606  return 0;
607 }
608 
609 bool
611 {
612  return LADSPA_IS_PORT_CONTROL(port_descriptor (param));
613 }
614 
615 bool
616 LadspaPlugin::parameter_is_audio (uint32_t param) const
617 {
618  return LADSPA_IS_PORT_AUDIO(port_descriptor (param));
619 }
620 
621 bool
622 LadspaPlugin::parameter_is_output (uint32_t param) const
623 {
624  return LADSPA_IS_PORT_OUTPUT(port_descriptor (param));
625 }
626 
627 bool
628 LadspaPlugin::parameter_is_input (uint32_t param) const
629 {
630  return LADSPA_IS_PORT_INPUT(port_descriptor (param));
631 }
632 
633 void
634 LadspaPlugin::print_parameter (uint32_t param, char *buf, uint32_t len) const
635 {
636  if (buf && len) {
637  if (param < parameter_count()) {
638  snprintf (buf, len, "%.3f", get_parameter (param));
639  } else {
640  strcat (buf, "0");
641  }
642  }
643 }
644 
646 LadspaPlugin::get_scale_points(uint32_t port_index) const
647 {
649 #ifdef HAVE_LRDF
650  const uint32_t id = atol(unique_id().c_str());
651  lrdf_defaults* points = lrdf_get_scale_values(id, port_index);
652 
653  if (!points) {
654  return ret;
655  }
656 
658 
659  for (uint32_t i = 0; i < points->count; ++i) {
660  ret->insert(make_pair(points->items[i].label,
661  points->items[i].value));
662  }
663 
664  lrdf_free_setting_values(points);
665 #endif
666  return ret;
667 }
668 
669 void
671 {
672  for (uint32_t i = 0; i < parameter_count(); ++i) {
674  _control_data[i] = _shadow_data[i];
675  }
676  }
677 
678  assert (_was_activated);
679 
680  _descriptor->run (_handle, nframes);
681 }
682 
683 void
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 framecnt_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_in_place (bufsize);
724  deactivate ();
725 }
726 
727 PluginPtr
729 {
730  try {
731  PluginPtr plugin (new LadspaPlugin (path, session.engine(), session, index, session.frame_rate()));
732  plugin->set_info(PluginInfoPtr(new LadspaPluginInfo(*this)));
733  return plugin;
734  }
735 
736  catch (failed_constructor &err) {
737  return PluginPtr ((Plugin*) 0);
738  }
739 }
740 
742 {
744 }
745 
746 
747 void
749 {
750 #ifdef HAVE_LRDF
751  uint32_t id;
752  std::string unique (unique_id());
753 
754  if (!isdigit (unique[0])) {
755  return;
756  }
757 
758  id = atol (unique.c_str());
759 
760  lrdf_uris* set_uris = lrdf_get_setting_uris(id);
761 
762  if (set_uris) {
763  for (uint32_t i = 0; i < (uint32_t) set_uris->count; ++i) {
764  if (char* label = lrdf_get_label(set_uris->items[i])) {
765  PresetRecord rec (set_uris->items[i], label);
766  _presets.insert (make_pair (set_uris->items[i], rec));
767  }
768  }
769  lrdf_free_uris(set_uris);
770  }
771 #endif
772 }
773 
774 
775 bool
777 {
778 #ifdef HAVE_LRDF
779  lrdf_defaults* defs = lrdf_get_setting_values (r.uri.c_str());
780 
781  if (defs) {
782  for (uint32_t i = 0; i < (uint32_t) defs->count; ++i) {
783  if (parameter_is_input (defs->items[i].pid)) {
784  set_parameter(defs->items[i].pid, defs->items[i].value);
785  }
786  }
787  lrdf_free_setting_values(defs);
788  }
789 
791 #endif
792  return true;
793 }
794 
795 #ifdef HAVE_LRDF
796 /* XXX: should be in liblrdf */
797 static void
798 lrdf_remove_preset (const char* /*source*/, const char *setting_uri)
799 {
800  lrdf_statement p;
801  lrdf_statement *q;
802  lrdf_statement *i;
803  char setting_uri_copy[64];
804  char buf[64];
805 
806  strncpy(setting_uri_copy, setting_uri, sizeof(setting_uri_copy));
807 
808  p.subject = setting_uri_copy;
809  strncpy(buf, LADSPA_BASE "hasPortValue", sizeof(buf));
810  p.predicate = buf;
811  p.object = NULL;
812  q = lrdf_matches(&p);
813 
814  p.predicate = NULL;
815  p.object = NULL;
816  for (i = q; i; i = i->next) {
817  p.subject = i->object;
818  lrdf_remove_matches(&p);
819  }
820 
821  lrdf_free_statements(q);
822 
823  p.subject = NULL;
824  strncpy(buf, LADSPA_BASE "hasSetting", sizeof(buf));
825  p.predicate = buf;
826  p.object = setting_uri_copy;
827  lrdf_remove_matches(&p);
828 
829  p.subject = setting_uri_copy;
830  p.predicate = NULL;
831  p.object = NULL;
832  lrdf_remove_matches (&p);
833 }
834 #endif
835 
836 void
838 {
839 #ifdef HAVE_LRDF
840  string const envvar = preset_envvar ();
841  if (envvar.empty()) {
842  warning << _("Could not locate HOME. Preset not removed.") << endmsg;
843  return;
844  }
845 
846  Plugin::PresetRecord const * p = preset_by_label (name);
847  if (!p) {
848  return;
849  }
850 
851  string const source = preset_source (envvar);
852  lrdf_remove_preset (source.c_str(), p->uri.c_str ());
853 
854  write_preset_file (envvar);
855 #endif
856 }
857 
858 string
860 {
861  char* envvar;
862  if ((envvar = getenv ("HOME")) == 0) {
863  return "";
864  }
865 
866  return envvar;
867 }
868 
869 string
870 LadspaPlugin::preset_source (string envvar) const
871 {
872  return string_compose ("file:%1/.ladspa/rdf/ardour-presets.n3", envvar);
873 }
874 
875 bool
877 {
878 #ifdef HAVE_LRDF
879  string path = string_compose("%1/.ladspa", envvar);
880  if (g_mkdir_with_parents (path.c_str(), 0775)) {
881  warning << string_compose(_("Could not create %1. Preset not saved. (%2)"), path, strerror(errno)) << endmsg;
882  return false;
883  }
884 
885  path += "/rdf";
886  if (g_mkdir_with_parents (path.c_str(), 0775)) {
887  warning << string_compose(_("Could not create %1. Preset not saved. (%2)"), path, strerror(errno)) << endmsg;
888  return false;
889  }
890 
891  string const source = preset_source (envvar);
892 
893  if (lrdf_export_by_source (source.c_str(), source.substr(5).c_str())) {
894  warning << string_compose(_("Error saving presets file %1."), source) << endmsg;
895  return false;
896  }
897 
898  return true;
899 #else
900  return false;
901 #endif
902 }
903 
904 string
906 {
907 #ifdef HAVE_LRDF
908  /* make a vector of pids that are input parameters */
909  vector<int> input_parameter_pids;
910  for (uint32_t i = 0; i < parameter_count(); ++i) {
911  if (parameter_is_input (i)) {
912  input_parameter_pids.push_back (i);
913  }
914  }
915 
916  std::string unique (unique_id());
917 
918  if (!isdigit (unique[0])) {
919  return "";
920  }
921 
922  uint32_t const id = atol (unique.c_str());
923 
924  lrdf_defaults defaults;
925  defaults.count = input_parameter_pids.size ();
926  std::vector<lrdf_portvalue> portvalues(input_parameter_pids.size());
927  defaults.items = &portvalues[0];
928 
929  for (vector<int>::size_type i = 0; i < input_parameter_pids.size(); ++i) {
930  portvalues[i].pid = input_parameter_pids[i];
931  portvalues[i].value = get_parameter (input_parameter_pids[i]);
932  }
933 
934  string const envvar = preset_envvar ();
935  if (envvar.empty()) {
936  warning << _("Could not locate HOME. Preset not saved.") << endmsg;
937  return "";
938  }
939 
940  string const source = preset_source (envvar);
941 
942  char* uri_char = lrdf_add_preset (source.c_str(), name.c_str(), id, &defaults);
943  string uri (uri_char);
944  free (uri_char);
945 
946  if (!write_preset_file (envvar)) {
947  return "";
948  }
949 
950  return uri;
951 #else
952  return string();
953 #endif
954 }
955 
958 {
959  if (i < _descriptor->PortCount) {
960  return _descriptor->PortDescriptors[i];
961  }
962 
963  warning << "LADSPA plugin port index " << i << " out of range." << endmsg;
964  return 0;
965 }
966 
967 
968 
int set_state_2X(const XMLNode &, int version)
std::set< Evoral::Parameter > automatable() const
const LADSPA_Descriptor *(* LADSPA_Descriptor_Function)(unsigned long Index)
Definition: ladspa.h:596
#define LADSPA_IS_HINT_DEFAULT_LOW(x)
Definition: ladspa.h:323
virtual int set_state(const XMLNode &, int version)
Definition: plugin.cc:369
float lower
Minimum value (in Hz, for frequencies)
const std::string & value() const
Definition: xml++.h:159
void do_remove_preset(std::string name)
bool parameter_is_output(uint32_t) const
const LADSPA_Descriptor * _descriptor
bool write_preset_file(std::string)
void add_state(XMLNode *) const
virtual void set_parameter(uint32_t which, float val)
Definition: plugin.cc:361
#define LADSPA_IS_HINT_TOGGLED(x)
Definition: ladspa.h:315
std::string path
Definition: plugin.h:62
#define LADSPA_IS_HINT_INTEGER(x)
Definition: ladspa.h:318
const std::string & name() const
Definition: xml++.h:104
boost::shared_ptr< ScalePoints > get_scale_points(uint32_t port_index) const
std::map< const std::string, const float > ScalePoints
int LADSPA_PortDescriptor
Definition: ladspa.h:154
uint32_t pframes_t
Definition: types.h:61
LADSPA_Properties Properties
Definition: ladspa.h:392
#define LADSPA_IS_HINT_DEFAULT_100(x)
Definition: ladspa.h:335
const char * name() const
Definition: ladspa_plugin.h:49
Definition: Beats.hpp:239
LIBPBD_API Transmitter error
LIBPBD_API Transmitter warning
#define LADSPA_IS_HINT_BOUNDED_BELOW(x)
Definition: ladspa.h:313
const XMLNodeList & children(const std::string &str=std::string()) const
Definition: xml++.cc:329
const char * Name
Definition: ladspa.h:396
LADSPA_Handle(* instantiate)(const struct _LADSPA_Descriptor *Descriptor, unsigned long SampleRate)
Definition: ladspa.h:440
const char *const * port_names() const
std::string state_node_name() const
Definition: ladspa_plugin.h:90
std::ostream & endmsg(std::ostream &ostr)
Definition: transmitter.h:71
unsigned long PortCount
Definition: ladspa.h:409
static void init(int fsamp)
Definition: kmeterdsp.cc:40
#define LADSPA_IS_HINT_DEFAULT_HIGH(x)
Definition: ladspa.h:327
framecnt_t frame_rate() const
Definition: session.h:365
std::string describe_parameter(Evoral::Parameter)
AudioBuffer & get_audio(size_t i)
Definition: buffer_set.h:100
static cycles_t get_cycles(void)
Definition: cycles.h:230
#define LADSPA_IS_HINT_SAMPLE_RATE(x)
Definition: ladspa.h:316
virtual int connect_and_run(BufferSet &bufs, ChanMapping in, ChanMapping out, pframes_t nframes, framecnt_t offset)
Definition: plugin.cc:259
LADSPA_PortRangeHintDescriptor HintDescriptor
Definition: ladspa.h:343
std::list< XMLNode * > XMLNodeList
Definition: xml++.h:44
#define _(Text)
Definition: i18n.h:11
const PresetRecord * preset_by_label(const std::string &)
Definition: plugin.cc:235
uint32_t index() const
void run_in_place(pframes_t nsamples)
unsigned long UniqueID
Definition: ladspa.h:382
framecnt_t signal_latency() const
int32_t atol(const string &s)
Definition: convert.cc:146
int connect_and_run(BufferSet &bufs, ChanMapping in, ChanMapping out, pframes_t nframes, framecnt_t offset)
Glib::Module * _module
LADSPA_Data * _control_data
std::string _module_path
LADSPA_Data LowerBound
Definition: ladspa.h:348
boost::shared_ptr< Plugin > PluginPtr
Definition: plugin.h:50
#define X_(Text)
Definition: i18n.h:13
int64_t framecnt_t
Definition: types.h:76
uint32_t nth_parameter(uint32_t port, bool &ok) const
XMLProperty * property(const char *)
Definition: xml++.cc:413
void(* run)(LADSPA_Handle Instance, unsigned long SampleCount)
Definition: ladspa.h:508
float upper
Maximum value (in Hz, for frequencies)
float LADSPA_Data
Definition: ladspa.h:84
#define LADSPA_IS_HINT_DEFAULT_MIDDLE(x)
Definition: ladspa.h:325
uint32_t parameter_count() const
Definition: ladspa_plugin.h:51
void set_parameter(uint32_t port, float val)
#define LADSPA_IS_HINT_DEFAULT_0(x)
Definition: ladspa.h:331
Definition: amp.h:29
#define LADSPA_IS_PORT_CONTROL(x)
Definition: ladspa.h:172
std::map< std::string, PresetRecord > _presets
Definition: plugin.h:289
const PBD::ID & id() const
Definition: stateful.h:68
#define LADSPA_IS_HINT_DEFAULT_440(x)
Definition: ladspa.h:337
int set_state(const XMLNode &, int version)
const char * label() const
Definition: ladspa_plugin.h:48
void print_parameter(uint32_t, char *, uint32_t len) const
framecnt_t _user_latency
Definition: latent.h:47
void connect_port(uint32_t port, float *ptr)
std::string do_save_preset(std::string name)
bool parameter_is_audio(uint32_t) const
LADSPA_PortDescriptor port_descriptor(uint32_t i) const
float _default_value(uint32_t port) const
bool parameter_is_input(uint32_t) const
#define LADSPA_IS_HINT_DEFAULT_MINIMUM(x)
Definition: ladspa.h:321
XMLProperty * add_property(const char *name, const std::string &value)
bool parameter_is_control(uint32_t) const
bool load_preset(PresetRecord)
#define LADSPA_IS_PORT_AUDIO(x)
Definition: ladspa.h:173
#define LADSPA_IS_INPLACE_BROKEN(x)
Definition: ladspa.h:136
const char * name
void add_child_nocopy(XMLNode &)
Definition: xml++.cc:357
uint32_t id() const
Definition: Parameter.hpp:49
const LADSPA_PortRangeHint * port_range_hints() const
LADSPA_Handle _handle
bool toggled
True iff parameter is boolean.
#define LADSPA_IS_HINT_DEFAULT_MAXIMUM(x)
Definition: ladspa.h:329
std::string preset_envvar() const
#define LADSPA_IS_PORT_INPUT(x)
Definition: ladspa.h:170
Definition: xml++.h:95
std::string preset_source(std::string) const
ARDOUR::Session & _session
Definition: plugin.h:286
uint32_t type() const
Definition: Parameter.hpp:47
Definition: debug.h:30
#define LADSPA_IS_HINT_BOUNDED_ABOVE(x)
Definition: ladspa.h:314
PluginPtr load(Session &session)
LADSPA_Data UpperBound
Definition: ladspa.h:353
float get_parameter(uint32_t port) const
boost::shared_ptr< ScalePoints > scale_points
#define LADSPA_IS_HINT_LOGARITHMIC(x)
Definition: ladspa.h:317
const LADSPA_PortDescriptor * PortDescriptors
Definition: ladspa.h:413
LADSPA_Data * _latency_control_port
void set_cycles(uint32_t c)
Definition: plugin.h:231
const Sample * data(framecnt_t offset=0) const
Definition: audio_buffer.h:187
boost::shared_ptr< PluginInfo > PluginInfoPtr
Definition: plugin.h:89
#define LADSPA_IS_PORT_OUTPUT(x)
Definition: ladspa.h:171
std::string unique_id() const
#define LADSPA_IS_HINT_HAS_DEFAULT(x)
Definition: ladspa.h:320
XMLNodeList::const_iterator XMLNodeConstIterator
Definition: xml++.h:49
BufferSet & get_silent_buffers(ChanCount count=ChanCount::ZERO)
Definition: session.cc:4845
long cycles_t
Definition: cycles.h:226
virtual bool load_preset(PresetRecord)
Definition: plugin.cc:340
BufferSet & get_scratch_buffers(ChanCount count=ChanCount::ZERO, bool silence=true)
Definition: session.cc:4851
uint32_t get(DataType t, uint32_t from, bool *valid)
Definition: chan_mapping.cc:44
ARDOUR::PluginType type
Definition: plugin.h:65
AudioEngine & engine()
Definition: session.h:546
#define LADSPA_IS_HINT_DEFAULT_1(x)
Definition: ladspa.h:333
std::string string_compose(const std::string &fmt, const T1 &o1)
Definition: compose.h:208
void init(std::string module_path, uint32_t index, framecnt_t rate)
double atof(const string &s)
Definition: convert.cc:158
uint32_t index
Definition: plugin.h:86
LADSPA_Data * _shadow_data
int get_parameter_descriptor(uint32_t which, ParameterDescriptor &) const