Author: dannym
Date: 2009-01-11 16:02:32 +0000 (Sun, 11 Jan 2009)
New Revision: 29162

Modified:
   xfce4-mixer/branches/xfce_4_4/ChangeLog
   xfce4-mixer/branches/xfce_4_4/lib/vc_alsa.c
Log:
apply patch to honor left/right balance from Oliver (fixes bug# 2611).

Modified: xfce4-mixer/branches/xfce_4_4/ChangeLog
===================================================================
--- xfce4-mixer/branches/xfce_4_4/ChangeLog     2009-01-11 16:01:23 UTC (rev 
29161)
+++ xfce4-mixer/branches/xfce_4_4/ChangeLog     2009-01-11 16:02:32 UTC (rev 
29162)
@@ -1,3 +1,11 @@
+2009-01-11 17:02  dannym
+
+       * apply patch to honor left/right balance.
+
+2009-01-11 17:00  dannym
+
+       * fix "lib/vc_alsa.c" memory leak.
+
 2009-01-11 15:47  dannym
 
        * add "src/xfce4-mixer.desktop.in".

Modified: xfce4-mixer/branches/xfce_4_4/lib/vc_alsa.c
===================================================================
--- xfce4-mixer/branches/xfce_4_4/lib/vc_alsa.c 2009-01-11 16:01:23 UTC (rev 
29161)
+++ xfce4-mixer/branches/xfce_4_4/lib/vc_alsa.c 2009-01-11 16:02:32 UTC (rev 
29162)
@@ -232,6 +232,16 @@
        return elem;
 }
 
+static double calculate_balance_ratio(long left, long right)
+{
+       return (left != right) ? (left > right ? (double)left / right : 0 
-(double)right / left) : 0;
+}
+
+static long calculate_volume_delta(long left, long right, long new)
+{
+       return new - ((left + right) >> 1);
+}
+
 static int vc_get_volume(char const *which)
 {
        int playback_enable;
@@ -315,10 +325,11 @@
        long playback_max;
        long capture_min;
        long capture_max;
-       long playback_value;
+       long delta;
+       long playback_value, playback_value_left, playback_value_right;
        long capture_value;
-       double playback_value_double;
-       double capture_value_double;
+       long playback_value_current_left, playback_value_current_right;
+       static double balance;
 
        /*snd_mixer_selem_channel_id_t chn;*/
        snd_mixer_elem_t *xelem;
@@ -335,34 +346,43 @@
 
        snd_mixer_selem_get_playback_volume_range (xelem, &playback_min, 
&playback_max);
        snd_mixer_selem_get_capture_volume_range (xelem, &capture_min, 
&capture_max);
+       snd_mixer_selem_get_playback_volume(xelem, SND_MIXER_SCHN_FRONT_LEFT, 
&playback_value_current_left);
+       snd_mixer_selem_get_playback_volume(xelem, SND_MIXER_SCHN_FRONT_RIGHT, 
&playback_value_current_right);
 
+       if (playback_value_current_left && playback_value_current_right) {
+               balance = calculate_balance_ratio(playback_value_current_left, 
playback_value_current_right);
+       }
+
        playback_min = 0;
        capture_min = 0;
 
        /*vol_p = (lval - pmin) * 100 / (pmax - pmin);*/
-       playback_value_double = vol_p;
-       capture_value_double = vol_p;
-       if (vol_p != 0) {
-               playback_value_double += 0.999999;
-               capture_value_double += 0.999999;
-       }
-               
-       playback_value = (long) playback_min + (playback_value_double) * 
(playback_max - playback_min) / 100;
-       capture_value = (long) capture_min + (capture_value_double) * 
(capture_max - capture_min) / 100;
+       playback_value = (long)(((double)(vol_p *playback_max) /100) +0.5);
+       capture_value = (long)(((double)(vol_p *capture_max) /100) +0.5);
 
+       delta = calculate_volume_delta(playback_value_current_left, 
playback_value_current_right, playback_value);
+
+       /* FIXME
+        * This doesn't always work perfectly, due to rounding delta might 
endup being +1 instead of 0.
+        * Though not audiable, it might be visible on the slider.
+        */
+       playback_value_left = playback_value_current_left +delta;
+       playback_value_right = playback_value_current_right +delta;
+
+       /* TODO
+        * Clipping top and bottom isn't respected yet.
+        */
+
        /*
        snd_mixer_selem_get_playback_switch(Ex_elem, SND_MIXER_SCHN_MONO, 
&status);
        */
        
-       /* use _all functions for sami's card ... */
-       if (playback_value == 0) /* mute */
-               snd_mixer_selem_set_playback_switch_all (xelem, 0);
-       else /* unmute, just in case. */
-               snd_mixer_selem_set_playback_switch_all (xelem, 1);
-               
-       snd_mixer_selem_set_playback_volume_all (xelem, playback_value);
+       snd_mixer_selem_set_playback_switch(xelem, SND_MIXER_SCHN_FRONT_LEFT, 
playback_value_left);
+       snd_mixer_selem_set_playback_switch(xelem, SND_MIXER_SCHN_FRONT_RIGHT, 
playback_value_right);
+
+       snd_mixer_selem_set_playback_volume(xelem, SND_MIXER_SCHN_FRONT_LEFT, 
playback_value_left);
+       snd_mixer_selem_set_playback_volume(xelem, SND_MIXER_SCHN_FRONT_RIGHT, 
playback_value_right);
        snd_mixer_selem_set_capture_volume_all (xelem, capture_value);
-
 #if 0          
        for (chn = 0; chn <= SND_MIXER_SCHN_LAST; chn++) {
                if (!snd_mixer_selem_has_playback_channel(xelem, chn)) continue;

_______________________________________________
Xfce4-commits mailing list
Xfce4-commits@xfce.org
http://foo-projects.org/mailman/listinfo/xfce4-commits

Reply via email to