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