summaryrefslogtreecommitdiff
path: root/libs/ardour/audio_playlist.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2006-10-21 05:12:11 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2006-10-21 05:12:11 +0000
commitfbb9576d4047c03276cc2e1b750465c3b0371c6c (patch)
treefb0ed6838c8565a7cdafcd5da63f41d7b87989a8 /libs/ardour/audio_playlist.cc
parent273d9fa8d6fc7fb0c16f805933040ed5962ff3d5 (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.cc35
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;
}