From 48493b444b9279c8ca76a92bfa82648ac80eb9f0 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Wed, 11 May 2011 22:26:13 +0000 Subject: Fix previous patch using Ben's patch from A2 to fix #4035 properly. git-svn-id: svn://localhost/ardour2/branches/3.0@9496 d708f5d6-7413-0410-9779-e7cbd77b26cf --- libs/ardour/ardour/audioregion.h | 3 +- libs/ardour/audio_playlist.cc | 76 +++++++++++++++++++++++++++++++++++++--- 2 files changed, 72 insertions(+), 7 deletions(-) (limited to 'libs/ardour') diff --git a/libs/ardour/ardour/audioregion.h b/libs/ardour/ardour/audioregion.h index 3ee7962bde..8d929827c5 100644 --- a/libs/ardour/ardour/audioregion.h +++ b/libs/ardour/ardour/audioregion.h @@ -140,8 +140,6 @@ class AudioRegion : public Region void set_fade_out (FadeShape, framecnt_t); void set_fade_out (boost::shared_ptr); - void set_default_fades (); - void set_envelope_active (bool yn); void set_default_envelope (); @@ -203,6 +201,7 @@ class AudioRegion : public Region void post_set (const PBD::PropertyChange&); void init (); + void set_default_fades (); void set_default_fade_in (); void set_default_fade_out (); diff --git a/libs/ardour/audio_playlist.cc b/libs/ardour/audio_playlist.cc index bb4bc9c0e3..70a6420eb5 100644 --- a/libs/ardour/audio_playlist.cc +++ b/libs/ardour/audio_playlist.cc @@ -167,19 +167,85 @@ AudioPlaylist::AudioPlaylist (boost::shared_ptr other, fram : Playlist (other, start, cnt, name, hidden) , _crossfades (*this) { + RegionLock rlock2 (const_cast (other.get())); + in_set_state++; + add_property (_crossfades); + framepos_t const end = start + cnt - 1; + /* Audio regions that have been created by the Playlist constructor will currently have the same fade in/out as the regions that they were created from. This is wrong, so reset the fades here. */ - for (RegionList::iterator i = regions.begin(); i != regions.end(); ++i) { - boost::shared_ptr ar = boost::dynamic_pointer_cast (*i); - assert (ar); - ar->set_default_fades (); + RegionList::iterator ours = regions.begin (); + + for (RegionList::const_iterator i = other->regions.begin(); i != other->regions.end(); ++i) { + boost::shared_ptr region = boost::dynamic_pointer_cast (*i); + assert (region); + + framecnt_t fade_in = 64; + framecnt_t fade_out = 64; + + switch (region->coverage (start, end)) { + case OverlapNone: + continue; + + case OverlapInternal: + { + framecnt_t const offset = start - region->position (); + framecnt_t const trim = region->last_frame() - end; + if (region->fade_in()->back()->when > offset) { + fade_in = region->fade_in()->back()->when - offset; + } + if (region->fade_out()->back()->when > trim) { + fade_out = region->fade_out()->back()->when - trim; + } + break; + } + + case OverlapStart: + { + if (region->fade_in()->back()->when > 0) { + fade_in = region->fade_in()->back()->when; + } + if (start > region->last_frame() - region->fade_out()->back()->when) { + fade_out = region->last_frame() - start; + } + break; + } + + case OverlapEnd: + { + framecnt_t const offset = start - region->position(); + if (region->fade_in()->back()->when > offset) { + fade_in = region->fade_in()->back()->when - offset; + } + if (start > region->last_frame() - region->fade_out()->back()->when) { + fade_out = region->last_frame() - start; + } else { + fade_out = region->fade_out()->back()->when; + } + break; + } + + case OverlapExternal: + fade_in = region->fade_in()->back()->when; + fade_out = region->fade_out()->back()->when; + break; + } + + boost::shared_ptr our_region = boost::dynamic_pointer_cast (*ours); + assert (our_region); + + our_region->set_fade_in_length (fade_in); + our_region->set_fade_out_length (fade_out); + ++ours; } - + + in_set_state--; + /* this constructor does NOT notify others (session) */ } -- cgit v1.2.3