[alsa-devel] [PATCH] ALSA: HDA: Fix volume control indices for Mics (Realtek)

Takashi Iwai tiwai at suse.de
Mon Jan 10 11:20:02 CET 2011


At Wed, 05 Jan 2011 11:10:48 +0100,
David Henningsson wrote:
> 
> This patch assumes you applied the "Boost" => "Boost Volume" patch 
> posted yesterday.
> 
> If more than one mic is present with different locations,
> e g "Front Mic" and "Rear Mic", they can use the same index (0),
> since their names are different.
> 
> Previous behavior was to have "Front Mic" as index 1, causing it
> to be ignored by e g PulseAudio.

Thanks, applied now.


Takashi

> 
> -- 
> David Henningsson, Canonical Ltd.
> http://launchpad.net/~diwic
> [2 0001-ALSA-HDA-Fix-volume-control-indices-for-Mics-Realtek.patch <text/x-patch (7bit)>]
> >From 12d16508dec19b6897f6eca10fb38810a2762bc4 Mon Sep 17 00:00:00 2001
> From: David Henningsson <david.henningsson at canonical.com>
> Date: Wed, 5 Jan 2011 11:03:56 +0100
> Subject: [PATCH] ALSA: HDA: Fix volume control indices for Mics (Realtek)
> 
> If more than one mic is present with different locations,
> e g "Front Mic" and "Rear Mic", they can use the same index (0),
> since their names are different.
> 
> Previous behavior was to have "Front Mic" as index 1, causing it
> to be ignored by e g PulseAudio.
> 
> Signed-off-by: David Henningsson <david.henningsson at canonical.com>
> ---
>  sound/pci/hda/patch_realtek.c |   31 +++++++++++++++++++------------
>  1 files changed, 19 insertions(+), 12 deletions(-)
> 
> diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
> index 18d53d2..e2d2a79 100644
> --- a/sound/pci/hda/patch_realtek.c
> +++ b/sound/pci/hda/patch_realtek.c
> @@ -5200,7 +5200,8 @@ static int alc_auto_create_input_ctls(struct hda_codec *codec,
>  {
>  	struct alc_spec *spec = codec->spec;
>  	struct hda_input_mux *imux = &spec->private_imux[0];
> -	int i, err, idx, type, type_idx = 0;
> +	int i, err, idx, type_idx = 0;
> +	const char *prev_label = NULL;
>  
>  	for (i = 0; i < cfg->num_inputs; i++) {
>  		hda_nid_t pin;
> @@ -5210,12 +5211,13 @@ static int alc_auto_create_input_ctls(struct hda_codec *codec,
>  		if (!alc_is_input_pin(codec, pin))
>  			continue;
>  
> -		type = cfg->inputs[i].type;
> -		if (i > 0 && type == cfg->inputs[i - 1].type)
> +		label = hda_get_autocfg_input_label(codec, cfg, i);
> +		if (prev_label && !strcmp(label, prev_label))
>  			type_idx++;
>  		else
>  			type_idx = 0;
> -		label = hda_get_autocfg_input_label(codec, cfg, i);
> +		prev_label = label;
> +
>  		if (mixer) {
>  			idx = get_connection_index(codec, mixer, pin);
>  			if (idx >= 0) {
> @@ -10819,25 +10821,30 @@ static int alc_auto_add_mic_boost(struct hda_codec *codec)
>  {
>  	struct alc_spec *spec = codec->spec;
>  	struct auto_pin_cfg *cfg = &spec->autocfg;
> -	int i, err, type;
> +	int i, err;
>  	int type_idx = 0;
>  	hda_nid_t nid;
> +	const char* prev_label = NULL;
>  
>  	for (i = 0; i < cfg->num_inputs; i++) {
>  		if (cfg->inputs[i].type > AUTO_PIN_MIC)
>  			break;
>  		nid = cfg->inputs[i].pin;
>  		if (get_wcaps(codec, nid) & AC_WCAP_IN_AMP) {
> -			char label[32];
> -			type = cfg->inputs[i].type;
> -			if (i > 0 && type == cfg->inputs[i - 1].type)
> +			const char* label;
> +			char boost_label[32];
> +
> +			label = hda_get_autocfg_input_label(codec, cfg, i);
> +			if (prev_label && !strcmp(label, prev_label))
>  				type_idx++;
>  			else
>  				type_idx = 0;
> -			snprintf(label, sizeof(label), "%s Boost Volume",
> -				 hda_get_autocfg_input_label(codec, cfg, i));
> -			err = add_control(spec, ALC_CTL_WIDGET_VOL, label,
> -					  type_idx,
> +			prev_label = label;
> +
> +			snprintf(boost_label, sizeof(boost_label), 
> +				 "%s Boost Volume", label);
> +			err = add_control(spec, ALC_CTL_WIDGET_VOL, 
> +					  boost_label, type_idx,
>  				  HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
>  			if (err < 0)
>  				return err;
> -- 
> 1.7.1
> 


More information about the Alsa-devel mailing list