prevent fade in/fade out on audio regions from overlapping each other
authorPaul Davis <paul@linuxaudiosystems.com>
Fri, 13 Feb 2015 21:13:12 +0000 (16:13 -0500)
committerPaul Davis <paul@linuxaudiosystems.com>
Fri, 13 Feb 2015 21:22:08 +0000 (16:22 -0500)
gtk2_ardour/editor_drag.cc

index 497baf5896f788a3adb2b369ce571585545aaa30..bdd93efe7dcc02c54be5a87de15895daca64989f 100644 (file)
@@ -3061,12 +3061,12 @@ FadeInDrag::motion (GdkEvent* event, bool)
 
        framepos_t const pos = adjusted_current_frame (event);
 
-       boost::shared_ptr<Region> region = _primary->region ();
+       boost::shared_ptr<AudioRegion> region = boost::dynamic_pointer_cast<AudioRegion> (_primary->region ());
 
        if (pos < (region->position() + 64)) {
                fade_length = 64; // this should be a minimum defined somewhere
-       } else if (pos > region->last_frame()) {
-               fade_length = region->length();
+       } else if (pos > region->length() - region->fade_out()->back()->when) {
+               fade_length = region->length() - region->fade_out()->back()->when - 1;
        } else {
                fade_length = pos - region->position();
        }
@@ -3096,12 +3096,12 @@ FadeInDrag::finished (GdkEvent* event, bool movement_occurred)
 
        framepos_t const pos = adjusted_current_frame (event);
 
-       boost::shared_ptr<Region> region = _primary->region ();
+       boost::shared_ptr<AudioRegion> region = boost::dynamic_pointer_cast<AudioRegion> (_primary->region ());
 
        if (pos < (region->position() + 64)) {
                fade_length = 64; // this should be a minimum defined somewhere
-       } else if (pos > region->last_frame()) {
-               fade_length = region->length();
+       } else if (pos >= region->length() - region->fade_out()->back()->when) {
+               fade_length = region->length() - region->fade_out()->back()->when - 1;
        } else {
                fade_length = pos - region->position();
        }
@@ -3175,16 +3175,14 @@ FadeOutDrag::motion (GdkEvent* event, bool)
 
        framepos_t const pos = adjusted_current_frame (event);
 
-       boost::shared_ptr<Region> region = _primary->region ();
+       boost::shared_ptr<AudioRegion> region = boost::dynamic_pointer_cast<AudioRegion> (_primary->region ());
 
        if (pos > (region->last_frame() - 64)) {
                fade_length = 64; // this should really be a minimum fade defined somewhere
-       }
-       else if (pos < region->position()) {
-               fade_length = region->length();
-       }
-       else {
-               fade_length = region->last_frame() - pos;
+       } else if (pos <= region->fade_in()->back()->when) {
+               fade_length = region->length() - region->fade_in()->back()->when - 1;
+       } else {
+               fade_length = region->length() - pos;
        }
 
        for (list<DraggingView>::iterator i = _views.begin(); i != _views.end(); ++i) {
@@ -3212,16 +3210,14 @@ FadeOutDrag::finished (GdkEvent* event, bool movement_occurred)
 
        framepos_t const pos = adjusted_current_frame (event);
 
-       boost::shared_ptr<Region> region = _primary->region ();
+       boost::shared_ptr<AudioRegion> region = boost::dynamic_pointer_cast<AudioRegion> (_primary->region ());
 
        if (pos > (region->last_frame() - 64)) {
                fade_length = 64; // this should really be a minimum fade defined somewhere
-       }
-       else if (pos < region->position()) {
-               fade_length = region->length();
-       }
-       else {
-               fade_length = region->last_frame() - pos;
+       } else if (pos <= region->fade_in()->back()->when) {
+               fade_length = region->length() - region->fade_in()->back()->when - 1;
+       } else {
+               fade_length = region->length() - pos;
        }
 
        _editor->begin_reversible_command (_("change fade out length"));