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;
}
}
PatchChangePtr p (new Evoral::PatchChange<TimeType> (time, channel, program, bank));
- assert(id);
+ assert(prop_id);
p->set_id (id);
return p;
}
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) {
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