[pulseaudio-discuss] [PATCH] "pipe-sink" added option "use_system_clock_for_timing"
Samo Pogačnik
samo_pogacnik at t-2.net
Fri Dec 15 17:22:43 UTC 2017
Dne 15.12.2017 (pet) ob 04:01 +0200 je Tanu Kaskinen napisal(a):
> On Wed, 2017-12-13 at 22:14 +0100, Samo Pogačnik wrote:
> >
> > Thank you for the remarks. I tried to correct all issues and
> > below is a new patch.
> Thanks. I recommend you send patches with "git send-email" in the
> future. That way the formatting will always be right (I had some
> trouble getting git accept the patch), the patch will have a commit
> message and the author and date will be correct.
Sorry for the trouble, i will improve my git skills.
>
> >
> > +static int process_render_use_timing(struct userdata *u, pa_usec_t
> > now) {
> > + int ret = 0;
> > + size_t dropped = 0;
> > + size_t consumed = 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. */
> I could have complained about this earlier: this comment is a bit
> hard
> to understand. What does "this" refer to? (Apparently to max_request
> or
> block_usec.) Either remove the comment or rewrite it so that it's
> easy
> to understand.
I though this must be good comment, since it comes from a sample
module. However, i fully accept your remark and i would just remove the
comment for now. Do you agree?
>
> >
> > +
> > + /* Fill the buffer up the latency size */
> > + while (u->timestamp < now + u->block_usec) {
> > + ssize_t written = 0;
> > + pa_memchunk chunk;
> > +
> > + pa_sink_render(u->sink, u->sink->thread_info.max_request,
> > &chunk);
> > +
> > + pa_assert(chunk.length > 0);
> > +
> > + if ((written = pipe_sink_write(u, &chunk)) < 0) {
> > + written = -1 - written;
> > + ret = -1;
> > + }
> Why don't you return immediately here? It doesn't make sense to me to
> continue after writing has failed.
>
> If you return immediately, pipe_sink_write() can then simply return
> -1.
Here i tried to be as accurate as possible regarding the drops counter,
but if we agree, that drop counting becomes irrelevant upon real fifo
error, then i would not bother returning number of potentially written
bytes within pipe_sink_write() before error condition occurred. What do
you say?
>
> >
> > +
> > + pa_memblock_unref(chunk.memblock);
> > +
> > + u->timestamp += pa_bytes_to_usec(chunk.length, &u->sink-
> > >sample_spec);
> > +
> > + dropped = chunk.length - written;
> > +
> > + if (dropped != 0) {
> > + if (u->bytes_dropped == 0) {
> > + pa_log_debug("Pipe-sink just dropped %zu bytes",
> > dropped);
> > + u->bytes_dropped = dropped;
> > + } else
> > + u->bytes_dropped += dropped;
> > + } else {
> > + if (u->bytes_dropped != 0) {
> > + pa_log_debug("Pipe-sink continuously dropped %zu
> > bytes", u->bytes_dropped);
> > + u->bytes_dropped = 0;
> > + }
> > + }
> This still doesn't handle the case of two subsequent partial writes
> correctly. The code treats that case as one continuous drop, but
> since
> the second write writes something, it's not a continuous drop.
>
> I think the logic should be something like this:
>
> if (u->bytes_dropped != 0 && dropped != chunk.length) {
> pa_log_debug("Pipe-sink continuously dropped %zu bytes", u-
> >bytes_dropped);
> u->bytes_dropped = 0;
> }
>
> if (u->bytes_dropped == 0 && dropped != 0)
> pa_log_debug("Pipe-sink just dropped %zu bytes", dropped);
>
> u->bytes_dropped += dropped;
>
Silly me. Thank you for the suggestion.
regards, Samo
More information about the pulseaudio-discuss
mailing list