summaryrefslogtreecommitdiff
path: root/cras/src/server/config/aec_config.c
diff options
context:
space:
mode:
Diffstat (limited to 'cras/src/server/config/aec_config.c')
-rw-r--r--cras/src/server/config/aec_config.c479
1 files changed, 479 insertions, 0 deletions
diff --git a/cras/src/server/config/aec_config.c b/cras/src/server/config/aec_config.c
new file mode 100644
index 00000000..d51d4b83
--- /dev/null
+++ b/cras/src/server/config/aec_config.c
@@ -0,0 +1,479 @@
+/* Copyright 2018 The Chromium OS Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include <syslog.h>
+
+#include "aec_config.h"
+#include "iniparser_wrapper.h"
+
+static const unsigned int MAX_INI_NAME_LEN = 63;
+
+#define AEC_CONFIG_NAME "aec.ini"
+
+#define AEC_GET_INT(ini, category, key) \
+ iniparser_getint( \
+ ini, AEC_ ## category ## _ ## key, \
+ AEC_ ## category ## _ ## key ## _VALUE)
+
+#define AEC_GET_FLOAT(ini, category, key) \
+ iniparser_getdouble( \
+ ini, AEC_ ## category ## _ ## key, \
+ AEC_ ## category ## _ ## key ## _VALUE)
+
+struct aec_config *aec_config_get(const char *device_config_dir)
+{
+ struct aec_config *config;
+ char ini_name[MAX_INI_NAME_LEN + 1];
+ dictionary *ini;
+
+ snprintf(ini_name, MAX_INI_NAME_LEN, "%s/%s",
+ device_config_dir, AEC_CONFIG_NAME);
+ ini_name[MAX_INI_NAME_LEN] = '\0';
+
+ ini = iniparser_load_wrapper(ini_name);
+ if (ini == NULL) {
+ syslog(LOG_DEBUG, "No ini file %s", ini_name);
+ return NULL;
+ }
+
+ config = (struct aec_config *)calloc(1, sizeof(*config));
+
+ config->delay.default_delay =
+ AEC_GET_INT(ini, DELAY, DEFAULT_DELAY);
+ config->delay.down_sampling_factor =
+ AEC_GET_INT(ini, DELAY, DOWN_SAMPLING_FACTOR);
+ config->delay.num_filters =
+ AEC_GET_INT(ini, DELAY, NUM_FILTERS);
+ config->delay.api_call_jitter_blocks =
+ AEC_GET_INT(ini, DELAY, API_CALL_JITTER_BLOCKS);
+ config->delay.min_echo_path_delay_blocks =
+ AEC_GET_INT(ini, DELAY, MIN_ECHO_PATH_DELAY_BLOCKS);
+ config->delay.delay_headroom_blocks =
+ AEC_GET_INT(ini, DELAY, DELAY_HEADROOM_BLOCKS);
+ config->delay.hysteresis_limit_1_blocks =
+ AEC_GET_INT(ini, DELAY, HYSTERESIS_LIMIT_1_BLOCKS);
+ config->delay.hysteresis_limit_2_blocks =
+ AEC_GET_INT(ini, DELAY, HYSTERESIS_LIMIT_2_BLOCKS);
+ config->delay.skew_hysteresis_blocks =
+ AEC_GET_INT(ini, DELAY, SKEW_HYSTERESIS_BLOCKS);
+ config->delay.fixed_capture_delay_samples =
+ AEC_GET_INT(ini, DELAY, FIXED_CAPTURE_DELAY_SAMPLES);
+
+ config->filter.main.length_blocks =
+ AEC_GET_INT(ini, FILTER_MAIN, LENGTH_BLOCKS);
+ config->filter.main.leakage_converged =
+ AEC_GET_FLOAT(ini, FILTER_MAIN, LEAKAGE_CONVERGED);
+ config->filter.main.leakage_diverged =
+ AEC_GET_FLOAT(ini, FILTER_MAIN, LEAKAGE_DIVERGED);
+ config->filter.main.error_floor =
+ AEC_GET_FLOAT(ini, FILTER_MAIN, ERROR_FLOOR);
+ config->filter.main.noise_gate =
+ AEC_GET_FLOAT(ini, FILTER_MAIN, NOISE_GATE);
+
+ config->filter.shadow.length_blocks =
+ AEC_GET_INT(ini, FILTER_SHADOW, LENGTH_BLOCKS);
+ config->filter.shadow.rate =
+ AEC_GET_FLOAT(ini, FILTER_SHADOW, RATE);
+ config->filter.shadow.noise_gate =
+ AEC_GET_FLOAT(ini, FILTER_SHADOW, NOISE_GATE);
+
+ config->filter.main_initial.length_blocks =
+ AEC_GET_INT(ini, FILTER_MAIN_INIT, LENGTH_BLOCKS);
+ config->filter.main_initial.leakage_converged =
+ AEC_GET_FLOAT(ini, FILTER_MAIN_INIT, LEAKAGE_CONVERGED);
+ config->filter.main_initial.leakage_diverged =
+ AEC_GET_FLOAT(ini, FILTER_MAIN_INIT, LEAKAGE_DIVERGED);
+ config->filter.main_initial.error_floor =
+ AEC_GET_FLOAT(ini, FILTER_MAIN_INIT, ERROR_FLOOR);
+ config->filter.main_initial.noise_gate =
+ AEC_GET_FLOAT(ini, FILTER_MAIN_INIT, NOISE_GATE);
+
+ config->filter.shadow_initial.length_blocks =
+ AEC_GET_INT(ini, FILTER_SHADOW_INIT, LENGTH_BLOCKS);
+ config->filter.shadow_initial.rate =
+ AEC_GET_FLOAT(ini, FILTER_SHADOW_INIT, RATE);
+ config->filter.shadow_initial.noise_gate =
+ AEC_GET_FLOAT(ini, FILTER_SHADOW_INIT, NOISE_GATE);
+
+ config->filter.config_change_duration_blocks =
+ AEC_GET_INT(ini, FILTER, CONFIG_CHANGE_DURATION_BLOCKS);
+ config->filter.initial_state_seconds =
+ AEC_GET_FLOAT(ini, FILTER, INITIAL_STATE_SECONDS);
+ config->filter.conservative_initial_phase =
+ AEC_GET_INT(ini, FILTER, CONSERVATIVE_INITIAL_PHASE);
+ config->filter.enable_shadow_filter_output_usage =
+ AEC_GET_INT(ini, FILTER, ENABLE_SHADOW_FILTER_OUTPUT_USAGE);
+
+ config->erle.min =
+ AEC_GET_FLOAT(ini, ERLE, MIN);
+ config->erle.max_l =
+ AEC_GET_FLOAT(ini, ERLE, MAX_L);
+ config->erle.max_h =
+ AEC_GET_FLOAT(ini, ERLE, MAX_H);
+ config->erle.onset_detection =
+ AEC_GET_INT(ini, ERLE, ONSET_DETECTION);
+
+ config->ep_strength.lf =
+ AEC_GET_FLOAT(ini, EP_STRENGTH, LF);
+ config->ep_strength.mf =
+ AEC_GET_FLOAT(ini, EP_STRENGTH, MF);
+ config->ep_strength.hf =
+ AEC_GET_FLOAT(ini, EP_STRENGTH, HF);
+ config->ep_strength.default_len =
+ AEC_GET_FLOAT(ini, EP_STRENGTH, DEFAULT_LEN);
+ config->ep_strength.reverb_based_on_render =
+ AEC_GET_INT(ini, EP_STRENGTH, REVERB_BASED_ON_RENDER);
+ config->ep_strength.bounded_erl =
+ AEC_GET_INT(ini, EP_STRENGTH, BOUNDED_ERL);
+ config->ep_strength.echo_can_saturate =
+ AEC_GET_INT(ini, EP_STRENGTH, ECHO_CAN_SATURATE);
+
+ config->gain_mask.m0 =
+ AEC_GET_FLOAT(ini, GAIN_MASK, M0);
+ config->gain_mask.m1 =
+ AEC_GET_FLOAT(ini, GAIN_MASK, M1);
+ config->gain_mask.m2 =
+ AEC_GET_FLOAT(ini, GAIN_MASK, M2);
+ config->gain_mask.m3 =
+ AEC_GET_FLOAT(ini, GAIN_MASK, M3);
+ config->gain_mask.m5 =
+ AEC_GET_FLOAT(ini, GAIN_MASK, M5);
+ config->gain_mask.m6 =
+ AEC_GET_FLOAT(ini, GAIN_MASK, M6);
+ config->gain_mask.m7 =
+ AEC_GET_FLOAT(ini, GAIN_MASK, M7);
+ config->gain_mask.m8 =
+ AEC_GET_FLOAT(ini, GAIN_MASK, M8);
+ config->gain_mask.m9 =
+ AEC_GET_FLOAT(ini, GAIN_MASK, M9);
+ config->gain_mask.gain_curve_offset =
+ AEC_GET_FLOAT(ini, GAIN_MASK, GAIN_CURVE_OFFSET);
+ config->gain_mask.gain_curve_slope =
+ AEC_GET_FLOAT(ini, GAIN_MASK, GAIN_CURVE_SLOPE);
+ config->gain_mask.temporal_masking_lf =
+ AEC_GET_FLOAT(ini, GAIN_MASK, TEMPORAL_MASKING_LF);
+ config->gain_mask.temporal_masking_hf =
+ AEC_GET_FLOAT(ini, GAIN_MASK, TEMPORAL_MASKING_HF);
+ config->gain_mask.temporal_masking_lf_bands =
+ AEC_GET_INT(ini, GAIN_MASK, TEMPORAL_MASKING_LF_BANDS);
+
+ config->echo_audibility.low_render_limit =
+ AEC_GET_FLOAT(ini, ECHO_AUDIBILITY, LOW_RENDER_LIMIT);
+ config->echo_audibility.normal_render_limit =
+ AEC_GET_FLOAT(ini, ECHO_AUDIBILITY, NORMAL_RENDER_LIMIT);
+ config->echo_audibility.floor_power =
+ AEC_GET_FLOAT(ini, ECHO_AUDIBILITY, FLOOR_POWER);
+ config->echo_audibility.audibility_threshold_lf =
+ AEC_GET_FLOAT(ini, ECHO_AUDIBILITY, AUDIBILITY_THRESHOLD_LF);
+ config->echo_audibility.audibility_threshold_mf =
+ AEC_GET_FLOAT(ini, ECHO_AUDIBILITY, AUDIBILITY_THRESHOLD_MF);
+ config->echo_audibility.audibility_threshold_hf =
+ AEC_GET_FLOAT(ini, ECHO_AUDIBILITY, AUDIBILITY_THRESHOLD_HF);
+ config->echo_audibility.use_stationary_properties =
+ AEC_GET_INT(ini, ECHO_AUDIBILITY, USE_STATIONARY_PROPERTIES);
+
+ config->render_levels.active_render_limit =
+ AEC_GET_FLOAT(ini, RENDER_LEVELS, ACTIVE_RENDER_LIMIT);
+ config->render_levels.poor_excitation_render_limit =
+ AEC_GET_FLOAT(ini, RENDER_LEVELS, POOR_EXCITATION_RENDER_LIMIT);
+ config->render_levels.poor_excitation_render_limit_ds8 =
+ AEC_GET_FLOAT(ini, RENDER_LEVELS, POOR_EXCITATION_RENDER_LIMIT_DS8);
+
+ config->echo_removal_control.gain_rampup.initial_gain =
+ AEC_GET_FLOAT(ini, ECHO_REMOVAL_CTL, INITIAL_GAIN);
+ config->echo_removal_control.gain_rampup.first_non_zero_gain =
+ AEC_GET_FLOAT(ini, ECHO_REMOVAL_CTL, FIRST_NON_ZERO_GAIN);
+ config->echo_removal_control.gain_rampup.non_zero_gain_blocks =
+ AEC_GET_INT(ini, ECHO_REMOVAL_CTL, NON_ZERO_GAIN_BLOCKS);
+ config->echo_removal_control.gain_rampup.full_gain_blocks =
+ AEC_GET_INT(ini, ECHO_REMOVAL_CTL, FULL_GAIN_BLOCKS);
+ config->echo_removal_control.has_clock_drift =
+ AEC_GET_INT(ini, ECHO_REMOVAL_CTL, HAS_CLOCK_DRIFT);
+ config->echo_removal_control.linear_and_stable_echo_path =
+ AEC_GET_INT(ini, ECHO_REMOVAL_CTL, LINEAR_AND_STABLE_ECHO_PATH);
+
+ config->echo_model.noise_floor_hold =
+ AEC_GET_INT(ini, ECHO_MODEL, NOISE_FLOOR_HOLD);
+ config->echo_model.min_noise_floor_power =
+ AEC_GET_FLOAT(ini, ECHO_MODEL, MIN_NOISE_FLOOR_POWER);
+ config->echo_model.stationary_gate_slope =
+ AEC_GET_FLOAT(ini, ECHO_MODEL, STATIONARY_GATE_SLOPE);
+ config->echo_model.noise_gate_power =
+ AEC_GET_FLOAT(ini, ECHO_MODEL, NOISE_GATE_POWER);
+ config->echo_model.noise_gate_slope =
+ AEC_GET_FLOAT(ini, ECHO_MODEL, NOISE_GATE_SLOPE);
+ config->echo_model.render_pre_window_size =
+ AEC_GET_INT(ini, ECHO_MODEL, RENDER_PRE_WINDOW_SIZE);
+ config->echo_model.render_post_window_size =
+ AEC_GET_INT(ini, ECHO_MODEL, RENDER_POST_WINDOW_SIZE);
+ config->echo_model.render_pre_window_size_init =
+ AEC_GET_INT(ini, ECHO_MODEL, RENDER_PRE_WINDOW_SIZE_INIT);
+ config->echo_model.render_post_window_size_init =
+ AEC_GET_INT(ini, ECHO_MODEL, RENDER_POST_WINDOW_SIZE_INIT);
+ config->echo_model.nonlinear_hold =
+ AEC_GET_FLOAT(ini, ECHO_MODEL, NONLINEAR_HOLD);
+ config->echo_model.nonlinear_release =
+ AEC_GET_FLOAT(ini, ECHO_MODEL, NONLINEAR_RELEASE);
+
+ config->suppressor.nearend_average_blocks =
+ AEC_GET_INT(ini, SUPPRESSOR, NEAREND_AVERAGE_BLOCKS);
+
+ config->suppressor.normal_tuning.mask_lf.enr_transparent =
+ AEC_GET_FLOAT(ini, SUPPRESSOR_NORMAL_TUNING,
+ MASK_LF_ENR_TRANSPARENT);
+ config->suppressor.normal_tuning.mask_lf.enr_suppress =
+ AEC_GET_FLOAT(ini, SUPPRESSOR_NORMAL_TUNING,
+ MASK_LF_ENR_SUPPRESS);
+ config->suppressor.normal_tuning.mask_lf.emr_transparent =
+ AEC_GET_FLOAT(ini, SUPPRESSOR_NORMAL_TUNING,
+ MASK_LF_EMR_TRANSPARENT);
+ config->suppressor.normal_tuning.mask_hf.enr_transparent =
+ AEC_GET_FLOAT(ini, SUPPRESSOR_NORMAL_TUNING,
+ MASK_HF_ENR_TRANSPARENT);
+ config->suppressor.normal_tuning.mask_hf.enr_suppress =
+ AEC_GET_FLOAT(ini, SUPPRESSOR_NORMAL_TUNING,
+ MASK_HF_ENR_SUPPRESS);
+ config->suppressor.normal_tuning.mask_hf.emr_transparent =
+ AEC_GET_FLOAT(ini, SUPPRESSOR_NORMAL_TUNING,
+ MASK_HF_EMR_TRANSPARENT);
+ config->suppressor.normal_tuning.max_inc_factor =
+ AEC_GET_FLOAT(ini, SUPPRESSOR_NORMAL_TUNING, MAX_INC_FACTOR);
+ config->suppressor.normal_tuning.max_dec_factor_lf =
+ AEC_GET_FLOAT(ini, SUPPRESSOR_NORMAL_TUNING, MAX_DEC_FACTOR_LF);
+
+ config->suppressor.nearend_tuning.mask_lf.enr_transparent =
+ AEC_GET_FLOAT(ini, SUPPRESSOR_NEAREND_TUNING,
+ MASK_LF_ENR_TRANSPARENT);
+ config->suppressor.nearend_tuning.mask_lf.enr_suppress =
+ AEC_GET_FLOAT(ini, SUPPRESSOR_NEAREND_TUNING,
+ MASK_LF_ENR_SUPPRESS);
+ config->suppressor.nearend_tuning.mask_lf.emr_transparent =
+ AEC_GET_FLOAT(ini, SUPPRESSOR_NEAREND_TUNING,
+ MASK_LF_EMR_TRANSPARENT);
+ config->suppressor.nearend_tuning.mask_hf.enr_transparent =
+ AEC_GET_FLOAT(ini, SUPPRESSOR_NEAREND_TUNING,
+ MASK_HF_ENR_TRANSPARENT);
+ config->suppressor.nearend_tuning.mask_hf.enr_suppress =
+ AEC_GET_FLOAT(ini, SUPPRESSOR_NEAREND_TUNING,
+ MASK_HF_ENR_SUPPRESS);
+ config->suppressor.nearend_tuning.mask_hf.emr_transparent =
+ AEC_GET_FLOAT(ini, SUPPRESSOR_NEAREND_TUNING,
+ MASK_HF_EMR_TRANSPARENT);
+ config->suppressor.nearend_tuning.max_inc_factor =
+ AEC_GET_FLOAT(ini, SUPPRESSOR_NEAREND_TUNING, MAX_INC_FACTOR);
+ config->suppressor.nearend_tuning.max_dec_factor_lf =
+ AEC_GET_FLOAT(ini, SUPPRESSOR_NEAREND_TUNING, MAX_DEC_FACTOR_LF);
+
+ config->suppressor.dominant_nearend_detection.enr_threshold =
+ AEC_GET_FLOAT(ini, SUPPRESSOR_DOMINANT_NEAREND_DETECTION,
+ ENR_THRESHOLD);
+ config->suppressor.dominant_nearend_detection.snr_threshold =
+ AEC_GET_FLOAT(ini, SUPPRESSOR_DOMINANT_NEAREND_DETECTION,
+ SNR_THRESHOLD);
+ config->suppressor.dominant_nearend_detection.hold_duration =
+ AEC_GET_INT(ini, SUPPRESSOR_DOMINANT_NEAREND_DETECTION,
+ HOLD_DURATION);
+ config->suppressor.dominant_nearend_detection.trigger_threshold =
+ AEC_GET_INT(ini, SUPPRESSOR_DOMINANT_NEAREND_DETECTION,
+ TRIGGER_THRESHOLD);
+
+ config->suppressor.high_bands_suppression.enr_threshold =
+ AEC_GET_FLOAT(ini, SUPPRESSOR_HIGH_BANDS_SUPPRESSION,
+ ENR_THRESHOLD);
+ config->suppressor.high_bands_suppression.max_gain_during_echo =
+ AEC_GET_FLOAT(ini, SUPPRESSOR_HIGH_BANDS_SUPPRESSION,
+ MAX_GAIN_DURING_ECHO);
+
+ config->suppressor.floor_first_increase =
+ AEC_GET_FLOAT(ini, SUPPRESSOR, FLOOR_FIRST_INCREASE);
+ config->suppressor.enforce_transparent =
+ AEC_GET_INT(ini, SUPPRESSOR, ENFORCE_TRANSPARENT);
+ config->suppressor.enforce_empty_higher_bands =
+ AEC_GET_INT(ini, SUPPRESSOR, ENFORCE_EMPTY_HIGHER_BANDS);
+
+ return config;
+}
+
+void aec_config_dump(struct aec_config *config)
+{
+ syslog(LOG_ERR, "---- aec config dump ----");
+ syslog(LOG_ERR, "Delay:");
+ syslog(LOG_ERR, " default_delay %zu sampling_factor %zu num_filters %zu",
+ config->delay.default_delay,
+ config->delay.down_sampling_factor,
+ config->delay.num_filters);
+ syslog(LOG_ERR, " api_call_jitter_blocks %zu, min_echo_path_delay_blocks %zu",
+ config->delay.api_call_jitter_blocks,
+ config->delay.min_echo_path_delay_blocks);
+ syslog(LOG_ERR, " delay_headroom_blocks %zu, hysteresis_limit_1_blocks %zu",
+ config->delay.delay_headroom_blocks,
+ config->delay.hysteresis_limit_1_blocks);
+ syslog(LOG_ERR, " hysteresis_limit_2_blocks %zu, skew_hysteresis_blocks %zu",
+ config->delay.hysteresis_limit_2_blocks,
+ config->delay.skew_hysteresis_blocks);
+ syslog(LOG_ERR, " fixed_capture_delay_samples %zu",
+ config->delay.fixed_capture_delay_samples);
+
+ syslog(LOG_ERR, "Filter main configuration:");
+ syslog(LOG_ERR, " length_blocks %zu, leakage_converged %f, leakage_diverged %f",
+ config->filter.main.length_blocks,
+ config->filter.main.leakage_converged,
+ config->filter.main.leakage_diverged);
+ syslog(LOG_ERR, " error_floor %f, noise_gate %f",
+ config->filter.main.error_floor,
+ config->filter.main.noise_gate);
+ syslog(LOG_ERR, "Filter shadow configuration:");
+ syslog(LOG_ERR, " length_blocks %zu, rate %f, noise_gate %f",
+ config->filter.shadow.length_blocks,
+ config->filter.shadow.rate,
+ config->filter.shadow.noise_gate);
+ syslog(LOG_ERR, "Filter main initial configuration:");
+ syslog(LOG_ERR, " length_blocks %zu, leakage_converged %f",
+ config->filter.main_initial.length_blocks,
+ config->filter.main_initial.leakage_converged);
+ syslog(LOG_ERR, " leakage_diverged %f, error_floor %f, noise_gate %f",
+ config->filter.main_initial.leakage_diverged,
+ config->filter.main_initial.error_floor,
+ config->filter.main_initial.noise_gate);
+ syslog(LOG_ERR, "Filter shadow initial configuration:");
+ syslog(LOG_ERR, " length_blocks %zu, rate %f, noise_gate %f",
+ config->filter.shadow_initial.length_blocks,
+ config->filter.shadow_initial.rate,
+ config->filter.shadow_initial.noise_gate);
+ syslog(LOG_ERR, "Filter: config_change_duration_blocks %d",
+ config->filter.config_change_duration_blocks);
+ syslog(LOG_ERR, " initial_state_seconds %f",
+ config->filter.initial_state_seconds);
+ syslog(LOG_ERR, " conservative_initial_phase %d",
+ config->filter.conservative_initial_phase);
+ syslog(LOG_ERR, " enable_shadow_filter_output_usage %d",
+ config->filter.enable_shadow_filter_output_usage);
+ syslog(LOG_ERR, "Erle: min %f max_l %f max_h %f onset_detection %d",
+ config->erle.min, config->erle.max_l,
+ config->erle.max_h, config->erle.onset_detection);
+ syslog(LOG_ERR, "Ep strength: lf %f mf %f hf %f default_len %f",
+ config->ep_strength.lf,
+ config->ep_strength.mf,
+ config->ep_strength.hf,
+ config->ep_strength.default_len);
+ syslog(LOG_ERR, " echo_can_saturate %d, bounded_erl %d,"
+ " ep_strength.reverb_based_on_render %d",
+ config->ep_strength.echo_can_saturate,
+ config->ep_strength.bounded_erl,
+ config->ep_strength.reverb_based_on_render);
+ syslog(LOG_ERR, "Gain mask: m0 %f m1 %f m2 %f m3 %f m5 %f",
+ config->gain_mask.m0,
+ config->gain_mask.m1,
+ config->gain_mask.m2,
+ config->gain_mask.m3,
+ config->gain_mask.m5);
+ syslog(LOG_ERR, " m6 %f m7 %f m8 %f m9 %f",
+ config->gain_mask.m6,
+ config->gain_mask.m7,
+ config->gain_mask.m8,
+ config->gain_mask.m9);
+ syslog(LOG_ERR, " gain_curve offset %f, gain_curve_slope %f",
+ config->gain_mask.gain_curve_offset,
+ config->gain_mask.gain_curve_slope);
+ syslog(LOG_ERR, " temporal_masking_lf %f, temporal_masking_hf %f",
+ config->gain_mask.temporal_masking_lf,
+ config->gain_mask.temporal_masking_hf);
+ syslog(LOG_ERR, " temporal_masking_lf_bands %zu",
+ config->gain_mask.temporal_masking_lf_bands);
+ syslog(LOG_ERR, "Echo audibility:");
+ syslog(LOG_ERR, " low_render_limit %f, normal_render_limit %f",
+ config->echo_audibility.low_render_limit,
+ config->echo_audibility.normal_render_limit);
+ syslog(LOG_ERR, " floor_power %f, audibility_threshold_lf %f",
+ config->echo_audibility.floor_power,
+ config->echo_audibility.audibility_threshold_lf);
+ syslog(LOG_ERR, " audibility_threshold_mf %f",
+ config->echo_audibility.audibility_threshold_mf);
+ syslog(LOG_ERR, " audibility_threshold_hf %f",
+ config->echo_audibility.audibility_threshold_hf);
+ syslog(LOG_ERR, " use_stationary_properties %d",
+ config->echo_audibility.use_stationary_properties);
+ syslog(LOG_ERR, "Render levels:");
+ syslog(LOG_ERR, " active_render_limit %f",
+ config->render_levels.active_render_limit);
+ syslog(LOG_ERR, " poor_excitation_render_limit %f",
+ config->render_levels.poor_excitation_render_limit);
+ syslog(LOG_ERR, " poor_excitation_render_limit_ds8 %f",
+ config->render_levels.poor_excitation_render_limit_ds8);
+ syslog(LOG_ERR, "Echo removal control:");
+ syslog(LOG_ERR, " gain rampup:");
+ syslog(LOG_ERR, " initial_gain %f, first_non_zero_gain %f",
+ config->echo_removal_control.gain_rampup.initial_gain,
+ config->echo_removal_control.gain_rampup.first_non_zero_gain);
+ syslog(LOG_ERR, " non_zero_gain_blocks %d, full_gain_blocks %d",
+ config->echo_removal_control.gain_rampup.non_zero_gain_blocks,
+ config->echo_removal_control.gain_rampup.full_gain_blocks);
+ syslog(LOG_ERR, " has_clock_drift %d",
+ config->echo_removal_control.has_clock_drift);
+ syslog(LOG_ERR, " linear_and_stable_echo_path %d",
+ config->echo_removal_control.linear_and_stable_echo_path);
+ syslog(LOG_ERR, "Echo model:");
+ syslog(LOG_ERR, " noise_floor_hold %zu, min_noise_floor_power %f",
+ config->echo_model.noise_floor_hold,
+ config->echo_model.min_noise_floor_power);
+ syslog(LOG_ERR, " stationary_gate_slope %f, noise_gate_power %f",
+ config->echo_model.stationary_gate_slope,
+ config->echo_model.noise_gate_power);
+ syslog(LOG_ERR, " noise_gate_slope %f, render_pre_window_size %zu",
+ config->echo_model.noise_gate_slope,
+ config->echo_model.render_pre_window_size);
+ syslog(LOG_ERR, " render_post_window_size %zu nonlinear_hold %f",
+ config->echo_model.render_post_window_size,
+ config->echo_model.nonlinear_hold);
+ syslog(LOG_ERR, " render_pre_window_size_init %u, "
+ "render_post_window_size_init %u",
+ config->echo_model.render_pre_window_size_init,
+ config->echo_model.render_post_window_size_init);
+ syslog(LOG_ERR, " nonlinear_release %f",
+ config->echo_model.nonlinear_release);
+ syslog(LOG_ERR, "Suppressor:");
+ syslog(LOG_ERR, " nearend_average_blocks %u",
+ config->suppressor.nearend_average_blocks);
+ syslog(LOG_ERR, " Normal tuning, mask_lf %f %f %f",
+ config->suppressor.normal_tuning.mask_lf.enr_transparent,
+ config->suppressor.normal_tuning.mask_lf.enr_suppress,
+ config->suppressor.normal_tuning.mask_lf.emr_transparent);
+ syslog(LOG_ERR, " mask_hf %f %f %f",
+ config->suppressor.normal_tuning.mask_hf.enr_transparent,
+ config->suppressor.normal_tuning.mask_hf.enr_suppress,
+ config->suppressor.normal_tuning.mask_hf.emr_transparent);
+ syslog(LOG_ERR, " max_inc_factor %f max_dec_factor_lf %f",
+ config->suppressor.normal_tuning.max_inc_factor,
+ config->suppressor.normal_tuning.max_dec_factor_lf);
+ syslog(LOG_ERR, " Nearend tuning, mask_lf %f %f %f",
+ config->suppressor.nearend_tuning.mask_lf.enr_transparent,
+ config->suppressor.nearend_tuning.mask_lf.enr_suppress,
+ config->suppressor.nearend_tuning.mask_lf.emr_transparent);
+ syslog(LOG_ERR, " mask_hf %f %f %f",
+ config->suppressor.nearend_tuning.mask_hf.enr_transparent,
+ config->suppressor.nearend_tuning.mask_hf.enr_suppress,
+ config->suppressor.nearend_tuning.mask_hf.emr_transparent);
+ syslog(LOG_ERR, " max_inc_factor %f max_dec_factor_lf %f",
+ config->suppressor.nearend_tuning.max_inc_factor,
+ config->suppressor.nearend_tuning.max_dec_factor_lf);
+ syslog(LOG_ERR, " Dominant nearend detection:");
+ syslog(LOG_ERR, " enr_threshold %f",
+ config->suppressor.dominant_nearend_detection.enr_threshold);
+ syslog(LOG_ERR, " snr_threshold %f",
+ config->suppressor.dominant_nearend_detection.snr_threshold);
+ syslog(LOG_ERR, " hold_duration %d",
+ config->suppressor.dominant_nearend_detection.hold_duration);
+ syslog(LOG_ERR, " trigger_threshold %d",
+ config->suppressor.dominant_nearend_detection.trigger_threshold);
+ syslog(LOG_ERR, " High bands suppression:");
+ syslog(LOG_ERR, " enr_threshold %f max_gain_during_echo %f",
+ config->suppressor.high_bands_suppression.enr_threshold,
+ config->suppressor.high_bands_suppression.max_gain_during_echo);
+ syslog(LOG_ERR, " floor_first_increase %f, enforce_transparent %d",
+ config->suppressor.floor_first_increase,
+ config->suppressor.enforce_transparent);
+ syslog(LOG_ERR, " enforce_empty_higher_bands %f",
+ config->suppressor.enforce_empty_higher_bands);
+}