summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libs/ardour/midi_buffer.cc14
-rw-r--r--libs/ardour/midi_diskstream.cc13
-rw-r--r--libs/ardour/midi_track.cc2
-rw-r--r--libs/ardour/plugin.cc3
4 files changed, 21 insertions, 11 deletions
diff --git a/libs/ardour/midi_buffer.cc b/libs/ardour/midi_buffer.cc
index 71f3e5334c..3a03a03f9e 100644
--- a/libs/ardour/midi_buffer.cc
+++ b/libs/ardour/midi_buffer.cc
@@ -26,6 +26,7 @@
#include "ardour/debug.h"
#include "ardour/midi_buffer.h"
+#include "ardour/port.h"
using namespace std;
using namespace ARDOUR;
@@ -35,6 +36,7 @@ using namespace PBD;
MidiBuffer::MidiBuffer(size_t capacity)
: Buffer (DataType::MIDI)
, _data (0)
+ , _size (0)
{
if (capacity) {
resize (capacity);
@@ -85,7 +87,7 @@ MidiBuffer::copy(const MidiBuffer& copy)
* Note that offset and nframes refer to sample time, NOT buffer offsets or event counts.
*/
void
-MidiBuffer::read_from (const Buffer& src, framecnt_t nframes, framecnt_t dst_offset, framecnt_t src_offset)
+MidiBuffer::read_from (const Buffer& src, framecnt_t nframes, framecnt_t dst_offset, framecnt_t /* src_offset*/)
{
assert (src.type() == DataType::MIDI);
assert (&src != this);
@@ -99,15 +101,19 @@ MidiBuffer::read_from (const Buffer& src, framecnt_t nframes, framecnt_t dst_off
assert (_size == 0);
}
- /* XXX use dst_offset somehow */
+ framecnt_t offset = Port::port_offset();
for (MidiBuffer::const_iterator i = msrc.begin(); i != msrc.end(); ++i) {
const Evoral::MIDIEvent<TimeType> ev(*i, false);
- if (ev.time() >= src_offset && ev.time() < (nframes+src_offset)) {
+ if (ev.time() >= offset && ev.time() < (nframes + offset)) {
push_back (ev);
} else {
cerr << "MIDI event @ " << ev.time() << " skipped, not within range "
- << src_offset << " .. " << (nframes + src_offset) << endl;
+ << offset << " .. " << (nframes + offset) << ":";
+ for (size_t xx = 0; xx < ev.size(); ++xx) {
+ cerr << ' ' << hex << (int) ev.buffer()[xx];
+ }
+ cerr << dec << endl;
}
}
diff --git a/libs/ardour/midi_diskstream.cc b/libs/ardour/midi_diskstream.cc
index 43239f0069..485967b2a3 100644
--- a/libs/ardour/midi_diskstream.cc
+++ b/libs/ardour/midi_diskstream.cc
@@ -1437,6 +1437,7 @@ MidiDiskstream::get_playback (MidiBuffer& dst, framecnt_t nframes)
// cerr << "----------------\n";
size_t events_read = 0;
+ const size_t split_cycle_offset = Port::port_offset ();
if (loc) {
framepos_t effective_start;
@@ -1454,11 +1455,13 @@ MidiDiskstream::get_playback (MidiBuffer& dst, framecnt_t nframes)
beyond the loop end.
*/
- _playback_buf->resolve_tracker (dst, 0);
+ _playback_buf->resolve_tracker (dst, split_cycle_offset);
}
_playback_buf->skip_to (effective_start);
+ /* for split-cycles we need to offset the events */
+
if (loc->end() >= effective_start && loc->end() < effective_start + nframes) {
/* end of loop is within the range we are reading, so
split the read in two, and lie about the location
@@ -1475,23 +1478,23 @@ MidiDiskstream::get_playback (MidiBuffer& dst, framecnt_t nframes)
if (first) {
DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("loop read #1, from %1 for %2\n",
effective_start, first));
- events_read = _playback_buf->read (dst, effective_start, first);
+ events_read = _playback_buf->read (dst, effective_start, first, split_cycle_offset);
}
if (second) {
DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("loop read #2, from %1 for %2\n",
loc->start(), second));
- events_read += _playback_buf->read (dst, loc->start(), second);
+ events_read += _playback_buf->read (dst, loc->start(), second, split_cycle_offset);
}
} else {
DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose ("loop read #3, adjusted start as %1 for %2\n",
effective_start, nframes));
- events_read = _playback_buf->read (dst, effective_start, effective_start + nframes);
+ events_read = _playback_buf->read (dst, effective_start, effective_start + nframes, split_cycle_offset);
}
} else {
_playback_buf->skip_to (playback_sample);
- events_read = _playback_buf->read (dst, playback_sample, playback_sample + nframes);
+ events_read = _playback_buf->read (dst, playback_sample, playback_sample + nframes, split_cycle_offset);
}
DEBUG_TRACE (DEBUG::MidiDiskstreamIO, string_compose (
diff --git a/libs/ardour/midi_track.cc b/libs/ardour/midi_track.cc
index c49a2ef7f1..b078fa3f1b 100644
--- a/libs/ardour/midi_track.cc
+++ b/libs/ardour/midi_track.cc
@@ -935,7 +935,7 @@ MidiTrack::act_on_mute ()
}
/* Resolve active notes. */
- midi_diskstream()->resolve_tracker(_immediate_events, 0);
+ midi_diskstream()->resolve_tracker(_immediate_events, Port::port_offset());
}
}
diff --git a/libs/ardour/plugin.cc b/libs/ardour/plugin.cc
index d68502713c..d03024b64b 100644
--- a/libs/ardour/plugin.cc
+++ b/libs/ardour/plugin.cc
@@ -50,6 +50,7 @@
#include "ardour/midi_state_tracker.h"
#include "ardour/plugin.h"
#include "ardour/plugin_manager.h"
+#include "ardour/port.h"
#include "ardour/session.h"
#include "ardour/types.h"
@@ -304,7 +305,7 @@ Plugin::resolve_midi ()
*/
_pending_stop_events.get_midi(0).clear ();
- _tracker.resolve_notes (_pending_stop_events.get_midi (0), 0);
+ _tracker.resolve_notes (_pending_stop_events.get_midi (0), /* split cycle offset*/ Port::port_offset());
_have_pending_stop_events = true;
}