From 84f68e01cf7b165d69f592cba379c28f890a4a1c Mon Sep 17 00:00:00 2001
From: Conor Curran <conor.curran@canonical.com>
Date: Mon, 14 Mar 2011 19:09:46 +0000
Subject: one needed refactor

---
 src/slider-menu-item.c | 115 +++++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 102 insertions(+), 13 deletions(-)

(limited to 'src/slider-menu-item.c')

diff --git a/src/slider-menu-item.c b/src/slider-menu-item.c
index 1c88f01..270b996 100644
--- a/src/slider-menu-item.c
+++ b/src/slider-menu-item.c
@@ -23,11 +23,17 @@ with this program.  If not, see <http://www.gnu.org/licenses/>.
 #include <glib/gi18n.h>
 #include "slider-menu-item.h"
 #include "common-defs.h"
+#include "pulseaudio-mgr.h"
 
 typedef struct _SliderMenuItemPrivate SliderMenuItemPrivate;
 
 struct _SliderMenuItemPrivate {
-  ActiveSink* a_sink;
+  ActiveSink*         a_sink;
+  gint                index;
+  gchar*              name;
+  pa_cvolume          volume;
+  pa_channel_map      channel_map;
+  pa_volume_t         base_volume;
 };
 
 #define SLIDER_MENU_ITEM_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), SLIDER_MENU_ITEM_TYPE, SliderMenuItemPrivate))
@@ -39,6 +45,8 @@ static void slider_menu_item_dispose    (GObject *object);
 static void slider_menu_item_finalize   (GObject *object);
 static void handle_event (DbusmenuMenuitem * mi, const gchar * name, 
                           GVariant * value, guint timestamp);
+static pa_cvolume slider_menu_item_construct_mono_volume (const pa_cvolume* vol);
+static void slider_menu_item_update_volume (SliderMenuItem* self, gdouble percent);
 
 G_DEFINE_TYPE (SliderMenuItem, slider_menu_item, DBUSMENU_TYPE_MENUITEM);
 
@@ -63,7 +71,13 @@ slider_menu_item_init (SliderMenuItem *self)
   g_debug("Building new Slider Menu Item");
   dbusmenu_menuitem_property_set( DBUSMENU_MENUITEM(self),
                                   DBUSMENU_MENUITEM_PROP_TYPE,
-                                  DBUSMENU_VOLUME_MENUITEM_TYPE );  
+                                  DBUSMENU_VOLUME_MENUITEM_TYPE );
+
+  SliderMenuItemPrivate* priv = SLIDER_MENU_ITEM_GET_PRIVATE (self);
+
+  priv->index = -1;
+  priv->name = NULL;
+
   return;
 }
 
@@ -97,29 +111,104 @@ handle_event (DbusmenuMenuitem * mi,
       SliderMenuItemPrivate* priv = SLIDER_MENU_ITEM_GET_PRIVATE (SLIDER_MENU_ITEM (mi));
       gdouble volume_input = g_variant_get_double(input);
       //g_debug ("slider menu item about to update volume %f", volume_input);
-      active_sink_update_volume (priv->a_sink, volume_input);
+      slider_menu_item_update_volume (SLIDER_MENU_ITEM (mi), volume_input);
       active_sink_ensure_sink_is_unmuted (priv->a_sink);      
     }    
   }
 }
 
+
+void
+slider_menu_item_populate (SliderMenuItem* self, const pa_sink_info* update)
+{
+  SliderMenuItemPrivate* priv = SLIDER_MENU_ITEM_GET_PRIVATE (self);
+  priv->name = g_strdup (update->name);
+  priv->index = update->index;
+  priv->volume = slider_menu_item_construct_mono_volume (&update->volume);
+  priv->base_volume = update->base_volume;
+  priv->channel_map = update->channel_map;
+
+  pa_volume_t vol = pa_cvolume_max (&update->volume);
+  gdouble volume_percent = ((gdouble) vol * 100) / PA_VOLUME_NORM;
+  GVariant* new_volume = g_variant_new_double (volume_percent);
+  dbusmenu_menuitem_property_set_variant (DBUSMENU_MENUITEM(self),
+                                          DBUSMENU_VOLUME_MENUITEM_LEVEL,
+                                          new_volume);
+  slider_menu_item_enable (self, TRUE);
+}
+
+// From the UI
+static void
+slider_menu_item_update_volume (SliderMenuItem* self, gdouble percent)
+{
+  pa_cvolume new_volume;
+  pa_cvolume_init(&new_volume);
+  new_volume.channels = 1;
+  pa_volume_t new_volume_value = (pa_volume_t) ((percent * PA_VOLUME_NORM) / 100);
+  pa_cvolume_set(&new_volume, 1, new_volume_value);
+
+  SliderMenuItemPrivate* priv = SLIDER_MENU_ITEM_GET_PRIVATE (self);
+
+  pa_cvolume_set(&priv->volume, priv->channel_map.channels, new_volume_value);
+  pm_update_volume (priv->index, new_volume);
+}
+
+// To the UI
 void
-slider_menu_item_update (SliderMenuItem* item,
-                              gdouble update)
+slider_menu_item_update (SliderMenuItem* self, const pa_sink_info* update)
 {
-  GVariant* new_volume = g_variant_new_double(update);
-  dbusmenu_menuitem_property_set_variant(DBUSMENU_MENUITEM(item),
-                                         DBUSMENU_VOLUME_MENUITEM_LEVEL,
-                                         new_volume);
+  SliderMenuItemPrivate* priv = SLIDER_MENU_ITEM_GET_PRIVATE (self);
+
+  priv->volume = slider_menu_item_construct_mono_volume (&update->volume);
+  priv->base_volume = update->base_volume;
+  priv->channel_map = update->channel_map;
+
+  pa_volume_t vol = pa_cvolume_max (&update->volume);
+  gdouble volume_percent = ((gdouble) vol * 100) / PA_VOLUME_NORM;
+
+  GVariant* new_volume = g_variant_new_double (volume_percent);
+  dbusmenu_menuitem_property_set_variant (DBUSMENU_MENUITEM(self),
+                                          DBUSMENU_VOLUME_MENUITEM_LEVEL,
+                                          new_volume);
 }
 
+/*
+ * Enable/Disabled can be considered the equivalent of whether we have an active
+ * sink or not, let the widget have inherent state.
+ */
 void
-slider_menu_item_enable (SliderMenuItem* item,
-                              gboolean active)
+slider_menu_item_enable (SliderMenuItem* self, gboolean active)
 {
-  dbusmenu_menuitem_property_set_bool( DBUSMENU_MENUITEM(item),
+  SliderMenuItemPrivate* priv = SLIDER_MENU_ITEM_GET_PRIVATE (self);
+
+  dbusmenu_menuitem_property_set_bool (DBUSMENU_MENUITEM(self),
                                        DBUSMENU_MENUITEM_PROP_ENABLED,
-                                       active );
+                                       active);
+  if(active == FALSE){
+    priv->index = -1;
+    if(priv->name != NULL){
+      g_free(priv->name);
+      priv->name = NULL;
+    }
+  }
+}
+
+gint
+slider_menu_item_get_sink_index (SliderMenuItem* self)
+{
+  SliderMenuItemPrivate* priv = SLIDER_MENU_ITEM_GET_PRIVATE (self);
+  return priv->index;
+}
+
+static pa_cvolume
+slider_menu_item_construct_mono_volume (const pa_cvolume* vol)
+{
+  pa_cvolume new_volume;
+  pa_cvolume_init(&new_volume);
+  new_volume.channels = 1;
+  pa_volume_t max_vol = pa_cvolume_max(vol);
+  pa_cvolume_set(&new_volume, 1, max_vol);
+  return new_volume;
 }
 
 SliderMenuItem*
-- 
cgit v1.2.3


From 76ef685e00626c73f01bcb547e143fa4ec308ea8 Mon Sep 17 00:00:00 2001
From: Conor Curran <conor.curran@canonical.com>
Date: Mon, 14 Mar 2011 19:47:59 +0000
Subject: renamed active-sink to device so as the naming makes sense

---
 src/slider-menu-item.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

(limited to 'src/slider-menu-item.c')

diff --git a/src/slider-menu-item.c b/src/slider-menu-item.c
index 270b996..fb66563 100644
--- a/src/slider-menu-item.c
+++ b/src/slider-menu-item.c
@@ -28,7 +28,7 @@ with this program.  If not, see <http://www.gnu.org/licenses/>.
 typedef struct _SliderMenuItemPrivate SliderMenuItemPrivate;
 
 struct _SliderMenuItemPrivate {
-  ActiveSink*         a_sink;
+  Device*         a_sink;
   gint                index;
   gchar*              name;
   pa_cvolume          volume;
@@ -112,7 +112,7 @@ handle_event (DbusmenuMenuitem * mi,
       gdouble volume_input = g_variant_get_double(input);
       //g_debug ("slider menu item about to update volume %f", volume_input);
       slider_menu_item_update_volume (SLIDER_MENU_ITEM (mi), volume_input);
-      active_sink_ensure_sink_is_unmuted (priv->a_sink);      
+      device_ensure_sink_is_unmuted (priv->a_sink);
     }    
   }
 }
@@ -212,7 +212,7 @@ slider_menu_item_construct_mono_volume (const pa_cvolume* vol)
 }
 
 SliderMenuItem*
-slider_menu_item_new (ActiveSink* sink)
+slider_menu_item_new (Device* sink)
 { 
   SliderMenuItem *self = g_object_new(SLIDER_MENU_ITEM_TYPE, NULL);
   SliderMenuItemPrivate* priv = SLIDER_MENU_ITEM_GET_PRIVATE (self);
-- 
cgit v1.2.3


From 57e21d3708ad855333de53f31a3e1b0f93081dc2 Mon Sep 17 00:00:00 2001
From: Conor Curran <conor.curran@canonical.com>
Date: Tue, 15 Mar 2011 12:22:21 +0000
Subject: mute behaviour consistent over both sliders => go to 0 on mute and
 return to previous volume on unmute

---
 src/slider-menu-item.c | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

(limited to 'src/slider-menu-item.c')

diff --git a/src/slider-menu-item.c b/src/slider-menu-item.c
index fb66563..9551b4b 100644
--- a/src/slider-menu-item.c
+++ b/src/slider-menu-item.c
@@ -28,9 +28,10 @@ with this program.  If not, see <http://www.gnu.org/licenses/>.
 typedef struct _SliderMenuItemPrivate SliderMenuItemPrivate;
 
 struct _SliderMenuItemPrivate {
-  Device*         a_sink;
+  Device*             a_sink;
   gint                index;
   gchar*              name;
+  gboolean            mute;
   pa_cvolume          volume;
   pa_channel_map      channel_map;
   pa_volume_t         base_volume;
@@ -127,6 +128,7 @@ slider_menu_item_populate (SliderMenuItem* self, const pa_sink_info* update)
   priv->volume = slider_menu_item_construct_mono_volume (&update->volume);
   priv->base_volume = update->base_volume;
   priv->channel_map = update->channel_map;
+  priv->mute = update->mute;
 
   pa_volume_t vol = pa_cvolume_max (&update->volume);
   gdouble volume_percent = ((gdouble) vol * 100) / PA_VOLUME_NORM;
@@ -170,6 +172,14 @@ slider_menu_item_update (SliderMenuItem* self, const pa_sink_info* update)
   dbusmenu_menuitem_property_set_variant (DBUSMENU_MENUITEM(self),
                                           DBUSMENU_VOLUME_MENUITEM_LEVEL,
                                           new_volume);
+  if (priv->mute != update->mute){
+    priv->mute = update->mute;
+    g_debug ("volume menu item - update - mute = %i", update->mute);
+    GVariant* new_mute_update = g_variant_new_int32 (update->mute);
+    dbusmenu_menuitem_property_set_variant (DBUSMENU_MENUITEM(self),
+                                            DBUSMENU_VOLUME_MENUITEM_MUTE,
+                                            new_mute_update);
+  }
 }
 
 /*
-- 
cgit v1.2.3


From dec022ea93d6a120716f47efe1c5f4d4236e726b Mon Sep 17 00:00:00 2001
From: Conor Curran <conor.curran@canonical.com>
Date: Tue, 15 Mar 2011 12:46:57 +0000
Subject: ensure it observes a positive mute state at startup

---
 src/slider-menu-item.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

(limited to 'src/slider-menu-item.c')

diff --git a/src/slider-menu-item.c b/src/slider-menu-item.c
index 9551b4b..974749f 100644
--- a/src/slider-menu-item.c
+++ b/src/slider-menu-item.c
@@ -76,7 +76,7 @@ slider_menu_item_init (SliderMenuItem *self)
 
   SliderMenuItemPrivate* priv = SLIDER_MENU_ITEM_GET_PRIVATE (self);
 
-  priv->index = -1;
+  priv->index = NOT_ACTIVE;
   priv->name = NULL;
 
   return;
@@ -136,6 +136,11 @@ slider_menu_item_populate (SliderMenuItem* self, const pa_sink_info* update)
   dbusmenu_menuitem_property_set_variant (DBUSMENU_MENUITEM(self),
                                           DBUSMENU_VOLUME_MENUITEM_LEVEL,
                                           new_volume);
+  GVariant* new_mute_update = g_variant_new_int32 (update->mute);
+  dbusmenu_menuitem_property_set_variant (DBUSMENU_MENUITEM(self),
+                                          DBUSMENU_VOLUME_MENUITEM_MUTE,
+                                          new_mute_update);
+
   slider_menu_item_enable (self, TRUE);
 }
 
@@ -195,7 +200,7 @@ slider_menu_item_enable (SliderMenuItem* self, gboolean active)
                                        DBUSMENU_MENUITEM_PROP_ENABLED,
                                        active);
   if(active == FALSE){
-    priv->index = -1;
+    priv->index = NOT_ACTIVE;
     if(priv->name != NULL){
       g_free(priv->name);
       priv->name = NULL;
-- 
cgit v1.2.3