switch: explicit route support
[staging/agl-audio-plugin.git] / node.c
diff --git a/node.c b/node.c
index e2c5007..8ebfbc1 100644 (file)
--- a/node.c
+++ b/node.c
  *
  */
 #include "node.h"
+#include "router.h"
 
 #include <pulsecore/idxset.h>
+#include <pulsecore/core-util.h>
+#include <pulsecore/pulsecore-config.h>
 
 agl_nodeset *agl_nodeset_init (struct userdata *u)
 {
@@ -129,12 +132,55 @@ agl_node *agl_node_create (struct userdata *u, agl_node *data)
                }
        }
 
-        /* TODO : register the node to the router */
-       /* agl_router_register_node (u, node); */
-
        return node;
 }
 
+void agl_node_destroy (struct userdata *u, agl_node *node)
+{
+       agl_nodeset *ns;
+
+       pa_assert (u);
+       pa_assert (node);
+       pa_assert_se (ns = u->nodeset);
+
+       pa_idxset_remove_by_index (ns->nodes, node->index);
+
+       pa_xfree (node);
+}
+
+
+agl_node_type agl_node_type_from_str (const char *str)
+{
+       agl_node_type type;
+
+       pa_assert (str);
+
+       if (pa_streq (str, "agl_radio"))
+               type = agl_radio;
+       else if (pa_streq (str, "agl_player"))
+               type = agl_player;
+       else if (pa_streq (str, "agl_navigator"))
+               type = agl_navigator;
+       else if (pa_streq (str, "agl_game"))
+               type = agl_game;
+       else if (pa_streq (str, "agl_browser"))
+               type = agl_browser;
+       else if (pa_streq (str, "agl_camera"))
+               type = agl_camera;
+       else if (pa_streq (str, "agl_phone"))
+               type = agl_phone;
+       else if (pa_streq (str, "agl_alert"))
+               type = agl_alert;
+       else if (pa_streq (str, "agl_event"))
+               type = agl_event;
+       else if (pa_streq (str, "agl_system"))
+               type = agl_system;
+       else
+               type = agl_node_type_unknown;
+
+       return type;
+}
+
 const char *agl_node_type_str (agl_node_type type)
 {
        switch (type) {
@@ -149,7 +195,7 @@ const char *agl_node_type_str (agl_node_type type)
                case agl_alert:             return "Alert";
                case agl_event:             return "Event";
                case agl_system:            return "System";
-               default:                    return "<user defined>";
+               default:                    return "default";
        }
 }
 
@@ -208,3 +254,24 @@ agl_node *agl_node_get_from_client (struct userdata *u, pa_client *client)
 
        return NULL;
 }
+
+bool agl_node_has_highest_priority (struct userdata *u, agl_node *node)
+{
+       agl_nodeset *nodeset;
+       agl_node *n;
+       int priority;
+       uint32_t index;
+
+       pa_assert (u);
+       pa_assert (node);
+       pa_assert (nodeset = u->nodeset);
+
+       priority = agl_router_get_node_priority (u, node);
+
+       PA_IDXSET_FOREACH(n, nodeset->nodes, index) {
+               if ((n != node) && (agl_router_get_node_priority (u, n) >= priority))
+                       return false;
+       }
+
+       return true;
+}