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

group("audio_mixer") {
  deps = [
    ":audio_frame_manipulator",
    ":audio_mixer_impl",
  ]
}

rtc_library("audio_mixer_impl") {
  visibility = [ "*" ]
  sources = [
    "audio_mixer_impl.cc",
    "audio_mixer_impl.h",
    "default_output_rate_calculator.cc",
    "default_output_rate_calculator.h",
    "frame_combiner.cc",
    "frame_combiner.h",
    "output_rate_calculator.h",
  ]

  public = [
    "audio_mixer_impl.h",
    "default_output_rate_calculator.h",  # For creating a mixer with limiter disabled.
    "frame_combiner.h",
  ]

  configs += [ "../audio_processing:apm_debug_dump" ]

  deps = [
    ":audio_frame_manipulator",
    "../../api:array_view",
    "../../api:scoped_refptr",
    "../../api/audio:audio_frame_api",
    "../../api/audio:audio_mixer_api",
    "../../audio/utility:audio_frame_operations",
    "../../common_audio",
    "../../rtc_base:checks",
    "../../rtc_base:rtc_base_approved",
    "../../system_wrappers",
    "../../system_wrappers:metrics",
    "../audio_processing",
    "../audio_processing:api",
    "../audio_processing:apm_logging",
    "../audio_processing:audio_frame_view",
    "../audio_processing/agc2:fixed_digital",
  ]
}

rtc_library("audio_frame_manipulator") {
  visibility = [
    ":*",
    "../../modules:*",
  ]

  sources = [
    "audio_frame_manipulator.cc",
    "audio_frame_manipulator.h",
  ]

  deps = [
    "../../api/audio:audio_frame_api",
    "../../audio/utility:audio_frame_operations",
    "../../rtc_base:checks",
    "../../rtc_base:rtc_base_approved",
  ]
}

if (rtc_include_tests) {
  rtc_library("audio_mixer_test_utils") {
    testonly = true

    sources = [
      "gain_change_calculator.cc",
      "gain_change_calculator.h",
      "sine_wave_generator.cc",
      "sine_wave_generator.h",
    ]

    deps = [
      ":audio_frame_manipulator",
      ":audio_mixer_impl",
      "../../api:array_view",
      "../../api/audio:audio_frame_api",
      "../../rtc_base:checks",
      "../../rtc_base:rtc_base_approved",
    ]
  }

  rtc_library("audio_mixer_unittests") {
    testonly = true

    sources = [
      "audio_frame_manipulator_unittest.cc",
      "audio_mixer_impl_unittest.cc",
      "frame_combiner_unittest.cc",
    ]

    deps = [
      ":audio_frame_manipulator",
      ":audio_mixer_impl",
      ":audio_mixer_test_utils",
      "../../api:array_view",
      "../../api/audio:audio_mixer_api",
      "../../audio/utility:audio_frame_operations",
      "../../rtc_base:checks",
      "../../rtc_base:rtc_base_approved",
      "../../rtc_base:task_queue_for_test",
      "../../test:test_support",
    ]
  }

  rtc_executable("audio_mixer_test") {
    testonly = true
    sources = [ "audio_mixer_test.cc" ]

    deps = [
      ":audio_mixer_impl",
      "../../api/audio:audio_mixer_api",
      "../../common_audio",
      "../../rtc_base:stringutils",
      "//third_party/abseil-cpp/absl/flags:flag",
      "//third_party/abseil-cpp/absl/flags:parse",
    ]
  }
}
