From 106b728d34274753aaa50a638c689aab776c7059 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Thu, 22 Oct 2009 22:14:25 +0000 Subject: [PATCH] Fix crash on save of MIDI data. git-svn-id: svn://localhost/ardour2/branches/3.0@5875 d708f5d6-7413-0410-9779-e7cbd77b26cf --- libs/ardour/ardour/smf_source.h | 2 +- libs/ardour/midi_model.cc | 2 ++ libs/ardour/midi_source.cc | 10 ++-------- libs/ardour/smf_source.cc | 4 +++- 4 files changed, 8 insertions(+), 10 deletions(-) diff --git a/libs/ardour/ardour/smf_source.h b/libs/ardour/ardour/smf_source.h index 7793b6a91c..e02f8eddc0 100644 --- a/libs/ardour/ardour/smf_source.h +++ b/libs/ardour/ardour/smf_source.h @@ -77,7 +77,7 @@ private: sframes_t stamp_offset, sframes_t negative_stamp_offset, MidiStateTracker* tracker) const; - + nframes_t write_unlocked (MidiRingBuffer& src, sframes_t position, nframes_t cnt); diff --git a/libs/ardour/midi_model.cc b/libs/ardour/midi_model.cc index 688e766668..47bc14852c 100644 --- a/libs/ardour/midi_model.cc +++ b/libs/ardour/midi_model.cc @@ -688,12 +688,14 @@ MidiModel::write_to(boost::shared_ptr source) set_percussive(false); source->drop_model(); + source->mark_streaming_midi_write_started(note_mode(), _midi_source->timeline_position()); for (Evoral::Sequence::const_iterator i = begin(); i != end(); ++i) { source->append_event_unlocked_beats(*i); } set_percussive(old_percussive); + source->mark_streaming_write_completed(); set_edited(false); diff --git a/libs/ardour/midi_source.cc b/libs/ardour/midi_source.cc index 133b75893d..09df32a275 100644 --- a/libs/ardour/midi_source.cc +++ b/libs/ardour/midi_source.cc @@ -219,14 +219,8 @@ MidiSource::mark_streaming_midi_write_started (NoteMode mode, sframes_t start_fr void MidiSource::mark_streaming_write_started () { - sframes_t start_frame = _session.transport_frame(); - - if (_model) { - _model->start_write(); - } - - _last_write_end = start_frame; - _writing = true; + NoteMode note_mode = _model ? _model->note_mode() : Sustained; + mark_streaming_midi_write_started(note_mode, _session.transport_frame()); } void diff --git a/libs/ardour/smf_source.cc b/libs/ardour/smf_source.cc index 6e8a0ee052..c940bd3331 100644 --- a/libs/ardour/smf_source.cc +++ b/libs/ardour/smf_source.cc @@ -183,7 +183,7 @@ SMFSource::read_unlocked (MidiRingBuffer& destination, sframes_t sour } else { break; } - + _read_data_count += ev_size; if (ev_size > scratch_size) { @@ -268,6 +268,7 @@ SMFSource::write_unlocked (MidiRingBuffer& source, sframes_t position void SMFSource::append_event_unlocked_beats (const Evoral::Event& ev) { + assert(_writing); if (ev.size() == 0) { return; } @@ -301,6 +302,7 @@ SMFSource::append_event_unlocked_beats (const Evoral::Event& ev) void SMFSource::append_event_unlocked_frames (const Evoral::Event& ev, sframes_t position) { + assert(_writing); if (ev.size() == 0) { return; } -- 2.30.2