#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;
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);
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
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
}
if (yn) {
+ load_transients (get_transients_path());
AnalysisChanged(); // EMIT SIGNAL
}
}
set_been_analysed (ok);
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);
+ }
+}
+