linux-media.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Frank Schäfer" <fschaefer.oss@googlemail.com>
To: m.chehab@samsung.com
Cc: Linux Media Mailing List <linux-media@vger.kernel.org>
Subject: Re: [RFT PATCH] em28xx-audio: don't overwrite the usb alt setting made by the video part
Date: Wed, 15 Jan 2014 22:36:25 +0100	[thread overview]
Message-ID: <52D6FF59.6010407@googlemail.com> (raw)
In-Reply-To: <1389821502-11346-1-git-send-email-fschaefer.oss@googlemail.com>

Am 15.01.2014 22:31, schrieb Frank Schäfer:
> em28xx-audio currently switches to usb alternate setting #7 in case of a mixed
> interface. This may overwrite the setting made by the video part and break video
> streaming.
> As far as we know, there is no difference between the alt settings with regards
> to the audio endpoint if the interface is a mixed interface, the audio part only
> has to make sure that alt is > 0, which is fortunately only the case when video
> streaming is off.
>
> Signed-off-by: Frank Schäfer <fschaefer.oss@googlemail.com>
> ---
>  drivers/media/usb/em28xx/em28xx-audio.c |   41 ++++++++++++-------------------
>  1 Datei geändert, 16 Zeilen hinzugefügt(+), 25 Zeilen entfernt(-)
>
> diff --git a/drivers/media/usb/em28xx/em28xx-audio.c b/drivers/media/usb/em28xx/em28xx-audio.c
> index 05e9bd1..2e7a3ad 100644
> --- a/drivers/media/usb/em28xx/em28xx-audio.c
> +++ b/drivers/media/usb/em28xx/em28xx-audio.c
> @@ -266,33 +266,30 @@ static int snd_em28xx_capture_open(struct snd_pcm_substream *substream)
>  	dprintk("opening device and trying to acquire exclusive lock\n");
>  
>  	runtime->hw = snd_em28xx_hw_capture;
> -	if ((dev->alt == 0 || dev->is_audio_only) && dev->adev.users == 0) {
> -		int nonblock = !!(substream->f_flags & O_NONBLOCK);
>  
> +	if (dev->adev.users == 0) {
> +		int nonblock = !!(substream->f_flags & O_NONBLOCK);
>  		if (nonblock) {
>  			if (!mutex_trylock(&dev->lock))
>  				return -EAGAIN;
>  		} else
>  			mutex_lock(&dev->lock);
> -		if (dev->is_audio_only)
> -			/* vendor audio is on a separate interface */
> +
> +		/* Select initial alternate setting (if necessary) */
> +		if (dev->alt == 0) {
>  			dev->alt = 1;
> -		else
> -			/* vendor audio is on the same interface as video */
> -			dev->alt = 7;
>  			/*
> -			 * FIXME: The intention seems to be to select the alt
> -			 * setting with the largest wMaxPacketSize for the video
> -			 * endpoint.
> -			 * At least dev->alt should be used instead, but we
> -			 * should probably not touch it at all if it is
> -			 * already >0, because wMaxPacketSize of the audio
> -			 * endpoints seems to be the same for all.
> +			 * NOTE: in case of a mixed (audio+video) interface, we
> +			 * don't want to touch the alt setting made by the video
> +			 * part. There is no difference between the alt settings
> +			 * with regards to the audio endpoint.
> +			 * TODO: in case of a pure audio interface, this could
> +			 * be improved. The alt settings are different here.
>  			 */
> -
> -		dprintk("changing alternate number on interface %d to %d\n",
> -			dev->ifnum, dev->alt);
> -		usb_set_interface(dev->udev, dev->ifnum, dev->alt);
> +			dprintk("changing alternate number on interface %d to %d\n",
> +				dev->ifnum, dev->alt);
> +			usb_set_interface(dev->udev, dev->ifnum, dev->alt);
> +		}
>  
>  		/* Sets volume, mute, etc */
>  		dev->mute = 0;
> @@ -740,15 +737,9 @@ static int em28xx_audio_urb_init(struct em28xx *dev)
>  	struct usb_endpoint_descriptor *e, *ep = NULL;
>  	int                 i, ep_size, interval, num_urb, npackets;
>  	int		    urb_size, bytes_per_transfer;
> -	u8 alt;
> -
> -	if (dev->ifnum)
> -		alt = 1;
> -	else
> -		alt = 7;
> +	u8 alt = 1;
>  
>  	intf = usb_ifnum_to_if(dev->udev, dev->ifnum);
> -
>  	if (intf->num_altsetting <= alt) {
>  		em28xx_errdev("alt %d doesn't exist on interface %d\n",
>  			      dev->ifnum, alt);

Please note that this is actually just a minor fix.
What's really evil with the current alternate setting code is that the
video part may switch the alt setting while audio streaming is in progress.
I'm not sure how to fix this. Maybe we shouldn't start audio streaming
before video streaming.



  reply	other threads:[~2014-01-15 21:35 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-01-15 21:31 [RFT PATCH] em28xx-audio: don't overwrite the usb alt setting made by the video part Frank Schäfer
2014-01-15 21:36 ` Frank Schäfer [this message]
2014-01-15 23:11   ` Mauro Carvalho Chehab
2014-01-17 17:08     ` Frank Schäfer

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=52D6FF59.6010407@googlemail.com \
    --to=fschaefer.oss@googlemail.com \
    --cc=linux-media@vger.kernel.org \
    --cc=m.chehab@samsung.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).