aboutsummaryrefslogtreecommitdiffstats
path: root/sound/usb/caiaq/control.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/usb/caiaq/control.c')
-rw-r--r--sound/usb/caiaq/control.c99
1 files changed, 64 insertions, 35 deletions
diff --git a/sound/usb/caiaq/control.c b/sound/usb/caiaq/control.c
index 537102ba6b9d..91c804cd2782 100644
--- a/sound/usb/caiaq/control.c
+++ b/sound/usb/caiaq/control.c
@@ -35,33 +35,32 @@ static int control_info(struct snd_kcontrol *kcontrol,
35 struct snd_usb_caiaqdev *dev = caiaqdev(chip->card); 35 struct snd_usb_caiaqdev *dev = caiaqdev(chip->card);
36 int pos = kcontrol->private_value; 36 int pos = kcontrol->private_value;
37 int is_intval = pos & CNT_INTVAL; 37 int is_intval = pos & CNT_INTVAL;
38 unsigned int id = dev->chip.usb_id; 38 int maxval = 63;
39 39
40 uinfo->count = 1; 40 uinfo->count = 1;
41 pos &= ~CNT_INTVAL; 41 pos &= ~CNT_INTVAL;
42 42
43 if (id == USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AUDIO8DJ) 43 switch (dev->chip.usb_id) {
44 && (pos == 0)) { 44 case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AUDIO8DJ):
45 /* current input mode of A8DJ */ 45 case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AUDIO4DJ):
46 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; 46 if (pos == 0) {
47 uinfo->value.integer.min = 0; 47 /* current input mode of A8DJ and A4DJ */
48 uinfo->value.integer.max = 2; 48 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
49 return 0; 49 uinfo->value.integer.min = 0;
50 } 50 uinfo->value.integer.max = 2;
51 return 0;
52 }
53 break;
51 54
52 if (id == USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AUDIO4DJ) 55 case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_TRAKTORKONTROLX1):
53 && (pos == 0)) { 56 maxval = 127;
54 /* current input mode of A4DJ */ 57 break;
55 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
56 uinfo->value.integer.min = 0;
57 uinfo->value.integer.max = 1;
58 return 0;
59 } 58 }
60 59
61 if (is_intval) { 60 if (is_intval) {
62 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; 61 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
63 uinfo->value.integer.min = 0; 62 uinfo->value.integer.min = 0;
64 uinfo->value.integer.max = 64; 63 uinfo->value.integer.max = maxval;
65 } else { 64 } else {
66 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; 65 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
67 uinfo->value.integer.min = 0; 66 uinfo->value.integer.min = 0;
@@ -78,14 +77,6 @@ static int control_get(struct snd_kcontrol *kcontrol,
78 struct snd_usb_caiaqdev *dev = caiaqdev(chip->card); 77 struct snd_usb_caiaqdev *dev = caiaqdev(chip->card);
79 int pos = kcontrol->private_value; 78 int pos = kcontrol->private_value;
80 79
81 if (dev->chip.usb_id ==
82 USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AUDIO4DJ)) {
83 /* A4DJ has only one control */
84 /* do not expose hardware input mode 0 */
85 ucontrol->value.integer.value[0] = dev->control_state[0] - 1;
86 return 0;
87 }
88
89 if (pos & CNT_INTVAL) 80 if (pos & CNT_INTVAL)
90 ucontrol->value.integer.value[0] 81 ucontrol->value.integer.value[0]
91 = dev->control_state[pos & ~CNT_INTVAL]; 82 = dev->control_state[pos & ~CNT_INTVAL];
@@ -102,21 +93,16 @@ static int control_put(struct snd_kcontrol *kcontrol,
102 struct snd_usb_audio *chip = snd_kcontrol_chip(kcontrol); 93 struct snd_usb_audio *chip = snd_kcontrol_chip(kcontrol);
103 struct snd_usb_caiaqdev *dev = caiaqdev(chip->card); 94 struct snd_usb_caiaqdev *dev = caiaqdev(chip->card);
104 int pos = kcontrol->private_value; 95 int pos = kcontrol->private_value;
96 unsigned char cmd = EP1_CMD_WRITE_IO;
105 97
106 if (dev->chip.usb_id == 98 if (dev->chip.usb_id ==
107 USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AUDIO4DJ)) { 99 USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_TRAKTORKONTROLX1))
108 /* A4DJ has only one control */ 100 cmd = EP1_CMD_DIMM_LEDS;
109 /* do not expose hardware input mode 0 */
110 dev->control_state[0] = ucontrol->value.integer.value[0] + 1;
111 snd_usb_caiaq_send_command(dev, EP1_CMD_WRITE_IO,
112 dev->control_state, sizeof(dev->control_state));
113 return 1;
114 }
115 101
116 if (pos & CNT_INTVAL) { 102 if (pos & CNT_INTVAL) {
117 dev->control_state[pos & ~CNT_INTVAL] 103 dev->control_state[pos & ~CNT_INTVAL]
118 = ucontrol->value.integer.value[0]; 104 = ucontrol->value.integer.value[0];
119 snd_usb_caiaq_send_command(dev, EP1_CMD_WRITE_IO, 105 snd_usb_caiaq_send_command(dev, cmd,
120 dev->control_state, sizeof(dev->control_state)); 106 dev->control_state, sizeof(dev->control_state));
121 } else { 107 } else {
122 if (ucontrol->value.integer.value[0]) 108 if (ucontrol->value.integer.value[0])
@@ -124,7 +110,7 @@ static int control_put(struct snd_kcontrol *kcontrol,
124 else 110 else
125 dev->control_state[pos / 8] &= ~(1 << (pos % 8)); 111 dev->control_state[pos / 8] &= ~(1 << (pos % 8));
126 112
127 snd_usb_caiaq_send_command(dev, EP1_CMD_WRITE_IO, 113 snd_usb_caiaq_send_command(dev, cmd,
128 dev->control_state, sizeof(dev->control_state)); 114 dev->control_state, sizeof(dev->control_state));
129 } 115 }
130 116
@@ -273,6 +259,43 @@ static struct caiaq_controller a4dj_controller[] = {
273 { "Current input mode", 0 | CNT_INTVAL } 259 { "Current input mode", 0 | CNT_INTVAL }
274}; 260};
275 261
262static struct caiaq_controller kontrolx1_controller[] = {
263 { "LED FX A: ON", 7 | CNT_INTVAL },
264 { "LED FX A: 1", 6 | CNT_INTVAL },
265 { "LED FX A: 2", 5 | CNT_INTVAL },
266 { "LED FX A: 3", 4 | CNT_INTVAL },
267 { "LED FX B: ON", 3 | CNT_INTVAL },
268 { "LED FX B: 1", 2 | CNT_INTVAL },
269 { "LED FX B: 2", 1 | CNT_INTVAL },
270 { "LED FX B: 3", 0 | CNT_INTVAL },
271
272 { "LED Hotcue", 28 | CNT_INTVAL },
273 { "LED Shift (white)", 29 | CNT_INTVAL },
274 { "LED Shift (green)", 30 | CNT_INTVAL },
275
276 { "LED Deck A: FX1", 24 | CNT_INTVAL },
277 { "LED Deck A: FX2", 25 | CNT_INTVAL },
278 { "LED Deck A: IN", 17 | CNT_INTVAL },
279 { "LED Deck A: OUT", 16 | CNT_INTVAL },
280 { "LED Deck A: < BEAT", 19 | CNT_INTVAL },
281 { "LED Deck A: BEAT >", 18 | CNT_INTVAL },
282 { "LED Deck A: CUE/ABS", 21 | CNT_INTVAL },
283 { "LED Deck A: CUP/REL", 20 | CNT_INTVAL },
284 { "LED Deck A: PLAY", 23 | CNT_INTVAL },
285 { "LED Deck A: SYNC", 22 | CNT_INTVAL },
286
287 { "LED Deck B: FX1", 26 | CNT_INTVAL },
288 { "LED Deck B: FX2", 27 | CNT_INTVAL },
289 { "LED Deck B: IN", 15 | CNT_INTVAL },
290 { "LED Deck B: OUT", 14 | CNT_INTVAL },
291 { "LED Deck B: < BEAT", 13 | CNT_INTVAL },
292 { "LED Deck B: BEAT >", 12 | CNT_INTVAL },
293 { "LED Deck B: CUE/ABS", 11 | CNT_INTVAL },
294 { "LED Deck B: CUP/REL", 10 | CNT_INTVAL },
295 { "LED Deck B: PLAY", 9 | CNT_INTVAL },
296 { "LED Deck B: SYNC", 8 | CNT_INTVAL },
297};
298
276static int __devinit add_controls(struct caiaq_controller *c, int num, 299static int __devinit add_controls(struct caiaq_controller *c, int num,
277 struct snd_usb_caiaqdev *dev) 300 struct snd_usb_caiaqdev *dev)
278{ 301{
@@ -321,10 +344,16 @@ int __devinit snd_usb_caiaq_control_init(struct snd_usb_caiaqdev *dev)
321 ret = add_controls(a8dj_controller, 344 ret = add_controls(a8dj_controller,
322 ARRAY_SIZE(a8dj_controller), dev); 345 ARRAY_SIZE(a8dj_controller), dev);
323 break; 346 break;
347
324 case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AUDIO4DJ): 348 case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AUDIO4DJ):
325 ret = add_controls(a4dj_controller, 349 ret = add_controls(a4dj_controller,
326 ARRAY_SIZE(a4dj_controller), dev); 350 ARRAY_SIZE(a4dj_controller), dev);
327 break; 351 break;
352
353 case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_TRAKTORKONTROLX1):
354 ret = add_controls(kontrolx1_controller,
355 ARRAY_SIZE(kontrolx1_controller), dev);
356 break;
328 } 357 }
329 358
330 return ret; 359 return ret;