summaryrefslogtreecommitdiffstats
path: root/sys/dev/sound/pcm
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2001-01-03 01:29:47 +0000
committerjhb <jhb@FreeBSD.org>2001-01-03 01:29:47 +0000
commit99e2a84a1fd86ed70eb2843ec743bc94f6d83dce (patch)
tree53f4078e7ea2c2bd06123c56aa9583b61d1002a9 /sys/dev/sound/pcm
parentaa1bf8b0b32c122e7edac62650ee078fd65e1d6d (diff)
downloadFreeBSD-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')
-rw-r--r--sys/dev/sound/pcm/mixer.c36
-rw-r--r--sys/dev/sound/pcm/mixer.h3
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);
OpenPOWER on IntegriCloud