Add default_method to module parameters 83/272783/4
authorJaechul Lee <jcsing.lee@samsung.com>
Thu, 24 Mar 2022 07:57:45 +0000 (16:57 +0900)
committerJaechul Lee <jcsing.lee@samsung.com>
Mon, 28 Mar 2022 03:41:51 +0000 (12:41 +0900)
Use default method that is configured at init function if
source-output's 'echo_cancel' property is set to 'default'

[Version] 15.0.7
[Issue Type] Improvement

Change-Id: I137282f954cd01b1eb5e08aedd3f2a5a075e74d6
Signed-off-by: Jaechul Lee <jcsing.lee@samsung.com>
packaging/pulseaudio-modules-tizen.spec
src/echo-cancel/module-tizenaudio-echo-cancel.c

index 7972173..a350f73 100644 (file)
@@ -2,7 +2,7 @@
 
 Name:             pulseaudio-modules-tizen
 Summary:          Pulseaudio modules for Tizen
-Version:          15.0.6
+Version:          15.0.7
 Release:          0
 Group:            Multimedia/Audio
 License:          LGPL-2.1+
index 51216b2..f6571d1 100644 (file)
@@ -46,6 +46,7 @@ PA_MODULE_DESCRIPTION("Tizen Audio Echo Cancel");
 PA_MODULE_VERSION(PACKAGE_VERSION);
 PA_MODULE_LOAD_ONCE(true);
 PA_MODULE_USAGE(
+        "method=<name of method using for echo cancellation> "
         "blocksize=<the bytes of processing block on source domain> ");
 
 typedef struct echo_cancel pa_echo_cancel;
@@ -67,6 +68,7 @@ struct userdata {
     bool enable;
     uint32_t n_source_output;
     size_t blocksize;
+    char *default_method;
 
     pa_thread *thread;
     pa_thread_mq thread_mq;
@@ -92,8 +94,10 @@ PA_DEFINE_PRIVATE_CLASS(pa_echo_cancel, pa_msgobject);
 #define MEMBLOCKQ_MAXLENGTH (16 * 1024 * 1024)
 #define CHECK_FLAGS_AEC(x) (x & PA_SOURCE_OUTPUT_ECHO_CANCEL)
 #define CHECK_COUNT_SOURCE_OUTPUT_AEC(x) (x->n_source_output)
+#define DEFAULT_AEC_METHOD "speex"
 
 static const char* const valid_modargs[] = {
+    "method",
     "blocksize",
     NULL,
 };
@@ -113,26 +117,28 @@ static int proplist_get_fragment_size(pa_proplist *p, size_t *size) {
     return 0;
 }
 
-static pa_processor_algo_t pa_processor_get_algo(pa_source_output *o) {
-    const char *algo = pa_proplist_gets(o->proplist, "echo");
+static int pa_processor_get_method(pa_source_output *o, const char *default_method, pa_processor_algo_t *method) {
+    const char *selected, *requested;
 
-    if (!algo) {
-        pa_log_warn("Use default processor(speex)");
-        return PA_PROCESSOR_SPEEX;
-    }
+    pa_assert(method);
+    pa_assert(default_method);
 
-    if (pa_streq(algo, "adrian"))
-        return PA_PROCESSOR_ADRIAN;
-    else if (pa_streq(algo, "speex"))
-        return PA_PROCESSOR_SPEEX;
-    else if (pa_streq(algo, "webrtc"))
-        return PA_PROCESSOR_WEBRTC;
-    else if (pa_streq(algo, "auto"))
-        return PA_PROCESSOR_WEBRTC;
-    else {
-        pa_log_warn("invalid algo(%s), Use default processor(speex)", algo);
-        return PA_PROCESSOR_SPEEX;
-    }
+    requested = pa_proplist_gets(o->proplist, "echo_cancel");
+    if (!requested)
+        return -1;
+
+    selected = pa_streq(requested, "default") ? default_method : requested;
+
+    if (pa_streq(selected, "webrtc"))
+        *method = PA_PROCESSOR_WEBRTC;
+    else if (pa_streq(selected, "speex"))
+        *method = PA_PROCESSOR_SPEEX;
+    else if (pa_streq(selected, "adrian"))
+        *method = PA_PROCESSOR_ADRIAN;
+    else
+        *method = PA_PROCESSOR_SPEEX;
+
+    return 0;
 }
 
 static pa_source_output *find_source_output_by_flags(pa_source *s) {
@@ -561,13 +567,14 @@ static int process_msg(
 
 static pa_hook_result_t source_output_new_cb(pa_core *c, pa_source_output_new_data *data, void *userdata) {
     struct userdata *u = (struct userdata *)userdata;
-    const char *echo = pa_proplist_gets(data->proplist, "echo");
+    const char *echo_cancel;
 
     pa_assert(c);
-    pa_assert(data);
     pa_assert(u);
+    pa_assert(data);
 
-    if (!echo)
+    echo_cancel = pa_proplist_gets(data->proplist, "echo_cancel");
+    if (!echo_cancel)
         return PA_HOOK_OK;
 
     if (CHECK_COUNT_SOURCE_OUTPUT_AEC(u) > 0) {
@@ -653,7 +660,7 @@ static int check_latency_validation(struct userdata *u, pa_sink *sink, pa_source
 static pa_hook_result_t source_output_put_cb(pa_core *c, pa_source_output *o, void *userdata) {
     struct userdata *u = (struct userdata *)userdata;
     size_t blocksize = u->blocksize;
-    pa_processor_algo_t backend;
+    pa_processor_algo_t method;
 
     pa_assert(c);
     pa_assert(o);
@@ -690,10 +697,14 @@ static pa_hook_result_t source_output_put_cb(pa_core *c, pa_source_output *o, vo
     if (o->thread_info.resampler)
         blocksize = pa_resampler_result(o->thread_info.resampler, blocksize);
 
-    backend = pa_processor_get_algo(o);
+    if (pa_processor_get_method(o, u->default_method, &method)) {
+        pa_log_error("Can't find method");
+        goto fail;
+    }
+
     o->thread_info.processor = pa_processor_new(blocksize / pa_frame_size(&o->sample_spec),
                                                 &o->sample_spec,
-                                                backend, PA_PROCESSOR_FLAGS_ECHO_CANCEL);
+                                                method, PA_PROCESSOR_FLAGS_ECHO_CANCEL);
     if (!o->thread_info.processor) {
         pa_log_error("Failed to create pa_processor. echo-cancellation will be disabled");
         goto fail;
@@ -879,6 +890,7 @@ int pa__init(pa_module *m) {
     u->core = m->core;
     u->m = m;
     u->blocksize = blocksize;
+    u->default_method = pa_xstrdup(pa_modargs_get_value(ma, "method", DEFAULT_AEC_METHOD));
 
     u->echo_cancel = pa_msgobject_new(pa_echo_cancel);
     u->echo_cancel->parent.process_msg = process_msg;
@@ -988,6 +1000,7 @@ void pa__done(pa_module *m) {
 
     pa_thread_mq_done(&u->thread_mq);
 
+    pa_xfree(u->default_method);
     pa_xfree(u);
 }