[alsa-devel] hw_ptr_interrupt removal broke interrupt pointer updates

Jaroslav Kysela perex at perex.cz
Tue Jan 26 17:16:19 CET 2010

On Tue, 26 Jan 2010, Clemens Ladisch wrote:

> Commit "cleanup & merge hw_ptr update functions" says:
>> The main change is hw_ptr_interrupt variable removal to simplify code
>> logic. This variable can be computed directly from hw_ptr.
> The hw_ptr_interrupt variable was needed to differentiate between the
> position at the last normal pointer update and the position of the last
> signaled period boundary.
> 	if (in_interrupt) {
> 		/* we know that one period was processed */
> 		/* delta = "expected next hw_ptr" for in_interrupt != 0 */
> 		delta = old_hw_ptr - (old_hw_ptr % runtime->period_size)
> 			+ runtime->period_size;
> 		if (delta > new_hw_ptr) {
> 			hw_base += runtime->buffer_size;
> It is possible for the status/delay ioctls to be called when the sound
> card's pointer register alreay shows a position at the beginning of the
> new period, but immediately before the interrupt is actually executed.
> (This happens regularly on a SMP machine with mplayer.)  When that
> happens, the code thinks that the position must be at least one period
> ahead of the current position and drops an entire buffer of data.

Clements, thank you for nice explanation how I was wrong. I returned 
hw_ptr_interrupt variable back. I am testing this patch now:


A review is always welcome. Thanks.


Jaroslav Kysela <perex at perex.cz>
Linux Kernel Sound Maintainer
ALSA Project, Red Hat, Inc.

More information about the Alsa-devel mailing list