[pulseaudio-discuss] [PATCH v6 1/2] pipe-source: generate silence when no writers connected

Raman Shishniou rommer at ibuffed.com
Fri Feb 16 11:35:37 UTC 2018


On 02/16/2018 12:00 PM, Georg Chini wrote:
> On 14.02.2018 23:16, Raman Shyshniou wrote:
>> Currently the pipe-source does not produce any data if no
>> writer is connected. This patch enable silence generator
>> when last writer closed pipe. It will stop automatically
>> when any data appears.
>> ---
> After my fixes to module-null-source, I think your logic is not yet
> completely correct. I would propose to do it like that:
> 
> In source_process_msg():
> 
>           case PA_SOURCE_MESSAGE_GET_LATENCY:
>                current_latency = now - time stamp
>                if (u->corkfd < 0)
>                    current_latency += data in pipe
> 
>           case PA_SOURCE_MESSAGE_SET_STATE:
>                if (SUSPENDED or INIT -> IDLE || SUSPENDED or INIT -> RUNNING) {
>                    get time stamp
>                    u->starting = true
>                }
> 
> In thread_func():
> 
> close u->corkfd
> u->corkfd = -1
> u->starting = true
> 
> timer_elapsed = false
> revents = 0
> get time stamp
> 
> for (;;) {
>     if (source is open) {
> 
>         /* We have to wait at least one configured source latency before starting
>          * to read data */
>         if (revents & POLLIN && !u->starting) {
>             read data from pipe
>             if (u->corkfd >=0) {
>                 close corkfd
>                 u->corkfd = -1
>            }
> 
>         } else if (timer_elapsed && u->corkfd > 0)
>             generate silence
> 
>        if (data was read/generated) {
>             post data
>             time stamp += data written
>        }
> 
>        set timer absolute time stamp + configured (or fixed) source latency
>    } else
>        set timer disabled
> 
>    run rtpoll
>    get timer_elapsed
> 
>     if (u->starting && timer_elapsed)
>         u->starting = false
> 
>    if (revents & POLLHUP) {
>        open pipe for writing
>        u->corkfd = write file descriptor
>        revents = revents & ~POLLHUP
>    }
> 

Unfortunately not all platforms generate POLLHUP when writer closed a pipe:
Moreover, some platforms generate POLLIN with or without POLLHUP
https://www.greenend.org.uk/rjk/tech/poll.html

So, the only correct way is try to read EOF (0) from pipe when POLLIN or POLLHUP in revents.


>    error check
> }
> 
> You can also add a source_update_requested_latency_cb() like
> in module-null-source and pass  PA_SOURCE_DYNAMIC_LATENCY
> to pa_source_new() to make the latency configurable.

The pipe-source can change latency only when it generating a silence.

> 
> I hope I did not forget anything ...


More information about the pulseaudio-discuss mailing list