At Wed, 24 Apr 2013 19:38:42 +0200,
Daniel Mack wrote:
> 
> The USB_DT_CS_ENDPOINT class-specific endpoint descriptor is usually
> stuffed directly after the standard USB endpoint descriptor, and this is
> where the driver currently expects it to be.
> 
> There are, however, devices in the wild that have it the other way
> around in their descriptor sets, so the USB_DT_CS_ENDPOINT comes
> *before* the standard enpoint. Devices known to implement it that way
> are "Sennheiser BTD-500" and Plantronics USB headsets.
> 
> When the driver can't find the USB_DT_CS_ENDPOINT, it won't be able to
> change sample rates, as the bitmask for the validity of this command is
> storen in bmAttributes of that descriptor.
> 
> Fix this by searching the entire interface instead of just the extra
> bytes of the first endpoint, in case the latter fails.
> 
> Signed-off-by: Daniel Mack <zon...@gmail.com>
> Reported-and-tested-by: Torstein Hegge <he...@resisty.net>
> Reported-and-tested-by: Yves G <alsa-u...@vivigatt.com>
> Cc: sta...@kernel.org

Applied.  Thanks.


Takashi


> ---
>  sound/usb/stream.c | 8 ++++++++
>  1 file changed, 8 insertions(+)
> 
> diff --git a/sound/usb/stream.c b/sound/usb/stream.c
> index 8951f77..7db2f89 100644
> --- a/sound/usb/stream.c
> +++ b/sound/usb/stream.c
> @@ -393,6 +393,14 @@ static int parse_uac_endpoint_attributes(struct 
> snd_usb_audio *chip,
>       if (!csep && altsd->bNumEndpoints >= 2)
>               csep = snd_usb_find_desc(alts->endpoint[1].extra, 
> alts->endpoint[1].extralen, NULL, USB_DT_CS_ENDPOINT);
>  
> +     /*
> +      * If we can't locate the USB_DT_CS_ENDPOINT descriptor in the extra
> +      * bytes after the first endpoint, go search the entire interface.
> +      * Some devices have it directly *before* the standard endpoint.
> +      */
> +     if (!csep)
> +             csep = snd_usb_find_desc(alts->extra, alts->extralen, NULL, 
> USB_DT_CS_ENDPOINT);
> +
>       if (!csep || csep->bLength < 7 ||
>           csep->bDescriptorSubtype != UAC_EP_GENERAL) {
>               snd_printk(KERN_WARNING "%d:%u:%d : no or invalid"
> -- 
> 1.8.1.4
> 

------------------------------------------------------------------------------
Try New Relic Now & We'll Send You this Cool Shirt
New Relic is the only SaaS-based application performance monitoring service 
that delivers powerful full stack analytics. Optimize and monitor your
browser, app, & servers with just a few lines of code. Try New Relic
and get this awesome Nerd Life shirt! http://p.sf.net/sfu/newrelic_d2d_apr
_______________________________________________
Alsa-user mailing list
Alsa-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/alsa-user

Reply via email to