[alsa-devel] [PATCH] ALSA: usb - Don't create "Speaker" mixer controls on headphones and headsets
Takashi Iwai
tiwai at suse.de
Mon Nov 26 10:38:53 CET 2012
At Fri, 23 Nov 2012 13:48:55 +0100,
David Henningsson wrote:
>
> A lot of headsets/headphones have a "Speaker" mixer control. This confuses
> PulseAudio to think it is a speaker instead of a headphone/headset.
> Therfore, we rename it to "Headphone".
>
> We determine if something is a headphone similar to how udev determines
> form factor (see 78-sound-card.rules).
>
> BugLink: https://bugs.launchpad.net/bugs/1082357
> Signed-off-by: David Henningsson <david.henningsson at canonical.com>
> ---
> sound/usb/mixer.c | 30 ++++++++++++++++++++++++++++++
> 1 file changed, 30 insertions(+)
>
> I tried to find a better way of doing this using the existing quirk or
> map infrastructure but it didn't seem to fit, so added a new
> explicit check.
Hrm, indeed it's pretty hackish although it'd work heuristically.
If Clemens and Daniel have no objection, I can take it...
thanks,
Takashi
>
> diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c
> index 298070e..63fd758 100644
> --- a/sound/usb/mixer.c
> +++ b/sound/usb/mixer.c
> @@ -1094,6 +1094,32 @@ static size_t append_ctl_name(struct snd_kcontrol *kctl, const char *str)
> return strlcat(kctl->id.name, str, sizeof(kctl->id.name));
> }
>
> +/* A lot of headsets/headphones have a "Speaker" mixer. Make sure we
> + rename it to "Headphone". We determine if something is a headphone
> + similar to how udev determines form factor. */
> +static void check_no_speaker_on_headset(struct snd_kcontrol *kctl,
> + struct snd_card *card)
> +{
> + const char *names_to_check[] = {
> + "Headset", "headset", "Headphone", "headphone", NULL};
> + const char **s;
> + bool found = 0;
> +
> + if (strcmp("Speaker", kctl->id.name))
> + return;
> +
> + for (s = names_to_check; *s; s++)
> + if (strstr(card->shortname, *s)) {
> + found = 1;
> + break;
> + }
> +
> + if (!found)
> + return;
> +
> + strlcpy(kctl->id.name, "Headphone", sizeof(kctl->id.name));
> +}
> +
> static void build_feature_ctl(struct mixer_build *state, void *raw_desc,
> unsigned int ctl_mask, int control,
> struct usb_audio_term *iterm, int unitid,
> @@ -1180,6 +1206,10 @@ static void build_feature_ctl(struct mixer_build *state, void *raw_desc,
> len = snprintf(kctl->id.name, sizeof(kctl->id.name),
> "Feature %d", unitid);
> }
> +
> + if (!mapped_name)
> + check_no_speaker_on_headset(kctl, state->mixer->chip->card);
> +
> /* determine the stream direction:
> * if the connected output is USB stream, then it's likely a
> * capture stream. otherwise it should be playback (hopefully :)
> --
> 1.7.9.5
>
More information about the Alsa-devel
mailing list