From: Julian Sikorski <belegdol@gmail.com>
To: alsa-devel@alsa-project.org
Subject: Re: Clevo P170HM / Sager NP8170 audio
Date: Tue, 29 Nov 2011 11:25:22 +0100 [thread overview]
Message-ID: <jb2bui$bre$1@dough.gmane.org> (raw)
In-Reply-To: <CAN8ccibQX-Lqdn0T-WWtkqjM427TenpLX4OuzuwSCOz7j4RcWQ@mail.gmail.com>
W dniu 29.11.2011 00:45, Raymond Yau pisze:
> 2011/11/28 Julian Sikorski <belegdol@gmail.com>:
>> W dniu 28.11.2011 01:42, Raymond Yau pisze:
>>> 2011/11/25 Julian Sikorski <belegdol@gmail.com>:
>>>> W dniu 25.11.2011 07:39, Raymond Yau pisze:
>>>>> 2011/11/22 Julian Sikorski <belegdol@gmail.com>:
>>>>>
>>>>> Don't have any realtek codec, not sure why hda-jack-sense-test.py
>>>>> locked up when you use user_pin_configs
>>>>>
>>>>>>>> I then applied your patch on top of Fedora 3.1.1 kernel (crude patch
>>>>>>>> attached). After reboot:
>>>>>>>> * hda-jack-sense-test.py was still working, without lockups this time
>>>>>>>> * alsamixer -c0 revealed a new "Front" slider, which was controlling the
>>>>>>>> volume on 0x17
>>>>>>>> * there was still no 8-channel mode (probably related to what you wrote
>>>>>>>> below)
>>>>>>>> * there were more options for auto mute (Disabled, Speaker Only, Line
>>>>>>>> Out+Speaker)
>>>>>>>> * here is the new alsa-info.sh:
>>>>>>>> http://www.alsa-project.org/db/?f=923b75ad3997dc8f5878852e327f9b999a196052
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>>>
>>>>>>>>> To add the missing pin default of side jack 0x17
>>>>>>>>>
>>>>>>>>> ALC662_FIXUP_ASUS_MODE8,
>>>>>>>>> + ALC892_FIXUP_CLEVO_4ST_8CH,
>>>>>>>>> };
>>>>>>>>>
>>>>>>>>> static const struct alc_fixup alc662_fixups[] = {
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> + [ALC892_FIXUP_CLEVO_4ST_8CH] = {
>>>>>>>>> + .type = ALC_FIXUP_PINS,
>>>>>>>>> + .v.pins = (const struct alc_pincfg[]) {
>>>>>>>>> +/*
>>>>>>>>> + need to be same location as the other jack
>>>>>>>>> + may need to change the default association and sequence since
>>>>>>>>> + Lower Default Association values would be higher in priority for resources
>>>>>>>>> + such as processing nodes or Input and Output Converters.
>>>>>>>>> + A value of 0000b is reserved and should not be used
>>>>>>>>> +*/
>>>>>>>>> + { 0x17, 0x01011013 }, /* Side */
>>>>>>>>> + { }
>>>>>>>>> + },
>>>>>>>>> + },
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> + SND_PCI_QUIRK(0x1558, 0x5102, "Clevo P150HM", ALC892_FIXUP_CLEVO_4ST_8CH),
>>>>>>>>> + SND_PCI_QUIRK(0x1558, 0x7100, "Clevo P170HM", ALC892_FIXUP_CLEVO_4ST_8CH),
>>>>>>>>>
>>>>>>>>> SImilar case are those notebooks hda-emu/codecs/alc1200-msi-gx620
>>>>>>>>> which has 1 hp(green), 1 line-in(blue), 1 ext-mic(pink) and 1 line
>>>>>>>>> out(grey) at same location (ext rear) for surround71 (and also 1
>>>>>>>>> speakers, 1 int mic)
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> hda_codec: ALC1200: BIOS auto-probing.
>>>>>>>>> hda_codec: ALC1200: SKU not ready 0x598301f0
>>>>>>>>> autoconfig: line_outs=1 (0x17/0x0/0x0/0x0/0x0) type:line
>>>>>>>>> speaker_outs=1 (0x1b/0x0/0x0/0x0/0x0)
>>>>>>>>> hp_outs=1 (0x14/0x0/0x0/0x0/0x0)
>>>>>>>>> mono: mono_out=0x0
>>>>>>>>> dig-out=0x1e/0x0
>>>>>>>>> inputs: Mic=0x18 Internal Mic=0x19 Line=0x1a
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> CTRL: add: Line-Out Jack:0
>>>>>>>>> CTRL: add: Headphone Jack:0
>>>>>>>>> CTRL: add: Mic Jack:0
>>>>>>>>> CTRL: add: Line Jack:0
>>>>>>>>>
>>>>>>>>>> get 1
>>>>>>>>> 1 Channel Mode:0
>>>>>>>>> ITEM: 0:2ch, 1:4ch, 2:6ch, VAL: [2ch]
>>>>>>>>>
>>>>>
>>>>> After the pin fixup, your notebook is almost like alc1200 msi gx460
>>>>> except speaker and hp are swapped, this mean that those volume
>>>>> controls and switches are similar to targa_mixer , targa_8ch_mixer of
>>>>> model="targa-8ch-dig"
>>>>>
>>>>>>>>>
>>>>>>>>> This mean that when switch to 6/8 channel mode, it will conflict with
>>>>>>>>> automic detection since the pin cap alc892 's mic jack does not
>>>>>>>>> support impedance sense and the driver does not know the plug is mic
>>>>>>>>> or speaker by measuring the impedance
>>>>>>>>>
>>>>>>>>> The driver have to disable automic detection when user switch "channel
>>>>>>>>> mode" to 6ch/8ch as the user should still able to use the internal mic
>>>>>>>>> when the external mic jack is retasked as output
>>>>>>>>>
>>>>>
>>>>> The are some difference between p170hm and your p150hm if p170hm has
>>>>> 5.1 speakers which still can have auto mic detection enabled.
>>>>>
>>>>>
>>>>> you can add the following code in alc_auto_ch_mode_put() for debugging
>>>>> and need to switch "auto mute mode" to "speaker" for 8 channels
>>>>>
>>>>>
>>>>> if (spec->need_dac_fix && !spec->const_channel_count)
>>>>> spec->multiout.num_dacs = spec->multiout.max_channels / 2;
>>>>>
>>>>> + printk(KERN_INFO "ch = %d\n",ch);
>>>>> + printk(KERN_INFO "max channel %d\n",spec->multiout.max_channels);
>>>>> + for (i=0; i<spec->autocfg.hp_outs; i++)
>>>>> + printk(KERN_INFO "hp dac(%d) %x pin %x\n", i,
>>>>> spec->multiout.hp_out_nid[i], spec->autocfg.hp_pins[i]);
>>>>> + for (i=0; i<spec->multiout.num_dacs; i++)
>>>>> + printk(KERN_INFO "private_dac(%d) %x\n", i, spec->private_dac_nids[i]);
>>>>> + for (i=0; i<spec->autocfg.line_outs; i++)
>>>>> + printk(KERN_INFO "line_out(%d) pin %x\n", i, spec->autocfg.line_out_pins[i]);
>>>>> + for (i=0; i<spec->multiout.num_dacs-1; i++)
>>>>> + printk(KERN_INFO "multi_io(%d) dac %x pin %x\n", i,
>>>>> spec->multi_io[i].dac, spec->multi_io[i].pin);
>>>>> + for (i=0; i<spec->autocfg.speaker_outs; i++)
>>>>> + printk(KERN_INFO "extra_out(%d) dac %x pin %x\n", i,
>>>>> spec->multiout.extra_out_nid[i], spec->autocfg.speaker_pins[i]);
>>>>> return 1
>>>>
>>>> This is what appears in /var/log/messages if you go from 8 to 2 channels
>>>> and back:
>>>>
>>>> Nov 25 13:05:11 snowball2 kernel: [ 1515.853640] ch = 2
>>>> Nov 25 13:05:11 snowball2 kernel: [ 1515.853642] max channel 6
>>>> Nov 25 13:05:11 snowball2 kernel: [ 1515.853643] hp dac(0) 0 pin 1b
>>>> Nov 25 13:05:11 snowball2 kernel: [ 1515.853644] private_dac(0) 2
>>>> Nov 25 13:05:11 snowball2 kernel: [ 1515.853645] private_dac(1) 3
>>>> Nov 25 13:05:11 snowball2 kernel: [ 1515.853646] private_dac(2) 4
>>>> Nov 25 13:05:11 snowball2 kernel: [ 1515.853647] private_dac(3) 5
>>>> Nov 25 13:05:11 snowball2 kernel: [ 1515.853648] line_out(0) pin 17
>>>> Nov 25 13:05:11 snowball2 kernel: [ 1515.853649] multi_io(0) dac 3 pin 1a
>>>> Nov 25 13:05:11 snowball2 kernel: [ 1515.853650] multi_io(1) dac 4 pin 18
>>>> Nov 25 13:05:11 snowball2 kernel: [ 1515.853651] multi_io(2) dac 5 pin 17
>>>> Nov 25 13:05:11 snowball2 kernel: [ 1515.853652] extra_out(0) dac 0 pin 14
>>>> Nov 25 13:05:24 snowball2 kernel: [ 1528.952829] ch = 1
>>>> Nov 25 13:05:24 snowball2 kernel: [ 1528.952835] max channel 4
>>>> Nov 25 13:05:24 snowball2 kernel: [ 1528.952840] hp dac(0) 0 pin 1b
>>>> Nov 25 13:05:24 snowball2 kernel: [ 1528.952843] private_dac(0) 2
>>>> Nov 25 13:05:24 snowball2 kernel: [ 1528.952846] private_dac(1) 3
>>>> Nov 25 13:05:24 snowball2 kernel: [ 1528.952849] private_dac(2) 4
>>>> Nov 25 13:05:24 snowball2 kernel: [ 1528.952852] private_dac(3) 5
>>>> Nov 25 13:05:24 snowball2 kernel: [ 1528.952855] line_out(0) pin 17
>>>> Nov 25 13:05:24 snowball2 kernel: [ 1528.952859] multi_io(0) dac 3 pin 1a
>>>> Nov 25 13:05:24 snowball2 kernel: [ 1528.952863] multi_io(1) dac 4 pin 18
>>>> Nov 25 13:05:24 snowball2 kernel: [ 1528.952866] multi_io(2) dac 5 pin 17
>>>> Nov 25 13:05:24 snowball2 kernel: [ 1528.952870] extra_out(0) dac 0 pin 14
>>>> Nov 25 13:05:26 snowball2 kernel: [ 1531.378952] ch = 0
>>>> Nov 25 13:05:26 snowball2 kernel: [ 1531.378958] max channel 2
>>>> Nov 25 13:05:26 snowball2 kernel: [ 1531.378963] hp dac(0) 0 pin 1b
>>>> Nov 25 13:05:26 snowball2 kernel: [ 1531.378966] private_dac(0) 2
>>>> Nov 25 13:05:26 snowball2 kernel: [ 1531.378969] private_dac(1) 3
>>>> Nov 25 13:05:26 snowball2 kernel: [ 1531.378972] private_dac(2) 4
>>>> Nov 25 13:05:26 snowball2 kernel: [ 1531.378975] private_dac(3) 5
>>>> Nov 25 13:05:26 snowball2 kernel: [ 1531.378978] line_out(0) pin 17
>>>> Nov 25 13:05:26 snowball2 kernel: [ 1531.378982] multi_io(0) dac 3 pin 1a
>>>> Nov 25 13:05:26 snowball2 kernel: [ 1531.379002] multi_io(1) dac 4 pin 18
>>>> Nov 25 13:05:26 snowball2 kernel: [ 1531.379006] multi_io(2) dac 5 pin 17
>>>> Nov 25 13:05:26 snowball2 kernel: [ 1531.379010] extra_out(0) dac 0 pin 14
>>>> Nov 25 13:06:29 snowball2 kernel: [ 1593.746269] ch = 1
>>>> Nov 25 13:06:29 snowball2 kernel: [ 1593.746275] max channel 4
>>>> Nov 25 13:06:29 snowball2 kernel: [ 1593.746279] hp dac(0) 0 pin 1b
>>>> Nov 25 13:06:29 snowball2 kernel: [ 1593.746283] private_dac(0) 2
>>>> Nov 25 13:06:29 snowball2 kernel: [ 1593.746286] private_dac(1) 3
>>>> Nov 25 13:06:29 snowball2 kernel: [ 1593.746289] private_dac(2) 4
>>>> Nov 25 13:06:29 snowball2 kernel: [ 1593.746291] private_dac(3) 5
>>>> Nov 25 13:06:29 snowball2 kernel: [ 1593.746295] line_out(0) pin 17
>>>> Nov 25 13:06:29 snowball2 kernel: [ 1593.746298] multi_io(0) dac 3 pin 1a
>>>> Nov 25 13:06:29 snowball2 kernel: [ 1593.746302] multi_io(1) dac 4 pin 18
>>>> Nov 25 13:06:29 snowball2 kernel: [ 1593.746306] multi_io(2) dac 5 pin 17
>>>> Nov 25 13:06:29 snowball2 kernel: [ 1593.746310] extra_out(0) dac 0 pin 14
>>>> Nov 25 13:06:31 snowball2 kernel: [ 1596.174127] ch = 2
>>>> Nov 25 13:06:31 snowball2 kernel: [ 1596.174133] max channel 6
>>>> Nov 25 13:06:31 snowball2 kernel: [ 1596.174195] hp dac(0) 0 pin 1b
>>>> Nov 25 13:06:31 snowball2 kernel: [ 1596.174199] private_dac(0) 2
>>>> Nov 25 13:06:31 snowball2 kernel: [ 1596.174202] private_dac(1) 3
>>>> Nov 25 13:06:31 snowball2 kernel: [ 1596.174205] private_dac(2) 4
>>>> Nov 25 13:06:31 snowball2 kernel: [ 1596.174208] private_dac(3) 5
>>>> Nov 25 13:06:31 snowball2 kernel: [ 1596.174211] line_out(0) pin 17
>>>> Nov 25 13:06:31 snowball2 kernel: [ 1596.174215] multi_io(0) dac 3 pin 1a
>>>> Nov 25 13:06:31 snowball2 kernel: [ 1596.174219] multi_io(1) dac 4 pin 18
>>>> Nov 25 13:06:31 snowball2 kernel: [ 1596.174223] multi_io(2) dac 5 pin 17
>>>> Nov 25 13:06:31 snowball2 kernel: [ 1596.174226] extra_out(0) dac 0 pin 14
>>>> Nov 25 13:06:33 snowball2 kernel: [ 1598.111893] ch = 3
>>>> Nov 25 13:06:33 snowball2 kernel: [ 1598.111900] max channel 8
>>>> Nov 25 13:06:33 snowball2 kernel: [ 1598.111904] hp dac(0) 0 pin 1b
>>>> Nov 25 13:06:33 snowball2 kernel: [ 1598.111908] private_dac(0) 2
>>>> Nov 25 13:06:33 snowball2 kernel: [ 1598.111911] private_dac(1) 3
>>>> Nov 25 13:06:33 snowball2 kernel: [ 1598.111914] private_dac(2) 4
>>>> Nov 25 13:06:33 snowball2 kernel: [ 1598.111917] private_dac(3) 5
>>>> Nov 25 13:06:33 snowball2 kernel: [ 1598.111920] line_out(0) pin 17
>>>> Nov 25 13:06:33 snowball2 kernel: [ 1598.111924] multi_io(0) dac 3 pin 1a
>>>> Nov 25 13:06:33 snowball2 kernel: [ 1598.111927] multi_io(1) dac 4 pin 18
>>>> Nov 25 13:06:33 snowball2 kernel: [ 1598.111931] multi_io(2) dac 5 pin 17
>>>> Nov 25 13:06:33 snowball2 kernel: [ 1598.111935] extra_out(0) dac 0 pin 14
>>>>
>>>>>
>>>>> Try the following code which try to assign dac 02, 03, 04, and 05 to
>>>>> spec->private_dac front, surround, clfe and side.
>>>>>
>>>>> static int alc_auto_fill_dac_nids(struct hda_codec *codec)
>>>>> {
>>>>> ...
>>>>> again:
>>>>> /* set num_dacs once to full for alc_auto_look_for_dac() */
>>>>> spec->multiout.num_dacs = cfg->line_outs;
>>>>> spec->multiout.hp_out_nid[0] = 0;
>>>>> spec->multiout.extra_out_nid[0] = 0;
>>>>> memset(spec->private_dac_nids, 0, sizeof(spec->private_dac_nids));
>>>>> spec->multiout.dac_nids = spec->private_dac_nids;
>>>>>
>>>>> + if (cfg->hp_outs == 1 && cfg->line_outs == 1 &&
>>>>> + cfg->num_inputs >= 3 && cfg->speaker_outs >= 1) {
>>>>> +/* assign 0x02 as Front DAC by using speaker or hp pins*/
>>>>> + spec->private_dac_nids[0] = alc_auto_look_for_dac(codec,
>>>>> cfg->speaker_pins[0]);
>>>>> +/* hp , mic and line-in at the same location
>>>>> + use alc_auto_fill_multi_ios() to assign surround and clfe dacs
>>>>> +*/
>>>>> + defcfg = snd_hda_codec_get_pincfg(codec, cfg->hp_pins[0]);
>>>>> + location = get_defcfg_location(defcfg);
>>>>> + spec->multiout.num_dacs = 1;
>>>>> + num_pins = alc_auto_fill_multi_ios(codec, location, 1);
>>>>> + if (num_pins > 0) {
>>>>> + spec->multi_ios = num_pins;
>>>>> + spec->ext_channel_count = 2;
>>>>> + spec->multiout.num_dacs = num_pins + 1;
>>>>> + }
>>>>> +/* an ugly hack to add side as multi io even side does not support input
>>>>> + set pin ctl to PIN_OUT to set multi_io[2].ctl_in to PIN_OUT */
>>>>> + if (location == get_defcfg_location(snd_hda_codec_get_pincfg(codec,
>>>>> cfg->line_out_pins[0]))) {
>>>>> + spec->private_dac_nids[3] = alc_auto_look_for_dac(codec,
>>>>> cfg->line_out_pins[0]);
>>>>> + spec->multi_io[2].dac = spec->private_dac_nids[3];
>>>>> + spec->multi_io[2].pin = cfg->line_out_pins[0];
>>>>> + snd_hda_codec_write(codec, cfg->line_out_pins[0], 0,
>>>>> AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
>>>>> + spec->multi_ios++;
>>>>> + spec->multiout.num_dacs++;
>>>>> + }
>>>>> + return 0;
>>>>> + }
>>>>
>>>> It is much better now. I applied the attached patch and 2, 4, 6 and 8
>>>> channel sound is working, enabling outputs incrementally as I change the
>>>> number of channels in alsamixer. Observations:
>>>
>>>
>>>> * there is no mute for side channel
>>>
>>>> * no matter if Auto-Mute is set to Speaker or Line Out+Speaker, speakers
>>>> will mute upon plugging a jack into either headphone or side/spdif socket
>>>> * there is a "front" slider which controls internal speakers and HP
>>>> jack, but the mute control under it does nothing. There are separate
>>>> mute controls for HP and Speakers, which work as advertised.
>>>> This is the alsa-info.sh output:
>>>> http://www.alsa-project.org/db/?f=7df8ccac0a5ae751110f7b7e56f9e0ba5cc3b302
>>>> Looks like we are almost there, thanks for all the input so far!
>>>
>>>
>>> There is a bug in hda-emu which cannot detect two playback switches
>>> "Front" and "Side" create at same switch pin
>>>
>>> Try add the following to dump the value of switch pin
>>>
>>> In function alc_auto_create_multi_out_ctls()
>>>
>>>
>>> + printk(KERN_INFO "%s playback volume %x pin %x\n",name,vol,pin);
>>> err = alc_auto_add_stereo_vol(codec, name, index, vol);
>>> if (err < 0)
>>> return err;
>>> + printk(KERN_INFO "%s playback switch %x\n",name,sw);
>>> err = alc_auto_add_stereo_sw(codec, name, index, sw);
>>> if (err < 0)
>>> return err;
>>
>> This is what is shown in /var/log/messages:
>>
>> Nov 28 11:59:27 snowball2 kernel: [ 19.156689] Front playback volume 2
>> pin 14
>> Nov 28 11:59:27 snowball2 kernel: [ 19.156695] Front playback switch 14
>> Nov 28 11:59:27 snowball2 kernel: [ 19.156789] Surround playback
>> volume 3 pin 1a
>> Nov 28 11:59:27 snowball2 kernel: [ 19.156794] Surround playback switch 1a
>> Nov 28 11:59:27 snowball2 kernel: [ 19.156956] Side playback volume 5
>> pin 17
>> Nov 28 11:59:27 snowball2 kernel: [ 19.156960] Side playback switch 17
>>
>>>
>>>>>>>>>>> Plug the front speaker cables into the Headphone-Out Jack.
>>>>>>>>>>>
>>>>>>>>>>> • Line-In Jack = Rear Speaker Out
>>>>>>>>>>> • Microphone-In Jack = Center/Subwoofer Speaker Out
>>>>>>>>>>> • S/PDIF-Out Jack = Side Speaker Out (for 7.1 Surround Sound Only)
>>>
>>>
>>> Method 1) HP Playback volume for HP jack and Speaker Playback Volume
>>>
>>>
>>> fix the "Side Playback Switch" and "Front playback Switch"
>>>
>>> In function alc_auto_create_multi_out_ctls()
>>>
>>> else
>>> - pin = cfg->line_out_pins[i];
>>> + if (cfg->speaker_pins[0] &&
>>> + get_defcfg_location(snd_hda_codec_get_pincfg(codec, cfg->hp_pins[0])) ==
>>> get_defcfg_location(snd_hda_codec_get_pincfg(codec, cfg->line_out_pins[0])))
>>> + pin = cfg->speaker_pins[0];
>>> + else
>>> + pin = cfg->line_out_pins[i];
>>>
>>> add "Headpone Playback Volume" by using dac 0x25
>>>
>>> In function alc_auto_fill_dac_nids() and the end of previous patch in
>>> previous email
>>>
>>> spec->multi_ios++;
>>> spec->multiout.num_dacs++;
>>> }
>>> + spec->multiout.hp_out_nid[0] = alc_auto_look_for_dac(codec, cfg->hp_pins[0]);
>>> return 0;
>>>
>>>
>>>>>>>>>>> • S/PDIF-Out Jack = Side Speaker Out (for 7.1 Surround Sound Only)
>>>
>>> assign dac spec->alt_dac_nid for creating alt playback device
>>>
>>> aplay -Dhw:0,2 any.wav
>>>
>>> Try either a) or b) but not both
>>> a) use "side jack" for "alt playback" but device 2 be disabled when
>>> channel mode is 8ch
>>>
>>> In function alc_auto_fill_dac_nids()
>>>
>>> + spec->alt_dac_nid = spec->private_dac_nids[3];
>>> return 0;
>>>
>>> in function alc_set_multi_io()
>>>
>>>
>>> } else {
>>> + if ( i < 2 ) {
>>> - if (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP)
>>> snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
>>> HDA_AMP_MUTE, HDA_AMP_MUTE);
>>> - snd_hda_codec_update_cache(codec, nid, 0,
>>> AC_VERB_SET_PIN_WIDGET_CONTROL,
>>> spec->multi_io[idx].ctl_in);
>>>
>>> + if (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP)
>>> snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
>>> HDA_AMP_MUTE, HDA_AMP_MUTE);
>>> + snd_hda_codec_update_cache(codec, nid, 0,
>>> AC_VERB_SET_PIN_WIDGET_CONTROL,
>>> spec->multi_io[idx].ctl_in);
>>> + }
>>>
>>
>> With the above version and everything is almost perfect:
>>
>> http://www.alsa-project.org/db/?f=35d300b2eaec79699ec37febc6321687a894be50
>>
>> * mute for side channel is present and functions correctly
>> * auto-mute situation is unchanged, but I don't think it matters
>> * speaker/HP controls are much neater
>> - front mute and slider control the internal speakers
>> - headphone mute and slider control the headphone jack
>>
>> The only nitpick would be that the alt device does not work:
>
> There was a patch which add "Independent hp" swtich and create device
> 2 for alc892 desktop with 6 jacks at rear panel
>
> http://thread.gmane.org/gmane.linux.alsa.devel/84653/focus=84695
>
> APLAY
>
> **** List of PLAYBACK Hardware Devices ****
> card 0: Intel [HDA Intel], device 0: ALC892 Analog [ALC892 Analog]
> Subdevices: 1/1
> Subdevice #0: subdevice #0
> card 0: Intel [HDA Intel], device 2: ALC892 Analog [ALC892 Analog]
> Subdevices: 1/1
> Subdevice #0: subdevice #0
> card 0: Intel [HDA Intel], device 3: ALC892 Digital [ALC892 Digital]
> Subdevices: 1/1
> Subdevice #0: subdevice #0
>
> you can change "independent_hp" to "alt playback" in that patch
>
> hda_nid_t alt_dac_nid;
> + int alt_playback;
> + int alt_playback_max;
>
>
> static int alc_alt_playback_info(struct snd_kcontrol *kcontrol,
> struct snd_ctl_elem_info *uinfo)
> {
> struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
> struct alc_spec *spec = codec->spec;
> static const char * const texts[] = { "OFF", "Headphone", "Side", NULL};
> int index;
> uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
> uinfo->count = 1;
> uinfo->value.enumerated.items = spec->alt_playback_max;
> index = uinfo->value.enumerated.item;
> if (index >= spec->alt_playback_max)
> index = 1;
> strcpy(uinfo->value.enumerated.name, texts[index]);
> return 0;
> }
>
> static int alc_alt_playback_get(struct snd_kcontrol *kcontrol,
> struct snd_ctl_elem_value *ucontrol)
> {
> struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
> struct alc_spec *spec = codec->spec;
> ucontrol->value.enumerated.item[0] = spec->alt_playback;
> return 0;
> }
>
> static int alc_alt_playback_put(struct snd_kcontrol *kcontrol,
> struct snd_ctl_elem_value *ucontrol)
> {
> struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
> struct alc_spec *spec = codec->spec;
> unsigned int select = ucontrol->value.enumerated.item[0];
> if (spec->alt_playback != select) {
> spec->alt_playback = select;
> switch(spec->alt_playback) {
> spec->multiout.hp_out_nid[0] = 0;
> break;
> case 1:
> spec->multiout.hp_out_nid[0] = spec->alt_dac_nid;
> break;
> case 2:
> break;
> }
> return 1;
> }
> return 0;
> }
>
> static const struct snd_kcontrol_new alc_alt_playback_switch[] = {
> {
> .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
> .name = "Alternate Playback Switch",
> .info = alc_alt_playback_info,
> .get = alc_alt_playback_get,
> .put = alc_alt_playback_put,
> },
> { } /* end */
> };
>
I tried 0001-Add-Multistreaming-Playback-using-Front-Panel-Headph.patch,
but unfortunately it does not apply on top of current kernels anymore,
and it is not trivial enough for me to fix.
Anyway, in my opinion it does not make a lot of sense, as the jacks are
2 cm away from each other and I don't see a use case where someone would
want to play a different sound on each of them.
>>
>> $ aplay -l
>> **** List of PLAYBACK Hardware Devices ****
>> card 0: PCH [HDA Intel PCH], device 0: ALC892 Analog [ALC892 Analog]
>> Subdevices: 1/1
>> Subdevice #0: subdevice #0
>> card 0: PCH [HDA Intel PCH], device 1: ALC892 Digital [ALC892 Digital]
>> Subdevices: 1/1
>> Subdevice #0: subdevice #0
>> card 1: NVidia [HDA NVidia], device 3: HDMI 0 [HDMI 0]
>> Subdevices: 1/1
>> Subdevice #0: subdevice #0
>> card 1: NVidia [HDA NVidia], device 7: HDMI 0 [HDMI 0]
>> Subdevices: 1/1
>> Subdevice #0: subdevice #0
>> card 1: NVidia [HDA NVidia], device 8: HDMI 0 [HDMI 0]
>> Subdevices: 1/1
>> Subdevice #0: subdevice #0
>> card 1: NVidia [HDA NVidia], device 9: HDMI 0 [HDMI 0]
>> Subdevices: 1/1
>> Subdevice #0: subdevice #0
>>
>> And that the sound is coming out of the side jack no matter the number
>> of channels.
>>
>>>
>>> b) use "Headphone" for "alt playback"
>>>
>>> In function alc_auto_fill_dac_nids()
>>>
>>> + spec->alt_dac_nid = spec->multiout.hp_out_nid[0];
>>> return 0;
>>
>> I also tried this version (attached with versionb suffix), it works even
>> better. As with version a), controls are working correctly. Auto-mute
>> still mutes upon plugging into either side or headphone jack no matter
>> the alsamixer setting. Alt device is still not there. The improvement is
>> that sound only comes out of the side jack when alsamixer is set to 8
>> channels.
>>
>> http://www.alsa-project.org/db/?f=31f808d43fc26c29718d239600741b5b069ce427
>>
>> So it seems like the version b does everything it is supposed to, maybe
>> aside from the side jack muting behaviour.
>> Summing up, when it comes to P150HM, the only missing piece is the
>> internal subwoofer. I tried emailing Andrew, who started this thread,
>> but got no answer so far. The problem might be that we might need to
>> figure out what is that THX TruStudio PRO is doing under Windows that
>> makes the internal subwoofer work.
>
>
> Take a look at the removed model="targa_8ch_dig" which touch those gpio
>
> Have you ask the notebook vendor clevo support/engineer the subwoofer
> is connected to which pin of alc892 ?
I have just sent an email to Clevo UK Support. Let's see what they answer.
>
>> Once again, thank you for all the input so far.
>>
>> Best regards,
>> Julian
>>
next prev parent reply other threads:[~2011-11-29 10:25 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-08-20 7:33 Clevo P170HM / Sager NP8170 audio Andrew Mahone
2011-11-08 5:42 ` Julian Sikorski
2011-11-16 13:08 ` Raymond Yau
2011-11-16 15:15 ` Julian Sikorski
2011-11-17 2:08 ` Raymond Yau
2011-11-17 8:46 ` Julian Sikorski
2011-11-17 8:55 ` Julian Sikorski
2011-11-19 2:31 ` Raymond Yau
2011-11-19 9:11 ` Julian Sikorski
2011-11-21 6:47 ` Raymond Yau
2011-11-21 11:39 ` Julian Sikorski
2011-11-22 5:17 ` Raymond Yau
2011-11-22 12:45 ` Julian Sikorski
2011-11-25 6:39 ` Raymond Yau
2011-11-25 12:10 ` Julian Sikorski
2011-11-28 0:42 ` Raymond Yau
2011-11-28 10:27 ` Julian Sikorski
2011-11-28 11:46 ` Raymond Yau
2011-11-28 12:02 ` Julian Sikorski
2011-11-28 12:34 ` Julian Sikorski
2011-11-28 23:45 ` Raymond Yau
2011-11-29 10:25 ` Julian Sikorski [this message]
2011-12-01 16:35 ` Julian Sikorski
2011-12-02 0:52 ` Raymond Yau
2011-12-02 15:41 ` Julian Sikorski
2011-12-03 23:59 ` Raymond Yau
2011-12-04 12:41 ` Julian Sikorski
2011-11-24 9:20 ` Julian Sikorski
2011-11-24 10:03 ` Julian Sikorski
2011-11-24 10:30 ` Julian Sikorski
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='jb2bui$bre$1@dough.gmane.org' \
--to=belegdol@gmail.com \
--cc=alsa-devel@alsa-project.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.