snd_pcm_drain() and O_NONBLOCK

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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_drain(handles[IO][n]);
	    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@xxxxxxxxx
_______________________________________________
Alsa-devel mailing list
Alsa-devel@xxxxxxxxxxxxxxxx
http://mailman.alsa-project.org/mailman/listinfo/alsa-devel

[Index of Archives]     [ALSA User]     [Linux Audio Users]     [Kernel Archive]     [Asterisk PBX]     [Photo Sharing]     [Linux Sound]     [Video 4 Linux]     [Gimp]     [Yosemite News]

  Powered by Linux