diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2006-10-21 05:12:11 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2006-10-21 05:12:11 +0000 |
commit | fbb9576d4047c03276cc2e1b750465c3b0371c6c (patch) | |
tree | fb0ed6838c8565a7cdafcd5da63f41d7b87989a8 /libs/ardour/audio_playlist.cc | |
parent | 273d9fa8d6fc7fb0c16f805933040ed5962ff3d5 (diff) |
various fixes related to lifetime management and xfades in particular. lots and lots and lots of debugging output, but sampo can test startup now. shutdown will still crash, but for a new reason.
git-svn-id: svn://localhost/ardour2/trunk@998 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour/audio_playlist.cc')
-rw-r--r-- | libs/ardour/audio_playlist.cc | 35 |
1 files changed, 32 insertions, 3 deletions
diff --git a/libs/ardour/audio_playlist.cc b/libs/ardour/audio_playlist.cc index be8680882f..cce6e188f8 100644 --- a/libs/ardour/audio_playlist.cc +++ b/libs/ardour/audio_playlist.cc @@ -42,9 +42,9 @@ using namespace PBD; AudioPlaylist::AudioPlaylist (Session& session, const XMLNode& node, bool hidden) : Playlist (session, node, hidden) { - in_set_state = true; + in_set_state++; set_state (node); - in_set_state = false; + in_set_state--; if (!hidden) { PlaylistCreated (this); /* EMIT SIGNAL */ @@ -120,10 +120,24 @@ AudioPlaylist::~AudioPlaylist () /* drop connections to signals */ notify_callbacks (); + + + cerr << "deleting crossfades " << _crossfades.size() << endl; + + for (Crossfades::iterator x = _crossfades.begin(); x != _crossfades.end(); ) { + Crossfades::iterator tmp; + + tmp = x; + ++tmp; - for (Crossfades::iterator x = _crossfades.begin(); x != _crossfades.end(); ++x) { delete *x; + + cerr << _crossfades.size() << " to go\n"; + + x = tmp; } + + cerr << "done\n"; } struct RegionSortByLayer { @@ -226,6 +240,10 @@ AudioPlaylist::remove_dependents (boost::shared_ptr<Region> region) { Crossfades::iterator i, tmp; boost::shared_ptr<AudioRegion> r = boost::dynamic_pointer_cast<AudioRegion> (region); + + if (in_set_state) { + return; + } if (r == 0) { fatal << _("programming error: non-audio Region passed to remove_overlap in audio playlist") @@ -354,6 +372,8 @@ AudioPlaylist::check_dependents (boost::shared_ptr<Region> r, bool norefresh) return; } + cerr << "Check dependents of " << r->name() << endl; + if ((region = boost::dynamic_pointer_cast<AudioRegion> (r)) == 0) { fatal << _("programming error: non-audio Region tested for overlap in audio playlist") << endmsg; @@ -441,7 +461,10 @@ AudioPlaylist::add_crossfade (Crossfade& xfade) { Crossfades::iterator ci; + cerr << "adding xfade involving " << xfade.in()->name() << " and " << xfade.out()->name() << endl; + for (ci = _crossfades.begin(); ci != _crossfades.end(); ++ci) { + cerr << "\tcompare to " << (*ci)->in()->name() << " and " << (*ci)->out()->name() << endl; if (*(*ci) == xfade) { // Crossfade::operator==() break; } @@ -488,6 +511,9 @@ AudioPlaylist::set_state (const XMLNode& node) XMLNodeList nlist; XMLNodeConstIterator niter; + in_set_state++; + freeze (); + Playlist::set_state (node); nlist = node.children(); @@ -516,6 +542,9 @@ AudioPlaylist::set_state (const XMLNode& node) } } + thaw (); + in_set_state++; + return 0; } |