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.
_______________________________________________
pulseaudio-discuss mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/pulseaudio-discuss