fix breakage for optimized build caused by semantically critical statement inside...
[ardour.git] / libs / ardour / route.cc
index a540e0aa93e7612440957c7585013c814516064e..1a90553be2f80ebd4089597968beb515b595bf6b 100644 (file)
@@ -202,12 +202,13 @@ Route::set_remote_control_id (uint32_t id, bool notify_class_listeners)
        if (Config->get_remote_model() != UserOrdered) {
                return;
        }
-       
-       if (id < 1) {
-               error << _("Remote Control ID's start at one, not zero") << endmsg;
-               return;
-       }
 
+       set_remote_control_id_internal (id, notify_class_listeners);
+}
+
+void
+Route::set_remote_control_id_internal (uint32_t id, bool notify_class_listeners)
+{
        /* force IDs for master/monitor busses and prevent 
           any other route from accidentally getting these IDs
           (i.e. legacy sessions)
@@ -221,6 +222,10 @@ Route::set_remote_control_id (uint32_t id, bool notify_class_listeners)
                id = MonitorBusRemoteControlID;
        }
 
+       if (id < 1) {
+               return;
+       }
+
        /* don't allow it to collide */
 
        if (!is_master () && !is_monitor() && 
@@ -298,7 +303,7 @@ Route::sync_order_keys (RouteSortOrderKey base)
 }
 
 void
-Route::set_remote_control_id_from_order_key (RouteSortOrderKey key, uint32_t rid)
+Route::set_remote_control_id_from_order_key (RouteSortOrderKey /*key*/, uint32_t rid)
 {
        if (is_master() || is_monitor() || is_hidden()) {
                /* hard-coded remote IDs, or no remote ID */
@@ -661,6 +666,7 @@ void
 Route::set_solo (bool yn, void *src)
 {
        if (_solo_safe) {
+               DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 ignore solo change due to solo-safe\n", name()));
                return;
        }
 
@@ -669,6 +675,9 @@ Route::set_solo (bool yn, void *src)
                return;
        }
 
+       DEBUG_TRACE (DEBUG::Solo, string_compose ("%1: set solo => %2, src: %3 grp ? %4 currently self-soloed ? %5\n", 
+                                                 name(), yn, src, (src == _route_group), self_soloed()));
+
        if (self_soloed() != yn) {
                set_self_solo (yn);
                set_mute_master_solo ();
@@ -680,6 +689,7 @@ Route::set_solo (bool yn, void *src)
 void
 Route::set_self_solo (bool yn)
 {
+       DEBUG_TRACE (DEBUG::Solo, string_compose ("%1: set SELF solo => %2\n", name(), yn));
        _self_solo = yn;
 }
 
@@ -687,9 +697,13 @@ void
 Route::mod_solo_by_others_upstream (int32_t delta)
 {
        if (_solo_safe) {
+               DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 ignore solo-by-upstream due to solo-safe\n", name()));
                return;
        }
 
+       DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 mod solo-by-upstream by %2, current up = %3 down = %4\n", 
+                                                 name(), delta, _soloed_by_others_upstream, _soloed_by_others_downstream));
+
        uint32_t old_sbu = _soloed_by_others_upstream;
 
        if (delta < 0) {
@@ -743,9 +757,13 @@ void
 Route::mod_solo_by_others_downstream (int32_t delta)
 {
        if (_solo_safe) {
+               DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 ignore solo-by-downstream due to solo safe\n", name()));
                return;
        }
 
+       DEBUG_TRACE (DEBUG::Solo, string_compose ("%1 mod solo-by-downstream by %2, current up = %3 down = %4\n", 
+                                                 name(), delta, _soloed_by_others_upstream, _soloed_by_others_downstream));
+
        if (delta < 0) {
                if (_soloed_by_others_downstream >= (uint32_t) abs (delta)) {
                        _soloed_by_others_downstream += delta;
@@ -1021,7 +1039,7 @@ Route::add_processor (boost::shared_ptr<Processor> processor, boost::shared_ptr<
 
                }
 
-               if (activation_allowed) {
+               if (activation_allowed && !_session.get_disable_all_loaded_plugins()) {
                        processor->activate ();
                }
 
@@ -1070,7 +1088,7 @@ Route::add_processor_from_xml_2X (const XMLNode& node, int version)
 
                                if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
                                                prop->value() == "lv2" ||
-                                               prop->value() == "vst" ||
+                                               prop->value() == "windows-vst" ||
                                                prop->value() == "lxvst" ||
                                                prop->value() == "audiounit") {
 
@@ -1594,7 +1612,9 @@ void
 Route::reset_instrument_info ()
 {
        boost::shared_ptr<Processor> instr = the_instrument();
-       _instrument_info.set_internal_instrument (instr);
+       if (instr) {
+               _instrument_info.set_internal_instrument (instr);
+       }
 }
 
 /** Caller must hold process lock */
@@ -1932,7 +1952,7 @@ Route::state(bool full_state)
                        boost::shared_ptr<InternalSend> is;
 
                        if ((is = boost::dynamic_pointer_cast<InternalSend> (*i)) != 0) {
-                               if (is->role() == Delivery::Aux || is->role() == Delivery::Listen) {
+                               if (is->role() == Delivery::Listen) {
                                        continue;
                                }
                        }
@@ -2025,7 +2045,6 @@ Route::set_state (const XMLNode& node, int version)
                        processor_state.add_child_copy (*child);
                }
 
-
                if (child->name() == X_("Pannable")) {
                        if (_pannable) {
                                _pannable->set_state (*child, version);
@@ -2045,6 +2064,9 @@ Route::set_state (const XMLNode& node, int version)
 
        set_processor_state (processor_state);
 
+       // this looks up the internal instrument in processors
+       reset_instrument_info();
+
        if ((prop = node.property ("self-solo")) != 0) {
                set_self_solo (string_is_affirmative (prop->value()));
        }
@@ -2162,7 +2184,7 @@ Route::set_state (const XMLNode& node, int version)
                        if ((prop = child->property (X_("id"))) != 0) {
                                int32_t x;
                                sscanf (prop->value().c_str(), "%d", &x);
-                               set_remote_control_id (x);
+                               set_remote_control_id_internal (x);
                        }
 
                } else if (child->name() == X_("MuteMaster")) {
@@ -2200,6 +2222,10 @@ Route::set_state_2X (const XMLNode& node, int version)
                _flags = Flag (0);
        }
 
+       if (is_master() || is_monitor() || is_hidden()) {
+               _mute_master->set_solo_ignore (true);
+       }
+
        if ((prop = node.property (X_("phase-invert"))) != 0) {
                boost::dynamic_bitset<> p (_input->n_ports().n_audio ());
                if (string_is_affirmative (prop->value ())) {
@@ -2313,7 +2339,7 @@ Route::set_state_2X (const XMLNode& node, int version)
                                        } else if (keyname == "editor") {
                                                sk = EditorSort;
                                        } else {
-                                               RouteSortOrderKey sk = (RouteSortOrderKey) string_2_enum (remaining.substr (0, equal), sk);
+                                               sk = (RouteSortOrderKey) string_2_enum (remaining.substr (0, equal), sk);
                                        }
 
                                        set_order_key (sk, n);
@@ -2423,7 +2449,7 @@ Route::set_state_2X (const XMLNode& node, int version)
                        if ((prop = child->property (X_("id"))) != 0) {
                                int32_t x;
                                sscanf (prop->value().c_str(), "%d", &x);
-                               set_remote_control_id (x);
+                               set_remote_control_id_internal (x);
                        }
 
                }
@@ -2516,7 +2542,7 @@ Route::set_processor_state (const XMLNode& node)
 
                                } else if (prop->value() == "ladspa" || prop->value() == "Ladspa" ||
                                           prop->value() == "lv2" ||
-                                          prop->value() == "vst" ||
+                                          prop->value() == "windows-vst" ||
                                           prop->value() == "lxvst" ||
                                           prop->value() == "audiounit") {
 
@@ -2866,7 +2892,7 @@ Route::direct_feeds_according_to_graph (boost::shared_ptr<Route> other, bool* vi
 
 /** Called from the (non-realtime) butler thread when the transport is stopped */
 void
-Route::nonrealtime_handle_transport_stopped (bool /*abort_ignored*/, bool did_locate, bool can_flush_processors)
+Route::nonrealtime_handle_transport_stopped (bool /*abort_ignored*/, bool /*did_locate*/, bool can_flush_processors)
 {
        framepos_t now = _session.transport_frame();
 
@@ -3046,8 +3072,6 @@ Route::flush_processors ()
 void
 Route::set_meter_point (MeterPoint p, bool force)
 {
-       /* CAN BE CALLED FROM PROCESS CONTEXT */
-
        if (_meter_point == p && !force) {
                return;
        }
@@ -3541,6 +3565,7 @@ Route::set_active (bool yn, void* src)
                _input->set_active (yn);
                _output->set_active (yn);
                active_changed (); // EMIT SIGNAL
+               _session.set_dirty ();
        }
 }
 
@@ -4089,6 +4114,12 @@ boost::shared_ptr<Processor>
 Route::the_instrument () const
 {
        Glib::Threads::RWLock::WriterLock lm (_processor_lock);
+       return the_instrument_unlocked ();
+}
+
+boost::shared_ptr<Processor>
+Route::the_instrument_unlocked () const
+{
        for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
                if (boost::dynamic_pointer_cast<PluginInsert>(*i)) {
                        if ((*i)->input_streams().n_midi() > 0 &&
@@ -4100,6 +4131,8 @@ Route::the_instrument () const
        return boost::shared_ptr<Processor>();
 }
 
+
+
 void
 Route::non_realtime_locate (framepos_t pos)
 {