[alsa-devel] dmix, snd_pcm_drain(), SND_PCM_NONBLOCK - bug?
    Takashi Iwai 
    tiwai at suse.de
       
    Mon Mar 20 08:38:12 CET 2017
    
    
  
On Thu, 16 Mar 2017 13:23:36 +0100,
Max Kellermann wrote:
> 
> Hi,
> 
> I have received a bug report for the Music Player Daemon which
> complains about a freezing MPD process, after I switched MPD's ALSA
> output to non-blocking mode:
> 
>  https://bugs.musicpd.org/view.php?id=4662
> 
> This happens when snd_pcm_drain() is used on a dmix PCM which is in
> SND_PCM_NONBLOCK mode.  snd_pcm_drain() will be called repeatedly,
> because ALSA's file descriptor is always ready.
> 
> According to my research, the bug is in __snd_pcm_dmix_drain().  This
> function always returns -EAGAIN when SND_PCM_NONBLOCK is set:
> 
>   if (pcm->mode & SND_PCM_NONBLOCK)
>         return -EAGAIN;
> 
> This comes very early in the function, before any other relevant
> checks.  It can never finish that way, and calling it again at any
> time will never do anything.  Thus, snd_pcm_drain() appears to be
> broken in non-blocking mode.
> 
> Or am I misunderstanding how snd_pcm_drain() is supposed to be used in
> non-blocking mode?
Yeah, the code is obviously wrong.  And it seems that now Jaroslav
already fixed the issue in git repo.  Please give it a try.
thanks,
Takashi
    
    
More information about the Alsa-devel
mailing list