summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libs/ardour/ardour/async_midi_port.h5
-rw-r--r--libs/ardour/async_midi_port.cc6
2 files changed, 9 insertions, 2 deletions
diff --git a/libs/ardour/ardour/async_midi_port.h b/libs/ardour/ardour/async_midi_port.h
index 46d5f94a91..4e578b5ed1 100644
--- a/libs/ardour/ardour/async_midi_port.h
+++ b/libs/ardour/ardour/async_midi_port.h
@@ -47,8 +47,10 @@ class LIBARDOUR_API AsyncMIDIPort : public ARDOUR::MidiPort, public MIDI::Port {
AsyncMIDIPort (std::string const &, PortFlags);
~AsyncMIDIPort ();
- /* called from an RT context */
+ bool flush_at_cycle_start () const { return _flush_at_cycle_start; }
+ void set_flush_at_cycle_start (bool en) { _flush_at_cycle_start = en; }
+ /* called from an RT context */
void cycle_start (pframes_t nframes);
void cycle_end (pframes_t nframes);
@@ -79,6 +81,7 @@ class LIBARDOUR_API AsyncMIDIPort : public ARDOUR::MidiPort, public MIDI::Port {
private:
bool _currently_in_cycle;
MIDI::timestamp_t _last_write_timestamp;
+ bool _flush_at_cycle_start;
bool have_timer;
boost::function<framecnt_t (void)> timer;
RingBuffer< Evoral::Event<double> > output_fifo;
diff --git a/libs/ardour/async_midi_port.cc b/libs/ardour/async_midi_port.cc
index eee585fd96..388aaf1935 100644
--- a/libs/ardour/async_midi_port.cc
+++ b/libs/ardour/async_midi_port.cc
@@ -46,6 +46,7 @@ AsyncMIDIPort::AsyncMIDIPort (string const & name, PortFlags flags)
, MIDI::Port (name, MIDI::Port::Flags (0))
, _currently_in_cycle (false)
, _last_write_timestamp (0)
+ , _flush_at_cycle_start (false)
, have_timer (false)
, output_fifo (2048)
, input_fifo (1024)
@@ -119,6 +120,9 @@ AsyncMIDIPort::cycle_start (MIDI::pframes_t nframes)
if (ARDOUR::Port::sends_output()) {
flush_output_fifo (nframes);
+ if (_flush_at_cycle_start) {
+ flush_buffers (nframes);
+ }
}
/* copy incoming data from the port buffer into the input FIFO
@@ -152,7 +156,7 @@ AsyncMIDIPort::cycle_start (MIDI::pframes_t nframes)
void
AsyncMIDIPort::cycle_end (MIDI::pframes_t nframes)
{
- if (ARDOUR::Port::sends_output()) {
+ if (ARDOUR::Port::sends_output() && !_flush_at_cycle_start) {
/* move any additional data from output FIFO into the port
buffer.
*/