On Sat, Jun 20, 2009 at 11:58:52PM +0000, Jacob Meuser wrote:
> On Sat, Jun 20, 2009 at 11:18:44AM +0000, Jacob Meuser wrote:
> > 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?
> 
> forgot to initialize a variable. please try this diff instead.

third times the charm?

-- 
[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.140
diff -u azalia.c
--- azalia.c    18 Jun 2009 08:19:03 -0000      1.140
+++ azalia.c    21 Jun 2009 05:17:54 -0000
@@ -311,6 +311,9 @@
        "dac", "adc", "mix", "sel", "pin", "pow", "volume",
        "beep", "wid08", "wid09", "wid0a", "wid0b", "wid0c",
        "wid0d", "wid0e", "vendor"};
+static const char *line_colors[16] = {
+       "unk", "blk", "gry", "blu", "grn", "red", "org", "yel",
+       "pur", "pnk", "0xa", "0xb", "0xc", "0xd", "wht", "oth"};
 
 /* ================================================================
  * PCI functions
@@ -1319,11 +1322,13 @@
                                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,29 @@
        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;
+       colors_used = 0;
+       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 +2673,18 @@
                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],
+                                   line_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