Fix ordering of set position / length when trimming the start of MIDI regions. Fixes...
authorCarl Hetherington <carl@carlh.net>
Sat, 26 Feb 2011 20:37:54 +0000 (20:37 +0000)
committerCarl Hetherington <carl@carlh.net>
Sat, 26 Feb 2011 20:37:54 +0000 (20:37 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@8967 d708f5d6-7413-0410-9779-e7cbd77b26cf

libs/ardour/region.cc

index 7fb94bb1778adebf20e9cbfd93bf614175ed090b..873e265225bc67c914f673a3e1106660885a0822 100644 (file)
@@ -920,13 +920,15 @@ Region::trim_to_internal (framepos_t position, framecnt_t length, void */*src*/)
                _start = new_start;
                what_changed.add (Properties::start);
        }
-       if (_length != length) {
-               if (!property_changes_suspended()) {
-                       _last_length = _length;
-               }
-               set_length_internal (length);
-               what_changed.add (Properties::length);
-       }
+
+       /* Set position before length, otherwise for MIDI regions this bad thing happens:
+        * 1. we call set_length_internal; length in beats is computed using the region's current
+        *    (soon-to-be old) position
+        * 2. we call set_position_internal; position is set and length in frames re-computed using
+        *    length in beats from (1) but at the new position, which is wrong if the region
+        *    straddles a tempo/meter change.
+        */
+       
        if (_position != position) {
                if (!property_changes_suspended()) {
                        _last_position = _position;
@@ -934,6 +936,14 @@ Region::trim_to_internal (framepos_t position, framecnt_t length, void */*src*/)
                set_position_internal (position, true);
                what_changed.add (Properties::position);
        }
+       
+       if (_length != length) {
+               if (!property_changes_suspended()) {
+                       _last_length = _length;
+               }
+               set_length_internal (length);
+               what_changed.add (Properties::length);
+       }
 
        _whole_file = false;