[Xfce4-commits] <xfce4-mixer:master> Populate the mixer with whitelisted controls by default (bug #4945)

Guido Berhoerster noreply at xfce.org
Thu Sep 27 16:46:19 CEST 2012


Updating branch refs/heads/master
         to 4f8aa9895a40baa7151d441b60c092c00d7c18f6 (commit)
       from 46d08678f7a1cbeb3970c03b5a91e55ec284a1ec (commit)

commit 4f8aa9895a40baa7151d441b60c092c00d7c18f6
Author: Guido Berhoerster <guido+xfce at berhoerster.name>
Date:   Thu Sep 27 16:31:08 2012 +0200

    Populate the mixer with whitelisted controls by default (bug #4945)
    
    Populate the mixer with whitelisted controls in the absence of an existing
    configuration. Select controls either based on the whitelist flag for mixers
    that support it or fall back to a static whitelist.

 NEWS                                   |    2 +
 libxfce4mixer/libxfce4mixer.c          |   80 ++++++++++++++++++++++++++++++--
 libxfce4mixer/libxfce4mixer.h          |    1 +
 libxfce4mixer/xfce-mixer-preferences.c |   59 +++++++++++++++++++-----
 4 files changed, 126 insertions(+), 16 deletions(-)

diff --git a/NEWS b/NEWS
index f2e2825..6d04cab 100644
--- a/NEWS
+++ b/NEWS
@@ -26,6 +26,8 @@
   muting (bug #5314).
 - Set the main window to normal rather than dialog type (bug #7623).
 - Keep the sound card and controls in sync between the mixer and xfconf.
+- Populate the mixer with whitelisted controls in the absence of an existing
+  configuration (bug #4945).
 
 
 4.8.0
diff --git a/libxfce4mixer/libxfce4mixer.c b/libxfce4mixer/libxfce4mixer.c
index 7bb9293..6ca9466 100644
--- a/libxfce4mixer/libxfce4mixer.c
+++ b/libxfce4mixer/libxfce4mixer.c
@@ -42,10 +42,25 @@ static void     _xfce_mixer_destroy_mixer (GstMixer *mixer);
 
 
 
-static guint       refcount = 0;
-static GList      *mixers = NULL;
-static GstBus     *bus = NULL;
-static GstElement *selected_card = NULL;
+static guint        refcount = 0;
+static GList       *mixers = NULL;
+static GstBus      *bus = NULL;
+static GstElement  *selected_card = NULL;
+static const gchar *tracks_whitelist[] =
+{
+  "cd",
+  "digital output",
+  "front",
+  "headphone",
+  "line",
+  "master",
+  "mic",
+  "pcm",
+  "recording",
+  "speaker",
+  "volume",
+  NULL
+};
 
 
 
@@ -235,6 +250,63 @@ xfce_mixer_get_default_track (GstElement *card)
 
 
 
+GList *
+xfce_mixer_get_default_track_list (GstElement *card)
+{
+  gboolean       mixer_has_whitelist = FALSE;
+  const GList   *iter;
+  GList         *track_list = NULL;
+  GstMixerTrack *track;
+  gchar         *track_label;
+  gchar         *track_label_lower;
+  gint           i;
+
+  g_return_val_if_fail (GST_IS_MIXER (card), NULL);
+
+  if (gst_mixer_get_mixer_flags (GST_MIXER (card)) & GST_MIXER_FLAG_HAS_WHITELIST)
+    mixer_has_whitelist = TRUE;
+
+  for (iter = gst_mixer_list_tracks (GST_MIXER (card)); iter != NULL; iter = g_list_next (iter))
+    {
+      track = GST_MIXER_TRACK (iter->data);
+
+      /* Use the whitelist flag when available and fall back to a static whitelist */
+      if (mixer_has_whitelist)
+        {
+          if (GST_MIXER_TRACK_HAS_FLAG (track, GST_MIXER_TRACK_WHITELIST))
+            track_list = g_list_prepend (track_list, track);
+        }
+      else
+        {
+          track_label = NULL;
+
+          if (g_object_class_find_property (G_OBJECT_GET_CLASS (track), "untranslated-label"))
+            g_object_get (track, "untranslated-label", &track_label, NULL);
+
+          if (track_label == NULL)
+            g_object_get (track, "label", &track_label, NULL);
+
+          track_label_lower = g_utf8_strdown (track_label, -1);
+
+          for (i = 0; tracks_whitelist[i] != NULL; ++i)
+            {
+              if (strstr (track_label_lower, tracks_whitelist[i]) != NULL)
+                {
+                  track_list = g_list_prepend (track_list, track);
+                  break;
+                }
+            }
+
+          g_free (track_label_lower);
+          g_free (track_label);
+        }
+    }
+
+  return track_list;
+}
+
+
+
 guint
 xfce_mixer_bus_connect (GCallback callback,
                         gpointer  user_data)
diff --git a/libxfce4mixer/libxfce4mixer.h b/libxfce4mixer/libxfce4mixer.h
index 187db3f..473817c 100644
--- a/libxfce4mixer/libxfce4mixer.h
+++ b/libxfce4mixer/libxfce4mixer.h
@@ -49,6 +49,7 @@ void           xfce_mixer_select_card            (GstElement    *card);
 GstMixerTrack *xfce_mixer_get_track              (GstElement    *card,
                                                   const gchar   *track_name);
 GstMixerTrack *xfce_mixer_get_default_track      (GstElement    *card);
+GList         *xfce_mixer_get_default_track_list (GstElement    *card);
 guint          xfce_mixer_bus_connect            (GCallback      callback,
                                                   gpointer       user_data);
 void           xfce_mixer_bus_disconnect         (guint          signal_handler_id);
diff --git a/libxfce4mixer/xfce-mixer-preferences.c b/libxfce4mixer/xfce-mixer-preferences.c
index 2cb7edb..21faefc 100644
--- a/libxfce4mixer/xfce-mixer-preferences.c
+++ b/libxfce4mixer/xfce-mixer-preferences.c
@@ -44,17 +44,18 @@ enum
 
 
 
-static void   xfce_mixer_preferences_class_init        (XfceMixerPreferencesClass *klass);
-static void   xfce_mixer_preferences_init              (XfceMixerPreferences      *preferences);
-static void   xfce_mixer_preferences_finalize          (GObject                   *object);
-static void   xfce_mixer_preferences_get_property      (GObject                   *object,
-                                                        guint                      prop_id,
-                                                        GValue                    *value,
-                                                        GParamSpec                *pspec);
-static void   xfce_mixer_preferences_set_property      (GObject                   *object,
-                                                        guint                      prop_id,
-                                                        const GValue              *value,
-                                                        GParamSpec                *pspec);
+static void       xfce_mixer_preferences_class_init         (XfceMixerPreferencesClass *klass);
+static void       xfce_mixer_preferences_init               (XfceMixerPreferences      *preferences);
+static void       xfce_mixer_preferences_finalize           (GObject                   *object);
+static void       xfce_mixer_preferences_get_property       (GObject                   *object,
+                                                             guint                      prop_id,
+                                                             GValue                    *value,
+                                                             GParamSpec                *pspec);
+static void       xfce_mixer_preferences_set_property       (GObject                   *object,
+                                                             guint                      prop_id,
+                                                             const GValue              *value,
+                                                             GParamSpec                *pspec);
+static GPtrArray *xfce_mixer_preferences_get_default_tracks (XfceMixerPreferences *preferences);
 
 
 
@@ -305,7 +306,7 @@ xfce_mixer_preferences_set_property (GObject      *object,
             }
         }
       else
-        preferences->controls = g_ptr_array_new ();
+        preferences->controls = xfce_mixer_preferences_get_default_tracks (preferences);
       break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -381,3 +382,37 @@ xfce_mixer_preferences_get_control_visible (XfceMixerPreferences *preferences,
   return visible;
 }
 
+
+
+static GPtrArray *
+xfce_mixer_preferences_get_default_tracks (XfceMixerPreferences *preferences)
+{
+  GList      *track_list;
+  GList      *iter;
+  GPtrArray  *tracks;
+  GstElement *card;
+  gchar      *track_label;
+  GValue     *value;
+
+  tracks = g_ptr_array_new ();
+
+  if (preferences->sound_card != NULL)
+    {
+      card = xfce_mixer_get_card (preferences->sound_card);
+
+      if (GST_IS_MIXER (card))
+        {
+          track_list = xfce_mixer_get_default_track_list (card);
+          for (iter = track_list; iter != NULL; iter = g_list_next (iter))
+            {
+              value = g_value_init (g_new0 (GValue, 1), G_TYPE_STRING);
+              g_object_get (G_OBJECT (iter->data), "label", &track_label, NULL);
+              g_value_take_string (value, track_label);
+              g_ptr_array_add (tracks, value);
+            }
+        }
+    }
+
+  return tracks;
+}
+


More information about the Xfce4-commits mailing list