On Fri, Jan 28, 2011 at 2:47 AM, Raymond Yau superquad.vortex2@gmail.com wrote:
2011/1/27 Mark Goldstein goldstein.mark@gmail.com
On Thu, Jan 27, 2011 at 11:09 AM, Raymond Yau superquad.vortex2@gmail.com wrote:
2011/1/27 Mark Goldstein goldstein.mark@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.
- 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).
- 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=f3268512c3a5de...
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.