Skip to contentSkip to conversation

ALSA: usb-audio: ignore broken processing/extension unit

PATCH Applied [email protected] 3 participants 3 messages Aug 17, 2020 – Oct 7, 2020 Sound

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 ALSA: usb-audio: ignore broken processing/extension unit

From: Tom Yan <[email protected]>

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).

---
 sound/usb/mixer.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)
sound/usb/mixer.c +7 -1
index eab0fd4fd7c3..e0b7174c1043 100644
@@ -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);
Signature · 1 line
2.28.0
Applied
#1 lore raw
Quoted 6 lines · On Mon, 17 Aug 2020 19:20:11 +0200, [email protected] wrote:

From: Tom Yan <[email protected]>

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).

Thanks, applied.

Takashi

#2 lore raw
In reply to [email protected]

This patch breaks the creation of the "Clock rate Selector" mixer unit in E-MU Tracker Pre USB audio interface. If the 'snd-usb-audio' module still has not been loaded when the device gets switched on, the module autoloads and everything works:

$ cat /proc/asound/USB/usbmixer 
USB Mixer: usb_id=0x041e3f0a, ctrlif=0, ctlerr=0
Card: E-MU Systems, Inc. E-MU Tracker Pre | USB at usb-0000:00:14.0-13, high 
speed
  Unit: 4
    Control: name="PCM Playback Volume", index=0
    Info: id=4, control=2, cmask=0x3, channels=2, type="S16"
    Volume: min=-25600, max=0, dBmin=-10000, dBmax=0
  Unit: 4
    Control: name="PCM Playback Switch", index=0
    Info: id=4, control=1, cmask=0x0, channels=1, type="INV_BOOLEAN"
    Volume: min=0, max=1, dBmin=0, dBmax=0
  Unit: 12
    Control: name="Clock rate Selector", index=0
    Info: id=12, control=3, cmask=0x0, channels=1, type="U8"
    Volume: min=0, max=5, dBmin=0, dBmax=0

BUT! If the device gets switched off and back on when the module is still loaded, the control never gets created:

(after I power cycled the device)

$ cat /proc/asound/USB/usbmixer 
USB Mixer: usb_id=0x041e3f0a, ctrlif=0, ctlerr=0
Card: E-MU Systems, Inc. E-MU Tracker Pre | USB at usb-0000:00:14.0-13, high 
speed
  Unit: 4
    Control: name="PCM Playback Volume", index=0
    Info: id=4, control=2, cmask=0x3, channels=2, type="S16"
    Volume: min=-25600, max=0, dBmin=-10000, dBmax=0
  Unit: 4
    Control: name="PCM Playback Switch", index=0
    Info: id=4, control=1, cmask=0x0, channels=1, type="INV_BOOLEAN"
    Volume: min=0, max=1, dBmin=0, dBmax=0

Accordingly, the device stays at the default Clock rate with no way to change it. Probably, there's some timing issue in the initialization of the device / the loading of the module, but I honestly couldn't care less as long as this patch breaks my setup.