2 Copyright (C) 2000-2006 Paul Davis
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.
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.
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.
20 #define __STDC_FORMAT_MACROS 1
27 #include <cstdio> // so libraptor doesn't complain
35 #include "pbd/compose.h"
36 #include "pbd/error.h"
37 #include "pbd/xml++.h"
39 #include "midi++/manager.h"
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"
48 #include "pbd/stl_delete.h"
54 using namespace ARDOUR
;
57 LadspaPlugin::LadspaPlugin (void *mod
, AudioEngine
& e
, Session
& session
, uint32_t index
, nframes_t rate
)
60 init (mod
, index
, rate
);
63 LadspaPlugin::LadspaPlugin (const LadspaPlugin
&other
)
66 init (other
._module
, other
._index
, other
._sample_rate
);
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
];
75 LadspaPlugin::init (void *mod
, uint32_t index
, nframes_t rate
)
77 LADSPA_Descriptor_Function dfunc
;
84 _latency_control_port
= 0;
85 _was_activated
= false;
87 dfunc
= (LADSPA_Descriptor_Function
) dlsym (_module
, "ladspa_descriptor");
89 if ((errstr
= dlerror()) != NULL
) {
90 error
<< _("LADSPA: module has no descriptor function.") << endmsg
;
91 throw failed_constructor();
94 if ((_descriptor
= dfunc (index
)) == 0) {
95 error
<< _("LADSPA: plugin has gone away since discovery!") << endmsg
;
96 throw failed_constructor();
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();
108 if (_descriptor
->instantiate
== 0) {
109 throw failed_constructor();
112 if ((_handle
= _descriptor
->instantiate (_descriptor
, rate
)) == 0) {
113 throw failed_constructor();
116 port_cnt
= parameter_count();
118 _control_data
= new LADSPA_Data
[port_cnt
];
119 _shadow_data
= new LADSPA_Data
[port_cnt
];
121 for (i
= 0; i
< port_cnt
; ++i
) {
122 if (LADSPA_IS_PORT_CONTROL(port_descriptor (i
))) {
123 connect_port (i
, &_control_data
[i
]);
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;
131 if (!LADSPA_IS_PORT_INPUT(port_descriptor (i
))) {
135 _shadow_data
[i
] = default_value (i
);
139 latency_compute_run ();
142 LadspaPlugin::~LadspaPlugin ()
147 /* XXX who should close a plugin? */
151 delete [] _control_data
;
152 delete [] _shadow_data
;
156 LadspaPlugin::unique_id() const
159 snprintf (buf
, sizeof (buf
), "%lu", _descriptor
->UniqueID
);
164 LadspaPlugin::default_value (uint32_t port
)
166 const LADSPA_PortRangeHint
*prh
= port_range_hints();
168 bool bounds_given
= false;
169 bool sr_scaling
= false;
170 bool earlier_hint
= false;
172 /* defaults - case 1 */
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
;
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
);
186 ret
= prh
[port
].LowerBound
* 0.75f
+ prh
[port
].UpperBound
* 0.25f
;
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
);
196 ret
= prh
[port
].LowerBound
* 0.5f
+ prh
[port
].UpperBound
* 0.5f
;
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
);
206 ret
= prh
[port
].LowerBound
* 0.25f
+ prh
[port
].UpperBound
* 0.75f
;
211 else if (LADSPA_IS_HINT_DEFAULT_MAXIMUM(prh
[port
].HintDescriptor
)) {
212 ret
= prh
[port
].UpperBound
;
216 else if (LADSPA_IS_HINT_DEFAULT_0(prh
[port
].HintDescriptor
)) {
220 else if (LADSPA_IS_HINT_DEFAULT_1(prh
[port
].HintDescriptor
)) {
224 else if (LADSPA_IS_HINT_DEFAULT_100(prh
[port
].HintDescriptor
)) {
228 else if (LADSPA_IS_HINT_DEFAULT_440(prh
[port
].HintDescriptor
)) {
238 /* defaults - case 2 */
239 else if (LADSPA_IS_HINT_BOUNDED_BELOW(prh
[port
].HintDescriptor
) &&
240 !LADSPA_IS_HINT_BOUNDED_ABOVE(prh
[port
].HintDescriptor
)) {
242 if (prh
[port
].LowerBound
< 0) {
245 ret
= prh
[port
].LowerBound
;
252 /* defaults - case 3 */
253 else if (!LADSPA_IS_HINT_BOUNDED_BELOW(prh
[port
].HintDescriptor
) &&
254 LADSPA_IS_HINT_BOUNDED_ABOVE(prh
[port
].HintDescriptor
)) {
256 if (prh
[port
].UpperBound
> 0) {
259 ret
= prh
[port
].UpperBound
;
266 /* defaults - case 4 */
267 else if (LADSPA_IS_HINT_BOUNDED_BELOW(prh
[port
].HintDescriptor
) &&
268 LADSPA_IS_HINT_BOUNDED_ABOVE(prh
[port
].HintDescriptor
)) {
270 if (prh
[port
].LowerBound
< 0 && prh
[port
].UpperBound
> 0) {
272 } else if (prh
[port
].LowerBound
< 0 && prh
[port
].UpperBound
< 0) {
273 ret
= prh
[port
].UpperBound
;
275 ret
= prh
[port
].LowerBound
;
281 /* defaults - case 5 */
283 if (LADSPA_IS_HINT_SAMPLE_RATE(prh
[port
].HintDescriptor
) && !earlier_hint
) {
297 LadspaPlugin::set_parameter (uint32_t which
, float val
)
299 if (which
< _descriptor
->PortCount
) {
300 _shadow_data
[which
] = (LADSPA_Data
) val
;
302 ParameterChanged (Parameter(PluginAutomation
, 0, which
), val
); /* EMIT SIGNAL */
304 if (which
< parameter_count() && controls
[which
]) {
305 controls
[which
]->Changed ();
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"
318 LadspaPlugin::get_parameter (uint32_t which
) const
320 if (LADSPA_IS_PORT_INPUT(port_descriptor (which
))) {
321 return (float) _shadow_data
[which
];
323 return (float) _control_data
[which
];
328 LadspaPlugin::nth_parameter (uint32_t n
, bool& ok
) const
334 for (c
= 0, x
= 0; x
< _descriptor
->PortCount
; ++x
) {
335 if (LADSPA_IS_PORT_CONTROL (port_descriptor (x
))) {
346 LadspaPlugin::get_state()
348 XMLNode
*root
= new XMLNode(state_node_name());
351 LocaleGuard
lg (X_("POSIX"));
353 for (uint32_t i
= 0; i
< parameter_count(); ++i
){
355 if (LADSPA_IS_PORT_INPUT(port_descriptor (i
)) &&
356 LADSPA_IS_PORT_CONTROL(port_descriptor (i
))){
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
);
371 LadspaPlugin::save_preset (string name
)
373 return Plugin::save_preset (name
, "ladspa");
377 LadspaPlugin::set_state (const XMLNode
& node
, int version
)
379 if (version
< 3000) {
380 return set_state_2X (node
, version
);
385 XMLNodeConstIterator iter
;
390 LocaleGuard
lg (X_("POSIX"));
392 if (node
.name() != state_node_name()) {
393 error
<< _("Bad node sent to LadspaPlugin::set_state") << endmsg
;
397 nodes
= node
.children ("Port");
399 for(iter
= nodes
.begin(); iter
!= nodes
.end(); ++iter
){
403 if ((prop
= child
->property("number")) != 0) {
404 port
= prop
->value().c_str();
406 warning
<< _("LADSPA: no ladspa port number") << endmsg
;
409 if ((prop
= child
->property("value")) != 0) {
410 data
= prop
->value().c_str();
412 warning
<< _("LADSPA: no ladspa port data") << endmsg
;
416 sscanf (port
, "%" PRIu32
, &port_id
);
417 set_parameter (port_id
, atof(data
));
420 latency_compute_run ();
426 LadspaPlugin::set_state_2X (const XMLNode
& node
, int /* version */)
430 XMLNodeConstIterator iter
;
435 LocaleGuard
lg (X_("POSIX"));
437 if (node
.name() != state_node_name()) {
438 error
<< _("Bad node sent to LadspaPlugin::set_state") << endmsg
;
442 nodes
= node
.children ("port");
444 for(iter
= nodes
.begin(); iter
!= nodes
.end(); ++iter
){
448 if ((prop
= child
->property("number")) != 0) {
449 port
= prop
->value().c_str();
451 warning
<< _("LADSPA: no ladspa port number") << endmsg
;
454 if ((prop
= child
->property("value")) != 0) {
455 data
= prop
->value().c_str();
457 warning
<< _("LADSPA: no ladspa port data") << endmsg
;
461 sscanf (port
, "%" PRIu32
, &port_id
);
462 set_parameter (port_id
, atof(data
));
465 latency_compute_run ();
471 LadspaPlugin::get_parameter_descriptor (uint32_t which
, ParameterDescriptor
& desc
) const
473 LADSPA_PortRangeHint prh
;
475 prh
= port_range_hints()[which
];
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();
483 desc
.lower
= prh
.LowerBound
;
486 desc
.min_unbound
= true;
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();
496 desc
.upper
= prh
.UpperBound
;
499 desc
.max_unbound
= true;
500 desc
.upper
= 4; /* completely arbitrary */
503 if (LADSPA_IS_HINT_INTEGER (prh
.HintDescriptor
)) {
505 desc
.smallstep
= 0.1;
506 desc
.largestep
= 10.0;
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
;
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
);
519 desc
.label
= port_names()[which
];
525 LadspaPlugin::describe_parameter (Evoral::Parameter which
)
527 if (which
.type() == PluginAutomation
&& which
.id() < parameter_count()) {
528 return port_names()[which
.id()];
535 LadspaPlugin::signal_latency () const
538 return _user_latency
;
541 if (_latency_control_port
) {
542 return (nframes_t
) floor (*_latency_control_port
);
548 set
<Evoral::Parameter
>
549 LadspaPlugin::automatable () const
551 set
<Evoral::Parameter
> ret
;
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
))){
557 ret
.insert (ret
.end(), Evoral::Parameter(PluginAutomation
, 0, i
));
565 LadspaPlugin::connect_and_run (BufferSet
& bufs
,
566 ChanMapping in_map
, ChanMapping out_map
,
567 nframes_t nframes
, nframes_t offset
)
570 cycles_t then
= get_cycles ();
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
));
586 run_in_place (nframes
);
588 set_cycles ((uint32_t) (now
- then
));
594 LadspaPlugin::parameter_is_control (uint32_t param
) const
596 return LADSPA_IS_PORT_CONTROL(port_descriptor (param
));
600 LadspaPlugin::parameter_is_audio (uint32_t param
) const
602 return LADSPA_IS_PORT_AUDIO(port_descriptor (param
));
606 LadspaPlugin::parameter_is_output (uint32_t param
) const
608 return LADSPA_IS_PORT_OUTPUT(port_descriptor (param
));
612 LadspaPlugin::parameter_is_input (uint32_t param
) const
614 return LADSPA_IS_PORT_INPUT(port_descriptor (param
));
618 LadspaPlugin::print_parameter (uint32_t param
, char *buf
, uint32_t len
) const
621 if (param
< parameter_count()) {
622 snprintf (buf
, len
, "%.3f", get_parameter (param
));
630 LadspaPlugin::run_in_place (nframes_t nframes
)
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
];
637 _descriptor
->run (_handle
, nframes
);
641 LadspaPlugin::latency_compute_run ()
643 if (!_latency_control_port
) {
647 /* we need to run the plugin so that it can set its latency
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
];
659 memset(buffer
,0,sizeof(LADSPA_Data
)*bufsize
);
661 /* Note that we've already required that plugins
662 be able to handle in-place processing.
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
);
672 } else if (LADSPA_IS_PORT_OUTPUT (port_descriptor (port_index
))) {
673 connect_port (port_index
, buffer
);
680 run_in_place (bufsize
);
685 LadspaPluginInfo::load (Session
& session
)
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 return PluginPtr ((Plugin
*) 0);
696 plugin
.reset (new LadspaPlugin (module
, session
.engine(), session
, index
, session
.frame_rate()));
699 plugin
->set_info(PluginInfoPtr(new LadspaPluginInfo(*this)));
703 catch (failed_constructor
&err
) {
704 return PluginPtr ((Plugin
*) 0);
708 LadspaPluginInfo::LadspaPluginInfo()
710 type
= ARDOUR::LADSPA
;