Revert "ALSA: usb-audio: Name feature ctl using output if input is PCM"

This reverts commit 1601cd53c7.

This fix is applied globally to all devices, and it may change the
existing control names.  When the devices are managed with the fixed
configuration like UCM, such control name mismatch may lead to
significant regressions.

For avoiding that kind of regression, we would need to apply such
changes conditionally, but it'd take time to settle down.
While the original fix is a good thing in general, in order to address
the regression, let's revert the change for now.

Link: https://bugzilla.kernel.org/show_bug.cgi?id=218605
Reported-and-tested-by: Niklāvs Koļesņikovs <pinkflames.linux@gmail.com>
Message-ID: <20240316083744.28126-1-tiwai@suse.de>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
Takashi Iwai 2024-03-16 09:37:30 +01:00
parent 587d67fd92
commit c53898eb60
1 changed files with 14 additions and 35 deletions

View File

@ -1652,34 +1652,6 @@ 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,
@ -1761,15 +1733,22 @@ static void __build_feature_ctl(struct usb_mixer_interface *mixer,
case UAC_FU_MUTE:
case UAC_FU_VOLUME:
/*
* 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.
* 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.
*/
if (!len) {
len = feature_unit_mutevol_ctl_name(mixer, kctl, iterm,
oterm);
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);
if (!len)
snprintf(kctl->id.name, sizeof(kctl->id.name),
"Feature %d", unitid);