pcm: direct: Fix deadlock in poll_descriptors

The recent change in PCM direct plugins to check XRUN in
poll_descriptors callback caused a regression; as consequence, the
whole playback hangs up.

The culprit is a mutex dead lock by the call in snd_pcm_state() inside
the new snd_pcm_direct_poll_descriptors().  The poll_descriptors code
path is protected with pcm mutex, thus an unlocked version
(__snd_pcm_state()) has to be used inside the callback instead.

Fixes: 789ee39727 ("pcm: direct: check state before enter poll on timer")
Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
Takashi Iwai 2017-01-16 16:21:52 +01:00
parent 360c976aaa
commit 24e63b7527

View file

@ -676,7 +676,8 @@ int snd_pcm_direct_poll_descriptors(snd_pcm_t *pcm, struct pollfd *pfds,
} }
/* this will also evaluate slave state and enter xrun if necessary */ /* this will also evaluate slave state and enter xrun if necessary */
switch (snd_pcm_state(pcm)) { /* using __snd_pcm_state() since this function is called inside lock */
switch (__snd_pcm_state(pcm)) {
case SND_PCM_STATE_XRUN: case SND_PCM_STATE_XRUN:
return -EPIPE; return -EPIPE;
default: default: