[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