summaryrefslogtreecommitdiff
path: root/sys/dev/pci/azalia.c
diff options
context:
space:
mode:
authorJacob Meuser <jakemsr@cvs.openbsd.org>2008-12-21 20:44:05 +0000
committerJacob Meuser <jakemsr@cvs.openbsd.org>2008-12-21 20:44:05 +0000
commit7adb9c7315a06e35f0a776f215ea8fbfad46c804 (patch)
treec52ad27caac1d6094ef124103d4186ea3dad2145 /sys/dev/pci/azalia.c
parent2d0fe69daed171083fdea4c10ff7c243153a8dbb (diff)
label converter widgets for their place in the converter group.
e.g. the first DAC in the converter group is now dac, the second is dac2, etc. unused converters (not in a converter group) will have a "u-" prefix. these will disappear completely in the near future, as they are useless. if there is more than one converter group, converters in the second group will have a "dig-" prefix, since they are digital converters.
Diffstat (limited to 'sys/dev/pci/azalia.c')
-rw-r--r--sys/dev/pci/azalia.c106
1 files changed, 101 insertions, 5 deletions
diff --git a/sys/dev/pci/azalia.c b/sys/dev/pci/azalia.c
index 50662c9cf7e..80146a7f31c 100644
--- a/sys/dev/pci/azalia.c
+++ b/sys/dev/pci/azalia.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: azalia.c,v 1.81 2008/12/21 20:32:46 jakemsr Exp $ */
+/* $OpenBSD: azalia.c,v 1.82 2008/12/21 20:44:04 jakemsr Exp $ */
/* $NetBSD: azalia.c,v 1.20 2006/05/07 08:31:44 kent Exp $ */
/*-
@@ -1753,7 +1753,7 @@ azalia_widget_sole_conn(codec_t *this, nid_t nid)
int
azalia_widget_label_widgets(codec_t *codec)
{
- int i;
+ int i, j, found;
widget_t *w;
int types[16];
@@ -1764,7 +1764,9 @@ azalia_widget_label_widgets(codec_t *codec)
FOR_EACH_WIDGET(codec, i) {
w = &codec->w[i];
- if (w->type == COP_AWTYPE_PIN_COMPLEX) {
+ w->mixer_class = -1;
+ switch (w->type) {
+ case COP_AWTYPE_PIN_COMPLEX:
pins[w->d.pin.device]++;
if (w->d.pin.device == CORB_CD_LINEIN) {
pins[CORB_CD_LINEOUT]++;
@@ -1784,7 +1786,101 @@ azalia_widget_label_widgets(codec_t *codec)
snprintf(w->name, sizeof(w->name), "%s",
pin_devices[w->d.pin.device]);
}
- } else {
+ break;
+ case COP_AWTYPE_AUDIO_OUTPUT:
+ found = 0;
+ if (codec->dacs.ngroups < 1) {
+ found = 1;
+ /* should not happen */
+ snprintf(w->name, sizeof(w->name), "u-dac%2.2x",
+ w->nid);
+ }
+ for (j = 0; found == 0 &&
+ j < codec->dacs.groups[0].nconv; j++) {
+ if (w->nid == codec->dacs.groups[0].conv[j]) {
+ found = 1;
+ 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]);
+ }
+ }
+ if (found == 0 && codec->dacs.ngroups < 2) {
+ found = 1;
+ /* should not happen */
+ snprintf(w->name, sizeof(w->name), "u-dac%2.2x",
+ w->nid);
+ }
+ for (j = 0; found == 0 &&
+ j < codec->dacs.groups[1].nconv; j++) {
+ if (w->nid == codec->dacs.groups[1].conv[j]) {
+ found = 1;
+ 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]);
+ }
+ }
+ if (found == 0) {
+ /* should not happen */
+ snprintf(w->name, sizeof(w->name), "u-dac%2.2x",
+ w->nid);
+ }
+ break;
+ case COP_AWTYPE_AUDIO_INPUT:
+ w->mixer_class = AZ_CLASS_RECORD;
+ found = 0;
+ if (codec->adcs.ngroups < 1) {
+ found = 1;
+ /* should not happen */
+ snprintf(w->name, sizeof(w->name), "u-adc%2.2x",
+ w->nid);
+ }
+ for (j = 0; found == 0 &&
+ j < codec->adcs.groups[0].nconv; j++) {
+ if (w->nid == codec->adcs.groups[0].conv[j]) {
+ found = 1;
+ 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]);
+ }
+ }
+ if (found == 0 && codec->adcs.ngroups < 2) {
+ found = 1;
+ /* should not happen */
+ snprintf(w->name, sizeof(w->name), "u-adc%2.2x",
+ w->nid);
+ }
+ for (j = 0; found == 0 &&
+ j < codec->adcs.groups[1].nconv; j++) {
+ if (w->nid == codec->adcs.groups[1].conv[j]) {
+ found = 1;
+ 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]);
+ }
+ }
+ if (found == 0) {
+ /* should not happen */
+ snprintf(w->name, sizeof(w->name), "u-adc%2.2x",
+ w->nid);
+ }
+ break;
+ default:
types[w->type]++;
if (types[w->type] > 1)
snprintf(w->name, sizeof(w->name), "%s%d",
@@ -1792,7 +1888,7 @@ azalia_widget_label_widgets(codec_t *codec)
else
snprintf(w->name, sizeof(w->name), "%s",
wtypes[w->type]);
-
+ break;
}
if (codec->init_widget != NULL)
codec->init_widget(codec, w, w->nid);