From 5153631d70a3bfa9aec2548a1ae33edcffbebfcb Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Mon, 1 Feb 2016 13:26:30 -0500 Subject: change API of MIDI::Port::drain() to include a maximum blocking time --- libs/ardour/ardour/async_midi_port.h | 2 +- libs/ardour/async_midi_port.cc | 8 ++++++-- libs/midi++2/midi++/port.h | 2 +- libs/surfaces/mackie/surface_port.cc | 2 +- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/libs/ardour/ardour/async_midi_port.h b/libs/ardour/ardour/async_midi_port.h index e28c6922d2..96a50ab198 100644 --- a/libs/ardour/ardour/async_midi_port.h +++ b/libs/ardour/ardour/async_midi_port.h @@ -58,7 +58,7 @@ class LIBARDOUR_API AsyncMIDIPort : public ARDOUR::MidiPort, public MIDI::Port { int write (const MIDI::byte *msg, size_t msglen, MIDI::timestamp_t timestamp); int read (MIDI::byte *buf, size_t bufsize); /* waits for output to be cleared */ - void drain (int check_interval_usecs); + void drain (int check_interval_usecs, int total_usecs_to_wait); /* clears async request communication channel */ void clear () { diff --git a/libs/ardour/async_midi_port.cc b/libs/ardour/async_midi_port.cc index 3dfb5610d9..bbcc0aab85 100644 --- a/libs/ardour/async_midi_port.cc +++ b/libs/ardour/async_midi_port.cc @@ -168,7 +168,7 @@ AsyncMIDIPort::cycle_end (MIDI::pframes_t nframes) * Cannot be called from a processing thread. */ void -AsyncMIDIPort::drain (int check_interval_usecs) +AsyncMIDIPort::drain (int check_interval_usecs, int total_usecs_to_wait) { RingBuffer< Evoral::Event >::rw_vector vec = { { 0, 0 }, { 0, 0} }; @@ -183,12 +183,16 @@ AsyncMIDIPort::drain (int check_interval_usecs) return; } - while (1) { + microseconds_t now = get_microseconds (); + microseconds_t end = now + total_usecs_to_wait; + + while (now < end) { output_fifo.get_write_vector (&vec); if (vec.len[0] + vec.len[1] >= output_fifo.bufsize() - 1) { break; } Glib::usleep (check_interval_usecs); + now = get_microseconds(); } } diff --git a/libs/midi++2/midi++/port.h b/libs/midi++2/midi++/port.h index 6d933f6a6d..02cc340194 100644 --- a/libs/midi++2/midi++/port.h +++ b/libs/midi++2/midi++/port.h @@ -75,7 +75,7 @@ class LIBMIDIPP_API Port { * executes any part of a JACK process callback (will * simply return immediately in that situation). */ - virtual void drain (int /* check_interval_usecs */) {} + virtual void drain (int /* check_interval_usecs */, int /* total_usecs_to_wait */) {} /** Write a message to port. * @return true on success. diff --git a/libs/surfaces/mackie/surface_port.cc b/libs/surfaces/mackie/surface_port.cc index 009f45d136..6f6500ffa3 100644 --- a/libs/surfaces/mackie/surface_port.cc +++ b/libs/surfaces/mackie/surface_port.cc @@ -99,7 +99,7 @@ SurfacePort::~SurfacePort() } if (_async_out) { - _output_port->drain (10000); + _output_port->drain (10000, 250000); DEBUG_TRACE (DEBUG::MackieControl, string_compose ("unregistering output port %1\n", _async_out->name())); AudioEngine::instance()->unregister_port (_async_out); _async_out.reset ((ARDOUR::Port*) 0); -- cgit v1.2.3