1 | // SPDX-License-Identifier: GPL-2.0-or-later |
2 | /* |
3 | * Copyright (c) 2007 Daniel Mack |
4 | * friendly supported by NI. |
5 | */ |
6 | |
7 | #include <linux/device.h> |
8 | #include <linux/init.h> |
9 | #include <linux/usb.h> |
10 | #include <sound/control.h> |
11 | #include <sound/core.h> |
12 | #include <sound/pcm.h> |
13 | |
14 | #include "device.h" |
15 | #include "control.h" |
16 | |
17 | #define CNT_INTVAL 0x10000 |
18 | #define MASCHINE_BANK_SIZE 32 |
19 | |
20 | static int control_info(struct snd_kcontrol *kcontrol, |
21 | struct snd_ctl_elem_info *uinfo) |
22 | { |
23 | struct snd_usb_audio *chip = snd_kcontrol_chip(kcontrol); |
24 | struct snd_usb_caiaqdev *cdev = caiaqdev(chip->card); |
25 | int pos = kcontrol->private_value; |
26 | int is_intval = pos & CNT_INTVAL; |
27 | int maxval = 63; |
28 | |
29 | uinfo->count = 1; |
30 | pos &= ~CNT_INTVAL; |
31 | |
32 | switch (cdev->chip.usb_id) { |
33 | case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AUDIO8DJ): |
34 | case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AUDIO4DJ): |
35 | if (pos == 0) { |
36 | /* current input mode of A8DJ and A4DJ */ |
37 | uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; |
38 | uinfo->value.integer.min = 0; |
39 | uinfo->value.integer.max = 2; |
40 | return 0; |
41 | } |
42 | break; |
43 | |
44 | case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_TRAKTORKONTROLX1): |
45 | maxval = 127; |
46 | break; |
47 | |
48 | case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_TRAKTORKONTROLS4): |
49 | maxval = 31; |
50 | break; |
51 | } |
52 | |
53 | if (is_intval) { |
54 | uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; |
55 | uinfo->value.integer.min = 0; |
56 | uinfo->value.integer.max = maxval; |
57 | } else { |
58 | uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; |
59 | uinfo->value.integer.min = 0; |
60 | uinfo->value.integer.max = 1; |
61 | } |
62 | |
63 | return 0; |
64 | } |
65 | |
66 | static int control_get(struct snd_kcontrol *kcontrol, |
67 | struct snd_ctl_elem_value *ucontrol) |
68 | { |
69 | struct snd_usb_audio *chip = snd_kcontrol_chip(kcontrol); |
70 | struct snd_usb_caiaqdev *cdev = caiaqdev(chip->card); |
71 | int pos = kcontrol->private_value; |
72 | |
73 | if (pos & CNT_INTVAL) |
74 | ucontrol->value.integer.value[0] |
75 | = cdev->control_state[pos & ~CNT_INTVAL]; |
76 | else |
77 | ucontrol->value.integer.value[0] |
78 | = !!(cdev->control_state[pos / 8] & (1 << pos % 8)); |
79 | |
80 | return 0; |
81 | } |
82 | |
83 | static int control_put(struct snd_kcontrol *kcontrol, |
84 | struct snd_ctl_elem_value *ucontrol) |
85 | { |
86 | struct snd_usb_audio *chip = snd_kcontrol_chip(kcontrol); |
87 | struct snd_usb_caiaqdev *cdev = caiaqdev(chip->card); |
88 | int pos = kcontrol->private_value; |
89 | int v = ucontrol->value.integer.value[0]; |
90 | unsigned char cmd; |
91 | |
92 | switch (cdev->chip.usb_id) { |
93 | case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_MASCHINECONTROLLER): |
94 | case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_TRAKTORKONTROLX1): |
95 | case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_KORECONTROLLER2): |
96 | case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_KORECONTROLLER): |
97 | cmd = EP1_CMD_DIMM_LEDS; |
98 | break; |
99 | default: |
100 | cmd = EP1_CMD_WRITE_IO; |
101 | break; |
102 | } |
103 | |
104 | if (pos & CNT_INTVAL) { |
105 | int i = pos & ~CNT_INTVAL; |
106 | |
107 | cdev->control_state[i] = v; |
108 | |
109 | if (cdev->chip.usb_id == |
110 | USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_TRAKTORKONTROLS4)) { |
111 | int actual_len; |
112 | |
113 | cdev->ep8_out_buf[0] = i; |
114 | cdev->ep8_out_buf[1] = v; |
115 | |
116 | usb_bulk_msg(usb_dev: cdev->chip.dev, |
117 | usb_sndbulkpipe(cdev->chip.dev, 8), |
118 | data: cdev->ep8_out_buf, len: sizeof(cdev->ep8_out_buf), |
119 | actual_length: &actual_len, timeout: 200); |
120 | } else if (cdev->chip.usb_id == |
121 | USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_MASCHINECONTROLLER)) { |
122 | |
123 | int bank = 0; |
124 | int offset = 0; |
125 | |
126 | if (i >= MASCHINE_BANK_SIZE) { |
127 | bank = 0x1e; |
128 | offset = MASCHINE_BANK_SIZE; |
129 | } |
130 | |
131 | snd_usb_caiaq_send_command_bank(cdev, command: cmd, bank, |
132 | buffer: cdev->control_state + offset, |
133 | MASCHINE_BANK_SIZE); |
134 | } else { |
135 | snd_usb_caiaq_send_command(cdev, command: cmd, |
136 | buffer: cdev->control_state, len: sizeof(cdev->control_state)); |
137 | } |
138 | } else { |
139 | if (v) |
140 | cdev->control_state[pos / 8] |= 1 << (pos % 8); |
141 | else |
142 | cdev->control_state[pos / 8] &= ~(1 << (pos % 8)); |
143 | |
144 | snd_usb_caiaq_send_command(cdev, command: cmd, |
145 | buffer: cdev->control_state, len: sizeof(cdev->control_state)); |
146 | } |
147 | |
148 | return 1; |
149 | } |
150 | |
151 | static struct snd_kcontrol_new kcontrol_template = { |
152 | .iface = SNDRV_CTL_ELEM_IFACE_HWDEP, |
153 | .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, |
154 | .index = 0, |
155 | .info = control_info, |
156 | .get = control_get, |
157 | .put = control_put, |
158 | /* name and private_value filled later */ |
159 | }; |
160 | |
161 | struct caiaq_controller { |
162 | char *name; |
163 | int index; |
164 | }; |
165 | |
166 | static const struct caiaq_controller ak1_controller[] = { |
167 | { "LED left" , 2 }, |
168 | { "LED middle" , 1 }, |
169 | { "LED right" , 0 }, |
170 | { "LED ring" , 3 } |
171 | }; |
172 | |
173 | static const struct caiaq_controller rk2_controller[] = { |
174 | { "LED 1" , 5 }, |
175 | { "LED 2" , 4 }, |
176 | { "LED 3" , 3 }, |
177 | { "LED 4" , 2 }, |
178 | { "LED 5" , 1 }, |
179 | { "LED 6" , 0 }, |
180 | { "LED pedal" , 6 }, |
181 | { "LED 7seg_1b" , 8 }, |
182 | { "LED 7seg_1c" , 9 }, |
183 | { "LED 7seg_2a" , 10 }, |
184 | { "LED 7seg_2b" , 11 }, |
185 | { "LED 7seg_2c" , 12 }, |
186 | { "LED 7seg_2d" , 13 }, |
187 | { "LED 7seg_2e" , 14 }, |
188 | { "LED 7seg_2f" , 15 }, |
189 | { "LED 7seg_2g" , 16 }, |
190 | { "LED 7seg_3a" , 17 }, |
191 | { "LED 7seg_3b" , 18 }, |
192 | { "LED 7seg_3c" , 19 }, |
193 | { "LED 7seg_3d" , 20 }, |
194 | { "LED 7seg_3e" , 21 }, |
195 | { "LED 7seg_3f" , 22 }, |
196 | { "LED 7seg_3g" , 23 } |
197 | }; |
198 | |
199 | static const struct caiaq_controller rk3_controller[] = { |
200 | { "LED 7seg_1a" , 0 + 0 }, |
201 | { "LED 7seg_1b" , 0 + 1 }, |
202 | { "LED 7seg_1c" , 0 + 2 }, |
203 | { "LED 7seg_1d" , 0 + 3 }, |
204 | { "LED 7seg_1e" , 0 + 4 }, |
205 | { "LED 7seg_1f" , 0 + 5 }, |
206 | { "LED 7seg_1g" , 0 + 6 }, |
207 | { "LED 7seg_1p" , 0 + 7 }, |
208 | |
209 | { "LED 7seg_2a" , 8 + 0 }, |
210 | { "LED 7seg_2b" , 8 + 1 }, |
211 | { "LED 7seg_2c" , 8 + 2 }, |
212 | { "LED 7seg_2d" , 8 + 3 }, |
213 | { "LED 7seg_2e" , 8 + 4 }, |
214 | { "LED 7seg_2f" , 8 + 5 }, |
215 | { "LED 7seg_2g" , 8 + 6 }, |
216 | { "LED 7seg_2p" , 8 + 7 }, |
217 | |
218 | { "LED 7seg_3a" , 16 + 0 }, |
219 | { "LED 7seg_3b" , 16 + 1 }, |
220 | { "LED 7seg_3c" , 16 + 2 }, |
221 | { "LED 7seg_3d" , 16 + 3 }, |
222 | { "LED 7seg_3e" , 16 + 4 }, |
223 | { "LED 7seg_3f" , 16 + 5 }, |
224 | { "LED 7seg_3g" , 16 + 6 }, |
225 | { "LED 7seg_3p" , 16 + 7 }, |
226 | |
227 | { "LED 7seg_4a" , 24 + 0 }, |
228 | { "LED 7seg_4b" , 24 + 1 }, |
229 | { "LED 7seg_4c" , 24 + 2 }, |
230 | { "LED 7seg_4d" , 24 + 3 }, |
231 | { "LED 7seg_4e" , 24 + 4 }, |
232 | { "LED 7seg_4f" , 24 + 5 }, |
233 | { "LED 7seg_4g" , 24 + 6 }, |
234 | { "LED 7seg_4p" , 24 + 7 }, |
235 | |
236 | { "LED 1" , 32 + 0 }, |
237 | { "LED 2" , 32 + 1 }, |
238 | { "LED 3" , 32 + 2 }, |
239 | { "LED 4" , 32 + 3 }, |
240 | { "LED 5" , 32 + 4 }, |
241 | { "LED 6" , 32 + 5 }, |
242 | { "LED 7" , 32 + 6 }, |
243 | { "LED 8" , 32 + 7 }, |
244 | { "LED pedal" , 32 + 8 } |
245 | }; |
246 | |
247 | static const struct caiaq_controller kore_controller[] = { |
248 | { "LED F1" , 8 | CNT_INTVAL }, |
249 | { "LED F2" , 12 | CNT_INTVAL }, |
250 | { "LED F3" , 0 | CNT_INTVAL }, |
251 | { "LED F4" , 4 | CNT_INTVAL }, |
252 | { "LED F5" , 11 | CNT_INTVAL }, |
253 | { "LED F6" , 15 | CNT_INTVAL }, |
254 | { "LED F7" , 3 | CNT_INTVAL }, |
255 | { "LED F8" , 7 | CNT_INTVAL }, |
256 | { "LED touch1" , 10 | CNT_INTVAL }, |
257 | { "LED touch2" , 14 | CNT_INTVAL }, |
258 | { "LED touch3" , 2 | CNT_INTVAL }, |
259 | { "LED touch4" , 6 | CNT_INTVAL }, |
260 | { "LED touch5" , 9 | CNT_INTVAL }, |
261 | { "LED touch6" , 13 | CNT_INTVAL }, |
262 | { "LED touch7" , 1 | CNT_INTVAL }, |
263 | { "LED touch8" , 5 | CNT_INTVAL }, |
264 | { "LED left" , 18 | CNT_INTVAL }, |
265 | { "LED right" , 22 | CNT_INTVAL }, |
266 | { "LED up" , 16 | CNT_INTVAL }, |
267 | { "LED down" , 20 | CNT_INTVAL }, |
268 | { "LED stop" , 23 | CNT_INTVAL }, |
269 | { "LED play" , 21 | CNT_INTVAL }, |
270 | { "LED record" , 19 | CNT_INTVAL }, |
271 | { "LED listen" , 17 | CNT_INTVAL }, |
272 | { "LED lcd" , 30 | CNT_INTVAL }, |
273 | { "LED menu" , 28 | CNT_INTVAL }, |
274 | { "LED sound" , 31 | CNT_INTVAL }, |
275 | { "LED esc" , 29 | CNT_INTVAL }, |
276 | { "LED view" , 27 | CNT_INTVAL }, |
277 | { "LED enter" , 24 | CNT_INTVAL }, |
278 | { "LED control" , 26 | CNT_INTVAL } |
279 | }; |
280 | |
281 | static const struct caiaq_controller a8dj_controller[] = { |
282 | { "Current input mode" , 0 | CNT_INTVAL }, |
283 | { "GND lift for TC Vinyl mode" , 24 + 0 }, |
284 | { "GND lift for TC CD/Line mode" , 24 + 1 }, |
285 | { "GND lift for phono mode" , 24 + 2 }, |
286 | { "Software lock" , 40 } |
287 | }; |
288 | |
289 | static const struct caiaq_controller a4dj_controller[] = { |
290 | { "Current input mode" , 0 | CNT_INTVAL } |
291 | }; |
292 | |
293 | static const struct caiaq_controller kontrolx1_controller[] = { |
294 | { "LED FX A: ON" , 7 | CNT_INTVAL }, |
295 | { "LED FX A: 1" , 6 | CNT_INTVAL }, |
296 | { "LED FX A: 2" , 5 | CNT_INTVAL }, |
297 | { "LED FX A: 3" , 4 | CNT_INTVAL }, |
298 | { "LED FX B: ON" , 3 | CNT_INTVAL }, |
299 | { "LED FX B: 1" , 2 | CNT_INTVAL }, |
300 | { "LED FX B: 2" , 1 | CNT_INTVAL }, |
301 | { "LED FX B: 3" , 0 | CNT_INTVAL }, |
302 | |
303 | { "LED Hotcue" , 28 | CNT_INTVAL }, |
304 | { "LED Shift (white)" , 29 | CNT_INTVAL }, |
305 | { "LED Shift (green)" , 30 | CNT_INTVAL }, |
306 | |
307 | { "LED Deck A: FX1" , 24 | CNT_INTVAL }, |
308 | { "LED Deck A: FX2" , 25 | CNT_INTVAL }, |
309 | { "LED Deck A: IN" , 17 | CNT_INTVAL }, |
310 | { "LED Deck A: OUT" , 16 | CNT_INTVAL }, |
311 | { "LED Deck A: < BEAT" , 19 | CNT_INTVAL }, |
312 | { "LED Deck A: BEAT >" , 18 | CNT_INTVAL }, |
313 | { "LED Deck A: CUE/ABS" , 21 | CNT_INTVAL }, |
314 | { "LED Deck A: CUP/REL" , 20 | CNT_INTVAL }, |
315 | { "LED Deck A: PLAY" , 23 | CNT_INTVAL }, |
316 | { "LED Deck A: SYNC" , 22 | CNT_INTVAL }, |
317 | |
318 | { "LED Deck B: FX1" , 26 | CNT_INTVAL }, |
319 | { "LED Deck B: FX2" , 27 | CNT_INTVAL }, |
320 | { "LED Deck B: IN" , 15 | CNT_INTVAL }, |
321 | { "LED Deck B: OUT" , 14 | CNT_INTVAL }, |
322 | { "LED Deck B: < BEAT" , 13 | CNT_INTVAL }, |
323 | { "LED Deck B: BEAT >" , 12 | CNT_INTVAL }, |
324 | { "LED Deck B: CUE/ABS" , 11 | CNT_INTVAL }, |
325 | { "LED Deck B: CUP/REL" , 10 | CNT_INTVAL }, |
326 | { "LED Deck B: PLAY" , 9 | CNT_INTVAL }, |
327 | { "LED Deck B: SYNC" , 8 | CNT_INTVAL }, |
328 | }; |
329 | |
330 | static const struct caiaq_controller kontrols4_controller[] = { |
331 | { "LED: Master: Quant" , 10 | CNT_INTVAL }, |
332 | { "LED: Master: Headphone" , 11 | CNT_INTVAL }, |
333 | { "LED: Master: Master" , 12 | CNT_INTVAL }, |
334 | { "LED: Master: Snap" , 14 | CNT_INTVAL }, |
335 | { "LED: Master: Warning" , 15 | CNT_INTVAL }, |
336 | { "LED: Master: Master button" , 112 | CNT_INTVAL }, |
337 | { "LED: Master: Snap button" , 113 | CNT_INTVAL }, |
338 | { "LED: Master: Rec" , 118 | CNT_INTVAL }, |
339 | { "LED: Master: Size" , 119 | CNT_INTVAL }, |
340 | { "LED: Master: Quant button" , 120 | CNT_INTVAL }, |
341 | { "LED: Master: Browser button" , 121 | CNT_INTVAL }, |
342 | { "LED: Master: Play button" , 126 | CNT_INTVAL }, |
343 | { "LED: Master: Undo button" , 127 | CNT_INTVAL }, |
344 | |
345 | { "LED: Channel A: >" , 4 | CNT_INTVAL }, |
346 | { "LED: Channel A: <" , 5 | CNT_INTVAL }, |
347 | { "LED: Channel A: Meter 1" , 97 | CNT_INTVAL }, |
348 | { "LED: Channel A: Meter 2" , 98 | CNT_INTVAL }, |
349 | { "LED: Channel A: Meter 3" , 99 | CNT_INTVAL }, |
350 | { "LED: Channel A: Meter 4" , 100 | CNT_INTVAL }, |
351 | { "LED: Channel A: Meter 5" , 101 | CNT_INTVAL }, |
352 | { "LED: Channel A: Meter 6" , 102 | CNT_INTVAL }, |
353 | { "LED: Channel A: Meter clip" , 103 | CNT_INTVAL }, |
354 | { "LED: Channel A: Active" , 114 | CNT_INTVAL }, |
355 | { "LED: Channel A: Cue" , 116 | CNT_INTVAL }, |
356 | { "LED: Channel A: FX1" , 149 | CNT_INTVAL }, |
357 | { "LED: Channel A: FX2" , 148 | CNT_INTVAL }, |
358 | |
359 | { "LED: Channel B: >" , 2 | CNT_INTVAL }, |
360 | { "LED: Channel B: <" , 3 | CNT_INTVAL }, |
361 | { "LED: Channel B: Meter 1" , 89 | CNT_INTVAL }, |
362 | { "LED: Channel B: Meter 2" , 90 | CNT_INTVAL }, |
363 | { "LED: Channel B: Meter 3" , 91 | CNT_INTVAL }, |
364 | { "LED: Channel B: Meter 4" , 92 | CNT_INTVAL }, |
365 | { "LED: Channel B: Meter 5" , 93 | CNT_INTVAL }, |
366 | { "LED: Channel B: Meter 6" , 94 | CNT_INTVAL }, |
367 | { "LED: Channel B: Meter clip" , 95 | CNT_INTVAL }, |
368 | { "LED: Channel B: Active" , 122 | CNT_INTVAL }, |
369 | { "LED: Channel B: Cue" , 125 | CNT_INTVAL }, |
370 | { "LED: Channel B: FX1" , 147 | CNT_INTVAL }, |
371 | { "LED: Channel B: FX2" , 146 | CNT_INTVAL }, |
372 | |
373 | { "LED: Channel C: >" , 6 | CNT_INTVAL }, |
374 | { "LED: Channel C: <" , 7 | CNT_INTVAL }, |
375 | { "LED: Channel C: Meter 1" , 105 | CNT_INTVAL }, |
376 | { "LED: Channel C: Meter 2" , 106 | CNT_INTVAL }, |
377 | { "LED: Channel C: Meter 3" , 107 | CNT_INTVAL }, |
378 | { "LED: Channel C: Meter 4" , 108 | CNT_INTVAL }, |
379 | { "LED: Channel C: Meter 5" , 109 | CNT_INTVAL }, |
380 | { "LED: Channel C: Meter 6" , 110 | CNT_INTVAL }, |
381 | { "LED: Channel C: Meter clip" , 111 | CNT_INTVAL }, |
382 | { "LED: Channel C: Active" , 115 | CNT_INTVAL }, |
383 | { "LED: Channel C: Cue" , 117 | CNT_INTVAL }, |
384 | { "LED: Channel C: FX1" , 151 | CNT_INTVAL }, |
385 | { "LED: Channel C: FX2" , 150 | CNT_INTVAL }, |
386 | |
387 | { "LED: Channel D: >" , 0 | CNT_INTVAL }, |
388 | { "LED: Channel D: <" , 1 | CNT_INTVAL }, |
389 | { "LED: Channel D: Meter 1" , 81 | CNT_INTVAL }, |
390 | { "LED: Channel D: Meter 2" , 82 | CNT_INTVAL }, |
391 | { "LED: Channel D: Meter 3" , 83 | CNT_INTVAL }, |
392 | { "LED: Channel D: Meter 4" , 84 | CNT_INTVAL }, |
393 | { "LED: Channel D: Meter 5" , 85 | CNT_INTVAL }, |
394 | { "LED: Channel D: Meter 6" , 86 | CNT_INTVAL }, |
395 | { "LED: Channel D: Meter clip" , 87 | CNT_INTVAL }, |
396 | { "LED: Channel D: Active" , 123 | CNT_INTVAL }, |
397 | { "LED: Channel D: Cue" , 124 | CNT_INTVAL }, |
398 | { "LED: Channel D: FX1" , 145 | CNT_INTVAL }, |
399 | { "LED: Channel D: FX2" , 144 | CNT_INTVAL }, |
400 | |
401 | { "LED: Deck A: 1 (blue)" , 22 | CNT_INTVAL }, |
402 | { "LED: Deck A: 1 (green)" , 23 | CNT_INTVAL }, |
403 | { "LED: Deck A: 2 (blue)" , 20 | CNT_INTVAL }, |
404 | { "LED: Deck A: 2 (green)" , 21 | CNT_INTVAL }, |
405 | { "LED: Deck A: 3 (blue)" , 18 | CNT_INTVAL }, |
406 | { "LED: Deck A: 3 (green)" , 19 | CNT_INTVAL }, |
407 | { "LED: Deck A: 4 (blue)" , 16 | CNT_INTVAL }, |
408 | { "LED: Deck A: 4 (green)" , 17 | CNT_INTVAL }, |
409 | { "LED: Deck A: Load" , 44 | CNT_INTVAL }, |
410 | { "LED: Deck A: Deck C button" , 45 | CNT_INTVAL }, |
411 | { "LED: Deck A: In" , 47 | CNT_INTVAL }, |
412 | { "LED: Deck A: Out" , 46 | CNT_INTVAL }, |
413 | { "LED: Deck A: Shift" , 24 | CNT_INTVAL }, |
414 | { "LED: Deck A: Sync" , 27 | CNT_INTVAL }, |
415 | { "LED: Deck A: Cue" , 26 | CNT_INTVAL }, |
416 | { "LED: Deck A: Play" , 25 | CNT_INTVAL }, |
417 | { "LED: Deck A: Tempo up" , 33 | CNT_INTVAL }, |
418 | { "LED: Deck A: Tempo down" , 32 | CNT_INTVAL }, |
419 | { "LED: Deck A: Master" , 34 | CNT_INTVAL }, |
420 | { "LED: Deck A: Keylock" , 35 | CNT_INTVAL }, |
421 | { "LED: Deck A: Deck A" , 37 | CNT_INTVAL }, |
422 | { "LED: Deck A: Deck C" , 36 | CNT_INTVAL }, |
423 | { "LED: Deck A: Samples" , 38 | CNT_INTVAL }, |
424 | { "LED: Deck A: On Air" , 39 | CNT_INTVAL }, |
425 | { "LED: Deck A: Sample 1" , 31 | CNT_INTVAL }, |
426 | { "LED: Deck A: Sample 2" , 30 | CNT_INTVAL }, |
427 | { "LED: Deck A: Sample 3" , 29 | CNT_INTVAL }, |
428 | { "LED: Deck A: Sample 4" , 28 | CNT_INTVAL }, |
429 | { "LED: Deck A: Digit 1 - A" , 55 | CNT_INTVAL }, |
430 | { "LED: Deck A: Digit 1 - B" , 54 | CNT_INTVAL }, |
431 | { "LED: Deck A: Digit 1 - C" , 53 | CNT_INTVAL }, |
432 | { "LED: Deck A: Digit 1 - D" , 52 | CNT_INTVAL }, |
433 | { "LED: Deck A: Digit 1 - E" , 51 | CNT_INTVAL }, |
434 | { "LED: Deck A: Digit 1 - F" , 50 | CNT_INTVAL }, |
435 | { "LED: Deck A: Digit 1 - G" , 49 | CNT_INTVAL }, |
436 | { "LED: Deck A: Digit 1 - dot" , 48 | CNT_INTVAL }, |
437 | { "LED: Deck A: Digit 2 - A" , 63 | CNT_INTVAL }, |
438 | { "LED: Deck A: Digit 2 - B" , 62 | CNT_INTVAL }, |
439 | { "LED: Deck A: Digit 2 - C" , 61 | CNT_INTVAL }, |
440 | { "LED: Deck A: Digit 2 - D" , 60 | CNT_INTVAL }, |
441 | { "LED: Deck A: Digit 2 - E" , 59 | CNT_INTVAL }, |
442 | { "LED: Deck A: Digit 2 - F" , 58 | CNT_INTVAL }, |
443 | { "LED: Deck A: Digit 2 - G" , 57 | CNT_INTVAL }, |
444 | { "LED: Deck A: Digit 2 - dot" , 56 | CNT_INTVAL }, |
445 | |
446 | { "LED: Deck B: 1 (blue)" , 78 | CNT_INTVAL }, |
447 | { "LED: Deck B: 1 (green)" , 79 | CNT_INTVAL }, |
448 | { "LED: Deck B: 2 (blue)" , 76 | CNT_INTVAL }, |
449 | { "LED: Deck B: 2 (green)" , 77 | CNT_INTVAL }, |
450 | { "LED: Deck B: 3 (blue)" , 74 | CNT_INTVAL }, |
451 | { "LED: Deck B: 3 (green)" , 75 | CNT_INTVAL }, |
452 | { "LED: Deck B: 4 (blue)" , 72 | CNT_INTVAL }, |
453 | { "LED: Deck B: 4 (green)" , 73 | CNT_INTVAL }, |
454 | { "LED: Deck B: Load" , 180 | CNT_INTVAL }, |
455 | { "LED: Deck B: Deck D button" , 181 | CNT_INTVAL }, |
456 | { "LED: Deck B: In" , 183 | CNT_INTVAL }, |
457 | { "LED: Deck B: Out" , 182 | CNT_INTVAL }, |
458 | { "LED: Deck B: Shift" , 64 | CNT_INTVAL }, |
459 | { "LED: Deck B: Sync" , 67 | CNT_INTVAL }, |
460 | { "LED: Deck B: Cue" , 66 | CNT_INTVAL }, |
461 | { "LED: Deck B: Play" , 65 | CNT_INTVAL }, |
462 | { "LED: Deck B: Tempo up" , 185 | CNT_INTVAL }, |
463 | { "LED: Deck B: Tempo down" , 184 | CNT_INTVAL }, |
464 | { "LED: Deck B: Master" , 186 | CNT_INTVAL }, |
465 | { "LED: Deck B: Keylock" , 187 | CNT_INTVAL }, |
466 | { "LED: Deck B: Deck B" , 189 | CNT_INTVAL }, |
467 | { "LED: Deck B: Deck D" , 188 | CNT_INTVAL }, |
468 | { "LED: Deck B: Samples" , 190 | CNT_INTVAL }, |
469 | { "LED: Deck B: On Air" , 191 | CNT_INTVAL }, |
470 | { "LED: Deck B: Sample 1" , 71 | CNT_INTVAL }, |
471 | { "LED: Deck B: Sample 2" , 70 | CNT_INTVAL }, |
472 | { "LED: Deck B: Sample 3" , 69 | CNT_INTVAL }, |
473 | { "LED: Deck B: Sample 4" , 68 | CNT_INTVAL }, |
474 | { "LED: Deck B: Digit 1 - A" , 175 | CNT_INTVAL }, |
475 | { "LED: Deck B: Digit 1 - B" , 174 | CNT_INTVAL }, |
476 | { "LED: Deck B: Digit 1 - C" , 173 | CNT_INTVAL }, |
477 | { "LED: Deck B: Digit 1 - D" , 172 | CNT_INTVAL }, |
478 | { "LED: Deck B: Digit 1 - E" , 171 | CNT_INTVAL }, |
479 | { "LED: Deck B: Digit 1 - F" , 170 | CNT_INTVAL }, |
480 | { "LED: Deck B: Digit 1 - G" , 169 | CNT_INTVAL }, |
481 | { "LED: Deck B: Digit 1 - dot" , 168 | CNT_INTVAL }, |
482 | { "LED: Deck B: Digit 2 - A" , 167 | CNT_INTVAL }, |
483 | { "LED: Deck B: Digit 2 - B" , 166 | CNT_INTVAL }, |
484 | { "LED: Deck B: Digit 2 - C" , 165 | CNT_INTVAL }, |
485 | { "LED: Deck B: Digit 2 - D" , 164 | CNT_INTVAL }, |
486 | { "LED: Deck B: Digit 2 - E" , 163 | CNT_INTVAL }, |
487 | { "LED: Deck B: Digit 2 - F" , 162 | CNT_INTVAL }, |
488 | { "LED: Deck B: Digit 2 - G" , 161 | CNT_INTVAL }, |
489 | { "LED: Deck B: Digit 2 - dot" , 160 | CNT_INTVAL }, |
490 | |
491 | { "LED: FX1: dry/wet" , 153 | CNT_INTVAL }, |
492 | { "LED: FX1: 1" , 154 | CNT_INTVAL }, |
493 | { "LED: FX1: 2" , 155 | CNT_INTVAL }, |
494 | { "LED: FX1: 3" , 156 | CNT_INTVAL }, |
495 | { "LED: FX1: Mode" , 157 | CNT_INTVAL }, |
496 | { "LED: FX2: dry/wet" , 129 | CNT_INTVAL }, |
497 | { "LED: FX2: 1" , 130 | CNT_INTVAL }, |
498 | { "LED: FX2: 2" , 131 | CNT_INTVAL }, |
499 | { "LED: FX2: 3" , 132 | CNT_INTVAL }, |
500 | { "LED: FX2: Mode" , 133 | CNT_INTVAL }, |
501 | }; |
502 | |
503 | static const struct caiaq_controller maschine_controller[] = { |
504 | { "LED: Pad 1" , 3 | CNT_INTVAL }, |
505 | { "LED: Pad 2" , 2 | CNT_INTVAL }, |
506 | { "LED: Pad 3" , 1 | CNT_INTVAL }, |
507 | { "LED: Pad 4" , 0 | CNT_INTVAL }, |
508 | { "LED: Pad 5" , 7 | CNT_INTVAL }, |
509 | { "LED: Pad 6" , 6 | CNT_INTVAL }, |
510 | { "LED: Pad 7" , 5 | CNT_INTVAL }, |
511 | { "LED: Pad 8" , 4 | CNT_INTVAL }, |
512 | { "LED: Pad 9" , 11 | CNT_INTVAL }, |
513 | { "LED: Pad 10" , 10 | CNT_INTVAL }, |
514 | { "LED: Pad 11" , 9 | CNT_INTVAL }, |
515 | { "LED: Pad 12" , 8 | CNT_INTVAL }, |
516 | { "LED: Pad 13" , 15 | CNT_INTVAL }, |
517 | { "LED: Pad 14" , 14 | CNT_INTVAL }, |
518 | { "LED: Pad 15" , 13 | CNT_INTVAL }, |
519 | { "LED: Pad 16" , 12 | CNT_INTVAL }, |
520 | |
521 | { "LED: Mute" , 16 | CNT_INTVAL }, |
522 | { "LED: Solo" , 17 | CNT_INTVAL }, |
523 | { "LED: Select" , 18 | CNT_INTVAL }, |
524 | { "LED: Duplicate" , 19 | CNT_INTVAL }, |
525 | { "LED: Navigate" , 20 | CNT_INTVAL }, |
526 | { "LED: Pad Mode" , 21 | CNT_INTVAL }, |
527 | { "LED: Pattern" , 22 | CNT_INTVAL }, |
528 | { "LED: Scene" , 23 | CNT_INTVAL }, |
529 | |
530 | { "LED: Shift" , 24 | CNT_INTVAL }, |
531 | { "LED: Erase" , 25 | CNT_INTVAL }, |
532 | { "LED: Grid" , 26 | CNT_INTVAL }, |
533 | { "LED: Right Bottom" , 27 | CNT_INTVAL }, |
534 | { "LED: Rec" , 28 | CNT_INTVAL }, |
535 | { "LED: Play" , 29 | CNT_INTVAL }, |
536 | { "LED: Left Bottom" , 32 | CNT_INTVAL }, |
537 | { "LED: Restart" , 33 | CNT_INTVAL }, |
538 | |
539 | { "LED: Group A" , 41 | CNT_INTVAL }, |
540 | { "LED: Group B" , 40 | CNT_INTVAL }, |
541 | { "LED: Group C" , 37 | CNT_INTVAL }, |
542 | { "LED: Group D" , 36 | CNT_INTVAL }, |
543 | { "LED: Group E" , 39 | CNT_INTVAL }, |
544 | { "LED: Group F" , 38 | CNT_INTVAL }, |
545 | { "LED: Group G" , 35 | CNT_INTVAL }, |
546 | { "LED: Group H" , 34 | CNT_INTVAL }, |
547 | |
548 | { "LED: Auto Write" , 42 | CNT_INTVAL }, |
549 | { "LED: Snap" , 43 | CNT_INTVAL }, |
550 | { "LED: Right Top" , 44 | CNT_INTVAL }, |
551 | { "LED: Left Top" , 45 | CNT_INTVAL }, |
552 | { "LED: Sampling" , 46 | CNT_INTVAL }, |
553 | { "LED: Browse" , 47 | CNT_INTVAL }, |
554 | { "LED: Step" , 48 | CNT_INTVAL }, |
555 | { "LED: Control" , 49 | CNT_INTVAL }, |
556 | |
557 | { "LED: Top Button 1" , 57 | CNT_INTVAL }, |
558 | { "LED: Top Button 2" , 56 | CNT_INTVAL }, |
559 | { "LED: Top Button 3" , 55 | CNT_INTVAL }, |
560 | { "LED: Top Button 4" , 54 | CNT_INTVAL }, |
561 | { "LED: Top Button 5" , 53 | CNT_INTVAL }, |
562 | { "LED: Top Button 6" , 52 | CNT_INTVAL }, |
563 | { "LED: Top Button 7" , 51 | CNT_INTVAL }, |
564 | { "LED: Top Button 8" , 50 | CNT_INTVAL }, |
565 | |
566 | { "LED: Note Repeat" , 58 | CNT_INTVAL }, |
567 | |
568 | { "Backlight Display" , 59 | CNT_INTVAL } |
569 | }; |
570 | |
571 | static int add_controls(const struct caiaq_controller *c, int num, |
572 | struct snd_usb_caiaqdev *cdev) |
573 | { |
574 | int i, ret; |
575 | struct snd_kcontrol *kc; |
576 | |
577 | for (i = 0; i < num; i++, c++) { |
578 | kcontrol_template.name = c->name; |
579 | kcontrol_template.private_value = c->index; |
580 | kc = snd_ctl_new1(kcontrolnew: &kcontrol_template, private_data: cdev); |
581 | ret = snd_ctl_add(card: cdev->chip.card, kcontrol: kc); |
582 | if (ret < 0) |
583 | return ret; |
584 | } |
585 | |
586 | return 0; |
587 | } |
588 | |
589 | int snd_usb_caiaq_control_init(struct snd_usb_caiaqdev *cdev) |
590 | { |
591 | int ret = 0; |
592 | |
593 | switch (cdev->chip.usb_id) { |
594 | case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AK1): |
595 | ret = add_controls(c: ak1_controller, |
596 | ARRAY_SIZE(ak1_controller), cdev); |
597 | break; |
598 | |
599 | case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_RIGKONTROL2): |
600 | ret = add_controls(c: rk2_controller, |
601 | ARRAY_SIZE(rk2_controller), cdev); |
602 | break; |
603 | |
604 | case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_RIGKONTROL3): |
605 | ret = add_controls(c: rk3_controller, |
606 | ARRAY_SIZE(rk3_controller), cdev); |
607 | break; |
608 | |
609 | case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_KORECONTROLLER): |
610 | case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_KORECONTROLLER2): |
611 | ret = add_controls(c: kore_controller, |
612 | ARRAY_SIZE(kore_controller), cdev); |
613 | break; |
614 | |
615 | case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AUDIO8DJ): |
616 | ret = add_controls(c: a8dj_controller, |
617 | ARRAY_SIZE(a8dj_controller), cdev); |
618 | break; |
619 | |
620 | case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AUDIO4DJ): |
621 | ret = add_controls(c: a4dj_controller, |
622 | ARRAY_SIZE(a4dj_controller), cdev); |
623 | break; |
624 | |
625 | case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_TRAKTORKONTROLX1): |
626 | ret = add_controls(c: kontrolx1_controller, |
627 | ARRAY_SIZE(kontrolx1_controller), cdev); |
628 | break; |
629 | |
630 | case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_TRAKTORKONTROLS4): |
631 | ret = add_controls(c: kontrols4_controller, |
632 | ARRAY_SIZE(kontrols4_controller), cdev); |
633 | break; |
634 | |
635 | case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_MASCHINECONTROLLER): |
636 | ret = add_controls(c: maschine_controller, |
637 | ARRAY_SIZE(maschine_controller), cdev); |
638 | break; |
639 | } |
640 | |
641 | return ret; |
642 | } |
643 | |
644 | |