'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=7910b4a1db63fe...
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