[alsa-devel] [PATCH 1/2] [ALSA] add SNDRV_PCM_TRIGGER_DRAIN trigger

Takashi Iwai tiwai at suse.de
Thu Dec 18 09:29:37 CET 2014


At Thu, 18 Dec 2014 15:36:03 +0800,
libin.yang at intel.com wrote:
> 
> From: Libin Yang <libin.yang at intel.com>
> 
> Add SNDRV_PCM_TRIGGER_DRAIN trigger for pcm drain.
> 
> Some audio devices require notification of drain events
> in order to properly drain and shutdown an audio stream.
> 
> Signed-off-by: Libin Yang <libin.yang at intel.com>
> ---
>  include/sound/pcm.h     | 1 +
>  sound/core/pcm_native.c | 5 +++++
>  2 files changed, 6 insertions(+)
> 
> diff --git a/include/sound/pcm.h b/include/sound/pcm.h
> index 8bb00a2..bb77aa3 100644
> --- a/include/sound/pcm.h
> +++ b/include/sound/pcm.h
> @@ -109,6 +109,7 @@ struct snd_pcm_ops {
>  #define SNDRV_PCM_TRIGGER_PAUSE_RELEASE	4
>  #define SNDRV_PCM_TRIGGER_SUSPEND	5
>  #define SNDRV_PCM_TRIGGER_RESUME	6
> +#define SNDRV_PCM_TRIGGER_DRAIN		7
>  
>  #define SNDRV_PCM_POS_XRUN		((snd_pcm_uframes_t)-1)
>  
> diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c
> index 166d59c..15fe682 100644
> --- a/sound/core/pcm_native.c
> +++ b/sound/core/pcm_native.c
> @@ -1517,6 +1517,11 @@ static int snd_pcm_do_drain_init(struct snd_pcm_substream *substream, int state)
>  {
>  	struct snd_pcm_runtime *runtime = substream->runtime;
>  	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
> +
> +		if (substream->runtime->trigger_master == substream)
> +			substream->ops->trigger(substream,
> +					SNDRV_PCM_TRIGGER_DRAIN);

The return value check is missing.

Besides, this patch will break many drivers.  Many of them will spew
errors if an unexpected trigger command is issued.  So, you have to
limit this trigger only to some drivers.  A typical workaround is to
add a new SNDRV_PCM_INFO_* and issue the trigger only when the flag is
set, as done for resume and pause operations.

Also, do you want to see this trigger even if the stream isn't started
before drain is issued?  Also, why no need for this trigger for
capture streams?


(BTW, while looking at this patch, I found a bug in the current
 draining code.  Will submit the fix...)


Takashi


More information about the Alsa-devel mailing list