X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fplaylist_factory.cc;h=679e893cdc8bf6311aeb259fedc6acd1d6c03700;hb=cb51c4c5aa1717d1e37f370b3610e4f8f7b1e0bf;hp=fc4618d1dcf7a15c82e263b3f407bf899f1e6cec;hpb=8af0757b61990767f2a85e68f535a5af9976fd79;p=ardour.git diff --git a/libs/ardour/playlist_factory.cc b/libs/ardour/playlist_factory.cc index fc4618d1dc..679e893cdc 100644 --- a/libs/ardour/playlist_factory.cc +++ b/libs/ardour/playlist_factory.cc @@ -1,68 +1,133 @@ -#include +/* + Copyright (C) 2000-2006 Paul Davis -#include -#include + 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 -#include -#include + 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. -#include "i18n.h" + 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 "pbd/i18n.h" + +using namespace std; using namespace ARDOUR; +using namespace PBD; + +PBD::Signal2, 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 +PlaylistFactory::create (Session& s, const XMLNode& node, bool hidden, bool unused) { - const AudioRegion* ar; - - if ((ar = dynamic_cast(®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; + XMLProperty const * type = node.property("type"); + + boost::shared_ptr pl; + + try { + if (!type || type->value() == "audio") { + pl = boost::shared_ptr (new AudioPlaylist (s, node, hidden)); + } else if (type->value() == "midi") { + pl = boost::shared_ptr (new MidiPlaylist (s, node, hidden)); + } + + pl->set_region_ownership (); + + if (pl && !hidden) { + PlaylistCreated (pl, unused); + } + return pl; + + } catch (...) { + return boost::shared_ptr (); } } -Region* -ARDOUR::createRegion (const Region& region) +boost::shared_ptr +PlaylistFactory::create (DataType type, Session& s, string name, bool hidden) { - const AudioRegion* ar; - - if ((ar = dynamic_cast(®ion)) != 0) { - return new AudioRegion (*ar); - } else { - fatal << _("programming error: Playlist::createRegion called with unknown Region type") - << endmsg; - /*NOTREACHED*/ - return 0; + boost::shared_ptr pl; + + try { + if (type == DataType::AUDIO) + pl = boost::shared_ptr (new AudioPlaylist (s, name, hidden)); + else if (type == DataType::MIDI) + pl = boost::shared_ptr (new MidiPlaylist (s, name, hidden)); + + if (pl && !hidden) { + PlaylistCreated (pl, false); + } + + return pl; + } catch (...) { + return boost::shared_ptr (); } } -Region* -ARDOUR::createRegion (Session& session, XMLNode& node, bool yn) +boost::shared_ptr +PlaylistFactory::create (boost::shared_ptr old, string name, bool hidden) { - return session.XMLRegionFactory (node, yn); + boost::shared_ptr pl; + boost::shared_ptr apl; + boost::shared_ptr mpl; + + try { + + if ((apl = boost::dynamic_pointer_cast (old)) != 0) { + pl = boost::shared_ptr (new AudioPlaylist (apl, name, hidden)); + pl->set_region_ownership (); + } else if ((mpl = boost::dynamic_pointer_cast (old)) != 0) { + pl = boost::shared_ptr (new MidiPlaylist (mpl, name, hidden)); + pl->set_region_ownership (); + } + + if (pl && !hidden) { + PlaylistCreated (pl, false); + } + + return pl; + } catch (...) { + return boost::shared_ptr (); + } + } - -Playlist* -Playlist::copyPlaylist (const Playlist& playlist, jack_nframes_t start, jack_nframes_t length, - string name, bool result_is_hidden) + +boost::shared_ptr +PlaylistFactory::create (boost::shared_ptr old, samplepos_t start, samplecnt_t cnt, string name, bool hidden) { - const AudioPlaylist* apl; - - if ((apl = dynamic_cast (&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 pl; + boost::shared_ptr apl; + boost::shared_ptr mpl; + + try { + if ((apl = boost::dynamic_pointer_cast (old)) != 0) { + pl = boost::shared_ptr (new AudioPlaylist (apl, start, cnt, name, hidden)); + pl->set_region_ownership (); + } else if ((mpl = boost::dynamic_pointer_cast (old)) != 0) { + pl = boost::shared_ptr (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 (); } }