filter-apply: Add support for filter group 34/170034/2
authorSangchul Lee <sc11.lee@samsung.com>
Tue, 13 Feb 2018 04:50:04 +0000 (13:50 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Tue, 13 Feb 2018 06:25:19 +0000 (15:25 +0900)
original patches
 : 620e42074870b3bc2be19cac85044373cd30ffd6 - jeongyeon.kim@samsung.com - 2017-05-26 05:34:57 filter-apply: Add ability to pass parameters to a filter module
 : 58ba9215ea0e1aa2cda2b966464ee25b9fad1be3 - jeongyeon.kim@samsung.com - 2017-03-29 17:16:13 filter-apply: support group of filters

[Version] 11.1-19
[Issue Type] Feature

Change-Id: I08172a76179681bb0bac7f55906436119c78b24f
Signed-off-by: Sangchul Lee <sc11.lee@samsung.com>
configure.ac
packaging/pulseaudio.spec
src/Makefile.am
src/modules/module-filter-apply.c

index 509fa2c..0839c54 100644 (file)
@@ -1554,6 +1554,16 @@ AC_ARG_ENABLE(empty-pop, AC_HELP_STRING([--enable-empty-pop], [Enable empty pop
 ],[TIZEN_EMPTY_POP=no])
 AM_CONDITIONAL(TIZEN_EMPTY_POP, test "x$TIZEN_EMPTY_POP" = "xyes")
 
+AC_ARG_ENABLE(filter-group, AC_HELP_STRING([--enable-filter-group], [Enable filter group]),
+[
+    case "${enableval}" in
+        yes) TIZEN_FILTER_GROUP=yes ;;
+        no)  TIZEN_FILTER_GROUP=no ;;
+        *)   AC_MSG_ERROR(bad value ${enableval} for --enable-filter-group) ;;
+    esac
+],[TIZEN_FILTER_GROUP=no])
+AM_CONDITIONAL(TIZEN_FILTER_GROUP, test "x$TIZEN_FILTER_GROUP" = "xyes")
+
 ###################################
 #            Output               #
 ###################################
index 3330ecc..01d0feb 100644 (file)
@@ -3,7 +3,7 @@
 Name:             pulseaudio
 Summary:          Improved Linux sound server
 Version:          11.1
-Release:          18
+Release:          19
 Group:            Multimedia/Audio
 License:          LGPL-2.1
 URL:              http://pulseaudio.org
@@ -213,6 +213,7 @@ NOCONFIGURE=yes ./bootstrap.sh
         --enable-paready \
         --enable-pa-simple-ext \
         --enable-empty-pop \
+        --enable-filter-group \
 %if "%{?TIZEN_PRODUCT_TV}" == "1"
         --enable-prelink \
         --enable-lwipc \
index 1a784ba..533264b 100644 (file)
@@ -1955,6 +1955,9 @@ module_switch_on_port_available_la_LIBADD = $(MODULE_LIBADD)
 module_filter_apply_la_SOURCES = modules/module-filter-apply.c
 module_filter_apply_la_LDFLAGS = $(MODULE_LDFLAGS)
 module_filter_apply_la_LIBADD = $(MODULE_LIBADD)
+if TIZEN_FILTER_GROUP
+module_filter_apply_la_CFLAGS = -DTIZEN_FILTER_GROUP
+endif
 
 module_filter_heuristics_la_SOURCES = modules/module-filter-heuristics.c
 module_filter_heuristics_la_LDFLAGS = $(MODULE_LDFLAGS)
index c3a5c68..3c92e0e 100644 (file)
@@ -37,6 +37,9 @@
 
 #include "module-filter-apply-symdef.h"
 
+#ifdef TIZEN_FILTER_GROUP
+#define PA_PROP_FILTER_APPLY_GROUP      PA_PROP_FILTER_APPLY".%s.group"
+#endif
 #define PA_PROP_FILTER_APPLY_PARAMETERS PA_PROP_FILTER_APPLY".%s.parameters"
 #define PA_PROP_FILTER_APPLY_MOVING     "filter.apply.moving"
 #define PA_PROP_FILTER_APPLY_SET_BY_MFA "filter.apply.set_by_mfa"
@@ -58,6 +61,9 @@ static const char* const valid_modargs[] = {
 
 struct filter {
     char *name;
+#ifdef TIZEN_FILTER_GROUP
+    char *group;
+#endif
     char *parameters;
     uint32_t module_index;
     pa_sink *sink;
@@ -90,23 +96,39 @@ static unsigned filter_hash(const void *p) {
 
 static int filter_compare(const void *a, const void *b) {
     const struct filter *fa = a, *fb = b;
+#ifndef TIZEN_FILTER_GROUP
     int r;
+#endif
 
     if (fa->sink_master != fb->sink_master || fa->source_master != fb->source_master)
         return 1;
+#ifndef TIZEN_FILTER_GROUP
     if ((r = strcmp(fa->name, fb->name)))
         return r;
+#else
+    if (!pa_safe_streq(fa->name, fb->name))
+        return 1;
+    if (!pa_safe_streq(fa->group, fb->group))
+        return 1;
+#endif
 
     return 0;
 }
 
+#ifdef TIZEN_FILTER_GROUP
+static struct filter *filter_new(const char *name, const char *group, const char *parameters, pa_sink *sink, pa_source *source) {
+#else
 static struct filter *filter_new(const char *name, const char *parameters, pa_sink *sink, pa_source *source) {
+#endif
     struct filter *f;
 
     pa_assert(sink || source);
 
     f = pa_xnew(struct filter, 1);
     f->name = pa_xstrdup(name);
+#ifdef TIZEN_FILTER_GROUP
+    f->group = pa_xstrdup(group);
+#endif
     f->parameters = pa_xstrdup(parameters);
     f->sink_master = sink;
     f->source_master = source;
@@ -120,6 +142,9 @@ static struct filter *filter_new(const char *name, const char *parameters, pa_si
 static void filter_free(struct filter *f) {
     if (f) {
         pa_xfree(f->name);
+#ifdef TIZEN_FILTER_GROUP
+        pa_xfree(f->group);
+#endif
         pa_xfree(f->parameters);
         pa_xfree(f);
     }
@@ -162,6 +187,25 @@ static const char* get_filter_parameters(pa_object *o, const char *want, bool is
     return parameters;
 }
 
+#ifdef TIZEN_FILTER_GROUP
+static const char* get_filter_group(pa_object *o, const char *want, bool is_sink_input) {
+    const char *group;
+    char *prop_group;
+    pa_proplist *pl;
+
+    if (is_sink_input)
+        pl = PA_SINK_INPUT(o)->proplist;
+    else
+        pl = PA_SOURCE_OUTPUT(o)->proplist;
+
+    prop_group = pa_sprintf_malloc(PA_PROP_FILTER_APPLY_GROUP, want);
+    group = pa_proplist_gets(pl, prop_group);
+    pa_xfree(prop_group);
+
+    return group;
+}
+#endif
+
 /* This function is used to set or unset the filter related stream properties. This is necessary
  * if a stream does not have filter.apply set and is manually moved to a filter sink or source.
  * In this case, the properies must be temporarily set and removed when the stream is moved away
@@ -335,7 +379,12 @@ static void housekeeping_time_callback(pa_mainloop_api*a, pa_time_event* e, cons
         if (nothing_attached(filter)) {
             uint32_t idx;
 
+#ifndef TIZEN_FILTER_GROUP
             pa_log_debug("Detected filter %s as no longer used. Unloading.", filter->name);
+#else
+            pa_log_debug("Detected filter %s(%s) as no longer used. Unloading.", filter->name,
+                         filter->group ? filter->group : "no group");
+#endif
             idx = filter->module_index;
             pa_hashmap_remove(u->filters, filter);
             filter_free(filter);
@@ -442,7 +491,11 @@ static void move_objects_for_filter(struct userdata *u, pa_object *o, struct fil
 
 /* Note that we assume a filter will provide at most one sink and at most one
  * source (and at least one of either). */
+#ifdef TIZEN_FILTER_GROUP
+static void find_filters_for_module(struct userdata *u, pa_module *m, const char *name, const char *group, const char *parameters) {
+#else
 static void find_filters_for_module(struct userdata *u, pa_module *m, const char *name, const char *parameters) {
+#endif
     uint32_t idx;
     pa_sink *sink;
     pa_source *source;
@@ -452,7 +505,11 @@ static void find_filters_for_module(struct userdata *u, pa_module *m, const char
         if (sink->module == m) {
             pa_assert(pa_sink_is_filter(sink));
 
+#ifdef TIZEN_FILTER_GROUP
+            fltr = filter_new(name, group, parameters, sink->input_to_master->sink, NULL);
+#else
             fltr = filter_new(name, parameters, sink->input_to_master->sink, NULL);
+#endif
             fltr->module_index = m->index;
             fltr->sink = sink;
 
@@ -465,7 +522,11 @@ static void find_filters_for_module(struct userdata *u, pa_module *m, const char
             pa_assert(pa_source_is_filter(source));
 
             if (!fltr) {
+#ifdef TIZEN_FILTER_GROUP
+                fltr = filter_new(name, group, parameters, NULL, source->output_from_master->source);
+#else
                 fltr = filter_new(name, parameters, NULL, source->output_from_master->source);
+#endif
                 fltr->module_index = m->index;
                 fltr->source = source;
             } else {
@@ -495,6 +556,9 @@ static bool can_unload_module(struct userdata *u, uint32_t idx) {
 
 static pa_hook_result_t process(struct userdata *u, pa_object *o, bool is_sink_input, bool is_property_change) {
     const char *want;
+#ifdef TIZEN_FILTER_GROUP
+    const char *group;
+#endif
     const char *parameters;
     bool done_something = false;
     pa_sink *sink = NULL;
@@ -550,11 +614,20 @@ static pa_hook_result_t process(struct userdata *u, pa_object *o, bool is_sink_i
 
         /* The stream needs be moved to a filter. */
 
+#ifdef TIZEN_FILTER_GROUP
+        /* Some applications may want group of filters. (optional) */
+        group = get_filter_group(o, want, is_sink_input);
+#endif
+
         /* Some filter modules might require parameters by default.
          * (e.g 'plugin', 'label', 'control' of module-ladspa-sink) */
         parameters = get_filter_parameters(o, want, is_sink_input);
 
+#ifdef TIZEN_FILTER_GROUP
+        fltr = filter_new(want, group, parameters, sink, source);
+#else
         fltr = filter_new(want, parameters, sink, source);
+#endif
 
         if (should_group_filter(fltr) && !find_paired_master(u, fltr, o, is_sink_input)) {
             pa_log_debug("Want group filtering but don't have enough streams.");
@@ -575,7 +648,11 @@ static pa_hook_result_t process(struct userdata *u, pa_object *o, bool is_sink_i
             pa_log_debug("Loading %s with arguments '%s'", module_name, args);
 
             if ((m = pa_module_load(u->core, module_name, args))) {
+#ifdef TIZEN_FILTER_GROUP
+                find_filters_for_module(u, m, want, group, parameters);
+#else
                 find_filters_for_module(u, m, want, parameters);
+#endif
                 filter = pa_hashmap_get(u->filters, fltr);
                 done_something = true;
             }