Fix broken whitespace. I'd apologize for the compile times if it was my fault :D
[ardour.git] / libs / ardour / source.cc
index f819e6eb42cc317a8c75a4f64ec0f3d2eca25a6d..35e1417fb4c14e92abc5a8af7e7b31199b1653c3 100644 (file)
@@ -53,6 +53,7 @@ Source::Source (Session& s, DataType type, const string& name, Flag flags)
        , _flags(flags)
        , _timeline_position(0)
         , _use_count (0)
+       , _level (0)
 {
        _analysed = false;
        _timestamp = 0;
@@ -65,6 +66,7 @@ Source::Source (Session& s, const XMLNode& node)
        , _flags (Flag (Writable|CanRename))
        , _timeline_position(0)
         , _use_count (0)
+       , _level (0)
 {
        _timestamp = 0;
        _analysed = false;
@@ -110,7 +112,7 @@ Source::get_state ()
 }
 
 int
-Source::set_state (const XMLNode& node, int /*version*/)
+Source::set_state (const XMLNode& node, int version)
 {
        const XMLProperty* prop;
 
@@ -146,6 +148,16 @@ Source::set_state (const XMLNode& node, int /*version*/)
                _flags = Flag (_flags | Destructive);
        }
 
+       if (version < 3000) {
+               /* a source with an XML node must necessarily already exist,
+                  and therefore cannot be removable/writable etc. etc.; 2.X
+                  sometimes marks sources as removable which shouldn't be.
+               */
+               if (!(_flags & Destructive)) {
+                       _flags = Flag (_flags & ~(Writable|Removable|RemovableIfEmpty|RemoveAtDestroy|CanRename));
+               }
+       }
+
        return 0;
 }
 
@@ -188,7 +200,7 @@ Source::load_transients (const string& path)
                file >> val;
 
                if (!file.fail()) {
-                       nframes64_t frame = (nframes64_t) floor (val * _session.frame_rate());
+                       framepos_t frame = (framepos_t) floor (val * _session.frame_rate());
                        transients.push_back (frame);
                }
        }
@@ -242,10 +254,10 @@ Source::mark_for_remove ()
 {
        // This operation is not allowed for sources for destructive tracks or out-of-session files.
 
-       /* XXX need a way to detect _within_session() condition here - move it from FileSource? 
+       /* XXX need a way to detect _within_session() condition here - move it from FileSource?
         */
 
-       if ((_flags & Destructive)) { 
+       if ((_flags & Destructive)) {
                return;
        }
 
@@ -272,6 +284,12 @@ Source::set_allow_remove_if_empty (bool yn)
        }
 }
 
+void
+Source::inc_use_count ()
+{
+        g_atomic_int_inc (&_use_count);
+}
+
 void
 Source::dec_use_count ()
 {
@@ -282,7 +300,14 @@ Source::dec_use_count ()
                 abort ();
         }
         assert (oldval > 0);
-#else 
+#else
         g_atomic_int_exchange_and_add (&_use_count, -1);
 #endif
 }
+
+bool
+Source::writable () const
+{
+        return (_flags & Writable) && _session.writable();
+}
+