Rwbi ramps - midi regions resize when tempo map changed.
authornick_m <mainsbridge@gmail.com>
Tue, 24 May 2016 18:09:15 +0000 (04:09 +1000)
committernick_m <mainsbridge@gmail.com>
Fri, 27 May 2016 13:38:17 +0000 (23:38 +1000)
libs/ardour/ardour/midi_region.h
libs/ardour/ardour/region.h
libs/ardour/midi_region.cc
libs/ardour/region.cc

index 81f490f51c37d159fc02366c057d37465025eeb5..b952c90f82e964f27863d61e35f3c00578be39cd 100644 (file)
@@ -140,7 +140,7 @@ class LIBARDOUR_API MidiRegion : public Region
        void model_automation_state_changed (Evoral::Parameter const &);
 
        void set_start_beats_from_start_frames ();
-       void update_after_tempo_map_change ();
+       void update_after_tempo_map_change (bool send_change = true);
 
        std::set<Evoral::Parameter> _filtered_parameters; ///< parameters that we ask our source not to return when reading
        PBD::ScopedConnection _model_connection;
index 383bc6675d2e600476c4e12d2d027e3972437f85..29f4244dffb448cc3779886f131f8a415d116060 100644 (file)
@@ -209,7 +209,7 @@ class LIBARDOUR_API Region
        void set_position (framepos_t);
        void set_initial_position (framepos_t);
        void special_set_position (framepos_t);
-       virtual void update_after_tempo_map_change ();
+       virtual void update_after_tempo_map_change (bool send_change = true);
        void nudge_position (frameoffset_t);
 
        bool at_natural_position () const;
index 6a9e1cd762ec7e8961c23af46ab83e1e06bf92ac..7bb5bc7c0607ff543d4b971f3a5ad96d34a1c81f 100644 (file)
@@ -196,14 +196,20 @@ MidiRegion::set_length_internal (framecnt_t len)
 }
 
 void
-MidiRegion::update_after_tempo_map_change ()
+MidiRegion::update_after_tempo_map_change (bool /* send */)
 {
-       Region::update_after_tempo_map_change ();
+       Region::update_after_tempo_map_change (false);
 
        /* _position has now been updated for the new tempo map */
        _start = _position - _session.tempo_map().framepos_minus_beats (_position, _start_beats);
+       _length = _session.tempo_map().framepos_plus_beats (_position, _length_beats) - _position;
 
-       send_change (Properties::start);
+       PropertyChange s_and_l;
+       s_and_l.add (Properties::start);
+       s_and_l.add (Properties::length);
+       s_and_l.add (Properties::position);
+
+       send_change (s_and_l);
 }
 
 void
index 0ae709d99e34a50aace743f44938e8d7345cf2c3..1b9793313df485b1c081c701d086fb3cab33e3f5 100644 (file)
@@ -546,21 +546,24 @@ Region::set_position_lock_style (PositionLockStyle ps)
 }
 
 void
-Region::update_after_tempo_map_change ()
+Region::update_after_tempo_map_change (bool send)
 {
        boost::shared_ptr<Playlist> pl (playlist());
 
        if (!pl || _position_lock_style != MusicTime) {
                return;
        }
-       TempoMap& map (_session.tempo_map());
-       framepos_t pos = map.frame_at_beat (_beat);
+
+       const framepos_t pos = _session.tempo_map().frame_at_beat (_beat);
        set_position_internal (pos, false);
 
        /* do this even if the position is the same. this helps out
           a GUI that has moved its representation already.
        */
-       send_change (Properties::position);
+
+       if (send) {
+               send_change (Properties::position);
+       }
 }
 
 void