blob: 5ce9581e875b65ab97499dacff225bc6ae4a381d [file] [log] [blame]
/* 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"
#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)
void aec_config_get(dictionary *ini, webrtc::EchoCanceller3Config *config)
{
if (ini == NULL)
return;
config->buffering.excess_render_detection_interval_blocks =
AEC_GET_INT(ini, BUFFERING,
EXCESS_RENDER_DETECTION_INTERVAL_BLOCKS);
config->buffering.max_allowed_excess_render_blocks =
AEC_GET_INT(ini, BUFFERING, MAX_ALLOWED_EXCESS_RENDER_BLOCKS);
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.delay_headroom_samples =
AEC_GET_INT(ini, DELAY, DELAY_HEADROOM_SAMPLES);
config->delay.hysteresis_limit_blocks =
AEC_GET_INT(ini, DELAY, HYSTERESIS_LIMIT_BLOCKS);
config->delay.fixed_capture_delay_samples =
AEC_GET_INT(ini, DELAY, FIXED_CAPTURE_DELAY_SAMPLES);
config->delay.delay_estimate_smoothing =
AEC_GET_FLOAT(ini, DELAY, DELAY_ESTIMATE_SMOOTHING);
config->delay.delay_candidate_detection_threshold =
AEC_GET_FLOAT(ini, DELAY, DELAY_CANDIDATE_DETECTION_THRESHOLD);
config->delay.delay_selection_thresholds.initial =
AEC_GET_INT(ini, DELAY, DELAY_SELECTION_THRESHOLD_INITIAL);
config->delay.delay_selection_thresholds.converged =
AEC_GET_INT(ini, DELAY, DELAY_SELECTION_THRESHOLD_CONVERGED);
config->delay.use_external_delay_estimator =
AEC_GET_INT(ini, DELAY, USE_EXTERNAL_DELAY_ESTIMATOR);
config->delay.log_warning_on_delay_changes =
AEC_GET_INT(ini, DELAY, LOG_WARNING_ON_DELAY_CHANGES);
config->delay.render_alignment_mixing.downmix =
AEC_GET_INT(ini, DELAY, RENDER_ALIGNMENT_MIXING_DOWNMIX);
config->delay.render_alignment_mixing.adaptive_selection =
AEC_GET_INT(ini, DELAY, RENDER_ALIGNMENT_MIXING_ADAPTIVE_SELECTION);
config->delay.render_alignment_mixing.activity_power_threshold =
AEC_GET_FLOAT(ini, DELAY,
RENDER_ALIGNMENT_MIXING_ACTIVITY_POWER_THRESHOLD);
config->delay.render_alignment_mixing.prefer_first_two_channels =
AEC_GET_INT(ini, DELAY,
RENDER_ALIGNMENT_MIXING_PREFER_FIRST_TWO_CHANNELS);
config->delay.capture_alignment_mixing.downmix =
AEC_GET_INT(ini, DELAY, CAPTURE_ALIGNMENT_MIXING_DOWNMIX);
config->delay.capture_alignment_mixing.adaptive_selection =
AEC_GET_INT(ini, DELAY, CAPTURE_ALIGNMENT_MIXING_ADAPTIVE_SELECTION);
config->delay.capture_alignment_mixing.activity_power_threshold =
AEC_GET_FLOAT(ini, DELAY,
CAPTURE_ALIGNMENT_MIXING_ACTIVITY_POWER_THRESHOLD);
config->delay.capture_alignment_mixing.prefer_first_two_channels =
AEC_GET_INT(ini, DELAY,
CAPTURE_ALIGNMENT_MIXING_PREFER_FIRST_TWO_CHANNELS);
config->filter.refined.length_blocks =
AEC_GET_INT(ini, FILTER_REFINED, LENGTH_BLOCKS);
config->filter.refined.leakage_converged =
AEC_GET_FLOAT(ini, FILTER_REFINED, LEAKAGE_CONVERGED);
config->filter.refined.leakage_diverged =
AEC_GET_FLOAT(ini, FILTER_REFINED, LEAKAGE_DIVERGED);
config->filter.refined.error_floor =
AEC_GET_FLOAT(ini, FILTER_REFINED, ERROR_FLOOR);
config->filter.refined.error_ceil =
AEC_GET_FLOAT(ini, FILTER_REFINED, ERROR_CEIL);
config->filter.refined.noise_gate =
AEC_GET_FLOAT(ini, FILTER_REFINED, NOISE_GATE);
config->filter.coarse.length_blocks =
AEC_GET_INT(ini, FILTER_COARSE, LENGTH_BLOCKS);
config->filter.coarse.rate =
AEC_GET_FLOAT(ini, FILTER_COARSE, RATE);
config->filter.coarse.noise_gate =
AEC_GET_FLOAT(ini, FILTER_COARSE, NOISE_GATE);
config->filter.refined_initial.length_blocks =
AEC_GET_INT(ini, FILTER_REFINED_INIT, LENGTH_BLOCKS);
config->filter.refined_initial.leakage_converged =
AEC_GET_FLOAT(ini, FILTER_REFINED_INIT, LEAKAGE_CONVERGED);
config->filter.refined_initial.leakage_diverged =
AEC_GET_FLOAT(ini, FILTER_REFINED_INIT, LEAKAGE_DIVERGED);
config->filter.refined_initial.error_floor =
AEC_GET_FLOAT(ini, FILTER_REFINED_INIT, ERROR_FLOOR);
config->filter.refined_initial.error_ceil =
AEC_GET_FLOAT(ini, FILTER_REFINED_INIT, ERROR_CEIL);
config->filter.refined_initial.noise_gate =
AEC_GET_FLOAT(ini, FILTER_REFINED_INIT, NOISE_GATE);
config->filter.coarse_initial.length_blocks =
AEC_GET_INT(ini, FILTER_COARSE_INIT, LENGTH_BLOCKS);
config->filter.coarse_initial.rate =
AEC_GET_FLOAT(ini, FILTER_COARSE_INIT, RATE);
config->filter.coarse_initial.noise_gate =
AEC_GET_FLOAT(ini, FILTER_COARSE_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.coarse_reset_hangover_blocks =
AEC_GET_INT(ini, FILTER, COARSE_RESET_HANGOVER_BLOCKS);;
config->filter.conservative_initial_phase =
AEC_GET_INT(ini, FILTER, CONSERVATIVE_INITIAL_PHASE);
config->filter.enable_coarse_filter_output_usage =
AEC_GET_INT(ini, FILTER, ENABLE_COARSE_FILTER_OUTPUT_USAGE);
config->filter.use_linear_filter =
AEC_GET_INT(ini, FILTER, USE_LINEAR_FILTER);
config->filter.export_linear_aec_output =
AEC_GET_INT(ini, FILTER, EXPORT_LINEAR_AEC_OUTPUT);
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->erle.num_sections =
AEC_GET_INT(ini, ERLE, NUM_SECTIONS);
config->erle.clamp_quality_estimate_to_zero =
AEC_GET_INT(ini, ERLE, CLAMP_QUALITY_ESTIMATE_TO_ZERO);
config->erle.clamp_quality_estimate_to_one =
AEC_GET_INT(ini, ERLE, CLAMP_QUALITY_ESTIMATE_TO_ONE);
config->ep_strength.default_gain =
AEC_GET_FLOAT(ini, EP_STRENGTH, DEFAULT_GAIN);
config->ep_strength.default_len =
AEC_GET_FLOAT(ini, EP_STRENGTH, DEFAULT_LEN);
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->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_stationarity_properties =
AEC_GET_INT(ini, ECHO_AUDIBILITY, USE_STATIONARITY_PROPERTIES);
config->echo_audibility.use_stationarity_properties_at_init =
AEC_GET_INT(ini, ECHO_AUDIBILITY,
USE_STATIONARITY_PROPERTIES_AT_INIT);
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->render_levels.render_power_gain_db =
AEC_GET_FLOAT(ini, RENDER_LEVELS, RENDER_POWER_GAIN_DB);
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.model_reverb_in_nonlinear_mode =
AEC_GET_INT(ini, ECHO_MODEL, MODEL_REVERB_IN_NONLINEAR_MODE);
config->comfort_noise.noise_floor_dbfs =
AEC_GET_FLOAT(ini, COMFORT_NOISE, NOISE_FLOOR_DBFS);
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.enr_exit_threshold =
AEC_GET_FLOAT(ini, SUPPRESSOR_DOMINANT_NEAREND_DETECTION,
ENR_EXIT_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.dominant_nearend_detection.use_during_initial_phase =
AEC_GET_INT(ini, SUPPRESSOR_DOMINANT_NEAREND_DETECTION,
USE_DURING_INITIAL_PHASE);
config->suppressor.subband_nearend_detection.nearend_average_blocks =
AEC_GET_INT(ini, SUPPRESSOR_SUBBAND_NEAREND_DETECTION,
NEAREND_AVERAGE_BLOCKS);
config->suppressor.subband_nearend_detection.subband1.low =
AEC_GET_INT(ini, SUPPRESSOR_SUBBAND_NEAREND_DETECTION,
SUBBAND1_LOW);
config->suppressor.subband_nearend_detection.subband1.high =
AEC_GET_INT(ini, SUPPRESSOR_SUBBAND_NEAREND_DETECTION,
SUBBAND1_HIGH);
config->suppressor.subband_nearend_detection.subband2.low =
AEC_GET_INT(ini, SUPPRESSOR_SUBBAND_NEAREND_DETECTION,
SUBBAND2_LOW);
config->suppressor.subband_nearend_detection.subband2.high =
AEC_GET_INT(ini, SUPPRESSOR_SUBBAND_NEAREND_DETECTION,
SUBBAND2_HIGH);
config->suppressor.subband_nearend_detection.nearend_threshold =
AEC_GET_FLOAT(ini, SUPPRESSOR_SUBBAND_NEAREND_DETECTION,
NEAREND_THRESHOLD);
config->suppressor.subband_nearend_detection.snr_threshold =
AEC_GET_FLOAT(ini, SUPPRESSOR_SUBBAND_NEAREND_DETECTION,
SNR_THRESHOLD);
config->suppressor.use_subband_nearend_detection =
AEC_GET_INT(ini, SUPPRESSOR, USE_SUBBAND_NEAREND_DETECTION);
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.high_bands_suppression.anti_howling_activation_threshold =
AEC_GET_FLOAT(ini, SUPPRESSOR_HIGH_BANDS_SUPPRESSION,
ANTI_HOWLING_ACTIVATION_THRESHOLD);
config->suppressor.high_bands_suppression.anti_howling_gain =
AEC_GET_FLOAT(ini, SUPPRESSOR_HIGH_BANDS_SUPPRESSION,
ANTI_HOWLING_GAIN);
config->suppressor.floor_first_increase =
AEC_GET_FLOAT(ini, SUPPRESSOR, FLOOR_FIRST_INCREASE);
config->suppressor.conservative_hf_suppression =
AEC_GET_INT(ini, SUPPRESSOR, CONSERVATIVE_HF_SUPPRESSION);
}
void aec_config_dump(dictionary *ini)
{
webrtc::EchoCanceller3Config config;
aec_config_get(ini, &config);
syslog(LOG_ERR, "---- aec config dump ----");
syslog(LOG_ERR, "Buffering:");
syslog(LOG_ERR, " excess_render_detection_interval_blocks %zu",
config.buffering.excess_render_detection_interval_blocks);
syslog(LOG_ERR, " max_allowed_excess_render_blocks %zu",
config.buffering.max_allowed_excess_render_blocks);
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, " delay_headroom_samples %zu, hysteresis_limit_blocks %zu",
config.delay.delay_headroom_samples,
config.delay.hysteresis_limit_blocks);
syslog(LOG_ERR, " fixed_capture_delay_samples %zu",
config.delay.fixed_capture_delay_samples);
syslog(LOG_ERR, " delay_estimate_smoothing %f",
config.delay.delay_estimate_smoothing);
syslog(LOG_ERR, " delay_candidate_detection_threshold %f",
config.delay.delay_candidate_detection_threshold);
syslog(LOG_ERR, " delay_selection_thresholds.initial %d",
config.delay.delay_selection_thresholds.initial);
syslog(LOG_ERR, " delay_selection_thresholds.converged %d",
config.delay.delay_selection_thresholds.converged);
syslog(LOG_ERR, " use_external_delay_estimator %d",
config.delay.use_external_delay_estimator);
syslog(LOG_ERR, " log_warning_on_delay_changes %d",
config.delay.log_warning_on_delay_changes);
syslog(LOG_ERR, " render_alignment_mixing.downmix %d",
config.delay.render_alignment_mixing.downmix);
syslog(LOG_ERR, " render_alignment_mixing.adaptive_selection %d",
config.delay.render_alignment_mixing.adaptive_selection);
syslog(LOG_ERR, " render_alignment_mixing.activity_power_threshold %f",
config.delay.render_alignment_mixing.activity_power_threshold);
syslog(LOG_ERR, " render_alignment_mixing.prefer_first_two_channels %d",
config.delay.render_alignment_mixing.prefer_first_two_channels);
syslog(LOG_ERR, " capture_alignment_mixing.downmix %d",
config.delay.capture_alignment_mixing.downmix);
syslog(LOG_ERR, " capture_alignment_mixing.adaptive_selection %d",
config.delay.capture_alignment_mixing.adaptive_selection);
syslog(LOG_ERR, " capture_alignment_mixing.activity_power_threshold %f",
config.delay.capture_alignment_mixing.activity_power_threshold);
syslog(LOG_ERR, " capture_alignment_mixing.prefer_first_two_channels %d",
config.delay.capture_alignment_mixing.prefer_first_two_channels);
syslog(LOG_ERR, "Filter refined configuration:");
syslog(LOG_ERR, " length_blocks %zu, leakage_converged %f, leakage_diverged %f",
config.filter.refined.length_blocks,
config.filter.refined.leakage_converged,
config.filter.refined.leakage_diverged);
syslog(LOG_ERR, " error_floor %f, error_ceil %f, noise_gate %f",
config.filter.refined.error_floor,
config.filter.refined.error_ceil,
config.filter.refined.noise_gate);
syslog(LOG_ERR, "Filter coarse configuration:");
syslog(LOG_ERR, " length_blocks %zu, rate %f, noise_gate %f",
config.filter.coarse.length_blocks,
config.filter.coarse.rate,
config.filter.coarse.noise_gate);
syslog(LOG_ERR, "Filter refined initial configuration:");
syslog(LOG_ERR, " length_blocks %zu, leakage_converged %f leakage_diverged %f",
config.filter.refined_initial.length_blocks,
config.filter.refined_initial.leakage_converged,
config.filter.refined_initial.leakage_diverged);
syslog(LOG_ERR, " error_floor %f, error_ceil %f, noise_gate %f",
config.filter.refined_initial.error_floor,
config.filter.refined_initial.error_ceil,
config.filter.refined_initial.noise_gate);
syslog(LOG_ERR, "Filter coarse initial configuration:");
syslog(LOG_ERR, " length_blocks %zu, rate %f, noise_gate %f",
config.filter.coarse_initial.length_blocks,
config.filter.coarse_initial.rate,
config.filter.coarse_initial.noise_gate);
syslog(LOG_ERR, "Filter: config_change_duration_blocks %zd",
config.filter.config_change_duration_blocks);
syslog(LOG_ERR, " initial_state_seconds %f",
config.filter.initial_state_seconds);
syslog(LOG_ERR, " coarse_reset_hangover_blocks %d",
config.filter.coarse_reset_hangover_blocks);
syslog(LOG_ERR, " conservative_initial_phase %d",
config.filter.conservative_initial_phase);
syslog(LOG_ERR, " enable_coarse_filter_output_usage %d",
config.filter.enable_coarse_filter_output_usage);
syslog(LOG_ERR, " use_linear_filter %d",
config.filter.use_linear_filter);
syslog(LOG_ERR, " export_linear_aec_output %d",
config.filter.export_linear_aec_output);
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, " num_sections %zu clamp_quality_estimate_to_zero %d",
config.erle.num_sections,
config.erle.clamp_quality_estimate_to_zero);
syslog(LOG_ERR, " clamp_quality_estimate_to_one %d",
config.erle.clamp_quality_estimate_to_one);
syslog(LOG_ERR, "Ep strength: default_gain %f default_len %f",
config.ep_strength.default_gain,
config.ep_strength.default_len);
syslog(LOG_ERR, " echo_can_saturate %d, bounded_erl %d,",
config.ep_strength.echo_can_saturate,
config.ep_strength.bounded_erl);
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_stationarity_properties %d",
config.echo_audibility.use_stationarity_properties);
syslog(LOG_ERR, " use_stationarity_properties_at_init %d",
config.echo_audibility.use_stationarity_properties_at_init);
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, " render_power_gain_db %f",
config.render_levels.render_power_gain_db);
syslog(LOG_ERR, "Echo removal control:");
syslog(LOG_ERR, " gain rampup:");
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, "Suppressor:");
syslog(LOG_ERR, " nearend_average_blocks %zu",
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, " enr_exit_threshold %f",
config.suppressor.dominant_nearend_detection.enr_exit_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, " use_during_initial_phase %d",
config.suppressor.dominant_nearend_detection.use_during_initial_phase);
syslog(LOG_ERR, " Subband nearend detection:");
syslog(LOG_ERR, " nearend_average_blocks %zu",
config.suppressor.subband_nearend_detection.nearend_average_blocks);
syslog(LOG_ERR, " subband1.low %zu subband1.high %zu",
config.suppressor.subband_nearend_detection.subband1.low,
config.suppressor.subband_nearend_detection.subband1.high);
syslog(LOG_ERR, " subband2.low %zu subband2.high %zu",
config.suppressor.subband_nearend_detection.subband2.low,
config.suppressor.subband_nearend_detection.subband2.high);
syslog(LOG_ERR, " nearend_threshold %f snr_threshold %f",
config.suppressor.subband_nearend_detection.nearend_threshold,
config.suppressor.subband_nearend_detection.snr_threshold);
syslog(LOG_ERR, " use_subband_nearend_detection %d",
config.suppressor.use_subband_nearend_detection);
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, " anti_howling_activation_threshold %f",
config.suppressor.high_bands_suppression.anti_howling_activation_threshold);
syslog(LOG_ERR, " anti_howling_gain %f",
config.suppressor.high_bands_suppression.anti_howling_gain);
syslog(LOG_ERR, " floor_first_increase %f",
config.suppressor.floor_first_increase);
syslog(LOG_ERR, " conservative_hf_suppression %d",
config.suppressor.conservative_hf_suppression);
}