for codecs with multiple line out jacks, this patch would use the
color of the jack (according to the codec) in the name instead
of enumerating the jacks, if all the line out jack have different
colors.  for example:

outputs.line    -> outputs.line-grn
outputs.line2   -> outputs.line-org
outputs.line3   -> outputs.line-blk
outputs.line4   -> outputs.line-gry

unfortunately, there isn't enough room in mixer names for the color
to be spelled out fully.  the abbreviations are as follows:

blk -> black
gry -> grey
blu -> blue
grn -> green
red -> red
org -> orange
yel -> yellow
pur -> purple
pnk -> pink
whi -> white
oth -> other

I would be surprised to see colors other than grn, org, blk, gry being
used for line out jacks.  the others are usually used for inputs or
digital connections.

comments?

-- 
[email protected]
SDF Public Access UNIX System - http://sdf.lonestar.org

Index: azalia.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/azalia.c,v
retrieving revision 1.139
diff -u -p azalia.c
--- azalia.c    9 Jun 2009 05:16:42 -0000       1.139
+++ azalia.c    17 Jun 2009 21:49:42 -0000
@@ -311,6 +311,9 @@ static const char *wtypes[16] = {
        "dac", "adc", "mix", "sel", "pin", "pow", "volume",
        "beep", "wid08", "wid09", "wid0a", "wid0b", "wid0c",
        "wid0d", "wid0e", "vendor"};
+static const char *pin_colors[11] = {
+       "blk", "gry", "blu", "grn", "red", "org", "yel",
+       "pur", "pnk", "whi", "oth"};
 
 /* ================================================================
  * PCI functions
@@ -1319,11 +1322,13 @@ azalia_codec_init(codec_t *this)
                                switch (this->w[i].d.pin.device) {
                                case CORB_CD_SPEAKER:
                                        this->speaker = i;
-                                       this->spkr_dac = 
azalia_codec_find_defdac(this, i, 0);
+                                       this->spkr_dac =
+                                           azalia_codec_find_defdac(this, i, 
0);
                                        break;
                                case CORB_CD_MICIN:
                                        this->mic = i;
-                                       this->mic_adc = 
azalia_codec_find_defadc(this, i, 0);
+                                       this->mic_adc =
+                                           azalia_codec_find_defadc(this, i, 
0);
                                        break;
                                }
                                break;
@@ -2636,11 +2641,28 @@ azalia_widget_label_widgets(codec_t *codec)
        widget_t *w;
        int types[16];
        int pins[16];
+       int colors_used, use_colors;
        int i, j;
 
        bzero(&pins, sizeof(pins));
        bzero(&types, sizeof(types));
 
+       /* If codec has more than one line-out jack, check if the jacks
+        * have unique colors.  If so, use the colors in the mixer names.
+        */
+       use_colors = 1;
+       if (codec->nout_jacks < 2)
+               use_colors = 0;
+       for (i = 0; use_colors && i < codec->nopins; i++) {
+               w = &codec->w[codec->opins[i].nid];
+               if (w->d.pin.device != CORB_CD_LINEOUT)
+                       continue;
+               if (colors_used & (1 << w->d.pin.color))
+                       use_colors = 0;
+               else
+                       colors_used |= (1 << w->d.pin.color);
+       }
+
        FOR_EACH_WIDGET(codec, i) {
                w = &codec->w[i];
                /* default for disabled/unused widgets */
@@ -2650,13 +2672,18 @@ azalia_widget_label_widgets(codec_t *codec)
                switch (w->type) {
                case COP_AWTYPE_PIN_COMPLEX:
                        pins[w->d.pin.device]++;
-                       if (pins[w->d.pin.device] > 1)
+                       if (use_colors && w->d.pin.device == CORB_CD_LINEOUT) {
+                               snprintf(w->name, sizeof(w->name), "%s-%s",
+                                   pin_devices[w->d.pin.device],
+                                   pin_colors[w->d.pin.color]);
+                       } else if (pins[w->d.pin.device] > 1) {
                                snprintf(w->name, sizeof(w->name), "%s%d",
                                    pin_devices[w->d.pin.device],
                                    pins[w->d.pin.device]);
-                       else
+                       } else {
                                snprintf(w->name, sizeof(w->name), "%s",
                                    pin_devices[w->d.pin.device]);
+                       }
                        break;
                case COP_AWTYPE_AUDIO_OUTPUT:
                        if (codec->dacs.ngroups < 1)

Reply via email to