fix file-name reported to analyzer when stem-exporting
[ardour.git] / libs / ardour / playlist_factory.cc
index 7c7060dae80099e44390f8eb7c9dee532f258a2e..46f9910738d1c4562d52b7617cfb156804d0b731 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2000-2006 Paul Davis 
+    Copyright (C) 2000-2006 Paul Davis
 
     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
     along with this program; if not, write to the Free Software
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
-    $Id$
 */
 
-#include <pbd/error.h>
+#include "pbd/error.h"
+#include "pbd/xml++.h"
 
-#include <ardour/session.h>
+#include "ardour/playlist.h"
+#include "ardour/audioplaylist.h"
+#include "ardour/midi_playlist.h"
+#include "ardour/playlist_factory.h"
 
-#include <ardour/playlist.h>
-#include <ardour/audioplaylist.h>
-
-#include <ardour/region_factory.h>
-#include <ardour/region.h>
-#include <ardour/audioregion.h>
-
-#include "i18n.h"
+#include "pbd/i18n.h"
 
+using namespace std;
 using namespace ARDOUR;
 using namespace PBD;
 
-Region*
-ARDOUR::createRegion (const Region& region, jack_nframes_t start, 
-                     jack_nframes_t length, std::string name, 
-                     layer_t layer, Region::Flag flags)
+PBD::Signal2<void,boost::shared_ptr<Playlist>, bool> PlaylistFactory::PlaylistCreated;
+
+boost::shared_ptr<Playlist>
+PlaylistFactory::create (Session& s, const XMLNode& node, bool hidden, bool unused)
 {
-       const AudioRegion* ar;
-       
-       if ((ar = dynamic_cast<const AudioRegion*>(&region)) != 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<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*>(&region)) != 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> ();
        }
 }