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