#include <glibmm/miscutils.h>
#include "pbd/error.h"
-#include "pbd/convert.h"
+#include "pbd/types_convert.h"
#include "pbd/enumwriter.h"
#include "ardour/playlist.h"
#include "ardour/playlist_source.h"
-#include "ardour/session.h"
-#include "ardour/session_playlists.h"
-#include "ardour/source_factory.h"
+#include "ardour/playlist_factory.h"
-#include "i18n.h"
+#include "pbd/i18n.h"
using namespace std;
using namespace ARDOUR;
using namespace PBD;
-PlaylistSource::PlaylistSource (Session& s, const std::string& name, boost::shared_ptr<Playlist> p, DataType type,
- frameoffset_t begin, framecnt_t len, Source::Flag flags)
+PlaylistSource::PlaylistSource (Session& s, const ID& orig, const std::string& name, boost::shared_ptr<Playlist> p, DataType type,
+ frameoffset_t begin, framecnt_t len, Source::Flag /*flags*/)
: Source (s, type, name)
, _playlist (p)
+ , _original (orig)
{
/* PlaylistSources are never writable, renameable, removable or destructive */
_flags = Flag (_flags & ~(Writable|CanRename|Removable|RemovableIfEmpty|RemoveAtDestroy|Destructive));
{
/* PlaylistSources are never writable, renameable, removable or destructive */
_flags = Flag (_flags & ~(Writable|CanRename|Removable|RemovableIfEmpty|RemoveAtDestroy|Destructive));
-
+
if (set_state (node, Stateful::loading_state_version)) {
throw failed_constructor ();
void
PlaylistSource::add_state (XMLNode& node)
{
- char buf[64];
-
- _playlist->id().print (buf, sizeof (buf));
- node.add_property ("playlist", buf);
- snprintf (buf, sizeof (buf), "%" PRIi64, _playlist_offset);
- node.add_property ("offset", buf);
- snprintf (buf, sizeof (buf), "%" PRIu64, _playlist_length);
- node.add_property ("length", buf);
+ node.set_property ("playlist", _playlist->id ());
+ node.set_property ("offset", _playlist_offset);
+ node.set_property ("length", _playlist_length);
+ node.set_property ("original", id());
+
+ node.add_child_nocopy (_playlist->get_state());
}
int
-PlaylistSource::set_state (const XMLNode& node, int version)
+PlaylistSource::set_state (const XMLNode& node, int /*version*/)
{
- /* get playlist ID */
+ /* check that we have a playlist ID */
- const XMLProperty *prop = node.property (X_("playlist"));
+ XMLProperty const * prop = node.property (X_("playlist"));
if (!prop) {
+ error << _("No playlist ID in PlaylistSource XML!") << endmsg;
throw failed_constructor ();
}
- PBD::ID id (prop->value());
+ /* create playlist from child node */
- /* get playlist */
+ XMLNodeList nlist;
+ XMLNodeConstIterator niter;
- boost::shared_ptr<Playlist> p = _session.playlists->by_id (id);
+ nlist = node.children();
+
+ for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
+ if ((*niter)->name() == "Playlist") {
+ _playlist = PlaylistFactory::create (_session, **niter, true, false);
+ break;
+ }
+ }
if (!_playlist) {
+ error << _("Could not construct playlist for PlaylistSource from session data!") << endmsg;
throw failed_constructor ();
}
/* other properties */
- if ((prop = node.property (X_("name"))) == 0) {
+ std::string name;
+ if (!node.get_property (X_("name"), name)) {
throw failed_constructor ();
}
-
- set_name (prop->value());
- if ((prop = node.property (X_("offset"))) == 0) {
+ set_name (name);
+
+ if (!node.get_property (X_("offset"), _playlist_offset)) {
throw failed_constructor ();
}
- sscanf (prop->value().c_str(), "%" PRIi64, &_playlist_offset);
- if ((prop = node.property (X_("length"))) == 0) {
+ if (!node.get_property (X_("length"), _playlist_length)) {
+ throw failed_constructor ();
+ }
+
+ /* XXX not quite sure why we set our ID back to the "original" one
+ here. october 2011, paul
+ */
+
+ std::string str;
+ if (!node.get_property (X_("original"), str)) {
throw failed_constructor ();
}
- sscanf (prop->value().c_str(), "%" PRIu64, &_playlist_length);
+ set_id (str);
_level = _playlist->max_source_level () + 1;