]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - sound/usb/mixer.c
Merge branch 'for-linus' of git://oss.sgi.com/xfs/xfs
[net-next-2.6.git] / sound / usb / mixer.c
index a060d005e20921089309569a9e8ebb9c9115b455..6939d0f517d9bd42928f87e7f6a4e9fd35bff9b4 100644 (file)
@@ -297,20 +297,27 @@ static int get_ctl_value_v1(struct usb_mixer_elem_info *cval, int request, int v
 
 static int get_ctl_value_v2(struct usb_mixer_elem_info *cval, int request, int validx, int *value_ret)
 {
-       unsigned char buf[14]; /* enough space for one range of 4 bytes */
+       unsigned char buf[2 + 3*sizeof(__u16)]; /* enough space for one range */
        unsigned char *val;
-       int ret;
+       int ret, size;
        __u8 bRequest;
 
-       bRequest = (request == UAC_GET_CUR) ?
-               UAC2_CS_CUR : UAC2_CS_RANGE;
+       if (request == UAC_GET_CUR) {
+               bRequest = UAC2_CS_CUR;
+               size = sizeof(__u16);
+       } else {
+               bRequest = UAC2_CS_RANGE;
+               size = sizeof(buf);
+       }
+
+       memset(buf, 0, sizeof(buf));
 
        ret = snd_usb_ctl_msg(cval->mixer->chip->dev,
                              usb_rcvctrlpipe(cval->mixer->chip->dev, 0),
                              bRequest,
                              USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN,
                              validx, cval->mixer->ctrlif | (cval->id << 8),
-                             buf, sizeof(buf), 1000);
+                             buf, size, 1000);
 
        if (ret < 0) {
                snd_printk(KERN_ERR "cannot get ctl value: req = %#x, wValue = %#x, wIndex = %#x, type = %d\n",
@@ -318,6 +325,8 @@ static int get_ctl_value_v2(struct usb_mixer_elem_info *cval, int request, int v
                return ret;
        }
 
+       /* FIXME: how should we handle multiple triplets here? */
+
        switch (request) {
        case UAC_GET_CUR:
                val = buf;