diff --git a/libs/ardour/ardour/session_playlists.h b/libs/ardour/ardour/session_playlists.h index 226680f6eb..865ad9ed39 100644 --- a/libs/ardour/ardour/session_playlists.h +++ b/libs/ardour/ardour/session_playlists.h @@ -72,6 +72,7 @@ private: void remove (boost::shared_ptr); void remove_weak (boost::weak_ptr); void track (bool, boost::weak_ptr); + void update_tracking (); void find_equivalent_playlist_regions (boost::shared_ptr, std::vector >& result); void update_after_tempo_map_change (); diff --git a/libs/ardour/session_playlists.cc b/libs/ardour/session_playlists.cc index d0468b981e..4ee92d2649 100644 --- a/libs/ardour/session_playlists.cc +++ b/libs/ardour/session_playlists.cc @@ -111,6 +111,30 @@ SessionPlaylists::remove (boost::shared_ptr playlist) } } +void +SessionPlaylists::update_tracking () +{ + /* This is intended to be called during session-load, after loading + * playlists and re-assigning them to tracks (refcnt is up to date). + * Check playlist refcnt, move unused playlist to unused_playlists + * array (which may be the case when loading old sessions) + */ + for (List::iterator i = playlists.begin(); i != playlists.end(); ) { + if ((*i)->hidden () || (*i)->used ()) { + ++i; + continue; + } + + warning << _("Session State: Unused playlist was listed as used.") << endmsg; + + assert (unused_playlists.find (*i) == unused_playlists.end()); + unused_playlists.insert (*i); + + List::iterator rm = i; + ++i; + playlists.erase (rm); + } +} void SessionPlaylists::track (bool inuse, boost::weak_ptr wpl) diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc index 8e08630471..534bd4b9bb 100644 --- a/libs/ardour/session_state.cc +++ b/libs/ardour/session_state.cc @@ -1702,6 +1702,9 @@ Session::set_state (const XMLNode& node, int version) goto out; } + /* Now that we Tracks have been loaded and playlists are assigned */ + _playlists->update_tracking (); + /* Now that we have Routes and masters loaded, connect them if appropriate */ Slavable::Assign (_vca_manager); /* EMIT SIGNAL */