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.
This commit is contained in:
Arun Raghavan 2011-10-05 13:41:43 +05:30
parent 0429fe6153
commit 4cacb1b670

View file

@ -66,6 +66,7 @@ PA_MODULE_USAGE(
"sink_properties=<properties for the sink> " "sink_properties=<properties for the sink> "
"sink_master=<name of sink to filter> " "sink_master=<name of sink to filter> "
"adjust_time=<how often to readjust rates in s> " "adjust_time=<how often to readjust rates in s> "
"adjust_threshold=<how much drift to readjust after in ms> "
"format=<sample format> " "format=<sample format> "
"rate=<sample rate> " "rate=<sample rate> "
"channels=<number of channels> " "channels=<number of channels> "
@ -104,6 +105,7 @@ static const pa_echo_canceller ec_table[] = {
#define DEFAULT_RATE 32000 #define DEFAULT_RATE 32000
#define DEFAULT_CHANNELS 1 #define DEFAULT_CHANNELS 1
#define DEFAULT_ADJUST_TIME_USEC (1*PA_USEC_PER_SEC) #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_SAVE_AEC FALSE
#define DEFAULT_AUTOLOADED FALSE #define DEFAULT_AUTOLOADED FALSE
@ -188,6 +190,7 @@ struct userdata {
int active_mask; int active_mask;
pa_time_event *time_event; pa_time_event *time_event;
pa_usec_t adjust_time; pa_usec_t adjust_time;
int adjust_threshold;
FILE *captured_file; FILE *captured_file;
FILE *played_file; FILE *played_file;
@ -204,6 +207,7 @@ static const char* const valid_modargs[] = {
"sink_properties", "sink_properties",
"sink_master", "sink_master",
"adjust_time", "adjust_time",
"adjust_threshold",
"format", "format",
"rate", "rate",
"channels", "channels",
@ -297,7 +301,7 @@ static void time_callback(pa_mainloop_api *a, pa_time_event *e, const struct tim
new_rate = base_rate; new_rate = base_rate;
} }
else { else {
if (diff_time > 1000) { if (diff_time > u->adjust_threshold) {
/* diff too big, quickly adjust */ /* diff too big, quickly adjust */
pa_asyncmsgq_post(u->asyncmsgq, PA_MSGOBJECT(u->source_output), SOURCE_OUTPUT_MESSAGE_APPLY_DIFF_TIME, pa_asyncmsgq_post(u->asyncmsgq, PA_MSGOBJECT(u->source_output), SOURCE_OUTPUT_MESSAGE_APPLY_DIFF_TIME,
NULL, diff_time, NULL, NULL); NULL, diff_time, NULL, NULL);
@ -1362,7 +1366,7 @@ int pa__init(pa_module*m) {
pa_source_new_data source_data; pa_source_new_data source_data;
pa_sink_new_data sink_data; pa_sink_new_data sink_data;
pa_memchunk silence; pa_memchunk silence;
uint32_t adjust_time_sec; uint32_t temp;
pa_bool_t use_volume_sharing = TRUE; pa_bool_t use_volume_sharing = TRUE;
pa_assert(m); pa_assert(m);
@ -1412,17 +1416,28 @@ int pa__init(pa_module*m) {
m->userdata = u; m->userdata = u;
u->dead = FALSE; u->dead = FALSE;
adjust_time_sec = DEFAULT_ADJUST_TIME_USEC / PA_USEC_PER_SEC; temp = DEFAULT_ADJUST_TIME_USEC / PA_USEC_PER_SEC;
if (pa_modargs_get_value_u32(ma, "adjust_time", &adjust_time_sec) < 0) { if (pa_modargs_get_value_u32(ma, "adjust_time", &temp) < 0) {
pa_log("Failed to parse adjust_time value"); pa_log("Failed to parse adjust_time value");
goto fail; goto fail;
} }
if (adjust_time_sec != DEFAULT_ADJUST_TIME_USEC / PA_USEC_PER_SEC) if (temp != DEFAULT_ADJUST_TIME_USEC / PA_USEC_PER_SEC)
u->adjust_time = adjust_time_sec * PA_USEC_PER_SEC; u->adjust_time = temp * PA_USEC_PER_SEC;
else else
u->adjust_time = DEFAULT_ADJUST_TIME_USEC; 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; u->save_aec = DEFAULT_SAVE_AEC;
if (pa_modargs_get_value_boolean(ma, "save_aec", &u->save_aec) < 0) { if (pa_modargs_get_value_boolean(ma, "save_aec", &u->save_aec) < 0) {
pa_log("Failed to parse save_aec value"); pa_log("Failed to parse save_aec value");