[alsa-devel] Is there a function I can call from my ISR to tell ALSA to abort playback?

Timur Tabi timur at freescale.com
Thu Nov 15 21:28:14 CET 2007


Takashi Iwai wrote:
> At Thu, 15 Nov 2007 09:00:54 -0600,
> Timur Tabi wrote:
>> Jaroslav Kysela wrote:
>>
>>> Yes, call snd_pcm_stop() function. The call must be protected with 
>>> snd_pcm_stream_lock... See to i2c/other/ak4117.c for an example.
>> That code calls snd_pcm_stop() from a timer, not an ISR.  Do I need the call to 
>> wake_up() as well?
> 
> snd_pcm_stop() can be called from ISR, too (e.g.
> snd_pcm_period_elapsed() may call snd_pcm_stop() when XRUN occurs).
> You only need to protect it via snd_pcm_stream_lock*().

It doesn't seem to do much.  Here's the function I wrote:

static void fsl_dma_abort_stream(struct snd_pcm_substream *substream)
{
	unsigned long flags;

	snd_pcm_stream_lock_irqsave(substream, flags);
	if (snd_pcm_running(substream)) {
		snd_pcm_stop(substream, SNDRV_PCM_STATE_DRAINING);
		wake_up(&substream->runtime->sleep);
	}
	snd_pcm_stream_unlock_irqrestore(substream, flags);
}

When I play a file, my DMA controller is incorrectly programmed (test case) and 
this function gets triggered.  The application (aplay) does not terminate.

I tried it with the wake_up() call, but it didn't make a difference.

-- 
Timur Tabi
Linux kernel developer at Freescale


More information about the Alsa-devel mailing list