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...
Thanks, Jaroslav
----- Jaroslav Kysela perex@perex.cz Linux Kernel Sound Maintainer ALSA Project, Red Hat, Inc.