Merge with trunk R2978.
[ardour.git] / libs / ardour / track.cc
index ebbb6177764b22f97216c86a0cdf3275fc83c135..052105cc855148d3c9dd18ad01d6fedee17a3354 100644 (file)
 #include <ardour/track.h>
 #include <ardour/diskstream.h>
 #include <ardour/session.h>
-#include <ardour/redirect.h>
+#include <ardour/io_processor.h>
 #include <ardour/audioregion.h>
 #include <ardour/audiosource.h>
 #include <ardour/route_group_specialized.h>
-#include <ardour/insert.h>
+#include <ardour/processor.h>
 #include <ardour/audioplaylist.h>
 #include <ardour/panner.h>
 #include <ardour/utils.h>
@@ -40,7 +40,7 @@ using namespace PBD;
 
 Track::Track (Session& sess, string name, Route::Flag flag, TrackMode mode, DataType default_type)
        : Route (sess, name, 1, -1, -1, -1, flag, default_type)
-       ,  _rec_enable_control (*this)
+       , _rec_enable_control (new RecEnableControllable(*this))
 {
        _declickable = true;
        _freeze_record.state = NoFreeze;
@@ -49,8 +49,8 @@ Track::Track (Session& sess, string name, Route::Flag flag, TrackMode mode, Data
 }
 
 Track::Track (Session& sess, const XMLNode& node, DataType default_type)
-       : Route (sess, node),
-         _rec_enable_control (*this)
+       : Route (sess, node)
+       , _rec_enable_control (new RecEnableControllable(*this))
 {
        _freeze_record.state = NoFreeze;
        _declickable = true;
@@ -90,23 +90,32 @@ Track::toggle_monitor_input ()
 ARDOUR::nframes_t
 Track::update_total_latency ()
 {
-       _own_latency = 0;
+       nframes_t old = _own_latency;
 
-       for (RedirectList::iterator i = _redirects.begin(); i != _redirects.end(); ++i) {
-               if ((*i)->active ()) {
-                       _own_latency += (*i)->latency ();
+       if (_user_latency) {
+               _own_latency = _user_latency;
+       } else {
+               _own_latency = 0;
+
+               for (ProcessorList::iterator i = _processors.begin(); i != _processors.end(); ++i) {
+                       if ((*i)->active ()) {
+                               _own_latency += (*i)->signal_latency ();
+                       }
                }
        }
 
        set_port_latency (_own_latency);
 
+       if (old != _own_latency) {
+               signal_latency_changed (); /* EMIT SIGNAL */
+       }
+
        return _own_latency;
 }
 
-
 Track::FreezeRecord::~FreezeRecord ()
 {
-       for (vector<FreezeRecordInsertInfo*>::iterator i = insert_info.begin(); i != insert_info.end(); ++i) {
+       for (vector<FreezeRecordProcessorInfo*>::iterator i = processor_info.begin(); i != processor_info.end(); ++i) {
                delete *i;
        }
 }
@@ -179,28 +188,30 @@ Track::set_record_enable (bool yn, void *src)
                set_meter_point (_saved_meter_point, this);
        }
 
-       _rec_enable_control.Changed ();
+       _rec_enable_control->Changed ();
 }
 
-int
-Track::set_name (string str, void *src)
+
+bool
+Track::set_name (const string& str)
 {
-       int ret;
+       bool ret;
 
        if (record_enabled() && _session.actively_recording()) {
                /* this messes things up if done while recording */
-               return -1;
+               return false;
        }
 
        if (_diskstream->set_name (str)) {
-               return -1;
+               return false;
        }
 
        /* save state so that the statefile fully reflects any filename changes */
 
-       if ((ret = IO::set_name (str, src)) == 0) {
+       if ((ret = IO::set_name (str)) == 0) {
                _session.save_state ("");
        }
+
        return ret;
 }