tweaks to NO_PLUGIN_STATE logic
[ardour.git] / libs / ardour / route.cc
index 9f933e0a4aa93c3bf00679d77078e4e09b307d8a..9d7dc8792b17ee7b5e9e4ad9614206eb2919b94f 100644 (file)
@@ -83,6 +83,7 @@ Route::Route (Session& sess, string name, Flag flg, DataType default_type)
        , _flags (flg)
        , _pending_declick (true)
        , _meter_point (MeterPostFader)
+       , _meter_type (MeterPeak)
        , _self_solo (false)
        , _soloed_by_others_upstream (0)
        , _soloed_by_others_downstream (0)
@@ -161,7 +162,7 @@ Route::init ()
                _monitor_control->activate ();
        }
 
-       if (is_master() || is_monitor() || is_hidden()) {
+       if (is_master() || is_monitor() || is_auditioner()) {
                _mute_master->set_solo_ignore (true);
        }
 
@@ -308,7 +309,7 @@ Route::sync_order_keys (RouteSortOrderKey base)
 void
 Route::set_remote_control_id_from_order_key (RouteSortOrderKey /*key*/, uint32_t rid)
 {
-       if (is_master() || is_monitor() || is_hidden()) {
+       if (is_master() || is_monitor() || is_auditioner()) {
                /* hard-coded remote IDs, or no remote ID */
                return;
        }
@@ -779,7 +780,7 @@ Route::set_mute_master_solo ()
 void
 Route::set_solo_isolated (bool yn, void *src)
 {
-       if (is_master() || is_monitor() || is_hidden()) {
+       if (is_master() || is_monitor() || is_auditioner()) {
                return;
        }
 
@@ -793,7 +794,7 @@ Route::set_solo_isolated (bool yn, void *src)
        boost::shared_ptr<RouteList> routes = _session.get_routes ();
        for (RouteList::iterator i = routes->begin(); i != routes->end(); ++i) {
 
-               if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_hidden()) {
+               if ((*i).get() == this || (*i)->is_master() || (*i)->is_monitor() || (*i)->is_auditioner()) {
                        continue;
                }
 
@@ -1878,6 +1879,8 @@ Route::state(bool full_state)
        node->add_property("denormal-protection", _denormal_protection?"yes":"no");
        node->add_property("meter-point", enum_2_string (_meter_point));
 
+       node->add_property("meter-type", enum_2_string (_meter_type));
+
        if (_route_group) {
                node->add_property("route-group", _route_group->name());
        }
@@ -1996,7 +1999,7 @@ Route::set_state (const XMLNode& node, int version)
                _flags = Flag (0);
        }
 
-       if (is_master() || is_monitor() || is_hidden()) {
+       if (is_master() || is_monitor() || is_auditioner()) {
                _mute_master->set_solo_ignore (true);
        }
 
@@ -2052,6 +2055,10 @@ Route::set_state (const XMLNode& node, int version)
                }
        }
 
+       if ((prop = node.property (X_("meter-type"))) != 0) {
+               _meter_type = MeterType (string_2_enum (prop->value (), _meter_type));
+       }
+
        set_processor_state (processor_state);
 
        // this looks up the internal instrument in processors
@@ -2212,7 +2219,7 @@ Route::set_state_2X (const XMLNode& node, int version)
                _flags = Flag (0);
        }
 
-       if (is_master() || is_monitor() || is_hidden()) {
+       if (is_master() || is_monitor() || is_auditioner()) {
                _mute_master->set_solo_ignore (true);
        }
 
@@ -2551,9 +2558,24 @@ Route::set_processor_state (const XMLNode& node)
                                        continue;
                                }
 
-                               if (processor->set_state (**niter, Stateful::current_state_version) != 0) {
-                                       /* This processor could not be configured.  Turn it into a UnknownProcessor */
-                                       processor.reset (new UnknownProcessor (_session, **niter));
+                               if (boost::dynamic_pointer_cast<PluginInsert>(processor)) {     
+#ifndef NO_PLUGIN_STATE
+                                       if (processor->set_state (**niter, Stateful::current_state_version) != 0) {
+                                               /* This processor could not be configured.  Turn it into a UnknownProcessor */
+                                               processor.reset (new UnknownProcessor (_session, **niter));
+                                       }
+#else
+                                       /* plugin, with NO_PLUGIN_STATE defined
+                                        * =>::set_state() not allowed. Do not
+                                        * display a message here - things will
+                                        * get too verbose.
+                                        */
+#endif
+                               } else {
+                                       if (processor->set_state (**niter, Stateful::current_state_version) != 0) {
+                                               /* This processor could not be configured.  Turn it into a UnknownProcessor */
+                                               processor.reset (new UnknownProcessor (_session, **niter));
+                                       }
                                }
 
                                /* we have to note the monitor send here, otherwise a new one will be created
@@ -2938,6 +2960,8 @@ Route::output_change_handler (IOChange change, void * /*src*/)
                   contains ConfigurationChanged 
                */
                need_to_queue_solo_change = false;
+               configure_processors (0);
+               io_changed (); /* EMIT SIGNAL */
        }
 
        if (!_output->connected() && _soloed_by_others_downstream) {
@@ -4238,8 +4262,11 @@ Route::fill_buffers_with_input (BufferSet& bufs, boost::shared_ptr<IO> io, pfram
        }
 
        /* establish the initial setup of the buffer set, reflecting what was
-          copied into it.
+          copied into it. unless, of course, we are the auditioner, in which
+          case nothing was fed into it from the inputs at all.
        */
 
-       bufs.set_count (io->n_ports());
+       if (!is_auditioner()) {
+               bufs.set_count (io->n_ports());
+       }
 }