← Back to team overview

ayatana-commits team mailing list archive

[Merge] lp:~cjcurran/indicator-sound/panning_bug_fix into lp:indicator-sound

 

Conor Curran has proposed merging lp:~cjcurran/indicator-sound/panning_bug_fix into lp:indicator-sound.

Requested reviews:
  Indicator Applet Developers (indicator-applet-developers)

-- 
https://code.launchpad.net/~cjcurran/indicator-sound/panning_bug_fix/+merge/23948
Your team ayatana-commits is subscribed to branch lp:indicator-sound.
=== modified file 'src/indicator-sound.c'
--- src/indicator-sound.c	2010-04-14 16:13:43 +0000
+++ src/indicator-sound.c	2010-04-22 17:01:20 +0000
@@ -117,10 +117,11 @@
 static gint current_state = 0;
 static gint previous_state = 0;
 
-static gdouble initial_volume_percent = 0;
+static gdouble initial_volume_percent;
 static gboolean initial_mute ;
 static gboolean device_available;
-static gboolean slider_in_direct_use = FALSE;
+static gboolean slider_in_direct_use;
+static gdouble exterior_vol_update;
 
 static GtkIconSize design_team_size;
 static gint blocked_id;
@@ -163,6 +164,7 @@
     initial_mute = FALSE;
     device_available = TRUE;
     slider_in_direct_use = FALSE;
+    exterior_vol_update = 0;
 
 	g_signal_connect(G_OBJECT(self->service), INDICATOR_SERVICE_MANAGER_SIGNAL_CONNECTION_CHANGE, G_CALLBACK(connection_changed), self);
     return;
@@ -551,6 +553,7 @@
         // DEBUG
         gdouble current_value = gtk_range_get_value(range);
         g_debug("SIGNAL- update sink volume - current_value : %f and new value : %f", current_value, volume_percent);
+        exterior_vol_update = volume_percent;
         gtk_range_set_value(range, volume_percent);
         determine_state_from_volume(volume_percent);
     }
@@ -597,6 +600,10 @@
 static gboolean value_changed_event_cb(GtkRange *range, gpointer user_data)
 {
     gdouble current_value =  CLAMP(gtk_range_get_value(range), 0, 100);
+    if(current_value == exterior_vol_update){   
+        g_debug("ignore the value changed event - its come from the outside");
+        return FALSE;
+    }
     DbusmenuMenuitem *item = (DbusmenuMenuitem*)user_data;
     GValue value = {0};
     g_value_init(&value, G_TYPE_DOUBLE);
@@ -623,7 +630,6 @@
 }
 
 
-
 /**
 key_press_cb:
 **/

=== modified file 'src/pulse-manager.c'
--- src/pulse-manager.c	2010-03-31 11:40:08 +0000
+++ src/pulse-manager.c	2010-04-22 17:01:20 +0000
@@ -46,6 +46,18 @@
 static gboolean determine_sink_availability();
 static void reconnect_to_pulse();
 
+static gboolean has_volume_changed(const pa_sink_info* new_sink, sink_info* cached_sink);
+/*static gdouble construct_volume_with_respect_to_balance(pa_cvolume* new_vol, pa_cvolume* cached_vol, pa_channel_map* cached_map);*/
+
+
+enum {
+    VOLUME,
+    BALANCE,
+    FADE,
+    LFE,
+};
+
+#define NUM_TYPES LFE + 1
 
 /**
 Refactoring notes
@@ -223,25 +235,38 @@
     if(pa_server_available == FALSE)
         return;   
     g_debug("in the pulse manager:set_sink_volume with percent %f", percent);
+
     if(DEFAULT_SINK_INDEX < 0)
     {
         g_warning("We have no default sink !!! - returning after not attempting to set any volume of any sink");
         return;
     }
 
-    sink_info *s = g_hash_table_lookup(sink_hash, GINT_TO_POINTER(DEFAULT_SINK_INDEX));   
-
+    sink_info *s = g_hash_table_lookup(sink_hash, GINT_TO_POINTER(DEFAULT_SINK_INDEX));
+    pa_volume_t cached_volume = pa_cvolume_max(&s->volume);
     pa_volume_t new_volume = (pa_volume_t) ((percent * PA_VOLUME_NORM) / 100);
-    g_debug("new_volume double check :%f", pa_sw_volume_to_linear(new_volume));
-    g_debug("new volume calculated :%f", (gdouble)new_volume);
-    pa_cvolume dev_vol;
-    pa_cvolume_set(&dev_vol, s->volume.channels, new_volume);   
-    s->volume = dev_vol;
-    pa_operation_unref(pa_context_set_sink_volume_by_index(pulse_context, DEFAULT_SINK_INDEX, &dev_vol, NULL, NULL));
-    
+    pa_volume_t difference = 0;
+
+    if( cached_volume > new_volume ){
+        g_debug("I'm moving down down ...");
+        difference = cached_volume - new_volume;
+        pa_cvolume_dec(&s->volume, difference);        
+    }
+    else if ( cached_volume < new_volume ){
+        g_debug("I'm moving up up ...");
+        difference = new_volume - cached_volume;
+        pa_cvolume_inc(&s->volume, difference);                
+    }
+
+    g_debug("Calculated difference : %f", (gdouble)difference);
+    g_debug("new_volume calculated from percentage input :%f", pa_sw_volume_to_linear(new_volume));
+    g_debug("new volume calculated from resultant output :%f", pa_sw_volume_to_linear(pa_cvolume_max(&s->volume)));
+
+    pa_operation_unref(pa_context_set_sink_volume_by_index(pulse_context, DEFAULT_SINK_INDEX, &s->volume, NULL, NULL));
 }
 
 
+
 /**********************************************************************************************************************/
 //    Pulse-Audio asychronous call-backs
 /**********************************************************************************************************************/
@@ -373,9 +398,18 @@
         s->name = g_strdup(info->name);
         gboolean mute_changed = s->mute != !!info->mute;
         s->mute = !!info->mute;
-        gboolean volume_changed = (pa_cvolume_equal(&info->volume, &s->volume) == 0);
+        g_debug("new balance : %i", (int)(pa_cvolume_get_balance(&info->volume, &info->channel_map) * 100));
+        g_debug("cached balance : %i", (int)(pa_cvolume_get_balance(&s->volume, &s->channel_map) * 100));
+        g_debug("update_sink_info: new_volume input : %f", (gdouble)(pa_cvolume_avg(&info->volume)));
+        g_debug("update sink info: cached volume is at: %f", (gdouble)(pa_cvolume_avg(&s->volume)));
+        gboolean volume_changed = has_volume_changed(info, s);
+
+        g_debug("update sink info : volume changed = %i", volume_changed);
+        g_debug("update sink info : compatibility = %i", pa_cvolume_compatible_with_channel_map(&info->volume, &s->channel_map));
+
         s->volume = info->volume;
-        s->base_volume = info->base_volume;
+        s->channel_map = info->channel_map;
+        
         if(DEFAULT_SINK_INDEX == s->index)
         {
             //update the UI
@@ -409,6 +443,7 @@
         value->name = g_strdup(info->name);
         value->mute = !!info->mute;
         value->volume = info->volume;
+        value->channel_map = info->channel_map;
         value->base_volume = info->base_volume;
         g_hash_table_insert(sink_hash, GINT_TO_POINTER(value->index), value);
         g_debug("pulse-manager:update_sink_info -> After adding a new sink to our hash");
@@ -417,6 +452,21 @@
 }
 
 
+static gboolean has_volume_changed(const pa_sink_info* new_sink, sink_info* cached_sink)
+{
+    if(pa_cvolume_compatible_with_channel_map(&new_sink->volume, &cached_sink->channel_map) == FALSE)
+        return FALSE;
+
+    if(pa_cvolume_equal(&new_sink->volume, &cached_sink->volume) == TRUE)
+        return FALSE;
+
+    if((int)(pa_cvolume_get_balance(&new_sink->volume, &new_sink->channel_map) * 100) != (int)(pa_cvolume_get_balance(&cached_sink->volume, &cached_sink->channel_map) * 100))
+        return FALSE;
+
+    return TRUE;
+}
+
+
 static void pulse_server_info_callback(pa_context *c, const pa_server_info *info, void *userdata)
 {
     g_debug("server info callback");


Follow ups