ALSA: hda - Clean up multi-channel mixer name assignment in patch_realtek.c
authorTakashi Iwai <tiwai@suse.de>
Fri, 24 Jun 2011 09:03:58 +0000 (11:03 +0200)
committerTakashi Iwai <tiwai@suse.de>
Fri, 24 Jun 2011 09:06:17 +0000 (11:06 +0200)
Change alc_get_line_out_pfx() in patch_realtek.c to provide the channel
specific name and assign the index so that each caller doesn't have to
set the channel name by itself.

Also, check the multi-io case with the primary hp-out; for the multi-io
channels, assign the channel name instead of "Headphone" with indices.
This makes the mixer names more intuitive and reduces confusion.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/hda/patch_realtek.c

index b0cf726d4b933c7f639f161ba572d68c479164c9..7858da5675fe9ef45bdc11d7af17a17d5462b2b8 100644 (file)
@@ -5359,11 +5359,15 @@ static int alc880_auto_fill_dac_nids(struct alc_spec *spec,
        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";
@@ -5374,23 +5378,23 @@ static const char *alc_get_line_out_pfx(struct alc_spec *spec,
                        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;
 
@@ -5399,10 +5403,13 @@ static int alc880_auto_create_multi_out_ctls(struct alc_spec *spec,
                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",
@@ -5429,12 +5436,6 @@ static int alc880_auto_create_multi_out_ctls(struct alc_spec *spec,
                        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,
@@ -12257,17 +12258,18 @@ static int alc262_auto_create_multi_out_ctls(struct alc_spec *spec,
 {
        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) {
@@ -12287,10 +12289,11 @@ static int alc262_auto_create_multi_out_ctls(struct alc_spec *spec,
        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)
@@ -16035,10 +16038,6 @@ static int alc861_auto_create_multi_out_ctls(struct hda_codec *codec,
                                             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;
 
@@ -16047,10 +16046,13 @@ static int alc861_auto_create_multi_out_ctls(struct hda_codec *codec,
                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)
@@ -16059,12 +16061,6 @@ static int alc861_auto_create_multi_out_ctls(struct hda_codec *codec,
                        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;
@@ -17178,10 +17174,6 @@ static void alc861vd_auto_init_analog_input(struct hda_codec *codec)
 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;
 
@@ -17190,6 +17182,8 @@ static int alc861vd_auto_create_multi_out_ctls(struct alc_spec *spec,
                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(
@@ -17199,7 +17193,8 @@ static int alc861vd_auto_create_multi_out_ctls(struct alc_spec *spec,
                                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",
@@ -17226,12 +17221,6 @@ static int alc861vd_auto_create_multi_out_ctls(struct alc_spec *spec,
                        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,
@@ -19030,10 +19019,6 @@ static int alc662_auto_create_multi_out_ctls(struct hda_codec *codec,
                                             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;
 
@@ -19042,6 +19027,8 @@ static int alc662_auto_create_multi_out_ctls(struct hda_codec *codec,
                noutputs += spec->multi_ios;
 
        for (i = 0; i < noutputs; i++) {
+               const char *name;
+               int index;
                nid = spec->multiout.dac_nids[i];
                if (!nid)
                        continue;
@@ -19052,7 +19039,8 @@ static int alc662_auto_create_multi_out_ctls(struct hda_codec *codec,
                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)
@@ -19067,12 +19055,6 @@ static int alc662_auto_create_multi_out_ctls(struct hda_codec *codec,
                        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;
@@ -19361,8 +19343,6 @@ static int alc_auto_add_multi_channel_mode(struct hda_codec *codec)
                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;
 }