diff options
author | David Robillard <d@drobilla.net> | 2016-11-08 20:34:45 -0500 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2016-11-08 20:34:45 -0500 |
commit | c61373212a87e519276d4c011994e2d37c77ee16 (patch) | |
tree | 216e0fcd47e24cd8db0511a074d2d203cb18fa5e /libs/ardour/midi_region.cc | |
parent | 72297c0ca31400767177bbcb9310721c481a7dd8 (diff) |
Support multiple readers for MIDI source/model
Fixes the multiple reader issue #6541 properly without resorting to a
linear search kludge.
All the read state has been pulled out into a MidiCursor which the
caller is required to pass. The playlist keeps cursors for all the
regions it is reading, any number of cursors are allowed at a time.
MidiCursor should probably be made a smarter and more fool-proof
object (and/or possibly merged with some of the other tracker/fixer
stuff) but for now I wanted to keep it simple.
Diffstat (limited to 'libs/ardour/midi_region.cc')
-rw-r--r-- | libs/ardour/midi_region.cc | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/libs/ardour/midi_region.cc b/libs/ardour/midi_region.cc index f5c9df1b6e..66c1cf6eef 100644 --- a/libs/ardour/midi_region.cc +++ b/libs/ardour/midi_region.cc @@ -336,12 +336,13 @@ MidiRegion::read_at (Evoral::EventSink<framepos_t>& out, framepos_t position, framecnt_t dur, Evoral::Range<framepos_t>* loop_range, + MidiCursor& cursor, uint32_t chan_n, NoteMode mode, MidiStateTracker* tracker, MidiChannelFilter* filter) const { - return _read_at (_sources, out, position, dur, loop_range, chan_n, mode, tracker, filter); + return _read_at (_sources, out, position, dur, loop_range, cursor, chan_n, mode, tracker, filter); } framecnt_t @@ -349,10 +350,11 @@ MidiRegion::master_read_at (MidiRingBuffer<framepos_t>& out, framepos_t position, framecnt_t dur, Evoral::Range<framepos_t>* loop_range, + MidiCursor& cursor, uint32_t chan_n, NoteMode mode) const { - return _read_at (_master_sources, out, position, dur, loop_range, chan_n, mode); /* no tracker */ + return _read_at (_master_sources, out, position, dur, loop_range, cursor, chan_n, mode); /* no tracker */ } framecnt_t @@ -361,6 +363,7 @@ MidiRegion::_read_at (const SourceList& /*srcs*/, framepos_t position, framecnt_t dur, Evoral::Range<framepos_t>* loop_range, + MidiCursor& cursor, uint32_t chan_n, NoteMode mode, MidiStateTracker* tracker, @@ -423,6 +426,7 @@ MidiRegion::_read_at (const SourceList& /*srcs*/, _start + internal_offset, // where to start reading in the source to_read, // read duration in frames loop_range, + cursor, tracker, filter, _filtered_parameters, |