display results of a bounce in the region list
[ardour.git] / libs / ardour / route.cc
index f3162f9131a7a80fa529b2f3e102abbfe7e0a34c..70a5d586a0b6bf1d958b1da1746c4e3138a54707 100644 (file)
 
 #include <cmath>
 #include <fstream>
+#include <cassert>
 
 #include <sigc++/bind.h>
 #include <pbd/xml++.h>
 
 #include <ardour/timestamps.h>
+#include <ardour/buffer.h>
 #include <ardour/audioengine.h>
 #include <ardour/route.h>
 #include <ardour/insert.h>
@@ -50,19 +52,19 @@ using namespace PBD;
 uint32_t Route::order_key_cnt = 0;
 
 
-Route::Route (Session& sess, string name, int input_min, int input_max, int output_min, int output_max, Flag flg)
-       : IO (sess, name, input_min, input_max, output_min, output_max),
+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),
          _flags (flg),
-         _solo_control (*this, ToggleControllable::SoloControl),
-         _mute_control (*this, ToggleControllable::MuteControl)
+         _solo_control (X_("solo"), *this, ToggleControllable::SoloControl),
+         _mute_control (X_("mute"), *this, ToggleControllable::MuteControl)
 {
        init ();
 }
 
 Route::Route (Session& sess, const XMLNode& node)
        : IO (sess, "route"),
-         _solo_control (*this, ToggleControllable::SoloControl),
-         _mute_control (*this, ToggleControllable::MuteControl)
+         _solo_control (X_("solo"), *this, ToggleControllable::SoloControl),
+         _mute_control (X_("mute"), *this, ToggleControllable::MuteControl)
 {
        init ();
        set_state (node);
@@ -109,7 +111,6 @@ Route::init ()
 
 Route::~Route ()
 {
-       GoingAway (); /* EMIT SIGNAL */
        clear_redirects (this);
 
        if (_control_outs) {
@@ -214,8 +215,8 @@ Route::set_gain (gain_t val, void *src)
 
 void
 Route::process_output_buffers (vector<Sample*>& bufs, uint32_t nbufs,
-                              jack_nframes_t start_frame, jack_nframes_t end_frame, 
-                              jack_nframes_t nframes, jack_nframes_t offset, bool with_redirects, int declick,
+                              nframes_t start_frame, nframes_t end_frame, 
+                              nframes_t nframes, nframes_t offset, bool with_redirects, int declick,
                               bool meter)
 {
        uint32_t n;
@@ -227,9 +228,18 @@ Route::process_output_buffers (vector<Sample*>& bufs, uint32_t nbufs,
        IO *co;
        bool mute_audible;
        bool solo_audible;
-       bool no_monitor = (Config->get_use_hardware_monitoring() || !Config->get_use_sw_monitoring ());
+       bool no_monitor;
        gain_t* gab = _session.gain_automation_buffer();
 
+       switch (Config->get_monitoring_model()) {
+       case HardwareMonitoring:
+       case ExternalMonitoring:
+               no_monitor = true;
+               break;
+       default:
+               no_monitor = false;
+       }
+
        declick = _pending_declick;
 
        {
@@ -261,17 +271,17 @@ Route::process_output_buffers (vector<Sample*>& bufs, uint32_t nbufs,
           -------------------------------------------------------------------------------------------------- */
 
        if (declick > 0) {
-               apply_declick (bufs, nbufs, nframes, 0.0, 1.0, _phase_invert);
+               apply_declick (bufs, nbufs, nframes, 0.0, 1.0, false);
                _pending_declick = 0;
        } else if (declick < 0) {
-               apply_declick (bufs, nbufs, nframes, 1.0, 0.0, _phase_invert);
+               apply_declick (bufs, nbufs, nframes, 1.0, 0.0, false);
                _pending_declick = 0;
        } else {
 
                /* no global declick */
 
                if (solo_gain != dsg) {
-                       apply_declick (bufs, nbufs, nframes, solo_gain, dsg, _phase_invert);
+                       apply_declick (bufs, nbufs, nframes, solo_gain, dsg, false);
                        solo_gain = dsg;
                }
        }
@@ -288,7 +298,7 @@ Route::process_output_buffers (vector<Sample*>& bufs, uint32_t nbufs,
        }
 
        if (!_soloed && _mute_affects_pre_fader && (mute_gain != dmg)) {
-               apply_declick (bufs, nbufs, nframes, mute_gain, dmg, _phase_invert);
+               apply_declick (bufs, nbufs, nframes, mute_gain, dmg, false);
                mute_gain = dmg;
                mute_declick_applied = true;
        }
@@ -310,7 +320,7 @@ Route::process_output_buffers (vector<Sample*>& bufs, uint32_t nbufs,
                        
                        // TODO: this is probably wrong
 
-                       (no_monitor && record_enabled() && (!_session.get_auto_input() || _session.actively_recording()))
+                       (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording()))
 
                        ) {
                        
@@ -358,7 +368,7 @@ Route::process_output_buffers (vector<Sample*>& bufs, uint32_t nbufs,
 
 
        if (!_soloed && (mute_gain != dmg) && !mute_declick_applied && _mute_affects_post_fader) {
-               apply_declick (bufs, nbufs, nframes, mute_gain, dmg, _phase_invert);
+               apply_declick (bufs, nbufs, nframes, mute_gain, dmg, false);
                mute_gain = dmg;
                mute_declick_applied = true;
        }
@@ -389,7 +399,7 @@ Route::process_output_buffers (vector<Sample*>& bufs, uint32_t nbufs,
                        
                        // rec-enabled but not s/w monitoring 
                        
-                       (no_monitor && record_enabled() && (!_session.get_auto_input() || _session.actively_recording()))
+                       (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording()))
 
                        ) {
                        
@@ -416,11 +426,11 @@ Route::process_output_buffers (vector<Sample*>& bufs, uint32_t nbufs,
                
                // h/w monitoring not in use 
                
-               (!Config->get_use_hardware_monitoring() && 
+               (!Config->get_monitoring_model() == HardwareMonitoring && 
 
                 // AND software monitoring required
 
-                Config->get_use_sw_monitoring())) { 
+                Config->get_monitoring_model() == SoftwareMonitoring)) { 
                
                if (apply_gain_automation) {
                        
@@ -428,7 +438,7 @@ Route::process_output_buffers (vector<Sample*>& bufs, uint32_t nbufs,
                                for (n = 0; n < nbufs; ++n)  {
                                        Sample *sp = bufs[n];
                                        
-                                       for (jack_nframes_t nx = 0; nx < nframes; ++nx) {
+                                       for (nframes_t nx = 0; nx < nframes; ++nx) {
                                                sp[nx] *= -gab[nx];
                                        }
                                }
@@ -436,7 +446,7 @@ Route::process_output_buffers (vector<Sample*>& bufs, uint32_t nbufs,
                                for (n = 0; n < nbufs; ++n) {
                                        Sample *sp = bufs[n];
                                        
-                                       for (jack_nframes_t nx = 0; nx < nframes; ++nx) {
+                                       for (nframes_t nx = 0; nx < nframes; ++nx) {
                                                sp[nx] *= gab[nx];
                                        }
                                }
@@ -524,7 +534,7 @@ Route::process_output_buffers (vector<Sample*>& bufs, uint32_t nbufs,
        }
 
        if (!_soloed && (mute_gain != dmg) && !mute_declick_applied && _mute_affects_control_outs) {
-               apply_declick (bufs, nbufs, nframes, mute_gain, dmg, _phase_invert);
+               apply_declick (bufs, nbufs, nframes, mute_gain, dmg, false);
                mute_gain = dmg;
                mute_declick_applied = true;
        }
@@ -552,7 +562,7 @@ Route::process_output_buffers (vector<Sample*>& bufs, uint32_t nbufs,
 
                    // recording but not s/w monitoring 
                        
-                       (no_monitor && record_enabled() && (!_session.get_auto_input() || _session.actively_recording()))
+                       (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording()))
 
                        ) {
 
@@ -569,7 +579,7 @@ Route::process_output_buffers (vector<Sample*>& bufs, uint32_t nbufs,
           ----------------------------------------------------------------------*/
 
        if (!_soloed && (mute_gain != dmg) && !mute_declick_applied && _mute_affects_main_outs) {
-               apply_declick (bufs, nbufs, nframes, mute_gain, dmg, _phase_invert);
+               apply_declick (bufs, nbufs, nframes, mute_gain, dmg, false);
                mute_gain = dmg;
                mute_declick_applied = true;
        }
@@ -585,7 +595,7 @@ Route::process_output_buffers (vector<Sample*>& bufs, uint32_t nbufs,
            
            /* relax */
 
-       } else if (no_monitor && record_enabled() && (!_session.get_auto_input() || _session.actively_recording())) {
+       } else if (no_monitor && record_enabled() && (!Config->get_auto_input() || _session.actively_recording())) {
                
                IO::silence (nframes, offset);
                
@@ -597,7 +607,7 @@ Route::process_output_buffers (vector<Sample*>& bufs, uint32_t nbufs,
                    
                    // muted by solo of another track, but not using control outs for solo
 
-                   (!solo_audible && (_session.solo_model() != Session::SoloBus)) ||
+                   (!solo_audible && (Config->get_solo_model() != SoloBus)) ||
                    
                    // muted by mute of this track
 
@@ -662,7 +672,7 @@ Route::n_process_buffers ()
 
 void
 
-Route::passthru (jack_nframes_t start_frame, jack_nframes_t end_frame, jack_nframes_t nframes, jack_nframes_t offset, int declick, bool meter_first)
+Route::passthru (nframes_t start_frame, nframes_t end_frame, nframes_t nframes, nframes_t offset, int declick, bool meter_first)
 {
        vector<Sample*>& bufs = _session.get_passthru_buffers();
        uint32_t limit = n_process_buffers ();
@@ -1013,7 +1023,7 @@ Route::_reset_plugin_counts (uint32_t* err_streams)
        uint32_t i_cnt;
        uint32_t s_cnt;
        map<Placement,list<InsertCount> > insert_map;
-       jack_nframes_t initial_streams;
+       nframes_t initial_streams;
 
        redirect_max_outs = 0;
        i_cnt = 0;
@@ -1330,6 +1340,9 @@ Route::state(bool full_state)
                snprintf (buf, sizeof (buf), "0x%x", _flags);
                node->add_property("flags", buf);
        }
+       
+       node->add_property("default-type", _default_type.to_string());
+
        node->add_property("active", _active?"yes":"no");
        node->add_property("muted", _muted?"yes":"no");
        node->add_property("soloed", _soloed?"yes":"no");
@@ -1366,6 +1379,8 @@ Route::state(bool full_state)
        node->add_property ("order-keys", order_string);
 
        node->add_child_nocopy (IO::state (full_state));
+       node->add_child_nocopy (_solo_control.get_state ());
+       node->add_child_nocopy (_mute_control.get_state ());
 
        if (_control_outs) {
                XMLNode* cnode = new XMLNode (X_("ControlOuts"));
@@ -1503,6 +1518,11 @@ Route::set_state (const XMLNode& node)
        } else {
                _flags = Flag (0);
        }
+       
+       if ((prop = node.property ("default-type")) != 0) {
+               _default_type = DataType(prop->value());
+               assert(_default_type != DataType::NIL);
+       }
 
        if ((prop = node.property ("phase-invert")) != 0) {
                set_phase_invert(prop->value()=="yes"?true:false, this);
@@ -1666,6 +1686,12 @@ Route::set_state (const XMLNode& node)
 
                } else if (child->name() == "extra") {
                        _extra_xml = new XMLNode (*child);
+               } else if (child->name() == "solo") {
+                       _solo_control.set_state (*child);
+                       _session.add_controllable (&_solo_control);
+               } else if (child->name() == "mute") {
+                       _mute_control.set_state (*child);
+                       _session.add_controllable (&_mute_control);
                }
        }
 
@@ -1689,7 +1715,7 @@ Route::curve_reallocate ()
 }
 
 void
-Route::silence (jack_nframes_t nframes, jack_nframes_t offset)
+Route::silence (nframes_t nframes, nframes_t offset)
 {
        if (!_silent) {
 
@@ -1926,7 +1952,7 @@ Route::set_active (bool yn)
 void
 Route::handle_transport_stopped (bool abort_ignored, bool did_locate, bool can_flush_redirects)
 {
-       jack_nframes_t now = _session.transport_frame();
+       nframes_t now = _session.transport_frame();
 
        {
                Glib::RWLock::ReaderLock lm (redirect_lock);
@@ -1995,7 +2021,7 @@ Route::pans_required () const
 }
 
 int 
-Route::no_roll (jack_nframes_t nframes, jack_nframes_t start_frame, jack_nframes_t end_frame, jack_nframes_t offset, 
+Route::no_roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, nframes_t offset, 
                   bool session_state_changing, bool can_record, bool rec_monitors_input)
 {
        if (n_outputs() == 0) {
@@ -2018,8 +2044,8 @@ Route::no_roll (jack_nframes_t nframes, jack_nframes_t start_frame, jack_nframes
        return 0;
 }
 
-jack_nframes_t
-Route::check_initial_delay (jack_nframes_t nframes, jack_nframes_t& offset, jack_nframes_t& transport_frame)
+nframes_t
+Route::check_initial_delay (nframes_t nframes, nframes_t& offset, nframes_t& transport_frame)
 {
        if (_roll_delay > nframes) {
 
@@ -2044,7 +2070,7 @@ Route::check_initial_delay (jack_nframes_t nframes, jack_nframes_t& offset, jack
 }
 
 int
-Route::roll (jack_nframes_t nframes, jack_nframes_t start_frame, jack_nframes_t end_frame, jack_nframes_t offset, int declick,
+Route::roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, nframes_t offset, int declick,
             bool can_record, bool rec_monitors_input)
 {
        {
@@ -2061,7 +2087,7 @@ Route::roll (jack_nframes_t nframes, jack_nframes_t start_frame, jack_nframes_t
                return 0;
        }
        
-       jack_nframes_t unused = 0;
+       nframes_t unused = 0;
 
        if ((nframes = check_initial_delay (nframes, offset, unused)) == 0) {
                return 0;
@@ -2076,7 +2102,7 @@ Route::roll (jack_nframes_t nframes, jack_nframes_t start_frame, jack_nframes_t
                
                if (am.locked() && _session.transport_rolling()) {
                        
-                       jack_nframes_t start_frame = end_frame - nframes;
+                       nframes_t start_frame = end_frame - nframes;
                        
                        if (gain_automation_playback()) {
                                apply_gain_automation = _gain_automation_curve.rt_safe_get_vector (start_frame, end_frame, _session.gain_automation_buffer(), nframes);
@@ -2090,7 +2116,7 @@ Route::roll (jack_nframes_t nframes, jack_nframes_t start_frame, jack_nframes_t
 }
 
 int
-Route::silent_roll (jack_nframes_t nframes, jack_nframes_t start_frame, jack_nframes_t end_frame, jack_nframes_t offset, 
+Route::silent_roll (nframes_t nframes, nframes_t start_frame, nframes_t end_frame, nframes_t offset, 
                    bool can_record, bool rec_monitors_input)
 {
        silence (nframes, offset);
@@ -2101,7 +2127,7 @@ void
 Route::toggle_monitor_input ()
 {
        for (vector<Port*>::iterator i = _inputs.begin(); i != _inputs.end(); ++i) {
-               (*i)->request_monitor_input(!(*i)->monitoring_input());
+               (*i)->ensure_monitor_input(!(*i)->monitoring_input());
        }
 }
 
@@ -2157,7 +2183,7 @@ Route::set_meter_point (MeterPoint p, void *src)
        }
 }
 
-jack_nframes_t
+nframes_t
 Route::update_total_latency ()
 {
        _own_latency = 0;
@@ -2183,7 +2209,7 @@ Route::update_total_latency ()
 }
 
 void
-Route::set_latency_delay (jack_nframes_t longest_session_latency)
+Route::set_latency_delay (nframes_t longest_session_latency)
 {
        _initial_delay = longest_session_latency - _own_latency;
 
@@ -2193,7 +2219,7 @@ Route::set_latency_delay (jack_nframes_t longest_session_latency)
 }
 
 void
-Route::automation_snapshot (jack_nframes_t now)
+Route::automation_snapshot (nframes_t now)
 {
        IO::automation_snapshot (now);
 
@@ -2202,8 +2228,8 @@ Route::automation_snapshot (jack_nframes_t now)
        }
 }
 
-Route::ToggleControllable::ToggleControllable (Route& s, ToggleType tp)
-       : route (s), type(tp)
+Route::ToggleControllable::ToggleControllable (std::string name, Route& s, ToggleType tp)
+       : Controllable (name), route (s), type(tp)
 {
        
 }
@@ -2245,7 +2271,7 @@ Route::ToggleControllable::get_value (void) const
 }
 
 void 
-Route::set_block_size (jack_nframes_t nframes)
+Route::set_block_size (nframes_t nframes)
 {
        for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
                (*i)->set_block_size (nframes);