/* Copyright (c) 2018 The Chromium 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 "api/audio/echo_canceller3_factory.h"
#include "modules/audio_processing/aec_dump/aec_dump_factory.h"
#include "modules/audio_processing/include/aec_dump.h"
#include "modules/audio_processing/include/audio_processing.h"
#include "modules/include/module_common_types.h"
#include "rtc_base/task_queue.h"

extern "C" {
#include <errno.h>

#include "webrtc_apm.h"

int convert_to_aec3_config(
		const struct aec_config *config,
		webrtc::EchoCanceller3Config *aec3_config)
{
	aec3_config->delay.default_delay =
		config->delay.default_delay;
	aec3_config->delay.down_sampling_factor =
		config->delay.down_sampling_factor;
	aec3_config->delay.num_filters =
		config->delay.num_filters;
	aec3_config->delay.api_call_jitter_blocks =
		config->delay.api_call_jitter_blocks;
	aec3_config->delay.min_echo_path_delay_blocks =
		config->delay.min_echo_path_delay_blocks,
	aec3_config->delay.delay_headroom_blocks =
		config->delay.delay_headroom_blocks;
	aec3_config->delay.hysteresis_limit_1_blocks =
		config->delay.hysteresis_limit_1_blocks;
	aec3_config->delay.hysteresis_limit_2_blocks =
		config->delay.hysteresis_limit_2_blocks,
	aec3_config->delay.skew_hysteresis_blocks =
		config->delay.skew_hysteresis_blocks;
	aec3_config->delay.fixed_capture_delay_samples =
		config->delay.fixed_capture_delay_samples;

	aec3_config->filter.main = {
		config->filter.main.length_blocks,
		config->filter.main.leakage_converged,
		config->filter.main.leakage_diverged,
		config->filter.main.error_floor,
		config->filter.main.noise_gate
	};
	aec3_config->filter.shadow = {
		config->filter.shadow.length_blocks,
		config->filter.shadow.rate,
		config->filter.shadow.noise_gate
	};
	aec3_config->filter.main_initial = {
		config->filter.main_initial.length_blocks,
		config->filter.main_initial.leakage_converged,
		config->filter.main_initial.leakage_diverged,
		config->filter.main_initial.error_floor,
		config->filter.main_initial.noise_gate
	};
	aec3_config->filter.shadow_initial = {
		config->filter.shadow_initial.length_blocks,
		config->filter.shadow_initial.rate,
		config->filter.shadow_initial.noise_gate
	};
	aec3_config->filter.config_change_duration_blocks =
		config->filter.config_change_duration_blocks;
	aec3_config->filter.initial_state_seconds =
		config->filter.initial_state_seconds;
	aec3_config->filter.conservative_initial_phase =
		static_cast<bool>(config->filter.conservative_initial_phase);
	aec3_config->filter.enable_shadow_filter_output_usage =
		static_cast<bool>(
			config->filter.enable_shadow_filter_output_usage);
	aec3_config->erle = {
		config->erle.min,
		config->erle.max_l,
		config->erle.max_h,
		static_cast<bool>(config->erle.onset_detection)
	};
	aec3_config->ep_strength = {
		config->ep_strength.lf,
		config->ep_strength.mf,
		config->ep_strength.hf,
		config->ep_strength.default_len,
		static_cast<bool>(config->ep_strength.reverb_based_on_render),
		static_cast<bool>(config->ep_strength.echo_can_saturate),
		static_cast<bool>(config->ep_strength.bounded_erl)
	};

	aec3_config->gain_mask.m0 = config->gain_mask.m0;
	aec3_config->gain_mask.m1 = config->gain_mask.m1;
	aec3_config->gain_mask.m2 = config->gain_mask.m2;
	aec3_config->gain_mask.m3 = config->gain_mask.m3;
	aec3_config->gain_mask.m5 = config->gain_mask.m5;
	aec3_config->gain_mask.m6 = config->gain_mask.m6;
	aec3_config->gain_mask.m7 = config->gain_mask.m7;
	aec3_config->gain_mask.m8 = config->gain_mask.m8;
	aec3_config->gain_mask.m9 = config->gain_mask.m9;
	aec3_config->gain_mask.gain_curve_offset =
			config->gain_mask.gain_curve_offset;
	aec3_config->gain_mask.gain_curve_slope =
			config->gain_mask.gain_curve_slope;
	aec3_config->gain_mask.temporal_masking_lf =
			config->gain_mask.temporal_masking_lf;
	aec3_config->gain_mask.temporal_masking_hf =
			config->gain_mask.temporal_masking_hf;
	aec3_config->gain_mask.temporal_masking_lf_bands =
			config->gain_mask.temporal_masking_lf_bands;

	aec3_config->echo_audibility = {
		config->echo_audibility.low_render_limit,
		config->echo_audibility.normal_render_limit,
		config->echo_audibility.floor_power,
		config->echo_audibility.audibility_threshold_lf,
		config->echo_audibility.audibility_threshold_mf,
		config->echo_audibility.audibility_threshold_hf,
		static_cast<bool>(
			config->echo_audibility.use_stationary_properties)
	};
	aec3_config->render_levels = {
		config->render_levels.active_render_limit,
		config->render_levels.poor_excitation_render_limit,
		config->render_levels.poor_excitation_render_limit_ds8,
	};

	aec3_config->echo_removal_control = {
		{
		config->echo_removal_control.gain_rampup.initial_gain,
		config->echo_removal_control.gain_rampup.first_non_zero_gain,
		config->echo_removal_control.gain_rampup.non_zero_gain_blocks,
		config->echo_removal_control.gain_rampup.full_gain_blocks
		},
		static_cast<bool>(config->echo_removal_control.has_clock_drift),
		static_cast<bool>(
			config->echo_removal_control.linear_and_stable_echo_path)
	};

	webrtc::EchoCanceller3Config::EchoModel echo_model;

	echo_model.noise_floor_hold = config->echo_model.noise_floor_hold;
	echo_model.min_noise_floor_power =
			config->echo_model.min_noise_floor_power;
	echo_model.stationary_gate_slope =
			config->echo_model.stationary_gate_slope;
	echo_model.noise_gate_power = config->echo_model.noise_gate_power;
	echo_model.noise_gate_slope = config->echo_model.noise_gate_slope;
	echo_model.render_pre_window_size =
			config->echo_model.render_pre_window_size;
	echo_model.render_post_window_size =
			config->echo_model.render_post_window_size;
	echo_model.render_pre_window_size_init =
			config->echo_model.render_pre_window_size_init;
	echo_model.render_post_window_size_init =
			config->echo_model.render_post_window_size_init;
	echo_model.nonlinear_hold = config->echo_model.nonlinear_hold;
	echo_model.nonlinear_release = config->echo_model.nonlinear_release;

	aec3_config->echo_model = echo_model;

	aec3_config->suppressor.normal_tuning.mask_lf.enr_transparent =
		config->suppressor.normal_tuning.mask_lf.enr_transparent;
	aec3_config->suppressor.normal_tuning.mask_lf.enr_suppress =
		config->suppressor.normal_tuning.mask_lf.enr_suppress;
	aec3_config->suppressor.normal_tuning.mask_lf.emr_transparent =
		config->suppressor.normal_tuning.mask_lf.emr_transparent;
	aec3_config->suppressor.normal_tuning.mask_hf.enr_transparent =
		config->suppressor.normal_tuning.mask_hf.enr_transparent;
	aec3_config->suppressor.normal_tuning.mask_hf.enr_suppress =
		config->suppressor.normal_tuning.mask_hf.enr_suppress;
	aec3_config->suppressor.normal_tuning.mask_hf.emr_transparent =
		config->suppressor.normal_tuning.mask_hf.emr_transparent;
	aec3_config->suppressor.normal_tuning.max_inc_factor =
		config->suppressor.normal_tuning.max_inc_factor;
	aec3_config->suppressor.normal_tuning.max_dec_factor_lf =
		config->suppressor.normal_tuning.max_dec_factor_lf;

	aec3_config->suppressor.nearend_tuning.mask_lf.enr_transparent =
		config->suppressor.nearend_tuning.mask_lf.enr_transparent;
	aec3_config->suppressor.nearend_tuning.mask_lf.enr_suppress =
		config->suppressor.nearend_tuning.mask_lf.enr_suppress;
	aec3_config->suppressor.nearend_tuning.mask_lf.emr_transparent =
		config->suppressor.nearend_tuning.mask_lf.emr_transparent;
	aec3_config->suppressor.nearend_tuning.mask_hf.enr_transparent =
		config->suppressor.nearend_tuning.mask_hf.enr_transparent;
	aec3_config->suppressor.nearend_tuning.mask_hf.enr_suppress =
		config->suppressor.nearend_tuning.mask_hf.enr_suppress,
	aec3_config->suppressor.nearend_tuning.mask_hf.emr_transparent =
		config->suppressor.nearend_tuning.mask_hf.emr_transparent;
	aec3_config->suppressor.nearend_tuning.max_inc_factor =
		config->suppressor.nearend_tuning.max_inc_factor;
	aec3_config->suppressor.nearend_tuning.max_dec_factor_lf =
		config->suppressor.nearend_tuning.max_dec_factor_lf;

	aec3_config->suppressor.dominant_nearend_detection.enr_threshold =
		config->suppressor.dominant_nearend_detection.enr_threshold;
	aec3_config->suppressor.dominant_nearend_detection.snr_threshold =
		config->suppressor.dominant_nearend_detection.snr_threshold;
	aec3_config->suppressor.dominant_nearend_detection.hold_duration =
		config->suppressor.dominant_nearend_detection.hold_duration;
	aec3_config->suppressor.dominant_nearend_detection.trigger_threshold =
		config->suppressor.dominant_nearend_detection.trigger_threshold;

	aec3_config->suppressor.high_bands_suppression.enr_threshold =
		config->suppressor.high_bands_suppression.enr_threshold;
	aec3_config->suppressor.high_bands_suppression.max_gain_during_echo =
		config->suppressor.high_bands_suppression.max_gain_during_echo;

	aec3_config->suppressor.floor_first_increase =
		config->suppressor.floor_first_increase;
	aec3_config->suppressor.enforce_transparent =
		config->suppressor.enforce_transparent;
	aec3_config->suppressor.enforce_empty_higher_bands =
		config->suppressor.enforce_empty_higher_bands;

	return 0;
}

int convert_to_ap_config(struct apm_config *apm_config,
			 webrtc::AudioProcessing::Config *ap_config)
{
	ap_config->residual_echo_detector.enabled =
		apm_config->residual_echo_detector_enabled;
	ap_config->high_pass_filter.enabled =
		apm_config->high_pass_filter_enabled;
	ap_config->pre_amplifier.enabled =
		apm_config->pre_amplifier_enabled;
	ap_config->pre_amplifier.fixed_gain_factor =
		apm_config->pre_amplifier_fixed_gain_factor;
	ap_config->gain_controller2.enabled =
		apm_config->gain_controller2_enabled;
	ap_config->gain_controller2.fixed_gain_db =
		apm_config->gain_controller2_fixed_gain_db;
	ap_config->gain_controller2.adaptive_digital_mode =
		apm_config->gain_controller2_adaptive_digital_mode;
	return 0;
}

webrtc_apm webrtc_apm_create(unsigned int num_channels,
			     unsigned int frame_rate,
			     struct aec_config *aec_config,
			     struct apm_config *apm_config)
{
	int err;
	webrtc::AudioProcessing *apm;
	webrtc::AudioProcessing::ChannelLayout channel_layout;
	webrtc::AudioProcessingBuilder apm_builder;
	webrtc::EchoCanceller3Config aec3_config;
	std::unique_ptr<webrtc::EchoControlFactory> ec3_factory;
	webrtc::AudioProcessing::Config ap_config;
	webrtc::GainControl::Mode agc_mode;
	webrtc::NoiseSuppression::Level ns_level;

	if (aec_config) {
		convert_to_aec3_config(aec_config, &aec3_config);
		ec3_factory.reset(
			new webrtc::EchoCanceller3Factory(aec3_config));
	} else {
		ec3_factory.reset(new webrtc::EchoCanceller3Factory());
	}

	switch (num_channels) {
		case 1:
			channel_layout = webrtc::AudioProcessing::kMono;
			break;
		case 2:
			channel_layout = webrtc::AudioProcessing::kStereo;
			break;
		default:
			return NULL;
	}

	apm_builder.SetEchoControlFactory(std::move(ec3_factory));
	apm = apm_builder.Create();

	if (apm_config) {
		convert_to_ap_config(apm_config, &ap_config);
		apm->ApplyConfig(ap_config);

		/* Configure AGC1 */
		switch (apm_config->agc_mode) {
		case ADAPTIVE_ANALOG:
			agc_mode = webrtc::GainControl::Mode::kAdaptiveAnalog;
			break;
		case ADAPTIVE_DIGITAL:
			agc_mode = webrtc::GainControl::Mode::kAdaptiveDigital;
			break;
		case FIXED_DITIGAL:
			agc_mode = webrtc::GainControl::Mode::kFixedDigital;
			break;
		default:
			return NULL;
		}
		apm->gain_control()->set_compression_gain_db(
				apm_config->gain_control_compression_gain_db);
		apm->gain_control()->set_mode(agc_mode);
		apm->gain_control()->Enable(
				apm_config->gain_control_enabled);
		/* Configure noise suppression */
		switch (apm_config->ns_level) {
		case LOW:
			ns_level = webrtc::NoiseSuppression::Level::kLow;
			break;
		case MODERATE:
			ns_level = webrtc::NoiseSuppression::Level::kModerate;
			break;
		case HIGH:
			ns_level = webrtc::NoiseSuppression::Level::kHigh;
			break;
		case VERY_HIGH:
			ns_level = webrtc::NoiseSuppression::Level::kVeryHigh;
			break;
		default:
			return NULL;

		}
		apm->noise_suppression()->set_level(ns_level);
		apm->noise_suppression()->Enable(
				apm_config->noise_suppression_enabled);
	}

	err = apm->Initialize(frame_rate, frame_rate, frame_rate,
			      channel_layout, channel_layout, channel_layout);
	if (err) {
		delete apm;
		return NULL;
	}

	return reinterpret_cast<webrtc_apm>(apm);
}

int webrtc_apm_process_reverse_stream_f(
		webrtc_apm ptr,
		int num_channels, int rate,
		float *const *data)
{
	webrtc::AudioProcessing *apm;
	webrtc::StreamConfig config =
		webrtc::StreamConfig(rate, num_channels);

	apm = reinterpret_cast<webrtc::AudioProcessing *>(ptr);

	return apm->ProcessReverseStream(data, config, config, data);
}

int webrtc_apm_process_reverse_stream(webrtc_apm ptr,
				     int num_channels, int rate,
				     int16_t *data, int nframes)
{
	webrtc::AudioFrame af;
	webrtc::AudioProcessing *apm;

	apm = reinterpret_cast<webrtc::AudioProcessing *>(ptr);

	af.UpdateFrame(0xFFFFFFFF, data, nframes, rate,
		       webrtc::AudioFrame::kNormalSpeech,
		       webrtc::AudioFrame::kVadUnknown,
		       num_channels);
	return apm->ProcessReverseStream(&af);
}

int webrtc_apm_process_stream_f(webrtc_apm ptr,
				int num_channels,
				int rate,
				float *const *data)
{
	webrtc::AudioProcessing *apm;

	webrtc::StreamConfig config =
		webrtc::StreamConfig(rate, num_channels);
	apm = reinterpret_cast<webrtc::AudioProcessing *>(ptr);
	return apm->ProcessStream(data, config, config, data);
}


int webrtc_apm_process_stream(webrtc_apm ptr, int num_channels,
			     int rate, int16_t *data, int nframes)
{
	int ret;
	webrtc::AudioFrame af;
	webrtc::AudioProcessing *apm;

	apm = reinterpret_cast<webrtc::AudioProcessing *>(ptr);
	//set stream delay
	af.UpdateFrame(0xFFFFFFFF, data, nframes, rate,
			webrtc::AudioFrame::kNormalSpeech,
			webrtc::AudioFrame::kVadUnknown,
			num_channels);
	ret = apm->ProcessStream(&af);
	if (ret)
		return ret;

	memcpy(data, af.data(), nframes * num_channels * 2);
	return ret;
}

void webrtc_apm_destroy(webrtc_apm ptr)
{
	webrtc::AudioProcessing *apm;
	apm = reinterpret_cast<webrtc::AudioProcessing *>(ptr);
	delete apm;
}

int webrtc_apm_set_stream_delay(webrtc_apm ptr, int delay_ms)
{
	webrtc::AudioProcessing *apm;

	apm = reinterpret_cast<webrtc::AudioProcessing *>(ptr);
	return apm->set_stream_delay_ms(delay_ms);
}

int webrtc_apm_aec_dump(webrtc_apm ptr, void** wq_ptr, int start, FILE *handle)
{
	webrtc::AudioProcessing *apm;
	rtc::TaskQueue *work_queue;

	apm = reinterpret_cast<webrtc::AudioProcessing *>(ptr);

	if (start) {
		work_queue = new rtc::TaskQueue("aecdump-worker-queue",
						rtc::TaskQueue::Priority::LOW);
		auto aec_dump = webrtc::AecDumpFactory::Create(handle, -1, work_queue);
		if (!aec_dump)
			return -ENOMEM;
		apm->AttachAecDump(std::move(aec_dump));
		*wq_ptr = reinterpret_cast<void *>(work_queue);
	} else {
		apm->DetachAecDump();
		work_queue = reinterpret_cast<rtc::TaskQueue *>(*wq_ptr);
		if (work_queue) {
			delete work_queue;
			work_queue = NULL;
		}
	}
	return 0;
}

} // extern "C"
