ALSA: usb-audio: ignore broken processing/extension unit
authorTom Yan <tom.ty89@gmail.com>
Mon, 17 Aug 2020 17:20:11 +0000 (01:20 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 3 Sep 2020 09:29:34 +0000 (11:29 +0200)
[ Upstream commit d8d0db7bb358ef65d60726a61bfcd08eccff0bc0 ]

Some devices have broken extension unit where getting current value
doesn't work. Attempt that once when creating mixer control for it. If
it fails, just ignore it, so that it won't cripple the device entirely
(and/or make the error floods).

Signed-off-by: Tom Yan <tom.ty89@gmail.com>
Link: https://lore.kernel.org/r/5f3abc52.1c69fb81.9cf2.fe91@mx.google.com
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Sasha Levin <sashal@kernel.org>
sound/usb/mixer.c

index eab0fd4fd7c334cff2671d0a2ff25cd95073d21c..e0b7174c10430572056b590ad6ec63c983c89a78 100644 (file)
@@ -2367,7 +2367,7 @@ static int build_audio_procunit(struct mixer_build *state, int unitid,
        int num_ins;
        struct usb_mixer_elem_info *cval;
        struct snd_kcontrol *kctl;
-       int i, err, nameid, type, len;
+       int i, err, nameid, type, len, val;
        const struct procunit_info *info;
        const struct procunit_value_info *valinfo;
        const struct usbmix_name_map *map;
@@ -2470,6 +2470,12 @@ static int build_audio_procunit(struct mixer_build *state, int unitid,
                        break;
                }
 
+               err = get_cur_ctl_value(cval, cval->control << 8, &val);
+               if (err < 0) {
+                       usb_mixer_elem_info_free(cval);
+                       return -EINVAL;
+               }
+
                kctl = snd_ctl_new1(&mixer_procunit_ctl, cval);
                if (!kctl) {
                        usb_mixer_elem_info_free(cval);