diff options
-rw-r--r-- | sound/usb/caiaq/control.c | 92 | ||||
-rw-r--r-- | sound/usb/caiaq/device.c | 25 | ||||
-rw-r--r-- | sound/usb/caiaq/device.h | 5 |
3 files changed, 122 insertions, 0 deletions
diff --git a/sound/usb/caiaq/control.c b/sound/usb/caiaq/control.c index ae6b50f9ed56..f65fc0987cfb 100644 --- a/sound/usb/caiaq/control.c +++ b/sound/usb/caiaq/control.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include "control.h" | 28 | #include "control.h" |
29 | 29 | ||
30 | #define CNT_INTVAL 0x10000 | 30 | #define CNT_INTVAL 0x10000 |
31 | #define MASCHINE_BANK_SIZE 32 | ||
31 | 32 | ||
32 | static int control_info(struct snd_kcontrol *kcontrol, | 33 | static int control_info(struct snd_kcontrol *kcontrol, |
33 | struct snd_ctl_elem_info *uinfo) | 34 | struct snd_ctl_elem_info *uinfo) |
@@ -105,6 +106,10 @@ static int control_put(struct snd_kcontrol *kcontrol, | |||
105 | USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_TRAKTORKONTROLX1)) | 106 | USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_TRAKTORKONTROLX1)) |
106 | cmd = EP1_CMD_DIMM_LEDS; | 107 | cmd = EP1_CMD_DIMM_LEDS; |
107 | 108 | ||
109 | if (cdev->chip.usb_id == | ||
110 | USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_MASCHINECONTROLLER)) | ||
111 | cmd = EP1_CMD_DIMM_LEDS; | ||
112 | |||
108 | if (pos & CNT_INTVAL) { | 113 | if (pos & CNT_INTVAL) { |
109 | int i = pos & ~CNT_INTVAL; | 114 | int i = pos & ~CNT_INTVAL; |
110 | 115 | ||
@@ -121,6 +126,20 @@ static int control_put(struct snd_kcontrol *kcontrol, | |||
121 | usb_sndbulkpipe(cdev->chip.dev, 8), | 126 | usb_sndbulkpipe(cdev->chip.dev, 8), |
122 | cdev->ep8_out_buf, sizeof(cdev->ep8_out_buf), | 127 | cdev->ep8_out_buf, sizeof(cdev->ep8_out_buf), |
123 | &actual_len, 200); | 128 | &actual_len, 200); |
129 | } else if (cdev->chip.usb_id == | ||
130 | USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_MASCHINECONTROLLER)) { | ||
131 | |||
132 | int bank = 0; | ||
133 | int offset = 0; | ||
134 | |||
135 | if (i >= MASCHINE_BANK_SIZE) { | ||
136 | bank = 0x1e; | ||
137 | offset = MASCHINE_BANK_SIZE; | ||
138 | } | ||
139 | |||
140 | snd_usb_caiaq_send_command_bank(cdev, cmd, bank, | ||
141 | cdev->control_state + offset, | ||
142 | MASCHINE_BANK_SIZE); | ||
124 | } else { | 143 | } else { |
125 | snd_usb_caiaq_send_command(cdev, cmd, | 144 | snd_usb_caiaq_send_command(cdev, cmd, |
126 | cdev->control_state, sizeof(cdev->control_state)); | 145 | cdev->control_state, sizeof(cdev->control_state)); |
@@ -490,6 +509,74 @@ static struct caiaq_controller kontrols4_controller[] = { | |||
490 | { "LED: FX2: Mode", 133 | CNT_INTVAL }, | 509 | { "LED: FX2: Mode", 133 | CNT_INTVAL }, |
491 | }; | 510 | }; |
492 | 511 | ||
512 | static struct caiaq_controller maschine_controller[] = { | ||
513 | { "LED: Pad 1", 3 | CNT_INTVAL }, | ||
514 | { "LED: Pad 2", 2 | CNT_INTVAL }, | ||
515 | { "LED: Pad 3", 1 | CNT_INTVAL }, | ||
516 | { "LED: Pad 4", 0 | CNT_INTVAL }, | ||
517 | { "LED: Pad 5", 7 | CNT_INTVAL }, | ||
518 | { "LED: Pad 6", 6 | CNT_INTVAL }, | ||
519 | { "LED: Pad 7", 5 | CNT_INTVAL }, | ||
520 | { "LED: Pad 8", 4 | CNT_INTVAL }, | ||
521 | { "LED: Pad 9", 11 | CNT_INTVAL }, | ||
522 | { "LED: Pad 10", 10 | CNT_INTVAL }, | ||
523 | { "LED: Pad 11", 9 | CNT_INTVAL }, | ||
524 | { "LED: Pad 12", 8 | CNT_INTVAL }, | ||
525 | { "LED: Pad 13", 15 | CNT_INTVAL }, | ||
526 | { "LED: Pad 14", 14 | CNT_INTVAL }, | ||
527 | { "LED: Pad 15", 13 | CNT_INTVAL }, | ||
528 | { "LED: Pad 16", 12 | CNT_INTVAL }, | ||
529 | |||
530 | { "LED: Mute", 16 | CNT_INTVAL }, | ||
531 | { "LED: Solo", 17 | CNT_INTVAL }, | ||
532 | { "LED: Select", 18 | CNT_INTVAL }, | ||
533 | { "LED: Duplicate", 19 | CNT_INTVAL }, | ||
534 | { "LED: Navigate", 20 | CNT_INTVAL }, | ||
535 | { "LED: Pad Mode", 21 | CNT_INTVAL }, | ||
536 | { "LED: Pattern", 22 | CNT_INTVAL }, | ||
537 | { "LED: Scene", 23 | CNT_INTVAL }, | ||
538 | |||
539 | { "LED: Shift", 24 | CNT_INTVAL }, | ||
540 | { "LED: Erase", 25 | CNT_INTVAL }, | ||
541 | { "LED: Grid", 26 | CNT_INTVAL }, | ||
542 | { "LED: Right Bottom", 27 | CNT_INTVAL }, | ||
543 | { "LED: Rec", 28 | CNT_INTVAL }, | ||
544 | { "LED: Play", 29 | CNT_INTVAL }, | ||
545 | { "LED: Left Bottom", 32 | CNT_INTVAL }, | ||
546 | { "LED: Restart", 33 | CNT_INTVAL }, | ||
547 | |||
548 | { "LED: Group A", 41 | CNT_INTVAL }, | ||
549 | { "LED: Group B", 40 | CNT_INTVAL }, | ||
550 | { "LED: Group C", 37 | CNT_INTVAL }, | ||
551 | { "LED: Group D", 36 | CNT_INTVAL }, | ||
552 | { "LED: Group E", 39 | CNT_INTVAL }, | ||
553 | { "LED: Group F", 38 | CNT_INTVAL }, | ||
554 | { "LED: Group G", 35 | CNT_INTVAL }, | ||
555 | { "LED: Group H", 34 | CNT_INTVAL }, | ||
556 | |||
557 | { "LED: Auto Write", 42 | CNT_INTVAL }, | ||
558 | { "LED: Snap", 43 | CNT_INTVAL }, | ||
559 | { "LED: Right Top", 44 | CNT_INTVAL }, | ||
560 | { "LED: Left Top", 45 | CNT_INTVAL }, | ||
561 | { "LED: Sampling", 46 | CNT_INTVAL }, | ||
562 | { "LED: Browse", 47 | CNT_INTVAL }, | ||
563 | { "LED: Step", 48 | CNT_INTVAL }, | ||
564 | { "LED: Control", 49 | CNT_INTVAL }, | ||
565 | |||
566 | { "LED: Top Button 1", 57 | CNT_INTVAL }, | ||
567 | { "LED: Top Button 2", 56 | CNT_INTVAL }, | ||
568 | { "LED: Top Button 3", 55 | CNT_INTVAL }, | ||
569 | { "LED: Top Button 4", 54 | CNT_INTVAL }, | ||
570 | { "LED: Top Button 5", 53 | CNT_INTVAL }, | ||
571 | { "LED: Top Button 6", 52 | CNT_INTVAL }, | ||
572 | { "LED: Top Button 7", 51 | CNT_INTVAL }, | ||
573 | { "LED: Top Button 8", 50 | CNT_INTVAL }, | ||
574 | |||
575 | { "LED: Note Repeat", 58 | CNT_INTVAL }, | ||
576 | |||
577 | { "Backlight Display", 59 | CNT_INTVAL } | ||
578 | }; | ||
579 | |||
493 | static int add_controls(struct caiaq_controller *c, int num, | 580 | static int add_controls(struct caiaq_controller *c, int num, |
494 | struct snd_usb_caiaqdev *cdev) | 581 | struct snd_usb_caiaqdev *cdev) |
495 | { | 582 | { |
@@ -553,6 +640,11 @@ int snd_usb_caiaq_control_init(struct snd_usb_caiaqdev *cdev) | |||
553 | ret = add_controls(kontrols4_controller, | 640 | ret = add_controls(kontrols4_controller, |
554 | ARRAY_SIZE(kontrols4_controller), cdev); | 641 | ARRAY_SIZE(kontrols4_controller), cdev); |
555 | break; | 642 | break; |
643 | |||
644 | case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_MASCHINECONTROLLER): | ||
645 | ret = add_controls(maschine_controller, | ||
646 | ARRAY_SIZE(maschine_controller), cdev); | ||
647 | break; | ||
556 | } | 648 | } |
557 | 649 | ||
558 | return ret; | 650 | return ret; |
diff --git a/sound/usb/caiaq/device.c b/sound/usb/caiaq/device.c index 1a61dd12fe38..bc55f708a696 100644 --- a/sound/usb/caiaq/device.c +++ b/sound/usb/caiaq/device.c | |||
@@ -235,6 +235,31 @@ int snd_usb_caiaq_send_command(struct snd_usb_caiaqdev *cdev, | |||
235 | cdev->ep1_out_buf, len+1, &actual_len, 200); | 235 | cdev->ep1_out_buf, len+1, &actual_len, 200); |
236 | } | 236 | } |
237 | 237 | ||
238 | int snd_usb_caiaq_send_command_bank(struct snd_usb_caiaqdev *cdev, | ||
239 | unsigned char command, | ||
240 | unsigned char bank, | ||
241 | const unsigned char *buffer, | ||
242 | int len) | ||
243 | { | ||
244 | int actual_len; | ||
245 | struct usb_device *usb_dev = cdev->chip.dev; | ||
246 | |||
247 | if (!usb_dev) | ||
248 | return -EIO; | ||
249 | |||
250 | if (len > EP1_BUFSIZE - 2) | ||
251 | len = EP1_BUFSIZE - 2; | ||
252 | |||
253 | if (buffer && len > 0) | ||
254 | memcpy(cdev->ep1_out_buf+2, buffer, len); | ||
255 | |||
256 | cdev->ep1_out_buf[0] = command; | ||
257 | cdev->ep1_out_buf[1] = bank; | ||
258 | |||
259 | return usb_bulk_msg(usb_dev, usb_sndbulkpipe(usb_dev, 1), | ||
260 | cdev->ep1_out_buf, len+2, &actual_len, 200); | ||
261 | } | ||
262 | |||
238 | int snd_usb_caiaq_set_audio_params (struct snd_usb_caiaqdev *cdev, | 263 | int snd_usb_caiaq_set_audio_params (struct snd_usb_caiaqdev *cdev, |
239 | int rate, int depth, int bpp) | 264 | int rate, int depth, int bpp) |
240 | { | 265 | { |
diff --git a/sound/usb/caiaq/device.h b/sound/usb/caiaq/device.h index ad102fac6942..ab0f7520a99b 100644 --- a/sound/usb/caiaq/device.h +++ b/sound/usb/caiaq/device.h | |||
@@ -128,5 +128,10 @@ int snd_usb_caiaq_send_command(struct snd_usb_caiaqdev *cdev, | |||
128 | unsigned char command, | 128 | unsigned char command, |
129 | const unsigned char *buffer, | 129 | const unsigned char *buffer, |
130 | int len); | 130 | int len); |
131 | int snd_usb_caiaq_send_command_bank(struct snd_usb_caiaqdev *cdev, | ||
132 | unsigned char command, | ||
133 | unsigned char bank, | ||
134 | const unsigned char *buffer, | ||
135 | int len); | ||
131 | 136 | ||
132 | #endif /* CAIAQ_DEVICE_H */ | 137 | #endif /* CAIAQ_DEVICE_H */ |