summaryrefslogtreecommitdiff
path: root/libs/ardour/midi_diskstream.cc
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2015-03-10 22:05:21 +0100
committerRobin Gareus <robin@gareus.org>2015-03-10 22:15:44 +0100
commit7619946b4b804416a08b11d168e5e71f77d0c1ac (patch)
tree8b920a3336cf9a6db960625f6ab385834eba8a24 /libs/ardour/midi_diskstream.cc
parent3139b7e9804496395beb787622d5de90266b8e4a (diff)
MIDI vari-speed playback
Diffstat (limited to 'libs/ardour/midi_diskstream.cc')
-rw-r--r--libs/ardour/midi_diskstream.cc37
1 files changed, 14 insertions, 23 deletions
diff --git a/libs/ardour/midi_diskstream.cc b/libs/ardour/midi_diskstream.cc
index ae0828a3a4..f19c88d3b3 100644
--- a/libs/ardour/midi_diskstream.cc
+++ b/libs/ardour/midi_diskstream.cc
@@ -135,6 +135,7 @@ MidiDiskstream::init ()
_capture_buf = new MidiRingBuffer<framepos_t>(size);
_n_channels = ChanCount(DataType::MIDI, 1);
+ interpolation.add_channel_to (0,0);
}
MidiDiskstream::~MidiDiskstream ()
@@ -522,44 +523,35 @@ MidiDiskstream::process (BufferSet& bufs, framepos_t transport_frame, pframes_t
playback_distance = nframes;
- } else {
-
- /* XXX: should be doing varispeed stuff here, similar to the code in AudioDiskstream::process */
+ } else if (_actual_speed != 1.0f && _target_speed > 0) {
- playback_distance = nframes;
+ interpolation.set_speed (_target_speed);
-#ifndef NO_SIMPLE_MIDI_VARISPEED
- if (_target_speed > 0) {
- playback_distance = nframes * _target_speed;
- }
-#endif
+ playback_distance = interpolation.distance (nframes);
+ } else {
+ playback_distance = nframes;
}
if (need_disk_signal) {
/* copy the diskstream data to all output buffers */
MidiBuffer& mbuf (bufs.get_midi (0));
-#ifndef NO_SIMPLE_MIDI_VARISPEED
- get_playback (mbuf, nframes * _target_speed);
-#else
- get_playback (mbuf, nframes);
-#endif
+ get_playback (mbuf, playback_distance);
/* leave the audio count alone */
ChanCount cnt (DataType::MIDI, 1);
cnt.set (DataType::AUDIO, bufs.count().n_audio());
bufs.set_count (cnt);
-#ifndef NO_SIMPLE_MIDI_VARISPEED
- if (_target_speed > 0 && playback_distance != nframes) {
+ /* vari-speed */
+ if (_target_speed > 0 && _actual_speed != 1.0f) {
MidiBuffer& mbuf (bufs.get_midi (0));
for (MidiBuffer::iterator i = mbuf.begin(); i != mbuf.end(); ++i) {
MidiBuffer::TimeType *tme = i.timeptr();
- *tme = (*tme) / _target_speed;
+ *tme = (*tme) * nframes / playback_distance;
}
}
-#endif
}
return 0;
@@ -568,14 +560,13 @@ MidiDiskstream::process (BufferSet& bufs, framepos_t transport_frame, pframes_t
frameoffset_t
MidiDiskstream::calculate_playback_distance (pframes_t nframes)
{
-#ifndef NO_SIMPLE_MIDI_VARISPEED
- frameoffset_t playback_distance = nframes * _target_speed;
-#else
frameoffset_t playback_distance = nframes;
- /* XXX: should be doing varispeed stuff once it's implemented in ::process() above */
+ if (!record_enabled() && _actual_speed != 1.0f && _actual_speed > 0.f) {
+ interpolation.set_speed (_target_speed);
+ playback_distance = interpolation.distance (nframes, false);
+ }
-#endif
if (_actual_speed < 0.0) {
return -playback_distance;
} else {