From mboxrd@z Thu Jan 1 00:00:00 1970 From: Takashi Iwai Subject: Re: [PATCH] ALSA: usb - Don't create "Speaker" mixer controls on headphones and headsets Date: Mon, 26 Nov 2012 10:38:53 +0100 Message-ID: References: <1353674935-4215-1-git-send-email-david.henningsson@canonical.com> Mime-Version: 1.0 (generated by SEMI 1.14.6 - "Maruoka") Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by alsa0.perex.cz (Postfix) with ESMTP id D87FE26171E for ; Mon, 26 Nov 2012 10:38:53 +0100 (CET) In-Reply-To: <1353674935-4215-1-git-send-email-david.henningsson@canonical.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: alsa-devel-bounces@alsa-project.org To: David Henningsson Cc: alsa-devel@alsa-project.org, Clemens Ladisch , zonque@gmail.com List-Id: alsa-devel@alsa-project.org 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 > --- > 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 >