[alsa-devel] [PATCH] ALSA: hda - fix noise issue when recording from digital mic with alc268

Takashi Iwai tiwai at suse.de
Wed Aug 12 07:42:10 CEST 2009


At Tue, 11 Aug 2009 22:33:09 -0300,
Herton Ronaldo Krzesinski wrote:
> 
> With auto config model of alc268 realtek codec, it allows to select any
> of possible available digital microphone inputs when only one is
> available. For example, when only digital mic in nid 0x12 is available,
> on second input source it will allow you to select unavailable digital
> mic in nid 0x13. The problem is that selecting unavailable digital mic
> creates a source of noise when recording (I'm not sure if this happens
> on all machines with alc268 and only one digital mic input, but testing
> on a quanta uw1 netbook a lot of noise is introduced in recording from
> digital mic 0x12/first input source, when you select the unavailable
> digital mic 0x13 for capture source 0x24 in the second input source in
> mixer).
> 
> Then to avoid noise when recording from digital mic with auto model in
> this case, prevent a digital mic input source to be selected if
> microphone is not available.
> 
> Signed-off-by: Herton Ronaldo Krzesinski <herton at mandriva.com.br>

Thanks, applied.

As a further improvement, the ADC/MUX should be chosen according to
the availability of d-mics.  If only one of them is configured, we
should the corresponding ADC as the primary one.

Meanwhile, I already implemented the automatic mic-selection for
Realtek codecs, and this would already cover many cases.


Takashi

> ---
>  sound/pci/hda/patch_realtek.c |   62 +++++++++++++++++++++++-----------------
>  1 files changed, 36 insertions(+), 26 deletions(-)
> 
> I'm attaching the codec info too here of the machine with the problem.
> 
> diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
> index ac3207e..7ff2934 100644
> --- a/sound/pci/hda/patch_realtek.c
> +++ b/sound/pci/hda/patch_realtek.c
> @@ -12232,32 +12232,40 @@ static int alc268_auto_create_analog_input_ctls(struct alc_spec *spec,
>  						const struct auto_pin_cfg *cfg)
>  {
>  	struct hda_input_mux *imux = &spec->private_imux[0];
> -	int i, idx1;
> -
> -	for (i = 0; i < AUTO_PIN_LAST; i++) {
> -		switch(cfg->input_pins[i]) {
> -		case 0x18:
> -			idx1 = 0;	/* Mic 1 */
> -			break;
> -		case 0x19:
> -			idx1 = 1;	/* Mic 2 */
> -			break;
> -		case 0x1a:
> -			idx1 = 2;	/* Line In */
> -			break;
> -		case 0x1c:
> -			idx1 = 3;	/* CD */
> -			break;
> -		case 0x12:
> -		case 0x13:
> -			idx1 = 6;	/* digital mics */
> -			break;
> -		default:
> -			continue;
> +	int i, idx1, dmic_nid;
> +
> +	dmic_nid = 0x12;
> +	while (dmic_nid <= 0x13) {
> +		for (i = 0; i < AUTO_PIN_LAST; i++) {
> +			switch (cfg->input_pins[i]) {
> +			case 0x18:
> +				idx1 = 0;	/* Mic 1 */
> +				break;
> +			case 0x19:
> +				idx1 = 1;	/* Mic 2 */
> +				break;
> +			case 0x1a:
> +				idx1 = 2;	/* Line In */
> +				break;
> +			case 0x1c:
> +				idx1 = 3;	/* CD */
> +				break;
> +			case 0x12:
> +			case 0x13:
> +				if (cfg->input_pins[i] != dmic_nid)
> +					continue;
> +				idx1 = 6;	/* digital mics */
> +				break;
> +			default:
> +				continue;
> +			}
> +			imux->items[imux->num_items].label =
> +				auto_pin_cfg_labels[i];
> +			imux->items[imux->num_items].index = idx1;
> +			imux->num_items++;
>  		}
> -		imux->items[imux->num_items].label = auto_pin_cfg_labels[i];
> -		imux->items[imux->num_items].index = idx1;
> -		imux->num_items++;
> +		imux++;
> +		dmic_nid++;
>  	}
>  	return 0;
>  }
> @@ -12355,7 +12363,7 @@ static int alc268_parse_auto_config(struct hda_codec *codec)
>  		add_mixer(spec, alc268_beep_mixer);
>  
>  	add_verb(spec, alc268_volume_init_verbs);
> -	spec->num_mux_defs = 1;
> +	spec->num_mux_defs = 2;
>  	spec->input_mux = &spec->private_imux[0];
>  
>  	err = alc_auto_add_mic_boost(codec);
> @@ -12665,6 +12673,8 @@ static int patch_alc268(struct hda_codec *codec)
>  		for (i = 0; i < spec->num_adc_nids; i++)
>  			snd_hda_codec_write_cache(codec, alc268_capsrc_nids[i],
>  				0, AC_VERB_SET_CONNECT_SEL,
> +				i < spec->num_mux_defs ?
> +				spec->input_mux[i].items[0].index :
>  				spec->input_mux->items[0].index);
>  	}
>  
> -- 
> 1.6.4
> 
> [2 quanta-uw1 <text/plain; UTF-8 (7bit)>]
> Codec: Realtek ALC268
> Address: 0
> Vendor Id: 0x10ec0268
> Subsystem Id: 0x152d1777
> Revision Id: 0x100101
> No Modem Function Group found
> Default PCM:
>     rates [0x560]: 44100 48000 96000 192000
>     bits [0xe]: 16 20 24
>     formats [0x1]: PCM
> Default Amp-In caps: N/A
> Default Amp-Out caps: N/A
> GPIO: io=4, o=0, i=0, unsolicited=1, wake=0
>   IO[0]: enable=0, dir=0, wake=0, sticky=0, data=0, unsol=0
>   IO[1]: enable=0, dir=0, wake=0, sticky=0, data=0, unsol=0
>   IO[2]: enable=0, dir=0, wake=0, sticky=0, data=0, unsol=0
>   IO[3]: enable=0, dir=0, wake=0, sticky=0, data=0, unsol=0
> Node 0x02 [Audio Output] wcaps 0x1d: Stereo Amp-Out
>   Amp-Out caps: ofs=0x40, nsteps=0x40, stepsize=0x03, mute=0
>   Amp-Out vals:  [0x40 0x40]
>   Converter: stream=0, channel=0
>   PCM:
>     rates [0x560]: 44100 48000 96000 192000
>     bits [0xe]: 16 20 24
>     formats [0x1]: PCM
> Node 0x03 [Audio Output] wcaps 0x1d: Stereo Amp-Out
>   Amp-Out caps: ofs=0x40, nsteps=0x40, stepsize=0x03, mute=0
>   Amp-Out vals:  [0x33 0x33]
>   Converter: stream=0, channel=0
>   PCM:
>     rates [0x560]: 44100 48000 96000 192000
>     bits [0xe]: 16 20 24
>     formats [0x1]: PCM
> Node 0x04 [Vendor Defined Widget] wcaps 0xf00000: Mono
> Node 0x05 [Vendor Defined Widget] wcaps 0xf00000: Mono
> Node 0x06 [Audio Output] wcaps 0x211: Stereo Digital
>   Converter: stream=0, channel=0
>   Digital:
>   Digital category: 0x0
>   PCM:
>     rates [0x5e0]: 44100 48000 88200 96000 192000
>     bits [0x1e]: 16 20 24 32
>     formats [0x1]: PCM
> Node 0x07 [Audio Input] wcaps 0x100111: Stereo
>   Converter: stream=0, channel=0
>   SDI-Select: 0
>   PCM:
>     rates [0x160]: 44100 48000 96000
>     bits [0xe]: 16 20 24
>     formats [0x1]: PCM
>   Connection: 1
>      0x24
> Node 0x08 [Audio Input] wcaps 0x100111: Stereo
>   Converter: stream=0, channel=0
>   SDI-Select: 0
>   PCM:
>     rates [0x160]: 44100 48000 96000
>     bits [0xe]: 16 20 24
>     formats [0x1]: PCM
>   Connection: 1
>      0x23
> Node 0x09 [Vendor Defined Widget] wcaps 0xf00000: Mono
> Node 0x0a [Vendor Defined Widget] wcaps 0xf00000: Mono
> Node 0x0b [Vendor Defined Widget] wcaps 0xf00000: Mono
> Node 0x0c [Vendor Defined Widget] wcaps 0xf00000: Mono
> Node 0x0d [Vendor Defined Widget] wcaps 0xf00000: Mono
> Node 0x0e [Audio Mixer] wcaps 0x20010a: Mono Amp-In
>   Amp-In caps: ofs=0x00, nsteps=0x00, stepsize=0x00, mute=1
>   Amp-In vals:  [0x00]
>   Connection: 1
>      0x02
> Node 0x0f [Audio Mixer] wcaps 0x20010b: Stereo Amp-In
>   Amp-In caps: ofs=0x00, nsteps=0x00, stepsize=0x00, mute=1
>   Amp-In vals:  [0x00 0x00] [0x00 0x00]
>   Connection: 2
>      0x02 0x1d
> Node 0x10 [Audio Mixer] wcaps 0x20010b: Stereo Amp-In
>   Amp-In caps: ofs=0x00, nsteps=0x00, stepsize=0x00, mute=1
>   Amp-In vals:  [0x00 0x00] [0x00 0x00] [0x80 0x80]
>   Connection: 3
>      0x03 0x1d 0x02
> Node 0x11 [Vendor Defined Widget] wcaps 0xf00000: Mono
> Node 0x12 [Pin Complex] wcaps 0x400001: Stereo
>   Pincap 0x00000020: IN
>   Pin Default 0x99a30920: [Fixed] Mic at Int ATAPI
>     Conn = ATAPI, Color = Unknown
>     DefAssociation = 0x2, Sequence = 0x0
>     Misc = NO_PRESENCE
>   Pin-ctls: 0x20: IN
> Node 0x13 [Pin Complex] wcaps 0x400001: Stereo
>   Pincap 0x00000020: IN
>   Pin Default 0x411111f0: [N/A] Speaker at Ext Rear
>     Conn = 1/8, Color = Black
>     DefAssociation = 0xf, Sequence = 0x0
>     Misc = NO_PRESENCE
>   Pin-ctls: 0x00:
> Node 0x14 [Pin Complex] wcaps 0x40018d: Stereo Amp-Out
>   Amp-Out caps: ofs=0x00, nsteps=0x00, stepsize=0x00, mute=1
>   Amp-Out vals:  [0x00 0x00]
>   Pincap 0x0001003c: IN OUT HP EAPD Detect
>   EAPD 0x2: EAPD
>   Pin Default 0x99130110: [Fixed] Speaker at Int ATAPI
>     Conn = ATAPI, Color = Unknown
>     DefAssociation = 0x1, Sequence = 0x0
>     Misc = NO_PRESENCE
>   Pin-ctls: 0x40: OUT
>   Unsolicited: tag=00, enabled=0
>   Connection: 1
>      0x0f
> Node 0x15 [Pin Complex] wcaps 0x40018d: Stereo Amp-Out
>   Amp-Out caps: ofs=0x00, nsteps=0x00, stepsize=0x00, mute=1
>   Amp-Out vals:  [0x00 0x00]
>   Pincap 0x0001003c: IN OUT HP EAPD Detect
>   EAPD 0x2: EAPD
>   Pin Default 0x0321401f: [Jack] HP Out at Ext Left
>     Conn = 1/8, Color = Green
>     DefAssociation = 0x1, Sequence = 0xf
>   Pin-ctls: 0xc0: OUT HP
>   Unsolicited: tag=04, enabled=1
>   Connection: 1
>      0x10
> Node 0x16 [Pin Complex] wcaps 0x40010c: Mono Amp-Out
>   Amp-Out caps: ofs=0x00, nsteps=0x00, stepsize=0x00, mute=1
>   Amp-Out vals:  [0x80]
>   Pincap 0x00000010: OUT
>   Pin Default 0x411111f0: [N/A] Speaker at Ext Rear
>     Conn = 1/8, Color = Black
>     DefAssociation = 0xf, Sequence = 0x0
>     Misc = NO_PRESENCE
>   Pin-ctls: 0x00:
>   Connection: 1
>      0x0e
> Node 0x17 [Vendor Defined Widget] wcaps 0xf00000: Mono
> Node 0x18 [Pin Complex] wcaps 0x40018f: Stereo Amp-In Amp-Out
>   Amp-In caps: ofs=0x00, nsteps=0x02, stepsize=0x4f, mute=0
>   Amp-In vals:  [0x01 0x01]
>   Amp-Out caps: ofs=0x00, nsteps=0x00, stepsize=0x00, mute=1
>   Amp-Out vals:  [0x80 0x80]
>   Pincap 0x00003734: IN OUT Detect
>     Vref caps: HIZ 50 GRD 80 100
>   Pin Default 0x03a19830: [Jack] Mic at Ext Left
>     Conn = 1/8, Color = Pink
>     DefAssociation = 0x3, Sequence = 0x0
>   Pin-ctls: 0x24: IN VREF_80
>   Unsolicited: tag=00, enabled=0
>   Connection: 1
>      0x02
> Node 0x19 [Pin Complex] wcaps 0x40008b: Stereo Amp-In
>   Amp-In caps: ofs=0x00, nsteps=0x02, stepsize=0x4f, mute=0
>   Amp-In vals:  [0x00 0x00]
>   Pincap 0x00003724: IN Detect
>     Vref caps: HIZ 50 GRD 80 100
>   Pin Default 0x411111f0: [N/A] Speaker at Ext Rear
>     Conn = 1/8, Color = Black
>     DefAssociation = 0xf, Sequence = 0x0
>     Misc = NO_PRESENCE
>   Pin-ctls: 0x24: IN VREF_80
>   Unsolicited: tag=00, enabled=0
> Node 0x1a [Pin Complex] wcaps 0x40018f: Stereo Amp-In Amp-Out
>   Amp-In caps: ofs=0x00, nsteps=0x02, stepsize=0x4f, mute=0
>   Amp-In vals:  [0x00 0x00]
>   Amp-Out caps: ofs=0x00, nsteps=0x00, stepsize=0x00, mute=1
>   Amp-Out vals:  [0x80 0x80]
>   Pincap 0x00003734: IN OUT Detect
>     Vref caps: HIZ 50 GRD 80 100
>   Pin Default 0x411111f0: [N/A] Speaker at Ext Rear
>     Conn = 1/8, Color = Black
>     DefAssociation = 0xf, Sequence = 0x0
>     Misc = NO_PRESENCE
>   Pin-ctls: 0x20: IN VREF_HIZ
>   Unsolicited: tag=00, enabled=0
>   Connection: 1
>      0x02
> Node 0x1b [Vendor Defined Widget] wcaps 0xf00000: Mono
> Node 0x1c [Pin Complex] wcaps 0x400001: Stereo
>   Pincap 0x00000020: IN
>   Pin Default 0x411111f0: [N/A] Speaker at Ext Rear
>     Conn = 1/8, Color = Black
>     DefAssociation = 0xf, Sequence = 0x0
>     Misc = NO_PRESENCE
>   Pin-ctls: 0x20: IN
> Node 0x1d [Pin Complex] wcaps 0x400000: Mono
>   Pincap 0x00000020: IN
>   Pin Default 0x4015812d: [N/A] Speaker at Ext N/A
>     Conn = Optical, Color = Purple
>     DefAssociation = 0x2, Sequence = 0xd
>     Misc = NO_PRESENCE
>   Pin-ctls: 0x20: IN
> Node 0x1e [Pin Complex] wcaps 0x400380: Mono Digital
>   Pincap 0x00000010: OUT
>   Pin Default 0x411111f0: [N/A] Speaker at Ext Rear
>     Conn = 1/8, Color = Black
>     DefAssociation = 0xf, Sequence = 0x0
>     Misc = NO_PRESENCE
>   Pin-ctls: 0x40: OUT
>   Unsolicited: tag=00, enabled=0
>   Connection: 1
>      0x06
> Node 0x1f [Vendor Defined Widget] wcaps 0xf00000: Mono
> Node 0x20 [Vendor Defined Widget] wcaps 0xf00040: Mono
>   Processing caps: benign=0, ncoeff=10
>   Processing Coefficient: 0x00
>   Coefficient Index: 0x09
> Node 0x21 [Vendor Defined Widget] wcaps 0xf00000: Mono
> Node 0x22 [Vendor Defined Widget] wcaps 0xf00000: Mono
> Node 0x23 [Audio Selector] wcaps 0x30010d: Stereo Amp-Out
>   Amp-Out caps: ofs=0x0a, nsteps=0x1f, stepsize=0x05, mute=1
>   Amp-Out vals:  [0x18 0x18]
>   Connection: 7
>      0x18* 0x19 0x1a 0x1c 0x14 0x15 0x12
> Node 0x24 [Audio Selector] wcaps 0x30010d: Stereo Amp-Out
>   Amp-Out caps: ofs=0x0a, nsteps=0x1f, stepsize=0x05, mute=1
>   Amp-Out vals:  [0x18 0x18]
>   Connection: 7
>      0x18 0x19 0x1a 0x1c 0x14 0x15 0x13*


More information about the Alsa-devel mailing list