Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /*
0003  *   Copyright (c) 2007 Daniel Mack
0004  *   friendly supported by NI.
0005  */
0006 
0007 #include <linux/device.h>
0008 #include <linux/init.h>
0009 #include <linux/usb.h>
0010 #include <sound/control.h>
0011 #include <sound/core.h>
0012 #include <sound/pcm.h>
0013 
0014 #include "device.h"
0015 #include "control.h"
0016 
0017 #define CNT_INTVAL 0x10000
0018 #define MASCHINE_BANK_SIZE 32
0019 
0020 static int control_info(struct snd_kcontrol *kcontrol,
0021             struct snd_ctl_elem_info *uinfo)
0022 {
0023     struct snd_usb_audio *chip = snd_kcontrol_chip(kcontrol);
0024     struct snd_usb_caiaqdev *cdev = caiaqdev(chip->card);
0025     int pos = kcontrol->private_value;
0026     int is_intval = pos & CNT_INTVAL;
0027     int maxval = 63;
0028 
0029     uinfo->count = 1;
0030     pos &= ~CNT_INTVAL;
0031 
0032     switch (cdev->chip.usb_id) {
0033     case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AUDIO8DJ):
0034     case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AUDIO4DJ):
0035         if (pos == 0) {
0036             /* current input mode of A8DJ and A4DJ */
0037             uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
0038             uinfo->value.integer.min = 0;
0039             uinfo->value.integer.max = 2;
0040             return 0;
0041         }
0042         break;
0043 
0044     case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_TRAKTORKONTROLX1):
0045         maxval = 127;
0046         break;
0047 
0048     case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_TRAKTORKONTROLS4):
0049         maxval = 31;
0050         break;
0051     }
0052 
0053     if (is_intval) {
0054         uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
0055         uinfo->value.integer.min = 0;
0056         uinfo->value.integer.max = maxval;
0057     } else {
0058         uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
0059         uinfo->value.integer.min = 0;
0060         uinfo->value.integer.max = 1;
0061     }
0062 
0063     return 0;
0064 }
0065 
0066 static int control_get(struct snd_kcontrol *kcontrol,
0067                struct snd_ctl_elem_value *ucontrol)
0068 {
0069     struct snd_usb_audio *chip = snd_kcontrol_chip(kcontrol);
0070     struct snd_usb_caiaqdev *cdev = caiaqdev(chip->card);
0071     int pos = kcontrol->private_value;
0072 
0073     if (pos & CNT_INTVAL)
0074         ucontrol->value.integer.value[0]
0075             = cdev->control_state[pos & ~CNT_INTVAL];
0076     else
0077         ucontrol->value.integer.value[0]
0078             = !!(cdev->control_state[pos / 8] & (1 << pos % 8));
0079 
0080     return 0;
0081 }
0082 
0083 static int control_put(struct snd_kcontrol *kcontrol,
0084                struct snd_ctl_elem_value *ucontrol)
0085 {
0086     struct snd_usb_audio *chip = snd_kcontrol_chip(kcontrol);
0087     struct snd_usb_caiaqdev *cdev = caiaqdev(chip->card);
0088     int pos = kcontrol->private_value;
0089     int v = ucontrol->value.integer.value[0];
0090     unsigned char cmd;
0091 
0092     switch (cdev->chip.usb_id) {
0093     case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_MASCHINECONTROLLER):
0094     case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_TRAKTORKONTROLX1):
0095     case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_KORECONTROLLER2):
0096     case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_KORECONTROLLER):
0097         cmd = EP1_CMD_DIMM_LEDS;
0098         break;
0099     default:
0100         cmd = EP1_CMD_WRITE_IO;
0101         break;
0102     }
0103 
0104     if (pos & CNT_INTVAL) {
0105         int i = pos & ~CNT_INTVAL;
0106 
0107         cdev->control_state[i] = v;
0108 
0109         if (cdev->chip.usb_id ==
0110             USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_TRAKTORKONTROLS4)) {
0111             int actual_len;
0112 
0113             cdev->ep8_out_buf[0] = i;
0114             cdev->ep8_out_buf[1] = v;
0115 
0116             usb_bulk_msg(cdev->chip.dev,
0117                      usb_sndbulkpipe(cdev->chip.dev, 8),
0118                      cdev->ep8_out_buf, sizeof(cdev->ep8_out_buf),
0119                      &actual_len, 200);
0120         } else if (cdev->chip.usb_id ==
0121             USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_MASCHINECONTROLLER)) {
0122 
0123             int bank = 0;
0124             int offset = 0;
0125 
0126             if (i >= MASCHINE_BANK_SIZE) {
0127                 bank = 0x1e;
0128                 offset = MASCHINE_BANK_SIZE;
0129             }
0130 
0131             snd_usb_caiaq_send_command_bank(cdev, cmd, bank,
0132                     cdev->control_state + offset,
0133                     MASCHINE_BANK_SIZE);
0134         } else {
0135             snd_usb_caiaq_send_command(cdev, cmd,
0136                     cdev->control_state, sizeof(cdev->control_state));
0137         }
0138     } else {
0139         if (v)
0140             cdev->control_state[pos / 8] |= 1 << (pos % 8);
0141         else
0142             cdev->control_state[pos / 8] &= ~(1 << (pos % 8));
0143 
0144         snd_usb_caiaq_send_command(cdev, cmd,
0145                 cdev->control_state, sizeof(cdev->control_state));
0146     }
0147 
0148     return 1;
0149 }
0150 
0151 static struct snd_kcontrol_new kcontrol_template = {
0152     .iface = SNDRV_CTL_ELEM_IFACE_HWDEP,
0153     .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
0154     .index = 0,
0155     .info = control_info,
0156     .get  = control_get,
0157     .put  = control_put,
0158     /* name and private_value filled later */
0159 };
0160 
0161 struct caiaq_controller {
0162     char *name;
0163     int index;
0164 };
0165 
0166 static const struct caiaq_controller ak1_controller[] = {
0167     { "LED left",   2 },
0168     { "LED middle", 1 },
0169     { "LED right",  0 },
0170     { "LED ring",   3 }
0171 };
0172 
0173 static const struct caiaq_controller rk2_controller[] = {
0174     { "LED 1",      5  },
0175     { "LED 2",      4  },
0176     { "LED 3",      3  },
0177     { "LED 4",      2  },
0178     { "LED 5",      1  },
0179     { "LED 6",      0  },
0180     { "LED pedal",      6  },
0181     { "LED 7seg_1b",    8  },
0182     { "LED 7seg_1c",    9  },
0183     { "LED 7seg_2a",    10 },
0184     { "LED 7seg_2b",    11 },
0185     { "LED 7seg_2c",    12 },
0186     { "LED 7seg_2d",    13 },
0187     { "LED 7seg_2e",    14 },
0188     { "LED 7seg_2f",    15 },
0189     { "LED 7seg_2g",    16 },
0190     { "LED 7seg_3a",    17 },
0191     { "LED 7seg_3b",    18 },
0192     { "LED 7seg_3c",    19 },
0193     { "LED 7seg_3d",    20 },
0194     { "LED 7seg_3e",    21 },
0195     { "LED 7seg_3f",    22 },
0196     { "LED 7seg_3g",    23 }
0197 };
0198 
0199 static const struct caiaq_controller rk3_controller[] = {
0200     { "LED 7seg_1a",        0 + 0 },
0201     { "LED 7seg_1b",        0 + 1 },
0202     { "LED 7seg_1c",        0 + 2 },
0203     { "LED 7seg_1d",        0 + 3 },
0204     { "LED 7seg_1e",        0 + 4 },
0205     { "LED 7seg_1f",        0 + 5 },
0206     { "LED 7seg_1g",        0 + 6 },
0207     { "LED 7seg_1p",        0 + 7 },
0208 
0209     { "LED 7seg_2a",        8 + 0 },
0210     { "LED 7seg_2b",        8 + 1 },
0211     { "LED 7seg_2c",        8 + 2 },
0212     { "LED 7seg_2d",        8 + 3 },
0213     { "LED 7seg_2e",        8 + 4 },
0214     { "LED 7seg_2f",        8 + 5 },
0215     { "LED 7seg_2g",        8 + 6 },
0216     { "LED 7seg_2p",        8 + 7 },
0217 
0218     { "LED 7seg_3a",        16 + 0 },
0219     { "LED 7seg_3b",        16 + 1 },
0220     { "LED 7seg_3c",        16 + 2 },
0221     { "LED 7seg_3d",        16 + 3 },
0222     { "LED 7seg_3e",        16 + 4 },
0223     { "LED 7seg_3f",        16 + 5 },
0224     { "LED 7seg_3g",        16 + 6 },
0225     { "LED 7seg_3p",        16 + 7 },
0226 
0227     { "LED 7seg_4a",        24 + 0 },
0228     { "LED 7seg_4b",        24 + 1 },
0229     { "LED 7seg_4c",        24 + 2 },
0230     { "LED 7seg_4d",        24 + 3 },
0231     { "LED 7seg_4e",        24 + 4 },
0232     { "LED 7seg_4f",        24 + 5 },
0233     { "LED 7seg_4g",        24 + 6 },
0234     { "LED 7seg_4p",        24 + 7 },
0235 
0236     { "LED 1",      32 + 0 },
0237     { "LED 2",      32 + 1 },
0238     { "LED 3",      32 + 2 },
0239     { "LED 4",      32 + 3 },
0240     { "LED 5",      32 + 4 },
0241     { "LED 6",      32 + 5 },
0242     { "LED 7",      32 + 6 },
0243     { "LED 8",      32 + 7 },
0244     { "LED pedal",      32 + 8 }
0245 };
0246 
0247 static const struct caiaq_controller kore_controller[] = {
0248     { "LED F1",     8   | CNT_INTVAL },
0249     { "LED F2",     12  | CNT_INTVAL },
0250     { "LED F3",     0   | CNT_INTVAL },
0251     { "LED F4",     4   | CNT_INTVAL },
0252     { "LED F5",     11  | CNT_INTVAL },
0253     { "LED F6",     15  | CNT_INTVAL },
0254     { "LED F7",     3   | CNT_INTVAL },
0255     { "LED F8",     7   | CNT_INTVAL },
0256     { "LED touch1",         10  | CNT_INTVAL },
0257     { "LED touch2",         14  | CNT_INTVAL },
0258     { "LED touch3",         2   | CNT_INTVAL },
0259     { "LED touch4",         6   | CNT_INTVAL },
0260     { "LED touch5",         9   | CNT_INTVAL },
0261     { "LED touch6",         13  | CNT_INTVAL },
0262     { "LED touch7",         1   | CNT_INTVAL },
0263     { "LED touch8",         5   | CNT_INTVAL },
0264     { "LED left",           18  | CNT_INTVAL },
0265     { "LED right",          22  | CNT_INTVAL },
0266     { "LED up",     16  | CNT_INTVAL },
0267     { "LED down",           20  | CNT_INTVAL },
0268     { "LED stop",           23  | CNT_INTVAL },
0269     { "LED play",           21  | CNT_INTVAL },
0270     { "LED record",         19  | CNT_INTVAL },
0271     { "LED listen",     17  | CNT_INTVAL },
0272     { "LED lcd",        30  | CNT_INTVAL },
0273     { "LED menu",       28  | CNT_INTVAL },
0274     { "LED sound",      31  | CNT_INTVAL },
0275     { "LED esc",        29  | CNT_INTVAL },
0276     { "LED view",       27  | CNT_INTVAL },
0277     { "LED enter",      24  | CNT_INTVAL },
0278     { "LED control",    26  | CNT_INTVAL }
0279 };
0280 
0281 static const struct caiaq_controller a8dj_controller[] = {
0282     { "Current input mode",         0 | CNT_INTVAL  },
0283     { "GND lift for TC Vinyl mode",     24 + 0      },
0284     { "GND lift for TC CD/Line mode",   24 + 1      },
0285     { "GND lift for phono mode",        24 + 2      },
0286     { "Software lock",          40      }
0287 };
0288 
0289 static const struct caiaq_controller a4dj_controller[] = {
0290     { "Current input mode", 0 | CNT_INTVAL  }
0291 };
0292 
0293 static const struct caiaq_controller kontrolx1_controller[] = {
0294     { "LED FX A: ON",       7 | CNT_INTVAL  },
0295     { "LED FX A: 1",        6 | CNT_INTVAL  },
0296     { "LED FX A: 2",        5 | CNT_INTVAL  },
0297     { "LED FX A: 3",        4 | CNT_INTVAL  },
0298     { "LED FX B: ON",       3 | CNT_INTVAL  },
0299     { "LED FX B: 1",        2 | CNT_INTVAL  },
0300     { "LED FX B: 2",        1 | CNT_INTVAL  },
0301     { "LED FX B: 3",        0 | CNT_INTVAL  },
0302 
0303     { "LED Hotcue",         28 | CNT_INTVAL },
0304     { "LED Shift (white)",      29 | CNT_INTVAL },
0305     { "LED Shift (green)",      30 | CNT_INTVAL },
0306 
0307     { "LED Deck A: FX1",        24 | CNT_INTVAL },
0308     { "LED Deck A: FX2",        25 | CNT_INTVAL },
0309     { "LED Deck A: IN",     17 | CNT_INTVAL },
0310     { "LED Deck A: OUT",        16 | CNT_INTVAL },
0311     { "LED Deck A: < BEAT",     19 | CNT_INTVAL },
0312     { "LED Deck A: BEAT >",     18 | CNT_INTVAL },
0313     { "LED Deck A: CUE/ABS",    21 | CNT_INTVAL },
0314     { "LED Deck A: CUP/REL",    20 | CNT_INTVAL },
0315     { "LED Deck A: PLAY",       23 | CNT_INTVAL },
0316     { "LED Deck A: SYNC",       22 | CNT_INTVAL },
0317 
0318     { "LED Deck B: FX1",        26 | CNT_INTVAL },
0319     { "LED Deck B: FX2",        27 | CNT_INTVAL },
0320     { "LED Deck B: IN",     15 | CNT_INTVAL },
0321     { "LED Deck B: OUT",        14 | CNT_INTVAL },
0322     { "LED Deck B: < BEAT",     13 | CNT_INTVAL },
0323     { "LED Deck B: BEAT >",     12 | CNT_INTVAL },
0324     { "LED Deck B: CUE/ABS",    11 | CNT_INTVAL },
0325     { "LED Deck B: CUP/REL",    10 | CNT_INTVAL },
0326     { "LED Deck B: PLAY",       9  | CNT_INTVAL },
0327     { "LED Deck B: SYNC",       8  | CNT_INTVAL },
0328 };
0329 
0330 static const struct caiaq_controller kontrols4_controller[] = {
0331     { "LED: Master: Quant",         10  | CNT_INTVAL },
0332     { "LED: Master: Headphone",     11  | CNT_INTVAL },
0333     { "LED: Master: Master",        12  | CNT_INTVAL },
0334     { "LED: Master: Snap",          14  | CNT_INTVAL },
0335     { "LED: Master: Warning",       15  | CNT_INTVAL },
0336     { "LED: Master: Master button",     112 | CNT_INTVAL },
0337     { "LED: Master: Snap button",       113 | CNT_INTVAL },
0338     { "LED: Master: Rec",           118 | CNT_INTVAL },
0339     { "LED: Master: Size",          119 | CNT_INTVAL },
0340     { "LED: Master: Quant button",      120 | CNT_INTVAL },
0341     { "LED: Master: Browser button",    121 | CNT_INTVAL },
0342     { "LED: Master: Play button",       126 | CNT_INTVAL },
0343     { "LED: Master: Undo button",       127 | CNT_INTVAL },
0344 
0345     { "LED: Channel A: >",          4   | CNT_INTVAL },
0346     { "LED: Channel A: <",          5   | CNT_INTVAL },
0347     { "LED: Channel A: Meter 1",        97  | CNT_INTVAL },
0348     { "LED: Channel A: Meter 2",        98  | CNT_INTVAL },
0349     { "LED: Channel A: Meter 3",        99  | CNT_INTVAL },
0350     { "LED: Channel A: Meter 4",        100 | CNT_INTVAL },
0351     { "LED: Channel A: Meter 5",        101 | CNT_INTVAL },
0352     { "LED: Channel A: Meter 6",        102 | CNT_INTVAL },
0353     { "LED: Channel A: Meter clip",     103 | CNT_INTVAL },
0354     { "LED: Channel A: Active",     114 | CNT_INTVAL },
0355     { "LED: Channel A: Cue",        116 | CNT_INTVAL },
0356     { "LED: Channel A: FX1",        149 | CNT_INTVAL },
0357     { "LED: Channel A: FX2",        148 | CNT_INTVAL },
0358 
0359     { "LED: Channel B: >",          2   | CNT_INTVAL },
0360     { "LED: Channel B: <",          3   | CNT_INTVAL },
0361     { "LED: Channel B: Meter 1",        89  | CNT_INTVAL },
0362     { "LED: Channel B: Meter 2",        90  | CNT_INTVAL },
0363     { "LED: Channel B: Meter 3",        91  | CNT_INTVAL },
0364     { "LED: Channel B: Meter 4",        92  | CNT_INTVAL },
0365     { "LED: Channel B: Meter 5",        93  | CNT_INTVAL },
0366     { "LED: Channel B: Meter 6",        94  | CNT_INTVAL },
0367     { "LED: Channel B: Meter clip",     95  | CNT_INTVAL },
0368     { "LED: Channel B: Active",     122 | CNT_INTVAL },
0369     { "LED: Channel B: Cue",        125 | CNT_INTVAL },
0370     { "LED: Channel B: FX1",        147 | CNT_INTVAL },
0371     { "LED: Channel B: FX2",        146 | CNT_INTVAL },
0372 
0373     { "LED: Channel C: >",          6   | CNT_INTVAL },
0374     { "LED: Channel C: <",          7   | CNT_INTVAL },
0375     { "LED: Channel C: Meter 1",        105 | CNT_INTVAL },
0376     { "LED: Channel C: Meter 2",        106 | CNT_INTVAL },
0377     { "LED: Channel C: Meter 3",        107 | CNT_INTVAL },
0378     { "LED: Channel C: Meter 4",        108 | CNT_INTVAL },
0379     { "LED: Channel C: Meter 5",        109 | CNT_INTVAL },
0380     { "LED: Channel C: Meter 6",        110 | CNT_INTVAL },
0381     { "LED: Channel C: Meter clip",     111 | CNT_INTVAL },
0382     { "LED: Channel C: Active",     115 | CNT_INTVAL },
0383     { "LED: Channel C: Cue",        117 | CNT_INTVAL },
0384     { "LED: Channel C: FX1",        151 | CNT_INTVAL },
0385     { "LED: Channel C: FX2",        150 | CNT_INTVAL },
0386 
0387     { "LED: Channel D: >",          0   | CNT_INTVAL },
0388     { "LED: Channel D: <",          1   | CNT_INTVAL },
0389     { "LED: Channel D: Meter 1",        81  | CNT_INTVAL },
0390     { "LED: Channel D: Meter 2",        82  | CNT_INTVAL },
0391     { "LED: Channel D: Meter 3",        83  | CNT_INTVAL },
0392     { "LED: Channel D: Meter 4",        84  | CNT_INTVAL },
0393     { "LED: Channel D: Meter 5",        85  | CNT_INTVAL },
0394     { "LED: Channel D: Meter 6",        86  | CNT_INTVAL },
0395     { "LED: Channel D: Meter clip",     87  | CNT_INTVAL },
0396     { "LED: Channel D: Active",     123 | CNT_INTVAL },
0397     { "LED: Channel D: Cue",        124 | CNT_INTVAL },
0398     { "LED: Channel D: FX1",        145 | CNT_INTVAL },
0399     { "LED: Channel D: FX2",        144 | CNT_INTVAL },
0400 
0401     { "LED: Deck A: 1 (blue)",      22  | CNT_INTVAL },
0402     { "LED: Deck A: 1 (green)",     23  | CNT_INTVAL },
0403     { "LED: Deck A: 2 (blue)",      20  | CNT_INTVAL },
0404     { "LED: Deck A: 2 (green)",     21  | CNT_INTVAL },
0405     { "LED: Deck A: 3 (blue)",      18  | CNT_INTVAL },
0406     { "LED: Deck A: 3 (green)",     19  | CNT_INTVAL },
0407     { "LED: Deck A: 4 (blue)",      16  | CNT_INTVAL },
0408     { "LED: Deck A: 4 (green)",     17  | CNT_INTVAL },
0409     { "LED: Deck A: Load",          44  | CNT_INTVAL },
0410     { "LED: Deck A: Deck C button",     45  | CNT_INTVAL },
0411     { "LED: Deck A: In",            47  | CNT_INTVAL },
0412     { "LED: Deck A: Out",           46  | CNT_INTVAL },
0413     { "LED: Deck A: Shift",         24  | CNT_INTVAL },
0414     { "LED: Deck A: Sync",          27  | CNT_INTVAL },
0415     { "LED: Deck A: Cue",           26  | CNT_INTVAL },
0416     { "LED: Deck A: Play",          25  | CNT_INTVAL },
0417     { "LED: Deck A: Tempo up",      33  | CNT_INTVAL },
0418     { "LED: Deck A: Tempo down",        32  | CNT_INTVAL },
0419     { "LED: Deck A: Master",        34  | CNT_INTVAL },
0420     { "LED: Deck A: Keylock",       35  | CNT_INTVAL },
0421     { "LED: Deck A: Deck A",        37  | CNT_INTVAL },
0422     { "LED: Deck A: Deck C",        36  | CNT_INTVAL },
0423     { "LED: Deck A: Samples",       38  | CNT_INTVAL },
0424     { "LED: Deck A: On Air",        39  | CNT_INTVAL },
0425     { "LED: Deck A: Sample 1",      31  | CNT_INTVAL },
0426     { "LED: Deck A: Sample 2",      30  | CNT_INTVAL },
0427     { "LED: Deck A: Sample 3",      29  | CNT_INTVAL },
0428     { "LED: Deck A: Sample 4",      28  | CNT_INTVAL },
0429     { "LED: Deck A: Digit 1 - A",       55  | CNT_INTVAL },
0430     { "LED: Deck A: Digit 1 - B",       54  | CNT_INTVAL },
0431     { "LED: Deck A: Digit 1 - C",       53  | CNT_INTVAL },
0432     { "LED: Deck A: Digit 1 - D",       52  | CNT_INTVAL },
0433     { "LED: Deck A: Digit 1 - E",       51  | CNT_INTVAL },
0434     { "LED: Deck A: Digit 1 - F",       50  | CNT_INTVAL },
0435     { "LED: Deck A: Digit 1 - G",       49  | CNT_INTVAL },
0436     { "LED: Deck A: Digit 1 - dot",     48  | CNT_INTVAL },
0437     { "LED: Deck A: Digit 2 - A",       63  | CNT_INTVAL },
0438     { "LED: Deck A: Digit 2 - B",       62  | CNT_INTVAL },
0439     { "LED: Deck A: Digit 2 - C",       61  | CNT_INTVAL },
0440     { "LED: Deck A: Digit 2 - D",       60  | CNT_INTVAL },
0441     { "LED: Deck A: Digit 2 - E",       59  | CNT_INTVAL },
0442     { "LED: Deck A: Digit 2 - F",       58  | CNT_INTVAL },
0443     { "LED: Deck A: Digit 2 - G",       57  | CNT_INTVAL },
0444     { "LED: Deck A: Digit 2 - dot",     56  | CNT_INTVAL },
0445 
0446     { "LED: Deck B: 1 (blue)",      78  | CNT_INTVAL },
0447     { "LED: Deck B: 1 (green)",     79  | CNT_INTVAL },
0448     { "LED: Deck B: 2 (blue)",      76  | CNT_INTVAL },
0449     { "LED: Deck B: 2 (green)",     77  | CNT_INTVAL },
0450     { "LED: Deck B: 3 (blue)",      74  | CNT_INTVAL },
0451     { "LED: Deck B: 3 (green)",     75  | CNT_INTVAL },
0452     { "LED: Deck B: 4 (blue)",      72  | CNT_INTVAL },
0453     { "LED: Deck B: 4 (green)",     73  | CNT_INTVAL },
0454     { "LED: Deck B: Load",          180 | CNT_INTVAL },
0455     { "LED: Deck B: Deck D button",     181 | CNT_INTVAL },
0456     { "LED: Deck B: In",            183 | CNT_INTVAL },
0457     { "LED: Deck B: Out",           182 | CNT_INTVAL },
0458     { "LED: Deck B: Shift",         64  | CNT_INTVAL },
0459     { "LED: Deck B: Sync",          67  | CNT_INTVAL },
0460     { "LED: Deck B: Cue",           66  | CNT_INTVAL },
0461     { "LED: Deck B: Play",          65  | CNT_INTVAL },
0462     { "LED: Deck B: Tempo up",      185 | CNT_INTVAL },
0463     { "LED: Deck B: Tempo down",        184 | CNT_INTVAL },
0464     { "LED: Deck B: Master",        186 | CNT_INTVAL },
0465     { "LED: Deck B: Keylock",       187 | CNT_INTVAL },
0466     { "LED: Deck B: Deck B",        189 | CNT_INTVAL },
0467     { "LED: Deck B: Deck D",        188 | CNT_INTVAL },
0468     { "LED: Deck B: Samples",       190 | CNT_INTVAL },
0469     { "LED: Deck B: On Air",        191 | CNT_INTVAL },
0470     { "LED: Deck B: Sample 1",      71  | CNT_INTVAL },
0471     { "LED: Deck B: Sample 2",      70  | CNT_INTVAL },
0472     { "LED: Deck B: Sample 3",      69  | CNT_INTVAL },
0473     { "LED: Deck B: Sample 4",      68  | CNT_INTVAL },
0474     { "LED: Deck B: Digit 1 - A",       175 | CNT_INTVAL },
0475     { "LED: Deck B: Digit 1 - B",       174 | CNT_INTVAL },
0476     { "LED: Deck B: Digit 1 - C",       173 | CNT_INTVAL },
0477     { "LED: Deck B: Digit 1 - D",       172 | CNT_INTVAL },
0478     { "LED: Deck B: Digit 1 - E",       171 | CNT_INTVAL },
0479     { "LED: Deck B: Digit 1 - F",       170 | CNT_INTVAL },
0480     { "LED: Deck B: Digit 1 - G",       169 | CNT_INTVAL },
0481     { "LED: Deck B: Digit 1 - dot",     168 | CNT_INTVAL },
0482     { "LED: Deck B: Digit 2 - A",       167 | CNT_INTVAL },
0483     { "LED: Deck B: Digit 2 - B",       166 | CNT_INTVAL },
0484     { "LED: Deck B: Digit 2 - C",       165 | CNT_INTVAL },
0485     { "LED: Deck B: Digit 2 - D",       164 | CNT_INTVAL },
0486     { "LED: Deck B: Digit 2 - E",       163 | CNT_INTVAL },
0487     { "LED: Deck B: Digit 2 - F",       162 | CNT_INTVAL },
0488     { "LED: Deck B: Digit 2 - G",       161 | CNT_INTVAL },
0489     { "LED: Deck B: Digit 2 - dot",     160 | CNT_INTVAL },
0490 
0491     { "LED: FX1: dry/wet",          153 | CNT_INTVAL },
0492     { "LED: FX1: 1",            154 | CNT_INTVAL },
0493     { "LED: FX1: 2",            155 | CNT_INTVAL },
0494     { "LED: FX1: 3",            156 | CNT_INTVAL },
0495     { "LED: FX1: Mode",         157 | CNT_INTVAL },
0496     { "LED: FX2: dry/wet",          129 | CNT_INTVAL },
0497     { "LED: FX2: 1",            130 | CNT_INTVAL },
0498     { "LED: FX2: 2",            131 | CNT_INTVAL },
0499     { "LED: FX2: 3",            132 | CNT_INTVAL },
0500     { "LED: FX2: Mode",         133 | CNT_INTVAL },
0501 };
0502 
0503 static const struct caiaq_controller maschine_controller[] = {
0504     { "LED: Pad 1",             3  | CNT_INTVAL },
0505     { "LED: Pad 2",             2  | CNT_INTVAL },
0506     { "LED: Pad 3",             1  | CNT_INTVAL },
0507     { "LED: Pad 4",             0  | CNT_INTVAL },
0508     { "LED: Pad 5",             7  | CNT_INTVAL },
0509     { "LED: Pad 6",             6  | CNT_INTVAL },
0510     { "LED: Pad 7",             5  | CNT_INTVAL },
0511     { "LED: Pad 8",             4  | CNT_INTVAL },
0512     { "LED: Pad 9",             11 | CNT_INTVAL },
0513     { "LED: Pad 10",            10 | CNT_INTVAL },
0514     { "LED: Pad 11",            9  | CNT_INTVAL },
0515     { "LED: Pad 12",            8  | CNT_INTVAL },
0516     { "LED: Pad 13",            15 | CNT_INTVAL },
0517     { "LED: Pad 14",            14 | CNT_INTVAL },
0518     { "LED: Pad 15",            13 | CNT_INTVAL },
0519     { "LED: Pad 16",            12 | CNT_INTVAL },
0520 
0521     { "LED: Mute",              16 | CNT_INTVAL },
0522     { "LED: Solo",              17 | CNT_INTVAL },
0523     { "LED: Select",            18 | CNT_INTVAL },
0524     { "LED: Duplicate",         19 | CNT_INTVAL },
0525     { "LED: Navigate",          20 | CNT_INTVAL },
0526     { "LED: Pad Mode",          21 | CNT_INTVAL },
0527     { "LED: Pattern",           22 | CNT_INTVAL },
0528     { "LED: Scene",             23 | CNT_INTVAL },
0529 
0530     { "LED: Shift",             24 | CNT_INTVAL },
0531     { "LED: Erase",             25 | CNT_INTVAL },
0532     { "LED: Grid",              26 | CNT_INTVAL },
0533     { "LED: Right Bottom",          27 | CNT_INTVAL },
0534     { "LED: Rec",               28 | CNT_INTVAL },
0535     { "LED: Play",              29 | CNT_INTVAL },
0536     { "LED: Left Bottom",           32 | CNT_INTVAL },
0537     { "LED: Restart",           33 | CNT_INTVAL },
0538 
0539     { "LED: Group A",           41 | CNT_INTVAL },
0540     { "LED: Group B",           40 | CNT_INTVAL },
0541     { "LED: Group C",           37 | CNT_INTVAL },
0542     { "LED: Group D",           36 | CNT_INTVAL },
0543     { "LED: Group E",           39 | CNT_INTVAL },
0544     { "LED: Group F",           38 | CNT_INTVAL },
0545     { "LED: Group G",           35 | CNT_INTVAL },
0546     { "LED: Group H",           34 | CNT_INTVAL },
0547 
0548     { "LED: Auto Write",            42 | CNT_INTVAL },
0549     { "LED: Snap",              43 | CNT_INTVAL },
0550     { "LED: Right Top",         44 | CNT_INTVAL },
0551     { "LED: Left Top",          45 | CNT_INTVAL },
0552     { "LED: Sampling",          46 | CNT_INTVAL },
0553     { "LED: Browse",            47 | CNT_INTVAL },
0554     { "LED: Step",              48 | CNT_INTVAL },
0555     { "LED: Control",           49 | CNT_INTVAL },
0556 
0557     { "LED: Top Button 1",          57 | CNT_INTVAL },
0558     { "LED: Top Button 2",          56 | CNT_INTVAL },
0559     { "LED: Top Button 3",          55 | CNT_INTVAL },
0560     { "LED: Top Button 4",          54 | CNT_INTVAL },
0561     { "LED: Top Button 5",          53 | CNT_INTVAL },
0562     { "LED: Top Button 6",          52 | CNT_INTVAL },
0563     { "LED: Top Button 7",          51 | CNT_INTVAL },
0564     { "LED: Top Button 8",          50 | CNT_INTVAL },
0565 
0566     { "LED: Note Repeat",           58 | CNT_INTVAL },
0567 
0568     { "Backlight Display",          59 | CNT_INTVAL }
0569 };
0570 
0571 static int add_controls(const struct caiaq_controller *c, int num,
0572             struct snd_usb_caiaqdev *cdev)
0573 {
0574     int i, ret;
0575     struct snd_kcontrol *kc;
0576 
0577     for (i = 0; i < num; i++, c++) {
0578         kcontrol_template.name = c->name;
0579         kcontrol_template.private_value = c->index;
0580         kc = snd_ctl_new1(&kcontrol_template, cdev);
0581         ret = snd_ctl_add(cdev->chip.card, kc);
0582         if (ret < 0)
0583             return ret;
0584     }
0585 
0586     return 0;
0587 }
0588 
0589 int snd_usb_caiaq_control_init(struct snd_usb_caiaqdev *cdev)
0590 {
0591     int ret = 0;
0592 
0593     switch (cdev->chip.usb_id) {
0594     case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AK1):
0595         ret = add_controls(ak1_controller,
0596             ARRAY_SIZE(ak1_controller), cdev);
0597         break;
0598 
0599     case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_RIGKONTROL2):
0600         ret = add_controls(rk2_controller,
0601             ARRAY_SIZE(rk2_controller), cdev);
0602         break;
0603 
0604     case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_RIGKONTROL3):
0605         ret = add_controls(rk3_controller,
0606             ARRAY_SIZE(rk3_controller), cdev);
0607         break;
0608 
0609     case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_KORECONTROLLER):
0610     case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_KORECONTROLLER2):
0611         ret = add_controls(kore_controller,
0612             ARRAY_SIZE(kore_controller), cdev);
0613         break;
0614 
0615     case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AUDIO8DJ):
0616         ret = add_controls(a8dj_controller,
0617             ARRAY_SIZE(a8dj_controller), cdev);
0618         break;
0619 
0620     case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AUDIO4DJ):
0621         ret = add_controls(a4dj_controller,
0622             ARRAY_SIZE(a4dj_controller), cdev);
0623         break;
0624 
0625     case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_TRAKTORKONTROLX1):
0626         ret = add_controls(kontrolx1_controller,
0627             ARRAY_SIZE(kontrolx1_controller), cdev);
0628         break;
0629 
0630     case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_TRAKTORKONTROLS4):
0631         ret = add_controls(kontrols4_controller,
0632             ARRAY_SIZE(kontrols4_controller), cdev);
0633         break;
0634 
0635     case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_MASCHINECONTROLLER):
0636         ret = add_controls(maschine_controller,
0637             ARRAY_SIZE(maschine_controller), cdev);
0638         break;
0639     }
0640 
0641     return ret;
0642 }
0643