summaryrefslogtreecommitdiff
path: root/libs/ardour/midi_source.cc
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2009-10-22 16:15:36 +0000
committerDavid Robillard <d@drobilla.net>2009-10-22 16:15:36 +0000
commitd98c8e8fa4bb18cbbf2a18b82b11d9949bb00890 (patch)
treefd0a5fa975e491c1641417e8f121159678a3a8ce /libs/ardour/midi_source.cc
parent2eed368c24f3411dc062a90058b1d6be5705444d (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.cc11
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;