*
*/
#include "node.h"
+#include "router.h"
#include <pulsecore/idxset.h>
+#include <pulsecore/core-util.h>
+#include <pulsecore/pulsecore-config.h>
-pa_nodeset *pa_nodeset_init (struct userdata *u)
+agl_nodeset *agl_nodeset_init (struct userdata *u)
{
- pa_nodeset *ns;
+ agl_nodeset *ns;
pa_assert (u);
- ns = pa_xnew0 (pa_nodeset, 1);
+ ns = pa_xnew0 (agl_nodeset, 1);
ns->nodes = pa_idxset_new (pa_idxset_trivial_hash_func,
pa_idxset_trivial_compare_func);
ns->roles = pa_hashmap_new (pa_idxset_string_hash_func,
return ns;
}
-void pa_nodeset_done(struct userdata *u)
+void agl_nodeset_done(struct userdata *u)
{
- pa_nodeset *ns;
- pa_nodeset_map *role, *binary;
+ agl_nodeset *ns;
+ agl_nodeset_map *role, *binary;
void *state;
int i;
}
}
+int agl_nodeset_add_role (struct userdata *u, const char *role, agl_node_type type, agl_nodeset_resdef *resdef)
+{
+ agl_nodeset *ns;
+ agl_nodeset_map *map;
+
+ pa_assert (u);
+ pa_assert_se (ns = u->nodeset);
+
+ map = pa_xnew0 (agl_nodeset_map, 1);
+ map->name = pa_xstrdup (role);
+ map->type = type;
+ map->role = pa_xstrdup (role);
+
+ if (resdef) {
+ map->resdef = pa_xnew (agl_nodeset_resdef, 1);
+ memcpy (map->resdef, resdef, sizeof(agl_nodeset_resdef));
+ }
+
+ return pa_hashmap_put (ns->roles, (void *)map->name, map);
+}
+
agl_node *agl_node_create (struct userdata *u, agl_node *data)
{
- pa_nodeset *ns;
+ agl_nodeset *ns;
agl_node *node;
pa_assert (u);
}
}
- /* 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) {
case agl_alert: return "Alert";
case agl_event: return "Event";
case agl_system: return "System";
- default: return "<user defined>";
+ default: return "default";
+ }
+}
+
+const char *agl_node_direction_str (agl_direction direction)
+{
+ switch (direction) {
+ case agl_direction_unknown: return "unknown";
+ case agl_input: return "input";
+ case agl_output: return "output";
+ default: return "< ??? >";
}
}
{
pa_sink_input_new_data *sinp_data;
pa_source_output_new_data *sout_data;
- pa_nodeset *nodeset;
+ agl_nodeset *nodeset;
agl_node *node;
uint32_t index;
agl_node *agl_node_get_from_client (struct userdata *u, pa_client *client)
{
- pa_nodeset *nodeset;
+ agl_nodeset *nodeset;
agl_node *node;
uint32_t index;
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;
+}