[v2,1/4] ALSA: compress: Fix regression on compressed capture streams
diff mbox series

Message ID 20190722092436.651-1-ckeepax@opensource.cirrus.com
State New
Headers show
Series
  • [v2,1/4] ALSA: compress: Fix regression on compressed capture streams
Related show

Commit Message

Charles Keepax July 22, 2019, 9:24 a.m. UTC
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@opensource.cirrus.com>
---

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(-)

Comments

Vinod Koul July 22, 2019, 10:35 a.m. UTC | #1
On 22-07-19, 10:24, 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.

For the whole series:

Acked-by: Vinod Koul <vkoul@kernel.org>
Takashi Iwai July 23, 2019, 10:08 a.m. UTC | #2
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@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
> 
>

Patch
diff mbox series

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;