From: Jaroslav Kysela Date: Tue, 13 Jan 2026 07:09:47 +0000 (+0100) Subject: seq: return back old snd_seq_drain_output behaviour for -EAGAIN X-Git-Tag: v1.2.15.3~1 X-Git-Url: https://git.alsa-project.org/?a=commitdiff_plain;h=805464c7bd40a14e1f0e8ab8339d5cf5a2398d91;p=alsa-lib.git seq: return back old snd_seq_drain_output behaviour for -EAGAIN It seems that many applications did not follow the documentation including pyalsa sequencer module, thus return the previous behaviour and correct documentation. Closes: https://github.com/alsa-project/alsa-lib/issues/493 Fixes: b97a11ec ("seq: fix snd_seq_drain_output return value for partial drain") Signed-off-by: Jaroslav Kysela --- diff --git a/src/seq/seq.c b/src/seq/seq.c index 49f013e0..b9d9c041 100644 --- a/src/seq/seq.c +++ b/src/seq/seq.c @@ -4431,8 +4431,7 @@ int snd_seq_event_output_pending(snd_seq_t *seq) * \brief drain output buffer to sequencer * \param seq sequencer handle * \return 0 when all events are drained and sent to sequencer. - * When events still remain on the buffer, the byte size of remaining - * events are returned. On error a negative error code is returned. + * On error a negative error code is returned (including -EAGAIN). * * This function drains all pending events on the output buffer. * The function returns immediately after the events are sent to the queues @@ -4444,19 +4443,15 @@ int snd_seq_event_output_pending(snd_seq_t *seq) */ int snd_seq_drain_output(snd_seq_t *seq) { - ssize_t result, processed = 0; + ssize_t result; assert(seq); while (seq->obufused > 0) { result = seq->ops->write(seq, seq->obuf, seq->obufused); - if (result < 0) { - if (result == -EAGAIN && processed > 0) - return seq->obufused; + if (result < 0) return result; - } if ((size_t)result < seq->obufused) memmove(seq->obuf, seq->obuf + result, seq->obufused - result); seq->obufused -= result; - processed += result; } return 0; }