2
Copyright (C) 2000 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.
21
#include "libardour-config.h"
26
#include "pbd/failed_constructor.h"
27
#include "pbd/xml++.h"
28
#include "pbd/convert.h"
30
#include "ardour/audio_buffer.h"
31
#include "ardour/automation_list.h"
32
#include "ardour/buffer_set.h"
33
#include "ardour/debug.h"
34
#include "ardour/event_type_map.h"
35
#include "ardour/ladspa_plugin.h"
36
#include "ardour/plugin.h"
37
#include "ardour/plugin_insert.h"
40
#include "ardour/lv2_plugin.h"
43
#ifdef WINDOWS_VST_SUPPORT
44
#include "ardour/windows_vst_plugin.h"
48
#include "ardour/lxvst_plugin.h"
51
#ifdef AUDIOUNIT_SUPPORT
52
#include "ardour/audio_unit.h"
55
#include "ardour/session.h"
56
#include "ardour/types.h"
61
using namespace ARDOUR;
64
const string PluginInsert::port_automation_node_name = "PortAutomation";
66
PluginInsert::PluginInsert (Session& s, boost::shared_ptr<Plugin> plug)
67
: Processor (s, (plug ? plug->name() : string ("toBeRenamed")))
68
, _signal_analysis_collected_nframes(0)
69
, _signal_analysis_collect_nframes_max(0)
71
/* the first is the master */
75
create_automatable_parameters ();
80
PluginInsert::set_count (uint32_t num)
82
bool require_state = !_plugins.empty();
84
/* this is a bad idea.... we shouldn't do this while active.
85
only a route holding their redirect_lock should be calling this
90
} else if (num > _plugins.size()) {
91
uint32_t diff = num - _plugins.size();
93
for (uint32_t n = 0; n < diff; ++n) {
94
boost::shared_ptr<Plugin> p = plugin_factory (_plugins[0]);
101
/* XXX do something */
105
} else if (num < _plugins.size()) {
106
uint32_t diff = _plugins.size() - num;
107
for (uint32_t n= 0; n < diff; ++n) {
115
PluginInsert::~PluginInsert ()
120
PluginInsert::control_list_automation_state_changed (Evoral::Parameter which, AutoState s)
122
if (which.type() != PluginAutomation)
125
boost::shared_ptr<AutomationControl> c
126
= boost::dynamic_pointer_cast<AutomationControl>(control (which));
129
_plugins[0]->set_parameter (which.id(), c->list()->eval (_session.transport_frame()));
134
PluginInsert::output_streams() const
136
assert (!_plugins.empty());
138
PluginInfoPtr info = _plugins.front()->get_info();
140
if (info->reconfigurable_io()) {
141
ChanCount out = _plugins.front()->output_streams ();
142
// DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, reconfigur(able) output streams = %1\n", out));
145
ChanCount out = info->n_outputs;
146
// DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, static output streams = %1 for %2 plugins\n", out, _plugins.size()));
147
out.set_audio (out.n_audio() * _plugins.size());
148
out.set_midi (out.n_midi() * _plugins.size() + midi_bypass.n_midi());
154
PluginInsert::input_streams() const
156
assert (!_plugins.empty());
160
PluginInfoPtr info = _plugins.front()->get_info();
162
if (info->reconfigurable_io()) {
163
assert (_plugins.size() == 1);
164
in = _plugins.front()->input_streams();
169
DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, input streams = %1, match using %2\n", in, _match.method));
171
if (_match.method == Split) {
173
/* we are splitting 1 processor input to multiple plugin inputs,
174
so we have a maximum of 1 stream of each type.
176
for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
177
if (in.get (*t) > 1) {
183
} else if (_match.method == Hide) {
185
for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
186
in.set (*t, in.get (*t) - _match.hide.get (*t));
192
for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
193
in.set (*t, in.get (*t) * _plugins.size ());
201
PluginInsert::natural_output_streams() const
203
return _plugins[0]->get_info()->n_outputs;
207
PluginInsert::natural_input_streams() const
209
return _plugins[0]->get_info()->n_inputs;
213
PluginInsert::has_no_inputs() const
215
return _plugins[0]->get_info()->n_inputs == ChanCount::ZERO;
219
PluginInsert::has_no_audio_inputs() const
221
return _plugins[0]->get_info()->n_inputs.n_audio() == 0;
225
PluginInsert::is_midi_instrument() const
227
/* XXX more finesse is possible here. VST plugins have a
228
a specific "instrument" flag, for example.
230
PluginInfoPtr pi = _plugins[0]->get_info();
232
return pi->n_inputs.n_midi() != 0 &&
233
pi->n_outputs.n_audio() > 0;
237
PluginInsert::create_automatable_parameters ()
239
assert (!_plugins.empty());
241
set<Evoral::Parameter> a = _plugins.front()->automatable ();
243
Plugin::ParameterDescriptor desc;
245
for (set<Evoral::Parameter>::iterator i = a.begin(); i != a.end(); ++i) {
246
if (i->type() == PluginAutomation) {
248
Evoral::Parameter param(*i);
250
_plugins.front()->get_parameter_descriptor(i->id(), desc);
252
/* the Parameter belonging to the actual plugin doesn't have its range set
253
but we want the Controllable related to this Parameter to have those limits.
256
param.set_range (desc.lower, desc.upper, _plugins.front()->default_value(i->id()), desc.toggled);
257
can_automate (param);
258
boost::shared_ptr<AutomationList> list(new AutomationList(param));
259
add_control (boost::shared_ptr<AutomationControl> (new PluginControl(this, param, list)));
265
PluginInsert::parameter_changed (uint32_t which, float val)
267
boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, which));
272
Plugins::iterator i = _plugins.begin();
274
/* don't set the first plugin, just all the slaves */
276
if (i != _plugins.end()) {
278
for (; i != _plugins.end(); ++i) {
279
(*i)->set_parameter (which, val);
286
PluginInsert::set_block_size (pframes_t nframes)
289
for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
290
if ((*i)->set_block_size (nframes) != 0) {
298
PluginInsert::activate ()
300
for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
304
Processor::activate ();
308
PluginInsert::deactivate ()
310
Processor::deactivate ();
312
for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
318
PluginInsert::flush ()
320
for (vector<boost::shared_ptr<Plugin> >::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
326
PluginInsert::connect_and_run (BufferSet& bufs, pframes_t nframes, framecnt_t offset, bool with_auto, framepos_t now)
328
// Calculate if, and how many frames we need to collect for analysis
329
framecnt_t collect_signal_nframes = (_signal_analysis_collect_nframes_max -
330
_signal_analysis_collected_nframes);
331
if (nframes < collect_signal_nframes) { // we might not get all frames now
332
collect_signal_nframes = nframes;
335
ChanCount const in_streams = input_streams ();
336
ChanCount const out_streams = output_streams ();
338
ChanMapping in_map (in_streams);
339
ChanMapping out_map (out_streams);
341
if (_match.method == Split) {
342
/* fix the input mapping so that we have maps for each of the plugin's inputs */
343
in_map = ChanMapping (natural_input_streams ());
345
/* copy the first stream's buffer contents to the others */
346
/* XXX: audio only */
347
uint32_t first_idx = in_map.get (DataType::AUDIO, 0, &valid);
349
Sample const * mono = bufs.get_audio (first_idx).data (offset);
350
for (uint32_t i = in_streams.n_audio(); i < natural_input_streams().n_audio(); ++i) {
351
memcpy (bufs.get_audio (in_map.get (DataType::AUDIO, i, &valid)).data (offset), mono, sizeof (Sample) * nframes);
356
/* Note that we've already required that plugins
357
be able to handle in-place processing.
364
for (Controls::iterator li = controls().begin(); li != controls().end(); ++li, ++n) {
366
boost::shared_ptr<AutomationControl> c
367
= boost::dynamic_pointer_cast<AutomationControl>(li->second);
369
if (c->parameter().type() == PluginAutomation && c->automation_playback()) {
372
const float val = c->list()->rt_safe_eval (now, valid);
382
if (collect_signal_nframes > 0) {
384
//std::cerr << "collect input, bufs " << bufs.count().n_audio() << " count, " << bufs.available().n_audio() << " available" << std::endl;
385
//std::cerr << " streams " << input_streams().n_audio() << std::endl;
386
//std::cerr << "filling buffer with " << collect_signal_nframes << " frames at " << _signal_analysis_collected_nframes << std::endl;
388
_signal_analysis_inputs.set_count(input_streams());
390
for (uint32_t i = 0; i < input_streams().n_audio(); ++i) {
391
_signal_analysis_inputs.get_audio(i).read_from(
393
collect_signal_nframes,
394
_signal_analysis_collected_nframes); // offset is for target buffer
399
for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
400
(*i)->connect_and_run(bufs, in_map, out_map, nframes, offset);
401
for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
402
in_map.offset_to(*t, natural_input_streams().get(*t));
403
out_map.offset_to(*t, natural_output_streams().get(*t));
407
if (collect_signal_nframes > 0) {
409
//std::cerr << " output, bufs " << bufs.count().n_audio() << " count, " << bufs.available().n_audio() << " available" << std::endl;
410
//std::cerr << " streams " << output_streams().n_audio() << std::endl;
412
_signal_analysis_outputs.set_count(output_streams());
414
for (uint32_t i = 0; i < output_streams().n_audio(); ++i) {
415
_signal_analysis_outputs.get_audio(i).read_from(
417
collect_signal_nframes,
418
_signal_analysis_collected_nframes); // offset is for target buffer
421
_signal_analysis_collected_nframes += collect_signal_nframes;
422
assert(_signal_analysis_collected_nframes <= _signal_analysis_collect_nframes_max);
424
if (_signal_analysis_collected_nframes == _signal_analysis_collect_nframes_max) {
425
_signal_analysis_collect_nframes_max = 0;
426
_signal_analysis_collected_nframes = 0;
428
AnalysisDataGathered(&_signal_analysis_inputs,
429
&_signal_analysis_outputs);
432
/* leave remaining channel buffers alone */
436
PluginInsert::silence (framecnt_t nframes)
442
ChanMapping in_map(input_streams());
443
ChanMapping out_map(output_streams());
445
if (_match.method == Split) {
446
/* fix the input mapping so that we have maps for each of the plugin's inputs */
447
in_map = ChanMapping (natural_input_streams ());
450
for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
451
(*i)->connect_and_run (_session.get_scratch_buffers ((*i)->get_info()->n_inputs, true), in_map, out_map, nframes, 0);
456
PluginInsert::run (BufferSet& bufs, framepos_t /*start_frame*/, framepos_t /*end_frame*/, pframes_t nframes, bool)
458
if (_pending_active) {
459
/* run as normal if we are active or moving from inactive to active */
461
if (_session.transport_rolling()) {
462
automation_run (bufs, nframes);
464
connect_and_run (bufs, nframes, 0, false);
468
if (has_no_audio_inputs()) {
470
/* silence all (audio) outputs. Should really declick
471
* at the transitions of "active"
474
uint32_t out = output_streams().n_audio ();
476
for (uint32_t n = 0; n < out; ++n) {
477
bufs.get_audio (n).silence (nframes);
480
bufs.count().set_audio (out);
484
/* does this need to be done with MIDI? it appears not */
486
uint32_t in = input_streams ().n_audio ();
487
uint32_t out = output_streams().n_audio ();
491
/* not active, but something has make up for any channel count increase */
493
for (uint32_t n = out - in; n < out; ++n) {
494
memcpy (bufs.get_audio (n).data(), bufs.get_audio(in - 1).data(), sizeof (Sample) * nframes);
498
bufs.count().set_audio (out);
502
_active = _pending_active;
504
/* we have no idea whether the plugin generated silence or not, so mark
505
* all buffers appropriately.
508
bufs.set_is_silent (false);
512
PluginInsert::set_parameter (Evoral::Parameter param, float val)
514
if (param.type() != PluginAutomation) {
518
/* the others will be set from the event triggered by this */
520
_plugins[0]->set_parameter (param.id(), val);
522
boost::shared_ptr<AutomationControl> ac
523
= boost::dynamic_pointer_cast<AutomationControl>(control(param));
528
warning << "set_parameter called for nonexistant parameter "
529
<< EventTypeMap::instance().to_symbol(param) << endmsg;
532
_session.set_dirty();
536
PluginInsert::get_parameter (Evoral::Parameter param)
538
if (param.type() != PluginAutomation) {
541
assert (!_plugins.empty ());
542
return _plugins[0]->get_parameter (param.id());
547
PluginInsert::automation_run (BufferSet& bufs, pframes_t nframes)
549
Evoral::ControlEvent next_event (0, 0.0f);
550
framepos_t now = _session.transport_frame ();
551
framepos_t end = now + nframes;
552
framecnt_t offset = 0;
554
Glib::Threads::Mutex::Lock lm (control_lock(), Glib::Threads::TRY_LOCK);
557
connect_and_run (bufs, nframes, offset, false);
561
if (!find_next_event (now, end, next_event) || requires_fixed_sized_buffers()) {
563
/* no events have a time within the relevant range */
565
connect_and_run (bufs, nframes, offset, true, now);
571
framecnt_t cnt = min (((framecnt_t) ceil (next_event.when) - now), (framecnt_t) nframes);
573
connect_and_run (bufs, cnt, offset, true, now);
579
if (!find_next_event (now, end, next_event)) {
584
/* cleanup anything that is left to do */
587
connect_and_run (bufs, nframes, offset, true, now);
592
PluginInsert::default_parameter_value (const Evoral::Parameter& param)
594
if (param.type() != PluginAutomation)
597
if (_plugins.empty()) {
598
fatal << _("programming error: ") << X_("PluginInsert::default_parameter_value() called with no plugin")
603
return _plugins[0]->default_value (param.id());
606
boost::shared_ptr<Plugin>
607
PluginInsert::plugin_factory (boost::shared_ptr<Plugin> other)
609
boost::shared_ptr<LadspaPlugin> lp;
611
boost::shared_ptr<LV2Plugin> lv2p;
613
#ifdef WINDOWS_VST_SUPPORT
614
boost::shared_ptr<WindowsVSTPlugin> vp;
617
boost::shared_ptr<LXVSTPlugin> lxvp;
619
#ifdef AUDIOUNIT_SUPPORT
620
boost::shared_ptr<AUPlugin> ap;
623
if ((lp = boost::dynamic_pointer_cast<LadspaPlugin> (other)) != 0) {
624
return boost::shared_ptr<Plugin> (new LadspaPlugin (*lp));
626
} else if ((lv2p = boost::dynamic_pointer_cast<LV2Plugin> (other)) != 0) {
627
return boost::shared_ptr<Plugin> (new LV2Plugin (*lv2p));
629
#ifdef WINDOWS_VST_SUPPORT
630
} else if ((vp = boost::dynamic_pointer_cast<WindowsVSTPlugin> (other)) != 0) {
631
return boost::shared_ptr<Plugin> (new WindowsVSTPlugin (*vp));
634
} else if ((lxvp = boost::dynamic_pointer_cast<LXVSTPlugin> (other)) != 0) {
635
return boost::shared_ptr<Plugin> (new LXVSTPlugin (*lxvp));
637
#ifdef AUDIOUNIT_SUPPORT
638
} else if ((ap = boost::dynamic_pointer_cast<AUPlugin> (other)) != 0) {
639
return boost::shared_ptr<Plugin> (new AUPlugin (*ap));
643
fatal << string_compose (_("programming error: %1"),
644
X_("unknown plugin type in PluginInsert::plugin_factory"))
647
return boost::shared_ptr<Plugin> ((Plugin*) 0);
651
PluginInsert::configure_io (ChanCount in, ChanCount out)
653
Match old_match = _match;
655
/* set the matching method and number of plugins that we will use to meet this configuration */
656
_match = private_can_support_io_configuration (in, out);
657
if (set_count (_match.plugins) == false) {
661
/* a signal needs emitting if we start or stop splitting */
662
if (old_match.method != _match.method && (old_match.method == Split || _match.method == Split)) {
663
SplittingChanged (); /* EMIT SIGNAL */
666
/* configure plugins */
667
switch (_match.method) {
670
if (_plugins.front()->configure_io (_plugins.front()->get_info()->n_inputs, out)) {
676
if (_plugins.front()->configure_io (in, out) == false) {
682
// we don't know the analysis window size, so we must work with the
683
// current buffer size here. each request for data fills in these
684
// buffers and the analyser makes sure it gets enough data for the
686
session().ensure_buffer_set (_signal_analysis_inputs, in);
687
//_signal_analysis_inputs.set_count (in);
689
session().ensure_buffer_set (_signal_analysis_outputs, out);
690
//_signal_analysis_outputs.set_count (out);
692
// std::cerr << "set counts to i" << in.n_audio() << "/o" << out.n_audio() << std::endl;
694
return Processor::configure_io (in, out);
697
/** Decide whether this PluginInsert can support a given IO configuration.
698
* To do this, we run through a set of possible solutions in rough order of
701
* @param in Required input channel count.
702
* @param out Filled in with the output channel count if we return true.
703
* @return true if the given IO configuration can be supported.
706
PluginInsert::can_support_io_configuration (const ChanCount& in, ChanCount& out)
708
return private_can_support_io_configuration (in, out).method != Impossible;
711
/** A private version of can_support_io_configuration which returns the method
712
* by which the configuration can be matched, rather than just whether or not
716
PluginInsert::private_can_support_io_configuration (ChanCount const & inx, ChanCount& out)
718
PluginInfoPtr info = _plugins.front()->get_info();
719
ChanCount in; in += inx;
722
if (info->reconfigurable_io()) {
723
/* Plugin has flexible I/O, so delegate to it */
724
bool const r = _plugins.front()->can_support_io_configuration (in, out);
726
return Match (Impossible, 0);
729
return Match (Delegate, 1);
732
ChanCount inputs = info->n_inputs;
733
ChanCount outputs = info->n_outputs;
735
if (in.get(DataType::MIDI) == 1 && outputs.get(DataType::MIDI) == 0) {
736
DEBUG_TRACE ( DEBUG::Processors, string_compose ("bypassing midi-data around %1\n", name()));
737
midi_bypass.set(DataType::MIDI, 1);
739
if (in.get(DataType::MIDI) == 1 && inputs.get(DataType::MIDI) == 0) {
740
DEBUG_TRACE ( DEBUG::Processors, string_compose ("hiding midi-port from plugin %1\n", name()));
741
in.set(DataType::MIDI, 0);
744
bool no_inputs = true;
745
for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
746
if (inputs.get (*t) != 0) {
753
/* no inputs so we can take any input configuration since we throw it away */
754
out = outputs + midi_bypass;
755
return Match (NoInputs, 1);
758
/* Plugin inputs match requested inputs exactly */
760
out = outputs + midi_bypass;
761
return Match (ExactMatch, 1);
764
/* We may be able to run more than one copy of the plugin within this insert
765
to cope with the insert having more inputs than the plugin.
766
We allow replication only for plugins with either zero or 1 inputs and outputs
767
for every valid data type.
771
bool can_replicate = true;
772
for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
774
uint32_t nin = inputs.get (*t);
776
// No inputs of this type
777
if (nin == 0 && in.get(*t) == 0) {
781
if (nin != 1 || outputs.get (*t) != 1) {
782
can_replicate = false;
786
// Potential factor not set yet
788
f = in.get(*t) / nin;
791
// Factor for this type does not match another type, can not replicate
792
if (f != (in.get(*t) / nin)) {
793
can_replicate = false;
799
for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
800
out.set (*t, outputs.get(*t) * f);
803
return Match (Replicate, f);
806
/* If the processor has exactly one input of a given type, and
807
the plugin has more, we can feed the single processor input
808
to some or all of the plugin inputs. This is rather
809
special-case-y, but the 1-to-many case is by far the
810
simplest. How do I split thy 2 processor inputs to 3
811
plugin inputs? Let me count the ways ...
814
bool can_split = true;
815
for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
817
bool const can_split_type = (in.get (*t) == 1 && inputs.get (*t) > 1);
818
bool const nothing_to_do_for_type = (in.get (*t) == 0 && inputs.get (*t) == 0);
820
if (!can_split_type && !nothing_to_do_for_type) {
826
out = outputs + midi_bypass;
827
return Match (Split, 1);
830
/* If the plugin has more inputs than we want, we can `hide' some of them
831
by feeding them silence.
834
bool could_hide = false;
835
bool cannot_hide = false;
836
ChanCount hide_channels;
838
for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
839
if (inputs.get(*t) > in.get(*t)) {
840
/* there is potential to hide, since the plugin has more inputs of type t than the insert */
841
hide_channels.set (*t, inputs.get(*t) - in.get(*t));
843
} else if (inputs.get(*t) < in.get(*t)) {
844
/* we definitely cannot hide, since the plugin has fewer inputs of type t than the insert */
849
if (could_hide && !cannot_hide) {
850
out = outputs + midi_bypass;
851
return Match (Hide, 1, hide_channels);
855
return Match (Impossible, 0);
859
PluginInsert::get_state ()
865
PluginInsert::state (bool full)
867
XMLNode& node = Processor::state (full);
869
node.add_property("type", _plugins[0]->state_node_name());
870
node.add_property("unique-id", _plugins[0]->unique_id());
871
node.add_property("count", string_compose("%1", _plugins.size()));
872
node.add_child_nocopy (_plugins[0]->get_state());
874
for (Controls::iterator c = controls().begin(); c != controls().end(); ++c) {
875
boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> ((*c).second);
877
node.add_child_nocopy (ac->get_state());
885
PluginInsert::set_control_ids (const XMLNode& node, int version)
887
const XMLNodeList& nlist = node.children();
888
XMLNodeConstIterator iter;
889
set<Evoral::Parameter>::const_iterator p;
891
for (iter = nlist.begin(); iter != nlist.end(); ++iter) {
892
if ((*iter)->name() == Controllable::xml_node_name) {
893
const XMLProperty* prop;
895
if ((prop = (*iter)->property (X_("parameter"))) != 0) {
896
uint32_t p = atoi (prop->value());
898
/* this may create the new controllable */
900
boost::shared_ptr<Evoral::Control> c = control (Evoral::Parameter (PluginAutomation, 0, p));
902
#ifndef NO_PLUGIN_STATE
906
boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> (c);
908
ac->set_state (**iter, version);
917
PluginInsert::set_state(const XMLNode& node, int version)
919
XMLNodeList nlist = node.children();
920
XMLNodeIterator niter;
921
XMLPropertyList plist;
922
const XMLProperty *prop;
923
ARDOUR::PluginType type;
925
if ((prop = node.property ("type")) == 0) {
926
error << _("XML node describing plugin is missing the `type' field") << endmsg;
930
if (prop->value() == X_("ladspa") || prop->value() == X_("Ladspa")) { /* handle old school sessions */
931
type = ARDOUR::LADSPA;
932
} else if (prop->value() == X_("lv2")) {
934
} else if (prop->value() == X_("windows-vst")) {
935
type = ARDOUR::Windows_VST;
936
} else if (prop->value() == X_("lxvst")) {
937
type = ARDOUR::LXVST;
938
} else if (prop->value() == X_("audiounit")) {
939
type = ARDOUR::AudioUnit;
941
error << string_compose (_("unknown plugin type %1 in plugin insert state"),
947
prop = node.property ("unique-id");
950
#ifdef WINDOWS_VST_SUPPORT
951
/* older sessions contain VST plugins with only an "id" field.
954
if (type == ARDOUR::Windows_VST) {
955
prop = node.property ("id");
960
/*There shouldn't be any older sessions with linuxVST support.. but anyway..*/
962
if (type == ARDOUR::LXVST) {
963
prop = node.property ("id");
969
error << _("Plugin has no unique ID field") << endmsg;
974
boost::shared_ptr<Plugin> plugin = find_plugin (_session, prop->value(), type);
977
error << string_compose(
978
_("Found a reference to a plugin (\"%1\") that is unknown.\n"
979
"Perhaps it was removed or moved since it was last used."),
985
// The name of the PluginInsert comes from the plugin, nothing else
986
_name = plugin->get_info()->name;
990
// Processor::set_state() will set this, but too late
991
// for it to be available when setting up plugin
992
// state. We can't call Processor::set_state() until
993
// the plugins themselves are created and added.
997
if (_plugins.empty()) {
998
/* if we are adding the first plugin, we will need to set
999
up automatable controls.
1001
add_plugin (plugin);
1002
create_automatable_parameters ();
1003
set_control_ids (node, version);
1006
if ((prop = node.property ("count")) != 0) {
1007
sscanf (prop->value().c_str(), "%u", &count);
1010
if (_plugins.size() != count) {
1011
for (uint32_t n = 1; n < count; ++n) {
1012
add_plugin (plugin_factory (plugin));
1016
Processor::set_state (node, version);
1018
for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1020
/* find the node with the type-specific node name ("lv2", "ladspa", etc)
1021
and set all plugins to the same state.
1024
if ((*niter)->name() == plugin->state_node_name()) {
1026
plugin->set_state (**niter, version);
1028
for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1029
(*i)->set_state (**niter, version);
1036
if (version < 3000) {
1038
/* Only 2.X sessions need a call to set_parameter_state() - in 3.X and above
1039
this is all handled by Automatable
1042
for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1043
if ((*niter)->name() == "Redirect") {
1044
/* XXX do we need to tackle placement? i think not (pd; oct 16 2009) */
1045
Processor::set_state (**niter, version);
1050
set_parameter_state_2X (node, version);
1053
for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1057
(*i)->deactivate ();
1065
PluginInsert::set_parameter_state_2X (const XMLNode& node, int version)
1067
XMLNodeList nlist = node.children();
1068
XMLNodeIterator niter;
1070
/* look for port automation node */
1072
for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
1074
if ((*niter)->name() != port_automation_node_name) {
1080
XMLNodeConstIterator iter;
1085
cnodes = (*niter)->children ("port");
1087
for (iter = cnodes.begin(); iter != cnodes.end(); ++iter){
1091
if ((cprop = child->property("number")) != 0) {
1092
port = cprop->value().c_str();
1094
warning << _("PluginInsert: Auto: no ladspa port number") << endmsg;
1098
sscanf (port, "%" PRIu32, &port_id);
1100
if (port_id >= _plugins[0]->parameter_count()) {
1101
warning << _("PluginInsert: Auto: port id out of range") << endmsg;
1105
boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(
1106
control(Evoral::Parameter(PluginAutomation, 0, port_id), true));
1109
if (!child->children().empty()) {
1110
c->alist()->set_state (*child->children().front(), version);
1112
/* In some cases 2.X saves lists with min_yval and max_yval
1113
being FLT_MIN and FLT_MAX respectively. This causes problems
1114
in A3 because these min/max values are used to compute
1115
where GUI control points should be drawn. If we see such
1116
values, `correct' them to the min/max of the appropriate
1120
float min_y = c->alist()->get_min_y ();
1121
float max_y = c->alist()->get_max_y ();
1123
Plugin::ParameterDescriptor desc;
1124
_plugins.front()->get_parameter_descriptor (port_id, desc);
1126
if (min_y == FLT_MIN) {
1130
if (max_y == FLT_MAX) {
1134
c->alist()->set_yrange (min_y, max_y);
1137
error << string_compose (_("PluginInsert: automatable control %1 not found - ignored"), port_id) << endmsg;
1149
PluginInsert::describe_parameter (Evoral::Parameter param)
1151
if (param.type() != PluginAutomation) {
1152
return Automatable::describe_parameter(param);
1155
return _plugins[0]->describe_parameter (param);
1159
PluginInsert::signal_latency() const
1161
if (_user_latency) {
1162
return _user_latency;
1165
return _plugins[0]->signal_latency ();
1169
PluginInsert::type ()
1171
return plugin()->get_info()->type;
1174
PluginInsert::PluginControl::PluginControl (PluginInsert* p, const Evoral::Parameter ¶m, boost::shared_ptr<AutomationList> list)
1175
: AutomationControl (p->session(), param, list, p->describe_parameter(param))
1178
Plugin::ParameterDescriptor desc;
1179
boost::shared_ptr<Plugin> plugin = p->plugin (0);
1181
alist()->reset_default (plugin->default_value (param.id()));
1183
plugin->get_parameter_descriptor (param.id(), desc);
1184
_logarithmic = desc.logarithmic;
1185
_sr_dependent = desc.sr_dependent;
1186
_toggled = desc.toggled;
1189
/** @param val `user' value */
1191
PluginInsert::PluginControl::set_value (double user_val)
1193
/* FIXME: probably should be taking out some lock here.. */
1195
for (Plugins::iterator i = _plugin->_plugins.begin(); i != _plugin->_plugins.end(); ++i) {
1196
(*i)->set_parameter (_list->parameter().id(), user_val);
1199
boost::shared_ptr<Plugin> iasp = _plugin->_impulseAnalysisPlugin.lock();
1201
iasp->set_parameter (_list->parameter().id(), user_val);
1204
AutomationControl::set_value (user_val);
1208
PluginInsert::PluginControl::internal_to_interface (double val) const
1222
PluginInsert::PluginControl::interface_to_internal (double val) const
1232
PluginInsert::PluginControl::get_state ()
1236
XMLNode& node (AutomationControl::get_state());
1237
ss << parameter().id();
1238
node.add_property (X_("parameter"), ss.str());
1243
/** @return `user' val */
1245
PluginInsert::PluginControl::get_value () const
1247
/* FIXME: probably should be taking out some lock here.. */
1248
return _plugin->get_parameter (_list->parameter());
1251
boost::shared_ptr<Plugin>
1252
PluginInsert::get_impulse_analysis_plugin()
1254
boost::shared_ptr<Plugin> ret;
1255
if (_impulseAnalysisPlugin.expired()) {
1256
ret = plugin_factory(_plugins[0]);
1257
_impulseAnalysisPlugin = ret;
1259
ret = _impulseAnalysisPlugin.lock();
1266
PluginInsert::collect_signal_for_analysis (framecnt_t nframes)
1268
// called from outside the audio thread, so this should be safe
1269
// only do audio as analysis is (currently) only for audio plugins
1270
_signal_analysis_inputs.ensure_buffers( DataType::AUDIO, input_streams().n_audio(), nframes);
1271
_signal_analysis_outputs.ensure_buffers( DataType::AUDIO, output_streams().n_audio(), nframes);
1273
_signal_analysis_collected_nframes = 0;
1274
_signal_analysis_collect_nframes_max = nframes;
1277
/** Add a plugin to our list */
1279
PluginInsert::add_plugin (boost::shared_ptr<Plugin> plugin)
1281
plugin->set_insert_info (this);
1283
if (_plugins.empty()) {
1284
/* first (and probably only) plugin instance - connect to relevant signals
1287
plugin->ParameterChanged.connect_same_thread (*this, boost::bind (&PluginInsert::parameter_changed, this, _1, _2));
1288
plugin->StartTouch.connect_same_thread (*this, boost::bind (&PluginInsert::start_touch, this, _1));
1289
plugin->EndTouch.connect_same_thread (*this, boost::bind (&PluginInsert::end_touch, this, _1));
1292
_plugins.push_back (plugin);
1296
PluginInsert::realtime_handle_transport_stopped ()
1298
for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1299
(*i)->realtime_handle_transport_stopped ();
1304
PluginInsert::realtime_locate ()
1306
for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1307
(*i)->realtime_locate ();
1312
PluginInsert::monitoring_changed ()
1314
for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1315
(*i)->monitoring_changed ();
1320
PluginInsert::start_touch (uint32_t param_id)
1322
boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id));
1324
ac->start_touch (session().audible_frame());
1329
PluginInsert::end_touch (uint32_t param_id)
1331
boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id));
1333
ac->stop_touch (true, session().audible_frame());