|
@@ -39,12 +39,12 @@ static int control_info(struct snd_kcontrol *kcontrol,
|
|
|
struct snd_usb_caiaqdev *dev = caiaqdev(chip->card);
|
|
|
int pos = kcontrol->private_value;
|
|
|
int is_intval = pos & CNT_INTVAL;
|
|
|
+ unsigned int id = dev->chip.usb_id;
|
|
|
|
|
|
uinfo->count = 1;
|
|
|
pos &= ~CNT_INTVAL;
|
|
|
|
|
|
- if (dev->chip.usb_id ==
|
|
|
- USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AUDIO8DJ)
|
|
|
+ if (id == USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AUDIO8DJ)
|
|
|
&& (pos == 0)) {
|
|
|
/* current input mode of A8DJ */
|
|
|
uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
|
|
@@ -53,6 +53,15 @@ static int control_info(struct snd_kcontrol *kcontrol,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+ if (id == USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AUDIO4DJ)
|
|
|
+ && (pos == 0)) {
|
|
|
+ /* current input mode of A4DJ */
|
|
|
+ uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
|
|
|
+ uinfo->value.integer.min = 0;
|
|
|
+ uinfo->value.integer.max = 1;
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
if (is_intval) {
|
|
|
uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
|
|
|
uinfo->value.integer.min = 0;
|
|
@@ -73,6 +82,14 @@ static int control_get(struct snd_kcontrol *kcontrol,
|
|
|
struct snd_usb_caiaqdev *dev = caiaqdev(chip->card);
|
|
|
int pos = kcontrol->private_value;
|
|
|
|
|
|
+ if (dev->chip.usb_id ==
|
|
|
+ USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AUDIO4DJ)) {
|
|
|
+ /* A4DJ has only one control */
|
|
|
+ /* do not expose hardware input mode 0 */
|
|
|
+ ucontrol->value.integer.value[0] = dev->control_state[0] - 1;
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
if (pos & CNT_INTVAL)
|
|
|
ucontrol->value.integer.value[0]
|
|
|
= dev->control_state[pos & ~CNT_INTVAL];
|
|
@@ -90,10 +107,20 @@ static int control_put(struct snd_kcontrol *kcontrol,
|
|
|
struct snd_usb_caiaqdev *dev = caiaqdev(chip->card);
|
|
|
int pos = kcontrol->private_value;
|
|
|
|
|
|
+ if (dev->chip.usb_id ==
|
|
|
+ USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AUDIO4DJ)) {
|
|
|
+ /* A4DJ has only one control */
|
|
|
+ /* do not expose hardware input mode 0 */
|
|
|
+ dev->control_state[0] = ucontrol->value.integer.value[0] + 1;
|
|
|
+ snd_usb_caiaq_send_command(dev, EP1_CMD_WRITE_IO,
|
|
|
+ dev->control_state, sizeof(dev->control_state));
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+
|
|
|
if (pos & CNT_INTVAL) {
|
|
|
dev->control_state[pos & ~CNT_INTVAL]
|
|
|
= ucontrol->value.integer.value[0];
|
|
|
- snd_usb_caiaq_send_command(dev, EP1_CMD_DIMM_LEDS,
|
|
|
+ snd_usb_caiaq_send_command(dev, EP1_CMD_WRITE_IO,
|
|
|
dev->control_state, sizeof(dev->control_state));
|
|
|
} else {
|
|
|
if (ucontrol->value.integer.value[0])
|
|
@@ -243,10 +270,13 @@ static struct caiaq_controller a8dj_controller[] = {
|
|
|
{ "GND lift for TC Vinyl mode", 24 + 0 },
|
|
|
{ "GND lift for TC CD/Line mode", 24 + 1 },
|
|
|
{ "GND lift for phono mode", 24 + 2 },
|
|
|
- { "GND lift for TC Vinyl mode", 24 + 3 },
|
|
|
{ "Software lock", 40 }
|
|
|
};
|
|
|
|
|
|
+static struct caiaq_controller a4dj_controller[] = {
|
|
|
+ { "Current input mode", 0 | CNT_INTVAL }
|
|
|
+};
|
|
|
+
|
|
|
static int __devinit add_controls(struct caiaq_controller *c, int num,
|
|
|
struct snd_usb_caiaqdev *dev)
|
|
|
{
|
|
@@ -295,6 +325,10 @@ int __devinit snd_usb_caiaq_control_init(struct snd_usb_caiaqdev *dev)
|
|
|
ret = add_controls(a8dj_controller,
|
|
|
ARRAY_SIZE(a8dj_controller), dev);
|
|
|
break;
|
|
|
+ case USB_ID(USB_VID_NATIVEINSTRUMENTS, USB_PID_AUDIO4DJ):
|
|
|
+ ret = add_controls(a4dj_controller,
|
|
|
+ ARRAY_SIZE(a4dj_controller), dev);
|
|
|
+ break;
|
|
|
}
|
|
|
|
|
|
return ret;
|