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

visibility = [ ":*" ]

config("common_audio_config") {
  include_dirs = [
    "resampler/include",
    "signal_processing/include",
    "vad/include",
  ]
}

rtc_static_library("common_audio") {
  visibility += [ "*" ]
  sources = [
    "audio_converter.cc",
    "audio_converter.h",
    "audio_ring_buffer.cc",
    "audio_ring_buffer.h",
    "audio_util.cc",
    "blocker.cc",
    "blocker.h",
    "channel_buffer.cc",
    "channel_buffer.h",
    "include/audio_util.h",
    "lapped_transform.cc",
    "lapped_transform.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",
    "..:webrtc_common",
    "../:typedefs",
    "../api:optional",
    "../rtc_base:checks",
    "../rtc_base:gtest_prod",
    "../rtc_base:rtc_base_approved",
    "../rtc_base/memory:aligned_array",
    "../rtc_base/memory:aligned_malloc",
    "../system_wrappers",
    "../system_wrappers:cpu_features_api",
  ]

  defines = []
  if (rtc_use_openmax_dl) {
    sources += [
      "real_fourier_openmax.cc",
      "real_fourier_openmax.h",
    ]
    defines += [ "RTC_USE_OPENMAX_DL" ]
    if (rtc_build_openmax_dl) {
      deps += [ "//third_party/openmax_dl/dl" ]
    }
  }

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

  if (is_win) {
    cflags = [ "/wd4334" ]  # Ignore warning on shift operator promotion.
  }

  public_configs = [ ":common_audio_config" ]

  if (!build_with_chromium && is_clang) {
    # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
    suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
  }

  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",
      "signal_processing/spl_sqrt_floor_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 = [
    "fft4g.c",
    "fft4g.h",
    "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",
      "signal_processing/spl_sqrt_floor_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",
      "signal_processing/spl_sqrt_floor.c",
    ]
  }

  if (is_win) {
    cflags = [ "/wd4334" ]  # Ignore warning on shift operator promotion.
  }

  public_configs = [ ":common_audio_config" ]
  deps = [
    ":common_audio_c_arm_asm",
    ":common_audio_cc",
    "..:webrtc_common",
    "../:typedefs",
    "../rtc_base:checks",
    "../rtc_base:compile_assert_c",
    "../rtc_base:rtc_base_approved",
    "../rtc_base:sanitizer",
    "../system_wrappers",
    "../system_wrappers:cpu_features_api",
  ]
}

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

  public_configs = [ ":common_audio_config" ]
  deps = [
    "..:webrtc_common",
    "../:typedefs",
    "../rtc_base:rtc_base_approved",
    "../system_wrappers",
  ]
}

rtc_source_set("sinc_resampler") {
  sources = [
    "resampler/sinc_resampler.h",
  ]
  deps = [
    "..:webrtc_common",
    "../:typedefs",
    "../rtc_base:gtest_prod",
    "../rtc_base:rtc_base_approved",
    "../rtc_base/memory:aligned_malloc",
    "../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",
    "../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) {
      cflags = [ "-msse2" ]
    }

    if (!build_with_chromium && is_clang) {
      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
    }
    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. 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",
      ]
    }

    if (!build_with_chromium && is_clang) {
      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
    }

    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. 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",
      ]
    }

    if (!build_with_chromium && is_clang) {
      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
    }
    deps = [
      ":common_audio_c",
      "../rtc_base:checks",
      "../rtc_base:rtc_base_approved",
    ]
  }
}

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

    sources = [
      "audio_converter_unittest.cc",
      "audio_ring_buffer_unittest.cc",
      "audio_util_unittest.cc",
      "blocker_unittest.cc",
      "channel_buffer_unittest.cc",
      "fir_filter_unittest.cc",
      "lapped_transform_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" ]
    }

    if (rtc_use_openmax_dl) {
      defines = [ "RTC_USE_OPENMAX_DL" ]
    }

    if (!build_with_chromium && is_clang) {
      # Suppress warnings from the Chromium Clang plugin (bugs.webrtc.org/163).
      suppressed_configs += [ "//build/config/clang:find_bad_constructs" ]
    }

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

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

      shard_timeout = 900
    }
  }
}
