tizenaudio-sink: Support Acoustic Echo Cancellation 36/300236/2
authorJaechul Lee <jcsing.lee@samsung.com>
Thu, 19 Oct 2023 06:40:50 +0000 (15:40 +0900)
committerJaechul Lee <jcsing.lee@samsung.com>
Thu, 19 Oct 2023 06:42:08 +0000 (15:42 +0900)
tizenaudio-sink needs to be supported AEC functionality.
The code that is related to ENABLE_PREPROCESS came from tizenaudio-sink2.

[Version] 15.0.60
[Issue Type] Update

Change-Id: I148fe3492103f1b622c74bc5a5a018386f22c0e3
Signed-off-by: Jaechul Lee <jcsing.lee@samsung.com>
Makefile.am
packaging/pulseaudio-modules-tizen.spec
src/module-tizenaudio-sink.c

index 686996a..99763c8 100644 (file)
@@ -30,9 +30,13 @@ MODULE_CFLAGS = $(AM_CFLAGS) $(PACORE_CFLAGS) $(PA_CFLAGS) -D__TIZEN__
 MODULE_LDFLAGS = $(AM_LDFLAGS) $(PACORE_LDFLAGS) $(PA_LDFLAGS) -module -disable-static -avoid-version
 MODULE_LIBADD = $(AM_LIBADD) $(PACORE_LIBS) $(PA_LIBS)
 
-pulsemodlibexec_LTLIBRARIES = \
-          libhal-interface.la \
-          libcommunicator.la \
+pulsemodlibexec_LTLIBRARIES = libhal-interface.la libcommunicator.la
+
+if ENABLE_PREPROCESSOR
+pulsemodlibexec_LTLIBRARIES += libprocessor.la
+endif
+
+pulsemodlibexec_LTLIBRARIES += \
           module-tizenaudio-sink.la \
           module-tizenaudio-source.la \
           module-tizenaudio-sink2.la \
@@ -50,7 +54,7 @@ if ENABLE_ACM
 pulsemodlibexec_LTLIBRARIES += module-acm-sink.la
 endif
 if ENABLE_PREPROCESSOR
-pulsemodlibexec_LTLIBRARIES += libprocessor.la module-tizenaudio-preprocessor.la
+pulsemodlibexec_LTLIBRARIES += module-tizenaudio-preprocessor.la
 endif
 pulsemodlibexec_LTLIBRARIES += libtizenaudio-util.la
 
@@ -71,6 +75,11 @@ module_tizenaudio_sink_la_LDFLAGS = $(MODULE_LDFLAGS)
 module_tizenaudio_sink_la_LIBADD = $(MODULE_LIBADD) libhal-interface.la
 module_tizenaudio_sink_la_CFLAGS = $(MODULE_CFLAGS) -DPA_MODULE_NAME=module_tizenaudio_sink
 
+if ENABLE_PREPROCESSOR
+module_tizenaudio_sink_la_LIBADD += libprocessor.la
+module_tizenaudio_sink_la_CFLAGS += -DENABLE_PREPROCESSOR
+endif
+
 module_tizenaudio_source_la_SOURCES = src/module-tizenaudio-source.c
 module_tizenaudio_source_la_LDFLAGS = $(MODULE_LDFLAGS)
 module_tizenaudio_source_la_LIBADD = $(MODULE_LIBADD) libhal-interface.la
index 8df8f9b..9d9c2db 100644 (file)
@@ -2,7 +2,7 @@
 
 Name:             pulseaudio-modules-tizen
 Summary:          Pulseaudio modules for Tizen
-Version:          15.0.59
+Version:          15.0.60
 Release:          0
 Group:            Multimedia/Audio
 License:          LGPL-2.1+
index 3213305..7bceea0 100644 (file)
 
 #include "hal-interface.h"
 
+#ifdef ENABLE_PREPROCESSOR
+#include "preprocessor/processor-def.h"
+#include "preprocessor/processor_holder.h"
+#include "preprocessor/processor_reference.h"
+#endif
+
 PA_MODULE_AUTHOR("Tizen");
 PA_MODULE_DESCRIPTION("Tizen Audio Sink");
 PA_MODULE_VERSION(PACKAGE_VERSION);
@@ -102,6 +108,14 @@ struct userdata {
     uint64_t small_avail_count;
     uint64_t write_count;
     pa_hal_interface *hal_interface;
+
+#ifdef ENABLE_PREPROCESSOR
+    bool preprocess_state;
+    pa_msgobject *preprocessor;
+    pa_asyncmsgq *preprocessor_asyncmsgq;
+    void *holder;
+    pa_rtpoll_item *preprocessor_poll_item;
+#endif
 };
 
 static const char* const valid_modargs[] = {
@@ -283,6 +297,65 @@ static int sink_process_msg(
             *((pa_usec_t*)data) = latency;
             return 0;
         }
+#ifdef ENABLE_PREPROCESSOR
+        case PA_SINK_MESSAGE_PREPROCESSOR_REBUILD_RTPOLL: {
+            struct arguments {
+                pa_msgobject *o;
+                pa_asyncmsgq *q;
+                void *holder;
+            } *args;
+
+            args = (struct arguments *)data;
+
+            if (args) {
+                u->preprocessor = args->o;
+                u->preprocessor_asyncmsgq = args->q;
+                u->holder = args->holder;
+                u->preprocessor_poll_item = pa_rtpoll_item_new_asyncmsgq_write(u->rtpoll, PA_RTPOLL_EARLY, args->q);
+                u->preprocess_state = true;
+            } else {
+                pa_rtpoll_item_free(u->preprocessor_poll_item);
+                u->preprocessor_poll_item = NULL;
+                u->preprocessor = NULL;
+                u->holder = NULL;
+                u->preprocess_state = false;
+            }
+
+            return 0;
+        }
+        case PA_SINK_MESSAGE_SET_STATE: {
+            struct state_data {
+                pa_sink_state_t state;
+                pa_suspend_cause_t suspend_cause;
+            } state;
+
+            pa_processor_reference *reference;
+            pa_sink *sink;
+
+            state = *((struct state_data *)data);
+
+            if (!u->holder)
+                break;
+
+            reference = pa_processor_holder_get_connected_processor_reference(u->holder);
+            if (!reference)
+                break;
+
+            sink = pa_processor_reference_get_sink(reference);
+            if (!sink)
+                break;
+
+            if (sink == u->sink && state.state == PA_SINK_RUNNING) {
+                u->preprocess_state = true;
+                pa_asyncmsgq_post(u->preprocessor_asyncmsgq, u->preprocessor,
+                                    PA_SOURCE_MESSAGE_PREPROCESSOR_RESET_REFERENCE, (void *)true, 0, NULL, NULL);
+            } else {
+                u->preprocess_state = false;
+            }
+
+            break;
+        }
+#endif
     }
 
     return pa_sink_process_msg(o, code, data, offset, chunk);
@@ -402,6 +475,14 @@ static int process_render(struct userdata *u, pa_usec_t now) {
             pa_log_warn("write takes long time %" PRIu64 " : (%" PRIu64 " - %" PRIu64 ")", 10 * PA_USEC_PER_MSEC, after_write, before_write);
 
         pa_memblock_release(chunk.memblock);
+
+#ifdef ENABLE_PREPROCESSOR
+        if (u->preprocess_state) {
+            pa_asyncmsgq_post(u->preprocessor_asyncmsgq, u->preprocessor,
+                                PA_SOURCE_MESSAGE_PREPROCESSOR_PUSH_REFERENCE, u->holder, 0, &chunk, NULL);
+        }
+#endif
+
         pa_memblock_unref(chunk.memblock);
         u->timestamp += pa_bytes_to_usec(chunk.length, &u->sink->sample_spec);
         u->timestamp_written = pa_rtclock_now();