pacat: Synchronize STDIN and "write stream ready" events
authorAhmed S. Darwish <darwish.07@gmail.com>
Tue, 22 Nov 2016 20:16:10 +0000 (22:16 +0200)
committerTanu Kaskinen <tanuk@iki.fi>
Thu, 24 Nov 2016 18:40:04 +0000 (20:40 +0200)
commitf5315113a5932a44b219c872fec589ded9d3e991
treeb8ca4dc510808a2b88cd3a627e3c135f6d577e6c
parentf665b2b10d9cc5412223fd107ea09c25f28eb0a0
pacat: Synchronize STDIN and "write stream ready" events

Users reported pacat crashes when playing certain multi-channel
audio. For example:

  pacat --channels=2 /dev/zero    works
  pacat --channels=3 /dev/zero    pa_stream_write() failed: EINVAL
  pacat --channels=4 /dev/zero    works
  pacat --channels=5 /dev/zero    pa_stream_write() failed: EINVAL

pacat audio playback is pipe-like, from STDIN to PA write stream.
Meanwhile STDIN "ready to read" events got regularly triggered
before the write stream was even created, or at moments where the
stream could not accept any more audio.

In these out-of-sync cases, the write stream could not report the
appropriate buffer lengths it accepts, thus a default of 4K bytes
was chosen -- compatible by luck with some channel counts and
incompatible with others.

Instead of choosing a faulty default in these scenarios, mute the
the STDIN events until the write stream is available & queriable.

BugLink: https://bugs.freedesktop.org/show_bug.cgi?id=98475
Reported-by: Tanu Kaskinen <tanuk@iki.fi>
Signed-off-by: Ahmed S. Darwish <darwish.07@gmail.com>
src/utils/pacat.c