diff options
-rw-r--r-- | sys/dev/sound/pcm/mixer.c | 36 | ||||
-rw-r--r-- | sys/dev/sound/pcm/mixer.h | 3 |
2 files changed, 39 insertions, 0 deletions
diff --git a/sys/dev/sound/pcm/mixer.c b/sys/dev/sound/pcm/mixer.c index 22e1d41..b8bbef7 100644 --- a/sys/dev/sound/pcm/mixer.c +++ b/sys/dev/sound/pcm/mixer.c @@ -254,6 +254,42 @@ mixer_ioctl(snddev_info *d, u_long cmd, caddr_t arg) return ENXIO; } +static int hwvol_step = 5; +SYSCTL_INT(_hw_snd, OID_AUTO, hwvol_step, CTLFLAG_RW, &hwvol_step, 0, ""); + +static int hwvol_mixer = SOUND_MIXER_VOLUME; +SYSCTL_INT(_hw_snd, OID_AUTO, hwvol_mixer, CTLFLAG_RW, &hwvol_mixer, 0, ""); + +void +mixer_hwmute(device_t dev) +{ + snddev_info *d; + + d = device_get_softc(dev); + mixer_set(d->mixer, hwvol_mixer, 0); +} + +void +mixer_hwstep(device_t dev, int left_step, int right_step) +{ + snddev_info *d; + int level, left, right; + + d = device_get_softc(dev); + level = mixer_get(d->mixer, hwvol_mixer); + if (level != -1) { + left = level & 0xff; + right = level >> 8; + left += left_step * hwvol_step; + if (left < 0) + left = 0; + right += right_step * hwvol_step; + if (right < 0) + right = 0; + mixer_set(d->mixer, hwvol_mixer, left | right << 8); + } +} + /* * The various mixers use a variety of bitmasks etc. The Voxware * driver had a very nice technique to describe a mixer and interface diff --git a/sys/dev/sound/pcm/mixer.h b/sys/dev/sound/pcm/mixer.h index 08824fc..b29cc14 100644 --- a/sys/dev/sound/pcm/mixer.h +++ b/sys/dev/sound/pcm/mixer.h @@ -33,6 +33,9 @@ extern int mixer_ioctl(snddev_info *d, u_long cmd, caddr_t arg); extern int mixer_busy(snd_mixer *m, int busy); extern int mixer_isbusy(snd_mixer *m); +void mixer_hwmute(device_t dev); +void mixer_hwstep(device_t dev, int left_step, int right_step); + extern void change_bits(mixer_tab *t, u_char *regval, int dev, int chn, int newval); void mix_setdevs(snd_mixer *m, u_int32_t v); |