From: Jaechul Lee Date: Thu, 2 Jun 2022 02:20:43 +0000 (+0900) Subject: Improve latency difference between reference and capture source X-Git-Tag: submit/tizen/20220627.045454^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=524ffee0ef91c855368f0be0a70d335114d37c7c;p=platform%2Fcore%2Fmultimedia%2Fpulseaudio-modules-tizen.git Improve latency difference between reference and capture source * Not allow negative latency * Added mchstreamer specific code * Fixed build warning on aarch64 [Version] 15.0.21 [Issue Type] Improvement Change-Id: Idd6c4337ec6567e52dd86bbca5c194a897804b43 Signed-off-by: Jaechul Lee --- diff --git a/packaging/pulseaudio-modules-tizen.spec b/packaging/pulseaudio-modules-tizen.spec index cd1cfef..1b6d631 100644 --- a/packaging/pulseaudio-modules-tizen.spec +++ b/packaging/pulseaudio-modules-tizen.spec @@ -2,7 +2,7 @@ Name: pulseaudio-modules-tizen Summary: Pulseaudio modules for Tizen -Version: 15.0.20 +Version: 15.0.21 Release: 0 Group: Multimedia/Audio License: LGPL-2.1+ diff --git a/src/echo-cancel/algo_reference_copy.c b/src/echo-cancel/algo_reference_copy.c index 2d9cf0b..7b397ec 100644 --- a/src/echo-cancel/algo_reference_copy.c +++ b/src/echo-cancel/algo_reference_copy.c @@ -94,13 +94,22 @@ int32_t reference_copy_change_reference_spec(void *priv, pa_sample_spec *source_ pa_assert(map); channels = rc->ss.channels - source_ss->channels; - if (channels <= 0) + if (channels <= 0) { + pa_log_error("No empty channels. reference copy will be disabled"); return -1; + } + + /* TODO: temporary code for supporting mchstreamer. reference copy uses the last 2ch of its channels */ + if (rc->ss.channels == 16) + channels = 2; *sample_spec = rc->ss; sample_spec->channels = rc->reference_channels = channels; pa_channel_map_init_auto(map, channels, PA_CHANNEL_MAP_AIFF); + pa_log_info("reference will be copied to empty channels(%d). source-output ch(%d), source ch(%d)", + channels, rc->ss.channels, source_ss->channels); + return 0; } diff --git a/src/echo-cancel/module-tizenaudio-echo-cancel.c b/src/echo-cancel/module-tizenaudio-echo-cancel.c index f9e13c0..7697368 100644 --- a/src/echo-cancel/module-tizenaudio-echo-cancel.c +++ b/src/echo-cancel/module-tizenaudio-echo-cancel.c @@ -298,7 +298,7 @@ static int process_msg( /* trigger resolves a race condition related to post_process between source and render thread */ if (u->triggered) { - if (code == PA_ECHO_CANCEL_MESSAGE_PUSH_DATA || code == PA_ECHO_CANCEL_MESSAGE_PUSH_ECHO) { + if (code == PA_ECHO_CANCEL_MESSAGE_PUSH_ECHO) { pa_source_output *o = NULL; pa_usec_t latency; diff --git a/src/echo-cancel/processor.c b/src/echo-cancel/processor.c index 0052ab8..dbce5fa 100644 --- a/src/echo-cancel/processor.c +++ b/src/echo-cancel/processor.c @@ -43,6 +43,7 @@ #endif #define MEMBLOCKQ_MAXLENGTH (16 * 1024 * 1024) +#define MEMBLOCKQ_PUSH_REFERENCE_BLOCK_ALIGN typedef struct pa_processor_method_interface pa_processor_method_interface; struct pa_processor { @@ -298,14 +299,24 @@ int pa_processor_setup_reference_memblockq_padding(pa_processor *processor, pa_u pa_assert(processor); bytes = pa_usec_to_bytes(latency, &processor->reference_memblockq_ss); - n = (bytes + (processor->reference_process_bytes - 1)) / processor->reference_process_bytes; +#ifdef MEMBLOCKQ_PUSH_REFERENCE_BLOCK_ALIGN + n = (bytes + (processor->reference_process_bytes - 1)) / processor->reference_process_bytes; pa_silence_memchunk_get( &processor->core->silence_cache, processor->core->mempool, &silence, &processor->reference_memblockq_ss, processor->reference_process_bytes); +#else + n = 1; + pa_silence_memchunk_get( + &processor->core->silence_cache, + processor->core->mempool, + &silence, + &processor->reference_memblockq_ss, + bytes); +#endif write_index = pa_memblockq_get_write_index(processor->reference_memblockq); read_index = pa_memblockq_get_read_index(processor->reference_memblockq); @@ -315,9 +326,10 @@ 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. ref_process_bytes(%zu) " + pa_log_info("push n(%u) silence blocks. latency(%" PRId64 "), ref_process_bytes(%zu) " "write_index(%" PRId64 "->%" PRId64 "), read_index(%" PRId64 "->%" PRId64 ")", pa_memblockq_get_nblocks(processor->reference_memblockq), + latency, processor->reference_process_bytes, write_index, pa_memblockq_get_write_index(processor->reference_memblockq), read_index, pa_memblockq_get_read_index(processor->reference_memblockq)); diff --git a/src/tizenaudio-sink2.c b/src/tizenaudio-sink2.c index ff0dbc7..f8601ac 100644 --- a/src/tizenaudio-sink2.c +++ b/src/tizenaudio-sink2.c @@ -169,7 +169,6 @@ static int unsuspend(struct userdata *u) { u->write_count = 0; u->first = true; - u->timestamp = pa_rtclock_now(); pa_log_info("Resumed successfully..."); @@ -245,8 +244,13 @@ static int sink_process_msg( case PA_SINK_MESSAGE_GET_LATENCY: { int64_t r = 0; - if (u->pcm_handle) - r = u->timestamp + pa_bytes_to_usec(u->write_count, &u->sink->sample_spec) - pa_rtclock_now(); + if (u->pcm_handle) { + pa_usec_t now = pa_rtclock_now(); + pa_usec_t write_latency = u->timestamp + pa_bytes_to_usec(u->write_count, &u->sink->sample_spec); + + if (now < write_latency) + r = write_latency - now; + } *((int64_t *) data) = r; @@ -297,6 +301,9 @@ static int process_render(struct userdata *u) { pa_sink_render_full(u->sink, u->frag_size, &chunk); p = pa_memblock_acquire(chunk.memblock); + if (u->first) + u->timestamp = pa_rtclock_now(); + if (pa_hal_interface_pcm_write(u->hal_interface, u->pcm_handle, (const char*)p + chunk.index, (uint32_t)frames_to_write)) { pa_log_error("failed to write pcm. p(%p), size(%zu)", p, frames_to_write); return -1; diff --git a/src/tizenaudio-source2.c b/src/tizenaudio-source2.c index 846b086..948e8f0 100644 --- a/src/tizenaudio-source2.c +++ b/src/tizenaudio-source2.c @@ -248,8 +248,13 @@ static int source_process_msg( case PA_SOURCE_MESSAGE_GET_LATENCY: { uint64_t r = 0; - if (u->pcm_handle) - r = pa_rtclock_now() - (u->timestamp + pa_bytes_to_usec(u->read_count, &u->source->sample_spec)); + if (u->pcm_handle) { + pa_usec_t now = pa_rtclock_now(); + pa_usec_t read_latency = u->timestamp + pa_bytes_to_usec(u->read_count, &u->source->sample_spec); + + if (now > read_latency) + r = now - read_latency; + } *((int64_t *) data) = r;