[alsa-devel] hw_ptr_interrupt removal broke interrupt pointer updates
Jaroslav Kysela
perex at perex.cz
Wed Jan 27 18:21:10 CET 2010
On Wed, 27 Jan 2010, Clemens Ladisch wrote:
> Jaroslav Kysela wrote:
>> On Wed, 27 Jan 2010, Clemens Ladisch wrote:
>>> A somewhat unrelated issue: Both old and new code assume that
>>> hw_ptr==0 is a period boundary, but that is not true if the boundary
>>> is not an integer multiple of the period size, and the pointer wraps.
>>> I'm not sure what happens then.
>>
>> I'm not exactly sure what you're talking about. Where is the
>> hw_ptr==0 assumption?
>
> This code, which tries to align hw_ptr_interrupt to a period boundary:
>
> runtime->hw_ptr_interrupt = new_hw_ptr -
> (new_hw_ptr % runtime->period_size);
I see. It is really problem, because if hw_ptr_interrupt shifts, then the
condition
delta = runtime->hw_ptr_interrupt + runtime->period_size;
if (delta > new_hw_ptr) {
is not accurate and might cause unwanted issues.
The simple fix for 64-bit archs is to use "boundary = buffer_size *
period_size" expression to setup the boundary variable properly.
I added code to find the lowest common multiple for 32-bit archs.
The patch is:
http://git.alsa-project.org/?p=alsa-kernel.git;a=commitdiff;h=7910b4a1db63fefc3d291853d33c34c5b6352e8e
Thanks,
Jaroslav
-----
Jaroslav Kysela <perex at perex.cz>
Linux Kernel Sound Maintainer
ALSA Project, Red Hat, Inc.
More information about the Alsa-devel
mailing list