[pulseaudio-discuss] Merging soxr
Alexander E. Patrakov
patrakov at gmail.com
Tue Nov 18 08:32:53 PST 2014
18.11.2014 19:14, David Henningsson wrote:
>
>
> On 2014-11-18 14:46, Alexander E. Patrakov wrote:
>> Add support for libsoxr resampler: David's objection about overriding
>> pa_resampler_request is 100% valid, and the patchset cannot be merged
>> without taking it into account.
>
> Well, the result will be inoptimal rather than completely not working
> without a working pa_resampler_request (especially given that Andrey
> seems to be satisfied with the current behaviour). If we're given fewer
> samples back than we expected, we'll just go through another round of
> resampling/mixing/etc, which I assume is what happens here.
Well, now I have looked at the code in sink.c and sink-input.c, and I
must say that I don't like it. Namely, there are assertions in
fill_mix_info():
pa_assert(info->chunk.memblock);
pa_assert(info->chunk.length > 0);
At the very least, the first assertion should be moved up, because just
above them, in the conditional statement, info->chunk.memblock is passed
to pa_memblock_is_silence().
Also there are assertions in pa_sink_input_peek() that are very similar
in nature, and I don't see how it is guaranteed that the assertions
never fail.
So the devious sequence of events seems to be (assuming S16 stereo samples):
pa_sink_input_peek is called with slength == 8 or something like that.
pa_resampler_request() returns 8 or something like that.
i->pop(), when asked to provide 8 bytes, creates a memchunk (tchunk) of
this length.
pa_resampler_run() eats the full tchunk, but produces nothing (an empty
rchunk).
As rchunk is empty, nothing gets pushed onto render_memblockq.
Then pa_memblockq_peek() gets called, and it is asserted that the
returned chunk exists and is not empty. Which looks dubious, and I think
that we can try triggering this with a very-low-latency client
(unpatched wine or maybe qemu?).
So, incorrect results from pa_resampler_request() look dangerous when
the difference results in zero vs non-zero output samples from
pa_resampler_run().
Of course, all of the above is in no way specific to the soxr resampler.
An imprecise pa_resampler_request() is a bug. What bothers me is that
soxr has a higher chance to trigger this bug.
--
Alexander E. Patrakov
More information about the pulseaudio-discuss
mailing list