Add missed parent class call to Sequence::control_list_marked_dirty. Fixes #4335.
[ardour.git] / libs / ardour / session_playlists.cc
index 1e5a276ad4a2afc67ddbbd5e21fbcb4b2771b641..1e31801271ee8955a8046272fee6e67c4bfb4bf9 100644 (file)
@@ -27,6 +27,7 @@
 #include "ardour/playlist_factory.h"
 #include "ardour/session.h"
 #include "ardour/source.h"
+#include "ardour/track.h"
 #include "i18n.h"
 
 using namespace std;
@@ -36,7 +37,7 @@ using namespace ARDOUR;
 SessionPlaylists::~SessionPlaylists ()
 {
        DEBUG_TRACE (DEBUG::Destruction, "delete playlists\n");
-       
+
        for (List::iterator i = playlists.begin(); i != playlists.end(); ) {
                SessionPlaylists::List::iterator tmp;
 
@@ -78,11 +79,23 @@ SessionPlaylists::add (boost::shared_ptr<Playlist> playlist)
        if (!existing) {
                playlists.insert (playlists.begin(), playlist);
                playlist->InUse.connect_same_thread (*this, boost::bind (&SessionPlaylists::track, this, _1, boost::weak_ptr<Playlist>(playlist)));
+               playlist->DropReferences.connect_same_thread (
+                       *this, boost::bind (&SessionPlaylists::remove_weak, this, boost::weak_ptr<Playlist> (playlist))
+                       );
        }
 
        return existing;
 }
 
+void
+SessionPlaylists::remove_weak (boost::weak_ptr<Playlist> playlist)
+{
+       boost::shared_ptr<Playlist> p = playlist.lock ();
+       if (p) {
+               remove (p);
+       }
+}
+
 void
 SessionPlaylists::remove (boost::shared_ptr<Playlist> playlist)
 {
@@ -100,7 +113,7 @@ SessionPlaylists::remove (boost::shared_ptr<Playlist> playlist)
                unused_playlists.erase (i);
        }
 }
-       
+
 
 void
 SessionPlaylists::track (bool inuse, boost::weak_ptr<Playlist> wpl)
@@ -158,7 +171,7 @@ SessionPlaylists::by_name (string name)
                        return* i;
                }
        }
-       
+
        for (List::iterator i = unused_playlists.begin(); i != unused_playlists.end(); ++i) {
                if ((*i)->name() == name) {
                        return* i;
@@ -178,7 +191,7 @@ SessionPlaylists::by_id (const PBD::ID& id)
                        return* i;
                }
        }
-       
+
        for (List::iterator i = unused_playlists.begin(); i != unused_playlists.end(); ++i) {
                if ((*i)->id() == id) {
                        return* i;
@@ -198,7 +211,7 @@ SessionPlaylists::unassigned (std::list<boost::shared_ptr<Playlist> > & list)
                        list.push_back (*i);
                }
        }
-       
+
        for (List::iterator i = unused_playlists.begin(); i != unused_playlists.end(); ++i) {
                if (!(*i)->get_orig_diskstream_id().to_s().compare ("0")) {
                        list.push_back (*i);
@@ -207,14 +220,14 @@ SessionPlaylists::unassigned (std::list<boost::shared_ptr<Playlist> > & list)
 }
 
 void
-SessionPlaylists::get (vector<boost::shared_ptr<Playlist> >& s)
+SessionPlaylists::get (vector<boost::shared_ptr<Playlist> >& s) const
 {
        Glib::Mutex::Lock lm (lock);
 
        for (List::iterator i = playlists.begin(); i != playlists.end(); ++i) {
                s.push_back (*i);
        }
-       
+
        for (List::iterator i = unused_playlists.begin(); i != unused_playlists.end(); ++i) {
                s.push_back (*i);
        }
@@ -228,7 +241,7 @@ SessionPlaylists::destroy_region (boost::shared_ptr<Region> r)
        for (List::iterator i = playlists.begin(); i != playlists.end(); ++i) {
                 (*i)->destroy_region (r);
        }
-       
+
        for (List::iterator i = unused_playlists.begin(); i != unused_playlists.end(); ++i) {
                 (*i)->destroy_region (r);
        }
@@ -404,7 +417,7 @@ SessionPlaylists::find_crossfade (const PBD::ID& id)
        Glib::Mutex::Lock lm (lock);
 
        boost::shared_ptr<Crossfade> c;
-       
+
        for (List::iterator i = playlists.begin(); i != playlists.end(); ++i) {
                c = (*i)->find_crossfade (id);
                if (c) {
@@ -427,7 +440,7 @@ SessionPlaylists::region_use_count (boost::shared_ptr<Region> region) const
 {
        Glib::Mutex::Lock lm (lock);
         uint32_t cnt = 0;
-       
+
        for (List::iterator i = playlists.begin(); i != playlists.end(); ++i) {
                 cnt += (*i)->region_use_count (region);
        }
@@ -438,3 +451,21 @@ SessionPlaylists::region_use_count (boost::shared_ptr<Region> region) const
 
        return cnt;
 }
+
+/** @return list of Playlists that are associated with a track */
+vector<boost::shared_ptr<Playlist> >
+SessionPlaylists::playlists_for_track (boost::shared_ptr<Track> tr) const
+{
+       vector<boost::shared_ptr<Playlist> > pl;
+       get (pl);
+       
+       vector<boost::shared_ptr<Playlist> > pl_tr;
+
+       for (vector<boost::shared_ptr<Playlist> >::iterator i = pl.begin(); i != pl.end(); ++i) {
+               if (((*i)->get_orig_diskstream_id() == tr->diskstream_id()) || (tr->playlist()->id() == (*i)->id())) {
+                       pl_tr.push_back (*i);
+               }
+       }
+
+       return pl_tr;
+}