From 4cacb1b670f61650d0b5495b59359fae00e6e497 Mon Sep 17 00:00:00 2001 From: Arun Raghavan Date: Wed, 5 Oct 2011 13:41:43 +0530 Subject: [PATCH] echo-cancel: Increase threshold for resyncing, make it configurable This increase the threshold for difference between the playback and capture stream before samples are dropped from 1ms to 5ms (the cancellers are generally robust to this much and higher). Also, we make this a module parameter to allow easier experimentation with different values. --- src/modules/echo-cancel/module-echo-cancel.c | 27 +++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/src/modules/echo-cancel/module-echo-cancel.c b/src/modules/echo-cancel/module-echo-cancel.c index 9ecd78782..a3e7e0d59 100644 --- a/src/modules/echo-cancel/module-echo-cancel.c +++ b/src/modules/echo-cancel/module-echo-cancel.c @@ -66,6 +66,7 @@ PA_MODULE_USAGE( "sink_properties= " "sink_master= " "adjust_time= " + "adjust_threshold= " "format= " "rate= " "channels= " @@ -104,6 +105,7 @@ static const pa_echo_canceller ec_table[] = { #define DEFAULT_RATE 32000 #define DEFAULT_CHANNELS 1 #define DEFAULT_ADJUST_TIME_USEC (1*PA_USEC_PER_SEC) +#define DEFAULT_ADJUST_TOLERANCE (5*PA_USEC_PER_MSEC) #define DEFAULT_SAVE_AEC FALSE #define DEFAULT_AUTOLOADED FALSE @@ -188,6 +190,7 @@ struct userdata { int active_mask; pa_time_event *time_event; pa_usec_t adjust_time; + int adjust_threshold; FILE *captured_file; FILE *played_file; @@ -204,6 +207,7 @@ static const char* const valid_modargs[] = { "sink_properties", "sink_master", "adjust_time", + "adjust_threshold", "format", "rate", "channels", @@ -297,7 +301,7 @@ static void time_callback(pa_mainloop_api *a, pa_time_event *e, const struct tim new_rate = base_rate; } else { - if (diff_time > 1000) { + if (diff_time > u->adjust_threshold) { /* diff too big, quickly adjust */ pa_asyncmsgq_post(u->asyncmsgq, PA_MSGOBJECT(u->source_output), SOURCE_OUTPUT_MESSAGE_APPLY_DIFF_TIME, NULL, diff_time, NULL, NULL); @@ -1362,7 +1366,7 @@ int pa__init(pa_module*m) { pa_source_new_data source_data; pa_sink_new_data sink_data; pa_memchunk silence; - uint32_t adjust_time_sec; + uint32_t temp; pa_bool_t use_volume_sharing = TRUE; pa_assert(m); @@ -1412,17 +1416,28 @@ int pa__init(pa_module*m) { m->userdata = u; u->dead = FALSE; - adjust_time_sec = DEFAULT_ADJUST_TIME_USEC / PA_USEC_PER_SEC; - if (pa_modargs_get_value_u32(ma, "adjust_time", &adjust_time_sec) < 0) { + temp = DEFAULT_ADJUST_TIME_USEC / PA_USEC_PER_SEC; + if (pa_modargs_get_value_u32(ma, "adjust_time", &temp) < 0) { pa_log("Failed to parse adjust_time value"); goto fail; } - if (adjust_time_sec != DEFAULT_ADJUST_TIME_USEC / PA_USEC_PER_SEC) - u->adjust_time = adjust_time_sec * PA_USEC_PER_SEC; + if (temp != DEFAULT_ADJUST_TIME_USEC / PA_USEC_PER_SEC) + u->adjust_time = temp * PA_USEC_PER_SEC; else u->adjust_time = DEFAULT_ADJUST_TIME_USEC; + temp = DEFAULT_ADJUST_TOLERANCE / PA_USEC_PER_MSEC; + if (pa_modargs_get_value_u32(ma, "adjust_threshold", &temp) < 0) { + pa_log("Failed to parse adjust_threshold value"); + goto fail; + } + + if (temp != DEFAULT_ADJUST_TOLERANCE / PA_USEC_PER_MSEC) + u->adjust_threshold = temp * PA_USEC_PER_MSEC; + else + u->adjust_threshold = DEFAULT_ADJUST_TOLERANCE; + u->save_aec = DEFAULT_SAVE_AEC; if (pa_modargs_get_value_boolean(ma, "save_aec", &u->save_aec) < 0) { pa_log("Failed to parse save_aec value");