[alsa-devel] [PATCH] Echoaudio, fix Guru Meditation #00000005.48454C50

Takashi Iwai tiwai at suse.de
Wed Feb 17 14:50:33 CET 2010


At Wed, 17 Feb 2010 00:57:44 +0100,
Giuliano Pochini wrote:
> 
> (resend: I mistyped the list address)
> 
> There is a small window between the hw_params() callback and when
> runtime->frame_bits is set by ALSA middle layer. When another substream is
> already running, if an interrupt is delivered during that window the irq
> handler calls pcm_pointer() which does a division by zero. The patch below
> makes the irq handler skip substreams that are initialized but not started
> yet. Cc to Clemens Ladisch because he proposed an alternate fix.
> 
> For more information, please read the original thread in the linux-kernel
> mailing list: http://lkml.org/lkml/2010/2/2/187
> 
> 
> Short description: This patch fixes a division by zero error in the irq handler.
> 
> 
> Signed-off-by: Giuliano Pochini <pochini at shiny.it>

Applied now.  Thanks.


Takashi

> --- alsa-driver-1.0.22.1/alsa-kernel/pci/echoaudio/echoaudio.c__orig	2010-02-16 22:21:36.000000000 +0100
> +++ alsa-driver-1.0.22.1/alsa-kernel/pci/echoaudio/echoaudio.c	2010-02-16 22:21:45.000000000 +0100
> @@ -1864,7 +1864,9 @@ static irqreturn_t snd_echo_interrupt(in
>  	/* The hardware doesn't tell us which substream caused the irq,
>  	thus we have to check all running substreams. */
>  	for (ss = 0; ss < DSP_MAXPIPES; ss++) {
> -		if ((substream = chip->substream[ss])) {
> +		substream = chip->substream[ss];
> +		if (substream && ((struct audiopipe *)substream->runtime->
> +				private_data)->state == PIPE_STATE_STARTED) {
>  			period = pcm_pointer(substream) /
>  				substream->runtime->period_size;
>  			if (period != chip->last_period[ss]) {
> 
> 
> -- 
> Giuliano.
> 


More information about the Alsa-devel mailing list