[alsa-devel] hw_ptr_interrupt removal broke interrupt pointer updates

Colin Guthrie gmane at colin.guthr.ie
Mon Feb 1 16:33:24 CET 2010


'Twas brillig, and Jaroslav Kysela at 27/01/10 17:21 did gyre and gimble:
> 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

FWIW, this patch seems to have finally solved:
https://qa.mandriva.com/show_bug.cgi?id=57010

which we used to track this issue.

Had two users confirm it as fixed which is good enough for me :)

Take care and thanks.

Col


-- 

Colin Guthrie
gmane(at)colin.guthr.ie
http://colin.guthr.ie/

Day Job:
  Tribalogic Limited [http://www.tribalogic.net/]
Open Source:
  Mandriva Linux Contributor [http://www.mandriva.com/]
  PulseAudio Hacker [http://www.pulseaudio.org/]
  Trac Hacker [http://trac.edgewall.org/]



More information about the Alsa-devel mailing list