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