X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=node.c;h=c46f84262605ab5d09bb9e9729d5c00ecdd83af3;hb=587104e6d5dea64e7b1eb2a8687ecbc5bde98c00;hp=c6c59e2a28f6c8660d788301cf9233c2532e11bc;hpb=6c2aef81c4182695487fabbd19c5c0a84409b49f;p=staging%2Fagl-audio-plugin.git diff --git a/node.c b/node.c index c6c59e2..c46f842 100644 --- a/node.c +++ b/node.c @@ -20,16 +20,19 @@ * */ #include "node.h" +#include "router.h" #include +#include +#include -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, @@ -39,10 +42,10 @@ pa_nodeset *pa_nodeset_init (struct userdata *u) 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; @@ -68,9 +71,30 @@ void pa_nodeset_done(struct userdata *u) } } +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); @@ -108,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_music")) + 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) { @@ -128,7 +195,17 @@ 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 ""; + 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 "< ??? >"; } } @@ -136,7 +213,7 @@ agl_node *agl_node_get_from_data (struct userdata *u, agl_direction type, void * { 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; @@ -162,7 +239,7 @@ agl_node *agl_node_get_from_data (struct userdata *u, agl_direction type, void * 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; @@ -177,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; +}