[alsa-devel] [PATCH v2 1/4] ALSA: compress: Fix regression on compressed capture streams

Takashi Iwai tiwai at suse.de
Tue Jul 23 12:08:23 CEST 2019


On Mon, 22 Jul 2019 11:24:33 +0200,
Charles Keepax wrote:
> 
> A previous fix to the stop handling on compressed capture streams causes
> some knock on issues. The previous fix updated snd_compr_drain_notify to
> set the state back to PREPARED for capture streams. This causes some
> issues however as the handling for snd_compr_poll differs between the
> two states and some user-space applications were relying on the poll
> failing after the stream had been stopped.
> 
> To correct this regression whilst still fixing the original problem the
> patch was addressing, update the capture handling to skip the PREPARED
> state rather than skipping the SETUP state as it has done until now.
> 
> Fixes: 4f2ab5e1d13d ("ALSA: compress: Fix stop handling on compressed capture streams")
> Signed-off-by: Charles Keepax <ckeepax at opensource.cirrus.com>

Applied, thanks.


Takashi


> ---
> 
> No changes since v1.
> 
> Thanks,
> Charles
> 
>  include/sound/compress_driver.h |  5 +----
>  sound/core/compress_offload.c   | 16 +++++++++++-----
>  2 files changed, 12 insertions(+), 9 deletions(-)
> 
> diff --git a/include/sound/compress_driver.h b/include/sound/compress_driver.h
> index c5188ff724d12..bc88d6f964da9 100644
> --- a/include/sound/compress_driver.h
> +++ b/include/sound/compress_driver.h
> @@ -173,10 +173,7 @@ static inline void snd_compr_drain_notify(struct snd_compr_stream *stream)
>  	if (snd_BUG_ON(!stream))
>  		return;
>  
> -	if (stream->direction == SND_COMPRESS_PLAYBACK)
> -		stream->runtime->state = SNDRV_PCM_STATE_SETUP;
> -	else
> -		stream->runtime->state = SNDRV_PCM_STATE_PREPARED;
> +	stream->runtime->state = SNDRV_PCM_STATE_SETUP;
>  
>  	wake_up(&stream->runtime->sleep);
>  }
> diff --git a/sound/core/compress_offload.c b/sound/core/compress_offload.c
> index 99b8821587053..d79aee6b9edd2 100644
> --- a/sound/core/compress_offload.c
> +++ b/sound/core/compress_offload.c
> @@ -574,10 +574,7 @@ snd_compr_set_params(struct snd_compr_stream *stream, unsigned long arg)
>  		stream->metadata_set = false;
>  		stream->next_track = false;
>  
> -		if (stream->direction == SND_COMPRESS_PLAYBACK)
> -			stream->runtime->state = SNDRV_PCM_STATE_SETUP;
> -		else
> -			stream->runtime->state = SNDRV_PCM_STATE_PREPARED;
> +		stream->runtime->state = SNDRV_PCM_STATE_SETUP;
>  	} else {
>  		return -EPERM;
>  	}
> @@ -693,8 +690,17 @@ static int snd_compr_start(struct snd_compr_stream *stream)
>  {
>  	int retval;
>  
> -	if (stream->runtime->state != SNDRV_PCM_STATE_PREPARED)
> +	switch (stream->runtime->state) {
> +	case SNDRV_PCM_STATE_SETUP:
> +		if (stream->direction != SND_COMPRESS_CAPTURE)
> +			return -EPERM;
> +		break;
> +	case SNDRV_PCM_STATE_PREPARED:
> +		break;
> +	default:
>  		return -EPERM;
> +	}
> +
>  	retval = stream->ops->trigger(stream, SNDRV_PCM_TRIGGER_START);
>  	if (!retval)
>  		stream->runtime->state = SNDRV_PCM_STATE_RUNNING;
> -- 
> 2.11.0
> 
> 


More information about the Alsa-devel mailing list