this diff encodes the audio stream channel numbers converters will
process into converter mixer names.

e.g.

inputs.dac  -> inputs.dac-0:1
inputs.dac2 -> inputs.dac-2:3
inputs.dac3 -> inputs.dac-4:5

pros:
* easier to understand what channels are going where
* very similar in format to aucat channel numbering

cons:
* different than any other driver

overcoming the con is not hard.  software looking for 'dac' can also
look for 'dac-0:'.  woudn't be surprised if programs are confused by
'dac2' already anyway though.  otoh, it wouldn't really bother me to
make such a change universal, but I'm not really pushing that either,
at this point.

btw, this part of the manual change:

 However, a dac that is connected to built-in speaker(s) or front
 panel headphone jack(s) by default will convert audio stream channels
 starting at 0 if the dac would otherwise not be converting any channels.
 For example, if dac-2:3 is the default dac for the built-in speakers in
 a laptop, dac-2:3 will convert channels 0 and 1 when a stereo audio
 stream is being played.  This is to allow simultaneous stereo playback
 on both the built-in speakers and a line or headphone jack.

is not new behaviour, it just wasn't explained before.

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

Index: share/man/man4/azalia.4
===================================================================
RCS file: /cvs/src/share/man/man4/azalia.4,v
retrieving revision 1.22
diff -u -p share/man/man4/azalia.4
--- share/man/man4/azalia.4     20 Oct 2009 06:31:26 -0000      1.22
+++ share/man/man4/azalia.4     23 Oct 2009 00:44:35 -0000
@@ -106,8 +106,7 @@ The widget type enumerator is used to distinguish diff
 of the same type.
 The enumeration starts at 2: the first widget of each type is not
 enumerated.
-Except for dac and adc widget types, the enumeration order is
-meaningless.
+The enumeration order is meaningless.
 The property is optional.
 Generally, if there is no property, the mixer item is an amplifier gain
 control.
@@ -117,22 +116,45 @@ The following are the widget type names used in mixer 
 .Bl -tag -width "SPDIF-in"
 .It Cm dac
 Digital to analog converter, usually used for playback.
-These widgets are enumerated according to the channels they convert.
-For example, if a codec has 3 stereo dacs, they would convert the
-following channels: dac channels 0 and 1, dac2 channels 2 and 3,
-dac3 channels 4 and 5.
+The audio stream channel(s) these widgets will convert are encoded into
+their name in the form of <start channel>:<end channel>.
+For example,
+.Cm dac-0:1
+converts channels 0 and 1 (stereo).
+However, a dac that is connected to built-in speaker(s) or front
+panel headphone jack(s) by default will convert audio stream channels
+starting at 0 if the dac would otherwise not be converting any channels.
+For example, if
+.Cm dac-2:3
+is the default dac for the built-in speakers in a laptop,
+.Cm dac-2:3
+will convert channels 0 and 1 when a stereo audio stream is being played.
+This is to allow simultaneous stereo playback on both the built-in speakers
+and a line or headphone jack.
 .Pp
 .It Cm dig-dac
 Digital output converter, usually an S/PDIF transmitter.
+The audio stream channel(s) these widgets will convert are encoded into
+their name in the form of <start channel>:<end channel>.
+For example,
+.Cm dig-dac-0:1
+converts channels 0 and 1 (stereo).
 .Pp
 .It Cm adc
 Analog to digital converter, usually used for recording.
-These widgets are enumerated according to the channels they convert.
-For example, if a codec has 2 stereo adcs, they would convert the
-following channels: adc channels 0 and 1, adc2 channels 2 and 3.
+The audio stream channel(s) these widgets will convert are encoded into
+their name in the form of <start channel>:<end channel>.
+For example,
+.Cm adc-0:1
+converts channels 0 and 1 (stereo).
 .Pp
 .It Cm dig-adc
 Digital input converter, usually an S/PDIF receiver.
+The audio stream channel(s) these widgets will convert are encoded into
+their name in the form of <start channel>:<end channel>.
+For example,
+.Cm dig-adc-0:1
+converts channels 0 and 1 (stereo).
 .Pp
 .It Cm mix
 Sums multiple audio sources into a single stream, but
Index: sys/dev/pci/azalia.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/azalia.c,v
retrieving revision 1.158
diff -u -p sys/dev/pci/azalia.c
--- sys/dev/pci/azalia.c        13 Oct 2009 19:33:16 -0000      1.158
+++ sys/dev/pci/azalia.c        23 Oct 2009 00:44:36 -0000
@@ -2767,9 +2767,10 @@ int
 azalia_widget_label_widgets(codec_t *codec)
 {
        widget_t *w;
+       convgroup_t *group;
        int types[16];
        int pins[16];
-       int colors_used, use_colors;
+       int colors_used, use_colors, schan;
        int i, j;
 
        bzero(&pins, sizeof(pins));
@@ -2817,63 +2818,56 @@ azalia_widget_label_widgets(codec_t *codec)
                case COP_AWTYPE_AUDIO_OUTPUT:
                        if (codec->dacs.ngroups < 1)
                                break;
-                       for (j = 0; j < codec->dacs.groups[0].nconv; j++) {
-                               if (w->nid == codec->dacs.groups[0].conv[j]) {
-                                       if (j > 0)
-                                               snprintf(w->name,
-                                                   sizeof(w->name), "%s%d",
-                                                   wtypes[w->type], j + 1);
-                                       else
-                                               snprintf(w->name,
-                                                   sizeof(w->name), "%s",
-                                                   wtypes[w->type]);
-                                       break;
+                       group = &codec->dacs.groups[0];
+                       schan = 0;
+                       for (j = 0; j < group->nconv; j++) {
+                               if (w->nid == group->conv[j]) {
+                                       snprintf(w->name, sizeof(w->name),
+                                           "%s-%d:%d", wtypes[w->type], schan,
+                                           schan + WIDGET_CHANNELS(w) - 1);
                                }
+                               schan += WIDGET_CHANNELS(w);
                        }
                        if (codec->dacs.ngroups < 2)
                                break;
-                       for (j = 0; j < codec->dacs.groups[1].nconv; j++) {
-                               if (w->nid == codec->dacs.groups[1].conv[j]) {
-                                       if (j > 0)
-                                               snprintf(w->name,
-                                                   sizeof(w->name), "dig-%s%d",
-                                                   wtypes[w->type], j + 1);
-                                       else
-                                               snprintf(w->name,
-                                                   sizeof(w->name), "dig-%s",
-                                                   wtypes[w->type]);
+                       group = &codec->dacs.groups[1];
+                       schan = 0;
+                       for (j = 0; j < group->nconv; j++) {
+                               if (w->nid == group->conv[j]) {
+                                       snprintf(w->name, sizeof(w->name),
+                                           "dig-%s-%d:%d", wtypes[w->type],
+                                           schan,
+                                           schan + WIDGET_CHANNELS(w) - 1);
                                }
+                               schan += WIDGET_CHANNELS(w);
                        }
                        break;
                case COP_AWTYPE_AUDIO_INPUT:
+                       w->mixer_class = AZ_CLASS_RECORD;
                        if (codec->adcs.ngroups < 1)
                                break;
-                       w->mixer_class = AZ_CLASS_RECORD;
-                       for (j = 0; j < codec->adcs.groups[0].nconv; j++) {
-                               if (w->nid == codec->adcs.groups[0].conv[j]) {
-                                       if (j > 0)
-                                               snprintf(w->name,
-                                                   sizeof(w->name), "%s%d",
-                                                   wtypes[w->type], j + 1);
-                                       else
-                                               snprintf(w->name,
-                                                   sizeof(w->name), "%s",
-                                                   wtypes[w->type]);
+                       group = &codec->adcs.groups[0];
+                       schan = 0;
+                       for (j = 0; j < group->nconv; j++) {
+                               if (w->nid == group->conv[j]) {
+                                       snprintf(w->name, sizeof(w->name),
+                                           "%s-%d:%d", wtypes[w->type], schan,
+                                           schan + WIDGET_CHANNELS(w) - 1);
                                }
+                               schan += WIDGET_CHANNELS(w);
                        }
                        if (codec->adcs.ngroups < 2)
                                break;
-                       for (j = 0; j < codec->adcs.groups[1].nconv; j++) {
-                               if (w->nid == codec->adcs.groups[1].conv[j]) {
-                                       if (j > 0)
-                                               snprintf(w->name,
-                                                   sizeof(w->name), "dig-%s%d",
-                                                   wtypes[w->type], j + 1);
-                                       else
-                                               snprintf(w->name,
-                                                   sizeof(w->name), "dig-%s",
-                                                   wtypes[w->type]);
+                       group = &codec->adcs.groups[1];
+                       schan = 0;
+                       for (j = 0; j < group->nconv; j++) {
+                               if (w->nid == group->conv[j]) {
+                                       snprintf(w->name, sizeof(w->name),
+                                           "dig-%s-%d:%d", wtypes[w->type],
+                                           schan,
+                                           schan + WIDGET_CHANNELS(w) - 1);
                                }
+                               schan += WIDGET_CHANNELS(w);
                        }
                        break;
                default:

Reply via email to