Remove LocaleGuard from ARDOUR::Route class
[ardour.git] / libs / ardour / midi_region.cc
index 9826fa56414148a1b44c60ad1cafa3b2647e2713..dc7293f7b5c1c3cca72e1b2a8070f9f105655a44 100644 (file)
@@ -44,6 +44,7 @@
 #include "ardour/source_factory.h"
 #include "ardour/tempo.h"
 #include "ardour/types.h"
+#include "ardour/evoral_types_convert.h"
 
 #include "pbd/i18n.h"
 #include <locale.h>
@@ -80,6 +81,7 @@ MidiRegion::MidiRegion (const SourceList& srcs)
        : Region (srcs)
        , _start_beats (Properties::start_beats, 0.0)
        , _length_beats (Properties::length_beats, midi_source(0)->length_beats().to_double())
+       , _ignore_shift (false)
 {
        register_properties ();
        midi_source(0)->ModelChanged.connect_same_thread (_source_connection, boost::bind (&MidiRegion::model_changed, this));
@@ -92,6 +94,7 @@ MidiRegion::MidiRegion (boost::shared_ptr<const MidiRegion> other)
        : Region (other)
        , _start_beats (Properties::start_beats, other->_start_beats)
        , _length_beats (Properties::length_beats, other->_length_beats)
+       , _ignore_shift (false)
 {
        //update_length_beats ();
        register_properties ();
@@ -106,6 +109,7 @@ MidiRegion::MidiRegion (boost::shared_ptr<const MidiRegion> other, MusicFrame of
        : Region (other, offset)
        , _start_beats (Properties::start_beats, other->_start_beats)
        , _length_beats (Properties::length_beats, other->_length_beats)
+       , _ignore_shift (false)
 {
 
        register_properties ();
@@ -585,6 +589,27 @@ MidiRegion::model_changed ()
        midi_source()->AutomationStateChanged.connect_same_thread (
                _model_connection, boost::bind (&MidiRegion::model_automation_state_changed, this, _1)
                );
+
+       model()->ContentsShifted.connect_same_thread (_model_shift_connection, boost::bind (&MidiRegion::model_shifted, this, _1));
+}
+void
+MidiRegion::model_shifted (double qn_distance)
+{
+       if (!model()) {
+               return;
+       }
+
+       if (!_ignore_shift) {
+               PropertyChange what_changed;
+               _start_beats += qn_distance;
+               framepos_t const new_start = _session.tempo_map().frames_between_quarter_notes (_quarter_note - _start_beats, _quarter_note);
+               _start = new_start;
+               what_changed.add (Properties::start);
+               what_changed.add (Properties::start_beats);
+               send_change (what_changed);
+       } else {
+               _ignore_shift = false;
+       }
 }
 
 void
@@ -620,7 +645,10 @@ MidiRegion::fix_negative_start ()
 {
        BeatsFramesConverter c (_session.tempo_map(), _position);
 
-       model()->insert_silence_at_start (c.from (-_start));
+       _ignore_shift = true;
+
+       model()->insert_silence_at_start (Evoral::Beats (- _start_beats));
+
        _start = 0;
        _start_beats = 0.0;
 }
@@ -629,6 +657,7 @@ void
 MidiRegion::set_start_internal (framecnt_t s, const int32_t sub_num)
 {
        Region::set_start_internal (s, sub_num);
+
        set_start_beats_from_start_frames ();
 }