# Copyright (c) 2020 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")

rtc_library("transient_suppressor") {
  sources = [
    "common.h",
    "daubechies_8_wavelet_coeffs.h",
    "dyadic_decimator.h",
    "moving_moments.cc",
    "moving_moments.h",
    "transient_detector.cc",
    "transient_detector.h",
    "transient_suppressor.cc",
    "transient_suppressor.h",
    "windows_private.h",
    "wpd_node.cc",
    "wpd_node.h",
    "wpd_tree.cc",
    "wpd_tree.h",
  ]
  deps = [
    "../../../common_audio:common_audio",
    "../../../common_audio:common_audio_c",
    "../../../common_audio:fir_filter",
    "../../../common_audio:fir_filter_factory",
    "../../../common_audio/third_party/fft4g",
    "../../../rtc_base:checks",
    "../../../rtc_base:gtest_prod",
    "../../../rtc_base:logging",
  ]
}

if (rtc_include_tests) {
  rtc_executable("click_annotate") {
    testonly = true
    sources = [
      "click_annotate.cc",
      "file_utils.cc",
      "file_utils.h",
    ]
    deps = [
      ":transient_suppressor",
      "..:audio_processing",
      "../../../rtc_base/system:file_wrapper",
      "../../../system_wrappers",
    ]
  }

  rtc_executable("transient_suppression_test") {
    testonly = true
    sources = [
      "file_utils.cc",
      "file_utils.h",
      "transient_suppression_test.cc",
    ]
    deps = [
      ":transient_suppressor",
      "..:audio_processing",
      "../../../common_audio",
      "../../../rtc_base:rtc_base_approved",
      "../../../rtc_base/system:file_wrapper",
      "../../../system_wrappers",
      "../../../test:fileutils",
      "../../../test:test_support",
      "../agc:level_estimation",
      "//testing/gtest",
      "//third_party/abseil-cpp/absl/flags:flag",
      "//third_party/abseil-cpp/absl/flags:parse",
    ]
  }

  rtc_library("transient_suppression_unittests") {
    testonly = true
    sources = [
      "dyadic_decimator_unittest.cc",
      "file_utils.cc",
      "file_utils.h",
      "file_utils_unittest.cc",
      "moving_moments_unittest.cc",
      "transient_detector_unittest.cc",
      "transient_suppressor_unittest.cc",
      "wpd_node_unittest.cc",
      "wpd_tree_unittest.cc",
    ]
    deps = [
      ":transient_suppressor",
      "../../../rtc_base:stringutils",
      "../../../rtc_base/system:file_wrapper",
      "../../../test:fileutils",
      "../../../test:test_support",
      "//testing/gtest",
    ]
  }
}
