ALSA: usb - Don't trust the channel config if the channel count changed
authorDavid Henningsson <david.henningsson@canonical.com>
Tue, 5 Nov 2013 03:41:08 +0000 (04:41 +0100)
committerTakashi Iwai <tiwai@suse.de>
Tue, 5 Nov 2013 06:46:48 +0000 (07:46 +0100)
In case the channel count of the input terminal is not the same as
the channel count of the streaming descriptor, the channel config of
the input terminal can not be trusted. Instead fall back to a default
(guessed) channel map.

This was found on a Logitech USB Headset.

Signed-off-by: David Henningsson <david.henningsson@canonical.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/usb/stream.c

index badd1d6d175dee658bc6fd3ddf72268523492910..d737d0e6e5580efdec49852b93ed610429c88e31 100644 (file)
@@ -662,7 +662,6 @@ int snd_usb_parse_audio_interface(struct snd_usb_audio *chip, int iface_no)
                                        * (fp->maxpacksize & 0x7ff);
                fp->attributes = parse_uac_endpoint_attributes(chip, alts, protocol, iface_no);
                fp->clock = clock;
-               fp->chmap = convert_chmap(num_channels, chconfig, protocol);
 
                /* some quirks for attributes here */
 
@@ -698,12 +697,16 @@ int snd_usb_parse_audio_interface(struct snd_usb_audio *chip, int iface_no)
                /* ok, let's parse further... */
                if (snd_usb_parse_audio_format(chip, fp, format, fmt, stream) < 0) {
                        kfree(fp->rate_table);
-                       kfree(fp->chmap);
                        kfree(fp);
                        fp = NULL;
                        continue;
                }
 
+               /* Create chmap */
+               if (fp->channels != num_channels)
+                       chconfig = 0;
+               fp->chmap = convert_chmap(fp->channels, chconfig, protocol);
+
                snd_printdd(KERN_INFO "%d:%u:%d: add audio endpoint %#x\n", dev->devnum, iface_no, altno, fp->endpoint);
                err = snd_usb_add_audio_stream(chip, stream, fp);
                if (err < 0) {