[alsa-devel] Mixer regression with usb soundcard
Mauro Santos
registo.mailling at gmail.com
Tue Dec 19 02:04:51 CET 2017
On 18-12-2017 22:48, Takashi Iwai wrote:
> On Mon, 18 Dec 2017 22:56:07 +0100,
> Mauro Santos wrote:
>>
>> On 18-12-2017 19:30, Takashi Iwai wrote:
>>> On Mon, 18 Dec 2017 20:10:44 +0100,
>>> Mauro Santos wrote:
>>>>
>>>> On 18-12-2017 17:50, Jaejoong Kim wrote:
>>>>> Mauro,
>>>>>
>>>>> Could you please try debug patch(I also attach the patch file)?
>>>>
>>>> With the attached patch I get the following when plugging in the usb dac
>>>> directly to a usb3 port:
>>>> [ 54.391539] usb 1-2: new full-speed USB device number 7 using xhci_hcd
>>>> [ 54.514996] usb 1-2: device descriptor read/64, error -71
>>>> [ 54.849808] input: HiFimeDIY Audio HiFimeDIY DAC as
>>>> /devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2:1.0/0003:1852:7022.0003/input/input20
>>>> [ 54.850168] hid-generic 0003:1852:7022.0003: input,hidraw2: USB HID
>>>> v1.00 Device [HiFimeDIY Audio HiFimeDIY DAC] on usb-0000:00:14.0-2/input0
>>>> [ 54.950421] usb 1-2: [DEBUG] nameid:0, len:0
>>>> [ 54.950426] usb 1-2: [DEBUG] len:3, get_term_name:PCM
>>>> [ 54.950429] usb 1-2: [11] SU [PCM] items = 2
>>>> [ 54.950985] usbcore: registered new interface driver snd-usb-audio
>>>
>>> Hmm, the driver get the supposedly correct name string here, so I see
>>> no flaw, so far.
>>>
>>> Could you put the similar debug prints after reverting the commit and
>>> compare? Or, at minimum, you can enable simply the kernel debug
>>> prints like below:
>>>
>>> % echo "file sound/usb/mixer.c +p" > /sys/kernel/debug/dynamic_debug_control
>>>
>>> and re-plug the device.
>>>
>>> Also, could you attach the output of "amixer contents" on both working
>>> and non-working kernels?
>>>
>>
>> I have compiled a new kernel where I have reverted the commit and I've
>> added the debug output based on your last debug patch. I attach the
>> patch that reverts the changes and adds the debug output just in case
>> anyone wants to do a sanity check on it (don't mind the indentation I
>> think I botched that).
>>
>> With the debug patches I get no extra output when echoing to the
>> dynamic_debug/control file, I guess that's expected.
>>
>> I attach the dmesg and amixer outputs for the case without revert plus
>> debug (bad) and revert plus debug (good).
>>
>> One change does jump out:
>>
>> bad: usb 1-2: [11] SU [PCM] items = 2
>> good: usb 1-2: [11] SU [PCM Capture Source] items = 2
>
> Thanks, that explains what went wrong. The commit dropped the brace
> at the if-line, and it ended up with the lack of suffix unless
> get_term_name() fails.
>
> The fix patch is below. Could you check whether it cures the issue?
This patch does seem to work fine for me, I can see all the mixer
controls for the usb soundcard/dac.
For good measure I have also tested with a couple of usb headsets and I
didn't see anything amiss (they don't have any "Capture Source" controls
though).
Thank you for looking into this and fixing it.
> Also, Jaejoong, could you check whether it doesn't your device,
> either? I believe it should keep working, but just to be sure.
>
>
> Takashi
>
> -- 8< --
> From: Takashi Iwai <tiwai at suse.de>
> 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-by: Mauro Santos <registo.mailling at gmail.com>
> Cc: <stable at vger.kernel.org>
> Signed-off-by: Takashi Iwai <tiwai at 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 afc208e1c756..60ebc99ae323 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)
>
--
Mauro Santos
More information about the Alsa-devel
mailing list