Merge with trunk R2978.
[ardour.git] / libs / ardour / route.cc
index 19095425f276a2cc8015b445765918ca611d8a25..fd0d99e87a942ffa080c29aae62417a44e5b9233 100644 (file)
@@ -53,7 +53,7 @@ using namespace ARDOUR;
 using namespace PBD;
 
 uint32_t Route::order_key_cnt = 0;
-
+sigc::signal<void> Route::SyncOrderKeys;
 
 Route::Route (Session& sess, string name, int input_min, int input_max, int output_min, int output_max, Flag flg, DataType default_type)
        : IO (sess, name, input_min, input_max, output_min, output_max, default_type),
@@ -80,10 +80,11 @@ Route::init ()
        _muted = false;
        _soloed = false;
        _solo_safe = false;
+       _recordable = true;
+       _active = true;
        _phase_invert = false;
        _denormal_protection = false;
        order_keys[strdup (N_("signal"))] = order_key_cnt++;
-       _active = true;
        _silent = false;
        _meter_point = MeterPostFader;
        _initial_delay = 0;
@@ -161,9 +162,34 @@ void
 Route::set_order_key (const char* name, long n)
 {
        order_keys[strdup(name)] = n;
+
+       if (Config->get_sync_all_route_ordering()) {
+               for (OrderKeys::iterator x = order_keys.begin(); x != order_keys.end(); ++x) {
+                       x->second = n;
+               }
+       } 
+
        _session.set_dirty ();
 }
 
+void
+Route::sync_order_keys ()
+{
+       uint32_t key;
+       
+       if (order_keys.empty()) {
+               return;
+       }
+       
+       OrderKeys::iterator x = order_keys.begin();
+       key = x->second;
+       ++x;
+
+       for (; x != order_keys.end(); ++x) {
+               x->second = key;
+       }
+}
+
 void
 Route::inc_gain (gain_t fraction, void *src)
 {
@@ -316,7 +342,7 @@ Route::process_output_buffers (BufferSet& bufs,
           -------------------------------------------------------------------------------------------------- */
 
        if (meter && (_meter_point == MeterInput)) {
-               _meter->run(bufs, start_frame, end_frame, nframes, offset);
+               _meter->run_in_place(bufs, start_frame, end_frame, nframes, offset);
        }
 
        if (!_soloed && _mute_affects_pre_fader && (mute_gain != dmg)) {
@@ -460,13 +486,9 @@ Route::process_output_buffers (BufferSet& bufs,
                
            // OR recording 
                
-               // h/w monitoring not in use 
-               
-               (!Config->get_monitoring_model() == HardwareMonitoring && 
-
                 // AND software monitoring required
 
-                Config->get_monitoring_model() == SoftwareMonitoring)) { 
+               Config->get_monitoring_model() == SoftwareMonitoring) { 
                
                if (apply_gain_automation) {
                        
@@ -1641,10 +1663,15 @@ Route::add_processor_from_xml (const XMLNode& node)
                        if ((prop = node.property ("type")) != 0) {
 
                                boost::shared_ptr<Processor> processor;
+                               bool have_insert = false;
 
-                               if (prop->value() == "ladspa" || prop->value() == "Ladspa" || prop->value() == "vst") {
-
+                               if (prop->value() == "ladspa" || prop->value() == "Ladspa" || 
+                                   prop->value() == "lv2" ||
+                                   prop->value() == "vst" ||
+                                   prop->value() == "audiounit") {
+                                       
                                        processor.reset (new PluginInsert(_session, node));
+                                       have_insert = true;
                                        
                                } else if (prop->value() == "port") {
 
@@ -1653,19 +1680,20 @@ Route::add_processor_from_xml (const XMLNode& node)
                                } else if (prop->value() == "send") {
 
                                        processor.reset (new Send (_session, node));
+                                       have_insert = true;
 
                                } else {
 
                                        error << string_compose(_("unknown Processor type \"%1\"; ignored"), prop->value()) << endmsg;
                                }
-
+                               
                                add_processor (processor);
                                
                        } else {
                                error << _("Processor XML node has no type property") << endmsg;
                        }
                }
-               
+
                catch (failed_constructor &err) {
                        warning << _("processor could not be created. Ignored.") << endmsg;
                        return;
@@ -1711,7 +1739,8 @@ Route::_set_state (const XMLNode& node, bool call_base)
        if ((prop = node.property (X_("denormal-protection"))) != 0) {
                set_denormal_protection (prop->value()=="yes"?true:false, this);
        }
-
+       
+       _active = true;
        if ((prop = node.property (X_("active"))) != 0) {
                set_active (prop->value() == "yes");
        }
@@ -2253,13 +2282,6 @@ Route::get_mute_config (mute_type t)
        return onoff;
 }
 
-void
-Route::set_active (bool yn)
-{
-       _active = yn; 
-       active_changed(); /* EMIT SIGNAL */
-}
-
 void
 Route::handle_transport_stopped (bool abort_ignored, bool did_locate, bool can_flush_processors)
 {