sound: usb-audio: fix rules check for 32-channel devices
authorClemens Ladisch <clemens@ladisch.de>
Mon, 2 Mar 2009 10:45:50 +0000 (11:45 +0100)
committerTakashi Iwai <tiwai@suse.de>
Mon, 2 Mar 2009 13:49:58 +0000 (14:49 +0100)
When storing the channel numbers used by a format, and if the device
happens to support 32 channels, the code would try to store 1<<32 in
a 32-bit value.

Since no valid format can have zero channels, we can use 1<<(channels-1)
instead of 1<<channels so that all the channel numbers that we test for
fit into 32 bits.

Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/usb/usbaudio.c

index 2b24496..f853b62 100644 (file)
@@ -1783,7 +1783,7 @@ static int check_hw_params_convention(struct snd_usb_substream *subs)
                        if (rates[f->format] && rates[f->format] != f->rates)
                                goto __out;
                }
-               channels[f->format] |= (1 << f->channels);
+               channels[f->format] |= 1 << (f->channels - 1);
                rates[f->format] |= f->rates;
                /* needs knot? */
                if (f->rates & SNDRV_PCM_RATE_KNOT)
@@ -1810,7 +1810,7 @@ static int check_hw_params_convention(struct snd_usb_substream *subs)
                        continue;
                for (i = 0; i < 32; i++) {
                        if (f->rates & (1 << i))
-                               channels[i] |= (1 << f->channels);
+                               channels[i] |= 1 << (f->channels - 1);
                }
        }
        cmaster = 0;