BAD_SHARED_VOL = 0x10,
};
-/* look for widgets in the path between the given NIDs appropriate for
+/* look for widgets in the given path which are appropriate for
* volume and mute controls, and assign the values to ctls[].
*
* When no appropriate widget is found in the path, the badness value
* is incremented depending on the situation. The function returns the
* total badness for both volume and mute controls.
*/
-static int assign_out_path_ctls(struct hda_codec *codec, hda_nid_t pin,
- hda_nid_t dac)
+static int assign_out_path_ctls(struct hda_codec *codec, struct nid_path *path)
{
- struct nid_path *path = snd_hda_get_nid_path(codec, dac, pin);
hda_nid_t nid;
unsigned int val;
int badness = 0;
if (!path)
return BAD_SHARED_VOL * 2;
+
+ if (path->ctls[NID_PATH_VOL_CTL] ||
+ path->ctls[NID_PATH_MUTE_CTL])
+ return 0; /* already evaluated */
+
nid = look_for_out_vol_nid(codec, path);
if (nid) {
val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
struct nid_path *path;
hda_nid_t pin = pins[i];
- if (dacs[i]) {
- badness += assign_out_path_ctls(codec, pin, dacs[i]);
+ path = snd_hda_get_path_from_idx(codec, path_idx[i]);
+ if (path) {
+ badness += assign_out_path_ctls(codec, path);
continue;
}
print_nid_path("output", path);
path->active = true;
path_idx[i] = snd_hda_get_path_idx(codec, path);
+ badness += assign_out_path_ctls(codec, path);
}
- if (dac)
- badness += assign_out_path_ctls(codec, pin, dac);
}
return badness;
unsigned int defcfg = snd_hda_codec_get_pincfg(codec, reference_pin);
unsigned int location = get_defcfg_location(defcfg);
int badness = 0;
+ struct nid_path *path;
old_pins = spec->multi_ios;
if (old_pins >= 2)
for (type = AUTO_PIN_LINE_IN; type >= AUTO_PIN_MIC; type--) {
for (i = 0; i < cfg->num_inputs; i++) {
- struct nid_path *path;
hda_nid_t nid = cfg->inputs[i].pin;
hda_nid_t dac = 0;
}
/* assign volume and mute controls */
- for (i = old_pins; i < spec->multi_ios; i++)
- badness += assign_out_path_ctls(codec, spec->multi_io[i].pin,
- spec->multi_io[i].dac);
+ for (i = old_pins; i < spec->multi_ios; i++) {
+ path = snd_hda_get_path_from_idx(codec, spec->out_paths[cfg->line_outs + i]);
+ badness += assign_out_path_ctls(codec, path);
+ }
return badness;
}