[alsa-devel] Difference between boundary and buffer_size
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;
Alan.
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.
On 11/03/2016 05:45 PM, Lars-Peter Clausen wrote:
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.
And the pointer that is reported to userspace is called appl_ptr, sorry for the confusion.
Alan Young wrote:
there are always initialized to the same value.
No. Have a look into /proc/asound/cardX/pcm0p/sub0/hw_params.
In what circumstance might they be different?
Always.
The boundary value is an integer multiple of the buffer size. It's used to allow computing the difference of two pointer values even if that difference is larger than the buffers size.
Regards, Clemens
participants (3)
-
Alan Young
-
Clemens Ladisch
-
Lars-Peter Clausen