Re: [alsa-devel] Smart 5.1 function not working on VIA VT1708S with *three* jacks on mainboard
I have tried the patch on clean (unpatched) patch_via.c. dmesg prints out ***PATCH 08/07/10 as expected, but the surround does not work. Surround and cen/lfe controls are also not created for alsamixer without other patches. What does work is specifying -Dsurround40 for speaker-test but there is no sound from rear speakers. If you want, I can post the whole patched patch_via.c somewhere or we can work on new patches starting with this one.
On Thu, 08 Jul 2010 08:33:34 +0200, Clemens Ladisch clemens@ladisch.de wrote:
Viliam Kubis wrote:
Hello, for quite some time the "Smart 5.1" function in alsa is not working properly when motherboard has only 3 audio jacks.
speaker-test -c 4 -t wav -Dsurround40
Channels count (4) not available for playbacks: Invalid argument
Please try the patch below.
(This function uses 0x12 and 0x13 as the NIDs for the center/LFE and side DACs. Shouldn't these be 0x24 and 0x25, as per the datasheet?)
--- a/sound/pci/hda/patch_via.c +++ b/sound/pci/hda/patch_via.c @@ -2265,6 +2265,13 @@ static int vt1708_auto_fill_dac_nids(str } }
- /* for Smart 5.1, line/mic inputs double as output pins */
- if (cfg->line_outs == 1) {
spec->multiout.num_dacs = 3;
spec->multiout.dac_nids[AUTO_SEQ_SURROUND] = 0x11;
spec->multiout.dac_nids[AUTO_SEQ_CENLFE] = 0x12;
- }
- return 0;
}
Viliam Kubis wrote:
I have tried the patch ..., but the surround does not work.
Okay, next try:
--- a/sound/pci/hda/patch_via.c +++ b/sound/pci/hda/patch_via.c @@ -552,24 +552,30 @@ static void via_auto_init_hp_out(struct } }
+static int is_smart51_pins(struct via_spec *spec, hda_nid_t pin); + static void via_auto_init_analog_input(struct hda_codec *codec) { struct via_spec *spec = codec->spec; + unsigned int ctl; int i;
for (i = 0; i < AUTO_PIN_LAST; i++) { hda_nid_t nid = spec->autocfg.input_pins[i]; + if (!nid) + continue;
+ if (spec->smart51_enabled && is_smart51_pins(spec, nid)) + ctl = PIN_OUT; + else if (i <= AUTO_PIN_FRONT_MIC) + ctl = PIN_VREF50; + else + ctl = PIN_IN; snd_hda_codec_write(codec, nid, 0, - AC_VERB_SET_PIN_WIDGET_CONTROL, - (i <= AUTO_PIN_FRONT_MIC ? - PIN_VREF50 : PIN_IN)); - + AC_VERB_SET_PIN_WIDGET_CONTROL, ctl); } }
-static int is_smart51_pins(struct via_spec *spec, hda_nid_t pin); - static void set_pin_power_state(struct hda_codec *codec, hda_nid_t nid, unsigned int *affected_parm) { @@ -658,6 +664,8 @@ static void set_jack_power_state(struct /* PW0 (19h), SW1 (18h), AOW1 (11h) */ parm = AC_PWRST_D3; set_pin_power_state(codec, 0x19, &parm); + if (spec->smart51_enabled) + parm = AC_PWRST_D0; snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_POWER_STATE, parm); snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_POWER_STATE, @@ -667,6 +675,8 @@ static void set_jack_power_state(struct if (is_8ch) { parm = AC_PWRST_D3; set_pin_power_state(codec, 0x22, &parm); + if (spec->smart51_enabled) + parm = AC_PWRST_D0; snd_hda_codec_write(codec, 0x26, 0, AC_VERB_SET_POWER_STATE, parm); snd_hda_codec_write(codec, 0x24, 0, @@ -3915,6 +3925,13 @@ static int vt1708S_auto_fill_dac_nids(st } }
+ /* for Smart 5.1, line/mic inputs double as output pins */ + if (cfg->line_outs == 1) { + spec->multiout.num_dacs = 3; + spec->multiout.dac_nids[AUTO_SEQ_SURROUND] = 0x11; + spec->multiout.dac_nids[AUTO_SEQ_CENLFE] = 0x24; + } + return 0; }
@@ -3932,7 +3949,8 @@ static int vt1708S_auto_create_multi_out for (i = 0; i <= AUTO_SEQ_SIDE; i++) { nid = cfg->line_out_pins[i];
- if (!nid) + /* for Smart 5.1, there are always at least six channels */ + if (!nid && i > AUTO_SEQ_CENLFE) continue;
nid_vol = nid_vols[i];
Oh my god!! It actually works!!! :) At first speaker-test was not working, but with
[kbs1@localhost a]$ speaker-test -c4 -twav -Dsurround40 <--------- THIS
speaker-test 1.0.23
Playback device is surround40 Stream parameters are 48000Hz, S16_LE, 4 channels WAV file(s) Rate set to 48000Hz (requested 48000Hz) Buffer size range from 32 to 8192 Period size range from 16 to 4096 Using max buffer size 8192 Periods = 4 was set period_size = 2048 was set buffer_size = 8192 0 - Front Left 1 - Front Right 3 - Rear Right <-------------- THIS PLAYS 2 - Rear Left <-------------- AND THIS PLAYS!! Time per period = 5.718945 0 - Front Left ^C [kbs1@localhost a]$
Finally! My audio experience is now at a whole new level. Thank you very much, I will post this patch to alsa-bugtracker and close the bug, I was starting to think that this is a kernel problem, but now it just works GREAT.
Maybe you can add this patch to official alsa-driver version on next release.
Have a nice day! Best Regards Viliam Kubis
On Mon, 12 Jul 2010 08:57:59 +0200, Clemens Ladisch clemens@ladisch.de wrote:
Viliam Kubis wrote:
I have tried the patch ..., but the surround does not work.
Okay, next try:
--- a/sound/pci/hda/patch_via.c +++ b/sound/pci/hda/patch_via.c @@ -552,24 +552,30 @@ static void via_auto_init_hp_out(struct } } +static int is_smart51_pins(struct via_spec *spec, hda_nid_t pin);
static void via_auto_init_analog_input(struct hda_codec *codec) { struct via_spec *spec = codec->spec;
- unsigned int ctl; int i; for (i = 0; i < AUTO_PIN_LAST; i++) { hda_nid_t nid = spec->autocfg.input_pins[i];
if (!nid)
continue;
if (spec->smart51_enabled && is_smart51_pins(spec, nid))
ctl = PIN_OUT;
else if (i <= AUTO_PIN_FRONT_MIC)
ctl = PIN_VREF50;
else
snd_hda_codec_write(codec, nid, 0,ctl = PIN_IN;
AC_VERB_SET_PIN_WIDGET_CONTROL,
(i <= AUTO_PIN_FRONT_MIC ?
PIN_VREF50 : PIN_IN));
}AC_VERB_SET_PIN_WIDGET_CONTROL, ctl);
} -static int is_smart51_pins(struct via_spec *spec, hda_nid_t pin);
static void set_pin_power_state(struct hda_codec *codec, hda_nid_t nid, unsigned int *affected_parm) { @@ -658,6 +664,8 @@ static void set_jack_power_state(struct /* PW0 (19h), SW1 (18h), AOW1 (11h) */ parm = AC_PWRST_D3; set_pin_power_state(codec, 0x19, &parm);
if (spec->smart51_enabled)
snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_POWER_STATE, parm); snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_POWER_STATE,parm = AC_PWRST_D0;
@@ -667,6 +675,8 @@ static void set_jack_power_state(struct if (is_8ch) { parm = AC_PWRST_D3; set_pin_power_state(codec, 0x22, &parm);
if (spec->smart51_enabled)
parm = AC_PWRST_D0; snd_hda_codec_write(codec, 0x26, 0, AC_VERB_SET_POWER_STATE, parm); snd_hda_codec_write(codec, 0x24, 0,
@@ -3915,6 +3925,13 @@ static int vt1708S_auto_fill_dac_nids(st } }
- /* for Smart 5.1, line/mic inputs double as output pins */
- if (cfg->line_outs == 1) {
spec->multiout.num_dacs = 3;
spec->multiout.dac_nids[AUTO_SEQ_SURROUND] = 0x11;
spec->multiout.dac_nids[AUTO_SEQ_CENLFE] = 0x24;
- }
- return 0;
} @@ -3932,7 +3949,8 @@ static int vt1708S_auto_create_multi_out for (i = 0; i <= AUTO_SEQ_SIDE; i++) { nid = cfg->line_out_pins[i];
if (!nid)
/* for Smart 5.1, there are always at least six channels */
nid_vol = nid_vols[i];if (!nid && i > AUTO_SEQ_CENLFE) continue;
Viliam Kubis <viliam.kubis <at> gmail.com> writes:
Oh my god!! It actually works!!! :) At first speaker-test was not working, but with
[..]
Finally! My audio experience is now at a whole new level. Thank you very much, I will post this patch to alsa-bugtracker and close the bug, I was starting to think that this is a kernel problem, but now it just works GREAT.
Maybe you can add this patch to official alsa-driver version on next release.
This patch makes 5.1 analog surround work for me. I'm using an ASUS P5Q-VM DO which has a VIA VT1708S. The mainboard has three analog jacks in the rear and an on-board jumper for two front jacks.
cheers simon
participants (3)
-
Clemens Ladisch
-
Simon Schubert
-
Viliam Kubis