# 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("../webrtc.gni")

visibility = [ ":*" ]

rtc_static_library("common_audio") {
  visibility += [ "*" ]
  sources = [
    "audio_converter.cc",
    "audio_converter.h",
    "audio_util.cc",
    "channel_buffer.cc",
    "channel_buffer.h",
    "include/audio_util.h",
    "real_fourier.cc",
    "real_fourier.h",
    "real_fourier_ooura.cc",
    "real_fourier_ooura.h",
    "resampler/include/push_resampler.h",
    "resampler/include/resampler.h",
    "resampler/push_resampler.cc",
    "resampler/push_sinc_resampler.cc",
    "resampler/push_sinc_resampler.h",
    "resampler/resampler.cc",
    "resampler/sinc_resampler.cc",
    "smoothing_filter.cc",
    "smoothing_filter.h",
    "sparse_fir_filter.cc",
    "sparse_fir_filter.h",
    "vad/include/vad.h",
    "vad/vad.cc",
    "wav_file.cc",
    "wav_file.h",
    "wav_header.cc",
    "wav_header.h",
    "window_generator.cc",
    "window_generator.h",
  ]

  deps = [
    ":common_audio_c",
    ":sinc_resampler",
    "../rtc_base:checks",
    "../rtc_base:gtest_prod",
    "../rtc_base:rtc_base_approved",
    "../rtc_base:sanitizer",
    "../rtc_base/memory:aligned_array",
    "../rtc_base/memory:aligned_malloc",
    "../rtc_base/system:arch",
    "../system_wrappers",
    "../system_wrappers:cpu_features_api",
    "third_party/fft4g:fft4g",
    "//third_party/abseil-cpp/absl/container:inlined_vector",
    "//third_party/abseil-cpp/absl/memory",
    "//third_party/abseil-cpp/absl/types:optional",
  ]

  defines = []

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

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

rtc_source_set("mock_common_audio") {
  visibility += webrtc_default_visibility
  testonly = true
  sources = [
    "mocks/mock_smoothing_filter.h",
    "vad/mock/mock_vad.h",
  ]
  deps = [
    ":common_audio",
    "../test:test_support",
  ]
}

rtc_source_set("common_audio_c_arm_asm") {
  sources = []
  deps = []
  if (current_cpu == "arm") {
    sources += [ "signal_processing/complex_bit_reverse_arm.S" ]

    if (arm_version >= 7) {
      sources += [ "signal_processing/filter_ar_fast_q12_armv7.S" ]
    } else {
      sources += [ "signal_processing/filter_ar_fast_q12.c" ]
    }
    deps += [ "../rtc_base/system:asm_defines" ]
  }
}

rtc_source_set("common_audio_c") {
  visibility += webrtc_default_visibility
  sources = [
    "ring_buffer.c",
    "ring_buffer.h",
    "signal_processing/auto_corr_to_refl_coef.c",
    "signal_processing/auto_correlation.c",
    "signal_processing/complex_fft_tables.h",
    "signal_processing/copy_set_operations.c",
    "signal_processing/cross_correlation.c",
    "signal_processing/division_operations.c",
    "signal_processing/downsample_fast.c",
    "signal_processing/energy.c",
    "signal_processing/filter_ar.c",
    "signal_processing/filter_ma_fast_q12.c",
    "signal_processing/get_hanning_window.c",
    "signal_processing/get_scaling_square.c",
    "signal_processing/ilbc_specific_functions.c",
    "signal_processing/include/real_fft.h",
    "signal_processing/include/signal_processing_library.h",
    "signal_processing/include/spl_inl.h",
    "signal_processing/include/spl_inl_armv7.h",
    "signal_processing/levinson_durbin.c",
    "signal_processing/lpc_to_refl_coef.c",
    "signal_processing/min_max_operations.c",
    "signal_processing/randomization_functions.c",
    "signal_processing/real_fft.c",
    "signal_processing/refl_coef_to_lpc.c",
    "signal_processing/resample.c",
    "signal_processing/resample_48khz.c",
    "signal_processing/resample_by_2.c",
    "signal_processing/resample_by_2_internal.c",
    "signal_processing/resample_by_2_internal.h",
    "signal_processing/resample_fractional.c",
    "signal_processing/spl_init.c",
    "signal_processing/spl_inl.c",
    "signal_processing/spl_sqrt.c",
    "signal_processing/splitting_filter.c",
    "signal_processing/sqrt_of_one_minus_x_squared.c",
    "signal_processing/vector_scaling_operations.c",
    "vad/include/webrtc_vad.h",
    "vad/vad_core.c",
    "vad/vad_core.h",
    "vad/vad_filterbank.c",
    "vad/vad_filterbank.h",
    "vad/vad_gmm.c",
    "vad/vad_gmm.h",
    "vad/vad_sp.c",
    "vad/vad_sp.h",
    "vad/webrtc_vad.c",
  ]

  if (current_cpu == "mipsel") {
    sources += [
      "signal_processing/complex_bit_reverse_mips.c",
      "signal_processing/complex_fft_mips.c",
      "signal_processing/cross_correlation_mips.c",
      "signal_processing/downsample_fast_mips.c",
      "signal_processing/filter_ar_fast_q12_mips.c",
      "signal_processing/include/spl_inl_mips.h",
      "signal_processing/min_max_operations_mips.c",
      "signal_processing/resample_by_2_mips.c",
    ]
    if (mips_dsp_rev > 0) {
      sources += [ "signal_processing/vector_scaling_operations_mips.c" ]
    }
  } else {
    sources += [ "signal_processing/complex_fft.c" ]
  }

  if (current_cpu != "arm" && current_cpu != "mipsel") {
    sources += [
      "signal_processing/complex_bit_reverse.c",
      "signal_processing/filter_ar_fast_q12.c",
    ]
  }

  deps = [
    ":common_audio_c_arm_asm",
    ":common_audio_cc",
    "../rtc_base:checks",
    "../rtc_base:compile_assert_c",
    "../rtc_base:rtc_base_approved",
    "../rtc_base:sanitizer",
    "../rtc_base/system:arch",
    "../system_wrappers",
    "../system_wrappers:cpu_features_api",
    "third_party/fft4g:fft4g",
    "third_party/spl_sqrt_floor",
  ]
}

rtc_source_set("common_audio_cc") {
  sources = [
    "signal_processing/dot_product_with_scale.cc",
    "signal_processing/dot_product_with_scale.h",
  ]

  deps = [
    "../rtc_base:rtc_base_approved",
    "../system_wrappers",
  ]
}

rtc_source_set("sinc_resampler") {
  sources = [
    "resampler/sinc_resampler.h",
  ]
  deps = [
    "../rtc_base:gtest_prod",
    "../rtc_base:rtc_base_approved",
    "../rtc_base/memory:aligned_malloc",
    "../rtc_base/system:arch",
    "../system_wrappers",
  ]
}

rtc_source_set("fir_filter") {
  visibility += webrtc_default_visibility
  sources = [
    "fir_filter.h",
  ]
}

rtc_source_set("fir_filter_factory") {
  visibility += webrtc_default_visibility
  sources = [
    "fir_filter_c.cc",
    "fir_filter_c.h",
    "fir_filter_factory.cc",
    "fir_filter_factory.h",
  ]
  deps = [
    ":fir_filter",
    "../rtc_base:checks",
    "../rtc_base:rtc_base_approved",
    "../rtc_base/system:arch",
    "../system_wrappers:cpu_features_api",
  ]
  if (current_cpu == "x86" || current_cpu == "x64") {
    deps += [ ":common_audio_sse2" ]
  }
  if (rtc_build_with_neon) {
    deps += [ ":common_audio_neon" ]
  }
}

if (current_cpu == "x86" || current_cpu == "x64") {
  rtc_static_library("common_audio_sse2") {
    sources = [
      "fir_filter_sse.cc",
      "fir_filter_sse.h",
      "resampler/sinc_resampler_sse.cc",
    ]

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

    deps = [
      ":fir_filter",
      ":sinc_resampler",
      "../rtc_base:checks",
      "../rtc_base:rtc_base_approved",
      "../rtc_base/memory:aligned_malloc",
    ]
  }
}

if (rtc_build_with_neon) {
  rtc_static_library("common_audio_neon") {
    sources = [
      "fir_filter_neon.cc",
      "fir_filter_neon.h",
      "resampler/sinc_resampler_neon.cc",
    ]

    if (current_cpu != "arm64") {
      # Enable compilation for the NEON instruction set.
      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_neon_c",
      ":fir_filter",
      ":sinc_resampler",
      "../rtc_base:checks",
      "../rtc_base:rtc_base_approved",
      "../rtc_base/memory:aligned_malloc",
    ]
  }

  rtc_source_set("common_audio_neon_c") {
    visibility += webrtc_default_visibility
    sources = [
      "signal_processing/cross_correlation_neon.c",
      "signal_processing/downsample_fast_neon.c",
      "signal_processing/min_max_operations_neon.c",
    ]

    if (current_cpu != "arm64") {
      # Enable compilation for the NEON instruction set.
      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_c",
      "../rtc_base:checks",
      "../rtc_base:rtc_base_approved",
      "../rtc_base/system:arch",
    ]
  }
}

if (rtc_include_tests) {
  rtc_test("common_audio_unittests") {
    visibility += webrtc_default_visibility
    testonly = true

    sources = [
      "audio_converter_unittest.cc",
      "audio_util_unittest.cc",
      "channel_buffer_unittest.cc",
      "fir_filter_unittest.cc",
      "real_fourier_unittest.cc",
      "resampler/push_resampler_unittest.cc",
      "resampler/push_sinc_resampler_unittest.cc",
      "resampler/resampler_unittest.cc",
      "resampler/sinusoidal_linear_chirp_source.cc",
      "resampler/sinusoidal_linear_chirp_source.h",
      "ring_buffer_unittest.cc",
      "signal_processing/real_fft_unittest.cc",
      "signal_processing/signal_processing_unittest.cc",
      "smoothing_filter_unittest.cc",
      "sparse_fir_filter_unittest.cc",
      "vad/vad_core_unittest.cc",
      "vad/vad_filterbank_unittest.cc",
      "vad/vad_gmm_unittest.cc",
      "vad/vad_sp_unittest.cc",
      "vad/vad_unittest.cc",
      "vad/vad_unittest.h",
      "wav_file_unittest.cc",
      "wav_header_unittest.cc",
      "window_generator_unittest.cc",
    ]

    # Does not compile on iOS for arm: webrtc:5544.
    if (!is_ios || target_cpu != "arm") {
      sources += [ "resampler/sinc_resampler_unittest.cc" ]
    }

    deps = [
      ":common_audio",
      ":common_audio_c",
      ":fir_filter",
      ":fir_filter_factory",
      ":sinc_resampler",
      "../rtc_base:checks",
      "../rtc_base:rtc_base_approved",
      "../rtc_base:rtc_base_tests_utils",
      "../rtc_base/system:arch",
      "../system_wrappers:cpu_features_api",
      "../test:fileutils",
      "../test:test_main",
      "../test:test_support",
      "//testing/gtest",
    ]

    if (is_android) {
      deps += [ "//testing/android/native_test:native_test_support" ]

      shard_timeout = 900
    }
  }
}
