summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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