diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc index b1eef7331d..353c031d7e 100644 --- a/libs/ardour/session_state.cc +++ b/libs/ardour/session_state.cc @@ -100,6 +100,7 @@ #include "ardour/midi_track.h" #include "ardour/pannable.h" #include "ardour/playlist_factory.h" +#include "ardour/playlist_source.h" #include "ardour/port.h" #include "ardour/processor.h" #include "ardour/proxy_controllable.h" @@ -2675,6 +2676,7 @@ Session::ask_about_playlist_deletion (boost::shared_ptr p) void Session::cleanup_regions () { + bool removed = false; const RegionFactory::RegionMap& regions (RegionFactory::regions()); for (RegionFactory::RegionMap::const_iterator i = regions.begin(); i != regions.end(); ++i) { @@ -2682,10 +2684,24 @@ Session::cleanup_regions () uint32_t used = playlists->region_use_count (i->second); if (used == 0 && !i->second->automatic ()) { + removed = true; RegionFactory::map_remove (i->second); } } + if (removed) { + // re-check to remove parent references of compound regions + for (RegionFactory::RegionMap::const_iterator i = regions.begin(); i != regions.end(); ++i) { + if (!(i->second->whole_file() && i->second->max_source_level() > 0)) { + continue; + } + assert(boost::dynamic_pointer_cast(i->second->source (0)) != 0); + if (0 == playlists->region_use_count (i->second)) { + RegionFactory::map_remove (i->second); + } + } + } + /* dump the history list */ _history.clear ();