summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorCarl Hetherington <carl@carlh.net>2012-04-23 20:43:28 +0000
committerCarl Hetherington <carl@carlh.net>2012-04-23 20:43:28 +0000
commit10d37fecc1b54487a5fb0f3652bfb45a5224ef8b (patch)
treed4d0291c203245863c87c6ce52d1f89c83077110 /libs
parent8b111ed224e999a2de057bb8f4669ddedfc3132e (diff)
Get the _note_mode set up correctly in a MidiDiskstream
before the initial buffer fill, so that percussive mode tracks play properly from the off (#4737). git-svn-id: svn://localhost/ardour2/branches/3.0@12068 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs')
-rw-r--r--libs/ardour/midi_track.cc25
1 files changed, 17 insertions, 8 deletions
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<Diskstream> 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<MidiDiskstream> mds = boost::dynamic_pointer_cast<MidiDiskstream> (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<MidiDiskstream> mds = boost::dynamic_pointer_cast<MidiDiskstream> (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()));
}