|
@@ -281,8 +281,6 @@ static struct snd_pcm_chmap_elem *convert_chmap(int channels, unsigned int bits,
|
|
|
const unsigned int *maps;
|
|
|
int c;
|
|
|
|
|
|
- if (!bits)
|
|
|
- return NULL;
|
|
|
if (channels > ARRAY_SIZE(chmap->map))
|
|
|
return NULL;
|
|
|
|
|
@@ -293,9 +291,19 @@ static struct snd_pcm_chmap_elem *convert_chmap(int channels, unsigned int bits,
|
|
|
maps = protocol == UAC_VERSION_2 ? uac2_maps : uac1_maps;
|
|
|
chmap->channels = channels;
|
|
|
c = 0;
|
|
|
- for (; bits && *maps; maps++, bits >>= 1) {
|
|
|
- if (bits & 1)
|
|
|
- chmap->map[c++] = *maps;
|
|
|
+
|
|
|
+ if (bits) {
|
|
|
+ for (; bits && *maps; maps++, bits >>= 1)
|
|
|
+ if (bits & 1)
|
|
|
+ chmap->map[c++] = *maps;
|
|
|
+ } else {
|
|
|
+ /* If we're missing wChannelConfig, then guess something
|
|
|
+ to make sure the channel map is not skipped entirely */
|
|
|
+ if (channels == 1)
|
|
|
+ chmap->map[c++] = SNDRV_CHMAP_MONO;
|
|
|
+ else
|
|
|
+ for (; c < channels && *maps; maps++)
|
|
|
+ chmap->map[c++] = *maps;
|
|
|
}
|
|
|
|
|
|
for (; c < channels; c++)
|