summaryrefslogtreecommitdiff
path: root/libs/ardour/smf_source.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libs/ardour/smf_source.cc')
-rw-r--r--libs/ardour/smf_source.cc16
1 files changed, 10 insertions, 6 deletions
diff --git a/libs/ardour/smf_source.cc b/libs/ardour/smf_source.cc
index 7e707b1821..74ee1fd680 100644
--- a/libs/ardour/smf_source.cc
+++ b/libs/ardour/smf_source.cc
@@ -182,16 +182,17 @@ SMFSource::write_unlocked (MidiRingBuffer<nframes_t>& src, sframes_t position, n
_model->start_write();
}
- Evoral::MIDIEvent<nframes_t> ev(0, 0.0, 4, NULL, true);
+ Evoral::MIDIEvent<nframes_t> ev;
while (true) {
bool ret = src.peek_time(&time);
- if (!ret || time - position > _length + dur) {
+ if (!ret || time > _last_write_end + dur) {
break;
}
ret = src.read_prefix(&time, &type, &size);
if (!ret) {
+ cerr << "ERROR: Unable to read event prefix, corrupt MIDI ring buffer" << endl;
break;
}
@@ -227,10 +228,7 @@ SMFSource::write_unlocked (MidiRingBuffer<nframes_t>& src, sframes_t position, n
Evoral::SMF::flush();
free(buf);
- const sframes_t oldlen = _length;
- update_length(oldlen, dur);
-
- ViewDataRangeReady(position + oldlen, dur); /* EMIT SIGNAL */
+ ViewDataRangeReady(position + _last_write_end, dur); /* EMIT SIGNAL */
return dur;
}
@@ -254,6 +252,8 @@ SMFSource::append_event_unlocked_beats (const Evoral::Event<double>& ev)
return;
}
+ _length_beats = max(_length_beats, ev.time());
+
const double delta_time_beats = ev.time() - _last_ev_time_beats;
const uint32_t delta_time_ticks = (uint32_t)lrint(delta_time_beats * (double)ppqn());
@@ -287,6 +287,8 @@ SMFSource::append_event_unlocked_frames (const Evoral::Event<nframes_t>& ev, sfr
BeatsFramesConverter converter(_session, position);
+ _length_beats = max(_length_beats, converter.from(ev.time()));
+
const sframes_t delta_time_frames = ev.time() - _last_ev_time_frames;
const double delta_time_beats = converter.from(delta_time_frames);
const uint32_t delta_time_ticks = (uint32_t)(lrint(delta_time_beats * (double)ppqn()));
@@ -405,6 +407,8 @@ SMFSource::load_model (bool lock, bool force_reload)
scratch_size = ev.size();
}
ev.size() = scratch_size; // ensure read_event only allocates if necessary
+
+ _length_beats = max(_length_beats, ev.time());
}
set_default_controls_interpolation();