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.