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 () {
* 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} };
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();
}
}
* 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.
}
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);