# 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")

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

rtc_static_library("common_audio") {
  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",
    "fir_filter.cc",
    "fir_filter.h",
    "fir_filter_neon.h",
    "fir_filter_sse.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 = [
    ":sinc_resampler",
    "..:webrtc_common",
    "../api:optional",
    "../rtc_base:gtest_prod",
    "../rtc_base:rtc_base_approved",
    "../system_wrappers",
  ]
  public_deps = [
    ":common_audio_c",
  ]

  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") {
  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") {
  visibility = [ ":*" ]  # Only targets in this file can depend on this.
  sources = []
  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" ]
    }
  }
}

rtc_source_set("common_audio_c") {
  visibility = [ ":*" ]  # Only targets in this file can depend on this.
  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",
    "../rtc_base:compile_assert_c",
    "../rtc_base:rtc_base_approved",
    "../system_wrappers:system_wrappers",
  ]
}

rtc_source_set("common_audio_cc") {
  visibility = [ ":*" ]  # Only targets in this file can depend on this.
  sources = [
    "signal_processing/dot_product_with_scale.cc",
    "signal_processing/dot_product_with_scale.h",
  ]

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

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

if (current_cpu == "x86" || current_cpu == "x64") {
  rtc_static_library("common_audio_sse2") {
    # TODO(kjellander): Remove (bugs.webrtc.org/6828)
    # Enabling GN check triggers dependency cycle:
    #   :common_audio ->
    #   :common_audio_sse2 ->
    #   :common_audio
    check_includes = false
    sources = [
      "fir_filter_sse.cc",
      "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 = [
      ":sinc_resampler",
    ]
  }
}

if (rtc_build_with_neon) {
  rtc_static_library("common_audio_neon") {
    # TODO(kjellander): Remove (bugs.webrtc.org/6828)
    # Enabling GN check triggers dependency cycle:
    #   :common_audio ->
    #   :common_audio_neon ->
    #   :common_audio
    check_includes = false
    sources = [
      "fir_filter_neon.cc",
      "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 = [
      ":sinc_resampler",
    ]

    public_deps = [
      ":common_audio_neon_c",
    ]
  }

  rtc_source_set("common_audio_neon_c") {
    visibility = [ ":*" ]  # Only targets in this file can depend on this.
    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:rtc_base_approved",
    ]
  }
}

if (rtc_include_tests) {
  rtc_test("common_audio_unittests") {
    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",
      ":sinc_resampler",
      "..:webrtc_common",
      "../rtc_base:rtc_base_approved",
      "../rtc_base:rtc_base_tests_utils",
      "../system_wrappers",
      "../test:test_main",
      "//testing/gmock",
      "//testing/gtest",
    ]

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

      shard_timeout = 900
    }
  }
}
