On 2014-10-19 12:57, Tanu Kaskinen wrote:
On Thu, 2014-10-02 at 15:58 +0200, David Henningsson wrote:
The drain speed increase done a while ago, only worked when directly connected
to ALSA sinks. Playing through an module-virtual-sink would cause slower drains.
What about other virtual sinks? Shouldn't the same fix be applied to
those too?
Yes, but let's start with the simplest case first.
This fix has two parts:
1) We now refuse to process handed out silence. This has the effect
that it tells ALSAs sink input that we're draining, and that we want to
s/ALSAs sink input/the ALSA sink/ ?
Both, module-virtual-sink has an "alsa sink input" which in turn tells
the alsa sink.
be woken up exactly at this sample based point in time.
2) When we're being called to process input underruns, we know this has
happened, so we can just forward the call up the sink chain to get
to protocol-native, which can acknowledge that the drain has completed.
This fix is incomplete, because if more than one sink input is playing back
into the sink, only the last one will be drained in time. But it's better
than nothing.
A comment about this shortcoming in the code would be good.
Ok.
Signed-off-by: David Henningsson <[email protected]>
---
Happy for testing of this patch - Ubuntu runs HDA-intel with 64K buffers
instead of the 2M that
some distros use, so I'm not seeing that much difference that you do anyway.
The buffer size can be changed at runtime:
echo 2048 > /proc/asound/card0/pcm0p/sub0/prealloc
Right, I keep forgetting about that.
Also, when I was testing, I also noticed a bigger startup latency when playing
back through a virtual sink. This is nothing I have looked deeper at.
src/modules/module-virtual-sink.c | 22 ++++++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/src/modules/module-virtual-sink.c
b/src/modules/module-virtual-sink.c
index 66fd8a9..c1e5969 100644
--- a/src/modules/module-virtual-sink.c
+++ b/src/modules/module-virtual-sink.c
@@ -216,6 +216,10 @@ static int sink_input_pop_cb(pa_sink_input *i, size_t
nbytes, pa_memchunk *chunk
pa_memchunk nchunk;
pa_sink_render(u->sink, nbytes, &nchunk);
+ if (nchunk.memblock == u->sink->silence.memblock) {
+ pa_memblock_unref(nchunk.memblock);
+ return -1;
+ }
I think this needs a comment explaining what it implies if
pa_sink_render() returns silence and why it makes sense to return -1 in
that case.
Ok.
--
David Henningsson, Canonical Ltd.
https://launchpad.net/~diwic
_______________________________________________
pulseaudio-discuss mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/pulseaudio-discuss