From 0f5a73a7fd00015b9d95bf05f5f4266ae782d469 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sun, 6 Nov 2016 18:12:49 -0500 Subject: Fix Sequence/Event const-correctness issues --- libs/ardour/midi_source.cc | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) (limited to 'libs/ardour/midi_source.cc') diff --git a/libs/ardour/midi_source.cc b/libs/ardour/midi_source.cc index d1a3455ba2..d14a23d666 100644 --- a/libs/ardour/midi_source.cc +++ b/libs/ardour/midi_source.cc @@ -190,8 +190,8 @@ MidiSource::midi_read (const Lock& lm, MidiStateTracker* tracker, MidiChannelFilter* filter, const std::set& filtered, - const double pos_beats, - const double start_beats) const + const double pos_beats, + const double start_beats) const { BeatsFramesConverter converter(_session.tempo_map(), source_start); @@ -245,18 +245,28 @@ MidiSource::midi_read (const Lock& lm, /* in range */ - if (filter && filter->filter(i->buffer(), i->size())) { - DEBUG_TRACE (DEBUG::MidiSourceIO, - string_compose ("%1: filter event @ %2 type %3 size %4\n", - _name, time_frames, i->event_type(), i->size())); - continue; - } - if (loop_range) { time_frames = loop_range->squish (time_frames); } - dst.write (time_frames, i->event_type(), i->size(), i->buffer()); + const uint8_t status = i->buffer()[0]; + const bool is_channel_event = (0x80 <= (status & 0xF0)) && (status <= 0xE0); + if (filter && is_channel_event) { + /* Copy event so the filter can modify the channel. I'm not + sure if this is necessary here (channels are mapped later in + buffers anyway), but it preserves existing behaviour without + destroying events in the model during read. */ + Evoral::Event ev(*i, true); + if (!filter->filter(ev.buffer(), ev.size())) { + dst.write(time_frames, ev.event_type(), ev.size(), ev.buffer()); + } else { + DEBUG_TRACE (DEBUG::MidiSourceIO, + string_compose ("%1: filter event @ %2 type %3 size %4\n", + _name, time_frames, i->event_type(), i->size())); + } + } else { + dst.write (time_frames, i->event_type(), i->size(), i->buffer()); + } #ifndef NDEBUG if (DEBUG_ENABLED(DEBUG::MidiSourceIO)) { -- cgit v1.2.3