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.