[alsa-devel] Problem with VIA VT1708S and git versions of alsa-driver.

Mark Goldstein goldstein.mark at gmail.com
Sat Jan 29 10:37:02 CET 2011


On Fri, Jan 28, 2011 at 2:47 AM, Raymond Yau
<superquad.vortex2 at gmail.com> wrote:
> 2011/1/27 Mark Goldstein <goldstein.mark at gmail.com>
>
>> On Thu, Jan 27, 2011 at 11:09 AM, Raymond Yau
>> <superquad.vortex2 at gmail.com> wrote:
>> > 2011/1/27 Mark Goldstein <goldstein.mark at gmail.com>
>> >
>> >> Hi,
>> >>
>> >> I've renewed my experiments after long break (sorry, had to do other
>> >> stuff and since released version 1.0.23 worked for me, I reverted to
>> >> that version).
>> >>
>> >> I still have not tried hda-emulator, but I made some progress.
>> >>
>> >> 1) I compiled the git version (snapshot from Jan 20) for OpenSUSE 11.1
>> >> with test kernel 2.6.32.28.
>> >> I saw the same behavior as before:
>> >> - Line control does nothing;
>> >> - Front Mic control actually changes volume of Line In;
>> >> - Neither Front nor Rear Mic work at all; (Answering to Raymond's
>> >> question regarding Mic Boost - I have "Rear Mic" control, but Mic
>> >> Boost).
>> >>
>> >> 2) I decided to compare patch.via.c from version 1.0.23 that works for
>> >> me and git version.
>> >> It appears to me that the clue could be found in the function
>> >> vt1708S_auto_create_analog_input_ctls. The one in 1.0.23 uses explicit
>> >> control indexes, while the function from git version calls
>> >> vt_auto_create_analog_input_ctls, passing it the array of indexes:
>> >> static hda_nid_t pin_idxs[] = { 0x1f, 0x1a, 0x1b, 0x1e, 0, 0xff };
>> >>
>> >> Comparing the indexes used in  vt1708S_auto_create_analog_input_ctls
>> >> with those used for other codec and with version from 1.0.23, I
>> >> started suspecting that the order of indexes is wrong. I changed the
>> >> array like this:
>> >> static hda_nid_t pin_idxs[] = { 0, 0x1f, 0x1a, 0x1b, 0x1e, 0xff };
>> >> After re-compiling the version I've got much better behavior:
>> >> - Line control (index 1b) works correctly now;
>> >> - Front Mic control (index 0x1e) actually controls Rear Mic and this
>> >> Rear Mic works;
>> >> - Front mic still does not work;
>> >> - Rear Mic control (index 0x1a) seems not working and there is still
>> >> Mic Boost, not Rear Mic Boost.
>> >>
>> >>
>> > Do you mean that regiession is caused by this patch ?
>> >
>> >
>> http://git.alsa-project.org/?p=alsa-kernel.git;a=commitdiff;h=f3268512c3a5dea587cfe875b8bca98d9e164cd9;hp=73413b120d5d6eb6c98451bbc19acf43e0e300ae
>>
>> Yes, looks very probable. Additional confirmation to this is that I
>> noticed the problem at the beginning of September after installing git
>> version; this patch is dated by Aug 30th.
>>
>> > it seem vt_auto_create_analog_input_ctls() try to assign stereo mixer as
>> the
>> > first item of the imux(s) node 0x17 and 0x1e
>> >
>> > assign those playback volume of those input pins in to stereo mixer for
>> node
>> > 0x16
>> >
>> > but it should assign auto_pin_cfg_labels[] according to the imux node
>> 0x17
>> > and 0x1e
>>
>> Is the order of controls in hda_nid_t_pin_idxs fixed, or depends on
>> specific codec?
>>
>> In any case, I will probably try to temporary replace the
>> vt1708S_auto_create_analog_input_ctls by the one from 1.0.23 and see
>> if this will fix the issue.
>>
>
> Either [Audio Input] nodes connect directly to input pin [Pin complex]
> or connected to [Audio Selector] which has a connection list
>
...
> Node 0x17 [Audio Selector] wcaps 0x300501: Stereo
>  Control: name="Input Source", index=0, device=0
>  Power states:  D0 D1 D2 D3
>  Power: setting=D0, actual=D0
>  Connection: 6
>     0x1f 0x1a* 0x1b 0x1e 0x1d 0x16
>

Hi,

I think I found one problem with Audio Selector.
The problem with the above mentioned patch is that
vt_auto_create_analog_input_ctls uses the same idx when creating new
analog input and when adding item to imux:

	err = via_new_analog_input(spec, label, type_idx, idx, cap_nid);
        ...
	snd_hda_add_imux_item(imux, label, idx, NULL);

In older version that worked for me (1.0.23) for some codecs
(including my 1708S) when adding item to imux, (idx - 1) is used.

So when specific Input source is selected throught the mixer
application, actually the next one is marked "active" in Node 0x17.

I copied the body of vt_auto_create_analog_input_ctls into
vt1708S_auto_create_analog_input_ctls and changed the call to
snd_hda_add_imux_item like that:

static int vt1708S_auto_create_analog_input_ctls(struct hda_codec *codec,
						const struct auto_pin_cfg *cfg)
{
	static hda_nid_t pin_idxs[] = { 0, 0x1f, 0x1a, 0x1b, 0x1e, 0xff };
	/*return vt_auto_create_analog_input_ctls(codec, cfg, 0x16, pin_idxs,
						ARRAY_SIZE(pin_idxs));
     */

	struct via_spec *spec = codec->spec;
	struct hda_input_mux *imux = &spec->private_imux[0];
        int i, pin, err, idx, type, type_idx = 0;
       	
        /* for internal loopback recording select */
        snd_hda_add_imux_item(imux, "Stereo Mixer", 5, NULL);

	for (i = 0; i < cfg->num_inputs; i++) {
		const char *label;
		type = cfg->inputs[i].type;
                pin = cfg->inputs[i].pin;
		for (idx = 0; idx < ARRAY_SIZE(pin_idxs); idx++) {
			if (pin_idxs[idx] == pin)
				break;
               }
	       if (idx >= ARRAY_SIZE(pin_idxs))
			continue;
	       if (i > 0 && type == cfg->inputs[i - 1].type)
		        type_idx++;
	       else
		        type_idx = 0;
	       label = hda_get_autocfg_input_label(codec, cfg, i);
	       err = via_new_analog_input(spec, label, type_idx, idx, 0x16);
	       if (err < 0)
		      return err;
	       snd_hda_add_imux_item(imux, label, idx - 1, NULL);
                                                                     ^^^^^^^^^
	}
}

and now the 0x17 shows the correct active source.

BTW, the type_idx is passed to via_new_analog_input and then to
__via_add_control, where it is not used at all.

Still trying to figure out why only Rear Mic works while Front Mic does not.

-- 
Mark Goldstein


More information about the Alsa-devel mailing list