summaryrefslogtreecommitdiff
path: root/libs/ardour/midi_region.cc
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2016-11-08 20:34:45 -0500
committerDavid Robillard <d@drobilla.net>2016-11-08 20:34:45 -0500
commitc61373212a87e519276d4c011994e2d37c77ee16 (patch)
tree216e0fcd47e24cd8db0511a074d2d203cb18fa5e /libs/ardour/midi_region.cc
parent72297c0ca31400767177bbcb9310721c481a7dd8 (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.cc8
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,