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 > } > > 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. > > I hope I did not forget anything ... The incoming data can has a sample rate that differs from the system clock. For example, due to imperfect hardware oscillator. It's a bad idea to expect a data at the system clock rate. When the source is receiving a real data from pipe the timer should be disabled and u->timestamp and u->starting doesn't make sense.