properly calculate requrired thread buffers
[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/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
40 #ifdef LV2_SUPPORT
41 #include "ardour/lv2_plugin.h"
42 #endif
43
44 #ifdef WINDOWS_VST_SUPPORT
45 #include "ardour/windows_vst_plugin.h"
46 #endif
47
48 #ifdef LXVST_SUPPORT
49 #include "ardour/lxvst_plugin.h"
50 #endif
51
52 #ifdef AUDIOUNIT_SUPPORT
53 #include "ardour/audio_unit.h"
54 #endif
55
56 #include "ardour/session.h"
57 #include "ardour/types.h"
58
59 #include "i18n.h"
60
61 using namespace std;
62 using namespace ARDOUR;
63 using namespace PBD;
64
65 const string PluginInsert::port_automation_node_name = "PortAutomation";
66
67 PluginInsert::PluginInsert (Session& s, boost::shared_ptr<Plugin> plug)
68         : Processor (s, (plug ? plug->name() : string ("toBeRenamed")))
69         , _signal_analysis_collected_nframes(0)
70         , _signal_analysis_collect_nframes_max(0)
71         , _configured (false)
72         , _no_inplace (false)
73         , _strict_io (false)
74         , _custom_cfg (false)
75         , _maps_from_state (false)
76 {
77         /* the first is the master */
78
79         if (plug) {
80                 add_plugin (plug);
81                 create_automatable_parameters ();
82                 const ChanCount& sc (sidechain_input_pins ());
83                 if (sc.n_audio () > 0) {
84                         add_sidechain (sc.n_audio ());
85                 }
86         }
87 }
88
89 PluginInsert::~PluginInsert ()
90 {
91 }
92
93 void
94 PluginInsert::set_strict_io (bool b)
95 {
96         bool changed = _strict_io != b;
97         _strict_io = b;
98         if (changed) {
99                 PluginConfigChanged (); /* EMIT SIGNAL */
100         }
101 }
102
103 bool
104 PluginInsert::set_count (uint32_t num)
105 {
106         bool require_state = !_plugins.empty();
107
108         /* this is a bad idea.... we shouldn't do this while active.
109            only a route holding their redirect_lock should be calling this
110         */
111
112         if (num == 0) {
113                 return false;
114         } else if (num > _plugins.size()) {
115                 uint32_t diff = num - _plugins.size();
116
117                 for (uint32_t n = 0; n < diff; ++n) {
118                         boost::shared_ptr<Plugin> p = plugin_factory (_plugins[0]);
119                         add_plugin (p);
120                         if (active ()) {
121                                 p->activate ();
122                         }
123
124                         if (require_state) {
125                                 /* XXX do something */
126                         }
127                 }
128                 PluginConfigChanged (); /* EMIT SIGNAL */
129
130         } else if (num < _plugins.size()) {
131                 uint32_t diff = _plugins.size() - num;
132                 for (uint32_t n= 0; n < diff; ++n) {
133                         _plugins.pop_back();
134                 }
135                 PluginConfigChanged (); /* EMIT SIGNAL */
136         }
137
138         return true;
139 }
140
141
142 void
143 PluginInsert::set_outputs (const ChanCount& c)
144 {
145         bool changed = (_custom_out != c) && _custom_cfg;
146         _custom_out = c;
147         if (changed) {
148                 PluginConfigChanged (); /* EMIT SIGNAL */
149         }
150 }
151
152 void
153 PluginInsert::set_custom_cfg (bool b)
154 {
155         bool changed = _custom_cfg != b;
156         _custom_cfg = b;
157         if (changed) {
158                 PluginConfigChanged (); /* EMIT SIGNAL */
159         }
160 }
161
162 bool
163 PluginInsert::add_sidechain (uint32_t n_audio)
164 {
165         // caller must hold process lock
166         if (_sidechain) {
167                 return false;
168         }
169         std::ostringstream n;
170         if (n_audio > 0) {
171                 n << "Sidechain " << Session::next_name_id ();
172         } else {
173                 n << "TO BE RESET FROM XML";
174         }
175         SideChain *sc = new SideChain (_session, n.str ());
176         _sidechain = boost::shared_ptr<SideChain> (sc);
177         _sidechain->activate ();
178         for (uint32_t n = 0; n < n_audio; ++n) {
179                 _sidechain->input()->add_port ("", owner()); // add a port, don't connect.
180         }
181         PluginConfigChanged (); /* EMIT SIGNAL */
182         return true;
183 }
184
185 bool
186 PluginInsert::del_sidechain ()
187 {
188         if (!_sidechain) {
189                 return false;
190         }
191         _sidechain.reset ();
192         PluginConfigChanged (); /* EMIT SIGNAL */
193         return true;
194 }
195
196 void
197 PluginInsert::control_list_automation_state_changed (Evoral::Parameter which, AutoState s)
198 {
199         if (which.type() != PluginAutomation)
200                 return;
201
202         boost::shared_ptr<AutomationControl> c
203                         = boost::dynamic_pointer_cast<AutomationControl>(control (which));
204
205         if (c && s != Off) {
206                 _plugins[0]->set_parameter (which.id(), c->list()->eval (_session.transport_frame()));
207         }
208 }
209
210 ChanCount
211 PluginInsert::output_streams() const
212 {
213         assert (_configured);
214         return _configured_out;
215 }
216
217 ChanCount
218 PluginInsert::input_streams() const
219 {
220         assert (_configured);
221         return _configured_in;
222 }
223
224 ChanCount
225 PluginInsert::internal_streams() const
226 {
227         assert (_configured);
228         return _configured_internal;
229 }
230
231 ChanCount
232 PluginInsert::internal_output_streams() const
233 {
234         assert (!_plugins.empty());
235
236         PluginInfoPtr info = _plugins.front()->get_info();
237
238         if (info->reconfigurable_io()) {
239                 ChanCount out = _plugins.front()->output_streams ();
240                 // DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, reconfigur(able) output streams = %1\n", out));
241                 return out;
242         } else {
243                 ChanCount out = info->n_outputs;
244                 // DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, static output streams = %1 for %2 plugins\n", out, _plugins.size()));
245                 out.set_audio (out.n_audio() * _plugins.size());
246                 out.set_midi (out.n_midi() * _plugins.size());
247                 return out;
248         }
249 }
250
251 ChanCount
252 PluginInsert::internal_input_streams() const
253 {
254         assert (!_plugins.empty());
255
256         ChanCount in;
257
258         PluginInfoPtr info = _plugins.front()->get_info();
259
260         if (info->reconfigurable_io()) {
261                 assert (_plugins.size() == 1);
262                 in = _plugins.front()->input_streams();
263         } else {
264                 in = info->n_inputs;
265         }
266
267         DEBUG_TRACE (DEBUG::Processors, string_compose ("Plugin insert, input streams = %1, match using %2\n", in, _match.method));
268
269         if (_match.method == Split) {
270
271                 /* we are splitting 1 processor input to multiple plugin inputs,
272                    so we have a maximum of 1 stream of each type.
273                 */
274                 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
275                         if (in.get (*t) > 1) {
276                                 in.set (*t, 1);
277                         }
278                 }
279                 return in;
280
281         } else if (_match.method == Hide) {
282
283                 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
284                         in.set (*t, in.get (*t) - _match.hide.get (*t));
285                 }
286                 return in;
287
288         } else {
289
290                 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
291                         in.set (*t, in.get (*t) * _plugins.size ());
292                 }
293
294                 return in;
295         }
296 }
297
298 ChanCount
299 PluginInsert::natural_output_streams() const
300 {
301 #ifdef MIXBUS
302         if (is_channelstrip ()) {
303                 return _configured_out;
304         }
305 #endif
306         return _plugins[0]->get_info()->n_outputs;
307 }
308
309 ChanCount
310 PluginInsert::natural_input_streams() const
311 {
312 #ifdef MIXBUS
313         if (is_channelstrip ()) {
314                 return _configured_in;
315         }
316 #endif
317         return _plugins[0]->get_info()->n_inputs;
318 }
319
320 ChanCount
321 PluginInsert::sidechain_input_pins() const
322 {
323         return _cached_sidechain_pins;
324 }
325
326 bool
327 PluginInsert::has_no_inputs() const
328 {
329         return _plugins[0]->get_info()->n_inputs == ChanCount::ZERO;
330 }
331
332 bool
333 PluginInsert::has_no_audio_inputs() const
334 {
335         return _plugins[0]->get_info()->n_inputs.n_audio() == 0;
336 }
337
338 framecnt_t
339 PluginInsert::plugin_latency () const {
340         return _plugins.front()->signal_latency ();
341 }
342
343 bool
344 PluginInsert::needs_midi_input() const
345 {
346         PluginInfoPtr pip = _plugins[0]->get_info();
347         if (pip->needs_midi_input ()) {
348                 return true;
349         }
350         return pip->n_inputs.n_midi() != 0 && pip->n_outputs.n_audio() != 0;
351 }
352
353 void
354 PluginInsert::create_automatable_parameters ()
355 {
356         assert (!_plugins.empty());
357
358         set<Evoral::Parameter> a = _plugins.front()->automatable ();
359
360         for (set<Evoral::Parameter>::iterator i = a.begin(); i != a.end(); ++i) {
361                 if (i->type() == PluginAutomation) {
362
363                         Evoral::Parameter param(*i);
364
365                         ParameterDescriptor desc;
366                         _plugins.front()->get_parameter_descriptor(i->id(), desc);
367
368                         can_automate (param);
369                         boost::shared_ptr<AutomationList> list(new AutomationList(param, desc));
370                         boost::shared_ptr<AutomationControl> c (new PluginControl(this, param, desc, list));
371                         add_control (c);
372                         _plugins.front()->set_automation_control (i->id(), c);
373                 } else if (i->type() == PluginPropertyAutomation) {
374                         Evoral::Parameter param(*i);
375                         const ParameterDescriptor& desc = _plugins.front()->get_property_descriptor(param.id());
376                         if (desc.datatype != Variant::NOTHING) {
377                                 boost::shared_ptr<AutomationList> list;
378                                 if (Variant::type_is_numeric(desc.datatype)) {
379                                         list = boost::shared_ptr<AutomationList>(new AutomationList(param, desc));
380                                 }
381                                 add_control (boost::shared_ptr<AutomationControl> (new PluginPropertyControl(this, param, desc, list)));
382                         }
383                 }
384         }
385 }
386 /** Called when something outside of this host has modified a plugin
387  * parameter. Responsible for propagating the change to two places:
388  *
389  *   1) anything listening to the Control itself
390  *   2) any replicated plugins that make up this PluginInsert.
391  *
392  * The PluginInsert is connected to the ParameterChangedExternally signal for
393  * the first (primary) plugin, and here broadcasts that change to any others.
394  *
395  * XXX We should probably drop this whole replication idea (Paul, October 2015)
396  * since it isn't used by sensible plugin APIs (AU, LV2).
397  */
398 void
399 PluginInsert::parameter_changed_externally (uint32_t which, float val)
400 {
401         boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, which));
402
403         /* First propagation: alter the underlying value of the control,
404          * without telling the plugin(s) that own/use it to set it.
405          */
406
407         if (!ac) {
408                 return;
409         }
410
411         boost::shared_ptr<PluginControl> pc = boost::dynamic_pointer_cast<PluginControl> (ac);
412
413         if (pc) {
414                 pc->catch_up_with_external_value (val);
415         }
416
417         /* Second propagation: tell all plugins except the first to
418            update the value of this parameter. For sane plugin APIs,
419            there are no other plugins, so this is a no-op in those
420            cases.
421         */
422
423         Plugins::iterator i = _plugins.begin();
424
425         /* don't set the first plugin, just all the slaves */
426
427         if (i != _plugins.end()) {
428                 ++i;
429                 for (; i != _plugins.end(); ++i) {
430                         (*i)->set_parameter (which, val);
431                 }
432         }
433 }
434
435 int
436 PluginInsert::set_block_size (pframes_t nframes)
437 {
438         int ret = 0;
439         for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
440                 if ((*i)->set_block_size (nframes) != 0) {
441                         ret = -1;
442                 }
443         }
444         return ret;
445 }
446
447 void
448 PluginInsert::activate ()
449 {
450         for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
451                 (*i)->activate ();
452         }
453
454         Processor::activate ();
455 }
456
457 void
458 PluginInsert::deactivate ()
459 {
460         Processor::deactivate ();
461
462         for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
463                 (*i)->deactivate ();
464         }
465 }
466
467 void
468 PluginInsert::flush ()
469 {
470         for (vector<boost::shared_ptr<Plugin> >::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
471                 (*i)->flush ();
472         }
473 }
474
475 void
476 PluginInsert::connect_and_run (BufferSet& bufs, pframes_t nframes, framecnt_t offset, bool with_auto, framepos_t now)
477 {
478         // TODO: atomically copy maps & _no_inplace
479         PinMappings in_map (_in_map);
480         PinMappings out_map (_out_map);
481         ChanMapping thru_map (_thru_map);
482         if (_mapping_changed) { // ToDo use a counters, increment until match.
483                 _no_inplace = check_inplace ();
484                 _mapping_changed = false;
485         }
486
487         if (_latency_changed) {
488                 /* delaylines are configured with the max possible latency (as reported by the plugin)
489                  * so this won't allocate memory (unless the plugin lied about its max latency)
490                  * It may still 'click' though, since the fixed delaylines are not de-clicked.
491                  * Then again plugin-latency changes are not click-free to begin with.
492                  *
493                  * This is also worst case, there is currently no concept of per-stream latency.
494                  *
495                  * e.g.  Two identical latent plugins:
496                  *   1st plugin: process left (latent), bypass right.
497                  *   2nd plugin: bypass left, process right (latent).
498                  * -> currently this yields 2 times latency of the plugin,
499                  */
500                 _latency_changed = false;
501                 _delaybuffers.set (ChanCount::max(bufs.count(), _configured_out), plugin_latency ());
502         }
503
504         if (_match.method == Split && !_no_inplace) {
505                 // TODO: also use this optimization if one source-buffer
506                 // feeds _all_ *connected* inputs.
507                 // currently this is *first* buffer to all only --
508                 // see PluginInsert::check_inplace
509                 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
510                         if (_configured_internal.get (*t) == 0) {
511                                 continue;
512                         }
513                         bool valid;
514                         uint32_t first_idx = in_map[0].get (*t, 0, &valid);
515                         assert (valid && first_idx == 0); // check_inplace ensures this
516                         /* copy the first stream's buffer contents to the others */
517                         for (uint32_t i = 1; i < natural_input_streams ().get (*t); ++i) {
518                                 uint32_t idx = in_map[0].get (*t, i, &valid);
519                                 if (valid) {
520                                         assert (idx == 0);
521                                         bufs.get (*t, i).read_from (bufs.get (*t, first_idx), nframes, offset, offset);
522                                 }
523                         }
524                 }
525                 /* the copy operation produces a linear monotonic input map */
526                 in_map[0] = ChanMapping (natural_input_streams ());
527         }
528
529         bufs.set_count(ChanCount::max(bufs.count(), _configured_internal));
530         bufs.set_count(ChanCount::max(bufs.count(), _configured_out));
531
532         if (with_auto) {
533
534                 uint32_t n = 0;
535
536                 for (Controls::iterator li = controls().begin(); li != controls().end(); ++li, ++n) {
537
538                         boost::shared_ptr<AutomationControl> c
539                                 = boost::dynamic_pointer_cast<AutomationControl>(li->second);
540
541                         if (c->list() && c->automation_playback()) {
542                                 bool valid;
543
544                                 const float val = c->list()->rt_safe_eval (now, valid);
545
546                                 if (valid) {
547                                         /* This is the ONLY place where we are
548                                          *  allowed to call
549                                          *  AutomationControl::set_value_unchecked(). We
550                                          *  know that the control is in
551                                          *  automation playback mode, so no
552                                          *  check on writable() is required
553                                          *  (which must be done in AutomationControl::set_value()
554                                          *
555                                          */
556                                         c->set_value_unchecked(val);
557                                 }
558
559                         }
560                 }
561         }
562
563         /* Calculate if, and how many frames we need to collect for analysis */
564         framecnt_t collect_signal_nframes = (_signal_analysis_collect_nframes_max -
565                                              _signal_analysis_collected_nframes);
566         if (nframes < collect_signal_nframes) { // we might not get all frames now
567                 collect_signal_nframes = nframes;
568         }
569
570         if (collect_signal_nframes > 0) {
571                 // collect input
572                 //std::cerr << "collect input, bufs " << bufs.count().n_audio() << " count,  " << bufs.available().n_audio() << " available" << std::endl;
573                 //std::cerr << "               streams " << internal_input_streams().n_audio() << std::endl;
574                 //std::cerr << "filling buffer with " << collect_signal_nframes << " frames at " << _signal_analysis_collected_nframes << std::endl;
575
576                 _signal_analysis_inputs.set_count(internal_input_streams());
577
578                 for (uint32_t i = 0; i < internal_input_streams().n_audio(); ++i) {
579                         _signal_analysis_inputs.get_audio(i).read_from(
580                                 bufs.get_audio(i),
581                                 collect_signal_nframes,
582                                 _signal_analysis_collected_nframes); // offset is for target buffer
583                 }
584
585         }
586 #ifdef MIXBUS
587         if (is_channelstrip ()) {
588                 if (_configured_in.n_audio() > 0) {
589                         ChanMapping mb_in_map (ChanCount::min (_configured_in, ChanCount (DataType::AUDIO, 2)));
590                         ChanMapping mb_out_map (ChanCount::min (_configured_out, ChanCount (DataType::AUDIO, 2)));
591
592                         _plugins.front()->connect_and_run (bufs, mb_in_map, mb_out_map, nframes, offset);
593
594                         for (uint32_t out = _configured_in.n_audio (); out < bufs.count().get (DataType::AUDIO); ++out) {
595                                 bufs.get (DataType::AUDIO, out).silence (nframes, offset);
596                         }
597                 }
598         } else
599 #endif
600         if (_no_inplace) {
601                 // TODO optimize -- build maps once.
602                 uint32_t pc = 0;
603                 BufferSet& inplace_bufs  = _session.get_noinplace_buffers();
604                 ARDOUR::ChanMapping used_outputs;
605
606                 assert (inplace_bufs.count () >= natural_input_streams () + _configured_out);
607
608                 /* build used-output map */
609                 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
610                         for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
611                                 for (uint32_t out = 0; out < natural_output_streams().get (*t); ++out) {
612                                         bool valid;
613                                         uint32_t out_idx = out_map[pc].get (*t, out, &valid);
614                                         if (valid) {
615                                                 used_outputs.set (*t, out_idx, 1); // mark as used
616                                         }
617                                 }
618                         }
619                 }
620                 /* copy thru data to outputs before processing in-place */
621                 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
622                         for (uint32_t out = 0; out < bufs.count().get (*t); ++out) {
623                                 bool valid;
624                                 uint32_t in_idx = thru_map.get (*t, out, &valid);
625                                 if (valid) {
626                                         uint32_t m = out + natural_input_streams ().get (*t);
627                                         _delaybuffers.delay (*t, out, inplace_bufs.get (*t, m), bufs.get (*t, in_idx), nframes, offset, offset);
628                                         used_outputs.set (*t, out, 1); // mark as used
629                                 }
630                         }
631                 }
632
633                 pc = 0;
634                 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
635
636                         ARDOUR::ChanMapping i_in_map (natural_input_streams());
637                         ARDOUR::ChanMapping i_out_map (out_map[pc]);
638                         ARDOUR::ChanCount mapped;
639
640                         /* map inputs sequentially */
641                         for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
642                                 for (uint32_t in = 0; in < natural_input_streams().get (*t); ++in) {
643                                         bool valid;
644                                         uint32_t in_idx = in_map[pc].get (*t, in, &valid);
645                                         uint32_t m = mapped.get (*t);
646                                         if (valid) {
647                                                 inplace_bufs.get (*t, m).read_from (bufs.get (*t, in_idx), nframes, offset, offset);
648                                         } else {
649                                                 inplace_bufs.get (*t, m).silence (nframes, offset);
650                                         }
651                                         mapped.set (*t, m + 1);
652                                 }
653                         }
654
655                         /* outputs are mapped to inplace_bufs after the inputs */
656                         for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
657                                 i_out_map.offset_to (*t, natural_input_streams ().get (*t));
658                         }
659
660                         if ((*i)->connect_and_run (inplace_bufs, i_in_map, i_out_map, nframes, offset)) {
661                                 deactivate ();
662                         }
663                 }
664
665                 /* all instances have completed, now copy data that was written
666                  * and zero unconnected buffers */
667                 ARDOUR::ChanMapping nonzero_out (used_outputs);
668                 if (has_midi_bypass ()) {
669                         nonzero_out.set (DataType::MIDI, 0, 1); // Midi bypass.
670                 }
671                 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
672                         for (uint32_t out = 0; out < bufs.count().get (*t); ++out) {
673                                 bool valid;
674                                 used_outputs.get (*t, out, &valid);
675                                 if (!valid) {
676                                         nonzero_out.get (*t, out, &valid);
677                                         if (!valid) {
678                                                 bufs.get (*t, out).silence (nframes, offset);
679                                         }
680                                 } else {
681                                         uint32_t m = out + natural_input_streams ().get (*t);
682                                         bufs.get (*t, out).read_from (inplace_bufs.get (*t, m), nframes, offset, offset);
683                                 }
684                         }
685                 }
686         } else {
687                 /* in-place processing */
688                 uint32_t pc = 0;
689                 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
690                         if ((*i)->connect_and_run(bufs, in_map[pc], out_map[pc], nframes, offset)) {
691                                 deactivate ();
692                         }
693                 }
694
695                 // TODO optimize: store "unconnected" in a fixed set.
696                 // it only changes on reconfiguration.
697                 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
698                         for (uint32_t out = 0; out < bufs.count().get (*t); ++out) {
699                                 bool mapped = false;
700                                 if (*t == DataType::MIDI && out == 0 && has_midi_bypass ()) {
701                                         mapped = true; // in-place Midi bypass
702                                 }
703                                 for (uint32_t pc = 0; pc < get_count() && !mapped; ++pc) {
704                                         for (uint32_t o = 0; o < natural_output_streams().get (*t); ++o) {
705                                                 bool valid;
706                                                 uint32_t idx = out_map[pc].get (*t, o, &valid);
707                                                 if (valid && idx == out) {
708                                                         mapped = true;
709                                                         break;
710                                                 }
711                                         }
712                                 }
713                                 if (!mapped) {
714                                         bufs.get (*t, out).silence (nframes, offset);
715                                 }
716                         }
717                 }
718         }
719
720         if (collect_signal_nframes > 0) {
721                 // collect output
722                 //std::cerr << "       output, bufs " << bufs.count().n_audio() << " count,  " << bufs.available().n_audio() << " available" << std::endl;
723                 //std::cerr << "               streams " << internal_output_streams().n_audio() << std::endl;
724
725                 _signal_analysis_outputs.set_count(internal_output_streams());
726
727                 for (uint32_t i = 0; i < internal_output_streams().n_audio(); ++i) {
728                         _signal_analysis_outputs.get_audio(i).read_from(
729                                 bufs.get_audio(i),
730                                 collect_signal_nframes,
731                                 _signal_analysis_collected_nframes); // offset is for target buffer
732                 }
733
734                 _signal_analysis_collected_nframes += collect_signal_nframes;
735                 assert(_signal_analysis_collected_nframes <= _signal_analysis_collect_nframes_max);
736
737                 if (_signal_analysis_collected_nframes == _signal_analysis_collect_nframes_max) {
738                         _signal_analysis_collect_nframes_max = 0;
739                         _signal_analysis_collected_nframes   = 0;
740
741                         AnalysisDataGathered(&_signal_analysis_inputs,
742                                              &_signal_analysis_outputs);
743                 }
744         }
745 }
746
747 void
748 PluginInsert::silence (framecnt_t nframes)
749 {
750         if (!active ()) {
751                 return;
752         }
753
754         ChanMapping in_map (natural_input_streams ());
755         ChanMapping out_map (natural_output_streams ());
756
757         // TODO run sidechain (delaylines)
758         for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
759                 (*i)->connect_and_run (_session.get_scratch_buffers ((*i)->get_info()->n_inputs, true), in_map, out_map, nframes, 0);
760         }
761 }
762
763 void
764 PluginInsert::run (BufferSet& bufs, framepos_t start_frame, framepos_t end_frame, pframes_t nframes, bool)
765 {
766         if (_pending_active) {
767                 /* run as normal if we are active or moving from inactive to active */
768
769                 if (_sidechain) {
770                         // collect sidechain input for complete cycle (!)
771                         // TODO we need delaylines here for latency compensation
772                         _sidechain->run (bufs, start_frame, end_frame, nframes, true);
773                 }
774
775                 if (_session.transport_rolling() || _session.bounce_processing()) {
776                         automation_run (bufs, start_frame, nframes);
777                 } else {
778                         connect_and_run (bufs, nframes, 0, false);
779                 }
780
781         } else {
782                 // TODO use mapping in bypassed mode ?!
783                 // -> do we bypass the processor or the plugin
784
785                 // TODO include sidechain??
786
787                 uint32_t in = input_streams ().n_audio ();
788                 uint32_t out = output_streams().n_audio ();
789
790                 if (has_no_audio_inputs() || in == 0) {
791
792                         /* silence all (audio) outputs. Should really declick
793                          * at the transitions of "active"
794                          */
795
796                         for (uint32_t n = 0; n < out; ++n) {
797                                 bufs.get_audio (n).silence (nframes);
798                         }
799
800                 } else if (out > in) {
801
802                         /* not active, but something has make up for any channel count increase
803                          * for now , simply replicate last buffer
804                          */
805                         for (uint32_t n = in; n < out; ++n) {
806                                 bufs.get_audio(n).read_from(bufs.get_audio(in - 1), nframes);
807                         }
808                 }
809
810                 bufs.count().set_audio (out);
811         }
812
813         _active = _pending_active;
814
815         /* we have no idea whether the plugin generated silence or not, so mark
816          * all buffers appropriately.
817          */
818 }
819
820 void
821 PluginInsert::automation_run (BufferSet& bufs, framepos_t start, pframes_t nframes)
822 {
823         Evoral::ControlEvent next_event (0, 0.0f);
824         framepos_t now = start;
825         framepos_t end = now + nframes;
826         framecnt_t offset = 0;
827
828         Glib::Threads::Mutex::Lock lm (control_lock(), Glib::Threads::TRY_LOCK);
829
830         if (!lm.locked()) {
831                 connect_and_run (bufs, nframes, offset, false);
832                 return;
833         }
834
835         if (!find_next_event (now, end, next_event) || _plugins.front()->requires_fixed_sized_buffers()) {
836
837                 /* no events have a time within the relevant range */
838
839                 connect_and_run (bufs, nframes, offset, true, now);
840                 return;
841         }
842
843         while (nframes) {
844
845                 framecnt_t cnt = min (((framecnt_t) ceil (next_event.when) - now), (framecnt_t) nframes);
846
847                 connect_and_run (bufs, cnt, offset, true, now);
848
849                 nframes -= cnt;
850                 offset += cnt;
851                 now += cnt;
852
853                 if (!find_next_event (now, end, next_event)) {
854                         break;
855                 }
856         }
857
858         /* cleanup anything that is left to do */
859
860         if (nframes) {
861                 connect_and_run (bufs, nframes, offset, true, now);
862         }
863 }
864
865 float
866 PluginInsert::default_parameter_value (const Evoral::Parameter& param)
867 {
868         if (param.type() != PluginAutomation)
869                 return 1.0;
870
871         if (_plugins.empty()) {
872                 fatal << _("programming error: ") << X_("PluginInsert::default_parameter_value() called with no plugin")
873                       << endmsg;
874                 abort(); /*NOTREACHED*/
875         }
876
877         return _plugins[0]->default_value (param.id());
878 }
879
880
881 bool
882 PluginInsert::can_reset_all_parameters ()
883 {
884         bool all = true;
885         uint32_t params = 0;
886         for (uint32_t par = 0; par < _plugins[0]->parameter_count(); ++par) {
887                 bool ok=false;
888                 const uint32_t cid = _plugins[0]->nth_parameter (par, ok);
889
890                 if (!ok || !_plugins[0]->parameter_is_input(cid)) {
891                         continue;
892                 }
893
894                 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter(PluginAutomation, 0, cid));
895                 if (!ac) {
896                         continue;
897                 }
898
899                 ++params;
900                 if (ac->automation_state() & Play) {
901                         all = false;
902                         break;
903                 }
904         }
905         return all && (params > 0);
906 }
907
908 bool
909 PluginInsert::reset_parameters_to_default ()
910 {
911         bool all = true;
912
913         for (uint32_t par = 0; par < _plugins[0]->parameter_count(); ++par) {
914                 bool ok=false;
915                 const uint32_t cid = _plugins[0]->nth_parameter (par, ok);
916
917                 if (!ok || !_plugins[0]->parameter_is_input(cid)) {
918                         continue;
919                 }
920
921                 const float dflt = _plugins[0]->default_value (cid);
922                 const float curr = _plugins[0]->get_parameter (cid);
923
924                 if (dflt == curr) {
925                         continue;
926                 }
927
928                 boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter(PluginAutomation, 0, cid));
929                 if (!ac) {
930                         continue;
931                 }
932
933                 if (ac->automation_state() & Play) {
934                         all = false;
935                         continue;
936                 }
937
938                 ac->set_value (dflt, Controllable::NoGroup);
939         }
940         return all;
941 }
942
943 boost::shared_ptr<Plugin>
944 PluginInsert::plugin_factory (boost::shared_ptr<Plugin> other)
945 {
946         boost::shared_ptr<LadspaPlugin> lp;
947         boost::shared_ptr<LuaProc> lua;
948 #ifdef LV2_SUPPORT
949         boost::shared_ptr<LV2Plugin> lv2p;
950 #endif
951 #ifdef WINDOWS_VST_SUPPORT
952         boost::shared_ptr<WindowsVSTPlugin> vp;
953 #endif
954 #ifdef LXVST_SUPPORT
955         boost::shared_ptr<LXVSTPlugin> lxvp;
956 #endif
957 #ifdef AUDIOUNIT_SUPPORT
958         boost::shared_ptr<AUPlugin> ap;
959 #endif
960
961         if ((lp = boost::dynamic_pointer_cast<LadspaPlugin> (other)) != 0) {
962                 return boost::shared_ptr<Plugin> (new LadspaPlugin (*lp));
963         } else if ((lua = boost::dynamic_pointer_cast<LuaProc> (other)) != 0) {
964                 return boost::shared_ptr<Plugin> (new LuaProc (*lua));
965 #ifdef LV2_SUPPORT
966         } else if ((lv2p = boost::dynamic_pointer_cast<LV2Plugin> (other)) != 0) {
967                 return boost::shared_ptr<Plugin> (new LV2Plugin (*lv2p));
968 #endif
969 #ifdef WINDOWS_VST_SUPPORT
970         } else if ((vp = boost::dynamic_pointer_cast<WindowsVSTPlugin> (other)) != 0) {
971                 return boost::shared_ptr<Plugin> (new WindowsVSTPlugin (*vp));
972 #endif
973 #ifdef LXVST_SUPPORT
974         } else if ((lxvp = boost::dynamic_pointer_cast<LXVSTPlugin> (other)) != 0) {
975                 return boost::shared_ptr<Plugin> (new LXVSTPlugin (*lxvp));
976 #endif
977 #ifdef AUDIOUNIT_SUPPORT
978         } else if ((ap = boost::dynamic_pointer_cast<AUPlugin> (other)) != 0) {
979                 return boost::shared_ptr<Plugin> (new AUPlugin (*ap));
980 #endif
981         }
982
983         fatal << string_compose (_("programming error: %1"),
984                           X_("unknown plugin type in PluginInsert::plugin_factory"))
985               << endmsg;
986         abort(); /*NOTREACHED*/
987         return boost::shared_ptr<Plugin> ((Plugin*) 0);
988 }
989
990 void
991 PluginInsert::set_input_map (uint32_t num, ChanMapping m) {
992         if (num < _in_map.size()) {
993                 bool changed = _in_map[num] != m;
994                 _in_map[num] = m;
995                 changed |= sanitize_maps ();
996                 if (changed) {
997                         PluginMapChanged (); /* EMIT SIGNAL */
998                         _mapping_changed = true;
999                         _session.set_dirty();
1000                 }
1001         }
1002 }
1003
1004 void
1005 PluginInsert::set_output_map (uint32_t num, ChanMapping m) {
1006         if (num < _out_map.size()) {
1007                 bool changed = _out_map[num] != m;
1008                 _out_map[num] = m;
1009                 changed |= sanitize_maps ();
1010                 if (changed) {
1011                         PluginMapChanged (); /* EMIT SIGNAL */
1012                         _mapping_changed = true;
1013                         _session.set_dirty();
1014                 }
1015         }
1016 }
1017
1018 void
1019 PluginInsert::set_thru_map (ChanMapping m) {
1020         bool changed = _thru_map != m;
1021         _thru_map = m;
1022         changed |= sanitize_maps ();
1023         if (changed) {
1024                 PluginMapChanged (); /* EMIT SIGNAL */
1025                 _mapping_changed = true;
1026                 _session.set_dirty();
1027         }
1028 }
1029
1030 ChanMapping
1031 PluginInsert::input_map () const
1032 {
1033         ChanMapping rv;
1034         uint32_t pc = 0;
1035         for (PinMappings::const_iterator i = _in_map.begin (); i != _in_map.end (); ++i, ++pc) {
1036                 ChanMapping m (i->second);
1037                 const ChanMapping::Mappings& mp ((*i).second.mappings());
1038                 for (ChanMapping::Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
1039                         for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
1040                                 rv.set (tm->first, i->first + pc * natural_input_streams().get(tm->first), i->second);
1041                         }
1042                 }
1043         }
1044         return rv;
1045 }
1046
1047 ChanMapping
1048 PluginInsert::output_map () const
1049 {
1050         ChanMapping rv;
1051         uint32_t pc = 0;
1052         for (PinMappings::const_iterator i = _out_map.begin (); i != _out_map.end (); ++i, ++pc) {
1053                 ChanMapping m (i->second);
1054                 const ChanMapping::Mappings& mp ((*i).second.mappings());
1055                 for (ChanMapping::Mappings::const_iterator tm = mp.begin(); tm != mp.end(); ++tm) {
1056                         for (ChanMapping::TypeMapping::const_iterator i = tm->second.begin(); i != tm->second.end(); ++i) {
1057                                 rv.set (tm->first, i->first + pc * natural_output_streams().get(tm->first), i->second);
1058                         }
1059                 }
1060         }
1061         if (has_midi_bypass ()) {
1062                 rv.set (DataType::MIDI, 0, 0);
1063         }
1064
1065         return rv;
1066 }
1067
1068 bool
1069 PluginInsert::has_midi_bypass () const
1070 {
1071         if (_configured_in.n_midi () == 1 && _configured_out.n_midi () == 1
1072                         && natural_output_streams ().n_midi () == 0) {
1073                 return true;
1074         }
1075         return false;
1076 }
1077
1078 bool
1079 PluginInsert::has_midi_thru () const
1080 {
1081         if (_configured_in.n_midi () == 1 && _configured_out.n_midi () == 1
1082                         && natural_input_streams ().n_midi () == 0 && natural_output_streams ().n_midi () == 0) {
1083                 return true;
1084         }
1085         return false;
1086 }
1087
1088 #ifdef MIXBUS
1089 bool
1090 PluginInsert::is_channelstrip () const {
1091         return _plugins.front()->is_channelstrip();
1092 }
1093 #endif
1094
1095 bool
1096 PluginInsert::check_inplace ()
1097 {
1098         bool inplace_ok = !_plugins.front()->inplace_broken ();
1099
1100         if (_thru_map.n_total () > 0) {
1101                 // TODO once midi-bypass is part of the mapping, ignore it
1102                 inplace_ok = false;
1103         }
1104
1105         if (_match.method == Split && inplace_ok) {
1106                 assert (get_count() == 1);
1107                 assert (_in_map.size () == 1);
1108                 if (!_out_map[0].is_monotonic ()) {
1109                         inplace_ok = false;
1110                 }
1111                 if (_configured_internal != _configured_in) {
1112                         /* no sidechain -- TODO we could allow this with
1113                          * some more logic in PluginInsert::connect_and_run().
1114                          *
1115                          * PluginInsert::reset_map() already maps it.
1116                          */
1117                         inplace_ok = false;
1118                 }
1119                 /* check mapping */
1120                 for (DataType::iterator t = DataType::begin(); t != DataType::end() && inplace_ok; ++t) {
1121                         if (_configured_internal.get (*t) == 0) {
1122                                 continue;
1123                         }
1124                         bool valid;
1125                         uint32_t first_idx = _in_map[0].get (*t, 0, &valid);
1126                         if (!valid || first_idx != 0) {
1127                                 // so far only allow to copy the *first* stream's buffer to others
1128                                 inplace_ok = false;
1129                         } else {
1130                                 for (uint32_t i = 1; i < natural_input_streams ().get (*t); ++i) {
1131                                         uint32_t idx = _in_map[0].get (*t, i, &valid);
1132                                         if (valid && idx != first_idx) {
1133                                                 inplace_ok = false;
1134                                                 break;
1135                                         }
1136                                 }
1137                         }
1138                 }
1139
1140                 if (inplace_ok) {
1141                         DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: In Place Split Map\n", name()));
1142                         return false;
1143                 }
1144         }
1145
1146         for (uint32_t pc = 0; pc < get_count() && inplace_ok ; ++pc) {
1147                 if (!_in_map[pc].is_monotonic ()) {
1148                         inplace_ok = false;
1149                 }
1150                 if (!_out_map[pc].is_monotonic ()) {
1151                         inplace_ok = false;
1152                 }
1153         }
1154         DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("%1: %2\n", name(), inplace_ok ? "In-Place" : "No Inplace Processing"));
1155         return !inplace_ok; // no-inplace
1156 }
1157
1158 bool
1159 PluginInsert::sanitize_maps ()
1160 {
1161         bool changed = false;
1162         /* strip dead wood */
1163         PinMappings new_ins;
1164         PinMappings new_outs;
1165         ChanMapping new_thru (_thru_map);
1166
1167         for (uint32_t pc = 0; pc < get_count(); ++pc) {
1168                 ChanMapping new_in;
1169                 ChanMapping new_out;
1170                 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1171                         for (uint32_t i = 0; i < natural_input_streams().get (*t); ++i) {
1172                                 bool valid;
1173                                 uint32_t idx = _in_map[pc].get (*t, i, &valid);
1174                                 if (valid && idx < _configured_internal.get (*t)) {
1175                                         new_in.set (*t, i, idx);
1176                                 }
1177                         }
1178                         for (uint32_t o = 0; o < natural_output_streams().get (*t); ++o) {
1179                                 bool valid;
1180                                 uint32_t idx = _out_map[pc].get (*t, o, &valid);
1181                                 if (valid && idx < _configured_out.get (*t)) {
1182                                         new_out.set (*t, o, idx);
1183                                 }
1184                         }
1185                 }
1186                 if (_in_map[pc] != new_in || _out_map[pc] != new_out) {
1187                         changed = true;
1188                 }
1189                 new_ins[pc] = new_in;
1190                 new_outs[pc] = new_out;
1191         }
1192
1193         /* prevent dup output assignments */
1194         for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1195                 for (uint32_t o = 0; o < _configured_out.get (*t); ++o) {
1196                         bool mapped = false;
1197                         for (uint32_t pc = 0; pc < get_count(); ++pc) {
1198                                 bool valid;
1199                                 uint32_t idx = new_outs[pc].get_src (*t, o, &valid);
1200                                 if (valid && mapped) {
1201                                         new_outs[pc].unset (*t, idx);
1202                                 } else if (valid) {
1203                                         mapped = true;
1204                                 }
1205                         }
1206                 }
1207         }
1208
1209         /* prevent out + thru,  existing plugin outputs override thru */
1210         for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1211                 for (uint32_t o = 0; o < _configured_out.get (*t); ++o) {
1212                         bool mapped = false;
1213                         bool valid;
1214                         for (uint32_t pc = 0; pc < get_count(); ++pc) {
1215                                 new_outs[pc].get_src (*t, o, &mapped);
1216                                 if (mapped) { break; }
1217                         }
1218                         if (!mapped) { continue; }
1219                         uint32_t idx = new_thru.get (*t, o, &valid);
1220                         if (mapped) {
1221                                 new_thru.unset (*t, idx);
1222                         }
1223                 }
1224         }
1225
1226         if (has_midi_bypass ()) {
1227                 // TODO: include midi-bypass in the thru set,
1228                 // remove dedicated handling.
1229                 new_thru.unset (DataType::MIDI, 0);
1230         }
1231
1232         if (_in_map != new_ins || _out_map != new_outs || _thru_map != new_thru) {
1233                 changed = true;
1234         }
1235         _in_map = new_ins;
1236         _out_map = new_outs;
1237         _thru_map = new_thru;
1238
1239         return changed;
1240 }
1241
1242 bool
1243 PluginInsert::reset_map (bool emit)
1244 {
1245         const PinMappings old_in (_in_map);
1246         const PinMappings old_out (_out_map);
1247
1248         _in_map.clear ();
1249         _out_map.clear ();
1250         _thru_map = ChanMapping ();
1251
1252         /* build input map */
1253         for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1254                 uint32_t sc = 0; // side-chain round-robin (all instances)
1255                 uint32_t pc = 0;
1256                 for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
1257                         const uint32_t nis = natural_input_streams ().get(*t);
1258                         const uint32_t stride = nis - sidechain_input_pins().get (*t);
1259
1260                         /* SC inputs are last in the plugin-insert.. */
1261                         const uint32_t sc_start = _configured_in.get (*t);
1262                         const uint32_t sc_len = _configured_internal.get (*t) - sc_start;
1263                         /* ...but may not be at the end of the plugin ports.
1264                          * in case the side-chain is not the last port, shift connections back.
1265                          * and connect to side-chain
1266                          */
1267                         uint32_t shift = 0;
1268                         uint32_t ic = 0; // split inputs
1269                         const uint32_t cend = _configured_in.get (*t);
1270
1271                         for (uint32_t in = 0; in < nis; ++in) {
1272                                 const Plugin::IOPortDescription& iod (_plugins[pc]->describe_io_port (*t, true, in));
1273                                 if (iod.is_sidechain) {
1274                                         /* connect sidechain sinks to sidechain inputs in round-robin fashion */
1275                                         if (sc_len > 0) {// side-chain may be hidden
1276                                                 _in_map[pc].set (*t, in, sc_start + sc);
1277                                                 sc = (sc + 1) % sc_len;
1278                                         }
1279                                         ++shift;
1280                                 } else {
1281                                         if (_match.method == Split) {
1282                                                 if (cend == 0) { continue; }
1283                                                 /* connect *no* sidechain sinks in round-robin fashion */
1284                                                 _in_map[pc].set (*t, in, ic + stride * pc);
1285                                                 ic = (ic + 1) % cend;
1286                                         } else {
1287                                                 uint32_t s = in - shift;
1288                                                 if (stride * pc + s < cend) {
1289                                                         _in_map[pc].set (*t, in, stride * pc + s);
1290                                                 }
1291                                         }
1292                                 }
1293                         }
1294                 }
1295         }
1296
1297         /* build output map */
1298         uint32_t pc = 0;
1299         for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
1300                 _out_map[pc] = ChanMapping (ChanCount::min (natural_output_streams(), _configured_out));
1301                 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1302                         _out_map[pc].offset_to(*t, pc * natural_output_streams().get(*t));
1303                 }
1304         }
1305
1306         sanitize_maps ();
1307         if (old_in == _in_map && old_out == _out_map) {
1308                 return false;
1309         }
1310         if (emit) {
1311                 PluginMapChanged (); /* EMIT SIGNAL */
1312                 _mapping_changed = true;
1313                 _session.set_dirty();
1314         }
1315         return true;
1316 }
1317
1318 bool
1319 PluginInsert::configure_io (ChanCount in, ChanCount out)
1320 {
1321         Match old_match = _match;
1322         ChanCount old_in;
1323         ChanCount old_internal;
1324         ChanCount old_out;
1325
1326         if (_configured) {
1327                 old_in = _configured_in;
1328                 old_internal = _configured_internal;
1329                 old_out = _configured_out;
1330         }
1331
1332         _configured_in = in;
1333         _configured_internal = in;
1334         _configured_out = out;
1335
1336         if (_sidechain) {
1337                 /* TODO hide midi-bypass, and custom outs. Best /fake/ "out" here.
1338                  * (currently _sidechain->configure_io always succeeds
1339                  *  since Processor::configure_io() succeeds)
1340                  */
1341                 if (!_sidechain->configure_io (in, out)) {
1342                         DEBUG_TRACE (DEBUG::ChanMapping, "Sidechain configuration failed\n");
1343                         return false;
1344                 }
1345                 _configured_internal += _sidechain->input()->n_ports();
1346         }
1347
1348         /* get plugin configuration */
1349         _match = private_can_support_io_configuration (in, out);
1350 #ifndef NDEBUG
1351         if (DEBUG_ENABLED(DEBUG::ChanMapping)) {
1352                 DEBUG_STR_DECL(a);
1353                 DEBUG_STR_APPEND(a, string_compose ("Match '%1': ",  name()));
1354                 DEBUG_STR_APPEND(a, _match);
1355                 DEBUG_TRACE (DEBUG::ChanMapping, DEBUG_STR(a).str());
1356         }
1357 #endif
1358
1359         /* set the matching method and number of plugins that we will use to meet this configuration */
1360         if (set_count (_match.plugins) == false) {
1361                 PluginIoReConfigure (); /* EMIT SIGNAL */
1362                 _configured = false;
1363                 return false;
1364         }
1365
1366         /* configure plugins */
1367         switch (_match.method) {
1368         case Split:
1369         case Hide:
1370                 if (_plugins.front()->configure_io (natural_input_streams(), out) == false) {
1371                         PluginIoReConfigure (); /* EMIT SIGNAL */
1372                         _configured = false;
1373                         return false;
1374                 }
1375                 break;
1376         case Delegate:
1377                 {
1378                         ChanCount dout;
1379                         ChanCount useins;
1380                         bool const r = _plugins.front()->can_support_io_configuration (in, dout, &useins);
1381                         assert (r);
1382                         assert (_match.strict_io || dout.n_audio() == out.n_audio()); // sans midi bypass
1383                         if (useins.n_audio() == 0) {
1384                                 useins = in;
1385                         }
1386                         if (_plugins.front()->configure_io (useins, dout) == false) {
1387                                 PluginIoReConfigure (); /* EMIT SIGNAL */
1388                                 _configured = false;
1389                                 return false;
1390                         }
1391                 }
1392                 break;
1393         default:
1394                 if (_plugins.front()->configure_io (in, out) == false) {
1395                         PluginIoReConfigure (); /* EMIT SIGNAL */
1396                         _configured = false;
1397                         return false;
1398                 }
1399                 break;
1400         }
1401
1402         bool mapping_changed = false;
1403         if (old_in == in && old_out == out
1404                         && _configured
1405                         && old_match.method == _match.method
1406                         && _in_map.size() == _out_map.size()
1407                         && _in_map.size() == get_count ()
1408                  ) {
1409                 /* If the configuration has not changed, keep the mapping */
1410                 if (old_internal != _configured_internal) {
1411                         mapping_changed = sanitize_maps ();
1412                 }
1413         } else if (_match.custom_cfg && _configured) {
1414                 mapping_changed = sanitize_maps ();
1415         } else {
1416 #ifdef MIXBUS
1417                 if (is_channelstrip ()) { _maps_from_state = false; }
1418 #endif
1419                 if (_maps_from_state) {
1420                         _maps_from_state = false;
1421                         mapping_changed = true;
1422                         sanitize_maps ();
1423                 } else {
1424                         /* generate a new mapping */
1425                         mapping_changed = reset_map (false);
1426                 }
1427         }
1428
1429         if (mapping_changed) {
1430                 PluginMapChanged (); /* EMIT SIGNAL */
1431
1432 #ifndef NDEBUG
1433                 if (DEBUG_ENABLED(DEBUG::ChanMapping)) {
1434                         uint32_t pc = 0;
1435                         DEBUG_STR_DECL(a);
1436                         DEBUG_STR_APPEND(a, "\n--------<<--------\n");
1437                         for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i, ++pc) {
1438                                 if (pc > 0) {
1439                         DEBUG_STR_APPEND(a, "----><----\n");
1440                                 }
1441                                 DEBUG_STR_APPEND(a, string_compose ("Channel Map for %1 plugin %2\n", name(), pc));
1442                                 DEBUG_STR_APPEND(a, " * Inputs:\n");
1443                                 DEBUG_STR_APPEND(a, _in_map[pc]);
1444                                 DEBUG_STR_APPEND(a, " * Outputs:\n");
1445                                 DEBUG_STR_APPEND(a, _out_map[pc]);
1446                         }
1447                         DEBUG_STR_APPEND(a, " * Thru:\n");
1448                         DEBUG_STR_APPEND(a, _thru_map);
1449                         DEBUG_STR_APPEND(a, "-------->>--------\n");
1450                         DEBUG_TRACE (DEBUG::ChanMapping, DEBUG_STR(a).str());
1451                 }
1452 #endif
1453         }
1454
1455         _no_inplace = check_inplace ();
1456         _mapping_changed = false;
1457
1458         /* only the "noinplace_buffers" thread buffers need to be this large,
1459          * this can be optimized. other buffers are fine with
1460          * ChanCount::max (natural_input_streams (), natural_output_streams())
1461          */
1462         _required_buffers = natural_input_streams () + natural_output_streams() * get_count();
1463
1464         if (old_in != in || old_out != out || old_internal != _configured_internal
1465                         || (old_match.method != _match.method && (old_match.method == Split || _match.method == Split))
1466                  ) {
1467                 PluginIoReConfigure (); /* EMIT SIGNAL */
1468         }
1469
1470         _delaybuffers.configure (_configured_out, _plugins.front()->max_latency ());
1471         _latency_changed = true;
1472
1473         // we don't know the analysis window size, so we must work with the
1474         // current buffer size here. each request for data fills in these
1475         // buffers and the analyser makes sure it gets enough data for the
1476         // analysis window
1477         session().ensure_buffer_set (_signal_analysis_inputs, in);
1478         //_signal_analysis_inputs.set_count (in);
1479
1480         session().ensure_buffer_set (_signal_analysis_outputs, out);
1481         //_signal_analysis_outputs.set_count (out);
1482
1483         // std::cerr << "set counts to i" << in.n_audio() << "/o" << out.n_audio() << std::endl;
1484
1485         _configured = true;
1486         return Processor::configure_io (in, out);
1487 }
1488
1489 /** Decide whether this PluginInsert can support a given IO configuration.
1490  *  To do this, we run through a set of possible solutions in rough order of
1491  *  preference.
1492  *
1493  *  @param in Required input channel count.
1494  *  @param out Filled in with the output channel count if we return true.
1495  *  @return true if the given IO configuration can be supported.
1496  */
1497 bool
1498 PluginInsert::can_support_io_configuration (const ChanCount& in, ChanCount& out)
1499 {
1500         if (_sidechain) {
1501                 _sidechain->can_support_io_configuration (in, out); // never fails, sets "out"
1502         }
1503         return private_can_support_io_configuration (in, out).method != Impossible;
1504 }
1505
1506 /** A private version of can_support_io_configuration which returns the method
1507  *  by which the configuration can be matched, rather than just whether or not
1508  *  it can be.
1509  */
1510 PluginInsert::Match
1511 PluginInsert::private_can_support_io_configuration (ChanCount const & inx, ChanCount& out) const
1512 {
1513         if (_plugins.empty()) {
1514                 return Match();
1515         }
1516
1517 #ifdef MIXBUS
1518         if (is_channelstrip ()) {
1519                 out = inx;
1520                 return Match (ExactMatch, 1);
1521         }
1522 #endif
1523
1524         /* if a user specified a custom cfg, so be it. */
1525         if (_custom_cfg) {
1526                 out = _custom_out;
1527                 return Match (ExactMatch, get_count(), _strict_io, true); // XXX
1528         }
1529
1530         /* try automatic configuration */
1531         Match m = PluginInsert::automatic_can_support_io_configuration (inx, out);
1532
1533         PluginInfoPtr info = _plugins.front()->get_info();
1534         ChanCount inputs  = info->n_inputs;
1535         ChanCount outputs = info->n_outputs;
1536
1537         /* handle case strict-i/o */
1538         if (_strict_io && m.method != Impossible) {
1539                 m.strict_io = true;
1540
1541                 /* special case MIDI instruments */
1542                 if (needs_midi_input ()) {
1543                         // output = midi-bypass + at most master-out channels.
1544                         ChanCount max_out (DataType::AUDIO, 2); // TODO use master-out
1545                         max_out.set (DataType::MIDI, out.get(DataType::MIDI));
1546                         out = ChanCount::min (out, max_out);
1547                         DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("special case strict-i/o instrument: %1\n", name()));
1548                         return m;
1549                 }
1550
1551                 switch (m.method) {
1552                         case NoInputs:
1553                                 if (inx.n_audio () != out.n_audio ()) { // ignore midi bypass
1554                                         /* replicate processor to match output count (generators and such)
1555                                          * at least enough to feed every output port. */
1556                                         uint32_t f = 1; // at least one. e.g. control data filters, no in, no out.
1557                                         for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1558                                                 uint32_t nout = outputs.get (*t);
1559                                                 if (nout == 0 || inx.get(*t) == 0) { continue; }
1560                                                 f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nout));
1561                                         }
1562                                         out = inx;
1563                                         DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("special case strict-i/o generator: %1\n", name()));
1564                                         return Match (Replicate, f, _strict_io);
1565                                 }
1566                                 break;
1567                         default:
1568                                 break;
1569                 }
1570
1571                 out = inx;
1572                 return m;
1573         }
1574
1575         if (m.method != Impossible) {
1576                 return m;
1577         }
1578
1579         ChanCount ns_inputs  = inputs - sidechain_input_pins ();
1580
1581         DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("resolving 'Impossible' match for %1\n", name()));
1582
1583         if (info->reconfigurable_io()) {
1584                 ChanCount useins;
1585                 // TODO add sidechains here
1586                 bool const r = _plugins.front()->can_support_io_configuration (inx, out, &useins);
1587                 if (!r) {
1588                         // houston, we have a problem.
1589                         return Match (Impossible, 0);
1590                 }
1591                 return Match (Delegate, 1, _strict_io);
1592         }
1593
1594         ChanCount midi_bypass;
1595         if (inx.get(DataType::MIDI) == 1 && outputs.get(DataType::MIDI) == 0) {
1596                 midi_bypass.set (DataType::MIDI, 1);
1597         }
1598
1599         // add at least as many plugins so that output count matches input count (w/o sidechain pins)
1600         uint32_t f = 0;
1601         for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1602                 uint32_t nin = ns_inputs.get (*t);
1603                 uint32_t nout = outputs.get (*t);
1604                 if (nin == 0 || inx.get(*t) == 0) { continue; }
1605                 // prefer floor() so the count won't overly increase IFF (nin < nout)
1606                 f = max (f, (uint32_t) floor (inx.get(*t) / (float)nout));
1607         }
1608         if (f > 0 && outputs * f >= _configured_out) {
1609                 out = outputs * f + midi_bypass;
1610                 return Match (Replicate, f, _strict_io);
1611         }
1612
1613         // add at least as many plugins needed to connect all inputs (w/o sidechain pins)
1614         f = 0;
1615         for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1616                 uint32_t nin = ns_inputs.get (*t);
1617                 if (nin == 0 || inx.get(*t) == 0) { continue; }
1618                 f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nin));
1619         }
1620         if (f > 0) {
1621                 out = outputs * f + midi_bypass;
1622                 return Match (Replicate, f, _strict_io);
1623         }
1624
1625         // add at least as many plugins needed to connect all inputs
1626         f = 1;
1627         for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1628                 uint32_t nin = inputs.get (*t);
1629                 if (nin == 0 || inx.get(*t) == 0) { continue; }
1630                 f = max (f, (uint32_t) ceil (inx.get(*t) / (float)nin));
1631         }
1632         out = outputs * f + midi_bypass;
1633         return Match (Replicate, f, _strict_io);
1634 }
1635
1636 /* this is the original Ardour 3/4 behavior, mainly for backwards compatibility */
1637 PluginInsert::Match
1638 PluginInsert::automatic_can_support_io_configuration (ChanCount const & inx, ChanCount& out) const
1639 {
1640         if (_plugins.empty()) {
1641                 return Match();
1642         }
1643
1644         PluginInfoPtr info = _plugins.front()->get_info();
1645         ChanCount in; in += inx;
1646         ChanCount midi_bypass;
1647
1648         if (info->reconfigurable_io()) {
1649                 /* Plugin has flexible I/O, so delegate to it */
1650                 bool const r = _plugins.front()->can_support_io_configuration (in, out);
1651                 if (!r) {
1652                         return Match (Impossible, 0);
1653                 }
1654                 return Match (Delegate, 1);
1655         }
1656
1657         ChanCount inputs  = info->n_inputs;
1658         ChanCount outputs = info->n_outputs;
1659         ChanCount ns_inputs  = inputs - sidechain_input_pins ();
1660
1661         if (in.get(DataType::MIDI) == 1 && outputs.get(DataType::MIDI) == 0) {
1662                 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("bypassing midi-data around %1\n", name()));
1663                 midi_bypass.set (DataType::MIDI, 1);
1664         }
1665         if (in.get(DataType::MIDI) == 1 && inputs.get(DataType::MIDI) == 0) {
1666                 DEBUG_TRACE (DEBUG::ChanMapping, string_compose ("hiding midi-port from plugin %1\n", name()));
1667                 in.set(DataType::MIDI, 0);
1668         }
1669
1670         // add internally provided sidechain ports
1671         ChanCount insc = in + sidechain_input_ports ();
1672
1673         bool no_inputs = true;
1674         for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1675                 if (inputs.get (*t) != 0) {
1676                         no_inputs = false;
1677                         break;
1678                 }
1679         }
1680
1681         if (no_inputs) {
1682                 /* no inputs so we can take any input configuration since we throw it away */
1683                 out = outputs + midi_bypass;
1684                 return Match (NoInputs, 1);
1685         }
1686
1687         /* Plugin inputs match requested inputs + side-chain-ports exactly */
1688         if (inputs == insc) {
1689                 out = outputs + midi_bypass;
1690                 return Match (ExactMatch, 1);
1691         }
1692
1693         /* Plugin inputs matches without side-chain-pins */
1694         if (ns_inputs == in) {
1695                 out = outputs + midi_bypass;
1696                 return Match (ExactMatch, 1);
1697         }
1698
1699         /* We may be able to run more than one copy of the plugin within this insert
1700            to cope with the insert having more inputs than the plugin.
1701            We allow replication only for plugins with either zero or 1 inputs and outputs
1702            for every valid data type.
1703         */
1704
1705         uint32_t f             = 0;
1706         bool     can_replicate = true;
1707         for (DataType::iterator t = DataType::begin(); t != DataType::end() && can_replicate; ++t) {
1708
1709                 // ignore side-chains
1710                 uint32_t nin = ns_inputs.get (*t);
1711
1712                 // No inputs of this type
1713                 if (nin == 0 && in.get(*t) == 0) {
1714                         continue;
1715                 }
1716
1717                 if (nin != 1 || outputs.get (*t) != 1) {
1718                         can_replicate = false;
1719                         break;
1720                 }
1721
1722                 // Potential factor not set yet
1723                 if (f == 0) {
1724                         f = in.get(*t) / nin;
1725                 }
1726
1727                 // Factor for this type does not match another type, can not replicate
1728                 if (f != (in.get(*t) / nin)) {
1729                         can_replicate = false;
1730                         break;
1731                 }
1732         }
1733
1734         if (can_replicate && f > 0) {
1735                 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1736                         out.set (*t, outputs.get(*t) * f);
1737                 }
1738                 out += midi_bypass;
1739                 return Match (Replicate, f);
1740         }
1741
1742         /* If the processor has exactly one input of a given type, and
1743            the plugin has more, we can feed the single processor input
1744            to some or all of the plugin inputs.  This is rather
1745            special-case-y, but the 1-to-many case is by far the
1746            simplest.  How do I split thy 2 processor inputs to 3
1747            plugin inputs?  Let me count the ways ...
1748         */
1749
1750         bool can_split = true;
1751         for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1752
1753                 bool const can_split_type = (in.get (*t) == 1 && ns_inputs.get (*t) > 1);
1754                 bool const nothing_to_do_for_type = (in.get (*t) == 0 && inputs.get (*t) == 0);
1755
1756                 if (!can_split_type && !nothing_to_do_for_type) {
1757                         can_split = false;
1758                 }
1759         }
1760
1761         if (can_split) {
1762                 out = outputs + midi_bypass;
1763                 return Match (Split, 1);
1764         }
1765
1766         /* If the plugin has more inputs than we want, we can `hide' some of them
1767            by feeding them silence.
1768         */
1769
1770         bool could_hide = false;
1771         bool cannot_hide = false;
1772         ChanCount hide_channels;
1773
1774         for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
1775                 if (inputs.get(*t) > in.get(*t)) {
1776                         /* there is potential to hide, since the plugin has more inputs of type t than the insert */
1777                         hide_channels.set (*t, inputs.get(*t) - in.get(*t));
1778                         could_hide = true;
1779                 } else if (inputs.get(*t) < in.get(*t)) {
1780                         /* we definitely cannot hide, since the plugin has fewer inputs of type t than the insert */
1781                         cannot_hide = true;
1782                 }
1783         }
1784
1785         if (could_hide && !cannot_hide) {
1786                 out = outputs + midi_bypass;
1787                 return Match (Hide, 1, false, false, hide_channels);
1788         }
1789
1790         return Match (Impossible, 0);
1791 }
1792
1793
1794 XMLNode&
1795 PluginInsert::get_state ()
1796 {
1797         return state (true);
1798 }
1799
1800 XMLNode&
1801 PluginInsert::state (bool full)
1802 {
1803         XMLNode& node = Processor::state (full);
1804
1805         node.add_property("type", _plugins[0]->state_node_name());
1806         node.add_property("unique-id", _plugins[0]->unique_id());
1807         node.add_property("count", string_compose("%1", _plugins.size()));
1808
1809         /* remember actual i/o configuration (for later placeholder
1810          * in case the plugin goes missing) */
1811         node.add_child_nocopy (* _configured_in.state (X_("ConfiguredInput")));
1812         node.add_child_nocopy (* _configured_out.state (X_("ConfiguredOutput")));
1813
1814         /* save custom i/o config */
1815         node.add_property("custom", _custom_cfg ? "yes" : "no");
1816         for (uint32_t pc = 0; pc < get_count(); ++pc) {
1817                 char tmp[128];
1818                 snprintf (tmp, sizeof(tmp), "InputMap-%d", pc);
1819                 node.add_child_nocopy (* _in_map[pc].state (tmp));
1820                 snprintf (tmp, sizeof(tmp), "OutputMap-%d", pc);
1821                 node.add_child_nocopy (* _out_map[pc].state (tmp));
1822         }
1823         node.add_child_nocopy (* _thru_map.state ("ThruMap"));
1824
1825         if (_sidechain) {
1826                 node.add_child_nocopy (_sidechain->state (full));
1827         }
1828
1829         _plugins[0]->set_insert_id(this->id());
1830         node.add_child_nocopy (_plugins[0]->get_state());
1831
1832         for (Controls::iterator c = controls().begin(); c != controls().end(); ++c) {
1833                 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> ((*c).second);
1834                 if (ac) {
1835                         node.add_child_nocopy (ac->get_state());
1836                 }
1837         }
1838
1839         return node;
1840 }
1841
1842 void
1843 PluginInsert::set_control_ids (const XMLNode& node, int version)
1844 {
1845         const XMLNodeList& nlist = node.children();
1846         XMLNodeConstIterator iter;
1847         set<Evoral::Parameter>::const_iterator p;
1848
1849         for (iter = nlist.begin(); iter != nlist.end(); ++iter) {
1850                 if ((*iter)->name() == Controllable::xml_node_name) {
1851                         const XMLProperty* prop;
1852
1853                         uint32_t p = (uint32_t)-1;
1854 #ifdef LV2_SUPPORT
1855                         if ((prop = (*iter)->property (X_("symbol"))) != 0) {
1856                                 boost::shared_ptr<LV2Plugin> lv2plugin = boost::dynamic_pointer_cast<LV2Plugin> (_plugins[0]);
1857                                 if (lv2plugin) {
1858                                         p = lv2plugin->port_index(prop->value().c_str());
1859                                 }
1860                         }
1861 #endif
1862                         if (p == (uint32_t)-1 && (prop = (*iter)->property (X_("parameter"))) != 0) {
1863                                 p = atoi (prop->value());
1864                         }
1865
1866                         if (p != (uint32_t)-1) {
1867
1868                                 /* this may create the new controllable */
1869
1870                                 boost::shared_ptr<Evoral::Control> c = control (Evoral::Parameter (PluginAutomation, 0, p));
1871
1872 #ifndef NO_PLUGIN_STATE
1873                                 if (!c) {
1874                                         continue;
1875                                 }
1876                                 boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> (c);
1877                                 if (ac) {
1878                                         ac->set_state (**iter, version);
1879                                 }
1880 #endif
1881                         }
1882                 }
1883         }
1884 }
1885
1886 int
1887 PluginInsert::set_state(const XMLNode& node, int version)
1888 {
1889         XMLNodeList nlist = node.children();
1890         XMLNodeIterator niter;
1891         XMLPropertyList plist;
1892         const XMLProperty *prop;
1893         ARDOUR::PluginType type;
1894
1895         if ((prop = node.property ("type")) == 0) {
1896                 error << _("XML node describing plugin is missing the `type' field") << endmsg;
1897                 return -1;
1898         }
1899
1900         if (prop->value() == X_("ladspa") || prop->value() == X_("Ladspa")) { /* handle old school sessions */
1901                 type = ARDOUR::LADSPA;
1902         } else if (prop->value() == X_("lv2")) {
1903                 type = ARDOUR::LV2;
1904         } else if (prop->value() == X_("windows-vst")) {
1905                 type = ARDOUR::Windows_VST;
1906         } else if (prop->value() == X_("lxvst")) {
1907                 type = ARDOUR::LXVST;
1908         } else if (prop->value() == X_("audiounit")) {
1909                 type = ARDOUR::AudioUnit;
1910         } else if (prop->value() == X_("luaproc")) {
1911                 type = ARDOUR::Lua;
1912         } else {
1913                 error << string_compose (_("unknown plugin type %1 in plugin insert state"),
1914                                   prop->value())
1915                       << endmsg;
1916                 return -1;
1917         }
1918
1919         prop = node.property ("unique-id");
1920
1921         if (prop == 0) {
1922 #ifdef WINDOWS_VST_SUPPORT
1923                 /* older sessions contain VST plugins with only an "id" field.
1924                  */
1925
1926                 if (type == ARDOUR::Windows_VST) {
1927                         prop = node.property ("id");
1928                 }
1929 #endif
1930
1931 #ifdef LXVST_SUPPORT
1932                 /*There shouldn't be any older sessions with linuxVST support.. but anyway..*/
1933
1934                 if (type == ARDOUR::LXVST) {
1935                         prop = node.property ("id");
1936                 }
1937 #endif
1938                 /* recheck  */
1939
1940                 if (prop == 0) {
1941                         error << _("Plugin has no unique ID field") << endmsg;
1942                         return -1;
1943                 }
1944         }
1945
1946         boost::shared_ptr<Plugin> plugin = find_plugin (_session, prop->value(), type);
1947
1948         /* treat linux and windows VST plugins equivalent if they have the same uniqueID
1949          * allow to move sessions windows <> linux */
1950 #ifdef LXVST_SUPPORT
1951         if (plugin == 0 && type == ARDOUR::Windows_VST) {
1952                 type = ARDOUR::LXVST;
1953                 plugin = find_plugin (_session, prop->value(), type);
1954         }
1955 #endif
1956
1957 #ifdef WINDOWS_VST_SUPPORT
1958         if (plugin == 0 && type == ARDOUR::LXVST) {
1959                 type = ARDOUR::Windows_VST;
1960                 plugin = find_plugin (_session, prop->value(), type);
1961         }
1962 #endif
1963
1964         if (plugin == 0) {
1965                 error << string_compose(
1966                         _("Found a reference to a plugin (\"%1\") that is unknown.\n"
1967                           "Perhaps it was removed or moved since it was last used."),
1968                         prop->value())
1969                       << endmsg;
1970                 return -1;
1971         }
1972
1973         if (type == ARDOUR::Lua) {
1974                 XMLNode *ls = node.child (plugin->state_node_name().c_str());
1975                 // we need to load the script to set the name and parameters.
1976                 boost::shared_ptr<LuaProc> lp = boost::dynamic_pointer_cast<LuaProc>(plugin);
1977                 if (ls && lp) {
1978                         lp->set_script_from_state (*ls);
1979                 }
1980         }
1981
1982         // The name of the PluginInsert comes from the plugin, nothing else
1983         _name = plugin->get_info()->name;
1984
1985         uint32_t count = 1;
1986
1987         // Processor::set_state() will set this, but too late
1988         // for it to be available when setting up plugin
1989         // state. We can't call Processor::set_state() until
1990         // the plugins themselves are created and added.
1991
1992         set_id (node);
1993
1994         if (_plugins.empty()) {
1995                 /* if we are adding the first plugin, we will need to set
1996                    up automatable controls.
1997                 */
1998                 add_plugin (plugin);
1999                 create_automatable_parameters ();
2000                 set_control_ids (node, version);
2001         }
2002
2003         if ((prop = node.property ("count")) != 0) {
2004                 sscanf (prop->value().c_str(), "%u", &count);
2005         }
2006
2007         if (_plugins.size() != count) {
2008                 for (uint32_t n = 1; n < count; ++n) {
2009                         add_plugin (plugin_factory (plugin));
2010                 }
2011         }
2012
2013         Processor::set_state (node, version);
2014
2015         PBD::ID new_id = this->id();
2016         PBD::ID old_id = this->id();
2017
2018         if ((prop = node.property ("id")) != 0) {
2019                 old_id = prop->value ();
2020         }
2021
2022         for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2023
2024                 /* find the node with the type-specific node name ("lv2", "ladspa", etc)
2025                    and set all plugins to the same state.
2026                 */
2027
2028                 if ((*niter)->name() == plugin->state_node_name()) {
2029
2030                         for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2031                                 /* Plugin state can include external files which are named after the ID.
2032                                  *
2033                                  * If regenerate_xml_or_string_ids() is set, the ID will already have
2034                                  * been changed, so we need to use the old ID from the XML to load the
2035                                  * state and then update the ID.
2036                                  *
2037                                  * When copying a plugin-state, route_ui takes care of of updating the ID,
2038                                  * but we need to call set_insert_id() to clear the cached plugin-state
2039                                  * and force a change.
2040                                  */
2041                                 if (!regenerate_xml_or_string_ids ()) {
2042                                         (*i)->set_insert_id (new_id);
2043                                 } else {
2044                                         (*i)->set_insert_id (old_id);
2045                                 }
2046
2047                                 (*i)->set_state (**niter, version);
2048
2049                                 if (regenerate_xml_or_string_ids ()) {
2050                                         (*i)->set_insert_id (new_id);
2051                                 }
2052                         }
2053
2054                         break;
2055                 }
2056         }
2057
2058         if (version < 3000) {
2059
2060                 /* Only 2.X sessions need a call to set_parameter_state() - in 3.X and above
2061                    this is all handled by Automatable
2062                 */
2063
2064                 for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2065                         if ((*niter)->name() == "Redirect") {
2066                                 /* XXX do we need to tackle placement? i think not (pd; oct 16 2009) */
2067                                 Processor::set_state (**niter, version);
2068                                 break;
2069                         }
2070                 }
2071
2072                 set_parameter_state_2X (node, version);
2073         }
2074
2075         if ((prop = node.property (X_("custom"))) != 0) {
2076                 _custom_cfg = string_is_affirmative (prop->value());
2077         }
2078
2079         uint32_t in_maps = 0;
2080         uint32_t out_maps = 0;
2081         XMLNodeList kids = node.children ();
2082         for (XMLNodeIterator i = kids.begin(); i != kids.end(); ++i) {
2083                 if ((*i)->name() == X_("ConfiguredOutput")) {
2084                         _custom_out = ChanCount(**i);
2085                 }
2086                 if (strncmp ((*i)->name ().c_str(), X_("InputMap-"), 9) == 0) {
2087                         long pc = atol (&((*i)->name().c_str()[9]));
2088                         if (pc >=0 && pc <= get_count()) {
2089                                 _in_map[pc] = ChanMapping (**i);
2090                                 ++in_maps;
2091                         }
2092                 }
2093                 if (strncmp ((*i)->name ().c_str(), X_("OutputMap-"), 10) == 0) {
2094                         long pc = atol (&((*i)->name().c_str()[10]));
2095                         if (pc >=0 && pc <= get_count()) {
2096                                 _out_map[pc] = ChanMapping (**i);
2097                                 ++out_maps;
2098                         }
2099                 }
2100                 if ((*i)->name () ==  "ThruMap") {
2101                                 _thru_map = ChanMapping (**i);
2102                 }
2103
2104                 // sidechain is a Processor (IO)
2105                 if ((*i)->name () ==  Processor::state_node_name) {
2106                         if (!_sidechain) {
2107                                 add_sidechain (0);
2108                         }
2109                         _sidechain->set_state (**i, version);
2110                 }
2111         }
2112
2113         if (in_maps == out_maps && out_maps >0 && out_maps == get_count()) {
2114                 _maps_from_state = true;
2115         }
2116
2117         for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2118                 if (active()) {
2119                         (*i)->activate ();
2120                 } else {
2121                         (*i)->deactivate ();
2122                 }
2123         }
2124
2125         PluginConfigChanged (); /* EMIT SIGNAL */
2126         return 0;
2127 }
2128
2129 void
2130 PluginInsert::update_id (PBD::ID id)
2131 {
2132         set_id (id.to_s());
2133         for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2134                 (*i)->set_insert_id (id);
2135         }
2136 }
2137
2138 void
2139 PluginInsert::set_state_dir (const std::string& d)
2140 {
2141         // state() only saves the state of the first plugin
2142         _plugins[0]->set_state_dir (d);
2143 }
2144
2145 void
2146 PluginInsert::set_parameter_state_2X (const XMLNode& node, int version)
2147 {
2148         XMLNodeList nlist = node.children();
2149         XMLNodeIterator niter;
2150
2151         /* look for port automation node */
2152
2153         for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
2154
2155                 if ((*niter)->name() != port_automation_node_name) {
2156                         continue;
2157                 }
2158
2159                 XMLNodeList cnodes;
2160                 XMLProperty *cprop;
2161                 XMLNodeConstIterator iter;
2162                 XMLNode *child;
2163                 const char *port;
2164                 uint32_t port_id;
2165
2166                 cnodes = (*niter)->children ("port");
2167
2168                 for (iter = cnodes.begin(); iter != cnodes.end(); ++iter){
2169
2170                         child = *iter;
2171
2172                         if ((cprop = child->property("number")) != 0) {
2173                                 port = cprop->value().c_str();
2174                         } else {
2175                                 warning << _("PluginInsert: Auto: no ladspa port number") << endmsg;
2176                                 continue;
2177                         }
2178
2179                         sscanf (port, "%" PRIu32, &port_id);
2180
2181                         if (port_id >= _plugins[0]->parameter_count()) {
2182                                 warning << _("PluginInsert: Auto: port id out of range") << endmsg;
2183                                 continue;
2184                         }
2185
2186                         boost::shared_ptr<AutomationControl> c = boost::dynamic_pointer_cast<AutomationControl>(
2187                                         control(Evoral::Parameter(PluginAutomation, 0, port_id), true));
2188
2189                         if (c && c->alist()) {
2190                                 if (!child->children().empty()) {
2191                                         c->alist()->set_state (*child->children().front(), version);
2192
2193                                         /* In some cases 2.X saves lists with min_yval and max_yval
2194                                            being FLT_MIN and FLT_MAX respectively.  This causes problems
2195                                            in A3 because these min/max values are used to compute
2196                                            where GUI control points should be drawn.  If we see such
2197                                            values, `correct' them to the min/max of the appropriate
2198                                            parameter.
2199                                         */
2200
2201                                         float min_y = c->alist()->get_min_y ();
2202                                         float max_y = c->alist()->get_max_y ();
2203
2204                                         ParameterDescriptor desc;
2205                                         _plugins.front()->get_parameter_descriptor (port_id, desc);
2206
2207                                         if (min_y == FLT_MIN) {
2208                                                 min_y = desc.lower;
2209                                         }
2210
2211                                         if (max_y == FLT_MAX) {
2212                                                 max_y = desc.upper;
2213                                         }
2214
2215                                         c->alist()->set_yrange (min_y, max_y);
2216                                 }
2217                         } else {
2218                                 error << string_compose (_("PluginInsert: automatable control %1 not found - ignored"), port_id) << endmsg;
2219                         }
2220                 }
2221
2222                 /* done */
2223
2224                 break;
2225         }
2226 }
2227
2228
2229 string
2230 PluginInsert::describe_parameter (Evoral::Parameter param)
2231 {
2232         if (param.type() == PluginAutomation) {
2233                 return _plugins[0]->describe_parameter (param);
2234         } else if (param.type() == PluginPropertyAutomation) {
2235                 boost::shared_ptr<AutomationControl> c(automation_control(param));
2236                 if (c && !c->desc().label.empty()) {
2237                         return c->desc().label;
2238                 }
2239         }
2240         return Automatable::describe_parameter(param);
2241 }
2242
2243 ARDOUR::framecnt_t
2244 PluginInsert::signal_latency() const
2245 {
2246         if (_user_latency) {
2247                 return _user_latency;
2248         }
2249
2250         return _plugins[0]->signal_latency ();
2251 }
2252
2253 ARDOUR::PluginType
2254 PluginInsert::type ()
2255 {
2256        return plugin()->get_info()->type;
2257 }
2258
2259 PluginInsert::PluginControl::PluginControl (PluginInsert*                     p,
2260                                             const Evoral::Parameter&          param,
2261                                             const ParameterDescriptor&        desc,
2262                                             boost::shared_ptr<AutomationList> list)
2263         : AutomationControl (p->session(), param, desc, list, p->describe_parameter(param))
2264         , _plugin (p)
2265 {
2266         if (alist()) {
2267                 alist()->reset_default (desc.normal);
2268                 if (desc.toggled) {
2269                         list->set_interpolation(Evoral::ControlList::Discrete);
2270                 }
2271         }
2272
2273         if (desc.toggled) {
2274                 set_flags(Controllable::Toggle);
2275         }
2276 }
2277
2278 /** @param val `user' value */
2279 void
2280 PluginInsert::PluginControl::set_value (double user_val, PBD::Controllable::GroupControlDisposition group_override)
2281 {
2282         if (writable()) {
2283                 _set_value (user_val, group_override);
2284         }
2285 }
2286 void
2287 PluginInsert::PluginControl::set_value_unchecked (double user_val)
2288 {
2289         /* used only by automation playback */
2290         _set_value (user_val, Controllable::NoGroup);
2291 }
2292
2293 void
2294 PluginInsert::PluginControl::_set_value (double user_val, PBD::Controllable::GroupControlDisposition group_override)
2295 {
2296         /* FIXME: probably should be taking out some lock here.. */
2297
2298         for (Plugins::iterator i = _plugin->_plugins.begin(); i != _plugin->_plugins.end(); ++i) {
2299                 (*i)->set_parameter (_list->parameter().id(), user_val);
2300         }
2301
2302         boost::shared_ptr<Plugin> iasp = _plugin->_impulseAnalysisPlugin.lock();
2303         if (iasp) {
2304                 iasp->set_parameter (_list->parameter().id(), user_val);
2305         }
2306
2307         AutomationControl::set_value (user_val, group_override);
2308 }
2309
2310 void
2311 PluginInsert::PluginControl::catch_up_with_external_value (double user_val)
2312 {
2313         AutomationControl::set_value (user_val, Controllable::NoGroup);
2314 }
2315
2316 XMLNode&
2317 PluginInsert::PluginControl::get_state ()
2318 {
2319         stringstream ss;
2320
2321         XMLNode& node (AutomationControl::get_state());
2322         ss << parameter().id();
2323         node.add_property (X_("parameter"), ss.str());
2324 #ifdef LV2_SUPPORT
2325         boost::shared_ptr<LV2Plugin> lv2plugin = boost::dynamic_pointer_cast<LV2Plugin> (_plugin->_plugins[0]);
2326         if (lv2plugin) {
2327                 node.add_property (X_("symbol"), lv2plugin->port_symbol (parameter().id()));
2328         }
2329 #endif
2330
2331         return node;
2332 }
2333
2334 /** @return `user' val */
2335 double
2336 PluginInsert::PluginControl::get_value () const
2337 {
2338         boost::shared_ptr<Plugin> plugin = _plugin->plugin (0);
2339
2340         if (!plugin) {
2341                 return 0.0;
2342         }
2343
2344         return plugin->get_parameter (_list->parameter().id());
2345 }
2346
2347 PluginInsert::PluginPropertyControl::PluginPropertyControl (PluginInsert*                     p,
2348                                                             const Evoral::Parameter&          param,
2349                                                             const ParameterDescriptor&        desc,
2350                                                             boost::shared_ptr<AutomationList> list)
2351         : AutomationControl (p->session(), param, desc, list)
2352         , _plugin (p)
2353 {
2354         if (alist()) {
2355                 alist()->set_yrange (desc.lower, desc.upper);
2356                 alist()->reset_default (desc.normal);
2357         }
2358
2359         if (desc.toggled) {
2360                 set_flags(Controllable::Toggle);
2361         }
2362 }
2363
2364 void
2365 PluginInsert::PluginPropertyControl::set_value (double user_val, PBD::Controllable::GroupControlDisposition /* group_override*/)
2366 {
2367         if (writable()) {
2368                 set_value_unchecked (user_val);
2369         }
2370 }
2371
2372 void
2373 PluginInsert::PluginPropertyControl::set_value_unchecked (double user_val)
2374 {
2375         /* Old numeric set_value(), coerce to appropriate datatype if possible.
2376            This is lossy, but better than nothing until Ardour's automation system
2377            can handle various datatypes all the way down. */
2378         const Variant value(_desc.datatype, user_val);
2379         if (value.type() == Variant::NOTHING) {
2380                 error << "set_value(double) called for non-numeric property" << endmsg;
2381                 return;
2382         }
2383
2384         for (Plugins::iterator i = _plugin->_plugins.begin(); i != _plugin->_plugins.end(); ++i) {
2385                 (*i)->set_property(_list->parameter().id(), value);
2386         }
2387
2388         _value = value;
2389         AutomationControl::set_value (user_val, Controllable::NoGroup);
2390 }
2391
2392 XMLNode&
2393 PluginInsert::PluginPropertyControl::get_state ()
2394 {
2395         stringstream ss;
2396
2397         XMLNode& node (AutomationControl::get_state());
2398         ss << parameter().id();
2399         node.add_property (X_("property"), ss.str());
2400         node.remove_property (X_("value"));
2401
2402         return node;
2403 }
2404
2405 double
2406 PluginInsert::PluginPropertyControl::get_value () const
2407 {
2408         return _value.to_double();
2409 }
2410
2411 boost::shared_ptr<Plugin>
2412 PluginInsert::get_impulse_analysis_plugin()
2413 {
2414         boost::shared_ptr<Plugin> ret;
2415         if (_impulseAnalysisPlugin.expired()) {
2416                 ret = plugin_factory(_plugins[0]);
2417                 ret->configure_io (internal_input_streams (), internal_output_streams ());
2418                 _impulseAnalysisPlugin = ret;
2419         } else {
2420                 ret = _impulseAnalysisPlugin.lock();
2421         }
2422
2423         return ret;
2424 }
2425
2426 void
2427 PluginInsert::collect_signal_for_analysis (framecnt_t nframes)
2428 {
2429         // called from outside the audio thread, so this should be safe
2430         // only do audio as analysis is (currently) only for audio plugins
2431         _signal_analysis_inputs.ensure_buffers(  DataType::AUDIO, internal_input_streams().n_audio(),  nframes);
2432         _signal_analysis_outputs.ensure_buffers( DataType::AUDIO, internal_output_streams().n_audio(), nframes);
2433
2434         _signal_analysis_collected_nframes   = 0;
2435         _signal_analysis_collect_nframes_max = nframes;
2436 }
2437
2438 /** Add a plugin to our list */
2439 void
2440 PluginInsert::add_plugin (boost::shared_ptr<Plugin> plugin)
2441 {
2442         plugin->set_insert_id (this->id());
2443
2444         if (_plugins.empty()) {
2445                 /* first (and probably only) plugin instance - connect to relevant signals */
2446
2447                 plugin->ParameterChangedExternally.connect_same_thread (*this, boost::bind (&PluginInsert::parameter_changed_externally, this, _1, _2));
2448                 plugin->StartTouch.connect_same_thread (*this, boost::bind (&PluginInsert::start_touch, this, _1));
2449                 plugin->EndTouch.connect_same_thread (*this, boost::bind (&PluginInsert::end_touch, this, _1));
2450                 plugin->LatencyChanged.connect_same_thread (*this, boost::bind (&PluginInsert::latency_changed, this, _1, _2));
2451                 // cache sidechain port count
2452                 _cached_sidechain_pins.reset ();
2453                 const ChanCount& nis (plugin->get_info()->n_inputs);
2454                 for (DataType::iterator t = DataType::begin(); t != DataType::end(); ++t) {
2455                         for (uint32_t in = 0; in < nis.get (*t); ++in) {
2456                                 const Plugin::IOPortDescription& iod (plugin->describe_io_port (*t, true, in));
2457                                 if (iod.is_sidechain) {
2458                                         _cached_sidechain_pins.set (*t, 1 + _cached_sidechain_pins.n(*t));
2459                                 }
2460                         }
2461                 }
2462         }
2463 #if (defined WINDOWS_VST_SUPPORT || defined LXVST_SUPPORT)
2464         boost::shared_ptr<VSTPlugin> vst = boost::dynamic_pointer_cast<VSTPlugin> (plugin);
2465         if (vst) {
2466                 vst->set_insert (this, _plugins.size ());
2467         }
2468 #endif
2469         _plugins.push_back (plugin);
2470 }
2471
2472 void
2473 PluginInsert::realtime_handle_transport_stopped ()
2474 {
2475         for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2476                 (*i)->realtime_handle_transport_stopped ();
2477         }
2478 }
2479
2480 void
2481 PluginInsert::realtime_locate ()
2482 {
2483         for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2484                 (*i)->realtime_locate ();
2485         }
2486 }
2487
2488 void
2489 PluginInsert::monitoring_changed ()
2490 {
2491         for (Plugins::iterator i = _plugins.begin(); i != _plugins.end(); ++i) {
2492                 (*i)->monitoring_changed ();
2493         }
2494 }
2495
2496 void
2497 PluginInsert::latency_changed (framecnt_t, framecnt_t)
2498 {
2499         // this is called in RT context, LatencyChanged is emitted after run()
2500         _latency_changed = true;
2501 }
2502
2503 void
2504 PluginInsert::start_touch (uint32_t param_id)
2505 {
2506         boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id));
2507         if (ac) {
2508                 ac->start_touch (session().audible_frame());
2509         }
2510 }
2511
2512 void
2513 PluginInsert::end_touch (uint32_t param_id)
2514 {
2515         boost::shared_ptr<AutomationControl> ac = automation_control (Evoral::Parameter (PluginAutomation, 0, param_id));
2516         if (ac) {
2517                 ac->stop_touch (true, session().audible_frame());
2518         }
2519 }
2520
2521 std::ostream& operator<<(std::ostream& o, const ARDOUR::PluginInsert::Match& m)
2522 {
2523         switch (m.method) {
2524                 case PluginInsert::Impossible: o << "Impossible"; break;
2525                 case PluginInsert::Delegate:   o << "Delegate"; break;
2526                 case PluginInsert::NoInputs:   o << "NoInputs"; break;
2527                 case PluginInsert::ExactMatch: o << "ExactMatch"; break;
2528                 case PluginInsert::Replicate:  o << "Replicate"; break;
2529                 case PluginInsert::Split:      o << "Split"; break;
2530                 case PluginInsert::Hide:       o << "Hide"; break;
2531         }
2532         o << " cnt: " << m.plugins
2533                 << (m.strict_io ? " strict-io" : "")
2534                 << (m.custom_cfg ? " custom-cfg" : "");
2535         if (m.method == PluginInsert::Hide) {
2536                 o << " hide: " << m.hide;
2537         }
2538         o << "\n";
2539         return o;
2540 }