ALSA: usb - For class 2 devices, use channel map from altsettings
authorDavid Henningsson <david.henningsson@canonical.com>
Tue, 5 Nov 2013 03:41:07 +0000 (04:41 +0100)
committerTakashi Iwai <tiwai@suse.de>
Tue, 5 Nov 2013 06:46:38 +0000 (07:46 +0100)
The channel config from the streaming descriptor is probably a
better indicator of the channel map than the input terminal.
Use the input terminal's channel map as fallback only.

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

index b43b6eec322729c19bf81aba1ad48e37997e30d6..badd1d6d175dee658bc6fd3ddf72268523492910 100644 (file)
@@ -587,6 +587,7 @@ int snd_usb_parse_audio_interface(struct snd_usb_audio *chip, int iface_no)
 
                        num_channels = as->bNrChannels;
                        format = le32_to_cpu(as->bmFormats);
+                       chconfig = le32_to_cpu(as->bmChannelConfig);
 
                        /* lookup the terminal associated to this interface
                         * to extract the clock */
@@ -594,7 +595,8 @@ int snd_usb_parse_audio_interface(struct snd_usb_audio *chip, int iface_no)
                                                                            as->bTerminalLink);
                        if (input_term) {
                                clock = input_term->bCSourceID;
-                               chconfig = le32_to_cpu(input_term->bmChannelConfig);
+                               if (!chconfig && (num_channels == input_term->bNrChannels))
+                                       chconfig = le32_to_cpu(input_term->bmChannelConfig);
                                break;
                        }