summaryrefslogtreecommitdiffstats
path: root/sound/usb/mixer.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/usb/mixer.c')
-rw-r--r--sound/usb/mixer.c49
1 files changed, 35 insertions, 14 deletions
diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c
index 409fc1164694..81256ab56835 100644
--- a/sound/usb/mixer.c
+++ b/sound/usb/mixer.c
@@ -1652,6 +1652,34 @@ static const struct usb_feature_control_info *get_feature_control_info(int contr
return NULL;
}
+static int feature_unit_mutevol_ctl_name(struct usb_mixer_interface *mixer,
+ struct snd_kcontrol *kctl,
+ struct usb_audio_term *iterm,
+ struct usb_audio_term *oterm)
+{
+ struct usb_audio_term *aterm, *bterm;
+ bool output_first;
+ int len = 0;
+
+ /*
+ * If the input terminal is USB Streaming, we try getting the name of
+ * the output terminal first in hopes of getting something more
+ * descriptive than "PCM".
+ */
+ output_first = iterm && !(iterm->type >> 16) && (iterm->type & 0xff00) == 0x0100;
+
+ aterm = output_first ? oterm : iterm;
+ bterm = output_first ? iterm : oterm;
+
+ if (aterm)
+ len = get_term_name(mixer->chip, aterm, kctl->id.name,
+ sizeof(kctl->id.name), 1);
+ if (!len && bterm)
+ len = get_term_name(mixer->chip, bterm, kctl->id.name,
+ sizeof(kctl->id.name), 1);
+ return len;
+}
+
static void __build_feature_ctl(struct usb_mixer_interface *mixer,
const struct usbmix_name_map *imap,
unsigned int ctl_mask, int control,
@@ -1733,22 +1761,15 @@ static void __build_feature_ctl(struct usb_mixer_interface *mixer,
case UAC_FU_MUTE:
case UAC_FU_VOLUME:
/*
- * determine the control name. the rule is:
- * - if a name id is given in descriptor, use it.
- * - if the connected input can be determined, then use the name
- * of terminal type.
- * - if the connected output can be determined, use it.
- * - otherwise, anonymous name.
+ * Determine the control name:
+ * - If a name id is given in descriptor, use it.
+ * - If input and output terminals are present, try to derive
+ * the name from either of these.
+ * - Otherwise, make up a name using the feature unit ID.
*/
if (!len) {
- if (iterm)
- len = get_term_name(mixer->chip, iterm,
- kctl->id.name,
- sizeof(kctl->id.name), 1);
- if (!len && oterm)
- len = get_term_name(mixer->chip, oterm,
- kctl->id.name,
- sizeof(kctl->id.name), 1);
+ len = feature_unit_mutevol_ctl_name(mixer, kctl, iterm,
+ oterm);
if (!len)
snprintf(kctl->id.name, sizeof(kctl->id.name),
"Feature %d", unitid);