From 06fc121eef235d6102793fb69d6b8f36f0162b4a Mon Sep 17 00:00:00 2001 From: Arun Raghavan Date: Thu, 27 Oct 2011 12:49:18 +0200 Subject: [PATCH] core: Add a string list membership check function This adds a pa_str_in_list() to check for a given string in a space-separated list of strings. For now, this is merely present to avoid duplication of role matching code (intended roles can be a space-separate list) across modules. --- src/modules/module-filter-heuristics.c | 23 +---------------------- src/modules/module-intended-roles.c | 19 +------------------ src/pulsecore/core-util.c | 20 ++++++++++++++++++++ src/pulsecore/core-util.h | 1 + 4 files changed, 23 insertions(+), 40 deletions(-) diff --git a/src/modules/module-filter-heuristics.c b/src/modules/module-filter-heuristics.c index 5bb0945..e158b95 100644 --- a/src/modules/module-filter-heuristics.c +++ b/src/modules/module-filter-heuristics.c @@ -55,27 +55,6 @@ struct userdata { *source_output_move_finish_slot; }; -static pa_bool_t role_match(pa_proplist *proplist, const char *role) { - const char *ir; - char *r; - const char *state = NULL; - - if (!(ir = pa_proplist_gets(proplist, PA_PROP_DEVICE_INTENDED_ROLES))) - return FALSE; - - while ((r = pa_split_spaces(ir, &state))) { - - if (pa_streq(role, r)) { - pa_xfree(r); - return TRUE; - } - - pa_xfree(r); - } - - return FALSE; -} - static pa_hook_result_t process(struct userdata *u, pa_object *o, pa_bool_t is_sink_input) { const char *want; pa_proplist *pl, *parent_pl; @@ -93,7 +72,7 @@ static pa_hook_result_t process(struct userdata *u, pa_object *o, pa_bool_t is_s return PA_HOOK_OK; /* On phone sinks, make sure we're not applying echo cancellation */ - if (role_match(parent_pl, "phone")) { + if (pa_str_in_list_spaces(pa_proplist_gets(parent_pl, PA_PROP_DEVICE_INTENDED_ROLES), "phone")) { const char *apply = pa_proplist_gets(pl, PA_PROP_FILTER_APPLY); if (apply && pa_streq(apply, "echo-cancel")) { diff --git a/src/modules/module-intended-roles.c b/src/modules/module-intended-roles.c index 9ba893b..d1e9b81 100644 --- a/src/modules/module-intended-roles.c +++ b/src/modules/module-intended-roles.c @@ -66,24 +66,7 @@ struct userdata { }; static pa_bool_t role_match(pa_proplist *proplist, const char *role) { - const char *ir; - char *r; - const char *state = NULL; - - if (!(ir = pa_proplist_gets(proplist, PA_PROP_DEVICE_INTENDED_ROLES))) - return FALSE; - - while ((r = pa_split_spaces(ir, &state))) { - - if (pa_streq(role, r)) { - pa_xfree(r); - return TRUE; - } - - pa_xfree(r); - } - - return FALSE; + return pa_str_in_list_spaces(pa_proplist_gets(proplist, PA_PROP_DEVICE_INTENDED_ROLES), role); } static pa_hook_result_t sink_input_new_hook_callback(pa_core *c, pa_sink_input_new_data *new_data, struct userdata *u) { diff --git a/src/pulsecore/core-util.c b/src/pulsecore/core-util.c index 69986a3..79c8e08 100644 --- a/src/pulsecore/core-util.c +++ b/src/pulsecore/core-util.c @@ -2627,6 +2627,26 @@ pa_bool_t pa_in_system_mode(void) { return !!atoi(e); } +/* Checks a whitespace-separated list of words in haystack for needle */ +pa_bool_t pa_str_in_list_spaces(const char *haystack, const char *needle) { + char *s; + const char *state = NULL; + + if (!haystack || !needle) + return FALSE; + + while ((s = pa_split_spaces(haystack, &state))) { + if (pa_streq(needle, s)) { + pa_xfree(s); + return TRUE; + } + + pa_xfree(s); + } + + return FALSE; +} + char *pa_get_user_name_malloc(void) { ssize_t k; char *u; diff --git a/src/pulsecore/core-util.h b/src/pulsecore/core-util.h index 2b5fe9c..4a1c096 100644 --- a/src/pulsecore/core-util.h +++ b/src/pulsecore/core-util.h @@ -204,6 +204,7 @@ void pa_unset_env_recorded(void); pa_bool_t pa_in_system_mode(void); #define pa_streq(a,b) (!strcmp((a),(b))) +pa_bool_t pa_str_in_list_spaces(const char *needle, const char *haystack); char *pa_get_host_name_malloc(void); char *pa_get_user_name_malloc(void); -- 2.7.4