xref: /kernel/linux/linux-6.6/sound/usb/caiaq/control.c (revision 62306a36)
162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *   Copyright (c) 2007 Daniel Mack
462306a36Sopenharmony_ci *   friendly supported by NI.
562306a36Sopenharmony_ci */
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#include <linux/device.h>
862306a36Sopenharmony_ci#include <linux/init.h>
962306a36Sopenharmony_ci#include <linux/usb.h>
1062306a36Sopenharmony_ci#include <sound/control.h>
1162306a36Sopenharmony_ci#include <sound/core.h>
1262306a36Sopenharmony_ci#include <sound/pcm.h>
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#include "device.h"
1562306a36Sopenharmony_ci#include "control.h"
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#define CNT_INTVAL 0x10000
1862306a36Sopenharmony_ci#define MASCHINE_BANK_SIZE 32
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_cistatic int control_info(struct snd_kcontrol *kcontrol,
2162306a36Sopenharmony_ci			struct snd_ctl_elem_info *uinfo)
2262306a36Sopenharmony_ci{
2362306a36Sopenharmony_ci	struct snd_usb_audio *chip = snd_kcontrol_chip(kcontrol);
2462306a36Sopenharmony_ci	struct snd_usb_caiaqdev *cdev = caiaqdev(chip->card);
2562306a36Sopenharmony_ci	int pos = kcontrol->private_value;
2662306a36Sopenharmony_ci	int is_intval = pos & CNT_INTVAL;
2762306a36Sopenharmony_ci	int maxval = 63;
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci	uinfo->count = 1;
3062306a36Sopenharmony_ci	pos &= ~CNT_INTVAL;
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci	switch (cdev->chip.usb_id) {
3362306a36Sopenharmony_ci	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AUDIO8DJ):
3462306a36Sopenharmony_ci	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AUDIO4DJ):
3562306a36Sopenharmony_ci		if (pos == 0) {
3662306a36Sopenharmony_ci			/* current input mode of A8DJ and A4DJ */
3762306a36Sopenharmony_ci			uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
3862306a36Sopenharmony_ci			uinfo->value.integer.min = 0;
3962306a36Sopenharmony_ci			uinfo->value.integer.max = 2;
4062306a36Sopenharmony_ci			return 0;
4162306a36Sopenharmony_ci		}
4262306a36Sopenharmony_ci		break;
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_TRAKTORKONTROLX1):
4562306a36Sopenharmony_ci		maxval = 127;
4662306a36Sopenharmony_ci		break;
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_TRAKTORKONTROLS4):
4962306a36Sopenharmony_ci		maxval = 31;
5062306a36Sopenharmony_ci		break;
5162306a36Sopenharmony_ci	}
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci	if (is_intval) {
5462306a36Sopenharmony_ci		uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
5562306a36Sopenharmony_ci		uinfo->value.integer.min = 0;
5662306a36Sopenharmony_ci		uinfo->value.integer.max = maxval;
5762306a36Sopenharmony_ci	} else {
5862306a36Sopenharmony_ci		uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN;
5962306a36Sopenharmony_ci		uinfo->value.integer.min = 0;
6062306a36Sopenharmony_ci		uinfo->value.integer.max = 1;
6162306a36Sopenharmony_ci	}
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci	return 0;
6462306a36Sopenharmony_ci}
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_cistatic int control_get(struct snd_kcontrol *kcontrol,
6762306a36Sopenharmony_ci		       struct snd_ctl_elem_value *ucontrol)
6862306a36Sopenharmony_ci{
6962306a36Sopenharmony_ci	struct snd_usb_audio *chip = snd_kcontrol_chip(kcontrol);
7062306a36Sopenharmony_ci	struct snd_usb_caiaqdev *cdev = caiaqdev(chip->card);
7162306a36Sopenharmony_ci	int pos = kcontrol->private_value;
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci	if (pos & CNT_INTVAL)
7462306a36Sopenharmony_ci		ucontrol->value.integer.value[0]
7562306a36Sopenharmony_ci			= cdev->control_state[pos & ~CNT_INTVAL];
7662306a36Sopenharmony_ci	else
7762306a36Sopenharmony_ci		ucontrol->value.integer.value[0]
7862306a36Sopenharmony_ci			= !!(cdev->control_state[pos / 8] & (1 << pos % 8));
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ci	return 0;
8162306a36Sopenharmony_ci}
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_cistatic int control_put(struct snd_kcontrol *kcontrol,
8462306a36Sopenharmony_ci		       struct snd_ctl_elem_value *ucontrol)
8562306a36Sopenharmony_ci{
8662306a36Sopenharmony_ci	struct snd_usb_audio *chip = snd_kcontrol_chip(kcontrol);
8762306a36Sopenharmony_ci	struct snd_usb_caiaqdev *cdev = caiaqdev(chip->card);
8862306a36Sopenharmony_ci	int pos = kcontrol->private_value;
8962306a36Sopenharmony_ci	int v = ucontrol->value.integer.value[0];
9062306a36Sopenharmony_ci	unsigned char cmd;
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ci	switch (cdev->chip.usb_id) {
9362306a36Sopenharmony_ci	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_MASCHINECONTROLLER):
9462306a36Sopenharmony_ci	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_TRAKTORKONTROLX1):
9562306a36Sopenharmony_ci	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_KORECONTROLLER2):
9662306a36Sopenharmony_ci	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_KORECONTROLLER):
9762306a36Sopenharmony_ci		cmd = EP1_CMD_DIMM_LEDS;
9862306a36Sopenharmony_ci		break;
9962306a36Sopenharmony_ci	default:
10062306a36Sopenharmony_ci		cmd = EP1_CMD_WRITE_IO;
10162306a36Sopenharmony_ci		break;
10262306a36Sopenharmony_ci	}
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ci	if (pos & CNT_INTVAL) {
10562306a36Sopenharmony_ci		int i = pos & ~CNT_INTVAL;
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_ci		cdev->control_state[i] = v;
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_ci		if (cdev->chip.usb_id ==
11062306a36Sopenharmony_ci			USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_TRAKTORKONTROLS4)) {
11162306a36Sopenharmony_ci			int actual_len;
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_ci			cdev->ep8_out_buf[0] = i;
11462306a36Sopenharmony_ci			cdev->ep8_out_buf[1] = v;
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_ci			usb_bulk_msg(cdev->chip.dev,
11762306a36Sopenharmony_ci				     usb_sndbulkpipe(cdev->chip.dev, 8),
11862306a36Sopenharmony_ci				     cdev->ep8_out_buf, sizeof(cdev->ep8_out_buf),
11962306a36Sopenharmony_ci				     &actual_len, 200);
12062306a36Sopenharmony_ci		} else if (cdev->chip.usb_id ==
12162306a36Sopenharmony_ci			USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_MASCHINECONTROLLER)) {
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_ci			int bank = 0;
12462306a36Sopenharmony_ci			int offset = 0;
12562306a36Sopenharmony_ci
12662306a36Sopenharmony_ci			if (i >= MASCHINE_BANK_SIZE) {
12762306a36Sopenharmony_ci				bank = 0x1e;
12862306a36Sopenharmony_ci				offset = MASCHINE_BANK_SIZE;
12962306a36Sopenharmony_ci			}
13062306a36Sopenharmony_ci
13162306a36Sopenharmony_ci			snd_usb_caiaq_send_command_bank(cdev, cmd, bank,
13262306a36Sopenharmony_ci					cdev->control_state + offset,
13362306a36Sopenharmony_ci					MASCHINE_BANK_SIZE);
13462306a36Sopenharmony_ci		} else {
13562306a36Sopenharmony_ci			snd_usb_caiaq_send_command(cdev, cmd,
13662306a36Sopenharmony_ci					cdev->control_state, sizeof(cdev->control_state));
13762306a36Sopenharmony_ci		}
13862306a36Sopenharmony_ci	} else {
13962306a36Sopenharmony_ci		if (v)
14062306a36Sopenharmony_ci			cdev->control_state[pos / 8] |= 1 << (pos % 8);
14162306a36Sopenharmony_ci		else
14262306a36Sopenharmony_ci			cdev->control_state[pos / 8] &= ~(1 << (pos % 8));
14362306a36Sopenharmony_ci
14462306a36Sopenharmony_ci		snd_usb_caiaq_send_command(cdev, cmd,
14562306a36Sopenharmony_ci				cdev->control_state, sizeof(cdev->control_state));
14662306a36Sopenharmony_ci	}
14762306a36Sopenharmony_ci
14862306a36Sopenharmony_ci	return 1;
14962306a36Sopenharmony_ci}
15062306a36Sopenharmony_ci
15162306a36Sopenharmony_cistatic struct snd_kcontrol_new kcontrol_template = {
15262306a36Sopenharmony_ci	.iface = SNDRV_CTL_ELEM_IFACE_HWDEP,
15362306a36Sopenharmony_ci	.access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
15462306a36Sopenharmony_ci	.index = 0,
15562306a36Sopenharmony_ci	.info = control_info,
15662306a36Sopenharmony_ci	.get  = control_get,
15762306a36Sopenharmony_ci	.put  = control_put,
15862306a36Sopenharmony_ci	/* name and private_value filled later */
15962306a36Sopenharmony_ci};
16062306a36Sopenharmony_ci
16162306a36Sopenharmony_cistruct caiaq_controller {
16262306a36Sopenharmony_ci	char *name;
16362306a36Sopenharmony_ci	int index;
16462306a36Sopenharmony_ci};
16562306a36Sopenharmony_ci
16662306a36Sopenharmony_cistatic const struct caiaq_controller ak1_controller[] = {
16762306a36Sopenharmony_ci	{ "LED left", 	2 },
16862306a36Sopenharmony_ci	{ "LED middle", 1 },
16962306a36Sopenharmony_ci	{ "LED right", 	0 },
17062306a36Sopenharmony_ci	{ "LED ring", 	3 }
17162306a36Sopenharmony_ci};
17262306a36Sopenharmony_ci
17362306a36Sopenharmony_cistatic const struct caiaq_controller rk2_controller[] = {
17462306a36Sopenharmony_ci	{ "LED 1",		5  },
17562306a36Sopenharmony_ci	{ "LED 2",		4  },
17662306a36Sopenharmony_ci	{ "LED 3",		3  },
17762306a36Sopenharmony_ci	{ "LED 4",		2  },
17862306a36Sopenharmony_ci	{ "LED 5",		1  },
17962306a36Sopenharmony_ci	{ "LED 6",		0  },
18062306a36Sopenharmony_ci	{ "LED pedal",		6  },
18162306a36Sopenharmony_ci	{ "LED 7seg_1b",	8  },
18262306a36Sopenharmony_ci	{ "LED 7seg_1c",	9  },
18362306a36Sopenharmony_ci	{ "LED 7seg_2a",	10 },
18462306a36Sopenharmony_ci	{ "LED 7seg_2b",	11 },
18562306a36Sopenharmony_ci	{ "LED 7seg_2c",	12 },
18662306a36Sopenharmony_ci	{ "LED 7seg_2d",	13 },
18762306a36Sopenharmony_ci	{ "LED 7seg_2e",	14 },
18862306a36Sopenharmony_ci	{ "LED 7seg_2f",	15 },
18962306a36Sopenharmony_ci	{ "LED 7seg_2g",	16 },
19062306a36Sopenharmony_ci	{ "LED 7seg_3a",	17 },
19162306a36Sopenharmony_ci	{ "LED 7seg_3b",	18 },
19262306a36Sopenharmony_ci	{ "LED 7seg_3c",	19 },
19362306a36Sopenharmony_ci	{ "LED 7seg_3d",	20 },
19462306a36Sopenharmony_ci	{ "LED 7seg_3e",	21 },
19562306a36Sopenharmony_ci	{ "LED 7seg_3f",	22 },
19662306a36Sopenharmony_ci	{ "LED 7seg_3g",	23 }
19762306a36Sopenharmony_ci};
19862306a36Sopenharmony_ci
19962306a36Sopenharmony_cistatic const struct caiaq_controller rk3_controller[] = {
20062306a36Sopenharmony_ci	{ "LED 7seg_1a",        0 + 0 },
20162306a36Sopenharmony_ci	{ "LED 7seg_1b",        0 + 1 },
20262306a36Sopenharmony_ci	{ "LED 7seg_1c",        0 + 2 },
20362306a36Sopenharmony_ci	{ "LED 7seg_1d",        0 + 3 },
20462306a36Sopenharmony_ci	{ "LED 7seg_1e",        0 + 4 },
20562306a36Sopenharmony_ci	{ "LED 7seg_1f",        0 + 5 },
20662306a36Sopenharmony_ci	{ "LED 7seg_1g",        0 + 6 },
20762306a36Sopenharmony_ci	{ "LED 7seg_1p",        0 + 7 },
20862306a36Sopenharmony_ci
20962306a36Sopenharmony_ci	{ "LED 7seg_2a",        8 + 0 },
21062306a36Sopenharmony_ci	{ "LED 7seg_2b",        8 + 1 },
21162306a36Sopenharmony_ci	{ "LED 7seg_2c",        8 + 2 },
21262306a36Sopenharmony_ci	{ "LED 7seg_2d",        8 + 3 },
21362306a36Sopenharmony_ci	{ "LED 7seg_2e",        8 + 4 },
21462306a36Sopenharmony_ci	{ "LED 7seg_2f",        8 + 5 },
21562306a36Sopenharmony_ci	{ "LED 7seg_2g",        8 + 6 },
21662306a36Sopenharmony_ci	{ "LED 7seg_2p",        8 + 7 },
21762306a36Sopenharmony_ci
21862306a36Sopenharmony_ci	{ "LED 7seg_3a",        16 + 0 },
21962306a36Sopenharmony_ci	{ "LED 7seg_3b",        16 + 1 },
22062306a36Sopenharmony_ci	{ "LED 7seg_3c",        16 + 2 },
22162306a36Sopenharmony_ci	{ "LED 7seg_3d",        16 + 3 },
22262306a36Sopenharmony_ci	{ "LED 7seg_3e",        16 + 4 },
22362306a36Sopenharmony_ci	{ "LED 7seg_3f",        16 + 5 },
22462306a36Sopenharmony_ci	{ "LED 7seg_3g",        16 + 6 },
22562306a36Sopenharmony_ci	{ "LED 7seg_3p",        16 + 7 },
22662306a36Sopenharmony_ci
22762306a36Sopenharmony_ci	{ "LED 7seg_4a",        24 + 0 },
22862306a36Sopenharmony_ci	{ "LED 7seg_4b",        24 + 1 },
22962306a36Sopenharmony_ci	{ "LED 7seg_4c",        24 + 2 },
23062306a36Sopenharmony_ci	{ "LED 7seg_4d",        24 + 3 },
23162306a36Sopenharmony_ci	{ "LED 7seg_4e",        24 + 4 },
23262306a36Sopenharmony_ci	{ "LED 7seg_4f",        24 + 5 },
23362306a36Sopenharmony_ci	{ "LED 7seg_4g",        24 + 6 },
23462306a36Sopenharmony_ci	{ "LED 7seg_4p",        24 + 7 },
23562306a36Sopenharmony_ci
23662306a36Sopenharmony_ci	{ "LED 1",		32 + 0 },
23762306a36Sopenharmony_ci	{ "LED 2",		32 + 1 },
23862306a36Sopenharmony_ci	{ "LED 3",		32 + 2 },
23962306a36Sopenharmony_ci	{ "LED 4",		32 + 3 },
24062306a36Sopenharmony_ci	{ "LED 5",		32 + 4 },
24162306a36Sopenharmony_ci	{ "LED 6",		32 + 5 },
24262306a36Sopenharmony_ci	{ "LED 7",		32 + 6 },
24362306a36Sopenharmony_ci	{ "LED 8",		32 + 7 },
24462306a36Sopenharmony_ci	{ "LED pedal",		32 + 8 }
24562306a36Sopenharmony_ci};
24662306a36Sopenharmony_ci
24762306a36Sopenharmony_cistatic const struct caiaq_controller kore_controller[] = {
24862306a36Sopenharmony_ci	{ "LED F1",		8   | CNT_INTVAL },
24962306a36Sopenharmony_ci	{ "LED F2",		12  | CNT_INTVAL },
25062306a36Sopenharmony_ci	{ "LED F3",		0   | CNT_INTVAL },
25162306a36Sopenharmony_ci	{ "LED F4",		4   | CNT_INTVAL },
25262306a36Sopenharmony_ci	{ "LED F5",		11  | CNT_INTVAL },
25362306a36Sopenharmony_ci	{ "LED F6",		15  | CNT_INTVAL },
25462306a36Sopenharmony_ci	{ "LED F7",		3   | CNT_INTVAL },
25562306a36Sopenharmony_ci	{ "LED F8",		7   | CNT_INTVAL },
25662306a36Sopenharmony_ci	{ "LED touch1",	     	10  | CNT_INTVAL },
25762306a36Sopenharmony_ci	{ "LED touch2",	     	14  | CNT_INTVAL },
25862306a36Sopenharmony_ci	{ "LED touch3",	     	2   | CNT_INTVAL },
25962306a36Sopenharmony_ci	{ "LED touch4",	     	6   | CNT_INTVAL },
26062306a36Sopenharmony_ci	{ "LED touch5",	     	9   | CNT_INTVAL },
26162306a36Sopenharmony_ci	{ "LED touch6",	     	13  | CNT_INTVAL },
26262306a36Sopenharmony_ci	{ "LED touch7",	     	1   | CNT_INTVAL },
26362306a36Sopenharmony_ci	{ "LED touch8",	     	5   | CNT_INTVAL },
26462306a36Sopenharmony_ci	{ "LED left",	       	18  | CNT_INTVAL },
26562306a36Sopenharmony_ci	{ "LED right",	     	22  | CNT_INTVAL },
26662306a36Sopenharmony_ci	{ "LED up",		16  | CNT_INTVAL },
26762306a36Sopenharmony_ci	{ "LED down",	       	20  | CNT_INTVAL },
26862306a36Sopenharmony_ci	{ "LED stop",	       	23  | CNT_INTVAL },
26962306a36Sopenharmony_ci	{ "LED play",	       	21  | CNT_INTVAL },
27062306a36Sopenharmony_ci	{ "LED record",	     	19  | CNT_INTVAL },
27162306a36Sopenharmony_ci	{ "LED listen",		17  | CNT_INTVAL },
27262306a36Sopenharmony_ci	{ "LED lcd",		30  | CNT_INTVAL },
27362306a36Sopenharmony_ci	{ "LED menu",		28  | CNT_INTVAL },
27462306a36Sopenharmony_ci	{ "LED sound",	 	31  | CNT_INTVAL },
27562306a36Sopenharmony_ci	{ "LED esc",		29  | CNT_INTVAL },
27662306a36Sopenharmony_ci	{ "LED view",		27  | CNT_INTVAL },
27762306a36Sopenharmony_ci	{ "LED enter",		24  | CNT_INTVAL },
27862306a36Sopenharmony_ci	{ "LED control",	26  | CNT_INTVAL }
27962306a36Sopenharmony_ci};
28062306a36Sopenharmony_ci
28162306a36Sopenharmony_cistatic const struct caiaq_controller a8dj_controller[] = {
28262306a36Sopenharmony_ci	{ "Current input mode",			0 | CNT_INTVAL 	},
28362306a36Sopenharmony_ci	{ "GND lift for TC Vinyl mode", 	24 + 0 		},
28462306a36Sopenharmony_ci	{ "GND lift for TC CD/Line mode", 	24 + 1 		},
28562306a36Sopenharmony_ci	{ "GND lift for phono mode", 		24 + 2 		},
28662306a36Sopenharmony_ci	{ "Software lock", 			40 		}
28762306a36Sopenharmony_ci};
28862306a36Sopenharmony_ci
28962306a36Sopenharmony_cistatic const struct caiaq_controller a4dj_controller[] = {
29062306a36Sopenharmony_ci	{ "Current input mode",	0 | CNT_INTVAL 	}
29162306a36Sopenharmony_ci};
29262306a36Sopenharmony_ci
29362306a36Sopenharmony_cistatic const struct caiaq_controller kontrolx1_controller[] = {
29462306a36Sopenharmony_ci	{ "LED FX A: ON",		7 | CNT_INTVAL	},
29562306a36Sopenharmony_ci	{ "LED FX A: 1",		6 | CNT_INTVAL	},
29662306a36Sopenharmony_ci	{ "LED FX A: 2",		5 | CNT_INTVAL	},
29762306a36Sopenharmony_ci	{ "LED FX A: 3",		4 | CNT_INTVAL	},
29862306a36Sopenharmony_ci	{ "LED FX B: ON",		3 | CNT_INTVAL	},
29962306a36Sopenharmony_ci	{ "LED FX B: 1",		2 | CNT_INTVAL	},
30062306a36Sopenharmony_ci	{ "LED FX B: 2",		1 | CNT_INTVAL	},
30162306a36Sopenharmony_ci	{ "LED FX B: 3",		0 | CNT_INTVAL	},
30262306a36Sopenharmony_ci
30362306a36Sopenharmony_ci	{ "LED Hotcue",			28 | CNT_INTVAL	},
30462306a36Sopenharmony_ci	{ "LED Shift (white)",		29 | CNT_INTVAL	},
30562306a36Sopenharmony_ci	{ "LED Shift (green)",		30 | CNT_INTVAL	},
30662306a36Sopenharmony_ci
30762306a36Sopenharmony_ci	{ "LED Deck A: FX1",		24 | CNT_INTVAL	},
30862306a36Sopenharmony_ci	{ "LED Deck A: FX2",		25 | CNT_INTVAL	},
30962306a36Sopenharmony_ci	{ "LED Deck A: IN",		17 | CNT_INTVAL	},
31062306a36Sopenharmony_ci	{ "LED Deck A: OUT",		16 | CNT_INTVAL	},
31162306a36Sopenharmony_ci	{ "LED Deck A: < BEAT",		19 | CNT_INTVAL	},
31262306a36Sopenharmony_ci	{ "LED Deck A: BEAT >",		18 | CNT_INTVAL	},
31362306a36Sopenharmony_ci	{ "LED Deck A: CUE/ABS",	21 | CNT_INTVAL	},
31462306a36Sopenharmony_ci	{ "LED Deck A: CUP/REL",	20 | CNT_INTVAL	},
31562306a36Sopenharmony_ci	{ "LED Deck A: PLAY",		23 | CNT_INTVAL	},
31662306a36Sopenharmony_ci	{ "LED Deck A: SYNC",		22 | CNT_INTVAL	},
31762306a36Sopenharmony_ci
31862306a36Sopenharmony_ci	{ "LED Deck B: FX1",		26 | CNT_INTVAL	},
31962306a36Sopenharmony_ci	{ "LED Deck B: FX2",		27 | CNT_INTVAL	},
32062306a36Sopenharmony_ci	{ "LED Deck B: IN",		15 | CNT_INTVAL	},
32162306a36Sopenharmony_ci	{ "LED Deck B: OUT",		14 | CNT_INTVAL	},
32262306a36Sopenharmony_ci	{ "LED Deck B: < BEAT",		13 | CNT_INTVAL	},
32362306a36Sopenharmony_ci	{ "LED Deck B: BEAT >",		12 | CNT_INTVAL	},
32462306a36Sopenharmony_ci	{ "LED Deck B: CUE/ABS",	11 | CNT_INTVAL	},
32562306a36Sopenharmony_ci	{ "LED Deck B: CUP/REL",	10 | CNT_INTVAL	},
32662306a36Sopenharmony_ci	{ "LED Deck B: PLAY",		9  | CNT_INTVAL	},
32762306a36Sopenharmony_ci	{ "LED Deck B: SYNC",		8  | CNT_INTVAL	},
32862306a36Sopenharmony_ci};
32962306a36Sopenharmony_ci
33062306a36Sopenharmony_cistatic const struct caiaq_controller kontrols4_controller[] = {
33162306a36Sopenharmony_ci	{ "LED: Master: Quant",			10  | CNT_INTVAL },
33262306a36Sopenharmony_ci	{ "LED: Master: Headphone",		11  | CNT_INTVAL },
33362306a36Sopenharmony_ci	{ "LED: Master: Master",		12  | CNT_INTVAL },
33462306a36Sopenharmony_ci	{ "LED: Master: Snap",			14  | CNT_INTVAL },
33562306a36Sopenharmony_ci	{ "LED: Master: Warning",		15  | CNT_INTVAL },
33662306a36Sopenharmony_ci	{ "LED: Master: Master button",		112 | CNT_INTVAL },
33762306a36Sopenharmony_ci	{ "LED: Master: Snap button",		113 | CNT_INTVAL },
33862306a36Sopenharmony_ci	{ "LED: Master: Rec",			118 | CNT_INTVAL },
33962306a36Sopenharmony_ci	{ "LED: Master: Size",			119 | CNT_INTVAL },
34062306a36Sopenharmony_ci	{ "LED: Master: Quant button",		120 | CNT_INTVAL },
34162306a36Sopenharmony_ci	{ "LED: Master: Browser button",	121 | CNT_INTVAL },
34262306a36Sopenharmony_ci	{ "LED: Master: Play button",		126 | CNT_INTVAL },
34362306a36Sopenharmony_ci	{ "LED: Master: Undo button",		127 | CNT_INTVAL },
34462306a36Sopenharmony_ci
34562306a36Sopenharmony_ci	{ "LED: Channel A: >",			4   | CNT_INTVAL },
34662306a36Sopenharmony_ci	{ "LED: Channel A: <",			5   | CNT_INTVAL },
34762306a36Sopenharmony_ci	{ "LED: Channel A: Meter 1",		97  | CNT_INTVAL },
34862306a36Sopenharmony_ci	{ "LED: Channel A: Meter 2",		98  | CNT_INTVAL },
34962306a36Sopenharmony_ci	{ "LED: Channel A: Meter 3",		99  | CNT_INTVAL },
35062306a36Sopenharmony_ci	{ "LED: Channel A: Meter 4",		100 | CNT_INTVAL },
35162306a36Sopenharmony_ci	{ "LED: Channel A: Meter 5",		101 | CNT_INTVAL },
35262306a36Sopenharmony_ci	{ "LED: Channel A: Meter 6",		102 | CNT_INTVAL },
35362306a36Sopenharmony_ci	{ "LED: Channel A: Meter clip",		103 | CNT_INTVAL },
35462306a36Sopenharmony_ci	{ "LED: Channel A: Active",		114 | CNT_INTVAL },
35562306a36Sopenharmony_ci	{ "LED: Channel A: Cue",		116 | CNT_INTVAL },
35662306a36Sopenharmony_ci	{ "LED: Channel A: FX1",		149 | CNT_INTVAL },
35762306a36Sopenharmony_ci	{ "LED: Channel A: FX2",		148 | CNT_INTVAL },
35862306a36Sopenharmony_ci
35962306a36Sopenharmony_ci	{ "LED: Channel B: >",			2   | CNT_INTVAL },
36062306a36Sopenharmony_ci	{ "LED: Channel B: <",			3   | CNT_INTVAL },
36162306a36Sopenharmony_ci	{ "LED: Channel B: Meter 1",		89  | CNT_INTVAL },
36262306a36Sopenharmony_ci	{ "LED: Channel B: Meter 2",		90  | CNT_INTVAL },
36362306a36Sopenharmony_ci	{ "LED: Channel B: Meter 3",		91  | CNT_INTVAL },
36462306a36Sopenharmony_ci	{ "LED: Channel B: Meter 4",		92  | CNT_INTVAL },
36562306a36Sopenharmony_ci	{ "LED: Channel B: Meter 5",		93  | CNT_INTVAL },
36662306a36Sopenharmony_ci	{ "LED: Channel B: Meter 6",		94  | CNT_INTVAL },
36762306a36Sopenharmony_ci	{ "LED: Channel B: Meter clip",		95  | CNT_INTVAL },
36862306a36Sopenharmony_ci	{ "LED: Channel B: Active",		122 | CNT_INTVAL },
36962306a36Sopenharmony_ci	{ "LED: Channel B: Cue",		125 | CNT_INTVAL },
37062306a36Sopenharmony_ci	{ "LED: Channel B: FX1",		147 | CNT_INTVAL },
37162306a36Sopenharmony_ci	{ "LED: Channel B: FX2",		146 | CNT_INTVAL },
37262306a36Sopenharmony_ci
37362306a36Sopenharmony_ci	{ "LED: Channel C: >",			6   | CNT_INTVAL },
37462306a36Sopenharmony_ci	{ "LED: Channel C: <",			7   | CNT_INTVAL },
37562306a36Sopenharmony_ci	{ "LED: Channel C: Meter 1",		105 | CNT_INTVAL },
37662306a36Sopenharmony_ci	{ "LED: Channel C: Meter 2",		106 | CNT_INTVAL },
37762306a36Sopenharmony_ci	{ "LED: Channel C: Meter 3",		107 | CNT_INTVAL },
37862306a36Sopenharmony_ci	{ "LED: Channel C: Meter 4",		108 | CNT_INTVAL },
37962306a36Sopenharmony_ci	{ "LED: Channel C: Meter 5",		109 | CNT_INTVAL },
38062306a36Sopenharmony_ci	{ "LED: Channel C: Meter 6",		110 | CNT_INTVAL },
38162306a36Sopenharmony_ci	{ "LED: Channel C: Meter clip",		111 | CNT_INTVAL },
38262306a36Sopenharmony_ci	{ "LED: Channel C: Active",		115 | CNT_INTVAL },
38362306a36Sopenharmony_ci	{ "LED: Channel C: Cue",		117 | CNT_INTVAL },
38462306a36Sopenharmony_ci	{ "LED: Channel C: FX1",		151 | CNT_INTVAL },
38562306a36Sopenharmony_ci	{ "LED: Channel C: FX2",		150 | CNT_INTVAL },
38662306a36Sopenharmony_ci
38762306a36Sopenharmony_ci	{ "LED: Channel D: >",			0   | CNT_INTVAL },
38862306a36Sopenharmony_ci	{ "LED: Channel D: <",			1   | CNT_INTVAL },
38962306a36Sopenharmony_ci	{ "LED: Channel D: Meter 1",		81  | CNT_INTVAL },
39062306a36Sopenharmony_ci	{ "LED: Channel D: Meter 2",		82  | CNT_INTVAL },
39162306a36Sopenharmony_ci	{ "LED: Channel D: Meter 3",		83  | CNT_INTVAL },
39262306a36Sopenharmony_ci	{ "LED: Channel D: Meter 4",		84  | CNT_INTVAL },
39362306a36Sopenharmony_ci	{ "LED: Channel D: Meter 5",		85  | CNT_INTVAL },
39462306a36Sopenharmony_ci	{ "LED: Channel D: Meter 6",		86  | CNT_INTVAL },
39562306a36Sopenharmony_ci	{ "LED: Channel D: Meter clip",		87  | CNT_INTVAL },
39662306a36Sopenharmony_ci	{ "LED: Channel D: Active",		123 | CNT_INTVAL },
39762306a36Sopenharmony_ci	{ "LED: Channel D: Cue",		124 | CNT_INTVAL },
39862306a36Sopenharmony_ci	{ "LED: Channel D: FX1",		145 | CNT_INTVAL },
39962306a36Sopenharmony_ci	{ "LED: Channel D: FX2",		144 | CNT_INTVAL },
40062306a36Sopenharmony_ci
40162306a36Sopenharmony_ci	{ "LED: Deck A: 1 (blue)",		22  | CNT_INTVAL },
40262306a36Sopenharmony_ci	{ "LED: Deck A: 1 (green)",		23  | CNT_INTVAL },
40362306a36Sopenharmony_ci	{ "LED: Deck A: 2 (blue)",		20  | CNT_INTVAL },
40462306a36Sopenharmony_ci	{ "LED: Deck A: 2 (green)",		21  | CNT_INTVAL },
40562306a36Sopenharmony_ci	{ "LED: Deck A: 3 (blue)",		18  | CNT_INTVAL },
40662306a36Sopenharmony_ci	{ "LED: Deck A: 3 (green)",		19  | CNT_INTVAL },
40762306a36Sopenharmony_ci	{ "LED: Deck A: 4 (blue)",		16  | CNT_INTVAL },
40862306a36Sopenharmony_ci	{ "LED: Deck A: 4 (green)",		17  | CNT_INTVAL },
40962306a36Sopenharmony_ci	{ "LED: Deck A: Load",			44  | CNT_INTVAL },
41062306a36Sopenharmony_ci	{ "LED: Deck A: Deck C button",		45  | CNT_INTVAL },
41162306a36Sopenharmony_ci	{ "LED: Deck A: In",			47  | CNT_INTVAL },
41262306a36Sopenharmony_ci	{ "LED: Deck A: Out",			46  | CNT_INTVAL },
41362306a36Sopenharmony_ci	{ "LED: Deck A: Shift",			24  | CNT_INTVAL },
41462306a36Sopenharmony_ci	{ "LED: Deck A: Sync",			27  | CNT_INTVAL },
41562306a36Sopenharmony_ci	{ "LED: Deck A: Cue",			26  | CNT_INTVAL },
41662306a36Sopenharmony_ci	{ "LED: Deck A: Play",			25  | CNT_INTVAL },
41762306a36Sopenharmony_ci	{ "LED: Deck A: Tempo up",		33  | CNT_INTVAL },
41862306a36Sopenharmony_ci	{ "LED: Deck A: Tempo down",		32  | CNT_INTVAL },
41962306a36Sopenharmony_ci	{ "LED: Deck A: Master",		34  | CNT_INTVAL },
42062306a36Sopenharmony_ci	{ "LED: Deck A: Keylock",		35  | CNT_INTVAL },
42162306a36Sopenharmony_ci	{ "LED: Deck A: Deck A",		37  | CNT_INTVAL },
42262306a36Sopenharmony_ci	{ "LED: Deck A: Deck C",		36  | CNT_INTVAL },
42362306a36Sopenharmony_ci	{ "LED: Deck A: Samples",		38  | CNT_INTVAL },
42462306a36Sopenharmony_ci	{ "LED: Deck A: On Air",		39  | CNT_INTVAL },
42562306a36Sopenharmony_ci	{ "LED: Deck A: Sample 1",		31  | CNT_INTVAL },
42662306a36Sopenharmony_ci	{ "LED: Deck A: Sample 2",		30  | CNT_INTVAL },
42762306a36Sopenharmony_ci	{ "LED: Deck A: Sample 3",		29  | CNT_INTVAL },
42862306a36Sopenharmony_ci	{ "LED: Deck A: Sample 4",		28  | CNT_INTVAL },
42962306a36Sopenharmony_ci	{ "LED: Deck A: Digit 1 - A",		55  | CNT_INTVAL },
43062306a36Sopenharmony_ci	{ "LED: Deck A: Digit 1 - B",		54  | CNT_INTVAL },
43162306a36Sopenharmony_ci	{ "LED: Deck A: Digit 1 - C",		53  | CNT_INTVAL },
43262306a36Sopenharmony_ci	{ "LED: Deck A: Digit 1 - D",		52  | CNT_INTVAL },
43362306a36Sopenharmony_ci	{ "LED: Deck A: Digit 1 - E",		51  | CNT_INTVAL },
43462306a36Sopenharmony_ci	{ "LED: Deck A: Digit 1 - F",		50  | CNT_INTVAL },
43562306a36Sopenharmony_ci	{ "LED: Deck A: Digit 1 - G",		49  | CNT_INTVAL },
43662306a36Sopenharmony_ci	{ "LED: Deck A: Digit 1 - dot",		48  | CNT_INTVAL },
43762306a36Sopenharmony_ci	{ "LED: Deck A: Digit 2 - A",		63  | CNT_INTVAL },
43862306a36Sopenharmony_ci	{ "LED: Deck A: Digit 2 - B",		62  | CNT_INTVAL },
43962306a36Sopenharmony_ci	{ "LED: Deck A: Digit 2 - C",		61  | CNT_INTVAL },
44062306a36Sopenharmony_ci	{ "LED: Deck A: Digit 2 - D",		60  | CNT_INTVAL },
44162306a36Sopenharmony_ci	{ "LED: Deck A: Digit 2 - E",		59  | CNT_INTVAL },
44262306a36Sopenharmony_ci	{ "LED: Deck A: Digit 2 - F",		58  | CNT_INTVAL },
44362306a36Sopenharmony_ci	{ "LED: Deck A: Digit 2 - G",		57  | CNT_INTVAL },
44462306a36Sopenharmony_ci	{ "LED: Deck A: Digit 2 - dot",		56  | CNT_INTVAL },
44562306a36Sopenharmony_ci
44662306a36Sopenharmony_ci	{ "LED: Deck B: 1 (blue)",		78  | CNT_INTVAL },
44762306a36Sopenharmony_ci	{ "LED: Deck B: 1 (green)",		79  | CNT_INTVAL },
44862306a36Sopenharmony_ci	{ "LED: Deck B: 2 (blue)",		76  | CNT_INTVAL },
44962306a36Sopenharmony_ci	{ "LED: Deck B: 2 (green)",		77  | CNT_INTVAL },
45062306a36Sopenharmony_ci	{ "LED: Deck B: 3 (blue)",		74  | CNT_INTVAL },
45162306a36Sopenharmony_ci	{ "LED: Deck B: 3 (green)",		75  | CNT_INTVAL },
45262306a36Sopenharmony_ci	{ "LED: Deck B: 4 (blue)",		72  | CNT_INTVAL },
45362306a36Sopenharmony_ci	{ "LED: Deck B: 4 (green)",		73  | CNT_INTVAL },
45462306a36Sopenharmony_ci	{ "LED: Deck B: Load",			180 | CNT_INTVAL },
45562306a36Sopenharmony_ci	{ "LED: Deck B: Deck D button",		181 | CNT_INTVAL },
45662306a36Sopenharmony_ci	{ "LED: Deck B: In",			183 | CNT_INTVAL },
45762306a36Sopenharmony_ci	{ "LED: Deck B: Out",			182 | CNT_INTVAL },
45862306a36Sopenharmony_ci	{ "LED: Deck B: Shift",			64  | CNT_INTVAL },
45962306a36Sopenharmony_ci	{ "LED: Deck B: Sync",			67  | CNT_INTVAL },
46062306a36Sopenharmony_ci	{ "LED: Deck B: Cue",			66  | CNT_INTVAL },
46162306a36Sopenharmony_ci	{ "LED: Deck B: Play",			65  | CNT_INTVAL },
46262306a36Sopenharmony_ci	{ "LED: Deck B: Tempo up",		185 | CNT_INTVAL },
46362306a36Sopenharmony_ci	{ "LED: Deck B: Tempo down",		184 | CNT_INTVAL },
46462306a36Sopenharmony_ci	{ "LED: Deck B: Master",		186 | CNT_INTVAL },
46562306a36Sopenharmony_ci	{ "LED: Deck B: Keylock",		187 | CNT_INTVAL },
46662306a36Sopenharmony_ci	{ "LED: Deck B: Deck B",		189 | CNT_INTVAL },
46762306a36Sopenharmony_ci	{ "LED: Deck B: Deck D",		188 | CNT_INTVAL },
46862306a36Sopenharmony_ci	{ "LED: Deck B: Samples",		190 | CNT_INTVAL },
46962306a36Sopenharmony_ci	{ "LED: Deck B: On Air",		191 | CNT_INTVAL },
47062306a36Sopenharmony_ci	{ "LED: Deck B: Sample 1",		71  | CNT_INTVAL },
47162306a36Sopenharmony_ci	{ "LED: Deck B: Sample 2",		70  | CNT_INTVAL },
47262306a36Sopenharmony_ci	{ "LED: Deck B: Sample 3",		69  | CNT_INTVAL },
47362306a36Sopenharmony_ci	{ "LED: Deck B: Sample 4",		68  | CNT_INTVAL },
47462306a36Sopenharmony_ci	{ "LED: Deck B: Digit 1 - A",		175 | CNT_INTVAL },
47562306a36Sopenharmony_ci	{ "LED: Deck B: Digit 1 - B",		174 | CNT_INTVAL },
47662306a36Sopenharmony_ci	{ "LED: Deck B: Digit 1 - C",		173 | CNT_INTVAL },
47762306a36Sopenharmony_ci	{ "LED: Deck B: Digit 1 - D",		172 | CNT_INTVAL },
47862306a36Sopenharmony_ci	{ "LED: Deck B: Digit 1 - E",		171 | CNT_INTVAL },
47962306a36Sopenharmony_ci	{ "LED: Deck B: Digit 1 - F",		170 | CNT_INTVAL },
48062306a36Sopenharmony_ci	{ "LED: Deck B: Digit 1 - G",		169 | CNT_INTVAL },
48162306a36Sopenharmony_ci	{ "LED: Deck B: Digit 1 - dot",		168 | CNT_INTVAL },
48262306a36Sopenharmony_ci	{ "LED: Deck B: Digit 2 - A",		167 | CNT_INTVAL },
48362306a36Sopenharmony_ci	{ "LED: Deck B: Digit 2 - B",		166 | CNT_INTVAL },
48462306a36Sopenharmony_ci	{ "LED: Deck B: Digit 2 - C",		165 | CNT_INTVAL },
48562306a36Sopenharmony_ci	{ "LED: Deck B: Digit 2 - D",		164 | CNT_INTVAL },
48662306a36Sopenharmony_ci	{ "LED: Deck B: Digit 2 - E",		163 | CNT_INTVAL },
48762306a36Sopenharmony_ci	{ "LED: Deck B: Digit 2 - F",		162 | CNT_INTVAL },
48862306a36Sopenharmony_ci	{ "LED: Deck B: Digit 2 - G",		161 | CNT_INTVAL },
48962306a36Sopenharmony_ci	{ "LED: Deck B: Digit 2 - dot",		160 | CNT_INTVAL },
49062306a36Sopenharmony_ci
49162306a36Sopenharmony_ci	{ "LED: FX1: dry/wet",			153 | CNT_INTVAL },
49262306a36Sopenharmony_ci	{ "LED: FX1: 1",			154 | CNT_INTVAL },
49362306a36Sopenharmony_ci	{ "LED: FX1: 2",			155 | CNT_INTVAL },
49462306a36Sopenharmony_ci	{ "LED: FX1: 3",			156 | CNT_INTVAL },
49562306a36Sopenharmony_ci	{ "LED: FX1: Mode",			157 | CNT_INTVAL },
49662306a36Sopenharmony_ci	{ "LED: FX2: dry/wet",			129 | CNT_INTVAL },
49762306a36Sopenharmony_ci	{ "LED: FX2: 1",			130 | CNT_INTVAL },
49862306a36Sopenharmony_ci	{ "LED: FX2: 2",			131 | CNT_INTVAL },
49962306a36Sopenharmony_ci	{ "LED: FX2: 3",			132 | CNT_INTVAL },
50062306a36Sopenharmony_ci	{ "LED: FX2: Mode",			133 | CNT_INTVAL },
50162306a36Sopenharmony_ci};
50262306a36Sopenharmony_ci
50362306a36Sopenharmony_cistatic const struct caiaq_controller maschine_controller[] = {
50462306a36Sopenharmony_ci	{ "LED: Pad 1",				3  | CNT_INTVAL },
50562306a36Sopenharmony_ci	{ "LED: Pad 2",				2  | CNT_INTVAL },
50662306a36Sopenharmony_ci	{ "LED: Pad 3",				1  | CNT_INTVAL },
50762306a36Sopenharmony_ci	{ "LED: Pad 4",				0  | CNT_INTVAL },
50862306a36Sopenharmony_ci	{ "LED: Pad 5",				7  | CNT_INTVAL },
50962306a36Sopenharmony_ci	{ "LED: Pad 6",				6  | CNT_INTVAL },
51062306a36Sopenharmony_ci	{ "LED: Pad 7",				5  | CNT_INTVAL },
51162306a36Sopenharmony_ci	{ "LED: Pad 8",				4  | CNT_INTVAL },
51262306a36Sopenharmony_ci	{ "LED: Pad 9",				11 | CNT_INTVAL },
51362306a36Sopenharmony_ci	{ "LED: Pad 10",			10 | CNT_INTVAL },
51462306a36Sopenharmony_ci	{ "LED: Pad 11",			9  | CNT_INTVAL },
51562306a36Sopenharmony_ci	{ "LED: Pad 12",			8  | CNT_INTVAL },
51662306a36Sopenharmony_ci	{ "LED: Pad 13",			15 | CNT_INTVAL },
51762306a36Sopenharmony_ci	{ "LED: Pad 14",			14 | CNT_INTVAL },
51862306a36Sopenharmony_ci	{ "LED: Pad 15",			13 | CNT_INTVAL },
51962306a36Sopenharmony_ci	{ "LED: Pad 16",			12 | CNT_INTVAL },
52062306a36Sopenharmony_ci
52162306a36Sopenharmony_ci	{ "LED: Mute",				16 | CNT_INTVAL },
52262306a36Sopenharmony_ci	{ "LED: Solo",				17 | CNT_INTVAL },
52362306a36Sopenharmony_ci	{ "LED: Select",			18 | CNT_INTVAL },
52462306a36Sopenharmony_ci	{ "LED: Duplicate",			19 | CNT_INTVAL },
52562306a36Sopenharmony_ci	{ "LED: Navigate",			20 | CNT_INTVAL },
52662306a36Sopenharmony_ci	{ "LED: Pad Mode",			21 | CNT_INTVAL },
52762306a36Sopenharmony_ci	{ "LED: Pattern",			22 | CNT_INTVAL },
52862306a36Sopenharmony_ci	{ "LED: Scene",				23 | CNT_INTVAL },
52962306a36Sopenharmony_ci
53062306a36Sopenharmony_ci	{ "LED: Shift",				24 | CNT_INTVAL },
53162306a36Sopenharmony_ci	{ "LED: Erase",				25 | CNT_INTVAL },
53262306a36Sopenharmony_ci	{ "LED: Grid",				26 | CNT_INTVAL },
53362306a36Sopenharmony_ci	{ "LED: Right Bottom",			27 | CNT_INTVAL },
53462306a36Sopenharmony_ci	{ "LED: Rec",				28 | CNT_INTVAL },
53562306a36Sopenharmony_ci	{ "LED: Play",				29 | CNT_INTVAL },
53662306a36Sopenharmony_ci	{ "LED: Left Bottom",			32 | CNT_INTVAL },
53762306a36Sopenharmony_ci	{ "LED: Restart",			33 | CNT_INTVAL },
53862306a36Sopenharmony_ci
53962306a36Sopenharmony_ci	{ "LED: Group A",			41 | CNT_INTVAL },
54062306a36Sopenharmony_ci	{ "LED: Group B",			40 | CNT_INTVAL },
54162306a36Sopenharmony_ci	{ "LED: Group C",			37 | CNT_INTVAL },
54262306a36Sopenharmony_ci	{ "LED: Group D",			36 | CNT_INTVAL },
54362306a36Sopenharmony_ci	{ "LED: Group E",			39 | CNT_INTVAL },
54462306a36Sopenharmony_ci	{ "LED: Group F",			38 | CNT_INTVAL },
54562306a36Sopenharmony_ci	{ "LED: Group G",			35 | CNT_INTVAL },
54662306a36Sopenharmony_ci	{ "LED: Group H",			34 | CNT_INTVAL },
54762306a36Sopenharmony_ci
54862306a36Sopenharmony_ci	{ "LED: Auto Write",			42 | CNT_INTVAL },
54962306a36Sopenharmony_ci	{ "LED: Snap",				43 | CNT_INTVAL },
55062306a36Sopenharmony_ci	{ "LED: Right Top",			44 | CNT_INTVAL },
55162306a36Sopenharmony_ci	{ "LED: Left Top",			45 | CNT_INTVAL },
55262306a36Sopenharmony_ci	{ "LED: Sampling",			46 | CNT_INTVAL },
55362306a36Sopenharmony_ci	{ "LED: Browse",			47 | CNT_INTVAL },
55462306a36Sopenharmony_ci	{ "LED: Step",				48 | CNT_INTVAL },
55562306a36Sopenharmony_ci	{ "LED: Control",			49 | CNT_INTVAL },
55662306a36Sopenharmony_ci
55762306a36Sopenharmony_ci	{ "LED: Top Button 1",			57 | CNT_INTVAL },
55862306a36Sopenharmony_ci	{ "LED: Top Button 2",			56 | CNT_INTVAL },
55962306a36Sopenharmony_ci	{ "LED: Top Button 3",			55 | CNT_INTVAL },
56062306a36Sopenharmony_ci	{ "LED: Top Button 4",			54 | CNT_INTVAL },
56162306a36Sopenharmony_ci	{ "LED: Top Button 5",			53 | CNT_INTVAL },
56262306a36Sopenharmony_ci	{ "LED: Top Button 6",			52 | CNT_INTVAL },
56362306a36Sopenharmony_ci	{ "LED: Top Button 7",			51 | CNT_INTVAL },
56462306a36Sopenharmony_ci	{ "LED: Top Button 8",			50 | CNT_INTVAL },
56562306a36Sopenharmony_ci
56662306a36Sopenharmony_ci	{ "LED: Note Repeat",			58 | CNT_INTVAL },
56762306a36Sopenharmony_ci
56862306a36Sopenharmony_ci	{ "Backlight Display",			59 | CNT_INTVAL }
56962306a36Sopenharmony_ci};
57062306a36Sopenharmony_ci
57162306a36Sopenharmony_cistatic int add_controls(const struct caiaq_controller *c, int num,
57262306a36Sopenharmony_ci			struct snd_usb_caiaqdev *cdev)
57362306a36Sopenharmony_ci{
57462306a36Sopenharmony_ci	int i, ret;
57562306a36Sopenharmony_ci	struct snd_kcontrol *kc;
57662306a36Sopenharmony_ci
57762306a36Sopenharmony_ci	for (i = 0; i < num; i++, c++) {
57862306a36Sopenharmony_ci		kcontrol_template.name = c->name;
57962306a36Sopenharmony_ci		kcontrol_template.private_value = c->index;
58062306a36Sopenharmony_ci		kc = snd_ctl_new1(&kcontrol_template, cdev);
58162306a36Sopenharmony_ci		ret = snd_ctl_add(cdev->chip.card, kc);
58262306a36Sopenharmony_ci		if (ret < 0)
58362306a36Sopenharmony_ci			return ret;
58462306a36Sopenharmony_ci	}
58562306a36Sopenharmony_ci
58662306a36Sopenharmony_ci	return 0;
58762306a36Sopenharmony_ci}
58862306a36Sopenharmony_ci
58962306a36Sopenharmony_ciint snd_usb_caiaq_control_init(struct snd_usb_caiaqdev *cdev)
59062306a36Sopenharmony_ci{
59162306a36Sopenharmony_ci	int ret = 0;
59262306a36Sopenharmony_ci
59362306a36Sopenharmony_ci	switch (cdev->chip.usb_id) {
59462306a36Sopenharmony_ci	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AK1):
59562306a36Sopenharmony_ci		ret = add_controls(ak1_controller,
59662306a36Sopenharmony_ci			ARRAY_SIZE(ak1_controller), cdev);
59762306a36Sopenharmony_ci		break;
59862306a36Sopenharmony_ci
59962306a36Sopenharmony_ci	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_RIGKONTROL2):
60062306a36Sopenharmony_ci		ret = add_controls(rk2_controller,
60162306a36Sopenharmony_ci			ARRAY_SIZE(rk2_controller), cdev);
60262306a36Sopenharmony_ci		break;
60362306a36Sopenharmony_ci
60462306a36Sopenharmony_ci	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_RIGKONTROL3):
60562306a36Sopenharmony_ci		ret = add_controls(rk3_controller,
60662306a36Sopenharmony_ci			ARRAY_SIZE(rk3_controller), cdev);
60762306a36Sopenharmony_ci		break;
60862306a36Sopenharmony_ci
60962306a36Sopenharmony_ci	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_KORECONTROLLER):
61062306a36Sopenharmony_ci	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_KORECONTROLLER2):
61162306a36Sopenharmony_ci		ret = add_controls(kore_controller,
61262306a36Sopenharmony_ci			ARRAY_SIZE(kore_controller), cdev);
61362306a36Sopenharmony_ci		break;
61462306a36Sopenharmony_ci
61562306a36Sopenharmony_ci	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AUDIO8DJ):
61662306a36Sopenharmony_ci		ret = add_controls(a8dj_controller,
61762306a36Sopenharmony_ci			ARRAY_SIZE(a8dj_controller), cdev);
61862306a36Sopenharmony_ci		break;
61962306a36Sopenharmony_ci
62062306a36Sopenharmony_ci	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AUDIO4DJ):
62162306a36Sopenharmony_ci		ret = add_controls(a4dj_controller,
62262306a36Sopenharmony_ci			ARRAY_SIZE(a4dj_controller), cdev);
62362306a36Sopenharmony_ci		break;
62462306a36Sopenharmony_ci
62562306a36Sopenharmony_ci	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_TRAKTORKONTROLX1):
62662306a36Sopenharmony_ci		ret = add_controls(kontrolx1_controller,
62762306a36Sopenharmony_ci			ARRAY_SIZE(kontrolx1_controller), cdev);
62862306a36Sopenharmony_ci		break;
62962306a36Sopenharmony_ci
63062306a36Sopenharmony_ci	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_TRAKTORKONTROLS4):
63162306a36Sopenharmony_ci		ret = add_controls(kontrols4_controller,
63262306a36Sopenharmony_ci			ARRAY_SIZE(kontrols4_controller), cdev);
63362306a36Sopenharmony_ci		break;
63462306a36Sopenharmony_ci
63562306a36Sopenharmony_ci	case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_MASCHINECONTROLLER):
63662306a36Sopenharmony_ci		ret = add_controls(maschine_controller,
63762306a36Sopenharmony_ci			ARRAY_SIZE(maschine_controller), cdev);
63862306a36Sopenharmony_ci		break;
63962306a36Sopenharmony_ci	}
64062306a36Sopenharmony_ci
64162306a36Sopenharmony_ci	return ret;
64262306a36Sopenharmony_ci}
64362306a36Sopenharmony_ci
644