[gnome-media] Use GvcMixerCard in GvcMixerControl



commit 23beab294588afa5c26f615f0b000db2d740468e
Author: Bastien Nocera <hadess hadess net>
Date:   Mon Jul 20 17:16:48 2009 +0100

    Use GvcMixerCard in GvcMixerControl

 gnome-volume-control/src/gvc-mixer-control.c |  113 +++++++++++++++++++++++---
 gnome-volume-control/src/gvc-mixer-control.h |    8 ++
 2 files changed, 108 insertions(+), 13 deletions(-)
---
diff --git a/gnome-volume-control/src/gvc-mixer-control.c b/gnome-volume-control/src/gvc-mixer-control.c
index c78d30e..d3837f4 100644
--- a/gnome-volume-control/src/gvc-mixer-control.c
+++ b/gnome-volume-control/src/gvc-mixer-control.c
@@ -39,6 +39,7 @@
 #include "gvc-mixer-sink-input.h"
 #include "gvc-mixer-source-output.h"
 #include "gvc-mixer-event-role.h"
+#include "gvc-mixer-card.h"
 
 #define GVC_MIXER_CONTROL_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GVC_TYPE_MIXER_CONTROL, GvcMixerControlPrivate))
 
@@ -76,6 +77,8 @@ enum {
         READY,
         STREAM_ADDED,
         STREAM_REMOVED,
+        CARD_ADDED,
+        CARD_REMOVED,
         DEFAULT_SINK_CHANGED,
         DEFAULT_SOURCE_CHANGED,
         LAST_SIGNAL
@@ -241,17 +244,30 @@ gvc_mixer_control_get_default_source (GvcMixerControl *control)
         return stream;
 }
 
+static gpointer
+gvc_mixer_control_lookup_id (GHashTable *hash_table,
+                             guint       id)
+{
+        return g_hash_table_lookup (hash_table,
+                                    GUINT_TO_POINTER (id));
+}
+
 GvcMixerStream *
 gvc_mixer_control_lookup_stream_id (GvcMixerControl *control,
                                     guint            id)
 {
-        GvcMixerStream *stream;
+        g_return_val_if_fail (GVC_IS_MIXER_CONTROL (control), NULL);
+
+        return gvc_mixer_control_lookup_id (control->priv->all_streams, id);
+}
 
+GvcMixerCard *
+gvc_mixer_control_lookup_card_id (GvcMixerControl *control,
+                                  guint            id)
+{
         g_return_val_if_fail (GVC_IS_MIXER_CONTROL (control), NULL);
 
-        stream = g_hash_table_lookup (control->priv->all_streams,
-                                      GUINT_TO_POINTER (id));
-        return stream;
+        return gvc_mixer_control_lookup_id (control->priv->cards, id);
 }
 
 static void
@@ -264,6 +280,22 @@ listify_hash_values_hfunc (gpointer key,
         *list = g_slist_prepend (*list, value);
 }
 
+GSList *
+gvc_mixer_control_get_cards (GvcMixerControl *control)
+{
+        GSList *retval;
+
+        g_return_val_if_fail (GVC_IS_MIXER_CONTROL (control), NULL);
+
+        retval = NULL;
+        g_hash_table_foreach (control->priv->cards,
+                              listify_hash_values_hfunc,
+                              &retval);
+        //FIXME sort
+        return retval;
+//        return g_slist_sort (retval, (GCompareFunc) gvc_stream_collate);
+}
+
 static int
 gvc_stream_collate (GvcMixerStream *a,
                     GvcMixerStream *b)
@@ -287,6 +319,8 @@ gvc_stream_collate (GvcMixerStream *a,
         return g_utf8_collate (namea, nameb);
 }
 
+
+
 GSList *
 gvc_mixer_control_get_streams (GvcMixerControl *control)
 {
@@ -874,17 +908,21 @@ update_client (GvcMixerControl      *control,
 }
 
 static void
-update_cards (GvcMixerControl      *control,
-              const pa_card_info   *info)
+update_card (GvcMixerControl      *control,
+             const pa_card_info   *info)
 {
+        GvcMixerCard *card;
+        gboolean      is_new;
 #if 1
         guint i;
+        const char *key;
+        void *state;
 
         g_debug ("Updating card: index=%u name='%s'",
                  info->index,
                  info->name);
 
-        g_debug ("Adding card %s:", info->name);
+        g_debug ("Adding card %s (driver: %s):", info->name, info->driver);
         for (i = 0; i < info->n_profiles; i++) {
                 struct pa_card_profile_info pi = info->profiles[i];
                 gboolean is_default;
@@ -894,10 +932,39 @@ update_cards (GvcMixerControl      *control,
                          pi.name, pi.n_sources, pi.n_sinks,
                          is_default ? " (Current)" : "");
         }
+        state = NULL;
+        key = pa_proplist_iterate (info->proplist, &state);
+        while (key != NULL) {
+                g_debug ("\tProperty: '%s' = '%s'",
+                        key, pa_proplist_gets (info->proplist, key));
+                key = pa_proplist_iterate (info->proplist, &state);
+        }
 #endif
-        g_hash_table_insert (control->priv->cards,
-                             GUINT_TO_POINTER (info->index),
-                             g_strdup (info->name));
+        card = g_hash_table_lookup (control->priv->cards,
+                                    GUINT_TO_POINTER (info->index));
+        if (card == NULL) {
+                card = gvc_mixer_card_new (control->priv->pa_context,
+                                           info->index);
+                is_new = TRUE;
+        }
+
+        gvc_mixer_card_set_name (card, pa_proplist_gets (info->proplist, "device.description"));
+        gvc_mixer_card_set_icon_name (card, "rhythmbox");
+//FIXME set the icon name properly
+//        gvc_mixer_card_set_icon_name (card, pa_proplist_gets (info->proplist, "device.icon_name"));
+        gvc_mixer_card_set_profile (card, info->active_profile->name);
+        gvc_mixer_card_set_human_profile (card, info->active_profile->description);
+        //FIXME set profiles here
+
+        if (is_new) {
+                g_hash_table_insert (control->priv->cards,
+                                     GUINT_TO_POINTER (info->index),
+                                     g_object_ref (card));
+                g_signal_emit (G_OBJECT (control),
+                               signals[CARD_ADDED],
+                               0,
+                               info->index);
+        }
 }
 
 static void
@@ -1047,7 +1114,7 @@ _pa_context_get_card_info_by_index_cb (pa_context *context,
                 return;
         }
 
-        update_cards (control, i);
+        update_card (control, i);
 }
 
 static void
@@ -1339,6 +1406,11 @@ remove_card (GvcMixerControl *control,
 {
         g_hash_table_remove (control->priv->cards,
                              GUINT_TO_POINTER (index));
+
+        g_signal_emit (G_OBJECT (control),
+                       signals[CARD_REMOVED],
+                       0,
+                       index);
 }
 
 static void
@@ -1535,7 +1607,6 @@ gvc_mixer_control_ready (GvcMixerControl *control)
                                                         _pa_ext_stream_restore_subscribe_cb,
                                                         control);
 
-
                 o = pa_ext_stream_restore_subscribe (control->priv->pa_context,
                                                      1,
                                                      NULL,
@@ -1800,6 +1871,22 @@ gvc_mixer_control_class_init (GvcMixerControlClass *klass)
                               NULL, NULL,
                               g_cclosure_marshal_VOID__UINT,
                               G_TYPE_NONE, 1, G_TYPE_UINT);
+        signals [CARD_ADDED] =
+                g_signal_new ("card-added",
+                              G_TYPE_FROM_CLASS (klass),
+                              G_SIGNAL_RUN_LAST,
+                              G_STRUCT_OFFSET (GvcMixerControlClass, card_added),
+                              NULL, NULL,
+                              g_cclosure_marshal_VOID__UINT,
+                              G_TYPE_NONE, 1, G_TYPE_UINT);
+        signals [CARD_REMOVED] =
+                g_signal_new ("card-removed",
+                              G_TYPE_FROM_CLASS (klass),
+                              G_SIGNAL_RUN_LAST,
+                              G_STRUCT_OFFSET (GvcMixerControlClass, card_removed),
+                              NULL, NULL,
+                              g_cclosure_marshal_VOID__UINT,
+                              G_TYPE_NONE, 1, G_TYPE_UINT);
         signals [DEFAULT_SINK_CHANGED] =
                 g_signal_new ("default-sink-changed",
                               G_TYPE_FROM_CLASS (klass),
@@ -1836,9 +1923,9 @@ gvc_mixer_control_init (GvcMixerControl *control)
         control->priv->sources = g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify)g_object_unref);
         control->priv->sink_inputs = g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify)g_object_unref);
         control->priv->source_outputs = g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify)g_object_unref);
+        control->priv->cards = g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify)g_object_unref);
 
         control->priv->clients = g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify)g_free);
-        control->priv->cards = g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify)g_free);
 }
 
 static void
diff --git a/gnome-volume-control/src/gvc-mixer-control.h b/gnome-volume-control/src/gvc-mixer-control.h
index 3de9e62..d2f7968 100644
--- a/gnome-volume-control/src/gvc-mixer-control.h
+++ b/gnome-volume-control/src/gvc-mixer-control.h
@@ -24,6 +24,7 @@
 #include <glib-object.h>
 #include <pulse/pulseaudio.h>
 #include "gvc-mixer-stream.h"
+#include "gvc-mixer-card.h"
 
 G_BEGIN_DECLS
 
@@ -52,6 +53,10 @@ typedef struct
                                         guint            id);
         void (*stream_removed)         (GvcMixerControl *control,
                                         guint            id);
+        void (*card_added)             (GvcMixerControl *control,
+                                        guint            id);
+        void (*card_removed)           (GvcMixerControl *control,
+                                        guint            id);
         void (*default_sink_changed)   (GvcMixerControl *control,
                                         guint            id);
         void (*default_source_changed) (GvcMixerControl *control,
@@ -67,6 +72,7 @@ gboolean            gvc_mixer_control_close               (GvcMixerControl *cont
 gboolean            gvc_mixer_control_is_ready            (GvcMixerControl *control);
 
 pa_context *        gvc_mixer_control_get_pa_context      (GvcMixerControl *control);
+GSList *            gvc_mixer_control_get_cards           (GvcMixerControl *control);
 GSList *            gvc_mixer_control_get_streams         (GvcMixerControl *control);
 GSList *            gvc_mixer_control_get_sinks           (GvcMixerControl *control);
 GSList *            gvc_mixer_control_get_sources         (GvcMixerControl *control);
@@ -75,6 +81,8 @@ GSList *            gvc_mixer_control_get_source_outputs  (GvcMixerControl *cont
 
 GvcMixerStream *    gvc_mixer_control_lookup_stream_id    (GvcMixerControl *control,
                                                            guint            id);
+GvcMixerCard   *    gvc_mixer_control_lookup_card_id      (GvcMixerControl *control,
+                                                           guint            id);
 
 GvcMixerStream *    gvc_mixer_control_get_default_sink     (GvcMixerControl *control);
 GvcMixerStream *    gvc_mixer_control_get_default_source   (GvcMixerControl *control);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]