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

Georg Chini georg at chini.tk
Fri Feb 16 12:58:33 UTC 2018


On 16.02.2018 13:20, Georg Chini wrote:
> On 16.02.2018 12:35, Raman Shishniou wrote:
>> 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.
>
> To me it looks like all relevant platforms set POLLHUP
> (and maybe additionally POLLIN). So I would be fine with
> a POLLHUP check, but if you think you have to take the
> other platforms into account, I don't mind.
>
>>
>>
>>>     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 don't think so. Basically, what is done by the pseudo-code above
> is to wait one latency and only then start reading. So you can specify
> whatever latency you like, as long as the writer (not the pipe itself) is
> able to buffer the data.
Just to make it clear - I am fine with keeping a fixed latency (what the
pipe can buffer). It was only an idea. Maybe it is not good to rely on the
writer to buffer data.


More information about the pulseaudio-discuss mailing list