Re: hw_ptr_interrupt removal broke interrupt pointer updates

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxx>
Linux Kernel Sound Maintainer
ALSA Project, Red Hat, Inc.

_______________________________________________
Alsa-devel mailing list
Alsa-devel@xxxxxxxxxxxxxxxx
http://mailman.alsa-project.org/mailman/listinfo/alsa-devel

[Index of Archives]     [ALSA User]     [Linux Audio Users]     [Kernel Archive]     [Asterisk PBX]     [Photo Sharing]     [Linux Sound]     [Video 4 Linux]     [Gimp]     [Yosemite News]

  Powered by Linux