missing sound on kernel-5.15

chihhao chen chihhao.chen at mediatek.com
Thu Sep 1 12:06:25 CEST 2022


Hi Takashi,

I tested the patch and USB audio function works well.
(Start and stop playback more than 20 times with Samsung USB C
Earphone)

Thanks

On Thu, 2022-09-01 at 10:28 +0200, Takashi Iwai wrote:
> On Thu, 01 Sep 2022 09:51:37 +0200,
> Takashi Iwai wrote:
> > 
> > On Thu, 01 Sep 2022 07:50:40 +0200,
> > chihhao chen wrote:
> > > 
> > > Hi Takashi,
> > > 
> > > The patch fixes this problem.
> > > I tried it with "Product: Samsung USB C Earphone" and missing
> > > sound
> > > problem cannot be reproduced.
> > 
> > OK, it's a good news.  I'm going to add more information to the
> > patch
> > description about the regression and submit the patch.
> 
> Could you check whether the below cleanup patch on top of the
> previous
> one doesn't break things?  I lightly tested on my devices and don't
> believe it would change the actual behavior, but just to be sure.
> 
> 
> Takashi
> 
> -- 8< --
> From: Takashi Iwai <tiwai at suse.de>
> Subject: [PATCH] ALSA: usb-audio: Clean up endpoint setups at PCM
> prepare
> 
> This patch cleans up the superfluous checks and calls for setting up
> the endpoints at PCM prepare callback:
> 
> - Drop stop_endpoints() and sync_pending_stops() calls; the stream is
>   guaranteed to have been already stopped and synced at each PCM
>   prepare call by ALSA PCM core
> 
> - Call snd_usb_endpoint_prepare() unconditionally;
>   the check for endpoint->need_setup is done in
>   snd_pcm_hw_endpoint_prepare() itself
> 
> - Apply snd_usb_set_format_quirk() only when the endpoint is actually
>   set up (i.e. the return code from snd_usb_endpoint_prepare() > 0)
> 
> - Move a few lines back into snd_usb_pcm_prepare();
>   it's even easier to follow than a small useless function
> 
> Signed-off-by: Takashi Iwai <tiwai at suse.de>
> ---
>  sound/usb/pcm.c | 40 ++++++++++------------------------------
>  1 file changed, 10 insertions(+), 30 deletions(-)
> 
> diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c
> index b604f7e95e82..4ed53a3dc922 100644
> --- a/sound/usb/pcm.c
> +++ b/sound/usb/pcm.c
> @@ -433,35 +433,6 @@ static void close_endpoints(struct snd_usb_audio
> *chip,
>  	}
>  }
>  
> -static int configure_endpoints(struct snd_usb_audio *chip,
> -			       struct snd_usb_substream *subs)
> -{
> -	int err;
> -
> -	if (subs->data_endpoint->need_setup) {
> -		/* stop any running stream beforehand */
> -		if (stop_endpoints(subs, false))
> -			sync_pending_stops(subs);
> -		if (subs->sync_endpoint) {
> -			err = snd_usb_endpoint_prepare(chip, subs-
> >sync_endpoint);
> -			if (err < 0)
> -				return err;
> -		}
> -		err = snd_usb_endpoint_prepare(chip, subs-
> >data_endpoint);
> -		if (err < 0)
> -			return err;
> -		snd_usb_set_format_quirk(subs, subs->cur_audiofmt);
> -	} else {
> -		if (subs->sync_endpoint) {
> -			err = snd_usb_endpoint_prepare(chip, subs-
> >sync_endpoint);
> -			if (err < 0)
> -				return err;
> -		}
> -	}
> -
> -	return 0;
> -}
> -
>  /*
>   * hw_params callback
>   *
> @@ -640,9 +611,18 @@ static int snd_usb_pcm_prepare(struct
> snd_pcm_substream *substream)
>  		goto unlock;
>  	}
>  
> -	ret = configure_endpoints(chip, subs);
> +	if (subs->sync_endpoint) {
> +		ret = snd_usb_endpoint_prepare(chip, subs-
> >sync_endpoint);
> +		if (ret < 0)
> +			goto unlock;
> +	}
> +
> +	ret = snd_usb_endpoint_prepare(chip, subs->data_endpoint);
>  	if (ret < 0)
>  		goto unlock;
> +	else if (ret > 0)
> +		snd_usb_set_format_quirk(subs, subs->cur_audiofmt);
> +	ret = 0;
>  
>  	/* reset the pointer */
>  	subs->buffer_bytes = frames_to_bytes(runtime, runtime-
> >buffer_size);



More information about the Alsa-devel mailing list