echo-cancel: Allow various period size 03/286803/6
authorJaechul Lee <jcsing.lee@samsung.com>
Fri, 13 Jan 2023 05:16:45 +0000 (14:16 +0900)
committerJaechul Lee <jcsing.lee@samsung.com>
Mon, 16 Jan 2023 07:39:40 +0000 (16:39 +0900)
It allows sink's buffer size more/less than source's buffer size.
For example, it's able to set like sink 25ms, source 15ms.

[Version] 15.0.36
[Issue Type] Update

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

index 73c495b..5746218 100644 (file)
@@ -2,7 +2,7 @@
 
 Name:             pulseaudio-modules-tizen
 Summary:          Pulseaudio modules for Tizen
-Version:          15.0.35
+Version:          15.0.36
 Release:          0
 Group:            Multimedia/Audio
 License:          LGPL-2.1+
index 3442009..bfa6236 100644 (file)
@@ -461,10 +461,8 @@ static pa_hook_result_t source_output_put_cb(pa_core *c, pa_source_output *o, vo
         goto fail;
     }
 
-    if (sink_process_usec < process_usec) {
-        pa_log_error("sink process usec should be bigger than source");
-        goto fail;
-    }
+    if (sink_process_usec != process_usec)
+        pa_log_info("period size of reference and source isn't same. memchunk will be copied");
 
     o->thread_info.processor = pa_processor_new(c, process_usec / PA_USEC_PER_MSEC,
                                                 &o->sample_spec,
@@ -477,7 +475,6 @@ static pa_hook_result_t source_output_put_cb(pa_core *c, pa_source_output *o, vo
     }
 
     r = pa_processor_bind_reference(o->thread_info.processor,
-                                    sink_process_usec / PA_USEC_PER_MSEC,
                                     &u->sink->sample_spec,
                                     &u->sink->channel_map);
     if (r < 0) {
index 6670955..e7c5af9 100644 (file)
@@ -54,7 +54,9 @@ struct pa_processor {
 
     size_t process_frames;
     pa_usec_t process_usec;
-    pa_usec_t reference_process_usec;
+
+    /* process_bytes and reference_process_bytes must be same logically,
+     * but they have a different scale */
     size_t process_bytes;
     size_t reference_process_bytes;
 
@@ -213,7 +215,6 @@ pa_processor *pa_processor_new(pa_core *core,
 }
 
 int pa_processor_bind_reference(pa_processor *processor,
-                                uint32_t process_msec,
                                 pa_sample_spec *reference_ss,
                                 pa_channel_map *reference_chmap) {
 
@@ -228,13 +229,6 @@ int pa_processor_bind_reference(pa_processor *processor,
     pa_assert(reference_ss);
     pa_assert(reference_chmap);
 
-    processor->reference_process_usec = process_msec * PA_USEC_PER_MSEC;
-    if (processor->reference_process_usec < processor->process_usec) {
-        pa_log_error("Failed to bind reference. ref_usec(%" PRId64 "), process_usec(%" PRId64 ")",
-                        processor->reference_process_usec, processor->process_usec);
-        return -1;
-    }
-
     sample_spec = *processor->output_ss;
     channel_map = *processor->output_chmap;
 
@@ -263,7 +257,7 @@ int pa_processor_bind_reference(pa_processor *processor,
     }
 
     processor->reference_memblockq_ss = sample_spec;
-    processor->reference_process_bytes = pa_usec_to_bytes(processor->reference_process_usec, &processor->reference_memblockq_ss);
+    processor->reference_process_bytes = pa_usec_to_bytes(processor->process_usec, &processor->reference_memblockq_ss);
 
     /* Create memblockq */
     pa_silence_memchunk_get(&processor->core->silence_cache, processor->core->mempool, &silence, &sample_spec, 0);
@@ -282,10 +276,10 @@ int pa_processor_bind_reference(pa_processor *processor,
                                                         &silence);
     pa_memblock_unref(silence.memblock);
 
-    pa_log_debug("Created reference memblockq rate(%d), channels(%d), msec(%u), bytes(%zu)",
+    pa_log_debug("Created reference memblockq rate(%d), channels(%d), msec(%" PRId64 "), minreq bytes(%zu)",
                                                         sample_spec.rate,
                                                         sample_spec.channels,
-                                                        process_msec,
+                                                        processor->process_usec / PA_USEC_PER_MSEC,
                                                         processor->reference_process_bytes);
 
     return 0;
@@ -326,18 +320,18 @@ int pa_processor_setup_reference_memblockq_padding(pa_processor *processor, pa_u
 
     pa_memblock_unref(silence.memblock);
 
-    pa_log_info("push n(%u) silence blocks. latency(%" PRId64 "), ref_process_bytes(%zu) "
+    pa_log_info("push n(%u) silence blocks. latency(%" PRId64 "), ref_process_msec(%" PRId64 ") "
                 "write_index(%" PRId64 "->%" PRId64 "), read_index(%" PRId64 "->%" PRId64 ")",
                         pa_memblockq_get_nblocks(processor->reference_memblockq),
                         latency,
-                        processor->reference_process_bytes,
+                        pa_bytes_to_usec(processor->reference_process_bytes,
+                        &processor->reference_memblockq_ss) / PA_USEC_PER_MSEC,
                         write_index, pa_memblockq_get_write_index(processor->reference_memblockq),
                         read_index, pa_memblockq_get_read_index(processor->reference_memblockq));
 
     return 0;
 }
 
-// TODO naming
 int pa_processor_process(pa_processor *processor, pa_memchunk *chunk, pa_memchunk *ochunk) {
     int r = -1;
     int8_t *recording = NULL;
@@ -376,9 +370,9 @@ int pa_processor_process(pa_processor *processor, pa_memchunk *chunk, pa_memchun
     ochunk->length = ichunk.length;
     ochunk->memblock = pa_memblock_new(processor->core->mempool, ochunk->length);
 
-    recording = pa_memblock_acquire(ichunk.memblock);
-    reference = pa_memblock_acquire(rchunk.memblock);
-    output = pa_memblock_acquire(ochunk->memblock);
+    recording = pa_memblock_acquire_chunk(&ichunk);
+    reference = pa_memblock_acquire_chunk(&rchunk);
+    output = pa_memblock_acquire_chunk(ochunk);
 
     debug_timestamp_begin(processor);
 
@@ -397,8 +391,8 @@ int pa_processor_process(pa_processor *processor, pa_memchunk *chunk, pa_memchun
     pa_memblock_unref(ichunk.memblock);
     pa_memblockq_drop(processor->output_memblockq, ichunk.length);
 
-    pa_log_debug("Post-process. rec(%" PRIu64 "ms), ref(%" PRIu64 "msms) out(%" PRIu64 "ms), "
-                "silence(%d), windex:rindex(%" PRId64 ":%" PRId64 ")",
+    pa_log_debug("Post-process. rec(%" PRIu64 "ms), ref(%" PRIu64 "ms) out(%" PRIu64 "ms), "
+                "silence(%d), reference memblockq windex:rindex(%" PRId64 ":%" PRId64 ")",
                         pa_bytes_to_usec(ichunk.length, processor->output_ss) / PA_USEC_PER_MSEC,
                         pa_bytes_to_usec(rchunk.length, &processor->reference_memblockq_ss) / PA_USEC_PER_MSEC,
                         pa_bytes_to_usec(ochunk->length, processor->output_ss) / PA_USEC_PER_MSEC,
index 3e81c22..c93bf49 100644 (file)
@@ -51,7 +51,6 @@ pa_processor *pa_processor_new(pa_core *core,
                                 pa_sample_spec *source_ss,
                                 pa_processor_method_t method);
 int pa_processor_bind_reference(pa_processor *processor,
-                                uint32_t process_msec,
                                 pa_sample_spec *reference_ss,
                                 pa_channel_map *reference_chmap);
 int pa_processor_setup_reference_memblockq_padding(pa_processor *processor, pa_usec_t latency);