summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2001-01-11 23:26:16 +0000
committerjhb <jhb@FreeBSD.org>2001-01-11 23:26:16 +0000
commit15fe5fedcbdeeb31265115ed18fa3c7ebc344754 (patch)
treeb8143d7e8871a7f36140bf9ffccc6b82604bdcf2 /sys
parent0058a1591e8c0227aa8a33ffc9f1a5e4c648af31 (diff)
downloadFreeBSD-src-15fe5fedcbdeeb31265115ed18fa3c7ebc344754.zip
FreeBSD-src-15fe5fedcbdeeb31265115ed18fa3c7ebc344754.tar.gz
- Move all of the hwvol functions into a mixer_hwvol_* namespace, and make
all of the hwvol members of struct snd_mixer live in a hwvol_* namespace. - When changing the mixer device via the hwvol_mixer sysctl, reset the muted state so that a mute operation on a new device won't try to unmute the new device with the old device's saved volume. - When the volume is muted, if a down or up volume request is received, first restore the saved volume level and then adjust it. Reviewed by: cg
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/sound/pcm/datatypes.h4
-rw-r--r--sys/dev/sound/pcm/mixer.c26
-rw-r--r--sys/dev/sound/pcm/mixer.h6
3 files changed, 21 insertions, 15 deletions
diff --git a/sys/dev/sound/pcm/datatypes.h b/sys/dev/sound/pcm/datatypes.h
index bf6d73d..8a28162 100644
--- a/sys/dev/sound/pcm/datatypes.h
+++ b/sys/dev/sound/pcm/datatypes.h
@@ -40,10 +40,10 @@ struct _snd_mixer {
const char *name;
void *devinfo;
int busy;
- int muted;
+ int hwvol_muted;
int hwvol_mixer;
int hwvol_step;
- u_int32_t mute_level;
+ u_int32_t hwvol_mute_level;
u_int32_t devs;
u_int32_t recdevs;
u_int32_t recsrc;
diff --git a/sys/dev/sound/pcm/mixer.c b/sys/dev/sound/pcm/mixer.c
index c9d4ae8..a11ab3d 100644
--- a/sys/dev/sound/pcm/mixer.c
+++ b/sys/dev/sound/pcm/mixer.c
@@ -282,14 +282,16 @@ sysctl_hw_snd_hwvol_mixer(SYSCTL_HANDLER_ARGS)
dev = mixer_lookup(devname);
if (dev == -1)
return EINVAL;
- else
+ else if (dev != m->hwvol_mixer) {
m->hwvol_mixer = dev;
+ m->hwvol_muted = 0;
+ }
}
return error;
}
int
-mixer_hwinit(device_t dev)
+mixer_hwvol_init(device_t dev)
{
snddev_info *d;
snd_mixer *m;
@@ -307,25 +309,25 @@ mixer_hwinit(device_t dev)
}
void
-mixer_hwmute(device_t dev)
+mixer_hwvol_mute(device_t dev)
{
snddev_info *d;
snd_mixer *m;
d = device_get_softc(dev);
m = d->mixer;
- if (m->muted) {
- m->muted = 0;
- mixer_set(m, m->hwvol_mixer, m->mute_level);
+ if (m->hwvol_muted) {
+ m->hwvol_muted = 0;
+ mixer_set(m, m->hwvol_mixer, m->hwvol_mute_level);
} else {
- m->muted++;
- m->mute_level = mixer_get(m, m->hwvol_mixer);
+ m->hwvol_muted++;
+ m->hwvol_mute_level = mixer_get(m, m->hwvol_mixer);
mixer_set(m, m->hwvol_mixer, 0);
}
}
void
-mixer_hwstep(device_t dev, int left_step, int right_step)
+mixer_hwvol_step(device_t dev, int left_step, int right_step)
{
snddev_info *d;
snd_mixer *m;
@@ -333,7 +335,11 @@ mixer_hwstep(device_t dev, int left_step, int right_step)
d = device_get_softc(dev);
m = d->mixer;
- level = mixer_get(m, m->hwvol_mixer);
+ if (m->hwvol_muted) {
+ m->hwvol_muted = 0;
+ level = m->hwvol_mute_level;
+ } else
+ level = mixer_get(m, m->hwvol_mixer);
if (level != -1) {
left = level & 0xff;
right = level >> 8;
diff --git a/sys/dev/sound/pcm/mixer.h b/sys/dev/sound/pcm/mixer.h
index f7ad35c..eeed211 100644
--- a/sys/dev/sound/pcm/mixer.h
+++ b/sys/dev/sound/pcm/mixer.h
@@ -33,9 +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);
-int mixer_hwinit(device_t dev);
-void mixer_hwmute(device_t dev);
-void mixer_hwstep(device_t dev, int left_step, int right_step);
+int mixer_hwvol_init(device_t dev);
+void mixer_hwvol_mute(device_t dev);
+void mixer_hwvol_step(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);
OpenPOWER on IntegriCloud