the Properties & 64bit region commit
[ardour.git] / libs / ardour / track.cc
index ecd8208282720a26fbfb6c96c2d58f16b1e92fc6..8ad3650343851d949a1e2d2e99f94f7dcf8f6c57 100644 (file)
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */
 #include "pbd/error.h"
-#include <sigc++/retype.h>
-#include <sigc++/retype_return.h>
-#include <sigc++/bind.h>
 
 #include "ardour/amp.h"
 #include "ardour/audioplaylist.h"
 #include "ardour/audioregion.h"
 #include "ardour/audiosource.h"
+#include "ardour/debug.h"
 #include "ardour/delivery.h"
 #include "ardour/diskstream.h"
 #include "ardour/io_processor.h"
@@ -51,8 +49,8 @@ Track::Track (Session& sess, string name, Route::Flag flag, TrackMode mode, Data
        _mode = mode;
 }
 
-Track::Track (Session& sess, const XMLNode& node, int version, DataType default_type)
-       : Route (sess, node, version, default_type)
+Track::Track (Session& sess, const XMLNode& node, DataType default_type)
+       : Route (sess, node, default_type)
        , _rec_enable_control (new RecEnableControllable(*this))
 {
        _freeze_record.state = NoFreeze;
@@ -62,12 +60,7 @@ Track::Track (Session& sess, const XMLNode& node, int version, DataType default_
 
 Track::~Track ()
 {
-}
-
-void
-Track::set_meter_point (MeterPoint p, void *src)
-{
-       Route::set_meter_point (p, src);
+       DEBUG_TRACE (DEBUG::Destruction, string_compose ("track %1 destructor\n", _name));
 }
 
 XMLNode&
@@ -178,7 +171,7 @@ Track::set_record_enable (bool yn, void *src)
                return;
        }
 
-       if (_route_group && src != _route_group && _route_group->active_property (RouteGroup::RecEnable)) {
+       if (_route_group && src != _route_group && _route_group->is_active() && _route_group->is_recenable()) {
                _route_group->apply (&Track::set_record_enable, yn, _route_group);
                return;
        }
@@ -191,7 +184,9 @@ Track::set_record_enable (bool yn, void *src)
        _diskstream->set_record_enabled (yn);
 
        if (_diskstream->record_enabled()) {
-               set_meter_point (MeterInput, this);
+               if (_meter_point != MeterCustom) {
+                       set_meter_point (MeterInput, this);
+               }
        } else {
                set_meter_point (_saved_meter_point, this);
        }
@@ -252,11 +247,18 @@ Track::no_roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame,
        }
 
        if (session_state_changing) {
+               if (_session.transport_speed() != 0.0f) {
+                       /* we're rolling but some state is changing (e.g. our diskstream contents)
+                          so we cannot use them. Be silent till this is over. Don't declick.
 
-               /* XXX is this safe to do against transport state changes? */
-
-               passthru_silence (start_frame, end_frame, nframes, 0);
-               return 0;
+                          XXX note the absurdity of ::no_roll() being called when we ARE rolling!
+                       */
+                       passthru_silence (start_frame, end_frame, nframes, 0);
+                       return 0;
+               }
+               /* we're really not rolling, so we're either delivery silence or actually
+                  monitoring, both of which are safe to do while session_state_changing is true.
+               */
        }
 
        diskstream()->check_record_status (start_frame, nframes, can_record);