static int add_output(struct hda_codec *codec, hda_nid_t dac, int idx, int num_ctls, int type) { struct cs_spec *spec = codec->spec; const char *name; int err, index; struct snd_kcontrol *kctl; static const char * const speakers[] = { "Front Speaker", "Surround Speaker", "Bass Speaker" }; static const char * const line_outs[] = { "Front Line-Out", "Surround Line-Out", "Bass Line-Out" }; fix_volume_caps(codec, dac); if (!spec->vmaster_sw) { err = add_vmaster(codec, dac); if (err < 0) return err; } index = 0; switch (type) { case AUTO_PIN_HP_OUT: name = "Headphone"; index = idx; break; case AUTO_PIN_SPEAKER_OUT: if (num_ctls > 1) name = speakers[idx]; else name = "Speaker"; break; default: if (num_ctls > 1) name = line_outs[idx]; else name = "Line-Out"; break; } err = add_mute(codec, name, index, HDA_COMPOSE_AMP_VAL(dac, 3, 0, HDA_OUTPUT), 0, &kctl); if (err < 0) return err; err = snd_ctl_add_slave(spec->vmaster_sw, kctl); if (err < 0) return err; err = add_volume(codec, name, index, HDA_COMPOSE_AMP_VAL(dac, 3, 0, HDA_OUTPUT), 0, &kctl); if (err < 0) return err; err = snd_ctl_add_slave(spec->vmaster_vol, kctl); if (err < 0) return err; return 0; }
static int usb6fire_control_add_virtual( struct control_runtime *rt, struct snd_card *card, char *name, struct snd_kcontrol_new *elems) { int ret; int i; struct snd_kcontrol *vmaster = snd_ctl_make_virtual_master(name, tlv_output); struct snd_kcontrol *control; if (!vmaster) return -ENOMEM; ret = snd_ctl_add(card, vmaster); if (ret < 0) return ret; i = 0; while (elems[i].name) { control = snd_ctl_new1(&elems[i], rt); if (!control) return -ENOMEM; ret = snd_ctl_add(card, control); if (ret < 0) return ret; ret = snd_ctl_add_slave(vmaster, control); if (ret < 0) return ret; i++; } return 0; }