nick m's fix for markers etc ; several tweaks for mute/solo ; rename run_in_place...
[ardour.git] / libs / ardour / source.cc
index f08d08b86e4e529fe316923ee3052265ef542ecc..b052a5b1fa7a60a804de7d6de26986d442e1a175 100644 (file)
 #include <glibmm/thread.h>
 #include <glibmm/miscutils.h>
 #include <glibmm/fileutils.h>
-#include <pbd/xml++.h>
-#include <pbd/pthread_utils.h>
+#include "pbd/xml++.h"
+#include "pbd/pthread_utils.h"
+#include "pbd/enumwriter.h"
 
-#include <ardour/source.h>
-#include <ardour/playlist.h>
-#include <ardour/session.h>
-#include <ardour/transient_detector.h>
+#include "ardour/playlist.h"
+#include "ardour/session.h"
+#include "ardour/source.h"
+#include "ardour/transient_detector.h"
 
 #include "i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
 
-Source::Source (Session& s, const string& name, DataType type)
+Source::Source (Session& s, DataType type, const string& name, Flag flags)
        : SessionObject(s, name)
        , _type(type)
+       , _flags(flags)
+       , _timeline_position(0)
 {
-       // not true.. is this supposed to be an assertion?
-       //assert(_name.find("/") == string::npos);
-
        _analysed = false;
        _timestamp = 0;
-       _length = 0;
        _in_use = 0;
 }
 
 Source::Source (Session& s, const XMLNode& node) 
        : SessionObject(s, "unnamed source")
        , _type(DataType::AUDIO)
+       , _flags (Flag (Writable|CanRename))
+       , _timeline_position(0)
 {
        _timestamp = 0;
-       _length = 0;
        _analysed = false;
        _in_use = 0;
 
@@ -83,8 +83,9 @@ Source::get_state ()
        XMLNode *node = new XMLNode ("Source");
        char buf[64];
 
-       node->add_property ("name", _name);
+       node->add_property ("name", name());
        node->add_property ("type", _type.to_string());
+       node->add_property (X_("flags"), enum_2_string (_flags));
        _id.print (buf, sizeof (buf));
        node->add_property ("id", buf);
 
@@ -121,18 +122,19 @@ Source::set_state (const XMLNode& node)
                sscanf (prop->value().c_str(), "%ld", &_timestamp);
        }
        
-       // Don't think this is valid, absolute paths fail
-       //assert(_name.find("/") == string::npos);
-
-       return 0;
-}
+       if ((prop = node.property (X_("flags"))) != 0) {
+               _flags = Flag (string_2_enum (prop->value(), _flags));
+       } else {
+               _flags = Flag (0);
 
-void
-Source::update_length (nframes_t pos, nframes_t cnt)
-{
-       if (pos + cnt > _length) {
-               _length = pos+cnt;
        }
+       
+       /* old style, from the period when we had DestructiveFileSource */
+       if ((prop = node.property (X_("destructive"))) != 0) {
+               _flags = Flag (_flags | Destructive);
+       }
+
+       return 0;
 }
 
 void
@@ -149,7 +151,9 @@ Source::add_playlist (boost::shared_ptr<Playlist> pl)
                res.first->second++;
        }
                
-       pl->GoingAway.connect (bind (mem_fun (*this, &Source::remove_playlist), boost::weak_ptr<Playlist> (pl)));
+       pl->GoingAway.connect (bind (
+                       mem_fun (*this, &Source::remove_playlist),
+                       boost::weak_ptr<Playlist> (pl)));
 }
 
 void
@@ -267,3 +271,36 @@ Source::check_for_analysis_data_on_disk ()
        return ok;
 }
 
+void
+Source::mark_for_remove ()
+{
+       // This operation is not allowed for sources for destructive tracks or embedded files.
+       // Fortunately mark_for_remove() is never called for embedded files. This function
+       // must be fixed if that ever happens.
+       if (_flags & Destructive) {
+               return;
+       }
+
+       _flags = Flag (_flags | Removable | RemoveAtDestroy);
+}
+
+void
+Source::set_timeline_position (int64_t pos)
+{
+       _timeline_position = pos;
+}
+
+void
+Source::set_allow_remove_if_empty (bool yn)
+{
+       if (!writable()) {
+               return;
+       }
+
+       if (yn) {
+               _flags = Flag (_flags | RemovableIfEmpty);
+       } else {
+               _flags = Flag (_flags & ~RemovableIfEmpty);
+       }
+}
+