]> git.alsa-project.org Git - alsa-lib.git/commitdiff
abort snd_pcm_dmix_drain when state is SND_PCM_STATE_XRU
authorTakashi Iwai <tiwai@suse.de>
Mon, 21 Nov 2005 10:47:42 +0000 (10:47 +0000)
committerTakashi Iwai <tiwai@suse.de>
Mon, 21 Nov 2005 10:47:42 +0000 (10:47 +0000)
From: Sascha Sommer <saschasommer@freenet.de>

this is a fix for bug 0001559.
Unlike my first guesses the real problem is not in the kernel driver but in
alsa-lib. Whenever the current dmix status is xrun and snd_pcm_dmix_drain
gets called the process will hang forever in the poll function. The reason is
that poll gets called even though the timer already stopped.
As described in the bugtracking system this bug was not noticable with alsa
versions that used the old IOCTLS because the SNDRV_TIMER_IOCTL_STOP ioctl
never reached the timer kernel module.

Attached patch fixes this problem for alsa-lib 1.0.10 by simply calling
snd_pcm_dmix_drop when snd_pcm_dmix_drain gets called in the state
SND_PCM_STATE_XRUN.

src/pcm/pcm_dmix.c

index 1d27c09eec6363507536be8eb41e71ea58ba82ac..958df2c95f292fc538bbc205286e56394dd2dad8 100644 (file)
@@ -532,6 +532,12 @@ static int snd_pcm_dmix_drain(snd_pcm_t *pcm)
                        return 0;
                }
        }
+
+       if (dmix->state == SND_PCM_STATE_XRUN) {
+               snd_pcm_dmix_drop(pcm);
+               return 0;
+       }
+
        stop_threshold = pcm->stop_threshold;
        if (pcm->stop_threshold > pcm->buffer_size)
                pcm->stop_threshold = pcm->buffer_size;