Re: [Alsa-user] [PATCH] ALSA: snd-usb: try harder to find USB_DT_CS_ENDPOINT
Brought to you by:
perex
From: Takashi I. <ti...@su...> - 2013-04-25 06:14:44
|
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 <zo...@gm...> > Reported-and-tested-by: Torstein Hegge <he...@re...> > Reported-and-tested-by: Yves G <als...@vi...> > Cc: st...@ke... 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 > |