# Copyright (c) 2014 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("//build/config/arm.gni")
import("//third_party/protobuf/proto_library.gni")
import("../../build/webrtc.gni")

declare_args() {
  # Disables the usual mode where we trust the reported system delay
  # values the AEC receives. The corresponding define is set appropriately
  # in the code, but it can be force-enabled here for testing.
  aec_untrusted_delay_for_testing = false
}

rtc_static_library("audio_processing") {
  sources = [
    "aec/aec_core.cc",
    "aec/aec_core.h",
    "aec/aec_core_optimized_methods.h",
    "aec/aec_rdft.cc",
    "aec/aec_rdft.h",
    "aec/aec_resampler.cc",
    "aec/aec_resampler.h",
    "aec/echo_cancellation.cc",
    "aec/echo_cancellation.h",
    "aecm/aecm_core.cc",
    "aecm/aecm_core.h",
    "aecm/echo_control_mobile.cc",
    "aecm/echo_control_mobile.h",
    "agc/agc.cc",
    "agc/agc.h",
    "agc/agc_manager_direct.cc",
    "agc/agc_manager_direct.h",
    "agc/gain_map_internal.h",
    "agc/legacy/analog_agc.c",
    "agc/legacy/analog_agc.h",
    "agc/legacy/digital_agc.c",
    "agc/legacy/digital_agc.h",
    "agc/legacy/gain_control.h",
    "agc/loudness_histogram.cc",
    "agc/loudness_histogram.h",
    "agc/utility.cc",
    "agc/utility.h",
    "audio_buffer.cc",
    "audio_buffer.h",
    "audio_processing.cc",
    "audio_processing_impl.cc",
    "audio_processing_impl.h",
    "beamformer/array_util.cc",
    "beamformer/array_util.h",
    "beamformer/complex_matrix.h",
    "beamformer/covariance_matrix_generator.cc",
    "beamformer/covariance_matrix_generator.h",
    "beamformer/matrix.h",
    "beamformer/nonlinear_beamformer.cc",
    "beamformer/nonlinear_beamformer.h",
    "common.h",
    "echo_cancellation_impl.cc",
    "echo_cancellation_impl.h",
    "echo_control_mobile_impl.cc",
    "echo_control_mobile_impl.h",
    "gain_control_for_experimental_agc.cc",
    "gain_control_for_experimental_agc.h",
    "gain_control_impl.cc",
    "gain_control_impl.h",
    "high_pass_filter_impl.cc",
    "high_pass_filter_impl.h",
    "include/audio_processing.h",
    "include/config.cc",
    "include/config.h",
    "level_controller/biquad_filter.cc",
    "level_controller/biquad_filter.h",
    "level_controller/down_sampler.cc",
    "level_controller/down_sampler.h",
    "level_controller/gain_applier.cc",
    "level_controller/gain_applier.h",
    "level_controller/gain_selector.cc",
    "level_controller/gain_selector.h",
    "level_controller/lc_constants.h",
    "level_controller/level_controller.cc",
    "level_controller/level_controller.h",
    "level_controller/noise_level_estimator.cc",
    "level_controller/noise_level_estimator.h",
    "level_controller/noise_spectrum_estimator.cc",
    "level_controller/noise_spectrum_estimator.h",
    "level_controller/peak_level_estimator.cc",
    "level_controller/peak_level_estimator.h",
    "level_controller/saturating_gain_estimator.cc",
    "level_controller/saturating_gain_estimator.h",
    "level_controller/signal_classifier.cc",
    "level_controller/signal_classifier.h",
    "level_estimator_impl.cc",
    "level_estimator_impl.h",
    "logging/apm_data_dumper.cc",
    "logging/apm_data_dumper.h",
    "noise_suppression_impl.cc",
    "noise_suppression_impl.h",
    "render_queue_item_verifier.h",
    "rms_level.cc",
    "rms_level.h",
    "splitting_filter.cc",
    "splitting_filter.h",
    "three_band_filter_bank.cc",
    "three_band_filter_bank.h",
    "transient/common.h",
    "transient/daubechies_8_wavelet_coeffs.h",
    "transient/dyadic_decimator.h",
    "transient/moving_moments.cc",
    "transient/moving_moments.h",
    "transient/transient_detector.cc",
    "transient/transient_detector.h",
    "transient/transient_suppressor.cc",
    "transient/transient_suppressor.h",
    "transient/wpd_node.cc",
    "transient/wpd_node.h",
    "transient/wpd_tree.cc",
    "transient/wpd_tree.h",
    "typing_detection.cc",
    "typing_detection.h",
    "utility/block_mean_calculator.cc",
    "utility/block_mean_calculator.h",
    "utility/delay_estimator.cc",
    "utility/delay_estimator.h",
    "utility/delay_estimator_internal.h",
    "utility/delay_estimator_wrapper.cc",
    "utility/delay_estimator_wrapper.h",
    "vad/common.h",
    "vad/gmm.cc",
    "vad/gmm.h",
    "vad/noise_gmm_tables.h",
    "vad/pitch_based_vad.cc",
    "vad/pitch_based_vad.h",
    "vad/pitch_internal.cc",
    "vad/pitch_internal.h",
    "vad/pole_zero_filter.cc",
    "vad/pole_zero_filter.h",
    "vad/standalone_vad.cc",
    "vad/standalone_vad.h",
    "vad/vad_audio_proc.cc",
    "vad/vad_audio_proc.h",
    "vad/vad_audio_proc_internal.h",
    "vad/vad_circular_buffer.cc",
    "vad/vad_circular_buffer.h",
    "vad/voice_activity_detector.cc",
    "vad/voice_activity_detector.h",
    "vad/voice_gmm_tables.h",
    "voice_detection_impl.cc",
    "voice_detection_impl.h",
  ]

  defines = []
  deps = [
    "../..:webrtc_common",
    "../audio_coding:isac",
  ]

  if (apm_debug_dump) {
    defines += [ "WEBRTC_APM_DEBUG_DUMP=1" ]
  } else {
    defines += [ "WEBRTC_APM_DEBUG_DUMP=0" ]
  }

  if (aec_untrusted_delay_for_testing) {
    defines += [ "WEBRTC_UNTRUSTED_DELAY" ]
  }

  if (rtc_enable_protobuf) {
    defines += [ "WEBRTC_AUDIOPROC_DEBUG_DUMP" ]
    deps += [ ":audioproc_debug_proto" ]
  }

  if (rtc_enable_intelligibility_enhancer) {
    defines += [ "WEBRTC_INTELLIGIBILITY_ENHANCER=1" ]
    sources += [
      "intelligibility/intelligibility_enhancer.cc",
      "intelligibility/intelligibility_enhancer.h",
      "intelligibility/intelligibility_utils.cc",
      "intelligibility/intelligibility_utils.h",
    ]
  } else {
    defines += [ "WEBRTC_INTELLIGIBILITY_ENHANCER=0" ]
  }

  if (rtc_prefer_fixed_point) {
    defines += [ "WEBRTC_NS_FIXED" ]
    sources += [
      "ns/noise_suppression_x.c",
      "ns/noise_suppression_x.h",
      "ns/nsx_core.c",
      "ns/nsx_core.h",
      "ns/nsx_defines.h",
    ]
    if (current_cpu == "mipsel") {
      sources += [ "ns/nsx_core_mips.c" ]
    } else {
      sources += [ "ns/nsx_core_c.c" ]
    }
  } else {
    defines += [ "WEBRTC_NS_FLOAT" ]
    sources += [
      "ns/defines.h",
      "ns/noise_suppression.c",
      "ns/noise_suppression.h",
      "ns/ns_core.c",
      "ns/ns_core.h",
      "ns/windows_private.h",
    ]
  }

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

  if (rtc_build_with_neon) {
    deps += [ ":audio_processing_neon" ]
  }

  if (current_cpu == "mipsel") {
    sources += [ "aecm/aecm_core_mips.cc" ]
    if (mips_float_abi == "hard") {
      sources += [
        "aec/aec_core_mips.cc",
        "aec/aec_rdft_mips.cc",
      ]
    }
  } else {
    sources += [ "aecm/aecm_core_c.cc" ]
  }

  # TODO(jschuh): Bug 1348: fix this warning.
  configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]

  deps += [
    "../../base:rtc_base_approved",
    "../../common_audio",
    "../../system_wrappers",
  ]
}

if (rtc_enable_protobuf) {
  proto_library("audioproc_debug_proto") {
    sources = [
      "debug.proto",
    ]

    proto_out_dir = "webrtc/modules/audio_processing"
  }
}

if (current_cpu == "x86" || current_cpu == "x64") {
  rtc_static_library("audio_processing_sse2") {
    sources = [
      "aec/aec_core_sse2.cc",
      "aec/aec_rdft_sse2.cc",
    ]

    if (is_posix) {
      cflags = [ "-msse2" ]
    }

    if (apm_debug_dump) {
      defines = [ "WEBRTC_APM_DEBUG_DUMP=1" ]
    } else {
      defines = [ "WEBRTC_APM_DEBUG_DUMP=0" ]
    }
  }
}

if (rtc_build_with_neon) {
  rtc_static_library("audio_processing_neon") {
    sources = [
      "aec/aec_core_neon.cc",
      "aec/aec_rdft_neon.cc",
      "aecm/aecm_core_neon.cc",
      "ns/nsx_core_neon.c",
    ]

    if (current_cpu != "arm64") {
      # Enable compilation for the NEON instruction set. This is needed
      # since //build/config/arm.gni only enables NEON for iOS, not Android.
      # This provides the same functionality as webrtc/build/arm_neon.gypi.
      suppressed_configs += [ "//build/config/compiler:compiler_arm_fpu" ]
      cflags = [ "-mfpu=neon" ]
    }

    # Disable LTO on NEON targets due to compiler bug.
    # TODO(fdegans): Enable this. See crbug.com/408997.
    if (rtc_use_lto) {
      cflags -= [
        "-flto",
        "-ffat-lto-objects",
      ]
    }

    deps = [
      "../../common_audio",
    ]

    if (apm_debug_dump) {
      defines = [ "WEBRTC_APM_DEBUG_DUMP=1" ]
    } else {
      defines = [ "WEBRTC_APM_DEBUG_DUMP=0" ]
    }
  }
}

if (rtc_include_tests) {
  rtc_executable("audioproc") {
    testonly = true
    sources = [
      "test/process_test.cc",
    ]

    deps = [
      ":audio_processing",
      ":audioproc_debug_proto",
      ":audioproc_protobuf_utils",
      ":audioproc_test_utils",
      "../../system_wrappers",
      "../../system_wrappers:system_wrappers_default",
      "../../test:test_support",
      "//testing/gtest",
      "//third_party/gflags:gflags",
    ]
  }  # audioproc

  rtc_executable("unpack_aecdump") {
    testonly = true
    sources = [
      "test/unpack.cc",
    ]

    deps = [
      ":audio_processing",
      ":audioproc_debug_proto",
      ":audioproc_protobuf_utils",
      ":audioproc_test_utils",
      "../../common_audio",
      "../../system_wrappers:system_wrappers_default",
      "//third_party/gflags:gflags",
    ]
  }  # unpack_aecdump

  rtc_executable("audioproc_f") {
    testonly = true
    sources = [
      "test/aec_dump_based_simulator.cc",
      "test/aec_dump_based_simulator.h",
      "test/audio_processing_simulator.cc",
      "test/audio_processing_simulator.h",
      "test/audioproc_float.cc",
      "test/wav_based_simulator.cc",
      "test/wav_based_simulator.h",
    ]

    deps = [
      ":audio_processing",
      ":audioproc_debug_proto",
      ":audioproc_protobuf_utils",
      ":audioproc_test_utils",
      "../../system_wrappers",
      "../../system_wrappers:system_wrappers_default",
      "../../test:test_support",
      "//testing/gtest",
      "//third_party/gflags:gflags",
    ]
  }  # audioproc_f

  rtc_source_set("audioproc_test_utils") {
    testonly = true
    sources = [
      "test/audio_buffer_tools.cc",
      "test/audio_buffer_tools.h",
      "test/test_utils.cc",
      "test/test_utils.h",
    ]

    deps = [
      "../../base:rtc_base_approved",
      "../../common_audio",
    ]
  }

  rtc_executable("transient_suppression_test") {
    testonly = true
    sources = [
      "transient/file_utils.cc",
      "transient/file_utils.h",
      "transient/transient_suppression_test.cc",
    ]
    deps = [
      ":audio_processing",
      "../../system_wrappers:metrics_default",
      "../../test:test_support",
      "//testing/gtest",
      "//third_party/gflags",
    ]
  }

  rtc_executable("click_annotate") {
    testonly = true
    sources = [
      "transient/click_annotate.cc",
      "transient/file_utils.cc",
      "transient/file_utils.h",
    ]
    deps = [
      ":audio_processing",
      "../../system_wrappers:metrics_default",
    ]
  }

  rtc_executable("nonlinear_beamformer_test") {
    testonly = true
    sources = [
      "beamformer/nonlinear_beamformer_test.cc",
    ]
    deps = [
      ":audio_processing",
      ":audioproc_test_utils",
      "../../system_wrappers:metrics_default",
      "//third_party/gflags",
    ]
  }

  if (rtc_enable_intelligibility_enhancer) {
    rtc_executable("intelligibility_proc") {
      testonly = true
      sources = [
        "intelligibility/test/intelligibility_proc.cc",
      ]
      deps = [
        ":audio_processing",
        ":audioproc_test_utils",
        "../../system_wrappers:metrics_default",
        "../../test:test_support",
        "//testing/gtest",
        "//third_party/gflags",
      ]
    }
  }

  if (rtc_enable_protobuf) {
    proto_library("audioproc_unittest_proto") {
      sources = [
        "test/unittest.proto",
      ]
      proto_out_dir = "webrtc/modules/audio_processing"
    }

    rtc_static_library("audioproc_protobuf_utils") {
      sources = [
        "test/protobuf_utils.cc",
        "test/protobuf_utils.h",
      ]

      deps = [
        ":audioproc_debug_proto",
      ]
    }
  }
}
