node, discover: add zone support
authorJanos Kovacs <jankovac503@gmail.com>
Tue, 29 Jan 2013 08:19:12 +0000 (10:19 +0200)
committerJanos Kovacs <jankovac503@gmail.com>
Fri, 1 Feb 2013 21:15:07 +0000 (23:15 +0200)
murphy/discover.c
murphy/node.c
murphy/node.h
murphy/userdata.h
murphy/utils.c
murphy/utils.h

index c583f18..107edf7 100644 (file)
@@ -728,6 +728,7 @@ void pa_discover_register_sink_input(struct userdata *u, pa_sink_input *sinp)
     data.implement = mir_stream;
     data.channels  = sinp->channel_map.channels;
     data.type      = type;
+    data.zone      = pa_utils_get_zone(sinp->proplist);
     data.visible   = TRUE;
     data.available = TRUE;
     data.amname    = name;
@@ -831,6 +832,7 @@ void pa_discover_preroute_sink_input(struct userdata *u,
         fake.implement = mir_stream;
         fake.channels  = data->channel_map.channels;
         fake.type      = type;
+        fake.zone      = pa_utils_get_zone(data->proplist);
         fake.visible   = TRUE;
         fake.available = TRUE;
         fake.amname    = "<preroute sink-input>";
@@ -941,6 +943,7 @@ void pa_discover_add_sink_input(struct userdata *u, pa_sink_input *sinp)
         data.implement = mir_stream;
         data.channels  = sinp->channel_map.channels;
         data.type      = type;
+        data.zone      = pa_utils_get_zone(pl);
         data.visible   = TRUE;
         data.available = TRUE;
         data.amname    = name;
@@ -1079,6 +1082,7 @@ void pa_discover_register_source_output(struct userdata  *u,
     data.implement = mir_stream;
     data.channels  = sout->channel_map.channels;
     data.type      = type;
+    data.zone      = pa_utils_get_zone(sout->proplist);
     data.visible   = TRUE;
     data.available = TRUE;
     data.amname    = name;
@@ -1161,6 +1165,7 @@ void pa_discover_preroute_source_output(struct userdata *u,
         fake.implement = mir_stream;
         fake.channels  = data->channel_map.channels;
         fake.type      = type;
+        fake.zone      = pa_utils_get_zone(data->proplist);
         fake.visible   = TRUE;
         fake.available = TRUE;
         fake.amname    = "<preroute source-output>";
@@ -1249,6 +1254,7 @@ void pa_discover_add_source_output(struct userdata *u, pa_source_output *sout)
         data.implement = mir_stream;
         data.channels  = sout->channel_map.channels;
         data.type      = type;
+        data.zone      = pa_utils_get_zone(pl);
         data.visible   = TRUE;
         data.available = TRUE;
         data.amname    = name;
@@ -1383,12 +1389,13 @@ mir_node *pa_discover_remove_node_from_ptr_hash(struct userdata *u, void *ptr)
 
 static void handle_alsa_card(struct userdata *u, pa_card *card)
 {
-    mir_node         data;
-    const char      *udd;
-    char            *cnam;
-    char            *cid;
+    mir_node    data;
+    const char *udd;
+    char       *cnam;
+    char       *cid;
 
     memset(&data, 0, sizeof(data));
+    data.zone = pa_utils_get_zone(card->proplist);
     data.visible = TRUE;
     data.amid = AM_ID_INVALID;
     data.implement = mir_device;
@@ -1532,6 +1539,7 @@ static void handle_bluetooth_card(struct userdata *u, pa_card *card)
 
     memset(&data, 0, sizeof(data));
     data.key = key;
+    data.zone = pa_utils_get_zone(card->proplist);
     data.visible = TRUE;
     data.amid = AM_ID_INVALID;
     data.implement = mir_device;
index 7015c50..23f6f04 100644 (file)
@@ -82,6 +82,7 @@ mir_node *mir_node_create(struct userdata *u, mir_node *data)
     node->location  = data->location;
     node->privacy   = data->privacy;
     node->type      = data->type;
+    node->zone      = pa_xstrdup(data->zone);
     node->visible   = data->visible;
     node->available = data->available;
     node->amname    = pa_xstrdup(data->amname ? data->amname : data->paname);
@@ -124,6 +125,7 @@ void mir_node_destroy(struct userdata *u, mir_node *node)
         pa_idxset_remove_by_index(ns->nodes, node->index);
 
         pa_xfree(node->key);
+        pa_xfree(node->zone);
         pa_xfree(node->amname);
         pa_xfree(node->amdescr);
         pa_xfree(node->paname);
@@ -174,6 +176,7 @@ int mir_node_print(mir_node *node, char *buf, int len)
     PRINT("   location      : %s"  ,  mir_location_str(node->location));
     PRINT("   privacy       : %s"  ,  mir_privacy_str(node->privacy));
     PRINT("   type          : %s"  ,  mir_node_type_str(node->type));
+    PRINT("   zone          : '%s'",  node->zone ? node->zone : "");
     PRINT("   visible       : %s"  ,  node->visible ? "yes" : "no");
     PRINT("   available     : %s"  ,  node->available ? "yes" : "no");
     PRINT("   amname        : '%s'",  node->amname ? node->amname : "");
index 80d129d..c7e242b 100644 (file)
@@ -28,8 +28,7 @@
 #include "loopback.h"
 #include "volume.h"
 
-#define AM_ID_INVALID  65535
-
+#define AM_ID_INVALID   65535
 
 enum mir_direction {
     mir_direction_unknown,
@@ -123,6 +122,7 @@ struct mir_node {
     mir_location   location;  /**< mir_internal | mir_external */
     mir_privacy    privacy;   /**< mir_public | mir_private */
     mir_node_type  type;      /**< mir_speakers | mir_headset | ...  */
+    char          *zone;      /**< zone where the node belong */
     pa_bool_t      visible;   /**< internal or can appear on UI  */
     pa_bool_t      available; /**< eg. is the headset connected?  */
     pa_bool_t      ignore;    /**< do not consider it while routing  */
index fcb0bc3..619550e 100644 (file)
@@ -32,6 +32,7 @@
 
 #define DIM(a) (sizeof(a)/sizeof((a)[0]))
 
+#define PA_PROP_ZONE_NAME              "zone.name"
 #define PA_PROP_ROUTING_CLASS_NAME     "routing.class.name"
 #define PA_PROP_ROUTING_CLASS_ID       "routing.class.id"
 #define PA_PROP_ROUTING_METHOD         "routing.method"
@@ -40,6 +41,8 @@
 #define PA_PROP_NODE_TYPE              "node.type"
 #define PA_PROP_NODE_ROLE              "node.role"
 
+#define PA_ZONE_NAME_DEFAULT           "driver"
+
 #define PA_ROUTING_DEFAULT             "default"
 #define PA_ROUTING_EXPLICIT            "explicit"
 
index f6050e0..c613a22 100644 (file)
@@ -212,6 +212,17 @@ char *pa_utils_get_source_output_name_from_data(pa_source_output_new_data*data)
     return "<unknown>";
 }
 
+char *pa_utils_get_zone(pa_proplist *pl)
+{
+    const char *zone;
+
+    pa_assert(pl);
+
+    if (!(zone = pa_proplist_gets(pl, PA_PROP_ZONE_NAME)))
+        zone = PA_ZONE_NAME_DEFAULT;
+
+    return (char *)zone;
+}
 
 pa_bool_t pa_utils_set_stream_routing_properties(pa_proplist *pl,
                                                  int          styp,
index b33a65a..44ad0f1 100644 (file)
@@ -39,6 +39,8 @@ char *pa_utils_get_sink_input_name_from_data(pa_sink_input_new_data *);
 char *pa_utils_get_source_output_name(pa_source_output *);
 char *pa_utils_get_source_output_name_from_data(pa_source_output_new_data *);
 
+char *pa_utils_get_zone(pa_proplist *);
+
 pa_bool_t pa_utils_set_stream_routing_properties(pa_proplist *, int, void *);
 pa_bool_t pa_utils_unset_stream_routing_properties(pa_proplist *);
 void      pa_utils_set_stream_routing_method_property(pa_proplist *,pa_bool_t);