summaryrefslogtreecommitdiff
path: root/libs/ardour/audio_playlist.cc
diff options
context:
space:
mode:
authorCarl Hetherington <carl@carlh.net>2011-05-11 22:26:13 +0000
committerCarl Hetherington <carl@carlh.net>2011-05-11 22:26:13 +0000
commit48493b444b9279c8ca76a92bfa82648ac80eb9f0 (patch)
tree551794087ba30dd15030d764e3fcd85bee79e2b4 /libs/ardour/audio_playlist.cc
parentf31b485e9008b832546378b5833b8a67e10de8e6 (diff)
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
Diffstat (limited to 'libs/ardour/audio_playlist.cc')
-rw-r--r--libs/ardour/audio_playlist.cc76
1 files changed, 71 insertions, 5 deletions
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<const AudioPlaylist> other, fram
: Playlist (other, start, cnt, name, hidden)
, _crossfades (*this)
{
+ RegionLock rlock2 (const_cast<Playlist*> (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<AudioRegion> ar = boost::dynamic_pointer_cast<AudioRegion> (*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<AudioRegion> region = boost::dynamic_pointer_cast<AudioRegion> (*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<AudioRegion> our_region = boost::dynamic_pointer_cast<AudioRegion> (*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) */
}