W dniu 02.12.2011 01:52, Raymond Yau pisze:
2011/12/2 Julian Sikorski belegdol@gmail.com:
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
Node 0x14 [Pin Complex] wcaps 0x40058d: Stereo Amp-Out Control: name="Front Playback Switch", index=0, device=0 ControlAmp: chs=3, dir=Out, idx=0, ofs=0 Amp-Out caps: ofs=0x00, nsteps=0x00, stepsize=0x00, mute=1 Amp-Out vals: [0x00 0x00] Pincap 0x0001003e: IN OUT HP EAPD Detect Trigger 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 Power states: D0 D1 D2 D3 Power: setting=D0, actual=D0
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
Node 0x17 [Pin Complex] wcaps 0x40058d: Stereo Amp-Out Control: name="Side Playback Switch", index=0, device=0 ControlAmp: chs=3, dir=Out, idx=0, ofs=0 Control: name="Line-Out Jack", index=0, device=0 Amp-Out caps: ofs=0x00, nsteps=0x00, stepsize=0x00, mute=1 Amp-Out vals: [0x00 0x00] Pincap 0x00000036: IN OUT Detect Trigger Pin Default 0x01011013: [Jack] Line Out at Ext Rear Conn = 1/8, Color = Black DefAssociation = 0x1, Sequence = 0x3 Pin-ctls: 0x40: OUT Unsolicited: tag=02, enabled=1 Power states: D0 D1 D2 D3 Power: setting=D0, actual=D0 Connection: 1 0x0f
>>>>>>>> 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:
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.
Pincap 0x00000036: IN OUT Detect Trigger Pin Default 0x01011013: [Jack] Line Out at Ext Rear
As the pincaps of "side" jack does not support HP, so it cannot used as dual headphone
it is strange that alt_device cannot be create if you have assign a valid dac to spec->alt_dac_nid
$ 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
How many hdmi connectors on your nvidia ?
From the viewpoint of the user, I expect only one PCM device for each hdmi connector
There is one hdmi and one dvi. I did not try sending sound via hdmi, though.
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.
if you compled alsa-driver in debug mode, you should see the following message in system log.
How would I do that? Which config option do I need to change?
realtek: Enable HP auto-muting on NID 0x1b realtek: Enable Line-Out auto-muting on NID 0x17
The drawback is "Front Playback Volume" and "Front Playback Switch" does not control the "Headphone Jack" which used as "Front" jack
Not really a drawback, since in an unpatched 3.1.2 kernel there are separate "Speaker" and "Headphone" controls which are independent of each other:
http://www.alsa-project.org/db/?f=c8a6fc8ced6993631bad6f754249454323422d1a
Node 0x1b [Pin Complex] wcaps 0x40058f: Stereo Amp-In Amp-Out Control: name="Headphone Playback Switch", index=0, device=0 ControlAmp: chs=3, dir=Out, idx=0, ofs=0 Control: name="Headphone Jack", index=0, device=0 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 0x0001373e: IN OUT HP EAPD Detect Trigger Vref caps: HIZ 50 GRD 80 100 EAPD 0x0: Pin Default 0x0121101f: [Jack] HP Out at Ext Rear Conn = 1/8, Color = Black DefAssociation = 0x1, Sequence = 0xf Pin-ctls: 0xc0: OUT HP VREF_HIZ Unsolicited: tag=01, enabled=1 Power states: D0 D1 D2 D3 Power: setting=D0, actual=D0 Connection: 5 0x0c 0x0d 0x0e 0x0f 0x26*
The other method is using "hp_pin" instead of "speaker_pin" to assign "Front" dac 0x02
but this method won't create "headphone playback volume" and "Headphone playback switch" since "hp_pin" is used to create "Front Playback Volume" and "Front Playback Switch"
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.
I was forwarded to realtek. Is there any way to figure it out ourselves?
The remaining unused output pin is 0x15 and 0x16
Yes, this is what we figured earlier already. If P170hm is any similar, 0x16 is the sub: http://mailman.alsa-project.org/pipermail/alsa-devel/2011-August/042981.html The problem is that, as opposed to 0x17, simply switching the pin from in to out and unmuting it does not make sound come out of the subwoofer. Can it be because the center/lfe channel is already assigned to the mic pin? Or do you think that THX is doing some sort of pre-amplification which we need to emulate?
Julian