[pulseaudio-discuss] [PATCH v6 1/2] pipe-source: generate silence when no writers connected
Georg Chini
georg at chini.tk
Fri Feb 16 09:00:33 UTC 2018
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 ...
More information about the pulseaudio-discuss
mailing list