diff --git a/libs/ardour/midi_model.cc b/libs/ardour/midi_model.cc index 168516fcc4..a85d00f49e 100644 --- a/libs/ardour/midi_model.cc +++ b/libs/ardour/midi_model.cc @@ -879,8 +879,8 @@ XMLNode& MidiModel::DeltaCommand::get_state() struct EventTimeComparator { typedef const MIDI::Event* value_type; - inline bool operator()(const MIDI::Event* a, const MIDI::Event* b) const { - return a->time() >= b->time(); + inline bool operator()(const MIDI::Event& a, const MIDI::Event& b) const { + return a.time() >= b.time(); } }; @@ -893,14 +893,34 @@ struct EventTimeComparator { */ bool MidiModel::write_to(boost::shared_ptr source) { + /* + EventTimeComparator comp; + typedef std::priority_queue< + const MIDI::Event*, + std::deque, + EventTimeComparator> MidiEvents; + + MidiEvents events(comp); + */ + read_lock(); const NoteMode old_note_mode = _note_mode; _note_mode = Sustained; for (const_iterator i = begin(); i != end(); ++i) { + //events.push(*i); source->append_event_unlocked(Frames, *i); } + + /* + // TODO: As of now, this is still necessary, because there are some events appended whose + // times are earlier than the preceding events + while(!events.empty()) { + source->append_event_unlocked(Frames, events.top()); + events.pop(); + } + */ _note_mode = old_note_mode; diff --git a/libs/ardour/smf_source.cc b/libs/ardour/smf_source.cc index 389224eb3b..5ab3a5df13 100644 --- a/libs/ardour/smf_source.cc +++ b/libs/ardour/smf_source.cc @@ -507,7 +507,11 @@ SMFSource::append_event_unlocked(EventTimeUnit unit, const MIDI::Event& ev) printf("\n"); assert(ev.time() >= 0); - assert(ev.time() >= _last_ev_time); + + if (ev.time() < _last_ev_time) { + cerr << "SMFSource: Warning: Skipping event with ev.time() < _last_ev_time" << endl; + return; + } uint32_t delta_time = 0;