From: Takashi Iwai <tiwai@suse.de>
To: twischer@de.adit-jv.com
Cc: alsa-devel@alsa-project.org
Subject: Re: [PATCH - IOPLUG DRAIN 0/2]
Date: Thu, 22 Mar 2018 15:28:35 +0100 [thread overview]
Message-ID: <s5hr2ocp4ks.wl-tiwai@suse.de> (raw)
In-Reply-To: <1521726537-7651-1-git-send-email-twischer@de.adit-jv.com>
On Thu, 22 Mar 2018 14:48:55 +0100,
<twischer@de.adit-jv.com> wrote:
>
>
> Hi Takashi,
>
> > Why not poll()?
>
> > IOW, why ioplug must be handled specially regarding the non-blocking
> >operation? The normal kernel driver behaves like that (returning
> > -EAGAIN, and let apps to sync with poll()).
>
>
> What do you think about the following solution?
>
> (I thought the whole time that you have to use snd_pcm_wait() to wait for drain
> in nonblocking mode but you have to use the poll_descriptors directly.)
>
> Know I am expecting that the user is calling poll()
> if snd_pcm_drain() returns -EAGAIN and
> the user has to call snd_pcm_drain() again after poll returns
> to check if drain is done.
Well, the drain callback *should* block and wait until drained. That
was the intention of the callback.
What I suggested instead is that ioctl shouldn't call drain callback
in non-blocking mode, but it should return -EAGAIN there.
That said, a change like below. And in the plugin side, it can assume
the blocking mode and simply waits until drained.
thanks,
Takashi
---
diff --git a/src/pcm/pcm_ioplug.c b/src/pcm/pcm_ioplug.c
index 8c0ed4836365..33f7c5c27b6f 100644
--- a/src/pcm/pcm_ioplug.c
+++ b/src/pcm/pcm_ioplug.c
@@ -494,12 +494,37 @@ static int snd_pcm_ioplug_drain(snd_pcm_t *pcm)
ioplug_priv_t *io = pcm->private_data;
int err;
- if (io->data->state == SND_PCM_STATE_OPEN)
+ switch (io->data->state) {
+ case SND_PCM_STATE_OPEN:
+ case SND_PCM_STATE_DISCONNECTED:
+ case SND_PCM_STATE_SUSPENDED:
return -EBADFD;
+ case SND_PCM_STATE_PREPARED:
+ if (pcm->stream == SND_PCM_STREAM_PLAYBACK) {
+ snd_pcm_lock(pcm);
+ err = snd_pcm_ioplug_start(pcm);
+ snd_pcm_unlock(pcm);
+ if (err < 0)
+ return err;
+ io->data->state = SND_PCM_STATE_DRAINING;
+ }
+ break;
+ case SND_PCM_STATE_RUNNING:
+ io->data->state = SND_PCM_STATE_DRAINING;
+ break;
+ }
+
+ if (io->data->state == SND_PCM_STATE_DRAINING) {
+ if (io->data->nonblock)
+ return -EAGAIN;
+
+ if (io->data->callback->drain) {
+ err = io->data->callback->drain(io->data);
+ if (err < 0)
+ return err;
+ }
+ }
- io->data->state = SND_PCM_STATE_DRAINING;
- if (io->data->callback->drain)
- io->data->callback->drain(io->data);
snd_pcm_lock(pcm);
err = snd_pcm_ioplug_drop(pcm);
snd_pcm_unlock(pcm);
next prev parent reply other threads:[~2018-03-22 14:28 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-03-22 13:48 [PATCH - IOPLUG DRAIN 0/2] twischer
2018-03-22 13:48 ` [PATCH - IOPLUG DRAIN 1/1] ioplug: drain: Wait with pollwhen EAGAIN in blocking mode twischer
2018-03-22 13:48 ` [PATCH - IOPLUG DRAIN 1/1] jack: Support snd_pcm_drain() twischer
2018-03-22 14:28 ` Takashi Iwai [this message]
2018-03-22 14:50 ` [PATCH - IOPLUG DRAIN 0/2] Wischer, Timo (ADITG/ESB)
2018-03-22 14:55 ` Takashi Iwai
2018-03-22 15:17 ` Wischer, Timo (ADITG/ESB)
2018-03-22 16:22 ` Takashi Iwai
2018-03-23 7:23 ` Wischer, Timo (ADITG/ESB)
2018-03-23 7:28 ` Takashi Iwai
2018-03-23 7:43 ` Wischer, Timo (ADITG/ESB)
2018-03-23 8:01 ` Takashi Iwai
2018-03-23 8:08 ` Takashi Iwai
2018-03-23 9:03 ` Takashi Iwai
2018-03-28 8:42 ` Wischer, Timo (ADITG/ESB)
2018-03-28 16:09 ` Takashi Iwai
2018-03-29 6:39 ` Wischer, Timo (ADITG/ESB)
2018-03-29 7:25 ` Takashi Iwai
2018-03-29 7:38 ` Wischer, Timo (ADITG/ESB)
2018-03-23 8:21 ` Wischer, Timo (ADITG/ESB)
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=s5hr2ocp4ks.wl-tiwai@suse.de \
--to=tiwai@suse.de \
--cc=alsa-devel@alsa-project.org \
--cc=twischer@de.adit-jv.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.