[pulseaudio-discuss] [PATCH] "pipe-sink" added option "use_system_clock_for_timing"
Tanu Kaskinen
tanuk at iki.fi
Fri Dec 29 13:40:26 UTC 2017
On Sat, 2017-12-16 at 16:57 +0100, Samo Pogačnik wrote:
> +static ssize_t pipe_sink_write(struct userdata *u, pa_memchunk *pchunk) {
> + size_t index, length;
> + ssize_t count = 0;
> + void *p;
> +
> + pa_assert(u);
> + pa_assert(pchunk);
> +
> + index = pchunk->index;
> + length = pchunk->length;
> + p = pa_memblock_acquire(pchunk->memblock);
> +
> + for (;;) {
> + ssize_t l;
> +
> + l = pa_write(u->fd, (uint8_t*) p + index, length, &u->write_type);
> +
> + pa_assert(l != 0);
> +
> + if (l < 0) {
> + if (errno == EAGAIN)
> + break;
> + else if (errno != EINTR) {
> + if (!u->fifo_error) {
> + pa_log("Failed to write data to FIFO: %s", pa_cstrerror(errno));
> + u->fifo_error = true;
> + }
> + count = l - count;
process_render_use_timing() assumes that l is -1, so you should replace
l with -1 here.
> + break;
> + }
> + } else {
> + count += l;
> + index += l;
> + length -= l;
> +
> + if (length <= 0) {
> + break;
> + }
> + }
> + }
> +
> + pa_memblock_release(pchunk->memblock);
> +
> + if (u->fifo_error && count >= 0) {
> + pa_log("Recovered from FIFO error");
> + u->fifo_error = false;
> + }
This logic is not right. If in the first loop iteration pa_write() does
a partial write and then an error occurs during the second iteration,
the code incorrectly thinks that we have recovered from the error. The
recovery happens when pa_write() returns a positive number for the
first time.
Also, use pa_log_debug() or pa_log_info(). pa_log() is an alias for
pa_log_error(), and this is not an error message.
> + return count;
> +}
> +
> +static int process_render_use_timing(struct userdata *u, pa_usec_t now) {
The function return type can be changed to void.
--
Tanu
https://www.patreon.com/tanuk
More information about the pulseaudio-discuss
mailing list