[alsa-devel] Difference between boundary and buffer_size

Lars-Peter Clausen lars at metafoo.de
Thu Nov 3 17:45:15 CET 2016


On 11/03/2016 10:11 AM, Alan Young wrote:
> The code in the kernel, in /pcm_lib.c/ and /pcm_native.c/, uses fields
> buffer_size and boundary in struct snd_pcm_runtime. As far as I can see,
> there are always initialized to the same value. In what circumstance might
> they be different? There is clearly some relationship to hw_ptr_base, as
> illustrated by this repeated snipped from snd_pcm_update_hw_ptr0()
> 
>         hw_base += runtime->buffer_size;
>         if (hw_base >= runtime->boundary) {
>             hw_base = 0;
>             crossed_boundary++;
>         }
>         new_hw_ptr = hw_base + pos;

boundary is actually set to the largest possible power-of-two multiple of
buffer_size. This is done so that the hw_ptr that is reported to userspace
is continuously increasing (up to boundary) and does not wrap around after
just one buffer_size has elapsed. This is done so you can measure the
distance between two hw_ptr that were captured at different points in time,
but are more than half a buffer_size away from each other.



More information about the Alsa-devel mailing list