diff options
author | Jacob Meuser <jakemsr@cvs.openbsd.org> | 2009-01-05 07:55:35 +0000 |
---|---|---|
committer | Jacob Meuser <jakemsr@cvs.openbsd.org> | 2009-01-05 07:55:35 +0000 |
commit | 66f4a68f9729a5bd45cd02552f7ffa7bacda1838 (patch) | |
tree | ea0e22ae267190112048d9ceee2d03ee9c3719af /sys/dev | |
parent | 009d0e9c3e3f56565c0873761901440ad7b2955a (diff) |
use AUDIO_MIXER_SET instead of AUDIO_MIXER_ENUM to display mixers
that don't have selectable inputs. all connections are active, always.
showing all connections in the set rather than just one makes a lot
more sense.
Diffstat (limited to 'sys/dev')
-rw-r--r-- | sys/dev/pci/azalia.h | 3 | ||||
-rw-r--r-- | sys/dev/pci/azalia_codec.c | 62 |
2 files changed, 58 insertions, 7 deletions
diff --git a/sys/dev/pci/azalia.h b/sys/dev/pci/azalia.h index bdb8c02e29f..861b7566d8d 100644 --- a/sys/dev/pci/azalia.h +++ b/sys/dev/pci/azalia.h @@ -1,4 +1,4 @@ -/* $OpenBSD: azalia.h,v 1.37 2009/01/03 19:17:45 jakemsr Exp $ */ +/* $OpenBSD: azalia.h,v 1.38 2009/01/05 07:55:34 jakemsr Exp $ */ /* $NetBSD: azalia.h,v 1.6 2006/01/16 14:15:26 kent Exp $ */ /*- @@ -584,6 +584,7 @@ typedef struct { #define MI_TARGET_SENSESET 0x10c #define MI_TARGET_PLAYVOL 0x10d #define MI_TARGET_RECVOL 0x10e +#define MI_TARGET_MIXERSET 0x10f } mixer_item_t; #define VALID_WIDGET_NID(nid, codec) (nid == (codec)->audiofunc || \ diff --git a/sys/dev/pci/azalia_codec.c b/sys/dev/pci/azalia_codec.c index 7982a20d600..2f6327838b8 100644 --- a/sys/dev/pci/azalia_codec.c +++ b/sys/dev/pci/azalia_codec.c @@ -1,4 +1,4 @@ -/* $OpenBSD: azalia_codec.c,v 1.108 2009/01/04 22:45:24 jakemsr Exp $ */ +/* $OpenBSD: azalia_codec.c,v 1.109 2009/01/05 07:55:34 jakemsr Exp $ */ /* $NetBSD: azalia_codec.c,v 1.8 2006/05/10 11:17:27 kent Exp $ */ /*- @@ -581,9 +581,7 @@ azalia_generic_mixer_init(codec_t *this) continue; /* selector */ - if (w->nconnections > 0 && - !(w->type == COP_AWTYPE_AUDIO_MIXER && - (w->widgetcap & COP_AWCAP_INAMP)) && + if (w->nconnections > 0 && w->type != COP_AWTYPE_AUDIO_MIXER && !(w->nconnections == 1 && azalia_widget_enabled(this, w->connections[0]) && strcmp(w->name, this->w[w->connections[0]].name) == 0) && @@ -754,6 +752,36 @@ azalia_generic_mixer_init(codec_t *this) } } + /* hardcoded mixer inputs */ + if (w->type == COP_AWTYPE_AUDIO_MIXER && + !(w->widgetcap & COP_AWCAP_INAMP)) { + MIXER_REG_PROLOG; + snprintf(d->label.name, sizeof(d->label.name), + "%s_source", w->name); + m->target = MI_TARGET_MIXERSET; + d->type = AUDIO_MIXER_SET; + if (w->mixer_class >= 0) + d->mixer_class = w->mixer_class; + else + d->mixer_class = AZ_CLASS_INPUT; + for (j = 0, k = 0; + j < w->nconnections && k < 32; j++) { + if (!azalia_widget_enabled(this, + w->connections[j])) + continue; + if (w->connections[j] == this->speaker) + continue; + d->un.s.member[k].mask = 1 << j; + strlcpy(d->un.s.member[k].label.name, + this->w[w->connections[j]].name, + MAX_AUDIO_DEV_LEN); + k++; + } + d->un.s.num_mem = k; + if (k != 0) + this->nmixers++; + } + /* pin direction */ if (w->type == COP_AWTYPE_PIN_COMPLEX && w->d.pin.cap & COP_PINCAP_OUTPUT && @@ -1108,7 +1136,8 @@ azalia_generic_mixer_default(codec_t *this) /* unmute all */ for (i = 0; i < this->nmixers; i++) { m = &this->mixers[i]; - if (m->target != MI_TARGET_MUTESET) + if (m->target != MI_TARGET_MUTESET && + m->target != MI_TARGET_MIXERSET) continue; if (m->devinfo.type != AUDIO_MIXER_SET) continue; @@ -1116,7 +1145,7 @@ azalia_generic_mixer_default(codec_t *this) mc.dev = i; mc.type = AUDIO_MIXER_SET; if (!azalia_widget_enabled(this, m->nid)) { - DPRINTF(("%s: invalid muteset nid\n", __func__)); + DPRINTF(("%s: invalid set nid\n", __func__)); return EINVAL; } w = &this->w[m->nid]; @@ -1399,6 +1428,23 @@ azalia_generic_mixer_get(const codec_t *this, nid_t nid, int target, } } + /* mixer set - show all connections */ + else if (target == MI_TARGET_MIXERSET && mc->type == AUDIO_MIXER_SET) { + const widget_t *w; + + if (!azalia_widget_enabled(this, nid)) { + DPRINTF(("%s: invalid mixerset nid\n")); + return EINVAL; + } + w = &this->w[nid]; + mc->un.mask = 0; + for (i = 0; i < w->nconnections; i++) { + if (!azalia_widget_enabled(this, w->connections[i])) + continue; + mc->un.mask |= (1 << i); + } + } + else if (target == MI_TARGET_SENSESET && mc->type == AUDIO_MIXER_SET) { if (nid == this->speaker) { @@ -1790,6 +1836,10 @@ azalia_generic_mixer_set(codec_t *this, nid_t nid, int target, } } + else if (target == MI_TARGET_MUTESET && mc->type == AUDIO_MIXER_SET) { + /* do nothing, control is read only */ + } + else if (target == MI_TARGET_SENSESET && mc->type == AUDIO_MIXER_SET) { if (nid == this->speaker) { |