summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libs/ardour/ardour/midi_source.h11
-rw-r--r--libs/ardour/midi_model.cc5
-rw-r--r--libs/ardour/midi_region.cc13
-rw-r--r--libs/ardour/midi_source.cc38
-rw-r--r--libs/ardour/smf_source.cc2
5 files changed, 9 insertions, 60 deletions
diff --git a/libs/ardour/ardour/midi_source.h b/libs/ardour/ardour/midi_source.h
index 07a32c5bfc..411c76eeea 100644
--- a/libs/ardour/ardour/midi_source.h
+++ b/libs/ardour/ardour/midi_source.h
@@ -143,11 +143,6 @@ class LIBARDOUR_API MidiSource : virtual public Source, public boost::enable_sha
virtual void load_model(bool lock=true, bool force_reload=false) = 0;
virtual void destroy_model() = 0;
- /** This must be called with the source lock held whenever the
- * source/model contents have been changed (reset iterators/cache/etc).
- */
- void invalidate();
-
void set_note_mode(NoteMode mode);
boost::shared_ptr<MidiModel> model() { return _model; }
@@ -194,11 +189,7 @@ class LIBARDOUR_API MidiSource : virtual public Source, public boost::enable_sha
boost::shared_ptr<MidiModel> _model;
bool _writing;
- mutable Evoral::Sequence<Evoral::MusicalTime>::const_iterator _model_iter;
- mutable bool _model_iter_valid;
-
- mutable double _length_beats;
- mutable framepos_t _last_read_end;
+ mutable double _length_beats;
/** The total duration of the current capture. */
framepos_t _capture_length;
diff --git a/libs/ardour/midi_model.cc b/libs/ardour/midi_model.cc
index 259a04bc0f..8e17e1d3ec 100644
--- a/libs/ardour/midi_model.cc
+++ b/libs/ardour/midi_model.cc
@@ -1630,7 +1630,6 @@ MidiModel::edit_lock()
assert (ms);
Glib::Threads::Mutex::Lock* source_lock = new Glib::Threads::Mutex::Lock (ms->mutex());
- ms->invalidate(); // Release cached iterator's read lock on model
return WriteLock(new WriteLockImpl(source_lock, _lock, _control_lock));
}
@@ -1854,10 +1853,6 @@ MidiModel::set_midi_source (boost::shared_ptr<MidiSource> s)
{
boost::shared_ptr<MidiSource> old = _midi_source.lock ();
- if (old) {
- old->invalidate ();
- }
-
_midi_source_connections.drop_connections ();
_midi_source = s;
diff --git a/libs/ardour/midi_region.cc b/libs/ardour/midi_region.cc
index 03db3eaaa7..cb0d103b1e 100644
--- a/libs/ardour/midi_region.cc
+++ b/libs/ardour/midi_region.cc
@@ -414,20 +414,13 @@ MidiRegion::model_automation_state_changed (Evoral::Parameter const & p)
/* Update our filtered parameters list after a change to a parameter's AutoState */
boost::shared_ptr<AutomationControl> ac = model()->automation_control (p);
- assert (ac);
-
- if (ac->alist()->automation_state() == Play) {
+ if (!ac || ac->alist()->automation_state() == Play) {
+ /* It should be "impossible" for ac to be NULL, but if it is, don't
+ filter the parameter so events aren't lost. */
_filtered_parameters.erase (p);
} else {
_filtered_parameters.insert (p);
}
-
- /* the source will have an iterator into the model, and that iterator will have been set up
- for a given set of filtered_parameters, so now that we've changed that list we must invalidate
- the iterator.
- */
- Glib::Threads::Mutex::Lock lm (midi_source(0)->mutex());
- midi_source(0)->invalidate ();
}
/** This is called when a trim drag has resulted in a -ve _start time for this region.
diff --git a/libs/ardour/midi_source.cc b/libs/ardour/midi_source.cc
index 655222413a..52c15f94cd 100644
--- a/libs/ardour/midi_source.cc
+++ b/libs/ardour/midi_source.cc
@@ -56,9 +56,7 @@ PBD::Signal1<void,MidiSource*> MidiSource::MidiSourceCreated;
MidiSource::MidiSource (Session& s, string name, Source::Flag flags)
: Source(s, DataType::MIDI, name, flags)
, _writing(false)
- , _model_iter_valid(false)
, _length_beats(0.0)
- , _last_read_end(0)
, _capture_length(0)
, _capture_loop_length(0)
{
@@ -67,9 +65,7 @@ MidiSource::MidiSource (Session& s, string name, Source::Flag flags)
MidiSource::MidiSource (Session& s, const XMLNode& node)
: Source(s, node)
, _writing(false)
- , _model_iter_valid(false)
, _length_beats(0.0)
- , _last_read_end(0)
, _capture_length(0)
, _capture_loop_length(0)
{
@@ -183,13 +179,6 @@ MidiSource::update_length (framecnt_t)
// You're not the boss of me!
}
-void
-MidiSource::invalidate ()
-{
- _model_iter_valid = false;
- _model_iter.invalidate();
-}
-
/** @param filtered A set of parameters whose MIDI messages will not be returned */
framecnt_t
MidiSource::midi_read (Evoral::EventSink<framepos_t>& dst, framepos_t source_start,
@@ -205,26 +194,11 @@ MidiSource::midi_read (Evoral::EventSink<framepos_t>& dst, framepos_t source_sta
source_start, start, cnt, tracker, name()));
if (_model) {
- Evoral::Sequence<double>::const_iterator& i = _model_iter;
-
- // If the cached iterator is invalid, search for the first event past start
- if (_last_read_end == 0 || start != _last_read_end || !_model_iter_valid) {
- DEBUG_TRACE (DEBUG::MidiSourceIO, string_compose ("*** %1 search for relevant iterator for %1 / %2\n", _name, source_start, start));
- for (i = _model->begin(0, false, filtered); i != _model->end(); ++i) {
- if (converter.to(i->time()) >= start) {
- DEBUG_TRACE (DEBUG::MidiSourceIO, string_compose ("***\tstop iterator search @ %1\n", i->time()));
- break;
- }
- }
- _model_iter_valid = true;
- } else {
- DEBUG_TRACE (DEBUG::MidiSourceIO, string_compose ("*** %1 use cachediterator for %1 / %2\n", _name, source_start, start));
- }
-
- _last_read_end = start + cnt;
-
// Read events up to end
- for (; i != _model->end(); ++i) {
+ const double start_beats = converter.from(start);
+ for (Evoral::Sequence<double>::const_iterator i = _model->begin(start_beats, false, filtered);
+ i != _model->end();
+ ++i) {
const framecnt_t time_frames = converter.to(i->time());
if (time_frames < start + cnt) {
/* convert event times to session frames by adding on the source start position in session frames */
@@ -265,9 +239,7 @@ MidiSource::midi_write (MidiRingBuffer<framepos_t>& source,
const framecnt_t ret = write_unlocked (source, source_start, cnt);
- if (cnt == max_framecnt) {
- _last_read_end = 0;
- } else {
+ if (cnt != max_framecnt) {
_capture_length += cnt;
}
diff --git a/libs/ardour/smf_source.cc b/libs/ardour/smf_source.cc
index 8a865c3957..3f22028e62 100644
--- a/libs/ardour/smf_source.cc
+++ b/libs/ardour/smf_source.cc
@@ -702,8 +702,6 @@ SMFSource::load_model (bool lock, bool force_reload)
_model->end_write (Evoral::Sequence<Evoral::MusicalTime>::ResolveStuckNotes, _length_beats);
_model->set_edited (false);
- _model_iter = _model->begin();
-
free(buf);
}