summaryrefslogtreecommitdiff
path: root/libs/ardour/source.cc
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2009-02-17 02:11:49 +0000
committerDavid Robillard <d@drobilla.net>2009-02-17 02:11:49 +0000
commit022818b4a796f52c0a91eea42e65aec0bc7bed43 (patch)
treef82bde33d44c7b3e16af7e837536665e17fe0189 /libs/ardour/source.cc
parent4565b73a3993b0cb5ccb9170e276180f2b5c1372 (diff)
Fix the horrible mess that was anything related to sources and paths.
Most significant changes: - Factor out FileSource from AudioFileSource, use for SMFSource too - Explicitly pass embedded rather than mysterious name mangling or whatever - Destroy a ton of duplicated or very-nearly-duplicated code - Clean up and document all that weird source stuff in session.cc git-svn-id: svn://localhost/ardour2/branches/3.0@4609 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour/source.cc')
-rw-r--r--libs/ardour/source.cc46
1 files changed, 43 insertions, 3 deletions
diff --git a/libs/ardour/source.cc b/libs/ardour/source.cc
index aaae432570..a0ee2ac706 100644
--- a/libs/ardour/source.cc
+++ b/libs/ardour/source.cc
@@ -46,10 +46,11 @@
using namespace std;
using namespace ARDOUR;
-Source::Source (Session& s, const string& name, DataType type, Flag flags)
+Source::Source (Session& s, DataType type, const string& name, Flag flags)
: SessionObject(s, name)
, _type(type)
, _flags(flags)
+ , _timeline_position(0)
{
_analysed = false;
_timestamp = 0;
@@ -61,6 +62,7 @@ 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;
@@ -83,7 +85,7 @@ 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));
@@ -128,6 +130,11 @@ Source::set_state (const XMLNode& node)
_flags = Flag (0);
}
+
+ /* old style, from the period when we had DestructiveFileSource */
+ if ((prop = node.property (X_("destructive"))) != 0) {
+ _flags = Flag (_flags | Destructive);
+ }
return 0;
}
@@ -136,7 +143,7 @@ void
Source::update_length (nframes_t pos, nframes_t cnt)
{
if (pos + cnt > _length) {
- _length = pos+cnt;
+ _length = pos + cnt;
}
}
@@ -272,3 +279,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);
+ }
+}
+