diff options
author | jhb <jhb@FreeBSD.org> | 2001-01-03 01:29:47 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2001-01-03 01:29:47 +0000 |
commit | 99e2a84a1fd86ed70eb2843ec743bc94f6d83dce (patch) | |
tree | 53f4078e7ea2c2bd06123c56aa9583b61d1002a9 /sys/dev/sound/pcm/mixer.c | |
parent | aa1bf8b0b32c122e7edac62650ee078fd65e1d6d (diff) | |
download | FreeBSD-src-99e2a84a1fd86ed70eb2843ec743bc94f6d83dce.zip FreeBSD-src-99e2a84a1fd86ed70eb2843ec743bc94f6d83dce.tar.gz |
Add a new API for soundcards that have hardware volume control:
- The mixer_hwmute() function can be called when a soundcard receives a
mute request.
- The mixer_hwstep() function can be used to adjust the volume of one or
both channels.
- The 'hw.snd.hwvol_step' sysctl determines the amount that mixer_hwstep()
adjusts the volume by on each call.
- The 'hw.snd.hwvol_mixer' sysctl specifies the mixer device to adjust the
volume on for both functions. The values used correspond to the
SOUNDCARD_MIXER_* constants.
Diffstat (limited to 'sys/dev/sound/pcm/mixer.c')
-rw-r--r-- | sys/dev/sound/pcm/mixer.c | 36 |
1 files changed, 36 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 |