# Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.
#
# Use of this source code is governed by a BSD-style license
# that can be found in the LICENSE file in the root of the source
# tree. An additional intellectual property rights grant can be found
# in the file PATENTS.  All contributing project authors may
# be found in the AUTHORS file in the root of the source tree.

import("../../../webrtc.gni")

rtc_library("aec3") {
  visibility = [ "*" ]
  configs += [ "..:apm_debug_dump" ]
  sources = [
    "adaptive_fir_filter.cc",
    "adaptive_fir_filter_erl.cc",
    "aec3_common.cc",
    "aec3_fft.cc",
    "aec_state.cc",
    "aec_state.h",
    "alignment_mixer.cc",
    "alignment_mixer.h",
    "api_call_jitter_metrics.cc",
    "api_call_jitter_metrics.h",
    "block.h",
    "block_buffer.cc",
    "block_delay_buffer.cc",
    "block_delay_buffer.h",
    "block_framer.cc",
    "block_framer.h",
    "block_processor.cc",
    "block_processor.h",
    "block_processor_metrics.cc",
    "block_processor_metrics.h",
    "clockdrift_detector.cc",
    "clockdrift_detector.h",
    "coarse_filter_update_gain.cc",
    "coarse_filter_update_gain.h",
    "comfort_noise_generator.cc",
    "comfort_noise_generator.h",
    "config_selector.cc",
    "config_selector.h",
    "decimator.cc",
    "decimator.h",
    "delay_estimate.h",
    "dominant_nearend_detector.cc",
    "dominant_nearend_detector.h",
    "downsampled_render_buffer.cc",
    "downsampled_render_buffer.h",
    "echo_audibility.cc",
    "echo_audibility.h",
    "echo_canceller3.cc",
    "echo_canceller3.h",
    "echo_path_delay_estimator.cc",
    "echo_path_delay_estimator.h",
    "echo_path_variability.cc",
    "echo_path_variability.h",
    "echo_remover.cc",
    "echo_remover.h",
    "echo_remover_metrics.cc",
    "echo_remover_metrics.h",
    "erl_estimator.cc",
    "erl_estimator.h",
    "erle_estimator.cc",
    "erle_estimator.h",
    "fft_buffer.cc",
    "filter_analyzer.cc",
    "filter_analyzer.h",
    "frame_blocker.cc",
    "frame_blocker.h",
    "fullband_erle_estimator.cc",
    "fullband_erle_estimator.h",
    "matched_filter.cc",
    "matched_filter_lag_aggregator.cc",
    "matched_filter_lag_aggregator.h",
    "moving_average.cc",
    "moving_average.h",
    "multi_channel_content_detector.cc",
    "multi_channel_content_detector.h",
    "nearend_detector.h",
    "refined_filter_update_gain.cc",
    "refined_filter_update_gain.h",
    "render_buffer.cc",
    "render_delay_buffer.cc",
    "render_delay_buffer.h",
    "render_delay_controller.cc",
    "render_delay_controller.h",
    "render_delay_controller_metrics.cc",
    "render_delay_controller_metrics.h",
    "render_signal_analyzer.cc",
    "render_signal_analyzer.h",
    "residual_echo_estimator.cc",
    "residual_echo_estimator.h",
    "reverb_decay_estimator.cc",
    "reverb_decay_estimator.h",
    "reverb_frequency_response.cc",
    "reverb_frequency_response.h",
    "reverb_model.cc",
    "reverb_model.h",
    "reverb_model_estimator.cc",
    "reverb_model_estimator.h",
    "signal_dependent_erle_estimator.cc",
    "signal_dependent_erle_estimator.h",
    "spectrum_buffer.cc",
    "stationarity_estimator.cc",
    "stationarity_estimator.h",
    "subband_erle_estimator.cc",
    "subband_erle_estimator.h",
    "subband_nearend_detector.cc",
    "subband_nearend_detector.h",
    "subtractor.cc",
    "subtractor.h",
    "subtractor_output.cc",
    "subtractor_output.h",
    "subtractor_output_analyzer.cc",
    "subtractor_output_analyzer.h",
    "suppression_filter.cc",
    "suppression_filter.h",
    "suppression_gain.cc",
    "suppression_gain.h",
    "transparent_mode.cc",
    "transparent_mode.h",
  ]

  defines = []
  if (rtc_build_with_neon && current_cpu != "arm64") {
    suppressed_configs += [ "//build/config/compiler:compiler_arm_fpu" ]
    cflags = [ "-mfpu=neon" ]
  }

  deps = [
    ":adaptive_fir_filter",
    ":adaptive_fir_filter_erl",
    ":aec3_common",
    ":aec3_fft",
    ":fft_data",
    ":matched_filter",
    ":render_buffer",
    ":vector_math",
    "..:apm_logging",
    "..:audio_buffer",
    "..:high_pass_filter",
    "../../../api:array_view",
    "../../../api/audio:aec3_config",
    "../../../api/audio:echo_control",
    "../../../common_audio:common_audio_c",
    "../../../rtc_base:checks",
    "../../../rtc_base:logging",
    "../../../rtc_base:macromagic",
    "../../../rtc_base:race_checker",
    "../../../rtc_base:safe_minmax",
    "../../../rtc_base:swap_queue",
    "../../../rtc_base/experiments:field_trial_parser",
    "../../../rtc_base/system:arch",
    "../../../system_wrappers",
    "../../../system_wrappers:field_trial",
    "../../../system_wrappers:metrics",
    "../utility:cascaded_biquad_filter",
  ]
  absl_deps = [
    "//third_party/abseil-cpp/absl/strings",
    "//third_party/abseil-cpp/absl/types:optional",
  ]

  if (current_cpu == "x86" || current_cpu == "x64") {
    deps += [ ":aec3_avx2" ]
  }
}

rtc_source_set("aec3_common") {
  sources = [ "aec3_common.h" ]
}

rtc_source_set("aec3_fft") {
  sources = [ "aec3_fft.h" ]
  deps = [
    ":aec3_common",
    ":fft_data",
    "../../../api:array_view",
    "../../../common_audio/third_party/ooura:fft_size_128",
    "../../../rtc_base:checks",
    "../../../rtc_base/system:arch",
  ]
}

rtc_source_set("render_buffer") {
  sources = [
    "block.h",
    "block_buffer.h",
    "fft_buffer.h",
    "render_buffer.h",
    "spectrum_buffer.h",
  ]
  deps = [
    ":aec3_common",
    ":fft_data",
    "../../../api:array_view",
    "../../../rtc_base:checks",
    "../../../rtc_base/system:arch",
  ]
}

rtc_source_set("adaptive_fir_filter") {
  sources = [ "adaptive_fir_filter.h" ]
  deps = [
    ":aec3_common",
    ":aec3_fft",
    ":fft_data",
    ":render_buffer",
    "..:apm_logging",
    "../../../api:array_view",
    "../../../rtc_base/system:arch",
  ]
  absl_deps = [ "//third_party/abseil-cpp/absl/strings" ]
}

rtc_source_set("adaptive_fir_filter_erl") {
  sources = [ "adaptive_fir_filter_erl.h" ]
  deps = [
    ":aec3_common",
    "../../../api:array_view",
    "../../../rtc_base/system:arch",
  ]
}

rtc_source_set("matched_filter") {
  sources = [ "matched_filter.h" ]
  deps = [
    ":aec3_common",
    "../../../api:array_view",
    "../../../rtc_base:gtest_prod",
    "../../../rtc_base/system:arch",
  ]
  absl_deps = [ "//third_party/abseil-cpp/absl/types:optional" ]
}

rtc_source_set("vector_math") {
  sources = [ "vector_math.h" ]
  deps = [
    ":aec3_common",
    "../../../api:array_view",
    "../../../rtc_base:checks",
    "../../../rtc_base/system:arch",
  ]
}

rtc_source_set("fft_data") {
  sources = [ "fft_data.h" ]
  deps = [
    ":aec3_common",
    "../../../api:array_view",
    "../../../rtc_base/system:arch",
  ]
}

if (current_cpu == "x86" || current_cpu == "x64") {
  rtc_library("aec3_avx2") {
    configs += [ "..:apm_debug_dump" ]
    sources = [
      "adaptive_fir_filter_avx2.cc",
      "adaptive_fir_filter_erl_avx2.cc",
      "fft_data_avx2.cc",
      "matched_filter_avx2.cc",
      "vector_math_avx2.cc",
    ]

    if (is_win) {
      cflags = [ "/arch:AVX2" ]
    } else {
      cflags = [
        "-mavx2",
        "-mfma",
      ]
    }

    deps = [
      ":adaptive_fir_filter",
      ":adaptive_fir_filter_erl",
      ":fft_data",
      ":matched_filter",
      ":vector_math",
      "../../../api:array_view",
      "../../../rtc_base:checks",
    ]
  }
}

if (rtc_include_tests) {
  rtc_library("aec3_unittests") {
    testonly = true

    configs += [ "..:apm_debug_dump" ]
    sources = [
      "mock/mock_block_processor.cc",
      "mock/mock_block_processor.h",
      "mock/mock_echo_remover.cc",
      "mock/mock_echo_remover.h",
      "mock/mock_render_delay_buffer.cc",
      "mock/mock_render_delay_buffer.h",
      "mock/mock_render_delay_controller.cc",
      "mock/mock_render_delay_controller.h",
    ]

    deps = [
      ":adaptive_fir_filter",
      ":adaptive_fir_filter_erl",
      ":aec3",
      ":aec3_common",
      ":aec3_fft",
      ":fft_data",
      ":matched_filter",
      ":render_buffer",
      ":vector_math",
      "..:apm_logging",
      "..:audio_buffer",
      "..:audio_processing",
      "..:high_pass_filter",
      "../../../api:array_view",
      "../../../api/audio:aec3_config",
      "../../../rtc_base:checks",
      "../../../rtc_base:macromagic",
      "../../../rtc_base:random",
      "../../../rtc_base:safe_minmax",
      "../../../rtc_base:stringutils",
      "../../../rtc_base/system:arch",
      "../../../system_wrappers",
      "../../../system_wrappers:metrics",
      "../../../test:field_trial",
      "../../../test:test_support",
      "../utility:cascaded_biquad_filter",
    ]
    absl_deps = [ "//third_party/abseil-cpp/absl/types:optional" ]

    defines = []

    if (rtc_enable_protobuf) {
      sources += [
        "adaptive_fir_filter_erl_unittest.cc",
        "adaptive_fir_filter_unittest.cc",
        "aec3_fft_unittest.cc",
        "aec_state_unittest.cc",
        "alignment_mixer_unittest.cc",
        "api_call_jitter_metrics_unittest.cc",
        "block_delay_buffer_unittest.cc",
        "block_framer_unittest.cc",
        "block_processor_metrics_unittest.cc",
        "block_processor_unittest.cc",
        "clockdrift_detector_unittest.cc",
        "coarse_filter_update_gain_unittest.cc",
        "comfort_noise_generator_unittest.cc",
        "config_selector_unittest.cc",
        "decimator_unittest.cc",
        "echo_canceller3_unittest.cc",
        "echo_path_delay_estimator_unittest.cc",
        "echo_path_variability_unittest.cc",
        "echo_remover_metrics_unittest.cc",
        "echo_remover_unittest.cc",
        "erl_estimator_unittest.cc",
        "erle_estimator_unittest.cc",
        "fft_data_unittest.cc",
        "filter_analyzer_unittest.cc",
        "frame_blocker_unittest.cc",
        "matched_filter_lag_aggregator_unittest.cc",
        "matched_filter_unittest.cc",
        "moving_average_unittest.cc",
        "multi_channel_content_detector_unittest.cc",
        "refined_filter_update_gain_unittest.cc",
        "render_buffer_unittest.cc",
        "render_delay_buffer_unittest.cc",
        "render_delay_controller_metrics_unittest.cc",
        "render_delay_controller_unittest.cc",
        "render_signal_analyzer_unittest.cc",
        "residual_echo_estimator_unittest.cc",
        "reverb_model_estimator_unittest.cc",
        "signal_dependent_erle_estimator_unittest.cc",
        "subtractor_unittest.cc",
        "suppression_filter_unittest.cc",
        "suppression_gain_unittest.cc",
        "vector_math_unittest.cc",
      ]
    }

    if (!build_with_chromium) {
      deps += [ "..:audio_processing_unittests" ]
    }
  }
}