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

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

source_set("common_audio") {
  sources = [
    "channel_buffer.cc",
    "channel_buffer.h",
    "audio_converter.cc",
    "audio_converter.h",
    "audio_ring_buffer.cc",
    "audio_ring_buffer.h",
    "audio_util.cc",
    "blocker.cc",
    "blocker.h",
    "fir_filter.cc",
    "fir_filter.h",
    "fir_filter_neon.h",
    "fir_filter_sse.h",
    "include/audio_util.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",
    "resampler/sinc_resampler.h",
    "ring_buffer.c",
    "ring_buffer.h",
    "signal_processing/include/real_fft.h",
    "signal_processing/include/signal_processing_library.h",
    "signal_processing/include/spl_inl.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/dot_product_with_scale.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/levinson_durbin.c",
    "signal_processing/lpc_to_refl_coef.c",
    "signal_processing/min_max_operations.c",
    "signal_processing/randomization_functions.c",
    "signal_processing/refl_coef_to_lpc.c",
    "signal_processing/real_fft.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_sqrt.c",
    "signal_processing/splitting_filter.c",
    "signal_processing/sqrt_of_one_minus_x_squared.c",
    "signal_processing/vector_scaling_operations.c",
    "vad/include/vad.h",
    "vad/include/webrtc_vad.h",
    "vad/vad.cc",
    "vad/webrtc_vad.c",
    "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",
    "wav_header.cc",
    "wav_header.h",
    "wav_file.cc",
    "wav_file.h",
    "window_generator.cc",
    "window_generator.h",
  ]

  deps = [ "../system_wrappers" ]

  if (rtc_use_openmax_dl) {
    sources += [
      "lapped_transform.cc",
      "lapped_transform.h",
      "real_fourier.cc",
      "real_fourier.h",
    ]

    deps += [ "//third_party/openmax_dl/dl" ]
  }

  if (current_cpu == "arm") {
    sources += [
      "signal_processing/complex_bit_reverse_arm.S",
      "signal_processing/spl_sqrt_floor_arm.S",
    ]

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

  if (current_cpu == "mipsel") {
    sources += [
      "signal_processing/include/spl_inl_mips.h",
      "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/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.
    ]
  }

  configs += [ "..:common_config" ]

  public_configs = [
    "..:common_inherited_config",
    ":common_audio_config",
  ]

  if (is_clang) {
    # Suppress warnings from Chrome's Clang plugins.
    # See http://code.google.com/p/webrtc/issues/detail?id=163 for details.
    configs -= [ "//build/config/clang:find_bad_constructs" ]
  }

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

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

    cflags = [ "-msse2" ]

    configs += [ "..:common_inherited_config" ]

    if (is_clang) {
      # Suppress warnings from Chrome's Clang plugins.
      # See http://code.google.com/p/webrtc/issues/detail?id=163 for details.
      configs -= [ "//build/config/clang:find_bad_constructs" ]
    }
  }
}

if (rtc_build_armv7_neon) {
  source_set("common_audio_neon") {
    sources = [
      "fir_filter_neon.cc",
      "resampler/sinc_resampler_neon.cc",
      "signal_processing/cross_correlation_neon.S",
      "signal_processing/downsample_fast_neon.S",
      "signal_processing/min_max_operations_neon.S",
    ]

    configs += [ "..:common_config" ]
    public_configs = [ "..:common_inherited_config" ]


    # Enable compilation for the ARM v7 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.
    # TODO(kjellander): Investigate if this can be moved into webrtc.gni or
    # //build/config/arm.gni instead, to reduce code duplication.
    # Remove the -mfpu=vfpv3-d16 cflag.
    configs -= [ "//build/config/compiler:compiler_arm_fpu" ]
    cflags = [
      "-mfpu=neon",
    ]

    # Disable LTO in audio_processing_neon target due to compiler bug.
    if (rtc_use_lto) {
      cflags -= [
        "-flto",
        "-ffat-lto-objects",
      ]
    }
  }
}
