From: David Robillard Date: Wed, 21 Oct 2009 16:39:39 +0000 (+0000) Subject: Fix O(n) search on MIDI rec region update (now O(log(n)) per update, but could be... X-Git-Tag: 3.0-alpha5~2951 X-Git-Url: https://git.carlh.net/gitweb/?a=commitdiff_plain;h=86a09c58e3e0e66b1e3525680327545f2b5372c6;p=ardour.git Fix O(n) search on MIDI rec region update (now O(log(n)) per update, but could be O(1) with caching...) git-svn-id: svn://localhost/ardour2/branches/3.0@5843 d708f5d6-7413-0410-9779-e7cbd77b26cf --- diff --git a/gtk2_ardour/midi_streamview.cc b/gtk2_ardour/midi_streamview.cc index 537c4cb725..9d87738354 100644 --- a/gtk2_ardour/midi_streamview.cc +++ b/gtk2_ardour/midi_streamview.cc @@ -575,12 +575,12 @@ MidiStreamView::update_rec_regions (boost::shared_ptr data, nframes_t rect->property_x2() = xend; ARDOUR::BeatsFramesConverter tconv(_trackview.session(), region->position()); + const MidiModel::TimeType start_beats = tconv.from(start); /* draw events */ MidiRegionView* mrv = (MidiRegionView*)iter->second; - // FIXME: this is offensively slow (linear search) - for (MidiModel::Notes::const_iterator i = data->notes().begin(); + for (MidiModel::Notes::const_iterator i = data->note_lower_bound(start_beats); i != data->notes().end(); ++i) { const boost::shared_ptr& note = *i; diff --git a/libs/evoral/evoral/Sequence.hpp b/libs/evoral/evoral/Sequence.hpp index 22d81b6948..b5737638e1 100644 --- a/libs/evoral/evoral/Sequence.hpp +++ b/libs/evoral/evoral/Sequence.hpp @@ -179,6 +179,8 @@ public: const_iterator begin(Time t=0) const { return const_iterator(*this, t); } const const_iterator& end() const { return _end_iter; } + typename Notes::const_iterator note_lower_bound (Time t) const; + bool control_to_midi_event(boost::shared_ptr< Event