custom config trumps strict-i/o
authorRobin Gareus <robin@gareus.org>
Thu, 31 Mar 2016 23:41:10 +0000 (01:41 +0200)
committerRobin Gareus <robin@gareus.org>
Thu, 31 Mar 2016 23:41:10 +0000 (01:41 +0200)
This allows a user to override strict-i/o per processor.
The downside (currently): all downstream effects will be clamped to
the customized outputs (not the actual track's inputs)

This also introduces an new issue with re-config on session-load (missing
code to handle this).

libs/ardour/ardour/plugin_insert.h
libs/ardour/plugin_insert.cc
libs/ardour/route.cc

index 291dda42316407844b9ecbe5be14fd931bb5178e..3e233ba6c103c5089abf2a99969e4a5afb971c49 100644 (file)
@@ -111,8 +111,8 @@ class LIBARDOUR_API PluginInsert : public Processor
        // route is not a friend class, it owns us
        bool set_count      (uint32_t num);
        void set_outputs    (const ChanCount&);
-       void set_strict_io  (bool b) { _strict_io = b; }
-       void set_custom_cfg (bool b) { _custom_cfg = b; }
+       void set_strict_io  (bool b);
+       void set_custom_cfg (bool b);
        // end C++ class slavery!
 
        uint32_t get_count  () const { return _plugins.size(); }
@@ -209,6 +209,7 @@ class LIBARDOUR_API PluginInsert : public Processor
        PBD::Signal2<void,BufferSet*, BufferSet*> AnalysisDataGathered;
        PBD::Signal0<void> PluginIoReConfigure;
        PBD::Signal0<void> PluginMapChanged;
+       PBD::Signal0<void> PluginConfigChanged;
 
        /** Enumeration of the ways in which we can match our insert's
         *  IO to that of the plugin(s).
index 9e55979a244dd9bc2ab0720afe8d09c53dad2ebc..78f46275f71e43429e7cda58396783943c4629a3 100644 (file)
@@ -86,6 +86,16 @@ PluginInsert::~PluginInsert ()
 {
 }
 
+void
+PluginInsert::set_strict_io (bool b)
+{
+       bool changed = _strict_io != b;
+       _strict_io = b;
+       if (changed) {
+               PluginConfigChanged (); /* EMIT SIGNAL */
+       }
+}
+
 bool
 PluginInsert::set_count (uint32_t num)
 {
@@ -111,12 +121,14 @@ PluginInsert::set_count (uint32_t num)
                                /* XXX do something */
                        }
                }
+               PluginConfigChanged (); /* EMIT SIGNAL */
 
        } else if (num < _plugins.size()) {
                uint32_t diff = _plugins.size() - num;
                for (uint32_t n= 0; n < diff; ++n) {
                        _plugins.pop_back();
                }
+               PluginConfigChanged (); /* EMIT SIGNAL */
        }
 
        return true;
@@ -126,7 +138,21 @@ PluginInsert::set_count (uint32_t num)
 void
 PluginInsert::set_outputs (const ChanCount& c)
 {
+       bool changed = (_custom_out != c) && _custom_cfg;
        _custom_out = c;
+       if (changed) {
+               PluginConfigChanged (); /* EMIT SIGNAL */
+       }
+}
+
+void
+PluginInsert::set_custom_cfg (bool b)
+{
+       bool changed = _custom_cfg != b;
+       _custom_cfg = b;
+       if (changed) {
+               PluginConfigChanged (); /* EMIT SIGNAL */
+       }
 }
 
 void
index 990ab14e2856c5532b369894bf60ce55c314dffd..6519980b684c6e53b1a11dde447cd9bbea2f1c19 100644 (file)
@@ -2413,10 +2413,6 @@ Route::reset_plugin_insert (boost::shared_ptr<Processor> proc)
 bool
 Route::customize_plugin_insert (boost::shared_ptr<Processor> proc, uint32_t count, ChanCount outs)
 {
-       if (_strict_io) {
-               return false;
-       }
-
        boost::shared_ptr<PluginInsert> pi;
        if ((pi = boost::dynamic_pointer_cast<PluginInsert>(proc)) == 0) {
                return false;
@@ -2441,7 +2437,6 @@ Route::customize_plugin_insert (boost::shared_ptr<Processor> proc, uint32_t coun
                Glib::Threads::RWLock::WriterLock lm (_processor_lock);
                ProcessorState pstate (this);
 
-               assert (!pi->strict_io ());
                bool      old_cust = pi->custom_cfg ();
                uint32_t  old_cnt  = pi->get_count ();
                ChanCount old_chan = pi->output_streams ();