[alsa-devel] [PATCH] caiaq: LED support for Maschine Controller
This patch adds LED support for the Native Instruments Maschine Controller. It adds ALSA controls for dimming the LEDs of all buttons and the backlight of the two displays.
Signed-off-by: Hannes Gräuler hgraeule@uos.de --- sound/usb/caiaq/control.c | 92 +++++++++++++++++++++++++++++++++++++++++++++++ sound/usb/caiaq/device.c | 25 +++++++++++++ sound/usb/caiaq/device.h | 5 +++ 3 files changed, 122 insertions(+)
diff --git a/sound/usb/caiaq/control.c b/sound/usb/caiaq/control.c index ae6b50f..f65fc09 100644 --- a/sound/usb/caiaq/control.c +++ b/sound/usb/caiaq/control.c @@ -28,6 +28,7 @@ #include "control.h"
#define CNT_INTVAL 0x10000 +#define MASCHINE_BANK_SIZE 32
static int control_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) @@ -105,6 +106,10 @@ static int control_put(struct snd_kcontrol *kcontrol, USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_TRAKTORKONTROLX1)) cmd = EP1_CMD_DIMM_LEDS;
+ if (cdev->chip.usb_id == + USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_MASCHINECONTROLLER)) + cmd = EP1_CMD_DIMM_LEDS; + if (pos & CNT_INTVAL) { int i = pos & ~CNT_INTVAL;
@@ -121,6 +126,20 @@ static int control_put(struct snd_kcontrol *kcontrol, usb_sndbulkpipe(cdev->chip.dev, 8), cdev->ep8_out_buf, sizeof(cdev->ep8_out_buf), &actual_len, 200); + } else if (cdev->chip.usb_id == + USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_MASCHINECONTROLLER)) { + + int bank = 0; + int offset = 0; + + if (i >= MASCHINE_BANK_SIZE) { + bank = 0x1e; + offset = MASCHINE_BANK_SIZE; + } + + snd_usb_caiaq_send_command_bank(cdev, cmd, bank, + cdev->control_state + offset, + MASCHINE_BANK_SIZE); } else { snd_usb_caiaq_send_command(cdev, cmd, cdev->control_state, sizeof(cdev->control_state)); @@ -490,6 +509,74 @@ static struct caiaq_controller kontrols4_controller[] = { { "LED: FX2: Mode", 133 | CNT_INTVAL }, };
+static struct caiaq_controller maschine_controller[] = { + { "LED: Pad 1", 3 | CNT_INTVAL }, + { "LED: Pad 2", 2 | CNT_INTVAL }, + { "LED: Pad 3", 1 | CNT_INTVAL }, + { "LED: Pad 4", 0 | CNT_INTVAL }, + { "LED: Pad 5", 7 | CNT_INTVAL }, + { "LED: Pad 6", 6 | CNT_INTVAL }, + { "LED: Pad 7", 5 | CNT_INTVAL }, + { "LED: Pad 8", 4 | CNT_INTVAL }, + { "LED: Pad 9", 11 | CNT_INTVAL }, + { "LED: Pad 10", 10 | CNT_INTVAL }, + { "LED: Pad 11", 9 | CNT_INTVAL }, + { "LED: Pad 12", 8 | CNT_INTVAL }, + { "LED: Pad 13", 15 | CNT_INTVAL }, + { "LED: Pad 14", 14 | CNT_INTVAL }, + { "LED: Pad 15", 13 | CNT_INTVAL }, + { "LED: Pad 16", 12 | CNT_INTVAL }, + + { "LED: Mute", 16 | CNT_INTVAL }, + { "LED: Solo", 17 | CNT_INTVAL }, + { "LED: Select", 18 | CNT_INTVAL }, + { "LED: Duplicate", 19 | CNT_INTVAL }, + { "LED: Navigate", 20 | CNT_INTVAL }, + { "LED: Pad Mode", 21 | CNT_INTVAL }, + { "LED: Pattern", 22 | CNT_INTVAL }, + { "LED: Scene", 23 | CNT_INTVAL }, + + { "LED: Shift", 24 | CNT_INTVAL }, + { "LED: Erase", 25 | CNT_INTVAL }, + { "LED: Grid", 26 | CNT_INTVAL }, + { "LED: Right Bottom", 27 | CNT_INTVAL }, + { "LED: Rec", 28 | CNT_INTVAL }, + { "LED: Play", 29 | CNT_INTVAL }, + { "LED: Left Bottom", 32 | CNT_INTVAL }, + { "LED: Restart", 33 | CNT_INTVAL }, + + { "LED: Group A", 41 | CNT_INTVAL }, + { "LED: Group B", 40 | CNT_INTVAL }, + { "LED: Group C", 37 | CNT_INTVAL }, + { "LED: Group D", 36 | CNT_INTVAL }, + { "LED: Group E", 39 | CNT_INTVAL }, + { "LED: Group F", 38 | CNT_INTVAL }, + { "LED: Group G", 35 | CNT_INTVAL }, + { "LED: Group H", 34 | CNT_INTVAL }, + + { "LED: Auto Write", 42 | CNT_INTVAL }, + { "LED: Snap", 43 | CNT_INTVAL }, + { "LED: Right Top", 44 | CNT_INTVAL }, + { "LED: Left Top", 45 | CNT_INTVAL }, + { "LED: Sampling", 46 | CNT_INTVAL }, + { "LED: Browse", 47 | CNT_INTVAL }, + { "LED: Step", 48 | CNT_INTVAL }, + { "LED: Control", 49 | CNT_INTVAL }, + + { "LED: Top Button 1", 57 | CNT_INTVAL }, + { "LED: Top Button 2", 56 | CNT_INTVAL }, + { "LED: Top Button 3", 55 | CNT_INTVAL }, + { "LED: Top Button 4", 54 | CNT_INTVAL }, + { "LED: Top Button 5", 53 | CNT_INTVAL }, + { "LED: Top Button 6", 52 | CNT_INTVAL }, + { "LED: Top Button 7", 51 | CNT_INTVAL }, + { "LED: Top Button 8", 50 | CNT_INTVAL }, + + { "LED: Note Repeat", 58 | CNT_INTVAL }, + + { "Backlight Display", 59 | CNT_INTVAL } +}; + static int add_controls(struct caiaq_controller *c, int num, struct snd_usb_caiaqdev *cdev) { @@ -553,6 +640,11 @@ int snd_usb_caiaq_control_init(struct snd_usb_caiaqdev *cdev) ret = add_controls(kontrols4_controller, ARRAY_SIZE(kontrols4_controller), cdev); break; + + case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_MASCHINECONTROLLER): + ret = add_controls(maschine_controller, + ARRAY_SIZE(maschine_controller), cdev); + break; }
return ret; diff --git a/sound/usb/caiaq/device.c b/sound/usb/caiaq/device.c index 1a61dd1..bc55f70 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, cdev->ep1_out_buf, len+1, &actual_len, 200); }
+int snd_usb_caiaq_send_command_bank(struct snd_usb_caiaqdev *cdev, + unsigned char command, + unsigned char bank, + const unsigned char *buffer, + int len) +{ + int actual_len; + struct usb_device *usb_dev = cdev->chip.dev; + + if (!usb_dev) + return -EIO; + + if (len > EP1_BUFSIZE - 2) + len = EP1_BUFSIZE - 2; + + if (buffer && len > 0) + memcpy(cdev->ep1_out_buf+2, buffer, len); + + cdev->ep1_out_buf[0] = command; + cdev->ep1_out_buf[1] = bank; + + return usb_bulk_msg(usb_dev, usb_sndbulkpipe(usb_dev, 1), + cdev->ep1_out_buf, len+2, &actual_len, 200); +} + int snd_usb_caiaq_set_audio_params (struct snd_usb_caiaqdev *cdev, int rate, int depth, int bpp) { diff --git a/sound/usb/caiaq/device.h b/sound/usb/caiaq/device.h index ad102fa..ab0f752 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, unsigned char command, const unsigned char *buffer, int len); +int snd_usb_caiaq_send_command_bank(struct snd_usb_caiaqdev *cdev, + unsigned char command, + unsigned char bank, + const unsigned char *buffer, + int len);
#endif /* CAIAQ_DEVICE_H */
Hi Hannes,
On 28.09.2013 21:51, Hannes Gräuler wrote:
This patch adds LED support for the Native Instruments Maschine Controller. It adds ALSA controls for dimming the LEDs of all buttons and the backlight of the two displays.
Thanks a lot for doing this! The patch subject has to be amended to "ALSA: snd-usb-caiaq: ...", but other than that, this looks all fine to me.
Can you resend with my
Acked-by: Daniel Mack zonque@gmail.com
please?
Best regards, Daniel
Signed-off-by: Hannes Gräuler hgraeule@uos.de
sound/usb/caiaq/control.c | 92 +++++++++++++++++++++++++++++++++++++++++++++++ sound/usb/caiaq/device.c | 25 +++++++++++++ sound/usb/caiaq/device.h | 5 +++ 3 files changed, 122 insertions(+)
diff --git a/sound/usb/caiaq/control.c b/sound/usb/caiaq/control.c index ae6b50f..f65fc09 100644 --- a/sound/usb/caiaq/control.c +++ b/sound/usb/caiaq/control.c @@ -28,6 +28,7 @@ #include "control.h"
#define CNT_INTVAL 0x10000 +#define MASCHINE_BANK_SIZE 32
static int control_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) @@ -105,6 +106,10 @@ static int control_put(struct snd_kcontrol *kcontrol, USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_TRAKTORKONTROLX1)) cmd = EP1_CMD_DIMM_LEDS;
- if (cdev->chip.usb_id ==
USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_MASCHINECONTROLLER))
cmd = EP1_CMD_DIMM_LEDS;
- if (pos & CNT_INTVAL) { int i = pos & ~CNT_INTVAL;
@@ -121,6 +126,20 @@ static int control_put(struct snd_kcontrol *kcontrol, usb_sndbulkpipe(cdev->chip.dev, 8), cdev->ep8_out_buf, sizeof(cdev->ep8_out_buf), &actual_len, 200);
} else if (cdev->chip.usb_id ==
USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_MASCHINECONTROLLER)) {
int bank = 0;
int offset = 0;
if (i >= MASCHINE_BANK_SIZE) {
bank = 0x1e;
offset = MASCHINE_BANK_SIZE;
}
snd_usb_caiaq_send_command_bank(cdev, cmd, bank,
cdev->control_state + offset,
} else { snd_usb_caiaq_send_command(cdev, cmd, cdev->control_state, sizeof(cdev->control_state));MASCHINE_BANK_SIZE);
@@ -490,6 +509,74 @@ static struct caiaq_controller kontrols4_controller[] = { { "LED: FX2: Mode", 133 | CNT_INTVAL }, };
+static struct caiaq_controller maschine_controller[] = {
- { "LED: Pad 1", 3 | CNT_INTVAL },
- { "LED: Pad 2", 2 | CNT_INTVAL },
- { "LED: Pad 3", 1 | CNT_INTVAL },
- { "LED: Pad 4", 0 | CNT_INTVAL },
- { "LED: Pad 5", 7 | CNT_INTVAL },
- { "LED: Pad 6", 6 | CNT_INTVAL },
- { "LED: Pad 7", 5 | CNT_INTVAL },
- { "LED: Pad 8", 4 | CNT_INTVAL },
- { "LED: Pad 9", 11 | CNT_INTVAL },
- { "LED: Pad 10", 10 | CNT_INTVAL },
- { "LED: Pad 11", 9 | CNT_INTVAL },
- { "LED: Pad 12", 8 | CNT_INTVAL },
- { "LED: Pad 13", 15 | CNT_INTVAL },
- { "LED: Pad 14", 14 | CNT_INTVAL },
- { "LED: Pad 15", 13 | CNT_INTVAL },
- { "LED: Pad 16", 12 | CNT_INTVAL },
- { "LED: Mute", 16 | CNT_INTVAL },
- { "LED: Solo", 17 | CNT_INTVAL },
- { "LED: Select", 18 | CNT_INTVAL },
- { "LED: Duplicate", 19 | CNT_INTVAL },
- { "LED: Navigate", 20 | CNT_INTVAL },
- { "LED: Pad Mode", 21 | CNT_INTVAL },
- { "LED: Pattern", 22 | CNT_INTVAL },
- { "LED: Scene", 23 | CNT_INTVAL },
- { "LED: Shift", 24 | CNT_INTVAL },
- { "LED: Erase", 25 | CNT_INTVAL },
- { "LED: Grid", 26 | CNT_INTVAL },
- { "LED: Right Bottom", 27 | CNT_INTVAL },
- { "LED: Rec", 28 | CNT_INTVAL },
- { "LED: Play", 29 | CNT_INTVAL },
- { "LED: Left Bottom", 32 | CNT_INTVAL },
- { "LED: Restart", 33 | CNT_INTVAL },
- { "LED: Group A", 41 | CNT_INTVAL },
- { "LED: Group B", 40 | CNT_INTVAL },
- { "LED: Group C", 37 | CNT_INTVAL },
- { "LED: Group D", 36 | CNT_INTVAL },
- { "LED: Group E", 39 | CNT_INTVAL },
- { "LED: Group F", 38 | CNT_INTVAL },
- { "LED: Group G", 35 | CNT_INTVAL },
- { "LED: Group H", 34 | CNT_INTVAL },
- { "LED: Auto Write", 42 | CNT_INTVAL },
- { "LED: Snap", 43 | CNT_INTVAL },
- { "LED: Right Top", 44 | CNT_INTVAL },
- { "LED: Left Top", 45 | CNT_INTVAL },
- { "LED: Sampling", 46 | CNT_INTVAL },
- { "LED: Browse", 47 | CNT_INTVAL },
- { "LED: Step", 48 | CNT_INTVAL },
- { "LED: Control", 49 | CNT_INTVAL },
- { "LED: Top Button 1", 57 | CNT_INTVAL },
- { "LED: Top Button 2", 56 | CNT_INTVAL },
- { "LED: Top Button 3", 55 | CNT_INTVAL },
- { "LED: Top Button 4", 54 | CNT_INTVAL },
- { "LED: Top Button 5", 53 | CNT_INTVAL },
- { "LED: Top Button 6", 52 | CNT_INTVAL },
- { "LED: Top Button 7", 51 | CNT_INTVAL },
- { "LED: Top Button 8", 50 | CNT_INTVAL },
- { "LED: Note Repeat", 58 | CNT_INTVAL },
- { "Backlight Display", 59 | CNT_INTVAL }
+};
static int add_controls(struct caiaq_controller *c, int num, struct snd_usb_caiaqdev *cdev) { @@ -553,6 +640,11 @@ int snd_usb_caiaq_control_init(struct snd_usb_caiaqdev *cdev) ret = add_controls(kontrols4_controller, ARRAY_SIZE(kontrols4_controller), cdev); break;
case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_MASCHINECONTROLLER):
ret = add_controls(maschine_controller,
ARRAY_SIZE(maschine_controller), cdev);
break;
}
return ret;
diff --git a/sound/usb/caiaq/device.c b/sound/usb/caiaq/device.c index 1a61dd1..bc55f70 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, cdev->ep1_out_buf, len+1, &actual_len, 200); }
+int snd_usb_caiaq_send_command_bank(struct snd_usb_caiaqdev *cdev,
unsigned char command,
unsigned char bank,
const unsigned char *buffer,
int len)
+{
- int actual_len;
- struct usb_device *usb_dev = cdev->chip.dev;
- if (!usb_dev)
return -EIO;
- if (len > EP1_BUFSIZE - 2)
len = EP1_BUFSIZE - 2;
- if (buffer && len > 0)
memcpy(cdev->ep1_out_buf+2, buffer, len);
- cdev->ep1_out_buf[0] = command;
- cdev->ep1_out_buf[1] = bank;
- return usb_bulk_msg(usb_dev, usb_sndbulkpipe(usb_dev, 1),
cdev->ep1_out_buf, len+2, &actual_len, 200);
+}
int snd_usb_caiaq_set_audio_params (struct snd_usb_caiaqdev *cdev, int rate, int depth, int bpp) { diff --git a/sound/usb/caiaq/device.h b/sound/usb/caiaq/device.h index ad102fa..ab0f752 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, unsigned char command, const unsigned char *buffer, int len); +int snd_usb_caiaq_send_command_bank(struct snd_usb_caiaqdev *cdev,
unsigned char command,
unsigned char bank,
const unsigned char *buffer,
int len);
#endif /* CAIAQ_DEVICE_H */
At Sun, 29 Sep 2013 12:45:19 +0200, Daniel Mack wrote:
Hi Hannes,
On 28.09.2013 21:51, Hannes Gräuler wrote:
This patch adds LED support for the Native Instruments Maschine Controller. It adds ALSA controls for dimming the LEDs of all buttons and the backlight of the two displays.
Thanks a lot for doing this! The patch subject has to be amended to "ALSA: snd-usb-caiaq: ...", but other than that, this looks all fine to me.
Can you resend with my
Acked-by: Daniel Mack zonque@gmail.com
please?
No worry, I already applied it with manual change in my side now :)
thanks,
Takashi
Best regards, Daniel
Signed-off-by: Hannes Gräuler hgraeule@uos.de
sound/usb/caiaq/control.c | 92 +++++++++++++++++++++++++++++++++++++++++++++++ sound/usb/caiaq/device.c | 25 +++++++++++++ sound/usb/caiaq/device.h | 5 +++ 3 files changed, 122 insertions(+)
diff --git a/sound/usb/caiaq/control.c b/sound/usb/caiaq/control.c index ae6b50f..f65fc09 100644 --- a/sound/usb/caiaq/control.c +++ b/sound/usb/caiaq/control.c @@ -28,6 +28,7 @@ #include "control.h"
#define CNT_INTVAL 0x10000 +#define MASCHINE_BANK_SIZE 32
static int control_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) @@ -105,6 +106,10 @@ static int control_put(struct snd_kcontrol *kcontrol, USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_TRAKTORKONTROLX1)) cmd = EP1_CMD_DIMM_LEDS;
- if (cdev->chip.usb_id ==
USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_MASCHINECONTROLLER))
cmd = EP1_CMD_DIMM_LEDS;
- if (pos & CNT_INTVAL) { int i = pos & ~CNT_INTVAL;
@@ -121,6 +126,20 @@ static int control_put(struct snd_kcontrol *kcontrol, usb_sndbulkpipe(cdev->chip.dev, 8), cdev->ep8_out_buf, sizeof(cdev->ep8_out_buf), &actual_len, 200);
} else if (cdev->chip.usb_id ==
USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_MASCHINECONTROLLER)) {
int bank = 0;
int offset = 0;
if (i >= MASCHINE_BANK_SIZE) {
bank = 0x1e;
offset = MASCHINE_BANK_SIZE;
}
snd_usb_caiaq_send_command_bank(cdev, cmd, bank,
cdev->control_state + offset,
} else { snd_usb_caiaq_send_command(cdev, cmd, cdev->control_state, sizeof(cdev->control_state));MASCHINE_BANK_SIZE);
@@ -490,6 +509,74 @@ static struct caiaq_controller kontrols4_controller[] = { { "LED: FX2: Mode", 133 | CNT_INTVAL }, };
+static struct caiaq_controller maschine_controller[] = {
- { "LED: Pad 1", 3 | CNT_INTVAL },
- { "LED: Pad 2", 2 | CNT_INTVAL },
- { "LED: Pad 3", 1 | CNT_INTVAL },
- { "LED: Pad 4", 0 | CNT_INTVAL },
- { "LED: Pad 5", 7 | CNT_INTVAL },
- { "LED: Pad 6", 6 | CNT_INTVAL },
- { "LED: Pad 7", 5 | CNT_INTVAL },
- { "LED: Pad 8", 4 | CNT_INTVAL },
- { "LED: Pad 9", 11 | CNT_INTVAL },
- { "LED: Pad 10", 10 | CNT_INTVAL },
- { "LED: Pad 11", 9 | CNT_INTVAL },
- { "LED: Pad 12", 8 | CNT_INTVAL },
- { "LED: Pad 13", 15 | CNT_INTVAL },
- { "LED: Pad 14", 14 | CNT_INTVAL },
- { "LED: Pad 15", 13 | CNT_INTVAL },
- { "LED: Pad 16", 12 | CNT_INTVAL },
- { "LED: Mute", 16 | CNT_INTVAL },
- { "LED: Solo", 17 | CNT_INTVAL },
- { "LED: Select", 18 | CNT_INTVAL },
- { "LED: Duplicate", 19 | CNT_INTVAL },
- { "LED: Navigate", 20 | CNT_INTVAL },
- { "LED: Pad Mode", 21 | CNT_INTVAL },
- { "LED: Pattern", 22 | CNT_INTVAL },
- { "LED: Scene", 23 | CNT_INTVAL },
- { "LED: Shift", 24 | CNT_INTVAL },
- { "LED: Erase", 25 | CNT_INTVAL },
- { "LED: Grid", 26 | CNT_INTVAL },
- { "LED: Right Bottom", 27 | CNT_INTVAL },
- { "LED: Rec", 28 | CNT_INTVAL },
- { "LED: Play", 29 | CNT_INTVAL },
- { "LED: Left Bottom", 32 | CNT_INTVAL },
- { "LED: Restart", 33 | CNT_INTVAL },
- { "LED: Group A", 41 | CNT_INTVAL },
- { "LED: Group B", 40 | CNT_INTVAL },
- { "LED: Group C", 37 | CNT_INTVAL },
- { "LED: Group D", 36 | CNT_INTVAL },
- { "LED: Group E", 39 | CNT_INTVAL },
- { "LED: Group F", 38 | CNT_INTVAL },
- { "LED: Group G", 35 | CNT_INTVAL },
- { "LED: Group H", 34 | CNT_INTVAL },
- { "LED: Auto Write", 42 | CNT_INTVAL },
- { "LED: Snap", 43 | CNT_INTVAL },
- { "LED: Right Top", 44 | CNT_INTVAL },
- { "LED: Left Top", 45 | CNT_INTVAL },
- { "LED: Sampling", 46 | CNT_INTVAL },
- { "LED: Browse", 47 | CNT_INTVAL },
- { "LED: Step", 48 | CNT_INTVAL },
- { "LED: Control", 49 | CNT_INTVAL },
- { "LED: Top Button 1", 57 | CNT_INTVAL },
- { "LED: Top Button 2", 56 | CNT_INTVAL },
- { "LED: Top Button 3", 55 | CNT_INTVAL },
- { "LED: Top Button 4", 54 | CNT_INTVAL },
- { "LED: Top Button 5", 53 | CNT_INTVAL },
- { "LED: Top Button 6", 52 | CNT_INTVAL },
- { "LED: Top Button 7", 51 | CNT_INTVAL },
- { "LED: Top Button 8", 50 | CNT_INTVAL },
- { "LED: Note Repeat", 58 | CNT_INTVAL },
- { "Backlight Display", 59 | CNT_INTVAL }
+};
static int add_controls(struct caiaq_controller *c, int num, struct snd_usb_caiaqdev *cdev) { @@ -553,6 +640,11 @@ int snd_usb_caiaq_control_init(struct snd_usb_caiaqdev *cdev) ret = add_controls(kontrols4_controller, ARRAY_SIZE(kontrols4_controller), cdev); break;
case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_MASCHINECONTROLLER):
ret = add_controls(maschine_controller,
ARRAY_SIZE(maschine_controller), cdev);
break;
}
return ret;
diff --git a/sound/usb/caiaq/device.c b/sound/usb/caiaq/device.c index 1a61dd1..bc55f70 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, cdev->ep1_out_buf, len+1, &actual_len, 200); }
+int snd_usb_caiaq_send_command_bank(struct snd_usb_caiaqdev *cdev,
unsigned char command,
unsigned char bank,
const unsigned char *buffer,
int len)
+{
- int actual_len;
- struct usb_device *usb_dev = cdev->chip.dev;
- if (!usb_dev)
return -EIO;
- if (len > EP1_BUFSIZE - 2)
len = EP1_BUFSIZE - 2;
- if (buffer && len > 0)
memcpy(cdev->ep1_out_buf+2, buffer, len);
- cdev->ep1_out_buf[0] = command;
- cdev->ep1_out_buf[1] = bank;
- return usb_bulk_msg(usb_dev, usb_sndbulkpipe(usb_dev, 1),
cdev->ep1_out_buf, len+2, &actual_len, 200);
+}
int snd_usb_caiaq_set_audio_params (struct snd_usb_caiaqdev *cdev, int rate, int depth, int bpp) { diff --git a/sound/usb/caiaq/device.h b/sound/usb/caiaq/device.h index ad102fa..ab0f752 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, unsigned char command, const unsigned char *buffer, int len); +int snd_usb_caiaq_send_command_bank(struct snd_usb_caiaqdev *cdev,
unsigned char command,
unsigned char bank,
const unsigned char *buffer,
int len);
#endif /* CAIAQ_DEVICE_H */
participants (3)
-
Daniel Mack
-
Hannes Gräuler
-
Takashi Iwai