diff --git a/libs/ardour/midi_track.cc b/libs/ardour/midi_track.cc index 73f19e9224..7291a41212 100644 --- a/libs/ardour/midi_track.cc +++ b/libs/ardour/midi_track.cc @@ -107,16 +107,21 @@ MidiTrack::set_record_enabled (bool yn, void *src) void MidiTrack::set_diskstream (boost::shared_ptr ds) { + /* We have to do this here, as Track::set_diskstream will cause a buffer refill, + and the diskstream must be set up to fill its buffers using the correct _note_mode. + */ + boost::shared_ptr mds = boost::dynamic_pointer_cast (ds); + mds->set_note_mode (_note_mode); + Track::set_diskstream (ds); - midi_diskstream()->reset_tracker (); + mds->reset_tracker (); _diskstream->set_track (this); _diskstream->set_destructive (_mode == Destructive); _diskstream->set_record_enabled (false); _diskstream_data_recorded_connection.disconnect (); - boost::shared_ptr mds = boost::dynamic_pointer_cast (ds); mds->DataRecorded.connect_same_thread ( _diskstream_data_recorded_connection, boost::bind (&MidiTrack::diskstream_data_recorded, this, _1)); @@ -135,6 +140,16 @@ MidiTrack::set_state (const XMLNode& node, int version) { const XMLProperty *prop; + /* This must happen before Track::set_state(), as there will be a buffer + fill during that call, and we must fill buffers using the correct + _note_mode. + */ + if ((prop = node.property (X_("note-mode"))) != 0) { + _note_mode = NoteMode (string_2_enum (prop->value(), _note_mode)); + } else { + _note_mode = Sustained; + } + if (Track::set_state (node, version)) { return -1; } @@ -142,12 +157,6 @@ MidiTrack::set_state (const XMLNode& node, int version) // No destructive MIDI tracks (yet?) _mode = Normal; - if ((prop = node.property (X_("note-mode"))) != 0) { - _note_mode = NoteMode (string_2_enum (prop->value(), _note_mode)); - } else { - _note_mode = Sustained; - } - if ((prop = node.property ("midi-thru")) != 0) { set_midi_thru (string_is_affirmative (prop->value())); }