add VCA::full_name() which returns "VCA %n" : VCA %n" by default and "VCA %n : user...
[ardour.git] / libs / ardour / midi_region.cc
index abaf6d348455e96cf0593129f9741bad8a22641a..7511aadce86b6631665c7a20ca2404eec664ee14 100644 (file)
@@ -109,9 +109,11 @@ MidiRegion::MidiRegion (boost::shared_ptr<const MidiRegion> other, frameoffset_t
 {
        if (offset != 0) {
                _start_beats = (_session.tempo_map().exact_qn_at_frame (other->_position + offset, sub_num) - other->_quarter_note) + other->_start_beats;
+               update_length_beats (sub_num);
+               /* we've potentially shifted _start_beats, now reset _start frames to match */
+               _start = _session.tempo_map().frames_between_quarter_notes (_quarter_note - _start_beats, _quarter_note);
        }
 
-       update_length_beats (sub_num);
        register_properties ();
 
        assert(_name.val().find("/") == string::npos);
@@ -178,10 +180,18 @@ MidiRegion::clone (boost::shared_ptr<MidiSource> newsrc) const
        Evoral::Beats const bend = bfc.from (_start + _length);
 
        {
+               boost::shared_ptr<MidiSource> ms = midi_source(0);
+               Source::Lock lm (ms->mutex());
+
+               if (!ms->model()) {
+                       ms->load_model (lm);
+               }
+
                /* Lock our source since we'll be reading from it.  write_to() will
-                  take a lock on newsrc. */
-               Source::Lock lm (midi_source(0)->mutex());
-               if (midi_source(0)->write_to (lm, newsrc, bbegin, bend)) {
+                  take a lock on newsrc.
+               */
+
+               if (ms->write_to (lm, newsrc, bbegin, bend)) {
                        return boost::shared_ptr<MidiRegion> ();
                }
        }