diff options
author | Alexandre Ratchov <ratchov@cvs.openbsd.org> | 2007-12-08 10:01:29 +0000 |
---|---|---|
committer | Alexandre Ratchov <ratchov@cvs.openbsd.org> | 2007-12-08 10:01:29 +0000 |
commit | fb3bd19c580203f557fc534d57f5c6ddef4f4f05 (patch) | |
tree | eee270df4ee805d3593ea79f95c3203a1f3cbb01 /sys/dev/pci | |
parent | b46702885e5d80a01429e63cd57b644a4e789196 (diff) |
there should be 10 stereo or 20 mono knobs (but not 20 stereo!).
Fix this by changing monitor knobs to be mono (as all other knobs are).
Diffstat (limited to 'sys/dev/pci')
-rw-r--r-- | sys/dev/pci/envy.c | 39 |
1 files changed, 18 insertions, 21 deletions
diff --git a/sys/dev/pci/envy.c b/sys/dev/pci/envy.c index 53d8be56b7e..3a2c25f08ce 100644 --- a/sys/dev/pci/envy.c +++ b/sys/dev/pci/envy.c @@ -1,4 +1,4 @@ -/* $OpenBSD: envy.c,v 1.3 2007/12/08 09:59:33 ratchov Exp $ */ +/* $OpenBSD: envy.c,v 1.4 2007/12/08 10:01:28 ratchov Exp $ */ /* * Copyright (c) 2007 Alexandre Ratchov <alex@caoua.org> * @@ -61,7 +61,7 @@ int envy_lineout_getsrc(struct envy_softc *, int); void envy_lineout_setsrc(struct envy_softc *, int, int); int envy_spdout_getsrc(struct envy_softc *, int); void envy_spdout_setsrc(struct envy_softc *, int, int); -void envy_mon_getvol(struct envy_softc *, int, int *, int *); +void envy_mon_getvol(struct envy_softc *, int, int, int *); void envy_mon_setvol(struct envy_softc *, int, int, int); int envy_open(void *, int); @@ -460,23 +460,22 @@ envy_spdout_setsrc(struct envy_softc *sc, int out, int src) { } void -envy_mon_getvol(struct envy_softc *sc, int idx, int *l, int *r) { +envy_mon_getvol(struct envy_softc *sc, int idx, int ch, int *val) { int reg; bus_space_write_2(sc->mt_iot, sc->mt_ioh, ENVY_MT_MONIDX, idx); - reg = bus_space_read_2(sc->mt_iot, sc->mt_ioh, ENVY_MT_MONDATA); - *l = 0x7f - ((reg) & 0x7f); - *r = 0x7f - ((reg >> 8) & 0x7f); + reg = bus_space_read_1(sc->mt_iot, sc->mt_ioh, ENVY_MT_MONDATA + ch); + *val = 0x7f - ((reg) & 0x7f); } void -envy_mon_setvol(struct envy_softc *sc, int idx, int l, int r) { +envy_mon_setvol(struct envy_softc *sc, int idx, int ch, int val) { int reg; bus_space_write_2(sc->mt_iot, sc->mt_ioh, ENVY_MT_MONIDX, idx); - reg = (0x7f - l) | ((0x7f - r) << 8); - DPRINTF("%s: mon=%d <- %d,%d\n", DEVNAME(sc), reg, l, r); - bus_space_write_2(sc->mt_iot, sc->mt_ioh, ENVY_MT_MONDATA, reg); + reg = 0x7f - val; + DPRINTF("%s: mon=%d/%d <- %d\n", DEVNAME(sc), reg, ch, val); + bus_space_write_1(sc->mt_iot, sc->mt_ioh, ENVY_MT_MONDATA + ch, reg); } int @@ -876,7 +875,7 @@ envy_query_devinfo(void *self, struct mixer_devinfo *dev) dev->type = AUDIO_MIXER_VALUE; dev->mixer_class = ENVY_MIX_CLASSMON; dev->un.v.delta = 2; - dev->un.v.num_channels = 2; + dev->un.v.num_channels = 1; snprintf(dev->label.name, MAX_AUDIO_DEV_LEN, "%s%d", out < 10 ? "play" : "rec", out % 10); strlcpy(dev->un.v.units.name, AudioNvolume, MAX_AUDIO_DEV_LEN); @@ -889,7 +888,7 @@ int envy_get_port(void *self, struct mixer_ctrl *ctl) { struct envy_softc *sc = (struct envy_softc *)self; - int out, l, r; + int out, val; if (ctl->dev < ENVY_MIX_OUTSRC) { return EINVAL; @@ -906,10 +905,9 @@ envy_get_port(void *self, struct mixer_ctrl *ctl) } if (ctl->dev < ENVY_MIX_INVAL) { out = ctl->dev - ENVY_MIX_MONITOR; - envy_mon_getvol(sc, out, &l, &r); - ctl->un.value.num_channels = 2; - ctl->un.value.level[0] = 2 * l; - ctl->un.value.level[1] = 2 * r; + envy_mon_getvol(sc, out / 2, out % 2, &val); + ctl->un.value.num_channels = 1; + ctl->un.value.level[0] = 2 * val; return 0; } return ENXIO; @@ -919,7 +917,7 @@ int envy_set_port(void *self, struct mixer_ctrl *ctl) { struct envy_softc *sc = (struct envy_softc *)self; - int out, maxsrc, l, r; + int out, maxsrc, val; if (ctl->dev < ENVY_MIX_OUTSRC) { return EINVAL; @@ -941,12 +939,11 @@ envy_set_port(void *self, struct mixer_ctrl *ctl) } if (ctl->dev < ENVY_MIX_INVAL) { out = ctl->dev - ENVY_MIX_MONITOR; - if (ctl->un.value.num_channels != 2) { + if (ctl->un.value.num_channels != 1) { return EINVAL; } - l = ctl->un.value.level[0] / 2; - r = ctl->un.value.level[1] / 2; - envy_mon_setvol(sc, out, l, r); + val = ctl->un.value.level[0] / 2; + envy_mon_setvol(sc, out / 2, out % 2, val); return 0; } return ENXIO; |