[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:

http://git.alsa-project.org/?p=alsa-kernel.git;a=commitdiff;h=04d64a69fcb9fd182d73d6f1a8de55b2f527a1de

A review is always welcome. 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