[alsa-devel] [PATCH]alsa:patch_realtek.c iMac9,1 sound fixes.
Justin P. Mattock
justinmattock at gmail.com
Tue May 25 20:58:28 CEST 2010
On 05/25/2010 11:26 AM, Takashi Iwai wrote:
> At Sun, 23 May 2010 10:55:00 -0700,
> Justin P. Mattock wrote:
>
>> What seemed to be a simple little task of getting the microphone
>> to work, ended up becoming a bigger task than I had set out.
>> (oh-well, good learning experience).
>>
>> Anyways below you will find an updated patch to the iMac9,1 machine
>> which fixes some issues that I found.(keep in mind this is still a work
>> in progress).
>>
>> First issue:
>> With the original patch, I've noticed by unmuting the mic
>> (and even having it muted), there is a distorted("Noise")
>> coming from the internal speakers, even when the headphones are plugged in.
>> What my finding's revealed is:
>>
>> /* Mic (rear) pin: input vref at 80% */
>> {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
>> {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
>>
>> > From the original patch. Looking at codec#0 0x18/0x1a is listed as:
>>
>> Node 0x18 [Pin Complex] wcaps 0x40018f: Stereo Amp-In Amp-Out
>> Amp-In caps: ofs=0x00, nsteps=0x03, stepsize=0x27, mute=0
>> Amp-In vals: [0x00 0x00]
>> Amp-Out caps: ofs=0x00, nsteps=0x00, stepsize=0x00, mute=1
>> Amp-Out vals: [0x00 0x00]
>> Pincap 0x0000373c: IN OUT HP Detect
>> Vref caps: HIZ 50 GRD 80 100
>> Pin Default 0x90100141: [Fixed] Speaker at Int N/A
>> Conn = Unknown, Color = Unknown
>> DefAssociation = 0x4, Sequence = 0x1
>> Misc = NO_PRESENCE
>> Pin-ctls: 0x41: OUT VREF_50
>> Unsolicited: tag=00, enabled=0
>> Connection: 5
>> 0x0c* 0x0d 0x0e 0x0f 0x26
>>
>> seems this Node is listed as: [Fixed] Speaker while 0x15
>>
>> Node 0x15 [Pin Complex] wcaps 0x40018f: Stereo Amp-In Amp-Out
>> Amp-In caps: ofs=0x00, nsteps=0x03, stepsize=0x27, mute=0
>> Amp-In vals: [0x00 0x00]
>> Amp-Out caps: ofs=0x00, nsteps=0x00, stepsize=0x00, mute=1
>> Amp-Out vals: [0x80 0x80]
>> Pincap 0x0000373c: IN OUT HP Detect
>> Vref caps: HIZ 50 GRD 80 100
>> Pin Default 0x018b3020: [Jack] Line In at Ext Rear
>> Conn = Comb, Color = Blue
>> DefAssociation = 0x2, Sequence = 0x0
>> Pin-ctls: 0x01: VREF_50
>> Unsolicited: tag=00, enabled=0
>> Connection: 5
>> 0x0c 0x0d* 0x0e 0x0f 0x26
>>
>> is [Jack] Line In at Ext Rear.
>> (looking at the other apple products as examples
>> I came up with the fix below).
>>
>> Second issue:
>> alc885_mbp_4ch_modes
>> The original patch does a good job with the
>> HP pin automute function, but from what I noticed is I would have to manually
>> change the channel form 2 to 4 after plugging the headphones in.
>> And not to mention having odd moments to where I was jamming out
>> with the headphones on, then later realized I had sound blasting out
>> of the speakers as well. My findings revealed that changing
>> alc885_mbp_4ch_modes to alc885_mba21_ch_modes and setting
>> - spec->autocfg.speaker_pins[0] = 0x15;
>> + spec->autocfg.speaker_pins[0] = 0x18;
>> gets the automute function when the headphones plugged in working
>> flawlessly(and the no need to manually change the channel number
>> afterwards).
>>
>> Third issue:
>> alc885_imac91_mixer
>> There probably doesnt need to be anything changed with this
>> (esspecially if your one to like lots of sliders),but my findings
>> revealed that mac osx only has a master on the top right,
>> another switch on itunes, and then a slider for the mic.
>>
>> So the changes I did below try and mimic osx as much as possible
>> (only thing I had an issue with is just having one mute switch
>> on the master, instead of having two(still investigating)).
>>
>> fourth issue:
>> alc882_capture_source
>> I endeded up creating alc889A_imac91_capture_source()
>> only because looking at alc882_capture_source I see
>> that the mic is set to 0x1 while this works, I also noticed
>> that adding 0x1 and 0x01 and testing that 0x1 somehow
>> stops working, and 0x01 works(so I figured 0x01 was more
>> of the alpha of the numbers(still need to figure out
>> where that valuse is)). In any case the microphone
>> does work with the original, and with the below patch, but both
>> still record not as clean(lots of "Noise", which I would like to
>> look into too).
>> Note: using alsamixer -Va reveals the capture switches.
>>
>> Overall the original patch is good, the below patch does
>> (hopefully)address some issues, if it's too much of a change
>> I can go back, and just adjust the verb pins on the original
>> and just call it that..(main thing over here is I don't have
>> the "Noise" coming out of the speakers(and music sounds good)...
>>
>> cheers..
>>
>> Signed-off-by: Justin P. Mattock<justinmattock at gmail.com>
>>
> Looks good. Now applied.
> Thanks.
>
>
> Takashi
>
>
o.k...
>> ---
>> sound/pci/hda/patch_realtek.c | 84 +++++++++++++++++++---------------------
>> 1 files changed, 40 insertions(+), 44 deletions(-)
>>
>> diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
>> index 886d8e4..d8adea3 100644
>> --- a/sound/pci/hda/patch_realtek.c
>> +++ b/sound/pci/hda/patch_realtek.c
>> @@ -6937,6 +6937,14 @@ static struct hda_input_mux alc889A_mb31_capture_source = {
>> },
>> };
>>
>> +static struct hda_input_mux alc889A_imac91_capture_source = {
>> + .num_items = 2,
>> + .items = {
>> + { "Mic", 0x01 },
>> + { "Line", 0x2 }, /* Not sure! */
>> + },
>> +};
>> +
>> /*
>> * 2ch mode
>> */
>> @@ -7398,15 +7406,8 @@ static struct snd_kcontrol_new alc885_macmini3_mixer[] = {
>> };
>>
>> static struct snd_kcontrol_new alc885_imac91_mixer[] = {
>> - HDA_CODEC_VOLUME("Line-Out Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
>> - HDA_BIND_MUTE ("Line-Out Playback Switch", 0x0c, 0x02, HDA_INPUT),
>> - HDA_CODEC_MUTE ("Speaker Playback Switch", 0x14, 0x00, HDA_OUTPUT),
>> - HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
>> - HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
>> - HDA_CODEC_MUTE ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
>> - HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
>> - HDA_CODEC_MUTE ("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
>> - HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT),
>> + HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
>> + HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 0x02, HDA_INPUT),
>> { } /* end */
>> };
>>
>> @@ -7907,61 +7908,56 @@ static struct hda_verb alc885_mbp3_init_verbs[] = {
>>
>> /* iMac 9,1 */
>> static struct hda_verb alc885_imac91_init_verbs[] = {
>> - /* Line-Out mixer: unmute input/output amp left and right (volume = 0) */
>> - {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
>> - {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
>> - {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
>> - /* Rear mixer */
>> - {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
>> - {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
>> - {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
>> - /* HP Pin: output 0 (0x0c) */
>> + /* Internal Speaker Pin (0x0c) */
>> + {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, (PIN_OUT | AC_PINCTL_VREF_50) },
>> + {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
>> + {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
>> + {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, (PIN_OUT | AC_PINCTL_VREF_50) },
>> + {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
>> + {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
>> + /* HP Pin: Rear */
>> {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
>> {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
>> {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
>> - {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
>> - /* Internal Speakers: output 0 (0x0d) */
>> - {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
>> + {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, (ALC880_HP_EVENT | AC_USRSP_EN)},
>> + /* Line in Rear */
>> + {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, AC_PINCTL_VREF_50},
>> {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
>> - {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
>> - /* Mic (rear) pin: input vref at 80% */
>> - {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
>> - {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
>> /* Front Mic pin: input vref at 80% */
>> {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
>> {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
>> - /* Line In pin: use output 1 when in LineOut mode */
>> - {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
>> - {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
>> - {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
>> -
>> - /* FIXME: use matrix-type input source selection */
>> - /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
>> - /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
>> + /* Rear mixer */
>> + {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
>> + {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
>> + {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
>> + /* Line-Out mixer: unmute input/output amp left and right (volume = 0) */
>> + {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
>> + {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
>> + {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
>> + /* 0x24 [Audio Mixer] wcaps 0x20010b: Stereo Amp-In */
>> {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
>> {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
>> {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
>> {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
>> - /* Input mixer2 */
>> + /* 0x23 [Audio Mixer] wcaps 0x20010b: Stereo Amp-In */
>> {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
>> {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
>> {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
>> {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
>> - /* Input mixer3 */
>> + /* 0x22 [Audio Mixer] wcaps 0x20010b: Stereo Amp-In */
>> {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
>> {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
>> {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
>> {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
>> - /* ADC1: mute amp left and right */
>> + /* 0x07 [Audio Input] wcaps 0x10011b: Stereo Amp-In */
>> {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
>> {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
>> - /* ADC2: mute amp left and right */
>> + /* 0x08 [Audio Input] wcaps 0x10011b: Stereo Amp-In */
>> {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
>> {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
>> - /* ADC3: mute amp left and right */
>> + /* 0x09 [Audio Input] wcaps 0x10011b: Stereo Amp-In */
>> {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
>> {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
>> -
>> { }
>> };
>>
>> @@ -8030,7 +8026,7 @@ static void alc885_imac91_setup(struct hda_codec *codec)
>> struct alc_spec *spec = codec->spec;
>>
>> spec->autocfg.hp_pins[0] = 0x14;
>> - spec->autocfg.speaker_pins[0] = 0x15;
>> + spec->autocfg.speaker_pins[0] = 0x18;
>> spec->autocfg.speaker_pins[1] = 0x1a;
>> }
>>
>> @@ -9539,14 +9535,14 @@ static struct alc_config_preset alc882_presets[] = {
>> .init_hook = alc885_imac24_init_hook,
>> },
>> [ALC885_IMAC91] = {
>> - .mixers = { alc885_imac91_mixer, alc882_chmode_mixer },
>> + .mixers = {alc885_imac91_mixer},
>> .init_verbs = { alc885_imac91_init_verbs,
>> alc880_gpio1_init_verbs },
>> .num_dacs = ARRAY_SIZE(alc882_dac_nids),
>> .dac_nids = alc882_dac_nids,
>> - .channel_mode = alc885_mbp_4ch_modes,
>> - .num_channel_mode = ARRAY_SIZE(alc885_mbp_4ch_modes),
>> - .input_mux =&alc882_capture_source,
>> + .channel_mode = alc885_mba21_ch_modes,
>> + .num_channel_mode = ARRAY_SIZE(alc885_mba21_ch_modes),
>> + .input_mux =&alc889A_imac91_capture_source,
>> .dig_out_nid = ALC882_DIGOUT_NID,
>> .dig_in_nid = ALC882_DIGIN_NID,
>> .unsol_event = alc_automute_amp_unsol_event,
>> --
>> 1.7.1.rc1.21.gf3bd6
>>
>>
>
More information about the Alsa-devel
mailing list