[alsa-devel] PCM states and snd_pcm_drain()
Alan Horstmann
gineera at aspect135.co.uk
Tue May 22 10:22:56 CEST 2012
On Monday 21 May 2012 11:10, you wrote:
> At Sun, 20 May 2012 18:25:30 +0100,
>
> Alan Horstmann wrote:
> > Can snd_pcm_drain() be safely called on a non-running stream -
> > particularly one in SND_PCM_STATE_XRUN? I can demonstrate lock-ups (on
> > rather old Alsa versions, though) when _drain is called on a stream in
> > Xrun but it does seem to vary between hardwares.
>
> Hm, that's odd. At least there should be no lock up in the core code.
> Are you running the recent kernel?
Oh certainly not - sorry, I hadn't intended this post to be interpreted as a
bug report, since I'm evaluating issues that arise (with Portaudio, again) on
Alsa versions back to 1.0.12! This showed up on the older ones. I haven't
precisely tracked it down since it is easy (and necessary) to work around.
> > However, the docs at:
> >
> > http://www.alsa-project.org/alsa-doc/alsa-lib/pcm.html
> >
> > suggest that it should be fine.
>
> The snd_pcm_drop() calls simply ignore streams other than RUNNING,
> PREPARE and PAUSED. So, it's basically safe.
Thanks, that is what I had wanted to check - it is expected to be handled OK.
> OTOH, it'd be better to drop XRUN streams to SETUP after this call,
> and there should be sane state checks at the beginning.
> I committed the patch below to my tree now.
>
Just one comment below
> ---
> From: Takashi Iwai <tiwai at suse.de>
> Subject: [PATCH] ALSA: pcm - Add proper state checks to snd_pcm_drain()
>
> The handling for some PCM states is missing for snd_pcm_drain().
> At least, XRUN streams should be simply dropped to SETUP, and a few
> initial invalid states should be rejected.
>
> Signed-off-by: Takashi Iwai <tiwai at suse.de>
> ---
> sound/core/pcm_native.c | 12 +++++++++++-
> 1 file changed, 11 insertions(+), 1 deletion(-)
>
> diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c
> index 3fe99e6..53b5ada 100644
> --- a/sound/core/pcm_native.c
> +++ b/sound/core/pcm_native.c
> @@ -1360,7 +1360,14 @@ static int snd_pcm_prepare(struct snd_pcm_substream
> *substream,
>
> static int snd_pcm_pre_drain_init(struct snd_pcm_substream *substream, int
> state) {
> - substream->runtime->trigger_master = substream;
> + struct snd_pcm_runtime *runtime = substream->runtime;
> + switch (runtime->status->state) {
> + case SNDRV_PCM_STATE_OPEN:
> + case SNDRV_PCM_STATE_DISCONNECTED:
> + case SNDRV_PCM_STATE_SUSPENDED:
> + return -EBADFD;
I noticed the check for SNDRV_PCM_STATE_OPEN is already in the main
snd_pcm_drain() function further down; is it better to add the others there?
Thanks for your assistance.
Alan
More information about the Alsa-devel
mailing list