summaryrefslogtreecommitdiffstats
path: root/src/modules/alsa
diff options
context:
space:
mode:
authorLu Guanqun <guanqun.lu@intel.com>2011-05-26 16:49:52 +0800
committerColin Guthrie <colin@mageia.org>2011-05-30 11:22:21 +0100
commit6efa693fe7628b74cb0d97af03fba55b0b4b9d0d (patch)
treee9e1ac43b2cfbad6ef27893234f2f1774bce783b /src/modules/alsa
parentb0f5b8d2fab347a062fa6ed34ff2908a1c29a41d (diff)
alsa-mixer: Fix the assumption that volume is always positive
Add a variable to track whether the actual volume is set or not. Suppose this: min volume: -126 max volume: 0 then when user wants to set some constant volume to -10, it would fail. While the alsa values are typically positive, some values are "funky" and have negative values. It is desirable to fix this at the alsa level so that the numbers are positive, but it's not technically invalid, and thus we have to support it. Discussed here: http://thread.gmane.org/gmane.comp.audio.pulseaudio.general/9832 and http://thread.gmane.org/gmane.linux.alsa.devel/85459
Diffstat (limited to 'src/modules/alsa')
-rw-r--r--src/modules/alsa/alsa-mixer.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/src/modules/alsa/alsa-mixer.c b/src/modules/alsa/alsa-mixer.c
index f236da0e..03a5312a 100644
--- a/src/modules/alsa/alsa-mixer.c
+++ b/src/modules/alsa/alsa-mixer.c
@@ -1092,6 +1092,7 @@ static int element_set_constant_volume(pa_alsa_element *e, snd_mixer_t *m) {
snd_mixer_selem_id_t *sid = NULL;
int r = 0;
long volume = -1;
+ pa_bool_t volume_set = FALSE;
pa_assert(m);
pa_assert(e);
@@ -1105,6 +1106,7 @@ static int element_set_constant_volume(pa_alsa_element *e, snd_mixer_t *m) {
switch (e->volume_use) {
case PA_ALSA_VOLUME_OFF:
volume = e->min_volume;
+ volume_set = TRUE;
break;
case PA_ALSA_VOLUME_ZERO:
@@ -1112,18 +1114,20 @@ static int element_set_constant_volume(pa_alsa_element *e, snd_mixer_t *m) {
long dB = 0;
volume = decibel_fix_get_step(e->db_fix, &dB, +1);
+ volume_set = TRUE;
}
break;
case PA_ALSA_VOLUME_CONSTANT:
volume = e->constant_volume;
+ volume_set = TRUE;
break;
default:
pa_assert_not_reached();
}
- if (volume >= 0) {
+ if (volume_set) {
if (e->direction == PA_ALSA_DIRECTION_OUTPUT)
r = snd_mixer_selem_set_playback_volume_all(me, volume);
else