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 <[email protected]>
> Reported-and-tested-by: Torstein Hegge <[email protected]>
> Reported-and-tested-by: Yves G <[email protected]>
> Cc: [email protected]
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/alsa-user