[alsa-devel] snd_pcm_drain() and O_NONBLOCK

Jon Smirl jonsmirl at gmail.com
Sun Aug 16 16:20:23 CEST 2009

I'm trying to fix brutefir to properly drain the driver before exiting.

This sequence does not work on a running stream.  snd_pcm_nonblock()
removes the O_NONBLOCK flag from the file handle but the change does
not get copied to stream->f_flags. snd_pcm_drain() returns -EAGAIN
since the flags have not be copied.

	    snd_pcm_nonblock(handles[IO][n], 0);
	    snd_pcm_nonblock(handles[IO][n], SND_PCM_NONBLOCK);

static int snd_pcm_pre_drain_init(struct snd_pcm_substream *substream,
int state)
	printk("snd_pcm_pre_drain_init flags %x\n", substream->f_flags);
	if (substream->f_flags & O_NONBLOCK)
		return -EAGAIN;
	printk("snd_pcm_pre_drain_init 1\n");
	substream->runtime->trigger_master = substream;
	return 0;

Searching through the ALSA code the only way f_flags gets copied from
the file handle to the stream handle is via snd_pcm_prepare(). But I
can't do a snd_pcm_prepare() on a running stream. I can't find any way
to change the NONBLOCK status on a running stream.

I also tried implementing the wait for drain the the user app.
snd_pcm_drain() always returns -EAGAIN of O_NONBLOCK is set. It can't
be used to poll for the drain status.

So how do I wait for a stream to drain?

Jon Smirl
jonsmirl at gmail.com

More information about the Alsa-devel mailing list