summaryrefslogtreecommitdiff
path: root/libs/ardour/plugin.cc
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2015-11-29 01:27:18 +0100
committerRobin Gareus <robin@gareus.org>2015-11-29 01:27:18 +0100
commit7a5cea45e1a586b7db7a2d96a366f8e1272d07c1 (patch)
tree10985cf3f49c5149a49b60162f5bc599e3fbb07f /libs/ardour/plugin.cc
parentc4f8a69526b5f9b4412c013b9c582690e1cb2f79 (diff)
fix seamless midi-looping - fixes #5438
well, now... - Midi-Ports have a midi-buffer. - Midi-Tracks have a midi-buffer. - Midi-tracks have a diskstream. - Midi-diskstream has a midi-ring-buffer. - Midi-tracks have a delivery - The delivery can get a reference to the actual backend-ports - The delivery calls the Midi-Port's flush() buffer to send out queued events at the end of a cycle all clear ? :) - when splitting the process-cycle: only the Ports are informed. all other objects see a "normal" short process cycle starting at "0". The offset needs to be applied early on, so that internally routed buffers push the event at the correct time when combining the buffer with immediate and async events. Luckily Port::port_offset() is a static member, available to all, objects, which allows to bridge the conceptual gap between the diskstream and the delivery. There's a snag: When there's a note-on directly at the beginning of the loop it coincides with the panic message sent when looping. The panic comes before note events, so it *should* be good. Also the final note-offs (state tracker end of loop/region) are sent 1 sample too early (smells like an off-by-one), and are hence dropped. (no matter we send a panic right after it). It should really be at the same time, just before the panic.
Diffstat (limited to 'libs/ardour/plugin.cc')
-rw-r--r--libs/ardour/plugin.cc3
1 files changed, 2 insertions, 1 deletions
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;
}