Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
control.c
Go to the documentation of this file.
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 
20 #include <linux/init.h>
21 #include <linux/usb.h>
22 #include <sound/control.h>
23 #include <sound/core.h>
24 #include <sound/pcm.h>
25 
26 #include "device.h"
27 #include "control.h"
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;
38  int maxval = 63;
39 
40  uinfo->count = 1;
41  pos &= ~CNT_INTVAL;
42 
43  switch (dev->chip.usb_id) {
46  if (pos == 0) {
47  /* current input mode of A8DJ and A4DJ */
49  uinfo->value.integer.min = 0;
50  uinfo->value.integer.max = 2;
51  return 0;
52  }
53  break;
54 
56  maxval = 127;
57  break;
58 
60  maxval = 31;
61  break;
62  }
63 
64  if (is_intval) {
66  uinfo->value.integer.min = 0;
67  uinfo->value.integer.max = maxval;
68  } else {
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;
100  int v = ucontrol->value.integer.value[0];
101  unsigned char cmd = EP1_CMD_WRITE_IO;
102 
103  if (dev->chip.usb_id ==
105  cmd = EP1_CMD_DIMM_LEDS;
106 
107  if (pos & CNT_INTVAL) {
108  int i = pos & ~CNT_INTVAL;
109 
110  dev->control_state[i] = v;
111 
112  if (dev->chip.usb_id ==
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 {
125  dev->control_state, sizeof(dev->control_state));
126  }
127  } else {
128  if (v)
129  dev->control_state[pos / 8] |= 1 << (pos % 8);
130  else
131  dev->control_state[pos / 8] &= ~(1 << (pos % 8));
132 
134  dev->control_state, sizeof(dev->control_state));
135  }
136 
137  return 1;
138 }
139 
140 static struct snd_kcontrol_new kcontrol_template __devinitdata = {
143  .index = 0,
144  .info = control_info,
145  .get = control_get,
146  .put = control_put,
147  /* name and private_value filled later */
148 };
149 
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 },
275  { "Software lock", 40 }
276 };
277 
278 static struct caiaq_controller a4dj_controller[] = {
279  { "Current input mode", 0 | CNT_INTVAL }
280 };
281 
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 
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 
492 static int __devinit add_controls(struct caiaq_controller *c, int num,
493  struct snd_usb_caiaqdev *dev)
494 {
495  int i, ret;
496  struct snd_kcontrol *kc;
497 
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 
511 {
512  int ret = 0;
513 
514  switch (dev->chip.usb_id) {
516  ret = add_controls(ak1_controller,
517  ARRAY_SIZE(ak1_controller), dev);
518  break;
519 
521  ret = add_controls(rk2_controller,
522  ARRAY_SIZE(rk2_controller), dev);
523  break;
524 
526  ret = add_controls(rk3_controller,
527  ARRAY_SIZE(rk3_controller), dev);
528  break;
529 
532  ret = add_controls(kore_controller,
533  ARRAY_SIZE(kore_controller), dev);
534  break;
535 
537  ret = add_controls(a8dj_controller,
538  ARRAY_SIZE(a8dj_controller), dev);
539  break;
540 
542  ret = add_controls(a4dj_controller,
543  ARRAY_SIZE(a4dj_controller), dev);
544  break;
545 
547  ret = add_controls(kontrolx1_controller,
548  ARRAY_SIZE(kontrolx1_controller), dev);
549  break;
550 
552  ret = add_controls(kontrols4_controller,
553  ARRAY_SIZE(kontrols4_controller), dev);
554  break;
555  }
556 
557  return ret;
558 }
559