At Fri, 30 Jul 2010 09:37:33 +0200, David Henningsson wrote:
Here's what I try to fix by playing around with it in hda-emu, it seems like more than one thing is broken here, but let's start with playback. This machine has one internal speaker and one line-out. Codec proc file is attached.
Please give alsa-info.sh output instead. It'll contain more comprehensive information to analyze.
Here's my analysis so far:
- If there's one internal speaker and one line-out (rather than
headphone-out), should the internal speaker auto-mute? What's standard practice?
It's just because the pin is a line-out, no headphone (in addition to the bug below). If the pin is declared as a headphone, the driver turns on the auto-mute function.
- There are two DAC nids, 0x02 and 0x03, but only 0x02 is used (i e
activated on playback). But line-out is connected (via nid 0x0d) to DAC 0x03, so there is no sound on line-out.
Right, it's a missing check of the pin. The pin 0x1b doesn't exist on ALC268, so the parser (shared by both ALC268/269) ignored it. The one-liner below fixes the problem.
Should we try to activate DAC nid 0x03 or try to move line-out to DAC 0x02? And is either possible through just fiddling with pin_configs (which Takashi preferred), or should we add fixup verbs, or a completely new model? What would upstream prefer in this case?
- Another strange thing is the controls, there is both Master Playback
and Speaker Playback Volumes and Switches, but they both control Volume=0x02 and Switch=0x14, and setting one then getting the other returns the wrong result since they're not updating each other's cached values (I assume). So we should try to get rid of one of these, but how depends on the answer to question 1...
Ditto.
thanks,
Takashi
--- diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 14ef383..60bb361 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -13124,6 +13124,7 @@ static int alc268_new_analog_output(struct alc_spec *spec, hda_nid_t nid, dac = 0x02; break; case 0x15: + case 0x1b: case 0x21: /* ALC269vb has this pin, too */ dac = 0x03; break;