diff options
author | David Robillard <d@drobilla.net> | 2015-03-28 23:24:41 -0400 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2015-03-29 00:51:56 -0400 |
commit | c9023ae73d6d70fead3e827811b384e2b171e4d6 (patch) | |
tree | 3a6cb5a0a7d436bed457f961afb272b82f1626be /libs/ardour/midi_region.cc | |
parent | 050c9c3f7d695ea8736d050f3eac5c4f0a3158ca (diff) |
Fix mute of MIDI tracks with channel forcing.
This moves MIDI channel filtering into a reusable class and moves filtering to
the source, rather than modifying the buffer afterwards. This is necessary so
that the playlist trackers reflect the emitted notes (and thus are able to stop
them in situations like mute).
As a perk, this is also faster because events are just dropped on read, rather
than pushed into a buffer then later removed (which is very slow).
Really hammering on mute or solo still seems to produce stuck notes
occasionally (perhaps related to multiple-on warnings). I am not yet sure why,
but occasional beats always.
Diffstat (limited to 'libs/ardour/midi_region.cc')
-rw-r--r-- | libs/ardour/midi_region.cc | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/libs/ardour/midi_region.cc b/libs/ardour/midi_region.cc index 5c197761ac..3e4a656ebe 100644 --- a/libs/ardour/midi_region.cc +++ b/libs/ardour/midi_region.cc @@ -230,9 +230,15 @@ MidiRegion::set_position_internal (framepos_t pos, bool allow_bbt_recompute) } framecnt_t -MidiRegion::read_at (Evoral::EventSink<framepos_t>& out, framepos_t position, framecnt_t dur, uint32_t chan_n, NoteMode mode, MidiStateTracker* tracker) const +MidiRegion::read_at (Evoral::EventSink<framepos_t>& out, + framepos_t position, + framecnt_t dur, + uint32_t chan_n, + NoteMode mode, + MidiStateTracker* tracker, + MidiChannelFilter* filter) const { - return _read_at (_sources, out, position, dur, chan_n, mode, tracker); + return _read_at (_sources, out, position, dur, chan_n, mode, tracker, filter); } framecnt_t @@ -248,7 +254,8 @@ MidiRegion::_read_at (const SourceList& /*srcs*/, framecnt_t dur, uint32_t chan_n, NoteMode mode, - MidiStateTracker* tracker) const + MidiStateTracker* tracker, + MidiChannelFilter* filter) const { frameoffset_t internal_offset = 0; framecnt_t to_read = 0; @@ -301,6 +308,7 @@ MidiRegion::_read_at (const SourceList& /*srcs*/, _start + internal_offset, // where to start reading in the source to_read, // read duration in frames tracker, + filter, _filtered_parameters ) != to_read) { return 0; /* "read nothing" */ |