return 0;
}
-static const char *alc_get_line_out_pfx(struct alc_spec *spec,
- bool can_be_master)
+static const char *alc_get_line_out_pfx(struct alc_spec *spec, int ch,
+ bool can_be_master, int *index)
{
struct auto_pin_cfg *cfg = &spec->autocfg;
+ static const char * const chname[4] = {
+ "Front", "Surround", NULL /*CLFE*/, "Side"
+ };
+ *index = 0;
if (cfg->line_outs == 1 && !spec->multi_ios &&
!cfg->hp_outs && !cfg->speaker_outs && can_be_master)
return "Master";
return "Speaker";
break;
case AUTO_PIN_HP_OUT:
+ /* for multi-io case, only the primary out */
+ if (ch && spec->multi_ios)
+ break;
+ *index = ch;
return "Headphone";
default:
if (cfg->line_outs == 1 && !spec->multi_ios)
return "PCM";
break;
}
- return NULL;
+ return chname[ch];
}
/* add playback controls from the parsed DAC table */
static int alc880_auto_create_multi_out_ctls(struct alc_spec *spec,
const struct auto_pin_cfg *cfg)
{
- static const char * const chname[4] = {
- "Front", "Surround", NULL /*CLFE*/, "Side"
- };
- const char *pfx = alc_get_line_out_pfx(spec, false);
hda_nid_t nid;
int i, err, noutputs;
noutputs += spec->multi_ios;
for (i = 0; i < noutputs; i++) {
+ const char *name;
+ int index;
if (!spec->multiout.dac_nids[i])
continue;
nid = alc880_idx_to_mixer(alc880_dac_to_idx(spec->multiout.dac_nids[i]));
- if (!pfx && i == 2) {
+ name = alc_get_line_out_pfx(spec, i, false, &index);
+ if (!name) {
/* Center/LFE */
err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
"Center",
if (err < 0)
return err;
} else {
- const char *name = pfx;
- int index = i;
- if (!name) {
- name = chname[i];
- index = 0;
- }
err = __add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
name, index,
HDA_COMPOSE_AMP_VAL(nid, 3, 0,
{
const char *pfx;
int vbits;
- int i, err;
+ int i, index, err;
spec->multiout.num_dacs = 1; /* only use one dac */
spec->multiout.dac_nids = spec->private_dac_nids;
spec->private_dac_nids[0] = 2;
- pfx = alc_get_line_out_pfx(spec, true);
- if (!pfx)
- pfx = "Front";
for (i = 0; i < 2; i++) {
- err = alc262_add_out_sw_ctl(spec, cfg->line_out_pins[i], pfx, i);
+ pfx = alc_get_line_out_pfx(spec, i, true, &index);
+ if (!pfx)
+ pfx = "PCM";
+ err = alc262_add_out_sw_ctl(spec, cfg->line_out_pins[i], pfx,
+ index);
if (err < 0)
return err;
if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
vbits = alc262_check_volbit(cfg->line_out_pins[0]) |
alc262_check_volbit(cfg->speaker_pins[0]) |
alc262_check_volbit(cfg->hp_pins[0]);
- if (vbits == 1 || vbits == 2)
- pfx = "Master"; /* only one mixer is used */
vbits = 0;
for (i = 0; i < 2; i++) {
+ pfx = alc_get_line_out_pfx(spec, i, true, &index);
+ if (!pfx)
+ pfx = "PCM";
err = alc262_add_out_vol_ctl(spec, cfg->line_out_pins[i], pfx,
&vbits, i);
if (err < 0)
const struct auto_pin_cfg *cfg)
{
struct alc_spec *spec = codec->spec;
- static const char * const chname[4] = {
- "Front", "Surround", NULL /*CLFE*/, "Side"
- };
- const char *pfx = alc_get_line_out_pfx(spec, true);
hda_nid_t nid;
int i, err, noutputs;
noutputs += spec->multi_ios;
for (i = 0; i < noutputs; i++) {
+ const char *name;
+ int index;
nid = spec->multiout.dac_nids[i];
if (!nid)
continue;
- if (!pfx && i == 2) {
+ name = alc_get_line_out_pfx(spec, i, true, &index);
+ if (!name) {
/* Center/LFE */
err = alc861_create_out_sw(codec, "Center", nid, 1);
if (err < 0)
if (err < 0)
return err;
} else {
- const char *name = pfx;
- int index = i;
- if (!name) {
- name = chname[i];
- index = 0;
- }
err = __alc861_create_out_sw(codec, name, nid, index, 3);
if (err < 0)
return err;
static int alc861vd_auto_create_multi_out_ctls(struct alc_spec *spec,
const struct auto_pin_cfg *cfg)
{
- static const char * const chname[4] = {
- "Front", "Surround", "CLFE", "Side"
- };
- const char *pfx = alc_get_line_out_pfx(spec, true);
hda_nid_t nid_v, nid_s;
int i, err, noutputs;
noutputs += spec->multi_ios;
for (i = 0; i < noutputs; i++) {
+ const char *name;
+ int index;
if (!spec->multiout.dac_nids[i])
continue;
nid_v = alc861vd_idx_to_mixer_vol(
alc880_dac_to_idx(
spec->multiout.dac_nids[i]));
- if (!pfx && i == 2) {
+ name = alc_get_line_out_pfx(spec, i, true, &index);
+ if (!name) {
/* Center/LFE */
err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
"Center",
if (err < 0)
return err;
} else {
- const char *name = pfx;
- int index = i;
- if (!name) {
- name = chname[i];
- index = 0;
- }
err = __add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
name, index,
HDA_COMPOSE_AMP_VAL(nid_v, 3, 0,
const struct auto_pin_cfg *cfg)
{
struct alc_spec *spec = codec->spec;
- static const char * const chname[4] = {
- "Front", "Surround", NULL /*CLFE*/, "Side"
- };
- const char *pfx = alc_get_line_out_pfx(spec, true);
hda_nid_t nid, mix, pin;
int i, err, noutputs;
noutputs += spec->multi_ios;
for (i = 0; i < noutputs; i++) {
+ const char *name;
+ int index;
nid = spec->multiout.dac_nids[i];
if (!nid)
continue;
mix = alc_auto_dac_to_mix(codec, pin, nid);
if (!mix)
continue;
- if (!pfx && i == 2) {
+ name = alc_get_line_out_pfx(spec, i, true, &index);
+ if (!name) {
/* Center/LFE */
err = alc662_add_vol_ctl(spec, "Center", nid, 1);
if (err < 0)
if (err < 0)
return err;
} else {
- const char *name = pfx;
- int index = i;
- if (!name) {
- name = chname[i];
- index = 0;
- }
err = __alc662_add_vol_ctl(spec, name, nid, index, 3);
if (err < 0)
return err;
spec->multi_ios = num_pins;
spec->ext_channel_count = 2;
spec->multiout.num_dacs = num_pins + 1;
- /* for avoiding multi HP mixers */
- cfg->line_out_type = AUTO_PIN_LINE_OUT;
}
return 0;
}