d7ae4da711fd1ce9a71f026b6b686d699617fc11
[ardour.git] / libs / ardour / plugin_insert.cc
1 /*
2     Copyright (C) 2000 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 <string>
25
26 #include "pbd/failed_constructor.h"
27 #include "pbd/xml++.h"
28 #include "pbd/types_convert.h"
29
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/luaproc.h"
37 #include "ardour/plugin.h"
38 #include "ardour/plugin_insert.h"
39 #include "ardour/port.h"
40
41 #ifdef LV2_SUPPORT
42 #include "ardour/lv2_plugin.h"
43 #endif
44
45 #ifdef WINDOWS_VST_SUPPORT
46 #include "ardour/windows_vst_plugin.h"
47 #endif
48
49 #ifdef LXVST_SUPPORT
50 #include "ardour/lxvst_plugin.h"
51 #endif
52
53 #ifdef MACVST_SUPPORT
54 #include "ardour/mac_vst_plugin.h"
55 #endif
56
57 #ifdef AUDIOUNIT_SUPPORT
58 #include "ardour/audio_unit.h"
59 #endif
60
61 #include "ardour/session.h"
62 #include "ardour/types.h"
63
64 #include "pbd/i18n.h"
65
66 using namespace std;
67 using namespace ARDOUR;
68 using namespace PBD;
69
70 const string PluginInsert::port_automation_node_name = "PortAutomation";
71
72 PluginInsert::PluginInsert (Session& s, boost::shared_ptr<Plugin> plug)
73         : Processor (s, (plug ? plug->name() : string ("toBeRenamed")))
74         , _sc_playback_latency (0)
75         , _sc_capture_latency (0)
76         , _plugin_signal_latency (0)
77         , _signal_analysis_collected_nframes(0)
78         , _signal_analysis_collect_nframes_max(0)
79         , _configured (false)
80         , _no_inplace (false)
81         , _strict_io (false)
82         , _custom_cfg (false)
83         , _maps_from_state (false)
84         , _latency_changed (false)
85         , _bypass_port (UINT32_MAX)
86         , _stat_reset (0)
87 {
88         /* the first is the master */
89
90         if (plug) {
91                 add_plugin (plug);
92                 create_automatable_parameters ();
93                 const ChanCount& sc (sidechain_input_pins ());
94                 if (sc.n_audio () > 0 || sc.n_midi () > 0) {
95                         add_sidechain (sc.n_audio (), sc.n_midi ());
96                 }
97         }
98 }
99
100 PluginInsert::~PluginInsert ()
101 {
102         for (CtrlOutMap::const_iterator i = _control_outputs.begin(); i != _control_outputs.end(); ++i) {
103                 boost::dynamic_pointer_cast<ReadOnlyControl>(i->second)->drop_references ();
104         }
105 }
106
107 void
108 PluginInsert::set_strict_io (bool b)
109 {
110         bool changed = _strict_io != b;
111         _strict_io = b;
112         if (changed) {
113                 PluginConfigChanged (); /* EMIT SIGNAL */
114         }
115 }
116
117 bool
118 PluginInsert::set_count (uint32_t num)
119 {
120         bool require_state = !_plugins.empty();
121
122         if (require_state && num > 1 && plugin (0)->get_info ()->type == ARDOUR::AudioUnit) {
123                 // we don't allow to replicate AUs
124                 return false;
125         }
126
127         /* this is a bad idea.... we shouldn't do this while active.
128          * only a route holding their redirect_lock should be calling this
129          */
130
131         if (num == 0) {
132                 return false;
133         } else if (num > _plugins.size()) {
134                 uint32_t diff = num - _plugins.size();
135
136                 for (uint32_t n = 0; n < diff; ++n) {
137                         boost::shared_ptr<Plugin> p = plugin_factory (_plugins[0]);
138                         add_plugin (p);
139
140                         if (require_state) {
141                                 XMLNode& state = _plugins[0]->get_state ();
142                                 p->set_state (state, Stateful::loading_state_version);
143                         }
144
145                         if (active ()) {
146                                 p->activate ();
147                         }
148                 }
149                 PluginConfigChanged (); /* EMIT SIGNAL */
150
151         } else if (num < _plugins.size()) {
152                 uint32_t diff = _plugins.size() - num;
153                 for (uint32_t n= 0; n < diff; ++n) {
154                         _plugins.pop_back();
155                 }
156                 PluginConfigChanged (); /* EMIT SIGNAL */
157         }
158
159         return true;
160 }
161
162
163 void
164 PluginInsert::set_sinks (const ChanCount& c)
165 {
166         _custom_sinks = c;
167         /* no signal, change will only be visible after re-config */
168 }
169
170 void
171 PluginInsert::set_outputs (const ChanCount& c)
172 {
173         bool changed = (_custom_out != c) && _custom_cfg;
174         _custom_out = c;
175         if (changed) {
176                 PluginConfigChanged (); /* EMIT SIGNAL */
177         }
178 }
179
180 void
181 PluginInsert::set_custom_cfg (bool b)
182 {
183         bool changed = _custom_cfg != b;
184         _custom_cfg = b;
185         if (changed) {
186                 PluginConfigChanged (); /* EMIT SIGNAL */
187         }
188 }
189
190 bool
191 PluginInsert::set_preset_out (const ChanCount& c)
192 {
193         bool changed = _preset_out != c;
194         _preset_out = c;
195         if (changed && !_custom_cfg) {
196                 PluginConfigChanged (); /* EMIT SIGNAL */
197         }
198         return changed;
199 }
200
201 bool
202 PluginInsert::add_sidechain (uint32_t n_audio, uint32_t n_midi)
203 {
204         // caller must hold process lock
205         if (_sidechain) {
206                 return false;
207         }
208         std::ostringstream n;
209         if (n_audio == 0 && n_midi == 0) {
210                 n << "TO BE RESET FROM XML";
211         } else if (owner()) {
212                 n << "SC " << owner()->name() << "/" << name() << " " << Session::next_name_id ();
213         } else {
214                 n << "tobeRenamed";
215         }
216         SideChain *sc = new SideChain (_session, n.str ());
217         _sidechain = boost::shared_ptr<SideChain> (sc);
218         _sidechain->activate ();
219         for (uint32_t n = 0; n < n_audio; ++n) {
220                 _sidechain->input()->add_port ("", owner(), DataType::AUDIO); // add a port, don't connect.
221         }
222         for (uint32_t n = 0; n < n_midi; ++n) {
223                 _sidechain->input()->add_port ("", owner(), DataType::MIDI); // add a port, don't connect.
224         }
225         PluginConfigChanged (); /* EMIT SIGNAL */
226         return true;
227 }
228
229 bool
230 PluginInsert::del_sidechain ()
231 {
232         if (!_sidechain) {
233                 return false;
234         }
235         _sidechain.reset ();
236         _sc_playback_latency = 0;
237         _sc_capture_latency = 0;
238         PluginConfigChanged (); /* EMIT SIGNAL */
239         return true;
240 }
241
242 void
243 PluginInsert::update_sidechain_name ()
244 {
245         if (!_sidechain) {
246                 return;
247         }
248
249         std::ostringstream n;
250
251         n << "SC ";
252         if (owner()) {
253                 n << owner()->name() << "/";
254         }
255
256         n << name() << " " << Session::next_name_id ();
257
258         _sidechain->set_name (n.str());
259 }
260
261 void
262 PluginInsert::control_list_automation_state_changed (Evoral::Parameter which, AutoState s)
263 {
264         if (which.type() != PluginAutomation)
265                 return;
266
267         boost::shared_ptr<AutomationControl> c
268                         = boost::dynamic_pointer_cast<AutomationControl>(control (which));
269
270         if (c && s != Off) {
271                 _plugins[0]->set_parameter (which.id(), c->list()->eval (_session.transport_sample()));
272         }
273 }
274
275 ChanCount
276 PluginInsert::output_streams() const
277 {
278         assert (_configured);
279         return _configured_out;
280 }
281
282 ChanCount
283 PluginInsert::input_streams() const
284 {
285         assert (_configured);
286         return _configured_in;
287 }
288
289 ChanCount
290 PluginInsert::internal_streams() const
291 {
292         assert (_configured);
293         return _configured_internal;
294 }
295
296 ChanCount
297 PluginInsert::internal_output_streams() const
298 {
299         assert (!_plugins.empty());
300
301         PluginInfoPtr info = _plugins.front()->get_info();
302
303         if (info->reconfigurable_io()) {
304                 ChanCount out = _plugins.front()->output_streams ();
305                 // DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, reconfigur(able) output streams = %1\n", out));
306                 return out;
307         } else {
308                 ChanCount out = info->n_outputs;
309                 // DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, static output streams = %1 for %2 plugins\n", out, _plugins.size()));
310                 out.set_audio (out.n_audio() * _plugins.size());
311                 out.set_midi (out.n_midi() * _plugins.size());
312                 return out;
313         }
314 }
315
316 ChanCount
317 PluginInsert::internal_input_streams() const
318 {
319         assert (!_plugins.empty());
320
321         ChanCount in;
322
323         PluginInfoPtr info = _plugins.front()->get_info();
324
325         if (info->reconfigurable_io()) {
326                 in = _plugins.front()->input_streams();
327         } else {
328                 in = info->n_inputs;
329         }
330
331         DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, input streams = %1, match using %2\n", in, _match.method));
332
333         if (_match.method == Split) {
334
335                 /* we are splitting 1 processor input to multiple plugin inputs,
336                    so we have a maximum of 1 stream of each type.
337                 */
338                 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
339                         if (in.get (*t) > 1) {
340                                 in.set (*t, 1);
341                         }
342                 }
343                 return in;
344
345         } else if (_match.method == Hide) {
346
347                 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
348                         in.set (*t, in.get (*t) - _match.hide.get (*t));
349                 }
350                 return in;
351
352         } else {
353
354                 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
355                         in.set (*t, in.get (*t) * _plugins.size ());
356                 }
357
358                 return in;
359         }
360 }
361
362 ChanCount
363 PluginInsert::natural_output_streams() const
364 {
365 #ifdef MIXBUS
366         if (is_channelstrip ()) {
367                 return ChanCount::min (_configured_out, ChanCount (DataType::AUDIO, 2));
368         }
369 #endif
370         return _plugins[0]->get_info()->n_outputs;
371 }
372
373 ChanCount
374 PluginInsert::natural_input_streams() const
375 {
376 #ifdef MIXBUS
377         if (is_channelstrip ()) {
378                 return ChanCount::min (_configured_in, ChanCount (DataType::AUDIO, 2));
379         }
380 #endif
381         return _plugins[0]->get_info()->n_inputs;
382 }
383
384 ChanCount
385 PluginInsert::sidechain_input_pins() const
386 {
387         return _cached_sidechain_pins;
388 }
389
390 bool
391 PluginInsert::has_no_inputs() const
392 {
393         return _plugins[0]->get_info()->n_inputs == ChanCount::ZERO;
394 }
395
396 bool
397 PluginInsert::has_no_audio_inputs() const
398 {
399         return _plugins[0]->get_info()->n_inputs.n_audio() == 0;
400 }
401
402 samplecnt_t
403 PluginInsert::plugin_latency () const {
404         return _plugins.front()->signal_latency ();
405 }
406
407 bool
408 PluginInsert::is_instrument() const
409 {
410         PluginInfoPtr pip = _plugins[0]->get_info();
411         return (pip->is_instrument ());
412 }
413
414 bool
415 PluginInsert::has_output_presets (ChanCount in, ChanCount out)
416 {
417         if (!_configured && _plugins[0]->get_info ()->reconfigurable_io ()) {
418                 // collect possible configurations, prefer given in/out
419                 _plugins[0]->can_support_io_configuration (in, out);
420         }
421
422         PluginOutputConfiguration ppc (_plugins[0]->possible_output ());
423
424         if (ppc.size () == 0) {
425                 return false;
426         }
427         if (!strict_io () && ppc.size () == 1) {
428                 return false;
429         }
430
431         if (strict_io () && ppc.size () == 1) {
432                 // "stereo" is currently preferred default for instruments
433                 if (ppc.find (2) != ppc.end ()) {
434                         return false;
435                 }
436         }
437
438         if (ppc.size () == 1 && ppc.find (0) != ppc.end () && !_plugins[0]->get_info ()->reconfigurable_io ()) {
439                 // some midi-sequencer (e.g. QMidiArp) or other midi-out plugin
440                 // pretending to be an "Instrument"
441                 return false;
442         }
443
444         if (!is_instrument ()) {
445                         return false;
446         }
447         return true;
448 }
449
450 void
451 PluginInsert::create_automatable_parameters ()
452 {
453         assert (!_plugins.empty());
454
455         boost::shared_ptr<Plugin> plugin = _plugins.front();
456         set<Evoral::Parameter> a = _plugins.front()->automatable ();
457
458         const uint32_t limit_automatables = Config->get_limit_n_automatables ();
459
460         for (uint32_t i = 0; i < plugin->parameter_count(); ++i) {
461                 if (!plugin->parameter_is_control (i)) {
462                         continue;
463                 }
464
465                 ParameterDescriptor desc;
466                 plugin->get_parameter_descriptor(i, desc);
467
468                 if (!plugin->parameter_is_input (i)) {
469                         _control_outputs[i] = boost::shared_ptr<ReadOnlyControl> (new ReadOnlyControl (plugin, desc, i));
470                         continue;
471                 }
472                 Evoral::Parameter param (PluginAutomation, 0, i);
473
474                 const bool automatable = a.find(param) != a.end();
475
476                 boost::shared_ptr<AutomationList> list(new AutomationList(param, desc));
477                 boost::shared_ptr<AutomationControl> c (new PluginControl(this, param, desc, list));
478                 if (!automatable || (limit_automatables > 0 && i > limit_automatables)) {
479                         c->set_flags (Controllable::Flag ((int)c->flags() | Controllable::NotAutomatable));
480                 }
481                 add_control (c);
482                 plugin->set_automation_control (i, c);
483         }
484
485
486         const Plugin::PropertyDescriptors& pdl (plugin->get_supported_properties ());
487         for (Plugin::PropertyDescriptors::const_iterator p = pdl.begin(); p != pdl.end(); ++p) {
488                 Evoral::Parameter param (PluginPropertyAutomation, 0, p->first);
489                 const ParameterDescriptor& desc = plugin->get_property_descriptor(param.id());
490                 if (desc.datatype != Variant::NOTHING) {
491                         boost::shared_ptr<AutomationList> list;
492                         if (Variant::type_is_numeric(desc.datatype)) {
493                                 list = boost::shared_ptr<AutomationList>(new AutomationList(param, desc));
494                         }
495                         boost::shared_ptr<AutomationControl> c (new PluginPropertyControl(this, param, desc, list));
496                         if (!Variant::type_is_numeric(desc.datatype)) {
497                                 c->set_flags (Controllable::Flag ((int)c->flags() | Controllable::NotAutomatable));
498                         }
499                         add_control (c);
500                 }
501         }
502
503         _bypass_port = plugin->designated_bypass_port ();
504
505         /* special case VST effSetBypass */
506         if (_bypass_port == UINT32_MAX -1) {
507                 // emulate VST Bypass
508                 Evoral::Parameter param (PluginAutomation, 0, _bypass_port);
509                 ParameterDescriptor desc;
510                 desc.label = _("Plugin Enable");
511                 desc.toggled  = true;
512                 desc.normal = 1;
513                 desc.lower  = 0;
514                 desc.upper  = 1;
515                 boost::shared_ptr<AutomationList> list(new AutomationList(param, desc));
516                 boost::shared_ptr<AutomationControl> c (new PluginControl(this, param, desc, list));
517                 add_control (c);
518         }
519
520         if (_bypass_port != UINT32_MAX) {
521                 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, _bypass_port));
522                 if (0 == (ac->flags () & Controllable::NotAutomatable)) {
523                         ac->alist()->automation_state_changed.connect_same_thread (*this, boost::bind (&PluginInsert::bypassable_changed, this));
524                         ac->Changed.connect_same_thread (*this, boost::bind (&PluginInsert::enable_changed, this));
525                 }
526         }
527         plugin->PresetPortSetValue.connect_same_thread (*this, boost::bind (&PluginInsert::preset_load_set_value, this, _1, _2));
528 }
529
530 /** Called when something outside of this host has modified a plugin
531  * parameter. Responsible for propagating the change to two places:
532  *
533  *   1) anything listening to the Control itself
534  *   2) any replicated plugins that make up this PluginInsert.
535  *
536  * The PluginInsert is connected to the ParameterChangedExternally signal for
537  * the first (primary) plugin, and here broadcasts that change to any others.
538  *
539  * XXX We should probably drop this whole replication idea (Paul, October 2015)
540  * since it isn't used by sensible plugin APIs (AU, LV2).
541  */
542 void
543 PluginInsert::parameter_changed_externally (uint32_t which, float val)
544 {
545         boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, which));
546
547         /* First propagation: alter the underlying value of the control,
548          * without telling the plugin(s) that own/use it to set it.
549          */
550
551         if (!ac) {
552                 return;
553         }
554
555         boost::shared_ptr<PluginControl> pc = boost::dynamic_pointer_cast<PluginControl> (ac);
556
557         if (pc) {
558                 pc->catch_up_with_external_value (val);
559         }
560
561         /* Second propagation: tell all plugins except the first to
562            update the value of this parameter. For sane plugin APIs,
563            there are no other plugins, so this is a no-op in those
564            cases.
565         */
566
567         Plugins::iterator i = _plugins.begin();
568
569         /* don't set the first plugin, just all the slaves */
570
571         if (i != _plugins.end()) {
572                 ++i;
573                 for (; i != _plugins.end(); ++i) {
574                         (*i)->set_parameter (which, val);
575                 }
576         }
577 }
578
579 int
580 PluginInsert::set_block_size (pframes_t nframes)
581 {
582         int ret = 0;
583         for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
584                 if ((*i)->set_block_size (nframes) != 0) {
585                         ret = -1;
586                 }
587         }
588         return ret;
589 }
590
591 void
592 PluginInsert::automation_run (samplepos_t start, pframes_t nframes, bool only_active)
593 {
594         // XXX does not work when rolling backwards
595         if (_loop_location && nframes > 0) {
596                 const samplepos_t loop_start = _loop_location->start ();
597                 const samplepos_t loop_end   = _loop_location->end ();
598                 const samplecnt_t looplen    = loop_end - loop_start;
599
600                 samplecnt_t remain = nframes;
601                 samplepos_t start_pos = start;
602
603                 while (remain > 0) {
604                         if (start_pos >= loop_end) {
605                                 sampleoffset_t start_off = (start_pos - loop_start) % looplen;
606                                 start_pos = loop_start + start_off;
607                         }
608                         samplecnt_t move = std::min ((samplecnt_t)nframes, loop_end - start_pos);
609
610                         Automatable::automation_run (start_pos, move, only_active);
611                         remain -= move;
612                         start_pos += move;
613                 }
614                 return;
615         }
616         Automatable::automation_run (start, nframes, only_active);
617 }
618
619 bool
620 PluginInsert::find_next_event (double now, double end, Evoral::ControlEvent& next_event, bool only_active) const
621 {
622         bool rv = Automatable::find_next_event (now, end, next_event, only_active);
623
624         if (_loop_location && now < end) {
625                 if (rv) {
626                         end = ceil (next_event.when);
627                 }
628                 const samplepos_t loop_end = _loop_location->end ();
629                 assert (now < loop_end); // due to map_loop_range ()
630                 if (end > loop_end) {
631                         next_event.when = loop_end;
632                         rv = true;
633                 }
634         }
635         return rv;
636 }
637
638 void
639 PluginInsert::activate ()
640 {
641         _timing_stats.reset ();
642         for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
643                 (*i)->activate ();
644         }
645
646         Processor::activate ();
647         /* when setting state e.g ProcessorBox::paste_processor_state ()
648          * the plugin is not yet owned by a route.
649          * but no matter.  Route::add_processors() will call activate () again
650          */
651         if (!owner ()) {
652                 return;
653         }
654         if (_plugin_signal_latency != signal_latency ()) {
655                 _plugin_signal_latency = signal_latency ();
656                 latency_changed ();
657         }
658 }
659
660 void
661 PluginInsert::deactivate ()
662 {
663 #ifdef MIXBUS
664         if (is_nonbypassable ()) {
665                 return;
666         }
667 #endif
668         _timing_stats.reset ();
669         Processor::deactivate ();
670
671         for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
672                 (*i)->deactivate ();
673         }
674         if (_plugin_signal_latency != signal_latency ()) {
675                 _plugin_signal_latency = signal_latency ();
676                 latency_changed ();
677         }
678 }
679
680 void
681 PluginInsert::flush ()
682 {
683         for (vector<boost::shared_ptr<Plugin> >::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
684                 (*i)->flush ();
685         }
686 }
687
688 void
689 PluginInsert::enable (bool yn)
690 {
691         if (_bypass_port == UINT32_MAX) {
692                 if (yn) {
693                         activate ();
694                 } else {
695                         deactivate ();
696                 }
697         } else {
698                 if (!_pending_active) {
699                         activate ();
700                 }
701                 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, _bypass_port));
702                 const double val = yn ? 1.0 : 0.0;
703                 ac->set_value (val, Controllable::NoGroup);
704
705 #ifdef ALLOW_VST_BYPASS_TO_FAIL // yet unused, see also vst_plugin.cc
706                 /* special case VST.. bypass may fail */
707                 if (_bypass_port == UINT32_MAX - 1) {
708                         /* check if bypass worked */
709                         if (ac->get_value () != val) {
710                                 warning << _("PluginInsert: VST Bypass failed, falling back to host bypass.") << endmsg;
711                                 // set plugin to enabled (not-byassed)
712                                 ac->set_value (1.0, Controllable::NoGroup);
713                                 // ..and use host-provided hard-bypass
714                                 if (yn) {
715                                         activate ();
716                                 } else {
717                                         deactivate ();
718                                 }
719                                 return;
720                         }
721                 }
722 #endif
723                 ActiveChanged ();
724         }
725 }
726
727 bool
728 PluginInsert::enabled () const
729 {
730         if (_bypass_port == UINT32_MAX) {
731                 return Processor::enabled ();
732         } else {
733                 boost::shared_ptr<const AutomationControl> ac = boost::const_pointer_cast<AutomationControl> (automation_control (Evoral::Parameter (PluginAutomation, 0, _bypass_port)));
734                 return (ac->get_value () > 0 && _pending_active);
735         }
736 }
737
738 bool
739 PluginInsert::bypassable () const
740 {
741         if (_bypass_port == UINT32_MAX) {
742                 return true;
743         } else {
744                 boost::shared_ptr<const AutomationControl> ac = boost::const_pointer_cast<AutomationControl> (automation_control (Evoral::Parameter (PluginAutomation, 0, _bypass_port)));
745
746                 return !ac->automation_playback ();
747         }
748 }
749
750 void
751 PluginInsert::enable_changed ()
752 {
753         ActiveChanged ();
754 }
755
756 void
757 PluginInsert::bypassable_changed ()
758 {
759         BypassableChanged ();
760 }
761
762 bool
763 PluginInsert::write_immediate_event (size_t size, const uint8_t* buf)
764 {
765         bool rv = true;
766         for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
767                 if (!(*i)->write_immediate_event (size, buf)) {
768                         rv = false;
769                 }
770         }
771         return rv;
772 }
773
774 void
775 PluginInsert::preset_load_set_value (uint32_t p, float v)
776 {
777         boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter(PluginAutomation, 0, p));
778         if (!ac) {
779                 return;
780         }
781
782         if (ac->automation_state() & Play) {
783                 return;
784         }
785
786         start_touch (p);
787         ac->set_value (v, Controllable::NoGroup);
788         end_touch (p);
789 }
790
791 void
792 PluginInsert::inplace_silence_unconnected (BufferSet& bufs, const PinMappings& out_map, samplecnt_t nframes, samplecnt_t offset) const
793 {
794         // TODO optimize: store "unconnected" in a fixed set.
795         // it only changes on reconfiguration.
796         for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
797                 for (uint32_t out = 0; out < bufs.count().get (*t); ++out) {
798                         bool mapped = false;
799                         if (*t == DataType::MIDI && out == 0 && has_midi_bypass ()) {
800                                 mapped = true; // in-place Midi bypass
801                         }
802                         for (uint32_t pc = 0; pc < get_count() && !mapped; ++pc) {
803                                 PinMappings::const_iterator i = out_map.find (pc);
804                                 if (i == out_map.end ()) {
805                                         continue;
806                                 }
807                                 const ChanMapping& outmap (i->second);
808                                 for (uint32_t o = 0; o < natural_output_streams().get (*t); ++o) {
809                                         bool valid;
810                                         uint32_t idx = outmap.get (*t, o, &valid);
811                                         if (valid && idx == out) {
812                                                 mapped = true;
813                                                 break;
814                                         }
815                                 }
816                         }
817                         if (!mapped) {
818                                 bufs.get (*t, out).silence (nframes, offset);
819                         }
820                 }
821         }
822 }
823
824 void
825 PluginInsert::connect_and_run (BufferSet& bufs, samplepos_t start, samplepos_t end, double speed, pframes_t nframes, samplecnt_t offset, bool with_auto)
826 {
827         if (_mapping_changed) { // ToDo use a counter, increment until match
828                 _no_inplace = check_inplace ();
829                 _mapping_changed = false;
830         }
831         // TODO: atomically copy maps & _no_inplace
832         PinMappings in_map (_in_map); // TODO Split case below overrides, use const& in_map
833         PinMappings const& out_map (_out_map);
834         ChanMapping const& thru_map (_thru_map);
835
836         if (_latency_changed) {
837                 /* delaylines are configured with the max possible latency (as reported by the plugin)
838                  * so this won't allocate memory (unless the plugin lied about its max latency)
839                  * It may still 'click' though, since the fixed delaylines are not de-clicked.
840                  * Then again plugin-latency changes are not click-free to begin with.
841                  *
842                  * This is also worst case, there is currently no concept of per-stream latency.
843                  *
844                  * e.g.  Two identical latent plugins:
845                  *   1st plugin: process left (latent), bypass right.
846                  *   2nd plugin: bypass left, process right (latent).
847                  * -> currently this yields 2 times latency of the plugin,
848                  */
849                 _latency_changed = false;
850                 _delaybuffers.set (ChanCount::max(bufs.count(), _configured_out), plugin_latency ());
851         }
852
853         if (_match.method == Split && !_no_inplace) {
854                 // TODO: also use this optimization if one source-buffer
855                 // feeds _all_ *connected* inputs.
856                 // currently this is *first* buffer to all only --
857                 // see PluginInsert::check_inplace
858                 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
859                         if (_configured_internal.get (*t) == 0) {
860                                 continue;
861                         }
862                         bool valid;
863                         uint32_t first_idx = in_map.p(0).get (*t, 0, &valid);
864                         assert (valid && first_idx == 0); // check_inplace ensures this
865                         /* copy the first stream's buffer contents to the others */
866                         for (uint32_t i = 1; i < natural_input_streams ().get (*t); ++i) {
867                                 uint32_t idx = in_map.p(0).get (*t, i, &valid);
868                                 if (valid) {
869                                         assert (idx == 0);
870                                         bufs.get (*t, i).read_from (bufs.get (*t, first_idx), nframes, offset, offset);
871                                 }
872                         }
873                 }
874                 /* the copy operation produces a linear monotonic input map */
875                 in_map[0] = ChanMapping (natural_input_streams ());
876         }
877
878         bufs.set_count(ChanCount::max(bufs.count(), _configured_internal));
879         bufs.set_count(ChanCount::max(bufs.count(), _configured_out));
880
881         if (with_auto) {
882
883 #if 0
884                 uint32_t n = 0;
885
886                 for (Controls::const_iterator li = controls().begin(); li != controls().end(); ++li, ++n) {
887
888                         /* boost::dynamic_pointer_cast<> has significant overhead, since we know that
889                          * all controls are AutomationControl and their lists - if any - are AutomationList,
890                          * we can use static_cast<>. This yields a speedup of 2.8/4.6 over to the
891                          * previous code (measuerd with VeeSeeVSTRack 10k parameters, optimized build) */
892                         AutomationControl& c = static_cast<AutomationControl&> (*(li->second));
893                         boost::shared_ptr<const Evoral::ControlList> clist (c.list());
894                         if (clist && (static_cast<AutomationList const&> (*clist)).automation_playback ()) {
895                                 bool valid;
896                                 const float val = c.list()->rt_safe_eval (start, valid);
897                                 if (valid) {
898                                         c.set_value_unchecked(val);
899                                 }
900                         }
901                 }
902 #else
903                 boost::shared_ptr<ControlList> cl = _automated_controls.reader ();
904                 for (ControlList::const_iterator ci = cl->begin(); ci != cl->end(); ++ci) {
905                         AutomationControl& c = *(ci->get());
906                         boost::shared_ptr<const Evoral::ControlList> clist (c.list());
907                         /* we still need to check for Touch and Latch */
908                         if (clist && (static_cast<AutomationList const&> (*clist)).automation_playback ()) {
909                                 bool valid;
910                                 const float val = c.list()->rt_safe_eval (start, valid);
911                                 if (valid) {
912                                         c.set_value_unchecked(val);
913                                 }
914                         }
915                 }
916 #endif
917         }
918
919         /* Calculate if, and how many samples we need to collect for analysis */
920         samplecnt_t collect_signal_nframes = (_signal_analysis_collect_nframes_max -
921                                              _signal_analysis_collected_nframes);
922         if (nframes < collect_signal_nframes) { // we might not get all samples now
923                 collect_signal_nframes = nframes;
924         }
925
926         if (collect_signal_nframes > 0) {
927                 // collect input
928                 //std::cerr << "collect input, bufs " << bufs.count().n_audio() << " count,  " << bufs.available().n_audio() << " available" << std::endl;
929                 //std::cerr << "               streams " << internal_input_streams().n_audio() << std::endl;
930                 //std::cerr << "filling buffer with " << collect_signal_nframes << " samples at " << _signal_analysis_collected_nframes << std::endl;
931
932                 _signal_analysis_inputs.set_count (ChanCount (DataType::AUDIO, input_streams().n_audio()));
933
934                 for (uint32_t i = 0; i < input_streams().n_audio(); ++i) {
935                         _signal_analysis_inputs.get_audio(i).read_from (
936                                 bufs.get_audio(i),
937                                 collect_signal_nframes,
938                                 _signal_analysis_collected_nframes); // offset is for target buffer
939                 }
940
941         }
942 #ifdef MIXBUS
943         if (is_channelstrip ()) {
944                 if (_configured_in.n_audio() > 0) {
945                         ChanMapping mb_in_map (ChanCount::min (_configured_in, ChanCount (DataType::AUDIO, 2)));
946                         ChanMapping mb_out_map (ChanCount::min (_configured_out, ChanCount (DataType::AUDIO, 2)));
947
948                         _plugins.front()->connect_and_run (bufs, start, end, speed, mb_in_map, mb_out_map, nframes, offset);
949
950                         for (uint32_t out = _configured_in.n_audio (); out < bufs.count().get (DataType::AUDIO); ++out) {
951                                 bufs.get (DataType::AUDIO, out).silence (nframes, offset);
952                         }
953                 }
954         } else
955 #endif
956         if (_no_inplace) {
957                 // TODO optimize -- build maps once.
958                 uint32_t pc = 0;
959                 BufferSet& inplace_bufs  = _session.get_noinplace_buffers();
960                 ARDOUR::ChanMapping used_outputs;
961
962                 assert (inplace_bufs.count () >= natural_input_streams () + _configured_out);
963
964                 /* build used-output map */
965                 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
966                         for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
967                                 for (uint32_t out = 0; out < natural_output_streams().get (*t); ++out) {
968                                         bool valid;
969                                         uint32_t out_idx = out_map.p(pc).get (*t, out, &valid);
970                                         if (valid) {
971                                                 used_outputs.set (*t, out_idx, 1); // mark as used
972                                         }
973                                 }
974                         }
975                 }
976                 /* copy thru data to outputs before processing in-place */
977                 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
978                         for (uint32_t out = 0; out < bufs.count().get (*t); ++out) {
979                                 bool valid;
980                                 uint32_t in_idx = thru_map.get (*t, out, &valid);
981                                 uint32_t m = out + natural_input_streams ().get (*t);
982                                 if (valid) {
983                                         _delaybuffers.delay (*t, out, inplace_bufs.get (*t, m), bufs.get (*t, in_idx), nframes, offset, offset);
984                                         used_outputs.set (*t, out, 1); // mark as used
985                                 } else {
986                                         used_outputs.get (*t, out, &valid);
987                                         if (valid) {
988                                                 /* the plugin is expected to write here, but may not :(
989                                                  * (e.g. drumgizmo w/o kit loaded)
990                                                  */
991                                                 inplace_bufs.get (*t, m).silence (nframes);
992                                         }
993                                 }
994                         }
995                 }
996
997                 pc = 0;
998                 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
999
1000                         ARDOUR::ChanMapping i_in_map (natural_input_streams());
1001                         ARDOUR::ChanMapping i_out_map (out_map.p(pc));
1002                         ARDOUR::ChanCount mapped;
1003
1004                         /* map inputs sequentially */
1005                         for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1006                                 for (uint32_t in = 0; in < natural_input_streams().get (*t); ++in) {
1007                                         bool valid;
1008                                         uint32_t in_idx = in_map.p(pc).get (*t, in, &valid);
1009                                         uint32_t m = mapped.get (*t);
1010                                         if (valid) {
1011                                                 inplace_bufs.get (*t, m).read_from (bufs.get (*t, in_idx), nframes, offset, offset);
1012                                         } else {
1013                                                 inplace_bufs.get (*t, m).silence (nframes, offset);
1014                                         }
1015                                         mapped.set (*t, m + 1);
1016                                 }
1017                         }
1018
1019                         /* outputs are mapped to inplace_bufs after the inputs */
1020                         for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1021                                 i_out_map.offset_to (*t, natural_input_streams ().get (*t));
1022                         }
1023
1024                         if ((*i)->connect_and_run (inplace_bufs, start, end, speed, i_in_map, i_out_map, nframes, offset)) {
1025                                 deactivate ();
1026                         }
1027                 }
1028
1029                 /* all instances have completed, now copy data that was written
1030                  * and zero unconnected buffers */
1031                 ARDOUR::ChanMapping nonzero_out (used_outputs);
1032                 if (has_midi_bypass ()) {
1033                         nonzero_out.set (DataType::MIDI, 0, 1); // Midi bypass.
1034                 }
1035                 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1036                         for (uint32_t out = 0; out < bufs.count().get (*t); ++out) {
1037                                 bool valid;
1038                                 used_outputs.get (*t, out, &valid);
1039                                 if (!valid) {
1040                                         nonzero_out.get (*t, out, &valid);
1041                                         if (!valid) {
1042                                                 bufs.get (*t, out).silence (nframes, offset);
1043                                         }
1044                                 } else {
1045                                         uint32_t m = out + natural_input_streams ().get (*t);
1046                                         bufs.get (*t, out).read_from (inplace_bufs.get (*t, m), nframes, offset, offset);
1047                                 }
1048                         }
1049                 }
1050         } else {
1051                 /* in-place processing */
1052                 uint32_t pc = 0;
1053                 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
1054                         if ((*i)->connect_and_run(bufs, start, end, speed, in_map.p(pc), out_map.p(pc), nframes, offset)) {
1055                                 deactivate ();
1056                         }
1057                 }
1058                 // now silence unconnected outputs
1059                 inplace_silence_unconnected (bufs, _out_map, nframes, offset);
1060         }
1061
1062         if (collect_signal_nframes > 0) {
1063                 // collect output
1064                 //std::cerr << "       output, bufs " << bufs.count().n_audio() << " count,  " << bufs.available().n_audio() << " available" << std::endl;
1065                 //std::cerr << "               streams " << internal_output_streams().n_audio() << std::endl;
1066
1067                 _signal_analysis_outputs.set_count (ChanCount (DataType::AUDIO, output_streams().n_audio()));
1068
1069                 for (uint32_t i = 0; i < output_streams().n_audio(); ++i) {
1070                         _signal_analysis_outputs.get_audio(i).read_from(
1071                                 bufs.get_audio(i),
1072                                 collect_signal_nframes,
1073                                 _signal_analysis_collected_nframes); // offset is for target buffer
1074                 }
1075
1076                 _signal_analysis_collected_nframes += collect_signal_nframes;
1077                 assert(_signal_analysis_collected_nframes <= _signal_analysis_collect_nframes_max);
1078
1079                 if (_signal_analysis_collected_nframes == _signal_analysis_collect_nframes_max) {
1080                         _signal_analysis_collect_nframes_max = 0;
1081                         _signal_analysis_collected_nframes   = 0;
1082
1083                         AnalysisDataGathered(&_signal_analysis_inputs,
1084                                              &_signal_analysis_outputs);
1085                 }
1086         }
1087
1088         if (_plugin_signal_latency != signal_latency ()) {
1089                 _plugin_signal_latency = signal_latency ();
1090                 latency_changed ();
1091         }
1092 }
1093
1094 void
1095 PluginInsert::bypass (BufferSet& bufs, pframes_t nframes)
1096 {
1097         /* bypass the plugin(s) not the whole processor.
1098          * -> use mappings just like connect_and_run
1099          */
1100         if (_mapping_changed) {
1101                 _no_inplace = check_inplace ();
1102                 _mapping_changed = false;
1103         }
1104         // TODO: atomically copy maps & _no_inplace
1105         ChanMapping const& in_map (no_sc_input_map ());
1106         ChanMapping const& out_map (output_map ());
1107
1108         bufs.set_count(ChanCount::max(bufs.count(), _configured_internal));
1109         bufs.set_count(ChanCount::max(bufs.count(), _configured_out));
1110
1111         if (_no_inplace) {
1112                 ChanMapping thru_map (_thru_map);
1113
1114                 BufferSet& inplace_bufs  = _session.get_noinplace_buffers();
1115                 // copy all inputs
1116                 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1117                         for (uint32_t in = 0; in < _configured_internal.get (*t); ++in) {
1118                                 inplace_bufs.get (*t, in).read_from (bufs.get (*t, in), nframes, 0, 0);
1119                         }
1120                 }
1121                 ARDOUR::ChanMapping used_outputs;
1122                 // copy thru
1123                 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1124                         for (uint32_t out = 0; out < _configured_out.get (*t); ++out) {
1125                                 bool valid;
1126                                 uint32_t in_idx = thru_map.get (*t, out, &valid);
1127                                 if (valid) {
1128                                         bufs.get (*t, out).read_from (inplace_bufs.get (*t, in_idx), nframes, 0, 0);
1129                                         used_outputs.set (*t, out, 1); // mark as used
1130                                 }
1131                         }
1132                 }
1133                 // plugin no-op: assume every plugin has an internal identity map
1134                 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1135                         for (uint32_t out = 0; out < _configured_out.get (*t); ++out) {
1136                                 bool valid;
1137                                 uint32_t src_idx = out_map.get_src (*t, out, &valid);
1138                                 if (!valid) {
1139                                         continue;
1140                                 }
1141                                 uint32_t in_idx = in_map.get (*t, src_idx, &valid);
1142                                 if (!valid) {
1143                                         continue;
1144                                 }
1145                                 bufs.get (*t, out).read_from (inplace_bufs.get (*t, in_idx), nframes, 0, 0);
1146                                 used_outputs.set (*t, out, 1); // mark as used
1147                         }
1148                 }
1149                 // now silence all unused outputs
1150                 if (has_midi_bypass ()) {
1151                         used_outputs.set (DataType::MIDI, 0, 1); // Midi bypass.
1152                 }
1153                 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1154                         for (uint32_t out = 0; out < _configured_out.get (*t); ++out) {
1155                                 bool valid;
1156                                 used_outputs.get (*t, out, &valid);
1157                                 if (!valid) {
1158                                                 bufs.get (*t, out).silence (nframes, 0);
1159                                 }
1160                         }
1161                 }
1162         } else {
1163                 if (_match.method == Split) {
1164                         for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1165                                 if (_configured_internal.get (*t) == 0) {
1166                                         continue;
1167                                 }
1168                                 // copy/feeds _all_ *connected* inputs, copy the first buffer
1169                                 bool valid;
1170                                 uint32_t first_idx = in_map.get (*t, 0, &valid);
1171                                 assert (valid && first_idx == 0); // check_inplace ensures this
1172                                 for (uint32_t i = 1; i < natural_input_streams ().get (*t); ++i) {
1173                                         uint32_t idx = in_map.get (*t, i, &valid);
1174                                         if (valid) {
1175                                                 assert (idx == 0);
1176                                                 bufs.get (*t, i).read_from (bufs.get (*t, first_idx), nframes, 0, 0);
1177                                         }
1178                                 }
1179                         }
1180                 }
1181
1182                 // apply output map and/or monotonic but not identity i/o mappings
1183                 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1184                         for (uint32_t out = 0; out < _configured_out.get (*t); ++out) {
1185                                 bool valid;
1186                                 uint32_t src_idx = out_map.get_src (*t, out, &valid);
1187                                 if (!valid) {
1188                                         bufs.get (*t, out).silence (nframes, 0);
1189                                         continue;
1190                                 }
1191                                 uint32_t in_idx = in_map.get (*t, src_idx, &valid);
1192                                 if (!valid) {
1193                                         bufs.get (*t, out).silence (nframes, 0);
1194                                         continue;
1195                                 }
1196                                 if (in_idx != src_idx) {
1197                                         bufs.get (*t, out).read_from (bufs.get (*t, in_idx), nframes, 0, 0);
1198                                 }
1199                         }
1200                 }
1201         }
1202 }
1203
1204 void
1205 PluginInsert::silence (samplecnt_t nframes, samplepos_t start_sample)
1206 {
1207         automation_run (start_sample, nframes, true); // evaluate automation only
1208
1209         if (!active ()) {
1210                 // XXX delaybuffers need to be offset by nframes
1211                 return;
1212         }
1213
1214         _delaybuffers.flush ();
1215
1216         const ChanMapping in_map (natural_input_streams ());
1217         const ChanMapping out_map (natural_output_streams ());
1218         ChanCount maxbuf = ChanCount::max (natural_input_streams (), natural_output_streams());
1219 #ifdef MIXBUS
1220         if (is_channelstrip ()) {
1221                 if (_configured_in.n_audio() > 0) {
1222                         _plugins.front()->connect_and_run (_session.get_scratch_buffers (maxbuf, true), start_sample, start_sample + nframes, 1.0, in_map, out_map, nframes, 0);
1223                 }
1224         } else
1225 #endif
1226         for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
1227                 (*i)->connect_and_run (_session.get_scratch_buffers (maxbuf, true), start_sample, start_sample + nframes, 1.0, in_map, out_map, nframes, 0);
1228         }
1229 }
1230
1231 void
1232 PluginInsert::run (BufferSet& bufs, samplepos_t start_sample, samplepos_t end_sample, double speed, pframes_t nframes, bool)
1233 {
1234         if (_sidechain) {
1235                 // collect sidechain input for complete cycle (!)
1236                 // TODO we need delaylines here for latency compensation
1237                 _sidechain->run (bufs, start_sample, end_sample, speed, nframes, true);
1238         }
1239
1240         if (g_atomic_int_compare_and_exchange (&_stat_reset, 1, 0)) {
1241                 _timing_stats.reset ();
1242         }
1243
1244         if (_pending_active) {
1245 #if defined MIXBUS && defined NDEBUG
1246                 if (!is_channelstrip ()) {
1247                         _timing_stats.start ();
1248                 }
1249 #else
1250                 _timing_stats.start ();
1251 #endif
1252                 /* run as normal if we are active or moving from inactive to active */
1253
1254                 if (_session.transport_rolling() || _session.bounce_processing()) {
1255                         automate_and_run (bufs, start_sample, end_sample, speed, nframes);
1256                 } else {
1257                         Glib::Threads::Mutex::Lock lm (control_lock(), Glib::Threads::TRY_LOCK);
1258                         connect_and_run (bufs, start_sample, end_sample, speed, nframes, 0, lm.locked());
1259                 }
1260 #if defined MIXBUS && defined NDEBUG
1261                 if (!is_channelstrip ()) {
1262                         _timing_stats.update ();
1263                 }
1264 #else
1265                 _timing_stats.update ();
1266 #endif
1267
1268         } else {
1269                 _timing_stats.reset ();
1270                 // XXX should call ::silence() to run plugin(s) for consistent load.
1271                 // We'll need to change this anyway when bypass can be automated
1272                 bypass (bufs, nframes);
1273                 automation_run (start_sample, nframes, true); // evaluate automation only
1274                 _delaybuffers.flush ();
1275         }
1276
1277         _active = _pending_active;
1278
1279         /* we have no idea whether the plugin generated silence or not, so mark
1280          * all buffers appropriately.
1281          */
1282 }
1283
1284 void
1285 PluginInsert::automate_and_run (BufferSet& bufs, samplepos_t start, samplepos_t end, double speed, pframes_t nframes)
1286 {
1287         Evoral::ControlEvent next_event (0, 0.0f);
1288         samplecnt_t offset = 0;
1289
1290         Glib::Threads::Mutex::Lock lm (control_lock(), Glib::Threads::TRY_LOCK);
1291
1292         if (!lm.locked()) {
1293                 connect_and_run (bufs, start, end, speed, nframes, offset, false);
1294                 return;
1295         }
1296
1297         /* map start back into loop-range, adjust end */
1298         map_loop_range (start, end);
1299
1300         if (!find_next_event (start, end, next_event) || _plugins.front()->requires_fixed_sized_buffers()) {
1301
1302                 /* no events have a time within the relevant range */
1303
1304                 connect_and_run (bufs, start, end, speed, nframes, offset, true);
1305                 return;
1306         }
1307
1308         while (nframes) {
1309
1310                 samplecnt_t cnt = min (((samplecnt_t) ceil (next_event.when) - start), (samplecnt_t) nframes);
1311
1312                 connect_and_run (bufs, start, start + cnt, speed, cnt, offset, true); // XXX (start + cnt) * speed
1313
1314                 nframes -= cnt;
1315                 offset += cnt;
1316                 start += cnt;
1317
1318                 map_loop_range (start, end);
1319
1320                 if (!find_next_event (start, end, next_event)) {
1321                         break;
1322                 }
1323         }
1324
1325         /* cleanup anything that is left to do */
1326
1327         if (nframes) {
1328                 connect_and_run (bufs, start, start + nframes, speed, nframes, offset, true);
1329         }
1330 }
1331
1332 float
1333 PluginInsert::default_parameter_value (const Evoral::Parameter& param)
1334 {
1335         if (param.type() != PluginAutomation)
1336                 return 1.0;
1337
1338         if (_plugins.empty()) {
1339                 fatal << _("programming error: ") << X_("PluginInsert::default_parameter_value() called with no plugin")
1340                       << endmsg;
1341                 abort(); /*NOTREACHED*/
1342         }
1343
1344         return _plugins[0]->default_value (param.id());
1345 }
1346
1347
1348 bool
1349 PluginInsert::can_reset_all_parameters ()
1350 {
1351         bool all = true;
1352         uint32_t params = 0;
1353         for (uint32_t par = 0; par < _plugins[0]->parameter_count(); ++par) {
1354                 bool ok=false;
1355                 const uint32_t cid = _plugins[0]->nth_parameter (par, ok);
1356
1357                 if (!ok || !_plugins[0]->parameter_is_input(cid)) {
1358                         continue;
1359                 }
1360
1361                 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter(PluginAutomation, 0, cid));
1362                 if (!ac) {
1363                         continue;
1364                 }
1365
1366                 ++params;
1367                 if (ac->automation_state() & Play) {
1368                         all = false;
1369                         break;
1370                 }
1371         }
1372         return all && (params > 0);
1373 }
1374
1375 bool
1376 PluginInsert::reset_parameters_to_default ()
1377 {
1378         bool all = true;
1379
1380         for (uint32_t par = 0; par < _plugins[0]->parameter_count(); ++par) {
1381                 bool ok=false;
1382                 const uint32_t cid = _plugins[0]->nth_parameter (par, ok);
1383
1384                 if (!ok || !_plugins[0]->parameter_is_input(cid)) {
1385                         continue;
1386                 }
1387
1388                 const float dflt = _plugins[0]->default_value (cid);
1389                 const float curr = _plugins[0]->get_parameter (cid);
1390
1391                 if (dflt == curr) {
1392                         continue;
1393                 }
1394
1395                 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter(PluginAutomation, 0, cid));
1396                 if (!ac) {
1397                         continue;
1398                 }
1399
1400                 if (ac->automation_state() & Play) {
1401                         all = false;
1402                         continue;
1403                 }
1404
1405                 ac->set_value (dflt, Controllable::NoGroup);
1406         }
1407         return all;
1408 }
1409
1410 boost::shared_ptr<Plugin>
1411 PluginInsert::plugin_factory (boost::shared_ptr<Plugin> other)
1412 {
1413         boost::shared_ptr<LadspaPlugin> lp;
1414         boost::shared_ptr<LuaProc> lua;
1415 #ifdef LV2_SUPPORT
1416         boost::shared_ptr<LV2Plugin> lv2p;
1417 #endif
1418 #ifdef WINDOWS_VST_SUPPORT
1419         boost::shared_ptr<WindowsVSTPlugin> vp;
1420 #endif
1421 #ifdef LXVST_SUPPORT
1422         boost::shared_ptr<LXVSTPlugin> lxvp;
1423 #endif
1424 #ifdef MACVST_SUPPORT
1425         boost::shared_ptr<MacVSTPlugin> mvp;
1426 #endif
1427 #ifdef AUDIOUNIT_SUPPORT
1428         boost::shared_ptr<AUPlugin> ap;
1429 #endif
1430
1431         if ((lp = boost::dynamic_pointer_cast<LadspaPlugin> (other)) != 0) {
1432                 return boost::shared_ptr<Plugin> (new LadspaPlugin (*lp));
1433         } else if ((lua = boost::dynamic_pointer_cast<LuaProc> (other)) != 0) {
1434                 return boost::shared_ptr<Plugin> (new LuaProc (*lua));
1435 #ifdef LV2_SUPPORT
1436         } else if ((lv2p = boost::dynamic_pointer_cast<LV2Plugin> (other)) != 0) {
1437                 return boost::shared_ptr<Plugin> (new LV2Plugin (*lv2p));
1438 #endif
1439 #ifdef WINDOWS_VST_SUPPORT
1440         } else if ((vp = boost::dynamic_pointer_cast<WindowsVSTPlugin> (other)) != 0) {
1441                 return boost::shared_ptr<Plugin> (new WindowsVSTPlugin (*vp));
1442 #endif
1443 #ifdef LXVST_SUPPORT
1444         } else if ((lxvp = boost::dynamic_pointer_cast<LXVSTPlugin> (other)) != 0) {
1445                 return boost::shared_ptr<Plugin> (new LXVSTPlugin (*lxvp));
1446 #endif
1447 #ifdef MACVST_SUPPORT
1448         } else if ((mvp = boost::dynamic_pointer_cast<MacVSTPlugin> (other)) != 0) {
1449                 return boost::shared_ptr<Plugin> (new MacVSTPlugin (*mvp));
1450 #endif
1451 #ifdef AUDIOUNIT_SUPPORT
1452         } else if ((ap = boost::dynamic_pointer_cast<AUPlugin> (other)) != 0) {
1453                 return boost::shared_ptr<Plugin> (new AUPlugin (*ap));
1454 #endif
1455         }
1456
1457         fatal << string_compose (_("programming error: %1"),
1458                           X_("unknown plugin type in PluginInsert::plugin_factory"))
1459               << endmsg;
1460         abort(); /*NOTREACHED*/
1461         return boost::shared_ptr<Plugin> ((Plugin*) 0);
1462 }
1463
1464 void
1465 PluginInsert::set_input_map (uint32_t num, ChanMapping m) {
1466         if (num < _in_map.size()) {
1467                 bool changed = _in_map[num] != m;
1468                 _in_map[num] = m;
1469                 changed |= sanitize_maps ();
1470                 if (changed) {
1471                         PluginMapChanged (); /* EMIT SIGNAL */
1472                         _mapping_changed = true;
1473                         _session.set_dirty();
1474                 }
1475         }
1476 }
1477
1478 void
1479 PluginInsert::set_output_map (uint32_t num, ChanMapping m) {
1480         if (num < _out_map.size()) {
1481                 bool changed = _out_map[num] != m;
1482                 _out_map[num] = m;
1483                 changed |= sanitize_maps ();
1484                 if (changed) {
1485                         PluginMapChanged (); /* EMIT SIGNAL */
1486                         _mapping_changed = true;
1487                         _session.set_dirty();
1488                 }
1489         }
1490 }
1491
1492 void
1493 PluginInsert::set_thru_map (ChanMapping m) {
1494         bool changed = _thru_map != m;
1495         _thru_map = m;
1496         changed |= sanitize_maps ();
1497         if (changed) {
1498                 PluginMapChanged (); /* EMIT SIGNAL */
1499                 _mapping_changed = true;
1500                 _session.set_dirty();
1501         }
1502 }
1503
1504 bool
1505 PluginInsert::pre_seed (const ChanCount& in, const ChanCount& out,
1506                 const ChanMapping& im, const ChanMapping& om, const ChanMapping& tm)
1507 {
1508         if (_configured) { return false; }
1509         _configured_in = in;
1510         _configured_out = out;
1511         _in_map[0] = im;
1512         _out_map[0] = om;
1513         _thru_map = tm;
1514         _maps_from_state = in.n_total () > 0 && out.n_total () > 0;
1515         return true;
1516 }
1517
1518 ChanMapping
1519 PluginInsert::input_map () const
1520 {
1521         ChanMapping rv;
1522         uint32_t pc = 0;
1523         for (PinMappings::const_iterator i = _in_map.begin (); i != _in_map.end (); ++i, ++pc) {
1524                 ChanMapping m (i->second);
1525                 const ChanMapping::Mappings& mp ((*i).second.mappings());
1526                 for (ChanMapping::Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
1527                         for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
1528                                 rv.set (tm->first, i->first + pc * natural_input_streams().get(tm->first), i->second);
1529                         }
1530                 }
1531         }
1532         return rv;
1533 }
1534
1535
1536 ChanMapping
1537 PluginInsert::no_sc_input_map () const
1538 {
1539         ChanMapping rv;
1540         uint32_t pc = 0;
1541         for (PinMappings::const_iterator i = _in_map.begin (); i != _in_map.end (); ++i, ++pc) {
1542                 ChanMapping m (i->second);
1543                 const ChanMapping::Mappings& mp ((*i).second.mappings());
1544                 for (ChanMapping::Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
1545                         uint32_t ins = natural_input_streams().get(tm->first) - _cached_sidechain_pins.get(tm->first);
1546                         for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
1547                                 if (i->first < ins) {
1548                                         rv.set (tm->first, i->first + pc * ins, i->second);
1549                                 }
1550                         }
1551                 }
1552         }
1553         return rv;
1554 }
1555
1556 ChanMapping
1557 PluginInsert::output_map () const
1558 {
1559         ChanMapping rv;
1560         uint32_t pc = 0;
1561         for (PinMappings::const_iterator i = _out_map.begin (); i != _out_map.end (); ++i, ++pc) {
1562                 ChanMapping m (i->second);
1563                 const ChanMapping::Mappings& mp ((*i).second.mappings());
1564                 for (ChanMapping::Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
1565                         for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
1566                                 rv.set (tm->first, i->first + pc * natural_output_streams().get(tm->first), i->second);
1567                         }
1568                 }
1569         }
1570         if (has_midi_bypass ()) {
1571                 rv.set (DataType::MIDI, 0, 0);
1572         }
1573
1574         return rv;
1575 }
1576
1577 bool
1578 PluginInsert::has_midi_bypass () const
1579 {
1580         if (_configured_in.n_midi () == 1 && _configured_out.n_midi () == 1
1581                         && natural_output_streams ().n_midi () == 0) {
1582                 return true;
1583         }
1584         return false;
1585 }
1586
1587 bool
1588 PluginInsert::has_midi_thru () const
1589 {
1590         if (_configured_in.n_midi () == 1 && _configured_out.n_midi () == 1
1591                         && natural_input_streams ().n_midi () == 0 && natural_output_streams ().n_midi () == 0) {
1592                 return true;
1593         }
1594         return false;
1595 }
1596
1597 #ifdef MIXBUS
1598 bool
1599 PluginInsert::is_channelstrip () const {
1600         return _plugins.front()->is_channelstrip();
1601 }
1602 bool
1603 PluginInsert::is_nonbypassable () const {
1604         return _plugins.front()->is_nonbypassable ();
1605 }
1606 #endif
1607
1608 bool
1609 PluginInsert::check_inplace ()
1610 {
1611         bool inplace_ok = !_plugins.front()->inplace_broken ();
1612
1613         if (_thru_map.n_total () > 0) {
1614                 // TODO once midi-bypass is part of the mapping, ignore it
1615                 inplace_ok = false;
1616         }
1617
1618         if (_match.method == Split && inplace_ok) {
1619                 assert (get_count() == 1);
1620                 assert (_in_map.size () == 1);
1621                 if (!_out_map[0].is_monotonic ()) {
1622                         inplace_ok = false;
1623                 }
1624                 if (_configured_internal != _configured_in) {
1625                         /* no sidechain -- TODO we could allow this with
1626                          * some more logic in PluginInsert::connect_and_run().
1627                          *
1628                          * PluginInsert::reset_map() already maps it.
1629                          */
1630                         inplace_ok = false;
1631                 }
1632                 /* check mapping */
1633                 for (DataType::iterator t = DataType::begin(); t != DataType::end() && inplace_ok; ++t) {
1634                         if (_configured_internal.get (*t) == 0) {
1635                                 continue;
1636                         }
1637                         bool valid;
1638                         uint32_t first_idx = _in_map[0].get (*t, 0, &valid);
1639                         if (!valid || first_idx != 0) {
1640                                 // so far only allow to copy the *first* stream's buffer to others
1641                                 inplace_ok = false;
1642                         } else {
1643                                 for (uint32_t i = 1; i < natural_input_streams ().get (*t); ++i) {
1644                                         uint32_t idx = _in_map[0].get (*t, i, &valid);
1645                                         if (valid && idx != first_idx) {
1646                                                 inplace_ok = false;
1647                                                 break;
1648                                         }
1649                                 }
1650                         }
1651                 }
1652
1653                 if (inplace_ok) {
1654                         DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: In Place Split Map\n", name()));
1655                         return false;
1656                 }
1657         }
1658
1659         for (uint32_t pc = 0; pc < get_count() && inplace_ok ; ++pc) {
1660                 if (!_in_map[pc].is_monotonic ()) {
1661                         inplace_ok = false;
1662                 }
1663                 if (!_out_map[pc].is_monotonic ()) {
1664                         inplace_ok = false;
1665                 }
1666         }
1667
1668         if (inplace_ok) {
1669                 /* check if every output is fed by the corresponding input
1670                  *
1671                  * this prevents  in-port 1 -> sink-pin 2  ||  source-pin 1 -> out port 1, source-pin 2 -> out port 2
1672                  * (with in-place,  source-pin 1 -> out port 1 overwrites in-port 1)
1673                  *
1674                  * but allows     in-port 1 -> sink-pin 2  ||  source-pin 2 -> out port 1
1675                  */
1676                 ChanMapping const& in_map (input_map ());
1677                 const ChanMapping::Mappings out_m (output_map ().mappings ());
1678                 for (ChanMapping::Mappings::const_iterator t = out_m.begin (); t != out_m.end () && inplace_ok; ++t) {
1679                         for (ChanMapping::TypeMapping::const_iterator c = (*t).second.begin (); c != (*t).second.end () ; ++c) {
1680                                 /* src-pin: c->first, out-port: c->second */
1681                                 bool valid;
1682                                 uint32_t in_port = in_map.get (t->first, c->first, &valid);
1683                                 if (valid && in_port != c->second) {
1684                                         inplace_ok = false;
1685                                         break;
1686                                 }
1687                         }
1688                 }
1689         }
1690
1691         DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: %2\n", name(), inplace_ok ? "In-Place" : "No Inplace Processing"));
1692         return !inplace_ok; // no-inplace
1693 }
1694
1695 bool
1696 PluginInsert::sanitize_maps ()
1697 {
1698         bool changed = false;
1699         /* strip dead wood */
1700         PinMappings new_ins;
1701         PinMappings new_outs;
1702         ChanMapping new_thru;
1703
1704         for (uint32_t pc = 0; pc < get_count(); ++pc) {
1705                 ChanMapping new_in;
1706                 ChanMapping new_out;
1707                 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1708                         for (uint32_t i = 0; i < natural_input_streams().get (*t); ++i) {
1709                                 bool valid;
1710                                 uint32_t idx = _in_map[pc].get (*t, i, &valid);
1711                                 if (valid && idx < _configured_internal.get (*t)) {
1712                                         new_in.set (*t, i, idx);
1713                                 }
1714                         }
1715                         for (uint32_t o = 0; o < natural_output_streams().get (*t); ++o) {
1716                                 bool valid;
1717                                 uint32_t idx = _out_map[pc].get (*t, o, &valid);
1718                                 if (valid && idx < _configured_out.get (*t)) {
1719                                         new_out.set (*t, o, idx);
1720                                 }
1721                         }
1722                 }
1723                 if (_in_map[pc] != new_in || _out_map[pc] != new_out) {
1724                         changed = true;
1725                 }
1726                 new_ins[pc] = new_in;
1727                 new_outs[pc] = new_out;
1728         }
1729
1730         /* prevent dup output assignments */
1731         for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1732                 for (uint32_t o = 0; o < _configured_out.get (*t); ++o) {
1733                         bool mapped = false;
1734                         for (uint32_t pc = 0; pc < get_count(); ++pc) {
1735                                 bool valid;
1736                                 uint32_t idx = new_outs[pc].get_src (*t, o, &valid);
1737                                 if (valid && mapped) {
1738                                         new_outs[pc].unset (*t, idx);
1739                                 } else if (valid) {
1740                                         mapped = true;
1741                                 }
1742                         }
1743                 }
1744         }
1745
1746         /* remove excess thru */
1747         for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1748                 for (uint32_t o = 0; o < _configured_out.get (*t); ++o) {
1749                         bool valid;
1750                         uint32_t idx = _thru_map.get (*t, o, &valid);
1751                         if (valid && idx < _configured_internal.get (*t)) {
1752                                 new_thru.set (*t, o, idx);
1753                         }
1754                 }
1755         }
1756
1757         /* prevent out + thru,  existing plugin outputs override thru */
1758         for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1759                 for (uint32_t o = 0; o < _configured_out.get (*t); ++o) {
1760                         bool mapped = false;
1761                         bool valid;
1762                         for (uint32_t pc = 0; pc < get_count(); ++pc) {
1763                                 new_outs[pc].get_src (*t, o, &mapped);
1764                                 if (mapped) { break; }
1765                         }
1766                         if (!mapped) { continue; }
1767                         uint32_t idx = new_thru.get (*t, o, &valid);
1768                         if (mapped) {
1769                                 new_thru.unset (*t, idx);
1770                         }
1771                 }
1772         }
1773
1774         if (has_midi_bypass ()) {
1775                 // TODO: include midi-bypass in the thru set,
1776                 // remove dedicated handling.
1777                 new_thru.unset (DataType::MIDI, 0);
1778         }
1779
1780         if (_in_map != new_ins || _out_map != new_outs || _thru_map != new_thru) {
1781                 changed = true;
1782         }
1783         _in_map = new_ins;
1784         _out_map = new_outs;
1785         _thru_map = new_thru;
1786
1787         return changed;
1788 }
1789
1790 bool
1791 PluginInsert::reset_map (bool emit)
1792 {
1793         const PinMappings old_in (_in_map);
1794         const PinMappings old_out (_out_map);
1795
1796         _in_map.clear ();
1797         _out_map.clear ();
1798         _thru_map = ChanMapping ();
1799
1800         /* build input map */
1801         for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1802                 uint32_t sc = 0; // side-chain round-robin (all instances)
1803                 uint32_t pc = 0;
1804                 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
1805                         const uint32_t nis = natural_input_streams ().get(*t);
1806                         const uint32_t stride = nis - sidechain_input_pins().get (*t);
1807
1808                         /* SC inputs are last in the plugin-insert.. */
1809                         const uint32_t sc_start = _configured_in.get (*t);
1810                         const uint32_t sc_len = _configured_internal.get (*t) - sc_start;
1811                         /* ...but may not be at the end of the plugin ports.
1812                          * in case the side-chain is not the last port, shift connections back.
1813                          * and connect to side-chain
1814                          */
1815                         uint32_t shift = 0;
1816                         uint32_t ic = 0; // split inputs
1817                         const uint32_t cend = _configured_in.get (*t);
1818
1819                         for (uint32_t in = 0; in < nis; ++in) {
1820                                 const Plugin::IOPortDescription& iod (_plugins[pc]->describe_io_port (*t, true, in));
1821                                 if (iod.is_sidechain) {
1822                                         /* connect sidechain sinks to sidechain inputs in round-robin fashion */
1823                                         if (sc_len > 0) {// side-chain may be hidden
1824                                                 _in_map[pc].set (*t, in, sc_start + sc);
1825                                                 sc = (sc + 1) % sc_len;
1826                                         }
1827                                         ++shift;
1828                                 } else {
1829                                         if (_match.method == Split) {
1830                                                 if (cend == 0) { continue; }
1831                                                 if (_strict_io && ic + stride * pc >= cend) {
1832                                                         break;
1833                                                 }
1834                                                 /* connect *no* sidechain sinks in round-robin fashion */
1835                                                 _in_map[pc].set (*t, in, ic + stride * pc);
1836                                                 if (_strict_io && (ic + 1) == cend) {
1837                                                         break;
1838                                                 }
1839                                                 ic = (ic + 1) % cend;
1840                                         } else {
1841                                                 uint32_t s = in - shift;
1842                                                 if (stride * pc + s < cend) {
1843                                                         _in_map[pc].set (*t, in, s + stride * pc);
1844                                                 }
1845                                         }
1846                                 }
1847                         }
1848                 }
1849         }
1850
1851         /* build output map */
1852         uint32_t pc = 0;
1853         for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
1854                 _out_map[pc] = ChanMapping (ChanCount::min (natural_output_streams(), _configured_out));
1855                 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1856                         _out_map[pc].offset_to(*t, pc * natural_output_streams().get(*t));
1857                 }
1858         }
1859
1860         sanitize_maps ();
1861         if (old_in == _in_map && old_out == _out_map) {
1862                 return false;
1863         }
1864         if (emit) {
1865                 PluginMapChanged (); /* EMIT SIGNAL */
1866                 _mapping_changed = true;
1867                 _session.set_dirty();
1868         }
1869         return true;
1870 }
1871
1872 bool
1873 PluginInsert::configure_io (ChanCount in, ChanCount out)
1874 {
1875         Match old_match = _match;
1876         ChanCount old_in;
1877         ChanCount old_internal;
1878         ChanCount old_out;
1879         ChanCount old_pins;
1880
1881         old_pins = natural_input_streams();
1882         old_in = _configured_in;
1883         old_out = _configured_out;
1884         old_internal = _configured_internal;
1885
1886         _configured_in = in;
1887         _configured_internal = in;
1888         _configured_out = out;
1889
1890         if (_sidechain) {
1891                 /* TODO hide midi-bypass, and custom outs. Best /fake/ "out" here.
1892                  * (currently _sidechain->configure_io always succeeds
1893                  *  since Processor::configure_io() succeeds)
1894                  */
1895                 if (!_sidechain->configure_io (in, out)) {
1896                         DEBUG_TRACE (DEBUG::ChanMapping, "Sidechain configuration failed\n");
1897                         return false;
1898                 }
1899                 _configured_internal += _sidechain->input()->n_ports();
1900
1901                 // include (static_cast<Route*>owner())->name() ??
1902                 _sidechain->input ()-> set_pretty_name (string_compose (_("SC %1"), name ()));
1903         }
1904
1905         /* get plugin configuration */
1906         _match = private_can_support_io_configuration (in, out);
1907 #ifndef NDEBUG
1908         if (DEBUG_ENABLED(DEBUG::ChanMapping)) {
1909                 DEBUG_STR_DECL(a);
1910                 DEBUG_STR_APPEND(a, string_compose ("%1: ",  name()));
1911                 DEBUG_STR_APPEND(a, _match);
1912                 DEBUG_TRACE (DEBUG::ChanMapping, DEBUG_STR(a).str());
1913         }
1914 #endif
1915
1916         /* set the matching method and number of plugins that we will use to meet this configuration */
1917         if (set_count (_match.plugins) == false) {
1918                 PluginIoReConfigure (); /* EMIT SIGNAL */
1919                 _configured = false;
1920                 return false;
1921         }
1922
1923         /* configure plugins */
1924         switch (_match.method) {
1925         case Split:
1926         case Hide:
1927                 if (_plugins.front()->configure_io (natural_input_streams(), out) == false) {
1928                         PluginIoReConfigure (); /* EMIT SIGNAL */
1929                         _configured = false;
1930                         return false;
1931                 }
1932                 break;
1933         case Delegate:
1934                 {
1935                         ChanCount din (_configured_internal);
1936                         ChanCount dout (din); // hint
1937                         if (_custom_cfg) {
1938                                 if (_custom_sinks.n_total () > 0) {
1939                                         din = _custom_sinks;
1940                                 }
1941                                 dout = _custom_out;
1942                         } else if (_preset_out.n_audio () > 0) {
1943                                 dout.set (DataType::AUDIO, _preset_out.n_audio ());
1944                         } else if (dout.n_midi () > 0 && dout.n_audio () == 0) {
1945                                 dout.set (DataType::AUDIO, 2);
1946                         }
1947                         if (out.n_audio () == 0) { out.set (DataType::AUDIO, 1); }
1948                         ChanCount useins;
1949                         DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: Delegate lookup : %2 %3\n", name(), din, dout));
1950                         bool const r = _plugins.front()->can_support_io_configuration (din, dout, &useins);
1951                         assert (r);
1952                         if (useins.n_audio() == 0) {
1953                                 useins = din;
1954                         }
1955                         DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: Delegate configuration: %2 %3\n", name(), useins, dout));
1956
1957                         if (_plugins.front()->configure_io (useins, dout) == false) {
1958                                 PluginIoReConfigure (); /* EMIT SIGNAL */
1959                                 _configured = false;
1960                                 return false;
1961                         }
1962                         if (!_custom_cfg) {
1963                                 _custom_sinks = din;
1964                         }
1965                 }
1966                 break;
1967         default:
1968                 if (_plugins.front()->configure_io (in, out) == false) {
1969                         PluginIoReConfigure (); /* EMIT SIGNAL */
1970                         _configured = false;
1971                         return false;
1972                 }
1973                 break;
1974         }
1975
1976         DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: cfg:%2 state:%3 chn-in:%4 chn-out:%5 inpin:%6 match:%7 cust:%8 size-in:%9 size-out:%10\n",
1977                                 name (),
1978                                 _configured ? "Y" : "N",
1979                                 _maps_from_state ? "Y" : "N",
1980                                 old_in == in ? "==" : "!=",
1981                                 old_out == out ? "==" : "!=",
1982                                 old_pins == natural_input_streams () ? "==" : "!=",
1983                                 old_match.method == _match.method ? "==" : "!=",
1984                                 old_match.custom_cfg == _match.custom_cfg ? "==" : "!=",
1985                                 _in_map.size() == get_count () ? "==" : "!=",
1986                                 _out_map.size() == get_count () ? "==" : "!="
1987                                 ));
1988
1989         bool mapping_changed = false;
1990         if (old_in == in && old_out == out
1991                         && _configured
1992                         && old_pins == natural_input_streams ()
1993                         && old_match.method == _match.method
1994                         && old_match.custom_cfg == _match.custom_cfg
1995                         && _in_map.size() == _out_map.size()
1996                         && _in_map.size() == get_count ()
1997                  ) {
1998                 /* If the configuration has not changed, keep the mapping */
1999                 mapping_changed = sanitize_maps ();
2000         } else if (_match.custom_cfg && _configured) {
2001                 /* don't touch the map in manual mode */
2002                 mapping_changed = sanitize_maps ();
2003         } else {
2004 #ifdef MIXBUS
2005                 if (is_channelstrip ()) {
2006                         /* fake channel map - for wire display */
2007                         _in_map.clear ();
2008                         _out_map.clear ();
2009                         _thru_map = ChanMapping ();
2010                         _in_map[0] = ChanMapping (ChanCount::min (_configured_in, ChanCount (DataType::AUDIO, 2)));
2011                         _out_map[0] = ChanMapping (ChanCount::min (_configured_out, ChanCount (DataType::AUDIO, 2)));
2012                         /* set "thru" map for in-place forward of audio */
2013                         for (uint32_t i = 2; i < _configured_in.n_audio(); ++i) {
2014                                 _thru_map.set (DataType::AUDIO, i, i);
2015                         }
2016                         /* and midi (after implicit 1st channel bypass) */
2017                         for (uint32_t i = 1; i < _configured_in.n_midi(); ++i) {
2018                                 _thru_map.set (DataType::MIDI, i, i);
2019                         }
2020                 } else
2021 #endif
2022                 if (_maps_from_state && old_in == in && old_out == out) {
2023                         mapping_changed = true;
2024                         sanitize_maps ();
2025                 } else {
2026                         /* generate a new mapping */
2027                         mapping_changed = reset_map (false);
2028                 }
2029                 _maps_from_state = false;
2030         }
2031
2032         if (mapping_changed) {
2033                 PluginMapChanged (); /* EMIT SIGNAL */
2034
2035 #ifndef NDEBUG
2036                 if (DEBUG_ENABLED(DEBUG::ChanMapping)) {
2037                         uint32_t pc = 0;
2038                         DEBUG_STR_DECL(a);
2039                         DEBUG_STR_APPEND(a, "\n--------<<--------\n");
2040                         for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
2041                                 if (pc > 0) {
2042                         DEBUG_STR_APPEND(a, "----><----\n");
2043                                 }
2044                                 DEBUG_STR_APPEND(a, string_compose ("Channel Map for %1 plugin %2\n", name(), pc));
2045                                 DEBUG_STR_APPEND(a, " * Inputs:\n");
2046                                 DEBUG_STR_APPEND(a, _in_map[pc]);
2047                                 DEBUG_STR_APPEND(a, " * Outputs:\n");
2048                                 DEBUG_STR_APPEND(a, _out_map[pc]);
2049                         }
2050                         DEBUG_STR_APPEND(a, " * Thru:\n");
2051                         DEBUG_STR_APPEND(a, _thru_map);
2052                         DEBUG_STR_APPEND(a, "-------->>--------\n");
2053                         DEBUG_TRACE (DEBUG::ChanMapping, DEBUG_STR(a).str());
2054                 }
2055 #endif
2056         }
2057
2058         _no_inplace = check_inplace ();
2059         _mapping_changed = false;
2060
2061         /* only the "noinplace_buffers" thread buffers need to be this large,
2062          * this can be optimized. other buffers are fine with
2063          * ChanCount::max (natural_input_streams (), natural_output_streams())
2064          * and route.cc's max (configured_in, configured_out)
2065          *
2066          * no-inplace copies "thru" outputs (to emulate in-place) for
2067          * all outputs (to prevent overwrite) into a temporary space
2068          * which also holds input buffers (in case the plugin does process
2069          * in-place and overwrites those).
2070          *
2071          * this buffers need to be at least as
2072          *   natural_input_streams () + possible outputs.
2073          *
2074          * sidechain inputs add a constraint on the input:
2075          * configured input + sidechain (=_configured_internal)
2076          *
2077          * NB. this also satisfies
2078          * max (natural_input_streams(), natural_output_streams())
2079          * which is needed for silence runs
2080          */
2081         _required_buffers = ChanCount::max (_configured_internal,
2082                         natural_input_streams () + ChanCount::max (_configured_out, natural_output_streams () * get_count ()));
2083
2084         if (old_in != in || old_out != out || old_internal != _configured_internal
2085                         || old_pins != natural_input_streams ()
2086                         || (old_match.method != _match.method && (old_match.method == Split || _match.method == Split))
2087                  ) {
2088                 PluginIoReConfigure (); /* EMIT SIGNAL */
2089         }
2090
2091         _delaybuffers.configure (_configured_out, _plugins.front ()->max_latency ());
2092         _latency_changed = true;
2093
2094         /* we don't know the analysis window size, so we must work with the
2095          * current buffer size here. each request for data fills in these
2096          * buffers and the analyser makes sure it gets enough data for the
2097          * analysis window. We also only analyze audio, so we can ignore
2098          * MIDI buffers.
2099          */
2100         ChanCount cc_analysis_in (DataType::AUDIO, in.n_audio());
2101         ChanCount cc_analysis_out (DataType::AUDIO, out.n_audio());
2102
2103         session().ensure_buffer_set (_signal_analysis_inputs, cc_analysis_in);
2104         _signal_analysis_inputs.set_count (cc_analysis_in);
2105
2106         session().ensure_buffer_set (_signal_analysis_outputs, cc_analysis_out);
2107         _signal_analysis_outputs.set_count (cc_analysis_out);
2108
2109         // std::cerr << "set counts to i" << in.n_audio() << "/o" << out.n_audio() << std::endl;
2110
2111         _configured = true;
2112         return Processor::configure_io (in, out);
2113 }
2114
2115 /** Decide whether this PluginInsert can support a given IO configuration.
2116  *  To do this, we run through a set of possible solutions in rough order of
2117  *  preference.
2118  *
2119  *  @param in Required input channel count.
2120  *  @param out Filled in with the output channel count if we return true.
2121  *  @return true if the given IO configuration can be supported.
2122  */
2123 bool
2124 PluginInsert::can_support_io_configuration (const ChanCount& in, ChanCount& out)
2125 {
2126         if (_sidechain) {
2127                 _sidechain->can_support_io_configuration (in, out); // never fails, sets "out"
2128         }
2129         return private_can_support_io_configuration (in, out).method != Impossible;
2130 }
2131
2132 PluginInsert::Match
2133 PluginInsert::private_can_support_io_configuration (ChanCount const& in, ChanCount& out) const
2134 {
2135         if (!_custom_cfg && _preset_out.n_audio () > 0) {
2136                 // preseed hint (for variable i/o)
2137                 out.set (DataType::AUDIO, _preset_out.n_audio ());
2138         }
2139
2140         Match rv = internal_can_support_io_configuration (in, out);
2141
2142         if (!_custom_cfg && _preset_out.n_audio () > 0) {
2143                 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: using output preset: %2\n", name(), _preset_out));
2144                 out.set (DataType::AUDIO, _preset_out.n_audio ());
2145         }
2146         return rv;
2147 }
2148
2149 /** A private version of can_support_io_configuration which returns the method
2150  *  by which the configuration can be matched, rather than just whether or not
2151  *  it can be.
2152  */
2153 PluginInsert::Match
2154 PluginInsert::internal_can_support_io_configuration (ChanCount const & inx, ChanCount& out) const
2155 {
2156         if (_plugins.empty()) {
2157                 return Match();
2158         }
2159
2160 #ifdef MIXBUS
2161         if (is_channelstrip ()) {
2162                 out = inx;
2163                 return Match (ExactMatch, 1);
2164         }
2165 #endif
2166
2167         /* if a user specified a custom cfg, so be it. */
2168         if (_custom_cfg) {
2169                 PluginInfoPtr info = _plugins.front()->get_info();
2170                 out = _custom_out;
2171                 if (info->reconfigurable_io()) {
2172                         return Match (Delegate, 1, _strict_io, true);
2173                 } else {
2174                         return Match (ExactMatch, get_count(), _strict_io, true);
2175                 }
2176         }
2177
2178         /* try automatic configuration */
2179         Match m = PluginInsert::automatic_can_support_io_configuration (inx, out);
2180
2181         PluginInfoPtr info = _plugins.front()->get_info();
2182         ChanCount inputs  = info->n_inputs;
2183         ChanCount outputs = info->n_outputs;
2184
2185         /* handle case strict-i/o */
2186         if (_strict_io && m.method != Impossible) {
2187                 m.strict_io = true;
2188
2189                 /* special case MIDI instruments */
2190                 if (is_instrument ()) {
2191                         // output = midi-bypass + at most master-out channels.
2192                         ChanCount max_out (DataType::AUDIO, 2); // TODO use master-out
2193                         max_out.set (DataType::MIDI, out.get(DataType::MIDI));
2194                         out = ChanCount::min (out, max_out);
2195                         DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: special case strict-i/o instrument\n", name()));
2196                         return m;
2197                 }
2198
2199                 switch (m.method) {
2200                         case NoInputs:
2201                                 if (inx.n_audio () != out.n_audio ()) { // ignore midi bypass
2202                                         /* replicate processor to match output count (generators and such)
2203                                          * at least enough to feed every output port. */
2204                                         uint32_t f = 1; // at least one. e.g. control data filters, no in, no out.
2205                                         for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2206                                                 uint32_t nout = outputs.get (*t);
2207                                                 if (nout == 0 || inx.get(*t) == 0) { continue; }
2208                                                 f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nout));
2209                                         }
2210                                         out = inx;
2211                                         DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: special case strict-i/o for generator\n", name()));
2212                                         return Match (Replicate, f, _strict_io);
2213                                 }
2214                                 break;
2215                         default:
2216                                 break;
2217                 }
2218
2219                 out = inx;
2220                 return m;
2221         }
2222
2223         if (m.method != Impossible) {
2224                 return m;
2225         }
2226
2227         ChanCount ns_inputs  = inputs - sidechain_input_pins ();
2228
2229         DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: resolving 'Impossible' match...\n", name()));
2230
2231         if (info->reconfigurable_io()) {
2232                 ChanCount useins;
2233                 out = inx; // hint
2234                 if (out.n_midi () > 0 && out.n_audio () == 0) { out.set (DataType::AUDIO, 2); }
2235                 if (out.n_audio () == 0) { out.set (DataType::AUDIO, 1); }
2236                 bool const r = _plugins.front()->can_support_io_configuration (inx + sidechain_input_pins (), out, &useins);
2237                 if (!r) {
2238                         // houston, we have a problem.
2239                         return Match (Impossible, 0);
2240                 }
2241                 // midi bypass
2242                 if (inx.n_midi () > 0 && out.n_midi () == 0) { out.set (DataType::MIDI, 1); }
2243                 return Match (Delegate, 1, _strict_io);
2244         }
2245
2246         ChanCount midi_bypass;
2247         if (inx.get(DataType::MIDI) == 1 && outputs.get(DataType::MIDI) == 0) {
2248                 midi_bypass.set (DataType::MIDI, 1);
2249         }
2250
2251         // add at least as many plugins so that output count matches input count (w/o sidechain pins)
2252         uint32_t f = 0;
2253         for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2254                 uint32_t nin = ns_inputs.get (*t);
2255                 uint32_t nout = outputs.get (*t);
2256                 if (nin == 0 || inx.get(*t) == 0) { continue; }
2257                 // prefer floor() so the count won't overly increase IFF (nin < nout)
2258                 f = max (f, (uint32_t) floor (inx.get(*t) / (float)nout));
2259         }
2260         if (f > 0 && outputs * f >= _configured_out) {
2261                 out = outputs * f + midi_bypass;
2262                 return Match (Replicate, f, _strict_io);
2263         }
2264
2265         // add at least as many plugins needed to connect all inputs (w/o sidechain pins)
2266         f = 0;
2267         for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2268                 uint32_t nin = ns_inputs.get (*t);
2269                 if (nin == 0 || inx.get(*t) == 0) { continue; }
2270                 f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nin));
2271         }
2272         if (f > 0) {
2273                 out = outputs * f + midi_bypass;
2274                 return Match (Replicate, f, _strict_io);
2275         }
2276
2277         // add at least as many plugins needed to connect all inputs
2278         f = 1;
2279         for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2280                 uint32_t nin = inputs.get (*t);
2281                 if (nin == 0 || inx.get(*t) == 0) { continue; }
2282                 f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nin));
2283         }
2284         out = outputs * f + midi_bypass;
2285         return Match (Replicate, f, _strict_io);
2286 }
2287
2288 /* this is the original Ardour 3/4 behavior, mainly for backwards compatibility */
2289 PluginInsert::Match
2290 PluginInsert::automatic_can_support_io_configuration (ChanCount const & inx, ChanCount& out) const
2291 {
2292         if (_plugins.empty()) {
2293                 return Match();
2294         }
2295
2296         PluginInfoPtr info = _plugins.front()->get_info();
2297         ChanCount in; in += inx;
2298         ChanCount midi_bypass;
2299
2300         if (info->reconfigurable_io()) {
2301                 /* Plugin has flexible I/O, so delegate to it
2302                  * pre-seed outputs, plugin tries closest match
2303                  */
2304                 out = in; // hint
2305                 if (out.n_midi () > 0 && out.n_audio () == 0) { out.set (DataType::AUDIO, 2); }
2306                 if (out.n_audio () == 0) { out.set (DataType::AUDIO, 1); }
2307                 bool const r = _plugins.front()->can_support_io_configuration (in + sidechain_input_pins (), out);
2308                 if (!r) {
2309                         return Match (Impossible, 0);
2310                 }
2311                 // midi bypass
2312                 if (in.n_midi () > 0 && out.n_midi () == 0) { out.set (DataType::MIDI, 1); }
2313                 return Match (Delegate, 1);
2314         }
2315
2316         ChanCount inputs  = info->n_inputs;
2317         ChanCount outputs = info->n_outputs;
2318         ChanCount ns_inputs  = inputs - sidechain_input_pins ();
2319
2320         if (in.get(DataType::MIDI) == 1 && outputs.get(DataType::MIDI) == 0) {
2321                 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: bypassing midi-data\n", name()));
2322                 midi_bypass.set (DataType::MIDI, 1);
2323         }
2324         if (in.get(DataType::MIDI) == 1 && inputs.get(DataType::MIDI) == 0) {
2325                 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: hiding midi-port from plugin\n", name()));
2326                 in.set(DataType::MIDI, 0);
2327         }
2328
2329         // add internally provided sidechain ports
2330         ChanCount insc = in + sidechain_input_ports ();
2331
2332         bool no_inputs = true;
2333         for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2334                 if (inputs.get (*t) != 0) {
2335                         no_inputs = false;
2336                         break;
2337                 }
2338         }
2339
2340         if (no_inputs) {
2341                 /* no inputs so we can take any input configuration since we throw it away */
2342                 out = outputs + midi_bypass;
2343                 return Match (NoInputs, 1);
2344         }
2345
2346         /* Plugin inputs match requested inputs + side-chain-ports exactly */
2347         if (inputs == insc) {
2348                 out = outputs + midi_bypass;
2349                 return Match (ExactMatch, 1);
2350         }
2351
2352         /* Plugin inputs matches without side-chain-pins */
2353         if (ns_inputs == in) {
2354                 out = outputs + midi_bypass;
2355                 return Match (ExactMatch, 1);
2356         }
2357
2358         /* We may be able to run more than one copy of the plugin within this insert
2359            to cope with the insert having more inputs than the plugin.
2360            We allow replication only for plugins with either zero or 1 inputs and outputs
2361            for every valid data type.
2362         */
2363
2364         uint32_t f             = 0;
2365         bool     can_replicate = true;
2366         for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2367
2368                 // ignore side-chains
2369                 uint32_t nin = ns_inputs.get (*t);
2370
2371                 // No inputs of this type
2372                 if (nin == 0 && in.get(*t) == 0) {
2373                         continue;
2374                 }
2375
2376                 if (nin != 1 || outputs.get (*t) != 1) {
2377                         can_replicate = false;
2378                         break;
2379                 }
2380
2381                 // Potential factor not set yet
2382                 if (f == 0) {
2383                         f = in.get(*t) / nin;
2384                 }
2385
2386                 // Factor for this type does not match another type, can not replicate
2387                 if (f != (in.get(*t) / nin)) {
2388                         can_replicate = false;
2389                         break;
2390                 }
2391         }
2392
2393         if (can_replicate && f > 0) {
2394                 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2395                         out.set (*t, outputs.get(*t) * f);
2396                 }
2397                 out += midi_bypass;
2398                 return Match (Replicate, f);
2399         }
2400
2401         /* If the processor has exactly one input of a given type, and
2402            the plugin has more, we can feed the single processor input
2403            to some or all of the plugin inputs.  This is rather
2404            special-case-y, but the 1-to-many case is by far the
2405            simplest.  How do I split thy 2 processor inputs to 3
2406            plugin inputs?  Let me count the ways ...
2407         */
2408
2409         bool can_split = true;
2410         for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2411
2412                 bool const can_split_type = (in.get (*t) == 1 && ns_inputs.get (*t) > 1);
2413                 bool const nothing_to_do_for_type = (in.get (*t) == 0 && inputs.get (*t) == 0);
2414
2415                 if (!can_split_type && !nothing_to_do_for_type) {
2416                         can_split = false;
2417                 }
2418         }
2419
2420         if (can_split) {
2421                 out = outputs + midi_bypass;
2422                 return Match (Split, 1);
2423         }
2424
2425         /* If the plugin has more inputs than we want, we can `hide' some of them
2426            by feeding them silence.
2427         */
2428
2429         bool could_hide = false;
2430         bool cannot_hide = false;
2431         ChanCount hide_channels;
2432
2433         for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2434                 if (inputs.get(*t) > in.get(*t)) {
2435                         /* there is potential to hide, since the plugin has more inputs of type t than the insert */
2436                         hide_channels.set (*t, inputs.get(*t) - in.get(*t));
2437                         could_hide = true;
2438                 } else if (inputs.get(*t) < in.get(*t)) {
2439                         /* we definitely cannot hide, since the plugin has fewer inputs of type t than the insert */
2440                         cannot_hide = true;
2441                 }
2442         }
2443
2444         if (could_hide && !cannot_hide) {
2445                 out = outputs + midi_bypass;
2446                 return Match (Hide, 1, false, false, hide_channels);
2447         }
2448
2449         return Match (Impossible, 0);
2450 }
2451
2452
2453 XMLNode&
2454 PluginInsert::state ()
2455 {
2456         XMLNode& node = Processor::state ();
2457
2458         node.set_property("type", _plugins[0]->state_node_name());
2459         node.set_property("unique-id", _plugins[0]->unique_id());
2460         node.set_property("count", (uint32_t)_plugins.size());
2461
2462         /* remember actual i/o configuration (for later placeholder
2463          * in case the plugin goes missing) */
2464         node.add_child_nocopy (* _configured_in.state (X_("ConfiguredInput")));
2465         node.add_child_nocopy (* _custom_sinks.state (X_("CustomSinks")));
2466         node.add_child_nocopy (* _configured_out.state (X_("ConfiguredOutput")));
2467         node.add_child_nocopy (* _preset_out.state (X_("PresetOutput")));
2468
2469         /* save custom i/o config */
2470         node.set_property("custom", _custom_cfg);
2471         for (uint32_t pc = 0; pc < get_count(); ++pc) {
2472                 char tmp[128];
2473                 snprintf (tmp, sizeof(tmp), "InputMap-%d", pc);
2474                 node.add_child_nocopy (* _in_map[pc].state (tmp));
2475                 snprintf (tmp, sizeof(tmp), "OutputMap-%d", pc);
2476                 node.add_child_nocopy (* _out_map[pc].state (tmp));
2477         }
2478         node.add_child_nocopy (* _thru_map.state ("ThruMap"));
2479
2480         if (_sidechain) {
2481                 node.add_child_nocopy (_sidechain->get_state ());
2482         }
2483
2484         _plugins[0]->set_insert_id(this->id());
2485         node.add_child_nocopy (_plugins[0]->get_state());
2486
2487         for (Controls::iterator c = controls().begin(); c != controls().end(); ++c) {
2488                 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> ((*c).second);
2489                 if (ac) {
2490                         node.add_child_nocopy (ac->get_state());
2491                 }
2492         }
2493
2494         return node;
2495 }
2496
2497 void
2498 PluginInsert::set_control_ids (const XMLNode& node, int version)
2499 {
2500         const XMLNodeList& nlist = node.children();
2501         XMLNodeConstIterator iter;
2502         set<Evoral::Parameter>::const_iterator p;
2503
2504         for (iter = nlist.begin(); iter != nlist.end(); ++iter) {
2505                 if ((*iter)->name() == Controllable::xml_node_name) {
2506
2507                         uint32_t p = (uint32_t)-1;
2508 #ifdef LV2_SUPPORT
2509                         std::string str;
2510                         if ((*iter)->get_property (X_("symbol"), str)) {
2511                                 boost::shared_ptr<LV2Plugin> lv2plugin = boost::dynamic_pointer_cast<LV2Plugin> (_plugins[0]);
2512                                 if (lv2plugin) {
2513                                         p = lv2plugin->port_index(str.c_str());
2514                                 }
2515                         }
2516 #endif
2517                         if (p == (uint32_t)-1) {
2518                                 (*iter)->get_property (X_("parameter"), p);
2519                         }
2520
2521                         if (p != (uint32_t)-1) {
2522
2523                                 /* this may create the new controllable */
2524
2525                                 boost::shared_ptr<Evoral::Control> c = control (Evoral::Parameter (PluginAutomation, 0, p));
2526
2527 #ifndef NO_PLUGIN_STATE
2528                                 if (!c) {
2529                                         continue;
2530                                 }
2531                                 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> (c);
2532                                 if (ac) {
2533                                         ac->set_state (**iter, version);
2534                                 }
2535 #endif
2536                         }
2537                 }
2538         }
2539 }
2540
2541 int
2542 PluginInsert::set_state(const XMLNode& node, int version)
2543 {
2544         XMLNodeList nlist = node.children();
2545         XMLNodeIterator niter;
2546         XMLPropertyList plist;
2547         ARDOUR::PluginType type;
2548
2549         std::string str;
2550         if (!node.get_property ("type", str)) {
2551                 error << _("XML node describing plugin is missing the `type' field") << endmsg;
2552                 return -1;
2553         }
2554
2555         if (str == X_("ladspa") || str == X_("Ladspa")) { /* handle old school sessions */
2556                 type = ARDOUR::LADSPA;
2557         } else if (str == X_("lv2")) {
2558                 type = ARDOUR::LV2;
2559         } else if (str == X_("windows-vst")) {
2560                 type = ARDOUR::Windows_VST;
2561         } else if (str == X_("lxvst")) {
2562                 type = ARDOUR::LXVST;
2563         } else if (str == X_("mac-vst")) {
2564                 type = ARDOUR::MacVST;
2565         } else if (str == X_("audiounit")) {
2566                 type = ARDOUR::AudioUnit;
2567         } else if (str == X_("luaproc")) {
2568                 type = ARDOUR::Lua;
2569         } else {
2570                 error << string_compose (_("unknown plugin type %1 in plugin insert state"), str) << endmsg;
2571                 return -1;
2572         }
2573
2574         XMLProperty const * prop = node.property ("unique-id");
2575
2576         if (prop == 0) {
2577 #ifdef WINDOWS_VST_SUPPORT
2578                 /* older sessions contain VST plugins with only an "id" field.  */
2579                 if (type == ARDOUR::Windows_VST) {
2580                         prop = node.property ("id");
2581                 }
2582 #endif
2583
2584 #ifdef LXVST_SUPPORT
2585                 /*There shouldn't be any older sessions with linuxVST support.. but anyway..*/
2586                 if (type == ARDOUR::LXVST) {
2587                         prop = node.property ("id");
2588                 }
2589 #endif
2590
2591                 /* recheck  */
2592
2593                 if (prop == 0) {
2594                         error << _("Plugin has no unique ID field") << endmsg;
2595                         return -1;
2596                 }
2597         }
2598
2599         boost::shared_ptr<Plugin> plugin = find_plugin (_session, prop->value(), type);
2600         bool any_vst = false;
2601
2602         /* treat VST plugins equivalent if they have the same uniqueID
2603          * allow to move sessions windows <> linux */
2604 #ifdef LXVST_SUPPORT
2605         if (plugin == 0 && (type == ARDOUR::Windows_VST || type == ARDOUR::MacVST)) {
2606                 type = ARDOUR::LXVST;
2607                 plugin = find_plugin (_session, prop->value(), type);
2608                 if (plugin) { any_vst = true; }
2609         }
2610 #endif
2611
2612 #ifdef WINDOWS_VST_SUPPORT
2613         if (plugin == 0 && (type == ARDOUR::LXVST || type == ARDOUR::MacVST)) {
2614                 type = ARDOUR::Windows_VST;
2615                 plugin = find_plugin (_session, prop->value(), type);
2616                 if (plugin) { any_vst = true; }
2617         }
2618 #endif
2619
2620 #ifdef MACVST_SUPPORT
2621         if (plugin == 0 && (type == ARDOUR::Windows_VST || type == ARDOUR::LXVST)) {
2622                 type = ARDOUR::MacVST;
2623                 plugin = find_plugin (_session, prop->value(), type);
2624                 if (plugin) { any_vst = true; }
2625         }
2626 #endif
2627
2628         if (plugin == 0 && type == ARDOUR::Lua) {
2629                 /* unique ID (sha1 of script) was not found,
2630                  * load the plugin from the serialized version in the
2631                  * session-file instead.
2632                  */
2633                 boost::shared_ptr<LuaProc> lp (new LuaProc (_session.engine(), _session, ""));
2634                 XMLNode *ls = node.child (lp->state_node_name().c_str());
2635                 if (ls && lp) {
2636                         lp->set_script_from_state (*ls);
2637                         plugin = lp;
2638                 }
2639         }
2640
2641         if (plugin == 0) {
2642                 error << string_compose(
2643                         _("Found a reference to a plugin (\"%1\") that is unknown.\n"
2644                           "Perhaps it was removed or moved since it was last used."),
2645                         prop->value())
2646                       << endmsg;
2647                 return -1;
2648         }
2649
2650         // The name of the PluginInsert comes from the plugin, nothing else
2651         _name = plugin->get_info()->name;
2652
2653         uint32_t count = 1;
2654
2655         // Processor::set_state() will set this, but too late
2656         // for it to be available when setting up plugin
2657         // state. We can't call Processor::set_state() until
2658         // the plugins themselves are created and added.
2659
2660         set_id (node);
2661
2662         if (_plugins.empty()) {
2663                 /* if we are adding the first plugin, we will need to set
2664                    up automatable controls.
2665                 */
2666                 add_plugin (plugin);
2667                 create_automatable_parameters ();
2668                 set_control_ids (node, version);
2669         }
2670
2671         node.get_property ("count", count);
2672
2673         if (_plugins.size() != count) {
2674                 for (uint32_t n = 1; n < count; ++n) {
2675                         add_plugin (plugin_factory (plugin));
2676                 }
2677         }
2678
2679         Processor::set_state (node, version);
2680
2681         PBD::ID new_id = this->id();
2682         PBD::ID old_id = this->id();
2683
2684         node.get_property ("id", old_id);
2685
2686         for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2687
2688                 /* find the node with the type-specific node name ("lv2", "ladspa", etc)
2689                    and set all plugins to the same state.
2690                 */
2691
2692                 if (   ((*niter)->name() == plugin->state_node_name())
2693                     || (any_vst && ((*niter)->name() == "lxvst" || (*niter)->name() == "windows-vst" || (*niter)->name() == "mac-vst"))
2694                    ) {
2695
2696                         for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2697                                 /* Plugin state can include external files which are named after the ID.
2698                                  *
2699                                  * If regenerate_xml_or_string_ids() is set, the ID will already have
2700                                  * been changed, so we need to use the old ID from the XML to load the
2701                                  * state and then update the ID.
2702                                  *
2703                                  * When copying a plugin-state, route_ui takes care of of updating the ID,
2704                                  * but we need to call set_insert_id() to clear the cached plugin-state
2705                                  * and force a change.
2706                                  */
2707                                 if (!regenerate_xml_or_string_ids ()) {
2708                                         (*i)->set_insert_id (new_id);
2709                                 } else {
2710                                         (*i)->set_insert_id (old_id);
2711                                 }
2712
2713                                 (*i)->set_state (**niter, version);
2714
2715                                 if (regenerate_xml_or_string_ids ()) {
2716                                         (*i)->set_insert_id (new_id);
2717                                 }
2718                         }
2719
2720                         /* when copying plugin state, notify UI */
2721                         for (Controls::const_iterator li = controls().begin(); li != controls().end(); ++li) {
2722                                 boost::shared_ptr<PBD::Controllable> c = boost::dynamic_pointer_cast<PBD::Controllable> (li->second);
2723                                 if (c) {
2724                                         c->Changed (false, Controllable::NoGroup); /* EMIT SIGNAL */
2725                                 }
2726                         }
2727
2728                         break;
2729                 }
2730         }
2731
2732         if (version < 3000) {
2733
2734                 /* Only 2.X sessions need a call to set_parameter_state() - in 3.X and above
2735                    this is all handled by Automatable
2736                 */
2737
2738                 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2739                         if ((*niter)->name() == "Redirect") {
2740                                 /* XXX do we need to tackle placement? i think not (pd; oct 16 2009) */
2741                                 Processor::set_state (**niter, version);
2742                                 break;
2743                         }
2744                 }
2745
2746                 set_parameter_state_2X (node, version);
2747         }
2748
2749         node.get_property (X_("custom"), _custom_cfg);
2750
2751         uint32_t in_maps = 0;
2752         uint32_t out_maps = 0;
2753         XMLNodeList kids = node.children ();
2754         for (XMLNodeIterator i = kids.begin(); i != kids.end(); ++i) {
2755                 if ((*i)->name() == X_("ConfiguredInput")) {
2756                         _configured_in = ChanCount(**i);
2757                 }
2758                 if ((*i)->name() == X_("CustomSinks")) {
2759                         _custom_sinks = ChanCount(**i);
2760                 }
2761                 if ((*i)->name() == X_("ConfiguredOutput")) {
2762                         _custom_out = ChanCount(**i);
2763                         _configured_out = ChanCount(**i);
2764                 }
2765                 if ((*i)->name() == X_("PresetOutput")) {
2766                         _preset_out = ChanCount(**i);
2767                 }
2768                 if (strncmp ((*i)->name ().c_str(), X_("InputMap-"), 9) == 0) {
2769                         long pc = atol (&((*i)->name().c_str()[9]));
2770                         if (pc >= 0 && pc <= (long) get_count()) {
2771                                 _in_map[pc] = ChanMapping (**i);
2772                                 ++in_maps;
2773                         }
2774                 }
2775                 if (strncmp ((*i)->name ().c_str(), X_("OutputMap-"), 10) == 0) {
2776                         long pc = atol (&((*i)->name().c_str()[10]));
2777                         if (pc >= 0 && pc <= (long) get_count()) {
2778                                 _out_map[pc] = ChanMapping (**i);
2779                                 ++out_maps;
2780                         }
2781                 }
2782                 if ((*i)->name () ==  "ThruMap") {
2783                                 _thru_map = ChanMapping (**i);
2784                 }
2785
2786                 // sidechain is a Processor (IO)
2787                 if ((*i)->name () ==  Processor::state_node_name) {
2788                         if (!_sidechain) {
2789                                 if (regenerate_xml_or_string_ids ()) {
2790                                         add_sidechain_from_xml (**i, version);
2791                                 } else {
2792                                         add_sidechain (0);
2793                                 }
2794                         }
2795                         if (!regenerate_xml_or_string_ids ()) {
2796                                 _sidechain->set_state (**i, version);
2797                         } else {
2798                                 update_sidechain_name ();
2799                         }
2800                 }
2801         }
2802
2803         if (in_maps == out_maps && out_maps >0 && out_maps == get_count()) {
2804                 _maps_from_state = true;
2805         }
2806
2807         for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2808                 if (active()) {
2809                         (*i)->activate ();
2810                 } else {
2811                         (*i)->deactivate ();
2812                 }
2813         }
2814
2815         PluginConfigChanged (); /* EMIT SIGNAL */
2816         return 0;
2817 }
2818
2819 void
2820 PluginInsert::update_id (PBD::ID id)
2821 {
2822         set_id (id.to_s());
2823         for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2824                 (*i)->set_insert_id (id);
2825         }
2826 }
2827
2828 void
2829 PluginInsert::set_owner (SessionObject* o)
2830 {
2831         Processor::set_owner (o);
2832         for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2833                 (*i)->set_owner (o);
2834         }
2835 }
2836
2837 void
2838 PluginInsert::set_state_dir (const std::string& d)
2839 {
2840         // state() only saves the state of the first plugin
2841         _plugins[0]->set_state_dir (d);
2842 }
2843
2844 void
2845 PluginInsert::set_parameter_state_2X (const XMLNode& node, int version)
2846 {
2847         XMLNodeList nlist = node.children();
2848         XMLNodeIterator niter;
2849
2850         /* look for port automation node */
2851
2852         for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2853
2854                 if ((*niter)->name() != port_automation_node_name) {
2855                         continue;
2856                 }
2857
2858                 XMLNodeList cnodes;
2859                 XMLNodeConstIterator iter;
2860                 XMLNode *child;
2861                 uint32_t port_id;
2862
2863                 cnodes = (*niter)->children ("port");
2864
2865                 for (iter = cnodes.begin(); iter != cnodes.end(); ++iter){
2866
2867                         child = *iter;
2868
2869                         if (!child->get_property("number", port_id)) {
2870                                 warning << _("PluginInsert: Auto: no ladspa port number") << endmsg;
2871                                 continue;
2872                         }
2873
2874                         if (port_id >= _plugins[0]->parameter_count()) {
2875                                 warning << _("PluginInsert: Auto: port id out of range") << endmsg;
2876                                 continue;
2877                         }
2878
2879                         boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(
2880                                         control(Evoral::Parameter(PluginAutomation, 0, port_id), true));
2881
2882                         if (c && c->alist()) {
2883                                 if (!child->children().empty()) {
2884                                         c->alist()->set_state (*child->children().front(), version);
2885                                 }
2886                         } else {
2887                                 error << string_compose (_("PluginInsert: automatable control %1 not found - ignored"), port_id) << endmsg;
2888                         }
2889                 }
2890
2891                 /* done */
2892
2893                 break;
2894         }
2895 }
2896
2897 boost::shared_ptr<ReadOnlyControl>
2898 PluginInsert::control_output (uint32_t num) const
2899 {
2900         CtrlOutMap::const_iterator i = _control_outputs.find (num);
2901         if (i == _control_outputs.end ()) {
2902                 return boost::shared_ptr<ReadOnlyControl> ();
2903         } else {
2904                 return (*i).second;
2905         }
2906 }
2907
2908 string
2909 PluginInsert::describe_parameter (Evoral::Parameter param)
2910 {
2911         if (param.type() == PluginAutomation) {
2912                 return _plugins[0]->describe_parameter (param);
2913         } else if (param.type() == PluginPropertyAutomation) {
2914                 boost::shared_ptr<AutomationControl> c(automation_control(param));
2915                 if (c && !c->desc().label.empty()) {
2916                         return c->desc().label;
2917                 }
2918         }
2919         return Automatable::describe_parameter(param);
2920 }
2921
2922 ARDOUR::samplecnt_t
2923 PluginInsert::signal_latency() const
2924 {
2925         if (!_pending_active) {
2926                 return 0;
2927         }
2928         if (_user_latency) {
2929                 return _user_latency;
2930         }
2931
2932         return _plugins[0]->signal_latency ();
2933 }
2934
2935 ARDOUR::PluginType
2936 PluginInsert::type ()
2937 {
2938        return plugin()->get_info()->type;
2939 }
2940
2941 PluginInsert::PluginControl::PluginControl (PluginInsert*                     p,
2942                                             const Evoral::Parameter&          param,
2943                                             const ParameterDescriptor&        desc,
2944                                             boost::shared_ptr<AutomationList> list)
2945         : AutomationControl (p->session(), param, desc, list, p->describe_parameter(param))
2946         , _plugin (p)
2947 {
2948         if (alist()) {
2949                 if (desc.toggled) {
2950                         list->set_interpolation(Evoral::ControlList::Discrete);
2951                 }
2952         }
2953 }
2954
2955 /** @param val `user' value */
2956
2957 void
2958 PluginInsert::PluginControl::actually_set_value (double user_val, PBD::Controllable::GroupControlDisposition group_override)
2959 {
2960         /* FIXME: probably should be taking out some lock here.. */
2961
2962         for (Plugins::iterator i = _plugin->_plugins.begin(); i != _plugin->_plugins.end(); ++i) {
2963                 (*i)->set_parameter (_list->parameter().id(), user_val);
2964         }
2965
2966         boost::shared_ptr<Plugin> iasp = _plugin->_impulseAnalysisPlugin.lock();
2967         if (iasp) {
2968                 iasp->set_parameter (_list->parameter().id(), user_val);
2969         }
2970
2971         AutomationControl::actually_set_value (user_val, group_override);
2972 }
2973
2974 void
2975 PluginInsert::PluginControl::catch_up_with_external_value (double user_val)
2976 {
2977         AutomationControl::actually_set_value (user_val, Controllable::NoGroup);
2978 }
2979
2980 XMLNode&
2981 PluginInsert::PluginControl::get_state ()
2982 {
2983         XMLNode& node (AutomationControl::get_state());
2984         node.set_property (X_("parameter"), parameter().id());
2985 #ifdef LV2_SUPPORT
2986         boost::shared_ptr<LV2Plugin> lv2plugin = boost::dynamic_pointer_cast<LV2Plugin> (_plugin->_plugins[0]);
2987         if (lv2plugin) {
2988                 node.set_property (X_("symbol"), lv2plugin->port_symbol (parameter().id()));
2989         }
2990 #endif
2991
2992         return node;
2993 }
2994
2995 /** @return `user' val */
2996 double
2997 PluginInsert::PluginControl::get_value () const
2998 {
2999         boost::shared_ptr<Plugin> plugin = _plugin->plugin (0);
3000
3001         if (!plugin) {
3002                 return 0.0;
3003         }
3004
3005         return plugin->get_parameter (_list->parameter().id());
3006 }
3007
3008 PluginInsert::PluginPropertyControl::PluginPropertyControl (PluginInsert*                     p,
3009                                                             const Evoral::Parameter&          param,
3010                                                             const ParameterDescriptor&        desc,
3011                                                             boost::shared_ptr<AutomationList> list)
3012         : AutomationControl (p->session(), param, desc, list)
3013         , _plugin (p)
3014 {
3015 }
3016
3017 void
3018 PluginInsert::PluginPropertyControl::actually_set_value (double user_val, Controllable::GroupControlDisposition gcd)
3019 {
3020         /* Old numeric set_value(), coerce to appropriate datatype if possible.
3021            This is lossy, but better than nothing until Ardour's automation system
3022            can handle various datatypes all the way down. */
3023         const Variant value(_desc.datatype, user_val);
3024         if (value.type() == Variant::NOTHING) {
3025                 error << "set_value(double) called for non-numeric property" << endmsg;
3026                 return;
3027         }
3028
3029         for (Plugins::iterator i = _plugin->_plugins.begin(); i != _plugin->_plugins.end(); ++i) {
3030                 (*i)->set_property(_list->parameter().id(), value);
3031         }
3032
3033         _value = value;
3034
3035         AutomationControl::actually_set_value (user_val, gcd);
3036 }
3037
3038 XMLNode&
3039 PluginInsert::PluginPropertyControl::get_state ()
3040 {
3041         XMLNode& node (AutomationControl::get_state());
3042         node.set_property (X_("property"), parameter().id());
3043         node.remove_property (X_("value"));
3044
3045         return node;
3046 }
3047
3048 double
3049 PluginInsert::PluginPropertyControl::get_value () const
3050 {
3051         return _value.to_double();
3052 }
3053
3054 boost::shared_ptr<Plugin>
3055 PluginInsert::get_impulse_analysis_plugin()
3056 {
3057         boost::shared_ptr<Plugin> ret;
3058         if (_impulseAnalysisPlugin.expired()) {
3059                 // LV2 in particular uses various _session params
3060                 // during init() -- most notably block_size..
3061                 // not great.
3062                 ret = plugin_factory(_plugins[0]);
3063                 ChanCount out (internal_output_streams ());
3064                 if (ret->get_info ()->reconfigurable_io ()) {
3065                         // populate get_info ()->n_inputs and ->n_outputs
3066                         ChanCount useins;
3067                         ret->can_support_io_configuration (internal_input_streams (), out, &useins);
3068                         assert (out == internal_output_streams ());
3069                 }
3070                 ret->configure_io (internal_input_streams (), out);
3071                 ret->set_owner (_owner);
3072                 _impulseAnalysisPlugin = ret;
3073         } else {
3074                 ret = _impulseAnalysisPlugin.lock();
3075         }
3076
3077         return ret;
3078 }
3079
3080 void
3081 PluginInsert::collect_signal_for_analysis (samplecnt_t nframes)
3082 {
3083         // called from outside the audio thread, so this should be safe
3084         // only do audio as analysis is (currently) only for audio plugins
3085         _signal_analysis_inputs.ensure_buffers (DataType::AUDIO, input_streams().n_audio(),  nframes);
3086         _signal_analysis_outputs.ensure_buffers (DataType::AUDIO, output_streams().n_audio(), nframes);
3087
3088         _signal_analysis_collected_nframes   = 0;
3089         _signal_analysis_collect_nframes_max = nframes;
3090 }
3091
3092 /** Add a plugin to our list */
3093 void
3094 PluginInsert::add_plugin (boost::shared_ptr<Plugin> plugin)
3095 {
3096         plugin->set_insert_id (this->id());
3097         plugin->set_owner (_owner);
3098
3099         if (_plugins.empty()) {
3100                 /* first (and probably only) plugin instance - connect to relevant signals */
3101
3102                 plugin->ParameterChangedExternally.connect_same_thread (*this, boost::bind (&PluginInsert::parameter_changed_externally, this, _1, _2));
3103                 plugin->StartTouch.connect_same_thread (*this, boost::bind (&PluginInsert::start_touch, this, _1));
3104                 plugin->EndTouch.connect_same_thread (*this, boost::bind (&PluginInsert::end_touch, this, _1));
3105                 _custom_sinks = plugin->get_info()->n_inputs;
3106                 // cache sidechain port count
3107                 _cached_sidechain_pins.reset ();
3108                 const ChanCount& nis (plugin->get_info()->n_inputs);
3109                 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
3110                         for (uint32_t in = 0; in < nis.get (*t); ++in) {
3111                                 const Plugin::IOPortDescription& iod (plugin->describe_io_port (*t, true, in));
3112                                 if (iod.is_sidechain) {
3113                                         _cached_sidechain_pins.set (*t, 1 + _cached_sidechain_pins.n(*t));
3114                                 }
3115                         }
3116                 }
3117         }
3118 #if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT || defined MACVST_SUPPORT)
3119         boost::shared_ptr<VSTPlugin> vst = boost::dynamic_pointer_cast<VSTPlugin> (plugin);
3120         if (vst) {
3121                 vst->set_insert (this, _plugins.size ());
3122         }
3123 #endif
3124
3125         _plugins.push_back (plugin);
3126 }
3127
3128 void
3129 PluginInsert::add_sidechain_from_xml (const XMLNode& node, int version)
3130 {
3131         if (version < 3000) {
3132                 return;
3133         }
3134
3135         XMLNodeList nlist = node.children();
3136
3137         if (nlist.size() == 0) {
3138                 return;
3139         }
3140
3141         uint32_t audio = 0;
3142         uint32_t midi = 0;
3143
3144         XMLNodeConstIterator it = nlist.front()->children().begin();
3145         for ( ; it != nlist.front()->children().end(); ++ it) {
3146                 if ((*it)->name() == "Port") {
3147                         DataType type(DataType::NIL);
3148                         (*it)->get_property ("type", type);
3149                         if (type == DataType::AUDIO) {
3150                                 ++audio;
3151                         } else if (type == DataType::MIDI) {
3152                                 ++midi;
3153                         }
3154                 }
3155         }
3156
3157         ChanCount in_cc = ChanCount();
3158         in_cc.set (DataType::AUDIO, audio);
3159         in_cc.set (DataType::MIDI, midi);
3160
3161         add_sidechain (audio, midi);
3162 }
3163
3164 bool
3165 PluginInsert::load_preset (ARDOUR::Plugin::PresetRecord pr)
3166 {
3167         bool ok = true;
3168         for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
3169                 if (! (*i)->load_preset (pr)) {
3170                         ok = false;
3171                 }
3172         }
3173         return ok;
3174 }
3175
3176 void
3177 PluginInsert::realtime_handle_transport_stopped ()
3178 {
3179         for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
3180                 (*i)->realtime_handle_transport_stopped ();
3181         }
3182 }
3183
3184 void
3185 PluginInsert::realtime_locate ()
3186 {
3187         for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
3188                 (*i)->realtime_locate ();
3189         }
3190 }
3191
3192 void
3193 PluginInsert::monitoring_changed ()
3194 {
3195         for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
3196                 (*i)->monitoring_changed ();
3197         }
3198 }
3199
3200 void
3201 PluginInsert::latency_changed ()
3202 {
3203         // this is called in RT context, LatencyChanged is emitted after run()
3204         _latency_changed = true;
3205         // XXX This also needs a proper API not an owner() hack.
3206         assert (owner ());
3207         static_cast<Route*>(owner ())->processor_latency_changed (); /* EMIT SIGNAL */
3208 }
3209
3210 void
3211 PluginInsert::start_touch (uint32_t param_id)
3212 {
3213         boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id));
3214         if (ac) {
3215                 // ToDo subtract _plugin_signal_latency  from audible_sample() when rolling, assert > 0
3216                 ac->start_touch (session().audible_sample());
3217         }
3218 }
3219
3220 void
3221 PluginInsert::end_touch (uint32_t param_id)
3222 {
3223         boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id));
3224         if (ac) {
3225                 // ToDo subtract _plugin_signal_latency  from audible_sample() when rolling, assert > 0
3226                 ac->stop_touch (session().audible_sample());
3227         }
3228 }
3229
3230 bool
3231 PluginInsert::provides_stats () const
3232 {
3233 #if defined MIXBUS && defined NDEBUG
3234         if (is_channelstrip () || !display_to_user ()) {
3235                 return false;
3236         }
3237 #endif
3238         return true;
3239 }
3240
3241 bool
3242 PluginInsert::get_stats (uint64_t& min, uint64_t& max, double& avg, double& dev) const
3243 {
3244         /* TODO: consider taking a try/lock: Don't run concurrently with
3245          * TimingStats::update, TimingStats::reset.
3246          */
3247         return _timing_stats.get_stats (min, max, avg, dev);
3248 }
3249
3250 void
3251 PluginInsert::clear_stats ()
3252 {
3253         g_atomic_int_set (&_stat_reset, 1);
3254 }
3255
3256 std::ostream& operator<<(std::ostream& o, const ARDOUR::PluginInsert::Match& m)
3257 {
3258         switch (m.method) {
3259                 case PluginInsert::Impossible: o << "Impossible"; break;
3260                 case PluginInsert::Delegate:   o << "Delegate"; break;
3261                 case PluginInsert::NoInputs:   o << "NoInputs"; break;
3262                 case PluginInsert::ExactMatch: o << "ExactMatch"; break;
3263                 case PluginInsert::Replicate:  o << "Replicate"; break;
3264                 case PluginInsert::Split:      o << "Split"; break;
3265                 case PluginInsert::Hide:       o << "Hide"; break;
3266         }
3267         o << " cnt: " << m.plugins
3268                 << (m.strict_io ? " strict-io" : "")
3269                 << (m.custom_cfg ? " custom-cfg" : "");
3270         if (m.method == PluginInsert::Hide) {
3271                 o << " hide: " << m.hide;
3272         }
3273         o << "\n";
3274         return o;
3275 }