[alsa-devel] [PATCH] caiaq: LED support for Maschine Controller
Takashi Iwai
tiwai at suse.de
Mon Sep 30 11:21:26 CEST 2013
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 at 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 at 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 */
> >
>
More information about the Alsa-devel
mailing list