another -Wabsolute-value fix
[ardour.git] / libs / ardour / midi_model.cc
index e3226e036f060efff5dd8113a0c5652d50be8c5b..3d53abaae5db6808a02d7de994facfcbfb95f7b1 100644 (file)
@@ -1236,14 +1236,15 @@ MidiModel::PatchChangePtr
 MidiModel::PatchChangeDiffCommand::unmarshal_patch_change (XMLNode* n)
 {
        XMLProperty* prop;
+       XMLProperty* prop_id;
        Evoral::event_id_t id = 0;
        Evoral::Beats time = Evoral::Beats();
        int channel = 0;
        int program = 0;
        int bank = 0;
        
-       if ((prop = n->property ("id")) != 0) {
-               istringstream s (prop->value());
+       if ((prop_id = n->property ("id")) != 0) {
+               istringstream s (prop_id->value());
                s >> id;
        }
 
@@ -1268,7 +1269,7 @@ MidiModel::PatchChangeDiffCommand::unmarshal_patch_change (XMLNode* n)
        }
 
        PatchChangePtr p (new Evoral::PatchChange<TimeType> (time, channel, program, bank));
-       assert(id);
+       assert(prop_id);
        p->set_id (id);
        return p;
 }
@@ -1452,6 +1453,11 @@ MidiModel::sync_to_source (const Glib::Threads::Mutex::Lock& source_lock)
                return false;
        }
 
+       /* Invalidate and store active notes, which will be picked up by the iterator
+          on the next roll if time progresses linearly. */
+       ms->invalidate(source_lock,
+                      ms->session().transport_rolling() ? &_active_notes : NULL);
+
        ms->mark_streaming_midi_write_started (source_lock, note_mode());
 
        for (Evoral::Sequence<TimeType>::const_iterator i = begin(TimeType(), true); i != end(); ++i) {
@@ -1611,25 +1617,19 @@ MidiModel::find_sysex (gint sysex_id)
 MidiModel::WriteLock
 MidiModel::edit_lock()
 {
-       boost::shared_ptr<MidiSource> ms = _midi_source.lock ();
-       assert (ms);
+       boost::shared_ptr<MidiSource> ms          = _midi_source.lock();
+       Glib::Threads::Mutex::Lock*   source_lock = 0;
 
-       Glib::Threads::Mutex::Lock* source_lock = new Glib::Threads::Mutex::Lock (ms->mutex());
-       ms->invalidate(*source_lock); // Release cached iterator's read lock on model
-       return WriteLock(new WriteLockImpl(source_lock, _lock, _control_lock));
-}
-
-/** Lock just the model, the source lock must already be held.
- * This should only be called from libardour/evoral places
- */
-MidiModel::WriteLock
-MidiModel::write_lock()
-{
-       boost::shared_ptr<MidiSource> ms = _midi_source.lock ();
-       assert (ms);
+       if (ms) {
+               /* Take source lock and invalidate iterator to release its lock on model.
+                  Add currently active notes to _active_notes so we can restore them
+                  if playback resumes at the same point after the edit. */
+               source_lock = new Glib::Threads::Mutex::Lock(ms->mutex());
+               ms->invalidate(*source_lock,
+                              ms->session().transport_rolling() ? &_active_notes : NULL);
+       }
 
-       assert (!ms->mutex().trylock ());
-       return WriteLock(new WriteLockImpl(0, _lock, _control_lock));
+       return WriteLock(new WriteLockImpl(source_lock, _lock, _control_lock));
 }
 
 int