All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/3] Alsa: USB: Improve M-Audio Fast Track Ultra mixer
@ 2012-04-23  9:16 Felix Homann
  2012-04-23  9:16 ` [PATCH 1/3] Unify M-Audio Fast Track Ultra and Ebox-44 mixer quirks Felix Homann
                   ` (2 more replies)
  0 siblings, 3 replies; 11+ messages in thread
From: Felix Homann @ 2012-04-23  9:16 UTC (permalink / raw)
  To: patch; +Cc: alsa-devel, Felix Homann, mark

This series of patches improves the mixer for Fast Track Ultra (8R)
devices by

	* adding TLV to existing controls
	* adding new controls for the effect section.

It unifies the control creation for FTU and Ebox-44 devices.

Mark, could you please look at mixer_quirks.c. Do we really need the range settings 
in snd_create_std_mono_ctl()? BTW, you might like to add some TLV callback to the
Ebox-44 controls as well.

Regards,

Felix

Felix Homann (3):
  Unify M-Audio Fast Track Ultra and Ebox-44 mixer quirks.
  Add TLV to M-Audio volume controls
  M-Audio FTU: Add effect controls

 sound/usb/mixer.c        |   23 +++
 sound/usb/mixer_quirks.c |  493 +++++++++++++++++++++++++++++++++++++++------
 2 files changed, 450 insertions(+), 66 deletions(-)

-- 
1.7.5.4

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH 1/3] Unify M-Audio Fast Track Ultra and Ebox-44 mixer quirks.
  2012-04-23  9:16 [PATCH 0/3] Alsa: USB: Improve M-Audio Fast Track Ultra mixer Felix Homann
@ 2012-04-23  9:16 ` Felix Homann
  2012-04-23  9:43   ` Takashi Iwai
  2012-04-23  9:16 ` [PATCH 2/3] Add TLV to M-Audio volume controls Felix Homann
  2012-04-23  9:16 ` [PATCH 3/3] M-Audio FTU: Add effect controls Felix Homann
  2 siblings, 1 reply; 11+ messages in thread
From: Felix Homann @ 2012-04-23  9:16 UTC (permalink / raw)
  To: patch; +Cc: alsa-devel, Felix Homann, mark

Allows for specifying a TLV callback.

Signed-off-by: Felix Homann <linuxaudio@showlabor.de>

diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
index e2072ed..e486c51 100644
--- a/sound/usb/mixer_quirks.c
+++ b/sound/usb/mixer_quirks.c
@@ -42,6 +42,85 @@
 
 extern struct snd_kcontrol_new *snd_usb_feature_unit_ctl;
 
+/* private_free callback */
+static void usb_mixer_elem_free(struct snd_kcontrol *kctl)
+{
+	kfree(kctl->private_data);
+	kctl->private_data = NULL;
+}
+
+/* This function allows for the creation of standard UAC controls.
+ * See the quirks for M-Audio FTUs or Ebox-44.
+ * If you don't want to set a TLV callback pass NULL.
+ * 
+ * Since there doesn't seem to be a devices that needs a multichannel
+ * version, we keep it mono for simplicity.
+ */
+static int snd_create_standard_mono_ctl(struct usb_mixer_interface *mixer,
+				unsigned int unitid,
+				unsigned int control,
+				unsigned int cmask,
+				int val_type,
+				const char *name,
+				snd_kcontrol_tlv_rw_t *tlv_callback)
+{
+	int err;
+	struct usb_mixer_elem_info *cval;
+	struct snd_kcontrol *kctl;
+
+	cval = kzalloc(sizeof(*cval), GFP_KERNEL);
+	if (!cval)
+		return -ENOMEM;
+
+	cval->id = unitid;
+	cval->mixer = mixer;
+	cval->val_type = val_type;
+	cval->channels = 1;
+	cval->control = control;
+	cval->cmask = cmask;
+
+	/* FIXME: Do we need this?
+	 * The following values are for compatibility with
+	 * Ebox-44 mixer.
+	 * But the corresponding ebox-44 function says:
+	 *    "Volume controls will override these values"
+	 * 
+	 * These values don't have any effect at all for
+	 * M-Audio FTUs.
+	 * So I think, we can safely omit the range settings here.
+	 */
+	cval->min = 0;
+	cval->max = 1;
+	cval->res = 0;
+	cval->dBmin = 0;
+	cval->dBmax = 0;
+
+	/* Create control */
+	kctl = snd_ctl_new1(snd_usb_feature_unit_ctl, cval);
+	if (!kctl) {
+		kfree(cval);
+		return -ENOMEM;
+	}
+
+	/* Set name */
+	snprintf(kctl->id.name, sizeof(kctl->id.name), name);
+	kctl->private_free = usb_mixer_elem_free;
+
+	/* set TLV */
+	if (tlv_callback != NULL) {
+		kctl->tlv.c = tlv_callback;
+		kctl->vd[0].access |=
+			SNDRV_CTL_ELEM_ACCESS_TLV_READ |
+			SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK;
+	}
+	/* Add control to mixer */
+	err = snd_usb_mixer_add_control(mixer, kctl);
+	if (err < 0)
+		return err;
+
+	return 0;
+}
+
 /*
  * Sound Blaster remote control configuration
  *
@@ -496,59 +575,37 @@ static int snd_nativeinstruments_create_mixer(struct usb_mixer_interface *mixer,
 
 /* M-Audio FastTrack Ultra quirks */
 
-/* private_free callback */
-static void usb_mixer_elem_free(struct snd_kcontrol *kctl)
-{
-	kfree(kctl->private_data);
-	kctl->private_data = NULL;
-}
-
-static int snd_maudio_ftu_create_ctl(struct usb_mixer_interface *mixer,
-				     int in, int out, const char *name)
-{
-	struct usb_mixer_elem_info *cval;
-	struct snd_kcontrol *kctl;
-
-	cval = kzalloc(sizeof(*cval), GFP_KERNEL);
-	if (!cval)
-		return -ENOMEM;
-
-	cval->id = 5;
-	cval->mixer = mixer;
-	cval->val_type = USB_MIXER_S16;
-	cval->channels = 1;
-	cval->control = out + 1;
-	cval->cmask = 1 << in;
-
-	kctl = snd_ctl_new1(snd_usb_feature_unit_ctl, cval);
-	if (!kctl) {
-		kfree(cval);
-		return -ENOMEM;
-	}
-
-	snprintf(kctl->id.name, sizeof(kctl->id.name), name);
-	kctl->private_free = usb_mixer_elem_free;
-	return snd_usb_mixer_add_control(mixer, kctl);
-}
-
-static int snd_maudio_ftu_create_mixer(struct usb_mixer_interface *mixer)
+/* Create a volume control for FTU devices*/
+static int snd_maudio_ftu_create_volume_ctls(struct usb_mixer_interface *mixer)
 {
 	char name[64];
-	int in, out, err;
+	unsigned int id, control, cmask;
+	int in, out, err, val_type;
+
+	id = 5;
+	val_type = USB_MIXER_S16;
 
 	for (out = 0; out < 8; out++) {
+		control = out + 1;
 		for (in = 0; in < 8; in++) {
+			cmask = 1 << in;
 			snprintf(name, sizeof(name),
-				 "AIn%d - Out%d Capture Volume", in  + 1, out + 1);
-			err = snd_maudio_ftu_create_ctl(mixer, in, out, name);
+				"AIn%d - Out%d Capture Volume",
+				in  + 1, out + 1);
+			err = snd_create_std_mono_ctl(mixer, id, control,
+							cmask, val_type, name,
+							NULL);
 			if (err < 0)
 				return err;
 		}
-
 		for (in = 8; in < 16; in++) {
+			cmask = 1 << in;
 			snprintf(name, sizeof(name),
-				 "DIn%d - Out%d Playback Volume", in - 7, out + 1);
-			err = snd_maudio_ftu_create_ctl(mixer, in, out, name);
+				"DIn%d - Out%d Playback Volume",
+				in - 7, out + 1);
+			err = snd_create_std_mono_ctl(mixer, id, control,
+							cmask, val_type, name,
+							NULL);
 			if (err < 0)
 				return err;
 		}
@@ -557,44 +614,18 @@ static int snd_maudio_ftu_create_mixer(struct usb_mixer_interface *mixer)
 	return 0;
 }
 
-static int snd_ebox44_create_ctl(struct usb_mixer_interface *mixer,
-				int unitid, int control, int cmask,
-				int val_type, const char *name)
+static int snd_maudio_ftu_create_mixer(struct usb_mixer_interface *mixer)
 {
-	struct usb_mixer_elem_info *cval;
-	struct snd_kcontrol *kctl;
-
-	cval = kzalloc(sizeof(*cval), GFP_KERNEL);
-	if (!cval)
-		return -ENOMEM;
-
-	cval->id = unitid;
-	cval->mixer = mixer;
-
-	cval->val_type = val_type;
-	cval->channels = 1;
-	cval->control = control;
-	cval->cmask = cmask;
-
-	/* Volume controls will override these values */
-	cval->min = 0;
-	cval->max = 1;
-	cval->res = 0;
-
-	cval->dBmin = 0;
-	cval->dBmax = 0;
+	int err;
 
-	kctl = snd_ctl_new1(snd_usb_feature_unit_ctl, cval);
-	if (!kctl) {
-		kfree(cval);
-		return -ENOMEM;
-	}
+	err = snd_maudio_ftu_create_volume_ctls(mixer);
+	if (err < 0)
+		return err;
 
-	snprintf(kctl->id.name, sizeof(kctl->id.name), name);
-	kctl->private_free = usb_mixer_elem_free;
-	return snd_usb_mixer_add_control(mixer, kctl);
+	return 0;
 }
 
+
 /*
  * Create mixer for Electrix Ebox-44
  *
@@ -605,17 +636,17 @@ static int snd_ebox44_create_ctl(struct usb_mixer_interface *mixer,
 
 static int snd_ebox44_create_mixer(struct usb_mixer_interface *mixer)
 {
-	snd_ebox44_create_ctl(mixer, 4, 1, 0x0, USB_MIXER_INV_BOOLEAN, "Headphone Playback Switch");
-	snd_ebox44_create_ctl(mixer, 4, 2, 0x1, USB_MIXER_S16, "Headphone A Mix Playback Volume");
-	snd_ebox44_create_ctl(mixer, 4, 2, 0x2, USB_MIXER_S16, "Headphone B Mix Playback Volume");
+	snd_create_std_mono_ctl(mixer, 4, 1, 0x0, USB_MIXER_INV_BOOLEAN, "Headphone Playback Switch", NULL);
+	snd_create_std_mono_ctl(mixer, 4, 2, 0x1, USB_MIXER_S16, "Headphone A Mix Playback Volume", NULL);
+	snd_create_std_mono_ctl(mixer, 4, 2, 0x2, USB_MIXER_S16, "Headphone B Mix Playback Volume", NULL);
 
-	snd_ebox44_create_ctl(mixer, 7, 1, 0x0, USB_MIXER_INV_BOOLEAN, "Output Playback Switch");
-	snd_ebox44_create_ctl(mixer, 7, 2, 0x1, USB_MIXER_S16, "Output A Playback Volume");
-	snd_ebox44_create_ctl(mixer, 7, 2, 0x2, USB_MIXER_S16, "Output B Playback Volume");
+	snd_create_std_mono_ctl(mixer, 7, 1, 0x0, USB_MIXER_INV_BOOLEAN, "Output Playback Switch", NULL);
+	snd_create_std_mono_ctl(mixer, 7, 2, 0x1, USB_MIXER_S16, "Output A Playback Volume", NULL);
+	snd_create_std_mono_ctl(mixer, 7, 2, 0x2, USB_MIXER_S16, "Output B Playback Volume", NULL);
 
-	snd_ebox44_create_ctl(mixer, 10, 1, 0x0, USB_MIXER_INV_BOOLEAN, "Input Capture Switch");
-	snd_ebox44_create_ctl(mixer, 10, 2, 0x1, USB_MIXER_S16, "Input A Capture Volume");
-	snd_ebox44_create_ctl(mixer, 10, 2, 0x2, USB_MIXER_S16, "Input B Capture Volume");
+	snd_create_std_mono_ctl(mixer, 10, 1, 0x0, USB_MIXER_INV_BOOLEAN, "Input Capture Switch", NULL);
+	snd_create_std_mono_ctl(mixer, 10, 2, 0x1, USB_MIXER_S16, "Input A Capture Volume", NULL);
+	snd_create_std_mono_ctl(mixer, 10, 2, 0x2, USB_MIXER_S16, "Input B Capture Volume", NULL);
 
 	return 0;
 }
-- 
1.7.5.4

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 2/3] Add TLV to M-Audio volume controls
  2012-04-23  9:16 [PATCH 0/3] Alsa: USB: Improve M-Audio Fast Track Ultra mixer Felix Homann
  2012-04-23  9:16 ` [PATCH 1/3] Unify M-Audio Fast Track Ultra and Ebox-44 mixer quirks Felix Homann
@ 2012-04-23  9:16 ` Felix Homann
  2012-04-23  9:43   ` Takashi Iwai
  2012-04-23  9:16 ` [PATCH 3/3] M-Audio FTU: Add effect controls Felix Homann
  2 siblings, 1 reply; 11+ messages in thread
From: Felix Homann @ 2012-04-23  9:16 UTC (permalink / raw)
  To: patch; +Cc: alsa-devel, Felix Homann, mark


Signed-off-by: Felix Homann <linuxaudio@showlabor.de>

diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c
index c374c72..596744f 100644
--- a/sound/usb/mixer.c
+++ b/sound/usb/mixer.c
@@ -501,6 +501,11 @@ static int mixer_vol_tlv(struct snd_kcontrol *kcontrol, int op_flag,
 	return 0;
 }
 
+/* This symbol is exported in order to reuse it in mixer_quirks.c */
+int (*snd_usb_mixer_vol_tlv)(struct snd_kcontrol *kcontrol, int op_flag,
+			unsigned int size,
+			unsigned int __user *_tlv) = &mixer_vol_tlv;
+
 /*
  * parser routines begin here...
  */
diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
index e486c51..5b52275 100644
--- a/sound/usb/mixer_quirks.c
+++ b/sound/usb/mixer_quirks.c
@@ -41,6 +41,8 @@
 #include "helper.h"
 
 extern struct snd_kcontrol_new *snd_usb_feature_unit_ctl;
+extern int (*snd_usb_mixer_vol_tlv)(struct snd_kcontrol *kcontrol, int op_flag,
+				unsigned int size, unsigned int __user *_tlv);
 
 /* private_free callback */
 static void usb_mixer_elem_free(struct snd_kcontrol *kctl)
@@ -594,7 +596,7 @@ static int snd_maudio_ftu_create_volume_ctls(struct usb_mixer_interface *mixer)
 				in  + 1, out + 1);
 			err = snd_create_std_mono_ctl(mixer, id, control,
 							cmask, val_type, name,
-							NULL);
+							snd_usb_mixer_vol_tlv);
 			if (err < 0)
 				return err;
 		}
@@ -605,7 +607,7 @@ static int snd_maudio_ftu_create_volume_ctls(struct usb_mixer_interface *mixer)
 				in - 7, out + 1);
 			err = snd_create_std_mono_ctl(mixer, id, control,
 							cmask, val_type, name,
-							NULL);
+							snd_usb_mixer_vol_tlv);
 			if (err < 0)
 				return err;
 		}
-- 
1.7.5.4

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH 3/3] M-Audio FTU: Add effect controls
  2012-04-23  9:16 [PATCH 0/3] Alsa: USB: Improve M-Audio Fast Track Ultra mixer Felix Homann
  2012-04-23  9:16 ` [PATCH 1/3] Unify M-Audio Fast Track Ultra and Ebox-44 mixer quirks Felix Homann
  2012-04-23  9:16 ` [PATCH 2/3] Add TLV to M-Audio volume controls Felix Homann
@ 2012-04-23  9:16 ` Felix Homann
  2012-04-23  9:52   ` Takashi Iwai
  2 siblings, 1 reply; 11+ messages in thread
From: Felix Homann @ 2012-04-23  9:16 UTC (permalink / raw)
  To: patch; +Cc: alsa-devel, Felix Homann, mark


Signed-off-by: Felix Homann <linuxaudio@showlabor.de>

diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c
index 596744f..be46657 100644
--- a/sound/usb/mixer.c
+++ b/sound/usb/mixer.c
@@ -775,6 +775,24 @@ static void volume_control_quirks(struct usb_mixer_elem_info *cval,
 				  struct snd_kcontrol *kctl)
 {
 	switch (cval->mixer->chip->usb_id) {
+	case USB_ID(0x0763, 0x2081): /* M-Audio Fast Track Ultra 8R */
+	case USB_ID(0x0763, 0x2080): /* M-Audio Fast Track Ultra */
+		if ((strcmp(kctl->id.name, "Effect Duration") == 0)) {
+			snd_printk(KERN_INFO
+				"set quirk for FTU Effect Duration\n");
+			cval->min = 0x0000;
+			cval->max = 0x7f00;
+			cval->res = 0x0100;
+			break;
+		}
+		if ((strcmp(kctl->id.name, "Effect Volume") == 0) |
+			(strcmp(kctl->id.name, "Effect Feedback Volume") == 0)) {
+			snd_printk(KERN_INFO
+				"set quirks for FTU Effect Feedback/Volume\n");
+			cval->min = 0x00;
+			cval->max = 0x7f;
+			break;
+		}
 	case USB_ID(0x0471, 0x0101):
 	case USB_ID(0x0471, 0x0104):
 	case USB_ID(0x0471, 0x0105):
diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
index 5b52275..588fe9c 100644
--- a/sound/usb/mixer_quirks.c
+++ b/sound/usb/mixer_quirks.c
@@ -58,7 +58,7 @@ static void usb_mixer_elem_free(struct snd_kcontrol *kctl)
  * Since there doesn't seem to be a devices that needs a multichannel
  * version, we keep it mono for simplicity.
  */
-static int snd_create_standard_mono_ctl(struct usb_mixer_interface *mixer,
+static int snd_create_std_mono_ctl(struct usb_mixer_interface *mixer,
 				unsigned int unitid,
 				unsigned int control,
 				unsigned int cmask,
@@ -577,6 +577,302 @@ static int snd_nativeinstruments_create_mixer(struct usb_mixer_interface *mixer,
 
 /* M-Audio FastTrack Ultra quirks */
 
+/* FTU Effect switch */
+struct snd_maudio_ftu_effect_switch_private_value {
+	struct usb_mixer_interface *mixer;
+	int cached_value;
+	int is_cached;
+};
+
+
+static int snd_maudio_ftu_effect_switch_info(struct snd_kcontrol *kcontrol,
+					struct snd_ctl_elem_info *uinfo)
+{
+	static char *texts[8] = {"Room 1",
+				 "Room 2",
+				 "Room 3",
+				 "Hall 1",
+				 "Hall 2",
+				 "Plate",
+				 "Delay",
+				 "Echo"
+	};
+
+	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
+	uinfo->count = 1;
+	uinfo->value.enumerated.items = 8;
+	if (uinfo->value.enumerated.item > 7)
+		uinfo->value.enumerated.item = 7;
+	strcpy(uinfo->value.enumerated.name,
+		texts[uinfo->value.enumerated.item]);
+
+	return 0;
+}
+
+static int snd_maudio_ftu_effect_switch_get(struct snd_kcontrol *kctl,
+					struct snd_ctl_elem_value *ucontrol)
+{
+	struct snd_usb_audio *chip;
+	struct usb_mixer_interface *mixer;
+	struct snd_maudio_ftu_effect_switch_private_value *pval;
+	int err, id, validx, val_len, val_type;
+	unsigned char value[2];
+
+	pval = (struct snd_maudio_ftu_effect_switch_private_value *)
+		kctl->private_value;
+
+	if (pval->is_cached) {
+		ucontrol->value.enumerated.item[0] = pval->cached_value;
+		return 0;
+	}
+
+	mixer = (struct usb_mixer_interface *) pval->mixer;
+	if (mixer == NULL) {
+		snd_printd(KERN_ERR "mixer == NULL");
+		return -1;
+	}
+
+	chip = (struct snd_usb_audio *) mixer->chip;
+	if (chip == NULL) {
+		snd_printd(KERN_ERR "chip == NULL");
+		return -1;
+	}
+
+	id = 6;
+	validx = 1;
+	val_type = USB_MIXER_S16;
+
+	value[0] = 0x00;
+	value[1] = 0x00;
+
+	val_len = 2;
+
+	err = snd_usb_ctl_msg(chip->dev,
+			usb_rcvctrlpipe(chip->dev, 0), UAC_GET_CUR,
+			USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN,
+			validx << 8, snd_usb_ctrl_intf(chip) | (id << 8),
+			value, val_len);
+	if (err < 0)
+		return -1;
+
+	ucontrol->value.enumerated.item[0] = value[0];
+	pval->cached_value = value[0];
+	pval->is_cached = 1;
+
+	return 0;
+}
+
+static int snd_maudio_ftu_effect_switch_put(struct snd_kcontrol *kctl,
+					struct snd_ctl_elem_value *ucontrol)
+{
+	struct snd_usb_audio *chip;
+	struct snd_maudio_ftu_effect_switch_private_value *pval;
+
+	struct usb_mixer_interface *mixer;
+	int  changed, cur_val, err, id, new_val, validx, val_len, val_type;
+	unsigned char value[2];
+
+	changed = 0;
+	id = 6;
+	validx = 1;
+	val_type = USB_MIXER_S16;
+
+	val_len = 2;
+	pval = (struct snd_maudio_ftu_effect_switch_private_value *)
+		kctl->private_value;
+	cur_val = pval->cached_value;
+	new_val = ucontrol->value.enumerated.item[0];
+
+	mixer = (struct usb_mixer_interface *) pval->mixer;
+	if (mixer == NULL) {
+		snd_printd(KERN_ERR "mixer == NULL");
+		return -1;
+	}
+
+	chip = (struct snd_usb_audio *) mixer->chip;
+	if (chip == NULL) {
+		snd_printd(KERN_ERR "chip == NULL");
+		return -1;
+	}
+
+	if (!pval->is_cached) {
+		/* Read current value */
+		err = snd_usb_ctl_msg(chip->dev,
+				usb_rcvctrlpipe(chip->dev, 0), UAC_GET_CUR,
+				USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN,
+				validx << 8, snd_usb_ctrl_intf(chip) | (id << 8),
+				value, val_len);
+		if (err < 0)
+			return -1;
+
+		cur_val = value[0];
+		pval->cached_value = cur_val;
+		pval->is_cached = 1;
+	}
+	/* update value if needed */
+	if (cur_val != new_val) {
+		value[0] = new_val;
+		value[1] = 0;
+		err = snd_usb_ctl_msg(chip->dev,
+				usb_sndctrlpipe(chip->dev, 0), UAC_SET_CUR,
+				USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT,
+				validx << 8, snd_usb_ctrl_intf(chip) | (id << 8),
+				value, val_len);
+		if (err < 0)
+			return -1;
+
+		pval->cached_value = new_val;
+		pval->is_cached = 1;
+		changed = 1;
+	}
+
+	return changed;
+}
+
+static int snd_maudio_ftu_create_effect_switch(struct usb_mixer_interface *mixer)
+{
+	struct snd_kcontrol_new template = {
+		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+		.name = "Effect Program Switch",
+		.index = 0,
+		.access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
+		.info = snd_maudio_ftu_effect_switch_info,
+		.get = snd_maudio_ftu_effect_switch_get,
+		.put = snd_maudio_ftu_effect_switch_put
+	};
+
+	int err;
+	struct snd_kcontrol *kctl;
+	struct snd_maudio_ftu_effect_switch_private_value *pval;
+
+	pval = kzalloc(sizeof(*pval), GFP_KERNEL);
+	if (!pval)
+		return -ENOMEM;
+
+	pval->cached_value = 0;
+	pval->is_cached = 0;
+	pval->mixer = mixer;
+
+	template.private_value = (unsigned long) pval;
+	kctl = snd_ctl_new1(&template, mixer->chip);
+	if (!kctl) {
+		kfree(pval);
+		return -ENOMEM;
+	}
+
+	err = snd_ctl_add(mixer->chip->card, kctl);
+	if (err < 0)
+		return err;
+
+	return 0;
+}
+
+static int snd_maudio_ftu_create_effect_volume_ctl(struct usb_mixer_interface *mixer)
+{
+	unsigned int id, control, cmask;
+	int val_type;
+
+	char name[] = "Effect Volume";
+
+	id = 6;
+	val_type = USB_MIXER_U8;
+	control = 2;
+	cmask = 0;
+
+	return snd_create_std_mono_ctl(mixer, id, control, cmask, val_type,
+					name, snd_usb_mixer_vol_tlv);
+}
+
+static int snd_maudio_ftu_create_effect_duration_ctl(struct usb_mixer_interface *mixer)
+{
+	unsigned int id, control, cmask;
+	int val_type;
+
+	char name[] = "Effect Duration";
+
+	id = 6;
+	val_type = USB_MIXER_S16;
+	control = 3;
+	cmask = 0;
+
+	return snd_create_std_mono_ctl(mixer, id, control, cmask, val_type,
+					name, snd_usb_mixer_vol_tlv);
+}
+
+static int snd_maudio_ftu_create_effect_feedback_ctl(struct usb_mixer_interface *mixer)
+{
+	unsigned int id, control, cmask;
+	int val_type;
+
+	char name[] = "Effect Feedback Volume";
+
+	id = 6;
+	val_type = USB_MIXER_U8;
+	control = 4;
+	cmask = 0;
+
+	return snd_create_std_mono_ctl(mixer, id, control, cmask, val_type,
+					name, NULL);
+}
+
+static int snd_maudio_ftu_create_effect_return_ctls(struct usb_mixer_interface *mixer)
+{
+	unsigned int id, control, cmask;
+	int err, val_type, ch;
+	char name[48];
+
+	id = 7;
+	val_type = USB_MIXER_S16;
+	control = 2;
+
+	for (ch = 0; ch < 4; ++ch) {
+		cmask = 1 << ch;
+		snprintf(name, sizeof(name),
+			"Effect Return %d Volume", ch + 1);
+		err = snd_create_std_mono_ctl(mixer, id, control,
+						cmask, val_type, name,
+						snd_usb_mixer_vol_tlv);
+		if (err < 0)
+			return err;
+	}
+
+	return 0;
+}
+
+static int snd_maudio_ftu_create_effect_send_ctls(struct usb_mixer_interface *mixer)
+{
+	unsigned int id, control, cmask;
+	int err, val_type, ch;
+	char name[48];
+
+	id = 5;
+	val_type = USB_MIXER_S16;
+	control = 9;
+
+	for (ch = 0; ch < 8; ++ch) {
+		cmask = 1 << ch;
+		snprintf(name, sizeof(name),
+			"Effect Send AIn%d Volume", ch + 1);
+		err = snd_create_std_mono_ctl(mixer, id, control, cmask,
+						val_type, name,
+						snd_usb_mixer_vol_tlv);
+		if (err < 0)
+			return err;
+	}
+	for (ch = 8; ch < 16; ++ch) {
+		cmask = 1 << ch;
+		snprintf(name, sizeof(name),
+			"Effect Send DIn%d Volume", ch - 7);
+		err = snd_create_std_mono_ctl(mixer, id, control, cmask,
+						val_type, name,
+						snd_usb_mixer_vol_tlv);
+		if (err < 0)
+			return err;
+	}
+	return 0;
+}
+
+
 /* Create a volume control for FTU devices*/
 static int snd_maudio_ftu_create_volume_ctls(struct usb_mixer_interface *mixer)
 {
@@ -624,10 +920,33 @@ static int snd_maudio_ftu_create_mixer(struct usb_mixer_interface *mixer)
 	if (err < 0)
 		return err;
 
+	err = snd_maudio_ftu_create_effect_volume_ctl(mixer);
+	if (err < 0)
+		return err;
+
+	err = snd_maudio_ftu_create_effect_duration_ctl(mixer);
+	if (err < 0)
+		return err;
+
+	err = snd_maudio_ftu_create_effect_feedback_ctl(mixer);
+	if (err < 0)
+		return err;
+
+	err = snd_maudio_ftu_create_effect_return_ctls(mixer);
+	if (err < 0)
+		return err;
+
+	err = snd_maudio_ftu_create_effect_send_ctls(mixer);
+	if (err < 0)
+		return err;
+
+	err = snd_maudio_ftu_create_effect_switch(mixer);
+	if (err < 0)
+		return err;
+
 	return 0;
 }
 
-
 /*
  * Create mixer for Electrix Ebox-44
  *
@@ -638,17 +957,26 @@ static int snd_maudio_ftu_create_mixer(struct usb_mixer_interface *mixer)
 
 static int snd_ebox44_create_mixer(struct usb_mixer_interface *mixer)
 {
-	snd_create_std_mono_ctl(mixer, 4, 1, 0x0, USB_MIXER_INV_BOOLEAN, "Headphone Playback Switch", NULL);
-	snd_create_std_mono_ctl(mixer, 4, 2, 0x1, USB_MIXER_S16, "Headphone A Mix Playback Volume", NULL);
-	snd_create_std_mono_ctl(mixer, 4, 2, 0x2, USB_MIXER_S16, "Headphone B Mix Playback Volume", NULL);
-
-	snd_create_std_mono_ctl(mixer, 7, 1, 0x0, USB_MIXER_INV_BOOLEAN, "Output Playback Switch", NULL);
-	snd_create_std_mono_ctl(mixer, 7, 2, 0x1, USB_MIXER_S16, "Output A Playback Volume", NULL);
-	snd_create_std_mono_ctl(mixer, 7, 2, 0x2, USB_MIXER_S16, "Output B Playback Volume", NULL);
-
-	snd_create_std_mono_ctl(mixer, 10, 1, 0x0, USB_MIXER_INV_BOOLEAN, "Input Capture Switch", NULL);
-	snd_create_std_mono_ctl(mixer, 10, 2, 0x1, USB_MIXER_S16, "Input A Capture Volume", NULL);
-	snd_create_std_mono_ctl(mixer, 10, 2, 0x2, USB_MIXER_S16, "Input B Capture Volume", NULL);
+	snd_create_std_mono_ctl(mixer, 4, 1, 0x0, USB_MIXER_INV_BOOLEAN,
+				"Headphone Playback Switch", NULL);
+	snd_create_std_mono_ctl(mixer, 4, 2, 0x1, USB_MIXER_S16,
+				"Headphone A Mix Playback Volume", NULL);
+	snd_create_std_mono_ctl(mixer, 4, 2, 0x2, USB_MIXER_S16,
+				"Headphone B Mix Playback Volume", NULL);
+
+	snd_create_std_mono_ctl(mixer, 7, 1, 0x0, USB_MIXER_INV_BOOLEAN,
+				"Output Playback Switch", NULL);
+	snd_create_std_mono_ctl(mixer, 7, 2, 0x1, USB_MIXER_S16,
+				"Output A Playback Volume", NULL);
+	snd_create_std_mono_ctl(mixer, 7, 2, 0x2, USB_MIXER_S16,
+				"Output B Playback Volume", NULL);
+
+	snd_create_std_mono_ctl(mixer, 10, 1, 0x0, USB_MIXER_INV_BOOLEAN,
+				"Input Capture Switch", NULL);
+	snd_create_std_mono_ctl(mixer, 10, 2, 0x1, USB_MIXER_S16,
+				"Input A Capture Volume", NULL);
+	snd_create_std_mono_ctl(mixer, 10, 2, 0x2, USB_MIXER_S16,
+				"Input B Capture Volume", NULL);
 
 	return 0;
 }
-- 
1.7.5.4

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH 1/3] Unify M-Audio Fast Track Ultra and Ebox-44 mixer quirks.
  2012-04-23  9:16 ` [PATCH 1/3] Unify M-Audio Fast Track Ultra and Ebox-44 mixer quirks Felix Homann
@ 2012-04-23  9:43   ` Takashi Iwai
  2012-04-23  9:57     ` Felix Homann
  0 siblings, 1 reply; 11+ messages in thread
From: Takashi Iwai @ 2012-04-23  9:43 UTC (permalink / raw)
  To: Felix Homann; +Cc: alsa-devel, patch, mark

At Mon, 23 Apr 2012 11:16:06 +0200,
Felix Homann wrote:
> 
> Allows for specifying a TLV callback.

Too little information as the patch changelog.
Please be more specific what and how is implemented there.

> 
> Signed-off-by: Felix Homann <linuxaudio@showlabor.de>
> 
> diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
> index e2072ed..e486c51 100644
> --- a/sound/usb/mixer_quirks.c
> +++ b/sound/usb/mixer_quirks.c
> @@ -42,6 +42,85 @@
>  
>  extern struct snd_kcontrol_new *snd_usb_feature_unit_ctl;
>  
> +/* private_free callback */
> +static void usb_mixer_elem_free(struct snd_kcontrol *kctl)
> +{
> +	kfree(kctl->private_data);
> +	kctl->private_data = NULL;
> +}
> +
> +/* This function allows for the creation of standard UAC controls.
> + * See the quirks for M-Audio FTUs or Ebox-44.
> + * If you don't want to set a TLV callback pass NULL.
> + * 
> + * Since there doesn't seem to be a devices that needs a multichannel
> + * version, we keep it mono for simplicity.
> + */
> +static int snd_create_standard_mono_ctl(struct usb_mixer_interface *mixer,
> +				unsigned int unitid,
> +				unsigned int control,
> +				unsigned int cmask,
> +				int val_type,
> +				const char *name,
> +				snd_kcontrol_tlv_rw_t *tlv_callback)

This should be snd_create_std_mono_ctl(), no?
Each patch should be able to be built properly.  Otherwise it breaks
the bisection.


> +{
> +	int err;
> +	struct usb_mixer_elem_info *cval;
> +	struct snd_kcontrol *kctl;
> +
> +	cval = kzalloc(sizeof(*cval), GFP_KERNEL);
> +	if (!cval)
> +		return -ENOMEM;
> +
> +	cval->id = unitid;
> +	cval->mixer = mixer;
> +	cval->val_type = val_type;
> +	cval->channels = 1;
> +	cval->control = control;
> +	cval->cmask = cmask;
> +
> +	/* FIXME: Do we need this?
> +	 * The following values are for compatibility with
> +	 * Ebox-44 mixer.
> +	 * But the corresponding ebox-44 function says:
> +	 *    "Volume controls will override these values"
> +	 * 
> +	 * These values don't have any effect at all for
> +	 * M-Audio FTUs.
> +	 * So I think, we can safely omit the range settings here.
> +	 */
> +	cval->min = 0;
> +	cval->max = 1;
> +	cval->res = 0;
> +	cval->dBmin = 0;
> +	cval->dBmax = 0;
> +
> +	/* Create control */
> +	kctl = snd_ctl_new1(snd_usb_feature_unit_ctl, cval);
> +	if (!kctl) {
> +		kfree(cval);
> +		return -ENOMEM;
> +	}
> +
> +	/* Set name */
> +	snprintf(kctl->id.name, sizeof(kctl->id.name), name);
> +	kctl->private_free = usb_mixer_elem_free;
> +
> +	/* set TLV */
> +	if (tlv_callback != NULL) {

Should be "if (!tlv_callback)"

> +		kctl->tlv.c = tlv_callback;
> +		kctl->vd[0].access |=
> +			SNDRV_CTL_ELEM_ACCESS_TLV_READ |
> +			SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK;
> +	}
> +	/* Add control to mixer */
> +	err = snd_usb_mixer_add_control(mixer, kctl);
> +	if (err < 0)
> +		return err;
> +
> +	return 0;
> +}
> +
>  /*
>   * Sound Blaster remote control configuration
>   *
> @@ -496,59 +575,37 @@ static int snd_nativeinstruments_create_mixer(struct usb_mixer_interface *mixer,
>  
>  /* M-Audio FastTrack Ultra quirks */
>  
> -/* private_free callback */
> -static void usb_mixer_elem_free(struct snd_kcontrol *kctl)
> -{
> -	kfree(kctl->private_data);
> -	kctl->private_data = NULL;
> -}
> -
> -static int snd_maudio_ftu_create_ctl(struct usb_mixer_interface *mixer,
> -				     int in, int out, const char *name)
> -{
> -	struct usb_mixer_elem_info *cval;
> -	struct snd_kcontrol *kctl;
> -
> -	cval = kzalloc(sizeof(*cval), GFP_KERNEL);
> -	if (!cval)
> -		return -ENOMEM;
> -
> -	cval->id = 5;
> -	cval->mixer = mixer;
> -	cval->val_type = USB_MIXER_S16;
> -	cval->channels = 1;
> -	cval->control = out + 1;
> -	cval->cmask = 1 << in;
> -
> -	kctl = snd_ctl_new1(snd_usb_feature_unit_ctl, cval);
> -	if (!kctl) {
> -		kfree(cval);
> -		return -ENOMEM;
> -	}
> -
> -	snprintf(kctl->id.name, sizeof(kctl->id.name), name);
> -	kctl->private_free = usb_mixer_elem_free;
> -	return snd_usb_mixer_add_control(mixer, kctl);
> -}
> -
> -static int snd_maudio_ftu_create_mixer(struct usb_mixer_interface *mixer)
> +/* Create a volume control for FTU devices*/
> +static int snd_maudio_ftu_create_volume_ctls(struct usb_mixer_interface *mixer)
>  {
>  	char name[64];
> -	int in, out, err;
> +	unsigned int id, control, cmask;
> +	int in, out, err, val_type;
> +
> +	id = 5;
> +	val_type = USB_MIXER_S16;

Give const.  I don't mind use such styles instead of define or
hard-coded in the function calls, but then it should be marked as
const properly.


thanks,

Takashi


>  
>  	for (out = 0; out < 8; out++) {
> +		control = out + 1;
>  		for (in = 0; in < 8; in++) {
> +			cmask = 1 << in;
>  			snprintf(name, sizeof(name),
> -				 "AIn%d - Out%d Capture Volume", in  + 1, out + 1);
> -			err = snd_maudio_ftu_create_ctl(mixer, in, out, name);
> +				"AIn%d - Out%d Capture Volume",
> +				in  + 1, out + 1);
> +			err = snd_create_std_mono_ctl(mixer, id, control,
> +							cmask, val_type, name,
> +							NULL);
>  			if (err < 0)
>  				return err;
>  		}
> -
>  		for (in = 8; in < 16; in++) {
> +			cmask = 1 << in;
>  			snprintf(name, sizeof(name),
> -				 "DIn%d - Out%d Playback Volume", in - 7, out + 1);
> -			err = snd_maudio_ftu_create_ctl(mixer, in, out, name);
> +				"DIn%d - Out%d Playback Volume",
> +				in - 7, out + 1);
> +			err = snd_create_std_mono_ctl(mixer, id, control,
> +							cmask, val_type, name,
> +							NULL);
>  			if (err < 0)
>  				return err;
>  		}
> @@ -557,44 +614,18 @@ static int snd_maudio_ftu_create_mixer(struct usb_mixer_interface *mixer)
>  	return 0;
>  }
>  
> -static int snd_ebox44_create_ctl(struct usb_mixer_interface *mixer,
> -				int unitid, int control, int cmask,
> -				int val_type, const char *name)
> +static int snd_maudio_ftu_create_mixer(struct usb_mixer_interface *mixer)
>  {
> -	struct usb_mixer_elem_info *cval;
> -	struct snd_kcontrol *kctl;
> -
> -	cval = kzalloc(sizeof(*cval), GFP_KERNEL);
> -	if (!cval)
> -		return -ENOMEM;
> -
> -	cval->id = unitid;
> -	cval->mixer = mixer;
> -
> -	cval->val_type = val_type;
> -	cval->channels = 1;
> -	cval->control = control;
> -	cval->cmask = cmask;
> -
> -	/* Volume controls will override these values */
> -	cval->min = 0;
> -	cval->max = 1;
> -	cval->res = 0;
> -
> -	cval->dBmin = 0;
> -	cval->dBmax = 0;
> +	int err;
>  
> -	kctl = snd_ctl_new1(snd_usb_feature_unit_ctl, cval);
> -	if (!kctl) {
> -		kfree(cval);
> -		return -ENOMEM;
> -	}
> +	err = snd_maudio_ftu_create_volume_ctls(mixer);
> +	if (err < 0)
> +		return err;
>  
> -	snprintf(kctl->id.name, sizeof(kctl->id.name), name);
> -	kctl->private_free = usb_mixer_elem_free;
> -	return snd_usb_mixer_add_control(mixer, kctl);
> +	return 0;
>  }
>  
> +
>  /*
>   * Create mixer for Electrix Ebox-44
>   *
> @@ -605,17 +636,17 @@ static int snd_ebox44_create_ctl(struct usb_mixer_interface *mixer,
>  
>  static int snd_ebox44_create_mixer(struct usb_mixer_interface *mixer)
>  {
> -	snd_ebox44_create_ctl(mixer, 4, 1, 0x0, USB_MIXER_INV_BOOLEAN, "Headphone Playback Switch");
> -	snd_ebox44_create_ctl(mixer, 4, 2, 0x1, USB_MIXER_S16, "Headphone A Mix Playback Volume");
> -	snd_ebox44_create_ctl(mixer, 4, 2, 0x2, USB_MIXER_S16, "Headphone B Mix Playback Volume");
> +	snd_create_std_mono_ctl(mixer, 4, 1, 0x0, USB_MIXER_INV_BOOLEAN, "Headphone Playback Switch", NULL);
> +	snd_create_std_mono_ctl(mixer, 4, 2, 0x1, USB_MIXER_S16, "Headphone A Mix Playback Volume", NULL);
> +	snd_create_std_mono_ctl(mixer, 4, 2, 0x2, USB_MIXER_S16, "Headphone B Mix Playback Volume", NULL);
>  
> -	snd_ebox44_create_ctl(mixer, 7, 1, 0x0, USB_MIXER_INV_BOOLEAN, "Output Playback Switch");
> -	snd_ebox44_create_ctl(mixer, 7, 2, 0x1, USB_MIXER_S16, "Output A Playback Volume");
> -	snd_ebox44_create_ctl(mixer, 7, 2, 0x2, USB_MIXER_S16, "Output B Playback Volume");
> +	snd_create_std_mono_ctl(mixer, 7, 1, 0x0, USB_MIXER_INV_BOOLEAN, "Output Playback Switch", NULL);
> +	snd_create_std_mono_ctl(mixer, 7, 2, 0x1, USB_MIXER_S16, "Output A Playback Volume", NULL);
> +	snd_create_std_mono_ctl(mixer, 7, 2, 0x2, USB_MIXER_S16, "Output B Playback Volume", NULL);
>  
> -	snd_ebox44_create_ctl(mixer, 10, 1, 0x0, USB_MIXER_INV_BOOLEAN, "Input Capture Switch");
> -	snd_ebox44_create_ctl(mixer, 10, 2, 0x1, USB_MIXER_S16, "Input A Capture Volume");
> -	snd_ebox44_create_ctl(mixer, 10, 2, 0x2, USB_MIXER_S16, "Input B Capture Volume");
> +	snd_create_std_mono_ctl(mixer, 10, 1, 0x0, USB_MIXER_INV_BOOLEAN, "Input Capture Switch", NULL);
> +	snd_create_std_mono_ctl(mixer, 10, 2, 0x1, USB_MIXER_S16, "Input A Capture Volume", NULL);
> +	snd_create_std_mono_ctl(mixer, 10, 2, 0x2, USB_MIXER_S16, "Input B Capture Volume", NULL);
>  
>  	return 0;
>  }
> -- 
> 1.7.5.4
> 

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 2/3] Add TLV to M-Audio volume controls
  2012-04-23  9:16 ` [PATCH 2/3] Add TLV to M-Audio volume controls Felix Homann
@ 2012-04-23  9:43   ` Takashi Iwai
  0 siblings, 0 replies; 11+ messages in thread
From: Takashi Iwai @ 2012-04-23  9:43 UTC (permalink / raw)
  To: Felix Homann; +Cc: alsa-devel, patch, mark

At Mon, 23 Apr 2012 11:16:07 +0200,
Felix Homann wrote:
> 
> 
> Signed-off-by: Felix Homann <linuxaudio@showlabor.de>
> 
> diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c
> index c374c72..596744f 100644
> --- a/sound/usb/mixer.c
> +++ b/sound/usb/mixer.c
> @@ -501,6 +501,11 @@ static int mixer_vol_tlv(struct snd_kcontrol *kcontrol, int op_flag,
>  	return 0;
>  }
>  
> +/* This symbol is exported in order to reuse it in mixer_quirks.c */
> +int (*snd_usb_mixer_vol_tlv)(struct snd_kcontrol *kcontrol, int op_flag,
> +			unsigned int size,
> +			unsigned int __user *_tlv) = &mixer_vol_tlv;

Where is it defined...?


Takashi

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 3/3] M-Audio FTU: Add effect controls
  2012-04-23  9:16 ` [PATCH 3/3] M-Audio FTU: Add effect controls Felix Homann
@ 2012-04-23  9:52   ` Takashi Iwai
  2012-04-23 10:19     ` Felix Homann
  0 siblings, 1 reply; 11+ messages in thread
From: Takashi Iwai @ 2012-04-23  9:52 UTC (permalink / raw)
  To: Felix Homann; +Cc: alsa-devel, patch, mark

At Mon, 23 Apr 2012 11:16:08 +0200,
Felix Homann wrote:
> 
> 
> Signed-off-by: Felix Homann <linuxaudio@showlabor.de>

Again, a bit more explanations please.

> 
> diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c
> index 596744f..be46657 100644
> --- a/sound/usb/mixer.c
> +++ b/sound/usb/mixer.c
> @@ -775,6 +775,24 @@ static void volume_control_quirks(struct usb_mixer_elem_info *cval,
>  				  struct snd_kcontrol *kctl)
>  {
>  	switch (cval->mixer->chip->usb_id) {
> +	case USB_ID(0x0763, 0x2081): /* M-Audio Fast Track Ultra 8R */
> +	case USB_ID(0x0763, 0x2080): /* M-Audio Fast Track Ultra */
> +		if ((strcmp(kctl->id.name, "Effect Duration") == 0)) {
> +			snd_printk(KERN_INFO
> +				"set quirk for FTU Effect Duration\n");

Put a prefix in the info print to be identified properly.
snd_printk() might be just printk() when CONFIG_SND_VERBOSE_PRINTK
isn't set.


> +			cval->min = 0x0000;
> +			cval->max = 0x7f00;
> +			cval->res = 0x0100;
> +			break;
> +		}
> +		if ((strcmp(kctl->id.name, "Effect Volume") == 0) |

Use the logical OR '||'.
Also the parenthesis is superfluous.

> +			(strcmp(kctl->id.name, "Effect Feedback Volume") == 0)) {
> +			snd_printk(KERN_INFO
> +				"set quirks for FTU Effect Feedback/Volume\n");
> +			cval->min = 0x00;
> +			cval->max = 0x7f;
> +			break;
> +		}
>  	case USB_ID(0x0471, 0x0101):
>  	case USB_ID(0x0471, 0x0104):
>  	case USB_ID(0x0471, 0x0105):
> diff --git a/sound/usb/mixer_quirks.c b/sound/usb/mixer_quirks.c
> index 5b52275..588fe9c 100644
> --- a/sound/usb/mixer_quirks.c
> +++ b/sound/usb/mixer_quirks.c
> @@ -58,7 +58,7 @@ static void usb_mixer_elem_free(struct snd_kcontrol *kctl)
>   * Since there doesn't seem to be a devices that needs a multichannel
>   * version, we keep it mono for simplicity.
>   */
> -static int snd_create_standard_mono_ctl(struct usb_mixer_interface *mixer,
> +static int snd_create_std_mono_ctl(struct usb_mixer_interface *mixer,
>  				unsigned int unitid,
>  				unsigned int control,
>  				unsigned int cmask,

As already mentioned, rename should have been done in the first patch.

> @@ -577,6 +577,302 @@ static int snd_nativeinstruments_create_mixer(struct usb_mixer_interface *mixer,
>  
>  /* M-Audio FastTrack Ultra quirks */
>  
> +/* FTU Effect switch */
> +struct snd_maudio_ftu_effect_switch_private_value {

Well... The length of a name is a matter of taste, but it looks
unnecessarily too long to me, as it appears in the casts.

> +	struct usb_mixer_interface *mixer;
> +	int cached_value;
> +	int is_cached;
> +};
> +
> +
> +static int snd_maudio_ftu_effect_switch_info(struct snd_kcontrol *kcontrol,
> +					struct snd_ctl_elem_info *uinfo)
> +{
> +	static char *texts[8] = {"Room 1",
> +				 "Room 2",
> +				 "Room 3",
> +				 "Hall 1",
> +				 "Hall 2",
> +				 "Plate",
> +				 "Delay",
> +				 "Echo"
> +	};
> +
> +	uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
> +	uinfo->count = 1;
> +	uinfo->value.enumerated.items = 8;
> +	if (uinfo->value.enumerated.item > 7)
> +		uinfo->value.enumerated.item = 7;
> +	strcpy(uinfo->value.enumerated.name,
> +		texts[uinfo->value.enumerated.item]);
> +
> +	return 0;
> +}
> +
> +static int snd_maudio_ftu_effect_switch_get(struct snd_kcontrol *kctl,
> +					struct snd_ctl_elem_value *ucontrol)
> +{
> +	struct snd_usb_audio *chip;
> +	struct usb_mixer_interface *mixer;
> +	struct snd_maudio_ftu_effect_switch_private_value *pval;
> +	int err, id, validx, val_len, val_type;
> +	unsigned char value[2];
> +
> +	pval = (struct snd_maudio_ftu_effect_switch_private_value *)
> +		kctl->private_value;
> +
> +	if (pval->is_cached) {
> +		ucontrol->value.enumerated.item[0] = pval->cached_value;
> +		return 0;
> +	}
> +
> +	mixer = (struct usb_mixer_interface *) pval->mixer;
> +	if (mixer == NULL) {
> +		snd_printd(KERN_ERR "mixer == NULL");

Use snd_BUG_ON() in such a case.

> +		return -1;
> +	}
> +
> +	chip = (struct snd_usb_audio *) mixer->chip;
> +	if (chip == NULL) {
> +		snd_printd(KERN_ERR "chip == NULL");

Ditto.

> +		return -1;
> +	}
> +
> +	id = 6;
> +	validx = 1;
> +	val_type = USB_MIXER_S16;
> +
> +	value[0] = 0x00;
> +	value[1] = 0x00;
> +
> +	val_len = 2;
> +
> +	err = snd_usb_ctl_msg(chip->dev,
> +			usb_rcvctrlpipe(chip->dev, 0), UAC_GET_CUR,
> +			USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN,
> +			validx << 8, snd_usb_ctrl_intf(chip) | (id << 8),
> +			value, val_len);
> +	if (err < 0)
> +		return -1;
> +
> +	ucontrol->value.enumerated.item[0] = value[0];
> +	pval->cached_value = value[0];
> +	pval->is_cached = 1;
> +
> +	return 0;
> +}
> +
> +static int snd_maudio_ftu_effect_switch_put(struct snd_kcontrol *kctl,
> +					struct snd_ctl_elem_value *ucontrol)
> +{
> +	struct snd_usb_audio *chip;
> +	struct snd_maudio_ftu_effect_switch_private_value *pval;
> +
> +	struct usb_mixer_interface *mixer;
> +	int  changed, cur_val, err, id, new_val, validx, val_len, val_type;
> +	unsigned char value[2];
> +
> +	changed = 0;
> +	id = 6;
> +	validx = 1;
> +	val_type = USB_MIXER_S16;
> +
> +	val_len = 2;
> +	pval = (struct snd_maudio_ftu_effect_switch_private_value *)
> +		kctl->private_value;
> +	cur_val = pval->cached_value;
> +	new_val = ucontrol->value.enumerated.item[0];
> +
> +	mixer = (struct usb_mixer_interface *) pval->mixer;
> +	if (mixer == NULL) {
> +		snd_printd(KERN_ERR "mixer == NULL");

Ditto.

> +		return -1;
> +	}
> +
> +	chip = (struct snd_usb_audio *) mixer->chip;
> +	if (chip == NULL) {
> +		snd_printd(KERN_ERR "chip == NULL");

Ditto.

> +		return -1;
> +	}
> +
> +	if (!pval->is_cached) {
> +		/* Read current value */
> +		err = snd_usb_ctl_msg(chip->dev,
> +				usb_rcvctrlpipe(chip->dev, 0), UAC_GET_CUR,
> +				USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_IN,
> +				validx << 8, snd_usb_ctrl_intf(chip) | (id << 8),
> +				value, val_len);
> +		if (err < 0)
> +			return -1;
> +
> +		cur_val = value[0];
> +		pval->cached_value = cur_val;
> +		pval->is_cached = 1;
> +	}
> +	/* update value if needed */
> +	if (cur_val != new_val) {
> +		value[0] = new_val;
> +		value[1] = 0;
> +		err = snd_usb_ctl_msg(chip->dev,
> +				usb_sndctrlpipe(chip->dev, 0), UAC_SET_CUR,
> +				USB_RECIP_INTERFACE | USB_TYPE_CLASS | USB_DIR_OUT,
> +				validx << 8, snd_usb_ctrl_intf(chip) | (id << 8),
> +				value, val_len);
> +		if (err < 0)
> +			return -1;
> +
> +		pval->cached_value = new_val;
> +		pval->is_cached = 1;
> +		changed = 1;
> +	}
> +
> +	return changed;
> +}
> +
> +static int snd_maudio_ftu_create_effect_switch(struct usb_mixer_interface *mixer)
> +{
> +	struct snd_kcontrol_new template = {
> +		.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
> +		.name = "Effect Program Switch",
> +		.index = 0,
> +		.access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
> +		.info = snd_maudio_ftu_effect_switch_info,
> +		.get = snd_maudio_ftu_effect_switch_get,
> +		.put = snd_maudio_ftu_effect_switch_put
> +	};

Use static.

> +
> +	int err;
> +	struct snd_kcontrol *kctl;
> +	struct snd_maudio_ftu_effect_switch_private_value *pval;
> +
> +	pval = kzalloc(sizeof(*pval), GFP_KERNEL);
> +	if (!pval)
> +		return -ENOMEM;
> +
> +	pval->cached_value = 0;
> +	pval->is_cached = 0;
> +	pval->mixer = mixer;
> +
> +	template.private_value = (unsigned long) pval;
> +	kctl = snd_ctl_new1(&template, mixer->chip);
> +	if (!kctl) {
> +		kfree(pval);
> +		return -ENOMEM;
> +	}
> +
> +	err = snd_ctl_add(mixer->chip->card, kctl);
> +	if (err < 0)
> +		return err;
> +
> +	return 0;
> +}
> +
> +static int snd_maudio_ftu_create_effect_volume_ctl(struct usb_mixer_interface *mixer)
> +{
> +	unsigned int id, control, cmask;
> +	int val_type;
> +
> +	char name[] = "Effect Volume";

Use static.

> +
> +	id = 6;
> +	val_type = USB_MIXER_U8;
> +	control = 2;
> +	cmask = 0;

Use const.

> +
> +	return snd_create_std_mono_ctl(mixer, id, control, cmask, val_type,
> +					name, snd_usb_mixer_vol_tlv);
> +}
> +
> +static int snd_maudio_ftu_create_effect_duration_ctl(struct usb_mixer_interface *mixer)
> +{
> +	unsigned int id, control, cmask;
> +	int val_type;
> +
> +	char name[] = "Effect Duration";
> +
> +	id = 6;
> +	val_type = USB_MIXER_S16;
> +	control = 3;
> +	cmask = 0;

Use const.

> +
> +	return snd_create_std_mono_ctl(mixer, id, control, cmask, val_type,
> +					name, snd_usb_mixer_vol_tlv);
> +}
> +
> +static int snd_maudio_ftu_create_effect_feedback_ctl(struct usb_mixer_interface *mixer)
> +{
> +	unsigned int id, control, cmask;
> +	int val_type;
> +
> +	char name[] = "Effect Feedback Volume";
> +
> +	id = 6;
> +	val_type = USB_MIXER_U8;
> +	control = 4;
> +	cmask = 0;

Ditto.

> +
> +	return snd_create_std_mono_ctl(mixer, id, control, cmask, val_type,
> +					name, NULL);
> +}
> +
> +static int snd_maudio_ftu_create_effect_return_ctls(struct usb_mixer_interface *mixer)
> +{
> +	unsigned int id, control, cmask;
> +	int err, val_type, ch;
> +	char name[48];
> +
> +	id = 7;
> +	val_type = USB_MIXER_S16;
> +	control = 2;
> +
> +	for (ch = 0; ch < 4; ++ch) {
> +		cmask = 1 << ch;
> +		snprintf(name, sizeof(name),
> +			"Effect Return %d Volume", ch + 1);
> +		err = snd_create_std_mono_ctl(mixer, id, control,
> +						cmask, val_type, name,
> +						snd_usb_mixer_vol_tlv);
> +		if (err < 0)
> +			return err;
> +	}
> +
> +	return 0;
> +}
> +
> +static int snd_maudio_ftu_create_effect_send_ctls(struct usb_mixer_interface *mixer)
> +{
> +	unsigned int id, control, cmask;
> +	int err, val_type, ch;
> +	char name[48];
> +
> +	id = 5;
> +	val_type = USB_MIXER_S16;
> +	control = 9;
> +
> +	for (ch = 0; ch < 8; ++ch) {
> +		cmask = 1 << ch;
> +		snprintf(name, sizeof(name),
> +			"Effect Send AIn%d Volume", ch + 1);
> +		err = snd_create_std_mono_ctl(mixer, id, control, cmask,
> +						val_type, name,
> +						snd_usb_mixer_vol_tlv);
> +		if (err < 0)
> +			return err;
> +	}
> +	for (ch = 8; ch < 16; ++ch) {
> +		cmask = 1 << ch;
> +		snprintf(name, sizeof(name),
> +			"Effect Send DIn%d Volume", ch - 7);
> +		err = snd_create_std_mono_ctl(mixer, id, control, cmask,
> +						val_type, name,
> +						snd_usb_mixer_vol_tlv);
> +		if (err < 0)
> +			return err;
> +	}
> +	return 0;
> +}
> +
> +
>  /* Create a volume control for FTU devices*/
>  static int snd_maudio_ftu_create_volume_ctls(struct usb_mixer_interface *mixer)
>  {
> @@ -624,10 +920,33 @@ static int snd_maudio_ftu_create_mixer(struct usb_mixer_interface *mixer)
>  	if (err < 0)
>  		return err;
>  
> +	err = snd_maudio_ftu_create_effect_volume_ctl(mixer);
> +	if (err < 0)
> +		return err;
> +
> +	err = snd_maudio_ftu_create_effect_duration_ctl(mixer);
> +	if (err < 0)
> +		return err;
> +
> +	err = snd_maudio_ftu_create_effect_feedback_ctl(mixer);
> +	if (err < 0)
> +		return err;
> +
> +	err = snd_maudio_ftu_create_effect_return_ctls(mixer);
> +	if (err < 0)
> +		return err;
> +
> +	err = snd_maudio_ftu_create_effect_send_ctls(mixer);
> +	if (err < 0)
> +		return err;
> +
> +	err = snd_maudio_ftu_create_effect_switch(mixer);
> +	if (err < 0)
> +		return err;
> +
>  	return 0;
>  }
>  
> -
>  /*
>   * Create mixer for Electrix Ebox-44
>   *
> @@ -638,17 +957,26 @@ static int snd_maudio_ftu_create_mixer(struct usb_mixer_interface *mixer)
>  
>  static int snd_ebox44_create_mixer(struct usb_mixer_interface *mixer)
>  {
> -	snd_create_std_mono_ctl(mixer, 4, 1, 0x0, USB_MIXER_INV_BOOLEAN, "Headphone Playback Switch", NULL);
> -	snd_create_std_mono_ctl(mixer, 4, 2, 0x1, USB_MIXER_S16, "Headphone A Mix Playback Volume", NULL);
> -	snd_create_std_mono_ctl(mixer, 4, 2, 0x2, USB_MIXER_S16, "Headphone B Mix Playback Volume", NULL);
> -
> -	snd_create_std_mono_ctl(mixer, 7, 1, 0x0, USB_MIXER_INV_BOOLEAN, "Output Playback Switch", NULL);
> -	snd_create_std_mono_ctl(mixer, 7, 2, 0x1, USB_MIXER_S16, "Output A Playback Volume", NULL);
> -	snd_create_std_mono_ctl(mixer, 7, 2, 0x2, USB_MIXER_S16, "Output B Playback Volume", NULL);
> -
> -	snd_create_std_mono_ctl(mixer, 10, 1, 0x0, USB_MIXER_INV_BOOLEAN, "Input Capture Switch", NULL);
> -	snd_create_std_mono_ctl(mixer, 10, 2, 0x1, USB_MIXER_S16, "Input A Capture Volume", NULL);
> -	snd_create_std_mono_ctl(mixer, 10, 2, 0x2, USB_MIXER_S16, "Input B Capture Volume", NULL);
> +	snd_create_std_mono_ctl(mixer, 4, 1, 0x0, USB_MIXER_INV_BOOLEAN,
> +				"Headphone Playback Switch", NULL);
> +	snd_create_std_mono_ctl(mixer, 4, 2, 0x1, USB_MIXER_S16,
> +				"Headphone A Mix Playback Volume", NULL);
> +	snd_create_std_mono_ctl(mixer, 4, 2, 0x2, USB_MIXER_S16,
> +				"Headphone B Mix Playback Volume", NULL);
> +
> +	snd_create_std_mono_ctl(mixer, 7, 1, 0x0, USB_MIXER_INV_BOOLEAN,
> +				"Output Playback Switch", NULL);
> +	snd_create_std_mono_ctl(mixer, 7, 2, 0x1, USB_MIXER_S16,
> +				"Output A Playback Volume", NULL);
> +	snd_create_std_mono_ctl(mixer, 7, 2, 0x2, USB_MIXER_S16,
> +				"Output B Playback Volume", NULL);
> +
> +	snd_create_std_mono_ctl(mixer, 10, 1, 0x0, USB_MIXER_INV_BOOLEAN,
> +				"Input Capture Switch", NULL);
> +	snd_create_std_mono_ctl(mixer, 10, 2, 0x1, USB_MIXER_S16,
> +				"Input A Capture Volume", NULL);
> +	snd_create_std_mono_ctl(mixer, 10, 2, 0x2, USB_MIXER_S16,
> +				"Input B Capture Volume", NULL);

These should have been applied in the first patch.


thanks,

Takashi

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 1/3] Unify M-Audio Fast Track Ultra and Ebox-44 mixer quirks.
  2012-04-23  9:43   ` Takashi Iwai
@ 2012-04-23  9:57     ` Felix Homann
  2012-04-23 10:04       ` Takashi Iwai
  0 siblings, 1 reply; 11+ messages in thread
From: Felix Homann @ 2012-04-23  9:57 UTC (permalink / raw)
  To: Takashi Iwai; +Cc: alsa-devel, patch, mark

2012/4/23 Takashi Iwai <tiwai@suse.de>:
>> Allows for specifying a TLV callback.
>
> Too little information as the patch changelog.
> Please be more specific what and how is implemented there.

OK.

> This should be snd_create_std_mono_ctl(), no?

Yes, I wasn't aware that I had only fixed this in a later commit.

> Each patch should be able to be built properly.  Otherwise it breaks
> the bisection.

Yes, that makes sense.


>> +/* Create a volume control for FTU devices*/
>> +static int snd_maudio_ftu_create_volume_ctls(struct usb_mixer_interface *mixer)
>>  {
>>       char name[64];
>> -     int in, out, err;
>> +     unsigned int id, control, cmask;
>> +     int in, out, err, val_type;
>> +
>> +     id = 5;
>> +     val_type = USB_MIXER_S16;
>
> Give const.  I don't mind use such styles instead of define or
> hard-coded in the function calls, but then it should be marked as
> const properly.

I don't mind to use a define here. Just tell me what you prefer.

I'll prepare a coreccted patch set soon.

Regards,

Felix

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 1/3] Unify M-Audio Fast Track Ultra and Ebox-44 mixer quirks.
  2012-04-23  9:57     ` Felix Homann
@ 2012-04-23 10:04       ` Takashi Iwai
  0 siblings, 0 replies; 11+ messages in thread
From: Takashi Iwai @ 2012-04-23 10:04 UTC (permalink / raw)
  To: Felix Homann; +Cc: alsa-devel, patch, mark

At Mon, 23 Apr 2012 11:57:32 +0200,
Felix Homann wrote:
> 
> 2012/4/23 Takashi Iwai <tiwai@suse.de>:
> >> Allows for specifying a TLV callback.
> >
> > Too little information as the patch changelog.
> > Please be more specific what and how is implemented there.
> 
> OK.
> 
> > This should be snd_create_std_mono_ctl(), no?
> 
> Yes, I wasn't aware that I had only fixed this in a later commit.
> 
> > Each patch should be able to be built properly.  Otherwise it breaks
> > the bisection.
> 
> Yes, that makes sense.
> 
> 
> >> +/* Create a volume control for FTU devices*/
> >> +static int snd_maudio_ftu_create_volume_ctls(struct usb_mixer_interface *mixer)
> >>  {
> >>       char name[64];
> >> -     int in, out, err;
> >> +     unsigned int id, control, cmask;
> >> +     int in, out, err, val_type;
> >> +
> >> +     id = 5;
> >> +     val_type = USB_MIXER_S16;
> >
> > Give const.  I don't mind use such styles instead of define or
> > hard-coded in the function calls, but then it should be marked as
> > const properly.
> 
> I don't mind to use a define here. Just tell me what you prefer.

Well, I don't mind either way.  The point is that you should add const
if you keep that style.


> I'll prepare a coreccted patch set soon.

Thanks!


Takashi
_______________________________________________
Alsa-devel mailing list
Alsa-devel@alsa-project.org
http://mailman.alsa-project.org/mailman/listinfo/alsa-devel

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 3/3] M-Audio FTU: Add effect controls
  2012-04-23  9:52   ` Takashi Iwai
@ 2012-04-23 10:19     ` Felix Homann
  2012-04-23 10:36       ` Takashi Iwai
  0 siblings, 1 reply; 11+ messages in thread
From: Felix Homann @ 2012-04-23 10:19 UTC (permalink / raw)
  To: Takashi Iwai; +Cc: alsa-devel, patch, mark

Hi,

2012/4/23 Takashi Iwai <tiwai@suse.de>:
> At Mon, 23 Apr 2012 11:16:08 +0200,
> Felix Homann wrote:
>>
>>
>> Signed-off-by: Felix Homann <linuxaudio@showlabor.de>
>
> Again, a bit more explanations please.
>
>>
>> diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c
>> index 596744f..be46657 100644
>> --- a/sound/usb/mixer.c
>> +++ b/sound/usb/mixer.c
>> @@ -775,6 +775,24 @@ static void volume_control_quirks(struct usb_mixer_elem_info *cval,
>>                                 struct snd_kcontrol *kctl)
>>  {
>>       switch (cval->mixer->chip->usb_id) {
>> +     case USB_ID(0x0763, 0x2081): /* M-Audio Fast Track Ultra 8R */
>> +     case USB_ID(0x0763, 0x2080): /* M-Audio Fast Track Ultra */
>> +             if ((strcmp(kctl->id.name, "Effect Duration") == 0)) {
>> +                     snd_printk(KERN_INFO
>> +                             "set quirk for FTU Effect Duration\n");
>
> Put a prefix in the info print to be identified properly.
> snd_printk() might be just printk() when CONFIG_SND_VERBOSE_PRINTK
> isn't set.

Hmm, again I just followed the examples of other volume quirks. What
kind of prefix would you like?

>
>
>> +                     cval->min = 0x0000;
>> +                     cval->max = 0x7f00;
>> +                     cval->res = 0x0100;
>> +                     break;
>> +             }
>> +             if ((strcmp(kctl->id.name, "Effect Volume") == 0) |
>
> Use the logical OR '||'.

Oh yes, stupid me...

> Also the parenthesis is superfluous.

I know. I put them there because checkpatch.pl complained. What's the
right way to cope with checkpatch.pl complains then?


>>
>>  /* M-Audio FastTrack Ultra quirks */
>>
>> +/* FTU Effect switch */
>> +struct snd_maudio_ftu_effect_switch_private_value {
>
> Well... The length of a name is a matter of taste, but it looks
> unnecessarily too long to me, as it appears in the casts.

It's not to my taste either. But it's in line with the existing ftu
quirks. I'm already preparing a patch for the M-Audio C-400 mixer.
What do you think of

* renaming the FTU specifiy functions from snd_maudio_ftu_* to snd_ftu_*
* renaming functions common to different M-Audio devices to snd_maudio_*
* specifically renaming snd_maudio_ftu_effect_switch_private_value to
snd_maudio_effect_switch_priv_val (well, it's just a bit shorter...)



>> +     mixer = (struct usb_mixer_interface *) pval->mixer;
>> +     if (mixer == NULL) {
>> +             snd_printd(KERN_ERR "mixer == NULL");
>
> Use snd_BUG_ON() in such a case.

What's that?


>> +static int snd_maudio_ftu_create_effect_switch(struct usb_mixer_interface *mixer)
>> +{
>> +     struct snd_kcontrol_new template = {
>> +             .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
>> +             .name = "Effect Program Switch",
>> +             .index = 0,
>> +             .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
>> +             .info = snd_maudio_ftu_effect_switch_info,
>> +             .get = snd_maudio_ftu_effect_switch_get,
>> +             .put = snd_maudio_ftu_effect_switch_put
>> +     };
>
> Use static.

OK.


>> +static int snd_maudio_ftu_create_effect_volume_ctl(struct usb_mixer_interface *mixer)
>> +{
>> +     unsigned int id, control, cmask;
>> +     int val_type;
>> +
>> +     char name[] = "Effect Volume";
>
> Use static.

OK.

>
>> +
>> +     id = 6;
>> +     val_type = USB_MIXER_U8;
>> +     control = 2;
>> +     cmask = 0;
>
> Use const.

OK.

>> +static int snd_maudio_ftu_create_effect_duration_ctl(struct usb_mixer_interface *mixer)
>> +{
>> +     unsigned int id, control, cmask;
>> +     int val_type;
>> +
>> +     char name[] = "Effect Duration";
>> +
>> +     id = 6;
>> +     val_type = USB_MIXER_S16;
>> +     control = 3;
>> +     cmask = 0;
>
> Use const.

OK.


>> +                             "Input A Capture Volume", NULL);
>> +     snd_create_std_mono_ctl(mixer, 10, 2, 0x2, USB_MIXER_S16,
>> +                             "Input B Capture Volume", NULL);
>
> These should have been applied in the first patch.

OK. I wasn't aware of the extremely reasonable policy of not breaking
the build with a patch...

Sorry,

Felix

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH 3/3] M-Audio FTU: Add effect controls
  2012-04-23 10:19     ` Felix Homann
@ 2012-04-23 10:36       ` Takashi Iwai
  0 siblings, 0 replies; 11+ messages in thread
From: Takashi Iwai @ 2012-04-23 10:36 UTC (permalink / raw)
  To: Felix Homann; +Cc: alsa-devel, patch, mark

At Mon, 23 Apr 2012 12:19:39 +0200,
Felix Homann wrote:
> 
> Hi,
> 
> 2012/4/23 Takashi Iwai <tiwai@suse.de>:
> > At Mon, 23 Apr 2012 11:16:08 +0200,
> > Felix Homann wrote:
> >>
> >>
> >> Signed-off-by: Felix Homann <linuxaudio@showlabor.de>
> >
> > Again, a bit more explanations please.
> >
> >>
> >> diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c
> >> index 596744f..be46657 100644
> >> --- a/sound/usb/mixer.c
> >> +++ b/sound/usb/mixer.c
> >> @@ -775,6 +775,24 @@ static void volume_control_quirks(struct usb_mixer_elem_info *cval,
> >>                                 struct snd_kcontrol *kctl)
> >>  {
> >>       switch (cval->mixer->chip->usb_id) {
> >> +     case USB_ID(0x0763, 0x2081): /* M-Audio Fast Track Ultra 8R */
> >> +     case USB_ID(0x0763, 0x2080): /* M-Audio Fast Track Ultra */
> >> +             if ((strcmp(kctl->id.name, "Effect Duration") == 0)) {
> >> +                     snd_printk(KERN_INFO
> >> +                             "set quirk for FTU Effect Duration\n");
> >
> > Put a prefix in the info print to be identified properly.
> > snd_printk() might be just printk() when CONFIG_SND_VERBOSE_PRINTK
> > isn't set.
> 
> Hmm, again I just followed the examples of other volume quirks. What
> kind of prefix would you like?

Just like "usb-audio:" or something like that.

> >> +                     cval->min = 0x0000;
> >> +                     cval->max = 0x7f00;
> >> +                     cval->res = 0x0100;
> >> +                     break;
> >> +             }
> >> +             if ((strcmp(kctl->id.name, "Effect Volume") == 0) |
> >
> > Use the logical OR '||'.
> 
> Oh yes, stupid me...
> 
> > Also the parenthesis is superfluous.
> 
> I know. I put them there because checkpatch.pl complained. What's the
> right way to cope with checkpatch.pl complains then?

It complained because of the bit OR.  With the logical OR, it
shouldn't complain.

> >>
> >>  /* M-Audio FastTrack Ultra quirks */
> >>
> >> +/* FTU Effect switch */
> >> +struct snd_maudio_ftu_effect_switch_private_value {
> >
> > Well... The length of a name is a matter of taste, but it looks
> > unnecessarily too long to me, as it appears in the casts.
> 
> It's not to my taste either.

Then follow your instinct :)

> But it's in line with the existing ftu
> quirks. I'm already preparing a patch for the M-Audio C-400 mixer.
> What do you think of
> 
> * renaming the FTU specifiy functions from snd_maudio_ftu_* to snd_ftu_*
> * renaming functions common to different M-Audio devices to snd_maudio_*
> * specifically renaming snd_maudio_ftu_effect_switch_private_value to
> snd_maudio_effect_switch_priv_val (well, it's just a bit shorter...)
> 
> 
> 
> >> +     mixer = (struct usb_mixer_interface *) pval->mixer;
> >> +     if (mixer == NULL) {
> >> +             snd_printd(KERN_ERR "mixer == NULL");
> >
> > Use snd_BUG_ON() in such a case.
> 
> What's that?

It's what you need :)  Use like
	if (snd_BUG_ON(!mixer))
		return -EINVAL;


thanks,

Takashi
_______________________________________________
Alsa-devel mailing list
Alsa-devel@alsa-project.org
http://mailman.alsa-project.org/mailman/listinfo/alsa-devel

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2012-04-23 10:36 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-04-23  9:16 [PATCH 0/3] Alsa: USB: Improve M-Audio Fast Track Ultra mixer Felix Homann
2012-04-23  9:16 ` [PATCH 1/3] Unify M-Audio Fast Track Ultra and Ebox-44 mixer quirks Felix Homann
2012-04-23  9:43   ` Takashi Iwai
2012-04-23  9:57     ` Felix Homann
2012-04-23 10:04       ` Takashi Iwai
2012-04-23  9:16 ` [PATCH 2/3] Add TLV to M-Audio volume controls Felix Homann
2012-04-23  9:43   ` Takashi Iwai
2012-04-23  9:16 ` [PATCH 3/3] M-Audio FTU: Add effect controls Felix Homann
2012-04-23  9:52   ` Takashi Iwai
2012-04-23 10:19     ` Felix Homann
2012-04-23 10:36       ` Takashi Iwai

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.