+void
+MidiSource::mark_streaming_midi_write_started (NoteMode mode, framepos_t start_frame)
+{
+ set_timeline_position(start_frame);
+
+ if (_model) {
+ _model->set_note_mode(mode);
+ _model->start_write();
+ }
+
+ _last_write_end = start_frame;
+ _writing = true;
+}
+
+void
+MidiSource::mark_streaming_write_started ()
+{
+ NoteMode note_mode = _model ? _model->note_mode() : Sustained;
+ mark_streaming_midi_write_started(note_mode, _session.transport_frame());
+}
+
+void
+MidiSource::mark_streaming_write_completed ()
+{
+ if (_model) {
+ _model->end_write(false);
+ }
+
+ _writing = false;
+}
+
+boost::shared_ptr<MidiSource>
+MidiSource::clone (Evoral::MusicalTime begin, Evoral::MusicalTime end)
+{
+ string newname = PBD::basename_nosuffix(_name.val());
+ string newpath;
+
+ /* get a new name for the MIDI file we're going to write to
+ */
+
+ do {
+
+ newname = bump_name_once (newname, '-');
+ /* XXX build path safely */
+ newpath = _session.session_directory().midi_path().to_string() +"/"+ newname + ".mid";
+
+ } while (Glib::file_test (newpath, Glib::FILE_TEST_EXISTS));
+
+ boost::shared_ptr<MidiSource> newsrc = boost::dynamic_pointer_cast<MidiSource>(
+ SourceFactory::createWritable(DataType::MIDI, _session,
+ newpath, string(), false, _session.frame_rate()));
+
+ newsrc->set_timeline_position(_timeline_position);
+ newsrc->copy_interpolation_from (this);
+ newsrc->copy_automation_state_from (this);
+
+ if (_model) {
+ if (begin == Evoral::MinMusicalTime && end == Evoral::MaxMusicalTime) {
+ _model->write_to (newsrc);
+ } else {
+ _model->write_section_to (newsrc, begin, end);
+ }
+ } else {
+ error << string_compose (_("programming error: %1"), X_("no model for MidiSource during ::clone()"));
+ return boost::shared_ptr<MidiSource>();
+ }
+
+ newsrc->flush_midi();
+
+ /* force a reload of the model if the range is partial */
+
+ if (begin != Evoral::MinMusicalTime || end != Evoral::MaxMusicalTime) {
+ newsrc->load_model (true, true);
+ } else {
+ newsrc->set_model (_model);
+ }
+
+ return newsrc;
+}
+
+void
+MidiSource::session_saved()