-#include <ardour/session.h>
+/*
+ Copyright (C) 2000-2006 Paul Davis
-#include <ardour/playlist.h>
-#include <ardour/audioplaylist.h>
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
-#include <ardour/region_factory.h>
-#include <ardour/region.h>
-#include <ardour/audioregion.h>
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include "pbd/error.h"
+#include "pbd/xml++.h"
+
+#include "ardour/playlist.h"
+#include "ardour/audioplaylist.h"
+#include "ardour/midi_playlist.h"
+#include "ardour/playlist_factory.h"
#include "i18n.h"
+using namespace std;
using namespace ARDOUR;
+using namespace PBD;
+
+PBD::Signal2<void,boost::shared_ptr<Playlist>, bool> PlaylistFactory::PlaylistCreated;
-Region*
-ARDOUR::createRegion (const Region& region, jack_nframes_t start,
- jack_nframes_t length, std::string name,
- layer_t layer, Region::Flag flags)
+boost::shared_ptr<Playlist>
+PlaylistFactory::create (Session& s, const XMLNode& node, bool hidden, bool unused)
{
- const AudioRegion* ar;
-
- if ((ar = dynamic_cast<const AudioRegion*>(®ion)) != 0) {
- AudioRegion* ret;
- ret = new AudioRegion (*ar, start, length, name, layer, flags);
- return ret;
- } else {
- fatal << _("programming error: Playlist::createRegion called with unknown Region type")
- << endmsg;
- /*NOTREACHED*/
- return 0;
+ const XMLProperty* type = node.property("type");
+
+ boost::shared_ptr<Playlist> pl;
+
+ try {
+ if (!type || type->value() == "audio") {
+ pl = boost::shared_ptr<Playlist> (new AudioPlaylist (s, node, hidden));
+ } else if (type->value() == "midi") {
+ pl = boost::shared_ptr<Playlist> (new MidiPlaylist (s, node, hidden));
+ }
+
+ pl->set_region_ownership ();
+
+ if (pl && !hidden) {
+ PlaylistCreated (pl, unused);
+ }
+ return pl;
+
+ } catch (...) {
+ return boost::shared_ptr<Playlist> ();
}
}
-Region*
-ARDOUR::createRegion (const Region& region)
+boost::shared_ptr<Playlist>
+PlaylistFactory::create (DataType type, Session& s, string name, bool hidden)
{
- const AudioRegion* ar;
-
- if ((ar = dynamic_cast<const AudioRegion*>(®ion)) != 0) {
- return new AudioRegion (*ar);
- } else {
- fatal << _("programming error: Playlist::createRegion called with unknown Region type")
- << endmsg;
- /*NOTREACHED*/
- return 0;
+ boost::shared_ptr<Playlist> pl;
+
+ try {
+ if (type == DataType::AUDIO)
+ pl = boost::shared_ptr<Playlist> (new AudioPlaylist (s, name, hidden));
+ else if (type == DataType::MIDI)
+ pl = boost::shared_ptr<Playlist> (new MidiPlaylist (s, name, hidden));
+
+ if (pl && !hidden) {
+ PlaylistCreated (pl, false);
+ }
+
+ return pl;
+ } catch (...) {
+ return boost::shared_ptr<Playlist> ();
}
}
-Region*
-ARDOUR::createRegion (Session& session, XMLNode& node, bool yn)
+boost::shared_ptr<Playlist>
+PlaylistFactory::create (boost::shared_ptr<const Playlist> old, string name, bool hidden)
{
- return session.XMLRegionFactory (node, yn);
+ boost::shared_ptr<Playlist> pl;
+ boost::shared_ptr<const AudioPlaylist> apl;
+ boost::shared_ptr<const MidiPlaylist> mpl;
+
+ try {
+
+ if ((apl = boost::dynamic_pointer_cast<const AudioPlaylist> (old)) != 0) {
+ pl = boost::shared_ptr<Playlist> (new AudioPlaylist (apl, name, hidden));
+ pl->set_region_ownership ();
+ } else if ((mpl = boost::dynamic_pointer_cast<const MidiPlaylist> (old)) != 0) {
+ pl = boost::shared_ptr<Playlist> (new MidiPlaylist (mpl, name, hidden));
+ pl->set_region_ownership ();
+ }
+
+ if (pl && !hidden) {
+ PlaylistCreated (pl, false);
+ }
+
+ return pl;
+ } catch (...) {
+ return boost::shared_ptr<Playlist> ();
+ }
+
}
-
-Playlist*
-Playlist::copyPlaylist (const Playlist& playlist, jack_nframes_t start, jack_nframes_t length,
- string name, bool result_is_hidden)
+
+boost::shared_ptr<Playlist>
+PlaylistFactory::create (boost::shared_ptr<const Playlist> old, framepos_t start, framecnt_t cnt, string name, bool hidden)
{
- const AudioPlaylist* apl;
-
- if ((apl = dynamic_cast<const AudioPlaylist*> (&playlist)) != 0) {
- return new AudioPlaylist (*apl, start, length, name, result_is_hidden);
- } else {
- fatal << _("programming error: Playlist::copyPlaylist called with unknown Playlist type")
- << endmsg;
- /*NOTREACHED*/
- return 0;
+ boost::shared_ptr<Playlist> pl;
+ boost::shared_ptr<const AudioPlaylist> apl;
+ boost::shared_ptr<const MidiPlaylist> mpl;
+
+ try {
+ if ((apl = boost::dynamic_pointer_cast<const AudioPlaylist> (old)) != 0) {
+ pl = boost::shared_ptr<Playlist> (new AudioPlaylist (apl, start, cnt, name, hidden));
+ pl->set_region_ownership ();
+ } else if ((mpl = boost::dynamic_pointer_cast<const MidiPlaylist> (old)) != 0) {
+ pl = boost::shared_ptr<Playlist> (new MidiPlaylist (mpl, start, cnt, name, hidden));
+ pl->set_region_ownership ();
+ }
+
+ /* this factory method does NOT notify others */
+
+ return pl;
+ } catch (...) {
+ return boost::shared_ptr<Playlist> ();
}
}