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 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; }