]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - sound/usb/caiaq/caiaq-control.c
Merge branch 'linus' into release
[mirror_ubuntu-artful-kernel.git] / sound / usb / caiaq / caiaq-control.c
index ccd763dd7167e2ce37b469098807634a1500aab9..e92c2bbf4fe92742aa4f99a16d735d0996f7f8c9 100644 (file)
@@ -39,12 +39,12 @@ static int control_info(struct snd_kcontrol *kcontrol,
        struct snd_usb_caiaqdev *dev = caiaqdev(chip->card);
        int pos = kcontrol->private_value;
        int is_intval = pos & CNT_INTVAL;
+       unsigned int id = dev->chip.usb_id;
 
        uinfo->count = 1;
        pos &= ~CNT_INTVAL;
 
-       if (dev->chip.usb_id ==
-               USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AUDIO8DJ)
+       if (id == USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AUDIO8DJ)
                && (pos == 0)) {
                /* current input mode of A8DJ */
                uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
@@ -53,6 +53,15 @@ static int control_info(struct snd_kcontrol *kcontrol,
                return 0;
        }
 
+       if (id == USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AUDIO4DJ)
+               && (pos == 0)) {
+               /* current input mode of A4DJ */
+               uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
+               uinfo->value.integer.min = 0;
+               uinfo->value.integer.max = 1;
+               return 0;
+       }
+
        if (is_intval) {
                uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
                uinfo->value.integer.min = 0;
@@ -73,6 +82,14 @@ static int control_get(struct snd_kcontrol *kcontrol,
        struct snd_usb_caiaqdev *dev = caiaqdev(chip->card);
        int pos = kcontrol->private_value;
 
+       if (dev->chip.usb_id ==
+               USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AUDIO4DJ)) {
+               /* A4DJ has only one control */
+               /* do not expose hardware input mode 0 */
+               ucontrol->value.integer.value[0] = dev->control_state[0] - 1;
+               return 0;
+       }
+
        if (pos & CNT_INTVAL)
                ucontrol->value.integer.value[0]
                        = dev->control_state[pos & ~CNT_INTVAL];
@@ -90,10 +107,20 @@ static int control_put(struct snd_kcontrol *kcontrol,
        struct snd_usb_caiaqdev *dev = caiaqdev(chip->card);
        int pos = kcontrol->private_value;
 
+       if (dev->chip.usb_id ==
+               USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AUDIO4DJ)) {
+               /* A4DJ has only one control */
+               /* do not expose hardware input mode 0 */
+               dev->control_state[0] = ucontrol->value.integer.value[0] + 1;
+               snd_usb_caiaq_send_command(dev, EP1_CMD_WRITE_IO,
+                               dev->control_state, sizeof(dev->control_state));
+               return 1;
+       }
+
        if (pos & CNT_INTVAL) {
                dev->control_state[pos & ~CNT_INTVAL]
                        = ucontrol->value.integer.value[0];
-               snd_usb_caiaq_send_command(dev, EP1_CMD_DIMM_LEDS,
+               snd_usb_caiaq_send_command(dev, EP1_CMD_WRITE_IO,
                                dev->control_state, sizeof(dev->control_state));
        } else {
                if (ucontrol->value.integer.value[0])
@@ -243,10 +270,13 @@ static struct caiaq_controller a8dj_controller[] = {
        { "GND lift for TC Vinyl mode",         24 + 0          },
        { "GND lift for TC CD/Line mode",       24 + 1          },
        { "GND lift for phono mode",            24 + 2          },
-       { "GND lift for TC Vinyl mode",         24 + 3          },
        { "Software lock",                      40              }
 };
 
+static struct caiaq_controller a4dj_controller[] = {
+       { "Current input mode", 0 | CNT_INTVAL  }
+};
+
 static int __devinit add_controls(struct caiaq_controller *c, int num,
                                  struct snd_usb_caiaqdev *dev)
 {
@@ -295,6 +325,10 @@ int __devinit snd_usb_caiaq_control_init(struct snd_usb_caiaqdev *dev)
                ret = add_controls(a8dj_controller,
                        ARRAY_SIZE(a8dj_controller), dev);
                break;
+       case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AUDIO4DJ):
+               ret = add_controls(a4dj_controller,
+                       ARRAY_SIZE(a4dj_controller), dev);
+               break;
        }
 
        return ret;