diff options
author | David Robillard <d@drobilla.net> | 2014-12-17 16:05:27 -0500 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2014-12-17 16:07:29 -0500 |
commit | a7067557107fc2f01586a88bb8b0a097914798ea (patch) | |
tree | c23f5f2e0386655c4d5e43ca714718e6bc1b76ac /libs/ardour/midi_region.cc | |
parent | 1fa9edd872bdbfe7651c822698235434ffe59540 (diff) |
Fix various MIDI locking issues.
Attempt to make mistakes much less likely in the future by statically requiring
caller to pass scoped locks where necessary.
Diffstat (limited to 'libs/ardour/midi_region.cc')
-rw-r--r-- | libs/ardour/midi_region.cc | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/libs/ardour/midi_region.cc b/libs/ardour/midi_region.cc index f6631b9de5..f79e5ef203 100644 --- a/libs/ardour/midi_region.cc +++ b/libs/ardour/midi_region.cc @@ -150,8 +150,11 @@ MidiRegion::clone (boost::shared_ptr<MidiSource> newsrc) const Evoral::MusicalTime const bbegin = bfc.from (_start); Evoral::MusicalTime const bend = bfc.from (_start + _length); - if (midi_source(0)->write_to (newsrc, bbegin, bend)) { - return boost::shared_ptr<MidiRegion> (); + { + Source::Lock lm(newsrc->mutex()); + if (midi_source(0)->write_to (lm, newsrc, bbegin, bend)) { + return boost::shared_ptr<MidiRegion> (); + } } PropertyList plist; @@ -272,7 +275,10 @@ MidiRegion::_read_at (const SourceList& /*srcs*/, Evoral::EventSink<framepos_t>& } boost::shared_ptr<MidiSource> src = midi_source(chan_n); - src->set_note_mode(mode); + + Glib::Threads::Mutex::Lock lm(src->mutex()); + + src->set_note_mode(lm, mode); /* cerr << "MR " << name () << " read @ " << position << " * " << to_read @@ -285,6 +291,7 @@ MidiRegion::_read_at (const SourceList& /*srcs*/, Evoral::EventSink<framepos_t>& /* This call reads events from a source and writes them to `dst' timed in session frames */ if (src->midi_read ( + lm, // source lock dst, // destination buffer _position - _start, // start position of the source in session frames _start + internal_offset, // where to start reading in the source @@ -429,7 +436,7 @@ MidiRegion::model_automation_state_changed (Evoral::Parameter const & p) the iterator. */ Glib::Threads::Mutex::Lock lm (midi_source(0)->mutex()); - midi_source(0)->invalidate (); + midi_source(0)->invalidate (lm); } /** This is called when a trim drag has resulted in a -ve _start time for this region. |