78 lines
3.0 KiB
Diff
78 lines
3.0 KiB
Diff
From 16b5ff888e251b8c4dedd3994d2e85ab25ea7fa4 Mon Sep 17 00:00:00 2001
|
|
Message-Id: <16b5ff888e251b8c4dedd3994d2e85ab25ea7fa4.1514245036.git.jan.steffens@gmail.com>
|
|
From: Takashi Iwai <tiwai@suse.de>
|
|
Date: Mon, 18 Dec 2017 23:36:57 +0100
|
|
Subject: [PATCH] ALSA: usb-audio: Fix the missing ctl name suffix at parsing
|
|
SU
|
|
|
|
The commit 89b89d121ffc ("ALSA: usb-audio: Add check return value for
|
|
usb_string()") added the check of the return value from
|
|
snd_usb_copy_string_desc(), which is correct per se, but it introduced
|
|
a regression. In the original code, either the "Clock Source",
|
|
"Playback Source" or "Capture Source" suffix is added after the
|
|
terminal string, while the commit changed it to add the suffix only
|
|
when get_term_name() is failing. It ended up with an incorrect ctl
|
|
name like "PCM" instead of "PCM Capture Source".
|
|
|
|
Also, even the original code has a similar bug: when the ctl name is
|
|
generated from snd_usb_copy_string_desc() for the given iSelector, it
|
|
also doesn't put the suffix.
|
|
|
|
This patch addresses these issues: the suffix is added always when no
|
|
static mapping is found. Also the patch tries to put more comments
|
|
and cleans up the if/else block for better readability in order to
|
|
avoid the same pitfall again.
|
|
|
|
Fixes: 89b89d121ffc ("ALSA: usb-audio: Add check return value for usb_string()")
|
|
Reported-and-tested-by: Mauro Santos <registo.mailling@gmail.com>
|
|
Cc: <stable@vger.kernel.org>
|
|
Signed-off-by: Takashi Iwai <tiwai@suse.de>
|
|
---
|
|
sound/usb/mixer.c | 27 ++++++++++++++++-----------
|
|
1 file changed, 16 insertions(+), 11 deletions(-)
|
|
|
|
diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c
|
|
index 4fde4f8d4444a597..75bce127d768c613 100644
|
|
--- a/sound/usb/mixer.c
|
|
+++ b/sound/usb/mixer.c
|
|
@@ -2173,20 +2173,25 @@ static int parse_audio_selector_unit(struct mixer_build *state, int unitid,
|
|
kctl->private_value = (unsigned long)namelist;
|
|
kctl->private_free = usb_mixer_selector_elem_free;
|
|
|
|
- nameid = uac_selector_unit_iSelector(desc);
|
|
+ /* check the static mapping table at first */
|
|
len = check_mapped_name(map, kctl->id.name, sizeof(kctl->id.name));
|
|
- if (len)
|
|
- ;
|
|
- else if (nameid)
|
|
- len = snd_usb_copy_string_desc(state, nameid, kctl->id.name,
|
|
- sizeof(kctl->id.name));
|
|
- else
|
|
- len = get_term_name(state, &state->oterm,
|
|
- kctl->id.name, sizeof(kctl->id.name), 0);
|
|
-
|
|
if (!len) {
|
|
- strlcpy(kctl->id.name, "USB", sizeof(kctl->id.name));
|
|
+ /* no mapping ? */
|
|
+ /* if iSelector is given, use it */
|
|
+ nameid = uac_selector_unit_iSelector(desc);
|
|
+ if (nameid)
|
|
+ len = snd_usb_copy_string_desc(state, nameid,
|
|
+ kctl->id.name,
|
|
+ sizeof(kctl->id.name));
|
|
+ /* ... or pick up the terminal name at next */
|
|
+ if (!len)
|
|
+ len = get_term_name(state, &state->oterm,
|
|
+ kctl->id.name, sizeof(kctl->id.name), 0);
|
|
+ /* ... or use the fixed string "USB" as the last resort */
|
|
+ if (!len)
|
|
+ strlcpy(kctl->id.name, "USB", sizeof(kctl->id.name));
|
|
|
|
+ /* and add the proper suffix */
|
|
if (desc->bDescriptorSubtype == UAC2_CLOCK_SELECTOR)
|
|
append_ctl_name(kctl, " Clock Source");
|
|
else if ((state->oterm.type & 0xff00) == 0x0100)
|
|
--
|
|
2.15.1
|
|
|