static int add_vmaster(struct hda_codec *codec, hda_nid_t dac) { if(!codec) return -1; struct cs_spec *spec = codec->spec; if(!spec) return -1; unsigned int tlv[4]; int err; spec->vmaster_sw = snd_ctl_make_virtual_master("Master Playback Switch", NULL); if(!spec->vmaster_sw) return -1; err = snd_hda_ctl_add(codec, dac, spec->vmaster_sw); if (err < 0) return err; snd_hda_set_vmaster_tlv(codec, dac, HDA_OUTPUT, tlv); spec->vmaster_vol = snd_ctl_make_virtual_master("Master Playback Volume", tlv); if(!spec->vmaster_vol) return -1; err = snd_hda_ctl_add(codec, dac, spec->vmaster_vol); 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; }