diff options
author | David Robillard <d@drobilla.net> | 2009-10-22 16:15:36 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2009-10-22 16:15:36 +0000 |
commit | d98c8e8fa4bb18cbbf2a18b82b11d9949bb00890 (patch) | |
tree | fd0a5fa975e491c1641417e8f121159678a3a8ce /libs/ardour/midi_source.cc | |
parent | 2eed368c24f3411dc062a90058b1d6be5705444d (diff) |
Replace horribly error-prone Sequence/MidiModel/MidiSource locking API with scoped locks that automatically Do The Right Thing.
Make Sequence::read_lock const correct in the process (a read lock can be taken out on a const Sequence, but not a write lock).
git-svn-id: svn://localhost/ardour2/branches/3.0@5857 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour/midi_source.cc')
-rw-r--r-- | libs/ardour/midi_source.cc | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/libs/ardour/midi_source.cc b/libs/ardour/midi_source.cc index 86f0b86f95..133b75893d 100644 --- a/libs/ardour/midi_source.cc +++ b/libs/ardour/midi_source.cc @@ -55,7 +55,7 @@ MidiSource::MidiSource (Session& s, string name, Source::Flag flags) , _read_data_count(0) , _write_data_count(0) , _writing(false) - , _model_iterator_valid(true) + , _model_iter_valid(false) , _length_beats(0.0) , _last_read_end(0) , _last_write_end(0) @@ -67,7 +67,7 @@ MidiSource::MidiSource (Session& s, const XMLNode& node) , _read_data_count(0) , _write_data_count(0) , _writing(false) - , _model_iterator_valid(true) + , _model_iter_valid(false) , _length_beats(0.0) , _last_read_end(0) , _last_write_end(0) @@ -124,7 +124,8 @@ MidiSource::update_length (sframes_t /*pos*/, sframes_t /*cnt*/) void MidiSource::invalidate () { - _model_iterator_valid = false; + _model_iter_valid = false; + _model_iter.invalidate(); } nframes_t @@ -144,13 +145,13 @@ MidiSource::midi_read (MidiRingBuffer<nframes_t>& dst, sframes_t source_start, Evoral::Sequence<double>::const_iterator& i = _model_iter; // If the cached iterator is invalid, search for the first event past start - if (_last_read_end == 0 || start != _last_read_end || !_model_iterator_valid) { + if (_last_read_end == 0 || start != _last_read_end || !_model_iter_valid) { for (i = _model->begin(); i != _model->end(); ++i) { if (BEATS_TO_FRAMES(i->time()) >= start) { break; } } - _model_iterator_valid = true; + _model_iter_valid = true; } _last_read_end = start + cnt; |