]> code.delx.au - pulseaudio/commitdiff
alsa-mixer: Fix the assumption that volume is always positive
authorLu Guanqun <guanqun.lu@intel.com>
Thu, 26 May 2011 08:49:52 +0000 (16:49 +0800)
committerColin Guthrie <colin@mageia.org>
Mon, 30 May 2011 10:22:21 +0000 (11:22 +0100)
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

src/modules/alsa/alsa-mixer.c

index f236da0e470a4398f20aa7986b06250d1fd3a34a..03a5312a2a1a0726bc0016983cf6b17006296f65 100644 (file)
@@ -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