[alsa-devel] Problem using alsa to implement an Android dock
Jeremy Rosen
jeremy.rosen at openwide.fr
Thu Jun 13 10:24:47 CEST 2013
Awesome, this works perfectly, thx a lot
tested-by: Jeremy Rosen <jeremy.rosen at openwide.fr>
Is there anything I need to do for the upstreaming ?
I will still open a bug on the android side, though...
Cordialement
Jérémy Rosen
fight key loggers : write some perl using vim
----- Mail original -----
> Jeremy Rosen wrote:
> > it didn't seem to work
>
> Because the important code uses 'interface', not 'iface'.
> Try this one:
>
>
> ALSA: usb-audio: work around Anroid accessory firmware bug
>
> When the Android firmware enables the audio interfaces in accessory
> mode, it always declares in the control interface's baInterfaceNr
> array
> that interfaces 0 and 1 belong to the audio function. However, the
> accessory interface itself, if also enabled, already is at index 0
> and
> shifts the actual audio interface numbers to 1 and 2, which prevents
> the
> PCM streaming interface from being seen by the host driver.
>
> To get the PCM interface interface to work, detect when the
> descriptors
> point to the (for this driver useless) accessory interface, and
> redirect
> to the correct one.
>
> Reported-by: Jeremy Rosen <jeremy.rosen at openwide.fr>
> Not-yet-tested-by: Jeremy Rosen <jeremy.rosen at openwide.fr>
> Cc: <stable at vger.kernel.org>
> Signed-off-by: Clemens Ladisch <clemens at ladisch.de>
> ---
> sound/usb/card.c | 22 ++++++++++++++++++++--
> 1 file changed, 20 insertions(+), 2 deletions(-)
>
> diff --git a/sound/usb/card.c b/sound/usb/card.c
> index 563854a..5a5153c 100644
> --- a/sound/usb/card.c
> +++ b/sound/usb/card.c
> @@ -148,14 +148,32 @@ static int snd_usb_create_stream(struct
> snd_usb_audio *chip, int ctrlif, int int
> return -EINVAL;
> }
>
> + alts = &iface->altsetting[0];
> + altsd = get_iface_desc(alts);
> +
> + /*
> + * Android with both accessory and audio interfaces enabled gets
> the
> + * interface numbers wrong.
> + */
> + if ((chip->usb_id == USB_ID(0x18d1, 0x2d04) ||
> + chip->usb_id == USB_ID(0x18d1, 0x2d05)) &&
> + interface == 0 &&
> + altsd->bInterfaceClass == USB_CLASS_VENDOR_SPEC &&
> + altsd->bInterfaceSubClass == USB_SUBCLASS_VENDOR_SPEC) {
> + interface = 2;
> + iface = usb_ifnum_to_if(dev, interface);
> + if (!iface)
> + return -EINVAL;
> + alts = &iface->altsetting[0];
> + altsd = get_iface_desc(alts);
> + }
> +
> if (usb_interface_claimed(iface)) {
> snd_printdd(KERN_INFO "%d:%d:%d: skipping, already claimed\n",
> dev->devnum, ctrlif, interface);
> return -EINVAL;
> }
>
> - alts = &iface->altsetting[0];
> - altsd = get_iface_desc(alts);
> if ((altsd->bInterfaceClass == USB_CLASS_AUDIO ||
> altsd->bInterfaceClass == USB_CLASS_VENDOR_SPEC) &&
> altsd->bInterfaceSubClass == USB_SUBCLASS_MIDISTREAMING) {
>
More information about the Alsa-devel
mailing list