At Wed, 06 Apr 2011 15:07:33 +0200, Takashi Iwai wrote:
At Wed, 6 Apr 2011 20:59:58 +0800, Raymond Yau wrote:
2011/4/6 Takashi Iwai tiwai@suse.de
At Wed, 6 Apr 2011 16:29:56 +0800, Raymond Yau wrote:
2011/4/6 Takashi Iwai tiwai@suse.de
At Wed, 6 Apr 2011 15:35:16 +0800, Raymond Yau wrote:
2011/4/6 Takashi Iwai tiwai@suse.de
> At Tue, 5 Apr 2011 22:59:29 +0800, > Raymond Yau wrote: > > > > Fix alc662_dac_nid and change "6stack-dig" to "5stack-dig" > > > > alc662 series only have 3 stereo DAC , so it can only support
5stack-dig
> > instead of 6stack-dig > > Applied now. Thanks. > > > Takashi >
The other problem is this patch
{ .id = 0x10ec0892, .name = "ALC892", .patch = patch_alc662 },
http://git.alsa-project.org/?p=alsa-kernel.git;a=commit;h=274693f37090ada2ca...
ALC892 provides ten DAC channels that simultaneously support 7.1
channel
sound playback, plus 2 channels of independent stereo sound output
(multiple
streaming) through the front panel stereo outputs.
It seem that there is no specific code to distinguish a 10 channels
alc892
from those 6 channels alc6xx
Yeah, but there is no quirks specific to alc892.
Remember that the final goal is to remove all model-quirks from the driver.
Takashi
My patch reduce the size of alc662_dac_nid may be wrong if the driver
intend
to use alc662_auto_fill_dac_nids() to handle 6, 8 , 10 channels
Don't worry, alc662_dac_nids is used only for the fixed quirks. The auto-parser doesn't use these fixed defined pin arrays.
Takashi
The bug for 10 channels alc892 is in alc662_mix_to_dac, it should return [Audio Output ]0x5 for [Audiomixer 0x0f] -- side channel if model=auto is used for 6stack
OK, but it's irrelevant with your patch :) I'll fix it later.
The fix patch is below.
Takashi
--- From: Takashi Iwai tiwai@suse.de Subject: [PATCH] ALSA: hda - Fix mix->DAC deduction for ALC892
The current alc662 parser doesn't set the DAC for the mixer 0x0f properly for ALC892, which has 4 DACs while ALC662 has 3. Fixed by implementing alc662_mix_to_dac() more genericly with the dynamic widget list.
Signed-off-by: Takashi Iwai tiwai@suse.de --- sound/pci/hda/patch_realtek.c | 27 ++++++++++++++------------- 1 files changed, 14 insertions(+), 13 deletions(-)
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index e62fe7f..d566eac 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c @@ -19105,16 +19105,17 @@ static struct alc_config_preset alc662_presets[] = { */
/* convert from MIX nid to DAC */ -static inline hda_nid_t alc662_mix_to_dac(hda_nid_t nid) -{ - if (nid == 0x0f) - return 0x02; - else if (nid >= 0x0c && nid <= 0x0e) - return nid - 0x0c + 0x02; - else if (nid == 0x26) /* ALC887-VD has this DAC too */ - return 0x25; - else - return 0; +static hda_nid_t alc662_mix_to_dac(struct hda_codec *codec, hda_nid_t nid) +{ + hda_nid_t list[4]; + int i, num; + + num = snd_hda_get_connections(codec, nid, list, ARRAY_SIZE(list)); + for (i = 0; i < num; i++) { + if (get_wcaps_type(get_wcaps(codec, list[i])) == AC_WID_AUD_OUT) + return list[i]; + } + return 0; }
/* get MIX nid connected to the given pin targeted to DAC */ @@ -19126,7 +19127,7 @@ static hda_nid_t alc662_dac_to_mix(struct hda_codec *codec, hda_nid_t pin,
num = snd_hda_get_connections(codec, pin, mix, ARRAY_SIZE(mix)); for (i = 0; i < num; i++) { - if (alc662_mix_to_dac(mix[i]) == dac) + if (alc662_mix_to_dac(codec, mix[i]) == dac) return mix[i]; } return 0; @@ -19143,7 +19144,7 @@ static hda_nid_t alc662_look_for_dac(struct hda_codec *codec, hda_nid_t pin) if (num < 0) return 0; for (i = 0; i < num; i++) { - hda_nid_t nid = alc662_mix_to_dac(srcs[i]); + hda_nid_t nid = alc662_mix_to_dac(codec, srcs[i]); if (!nid) continue; for (j = 0; j < spec->multiout.num_dacs; j++) @@ -19297,7 +19298,7 @@ static void alc662_auto_set_output_and_unmute(struct hda_codec *codec, if (num <= 1) return; for (i = 0; i < num; i++) { - if (alc662_mix_to_dac(srcs[i]) != dac) + if (alc662_mix_to_dac(codec, srcs[i]) != dac) continue; snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, i); return;