2011/6/8 alex dot baldacchino dot alsasub at gmail dot com alex.baldacchino.alsasub@gmail.com:
Adding a few printk()'s to file "patch_via.c" showed me function via_hp_build() is called before via_build_pcms() (unless front panel is disabled in BIOS, in which case via_hp_build() isn't invoked at all), therefore, when a control "Independent HP" is created, it should be 'visible' by via_build_pcms(); however, snd_hda_find_mixer_ctl(codec, "Independent HP") fails to find it until the following loop is executed inside via_build_controls:
and via_build_controls() is called after via_build_pcms(), but then it's too late (or seemed to be such) to modify the number of playback substreams. At last, I've tried the following, which worked:
The fix is to check spec->multiout.hp_nid since "Independent HP" need the extra DAC for HP when there is no HP if front panel is disabled by BIOS
static int via_build_pcms(struct hda_codec *codec) { ...
info->name = spec->stream_name_analog; info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *(spec->stream_analog_playback); info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dac_nids[0]; + info->stream[SNDRV_PCM_STREAM_PLAYBACK].substreams = + spec->multiout.hp_nid ? 2 : 1; info->stream[SNDRV_PCM_STREAM_CAPTURE] = *(spec->stream_analog_capture); info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];
info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = spec->multiout.max_channels;
However there is a bug in using subdevice 1 for "Independent HP" and subdevice 0 for multi-channels
The channel count reported by snd_pcm_hw_params_get_channels_max() or snd_pcm_hw_params_test_channel() for subdevice 1 is also equal to spec->multiout.max_channels but this subdevice 1 only support stereo