fixes for various bugs including dangling ref to route in session, opening sessions...
[ardour.git] / libs / ardour / track.cc
index 3b3b705a878d1e3b3a840cce6fc3b9fa1b38587d..cfa7d71a239420654e213fd96a96b76516bd9ebc 100644 (file)
@@ -31,6 +31,7 @@
 #include <ardour/audioplaylist.h>
 #include <ardour/panner.h>
 #include <ardour/utils.h>
+#include <ardour/connection.h>
 
 #include "i18n.h"
 
@@ -40,7 +41,6 @@ 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)
-       , _diskstream (0)
        ,  _rec_enable_control (*this)
 {
        _declickable = true;
@@ -51,7 +51,6 @@ Track::Track (Session& sess, string name, Route::Flag flag, TrackMode mode, Data
 
 Track::Track (Session& sess, const XMLNode& node, DataType default_type)
        : Route (sess, "to be renamed", 0, 0, -1, -1, Route::Flag(0), default_type)
-       , _diskstream (0)
        , _rec_enable_control (*this)
 {
        _freeze_record.state = NoFreeze;
@@ -61,9 +60,6 @@ Track::Track (Session& sess, const XMLNode& node, DataType default_type)
 
 Track::~Track ()
 {
-       if (_diskstream) {
-               _diskstream->unref();
-       }
 }
 
 void
@@ -88,11 +84,11 @@ void
 Track::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());
        }
 }
 
-jack_nframes_t
+nframes_t
 Track::update_total_latency ()
 {
        _own_latency = 0;
@@ -146,6 +142,18 @@ Track::record_enabled () const
 {
        return _diskstream->record_enabled ();
 }
+
+bool
+Track::can_record()
+{
+       bool will_record = true;
+       for (size_t i = 0; i < _inputs.size() && will_record; i++) {
+               if (!_inputs[i]->connected())
+                       will_record = false;
+       }
+
+       return will_record;
+}
        
 void
 Track::set_record_enable (bool yn, void *src)
@@ -160,7 +168,6 @@ Track::set_record_enable (bool yn, void *src)
        }
 
        /* keep track of the meter point as it was before we rec-enabled */
-
        if (!_diskstream->record_enabled()) {
                _saved_meter_point = _meter_point;
        }
@@ -211,7 +218,7 @@ Track::set_name (string str, void *src)
 }
 
 void
-Track::set_latency_delay (jack_nframes_t longest_session_latency)
+Track::set_latency_delay (nframes_t longest_session_latency)
 {
        Route::set_latency_delay (longest_session_latency);
        _diskstream->set_roll_delay (_roll_delay);