fix thinko in playlist constructor for cut and copy
authorBen Loftis <ben@glw.com>
Tue, 17 May 2011 15:20:18 +0000 (15:20 +0000)
committerBen Loftis <ben@glw.com>
Tue, 17 May 2011 15:20:18 +0000 (15:20 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@9541 d708f5d6-7413-0410-9779-e7cbd77b26cf

libs/ardour/audio_playlist.cc

index 4e15aa70c2d3a89318df3ec9457276f27a155e72..07a6d099eaa34b43408968d066299e684ba55ac4 100644 (file)
@@ -205,31 +205,30 @@ AudioPlaylist::AudioPlaylist (boost::shared_ptr<const AudioPlaylist> other, fram
                        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;
-                       }
+               case OverlapStart: {
+                       position = region->position() - start;
+                       len = end - region->position();
+
+                       if (end > region->position() + region->fade_in().back()->when)
+                               fade_in_len = region->fade_in().back()->when;  //end is after fade-in, preserve the fade-in
+                       if (end > region->last_frame() - region->fade_out().back()->when)
+                               fade_out_len = region->fade_out().back()->when - ( region->last_frame() - end );  //end is inside the fadeout, preserve the fades endpoint
                        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;
-                       }
+               
+               case OverlapEnd: {
+                       position = 0;
+                       offset = start - region->position();
+                       len = region->length() - offset;
+
+                       if (start < region->last_frame() - region->fade_out().back()->when)  //start is before fade-out, preserve the fadeout
+                               fade_out_len = region->fade_out().back()->when;
+                       
+                       if (start < region->position() + region->fade_in().back()->when)
+                               fade_in_len = region->fade_in().back()->when - (start - region->position());  //end is inside the fade-in, preserve the fade-in endpoint
                        break;
                }
-
+               
                case OverlapExternal:
                        fade_in = region->fade_in()->back()->when;
                        fade_out = region->fade_out()->back()->when;