summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2016-02-01 13:26:30 -0500
committerPaul Davis <paul@linuxaudiosystems.com>2016-02-01 13:26:30 -0500
commit5153631d70a3bfa9aec2548a1ae33edcffbebfcb (patch)
tree420c4e8e240bff5e73e572ede04c2623a342ba51
parentd98021624fe879ff42cc4191c4fe02d6aa63331b (diff)
change API of MIDI::Port::drain() to include a maximum blocking time
-rw-r--r--libs/ardour/ardour/async_midi_port.h2
-rw-r--r--libs/ardour/async_midi_port.cc8
-rw-r--r--libs/midi++2/midi++/port.h2
-rw-r--r--libs/surfaces/mackie/surface_port.cc2
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<double> >::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);