[pulseaudio-discuss] [PATCH] "pipe-sink" module timig based upon "null-sink" module mechanics.
Tanu Kaskinen
tanuk at iki.fi
Sat Dec 2 14:02:27 UTC 2017
On Fri, 2017-12-01 at 19:22 +0100, Samo Pogačnik wrote:
> Dne 30.11.2017 (čet) ob 20:44 +0200 je Tanu Kaskinen napisal(a):
> > Thanks for the patch! Since this changes the pipe-sink behaviour
> > rather
> > drastically, other people using this module might not like this. You
> > could add a new module argument: "use_system_clock_for_timing". If
> > the
> > option is not set, the old behaviour would be used.
> >
> > More comments below:
> >
>
> Thank you for your comments.
>
> Regarding your initial observation about the change, would it be
> sensible to make a separate "pipe-sink" module (i.e. pipe-timed-sink)
> or do you prefer a single module with additional option?
I would prefer a single module with an additional option.
> > >
> > > +
> > > +do_nothing:
> > > +
> > > + pa_sink_process_rewind(u->sink, 0);
> > > +}
> > > +
> > > +static void process_render(struct userdata *u, pa_usec_t now) {
> > > + size_t ate = 0;
> > > +
> > > + pa_assert(u);
> > > +
> > > + /* This is the configured latency. Sink inputs connected to us
> > > + might not have a single frame more than the maxrequest value
> > > + queued. Hence: at maximum read this many bytes from the sink
> > > + inputs. */
> > > +
> > > + /* Fill the buffer up the latency size */
> > > + while (u->timestamp < now + u->block_usec) {
> > > ssize_t l;
> > > void *p;
> > >
> > > + pa_sink_render(u->sink, u->sink->thread_info.max_request,
> > > &u->memchunk);
> > > +
> > > + pa_assert(u->memchunk.length > 0);
> > > +
> > > p = pa_memblock_acquire(u->memchunk.memblock);
> > > l = pa_write(u->fd, (uint8_t*) p + u->memchunk.index, u-
> > > > memchunk.length, &u->write_type);
> > >
> > > pa_memblock_release(u->memchunk.memblock);
> > >
> > > pa_assert(l != 0);
> > >
> > > - if (l < 0) {
> > > -
> > > - if (errno == EINTR)
> > > - continue;
> > > - else if (errno == EAGAIN)
> > > - return 0;
> > > - else {
> > > - pa_log("Faied to write data to FIFO: %s",
> > > pa_cstrerror(errno));
> > > - return -1;
> > > - }
> >
> > You shouldn't just remove error handling. Also, if pa_write() writes
> > only part of the rendered audio, you probably shouldn't just drop the
> > unwritten data, or at least the drop-outs should be logged.
> >
>
> I agree about logging about drop-outs in some limited way, since that
> may be a constant situation when the pipe is full and there is no
> reader.
Yeah, it's not good to log every dropped chunk. Maybe log only the
first dropped chunk and later the total dropped amount when the pipe
starts accepting writes again.
> Regarding this topic, i also have a test implementation of self-
> draining the pipe before each first write into the pipe after entering
> the "running" state. If there is no real reader, each "start play"
> flushes all potentially old data first. What is your opinion about
> that?
Sounds good, but you should treat "idle" and "running" as the same
state in this flushing logic. Changing from "idle" to "running"
shouldn't cause flushing.
--
Tanu
https://www.patreon.com/tanuk
More information about the pulseaudio-discuss
mailing list