[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