[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