summaryrefslogtreecommitdiff
path: root/libs/ardour/smf_source.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2009-09-21 15:43:11 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2009-09-21 15:43:11 +0000
commitddf532a655ea285287d9f0f0419c97cfa2fbb827 (patch)
treea30a718f0b8a4b0ee0da7ec23dfaf5a7efbbc34d /libs/ardour/smf_source.cc
parent378a90b345d6eca50e8ef8fab6ccd102688e6614 (diff)
(full commit): fix MIDI playback by not writing into the playback buffer from MidiDiskStream::process() unless recording. This has a negative impact on "monitoring" MIDI, but that needs a different, somewhat more expansive solution anyway
git-svn-id: svn://localhost/ardour2/branches/3.0@5685 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour/smf_source.cc')
-rw-r--r--libs/ardour/smf_source.cc19
1 files changed, 17 insertions, 2 deletions
diff --git a/libs/ardour/smf_source.cc b/libs/ardour/smf_source.cc
index 65759e7037..ec47554243 100644
--- a/libs/ardour/smf_source.cc
+++ b/libs/ardour/smf_source.cc
@@ -118,7 +118,7 @@ SMFSource::read_unlocked (MidiRingBuffer<nframes_t>& destination, sframes_t sour
const uint64_t start_ticks = (uint64_t)(converter.from(start) * ppqn());
-// if (_smf_last_read_end == 0 || start != _smf_last_read_end) {
+ if (_smf_last_read_end == 0 || start != _smf_last_read_end) {
//cerr << "SMFSource::read_unlocked seeking to " << start << endl;
Evoral::SMF::seek_to_start();
while (time < start_ticks) {
@@ -129,7 +129,7 @@ SMFSource::read_unlocked (MidiRingBuffer<nframes_t>& destination, sframes_t sour
}
time += ev_delta_t; // accumulate delta time
}
-// }
+ }
_smf_last_read_end = start + duration;
@@ -147,15 +147,30 @@ SMFSource::read_unlocked (MidiRingBuffer<nframes_t>& destination, sframes_t sour
ev_type = EventTypeMap::instance().midi_event_type(ev_buffer[0]);
+#if 0
+ cerr << "+++ SMF source read "
+ << " delta = " << ev_delta_t
+ << " time = " << time
+ << " buf[0] " << hex << (int) ev_buffer[0] << dec
+ << " type = " << ev_type;
+#endif
+
assert(time >= start_ticks);
const sframes_t ev_frame_time = converter.to(time / (double)ppqn()) + stamp_offset;
+#if 0
+ cerr << " frames = " << ev_frame_time
+ << " w/offset = " << ev_frame_time - negative_stamp_offset
+ << endl;
+#endif
+
if (ev_frame_time < start + duration) {
destination.write(ev_frame_time - negative_stamp_offset, ev_type, ev_size, ev_buffer);
} else {
break;
}
+
_read_data_count += ev_size;
if (ev_size > scratch_size) {