[Xfce4-commits] r29162 - in xfce4-mixer/branches/xfce_4_4: . lib
Danny Milosavljevic
dannym at xfce.org
Sun Jan 11 17:02:33 CET 2009
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;
More information about the Xfce4-commits
mailing list