X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fmidi_source.cc;h=97bce4b1abc9f9c3b92c3a9f6d3bb9e842b9bf98;hb=935fd3b32f600d6f20c134fa2ccae78aa4781de5;hp=ab972fabd872222b329ae762aa92044b1dc168b1;hpb=c9023ae73d6d70fead3e827811b384e2b171e4d6;p=ardour.git diff --git a/libs/ardour/midi_source.cc b/libs/ardour/midi_source.cc index ab972fabd8..97bce4b1ab 100644 --- a/libs/ardour/midi_source.cc +++ b/libs/ardour/midi_source.cc @@ -44,10 +44,11 @@ #include "ardour/midi_source.h" #include "ardour/midi_state_tracker.h" #include "ardour/session.h" +#include "ardour/tempo.h" #include "ardour/session_directory.h" #include "ardour/source_factory.h" -#include "i18n.h" +#include "pbd/i18n.h" namespace ARDOUR { template class MidiRingBuffer; } @@ -113,7 +114,7 @@ MidiSource::get_state () int MidiSource::set_state (const XMLNode& node, int /*version*/) { - const XMLProperty* prop; + XMLProperty const * prop; if ((prop = node.property ("captured-for")) != 0) { _captured_for = prop->value(); } @@ -192,9 +193,11 @@ MidiSource::midi_read (const Lock& lm, framecnt_t cnt, MidiStateTracker* tracker, MidiChannelFilter* filter, - const std::set& filtered) const + const std::set& filtered, + double beat, + double start_beat) const { - BeatsFramesConverter converter(_session.tempo_map(), source_start); + //BeatsFramesConverter converter(_session.tempo_map(), source_start); DEBUG_TRACE (DEBUG::MidiSourceIO, string_compose ("MidiSource::midi_read() %5 sstart %1 start %2 cnt %3 tracker %4\n", @@ -205,6 +208,7 @@ MidiSource::midi_read (const Lock& lm, Evoral::Sequence::const_iterator& i = _model_iter; const bool linear_read = _last_read_end != 0 && start == _last_read_end; if (!linear_read || !_model_iter_valid) { +#if 0 // Cached iterator is invalid, search for the first event past start i = _model->begin(converter.from(start), false, filtered, linear_read ? &_model->active_notes() : NULL); @@ -212,27 +216,70 @@ MidiSource::midi_read (const Lock& lm, if (!linear_read) { _model->active_notes().clear(); } +#else + /* hot-fix http://tracker.ardour.org/view.php?id=6541 + * "parallel playback of linked midi regions -> no note-offs" + * + * A midi source can be used by multiple tracks simultaneously, + * in which case midi_read() may be called from different tracks for + * overlapping time-ranges. + * + * However there is only a single iterator for a given midi-source. + * This results in every midi_read() performing a seek. + * + * If seeking is performed with + * _model->begin(converter.from(start),...) + * the model is used for seeking. That method seeks to the first + * *note-on* event after 'start'. + * + * _model->begin(converter.from( ) ,..) eventually calls + * Sequence