# Copyright (c) 2015 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")
if (is_android) {
  import("//build/config/android/config.gni")
  import("//build/config/android/rules.gni")
}

rtc_static_library("audio") {
  sources = [
    "audio_level.cc",
    "audio_level.h",
    "audio_receive_stream.cc",
    "audio_receive_stream.h",
    "audio_send_stream.cc",
    "audio_send_stream.h",
    "audio_state.cc",
    "audio_state.h",
    "audio_transport_impl.cc",
    "audio_transport_impl.h",
    "channel.cc",
    "channel.h",
    "channel_proxy.cc",
    "channel_proxy.h",
    "conversion.h",
    "null_audio_poller.cc",
    "null_audio_poller.h",
    "remix_resample.cc",
    "remix_resample.h",
    "time_interval.cc",
    "time_interval.h",
    "transport_feedback_packet_loss_tracker.cc",
    "transport_feedback_packet_loss_tracker.h",
  ]

  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 = [
    "..:webrtc_common",
    "../api:array_view",
    "../api:call_api",
    "../api:libjingle_peerconnection_api",
    "../api:transport_api",
    "../api/audio:aec3_factory",
    "../api/audio:audio_frame_api",
    "../api/audio:audio_mixer_api",
    "../api/audio_codecs:audio_codecs_api",
    "../api/audio_codecs:builtin_audio_encoder_factory",
    "../call:bitrate_allocator",
    "../call:call_interfaces",
    "../call:rtp_interfaces",
    "../common_audio",
    "../common_audio:common_audio_c",
    "../logging:rtc_event_audio",
    "../logging:rtc_event_log_api",
    "../modules/audio_coding",
    "../modules/audio_coding:audio_format_conversion",
    "../modules/audio_coding:audio_network_adaptor_config",
    "../modules/audio_coding:cng",
    "../modules/audio_device",
    "../modules/audio_processing",
    "../modules/bitrate_controller:bitrate_controller",
    "../modules/pacing:pacing",
    "../modules/remote_bitrate_estimator:remote_bitrate_estimator",
    "../modules/rtp_rtcp",
    "../modules/rtp_rtcp:rtp_rtcp_format",
    "../modules/utility",
    "../rtc_base:audio_format_to_string",
    "../rtc_base:checks",
    "../rtc_base:rate_limiter",
    "../rtc_base:rtc_base",
    "../rtc_base:rtc_base_approved",
    "../rtc_base:rtc_task_queue",
    "../rtc_base:safe_minmax",
    "../rtc_base:stringutils",
    "../system_wrappers",
    "../system_wrappers:field_trial_api",
    "../system_wrappers:metrics_api",
    "utility:audio_frame_operations",
    "//third_party/abseil-cpp/absl/types:optional",
  ]
}
if (rtc_include_tests) {
  rtc_source_set("audio_end_to_end_test") {
    testonly = true

    sources = [
      "test/audio_end_to_end_test.cc",
      "test/audio_end_to_end_test.h",
    ]
    deps = [
      ":audio",
      "../system_wrappers:system_wrappers",
      "../test:test_common",
      "../test:test_support",
    ]

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

  rtc_source_set("audio_tests") {
    testonly = true

    sources = [
      "audio_receive_stream_unittest.cc",
      "audio_send_stream_tests.cc",
      "audio_send_stream_unittest.cc",
      "audio_state_unittest.cc",
      "mock_voe_channel_proxy.h",
      "remix_resample_unittest.cc",
      "time_interval_unittest.cc",
      "transport_feedback_packet_loss_tracker_unittest.cc",
    ]
    deps = [
      ":audio",
      ":audio_end_to_end_test",
      "../api:mock_audio_mixer",
      "../api/audio:audio_frame_api",
      "../api/units:time_delta",
      "../call:mock_call_interfaces",
      "../call:mock_rtp_interfaces",
      "../call:rtp_interfaces",
      "../call:rtp_receiver",
      "../common_audio",
      "../logging:mocks",
      "../modules/audio_device:mock_audio_device",
      "../modules/audio_mixer:audio_mixer_impl",
      "../modules/audio_processing:audio_processing_statistics",
      "../modules/audio_processing:mocks",
      "../modules/bitrate_controller:mocks",
      "../modules/pacing:pacing",
      "../modules/rtp_rtcp:mock_rtp_rtcp",
      "../modules/rtp_rtcp:rtp_rtcp_format",
      "../rtc_base:checks",
      "../rtc_base:rtc_base_approved",
      "../rtc_base:rtc_base_tests_utils",
      "../rtc_base:rtc_task_queue",
      "../rtc_base:safe_compare",
      "../system_wrappers:system_wrappers",
      "../test:audio_codec_mocks",
      "../test:rtp_test_utils",
      "../test:test_common",
      "../test:test_support",
      "utility:utility_tests",
      "//testing/gtest",
    ]

    if (!rtc_use_memcheck) {
      # This test is timing dependent, which rules out running on memcheck bots.
      sources += [ "test/audio_stats_test.cc" ]
    }

    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 (rtc_enable_protobuf) {
    rtc_test("low_bandwidth_audio_test") {
      testonly = true

      sources = [
        "test/low_bandwidth_audio_test.cc",
      ]

      deps = [
        ":audio_end_to_end_test",
        "../common_audio",
        "../rtc_base:rtc_base_approved",
        "../system_wrappers",
        "../test:fileutils",
        "../test:test_common",
        "../test:test_main",
        "//testing/gtest",
      ]
      if (is_android) {
        deps += [ "//testing/android/native_test:native_test_native_code" ]
      }

      data = [
        "../resources/voice_engine/audio_tiny16.wav",
        "../resources/voice_engine/audio_tiny48.wav",
      ]

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

    group("low_bandwidth_audio_perf_test") {
      testonly = true

      deps = [
        ":low_bandwidth_audio_test",
      ]

      data = [
        "test/low_bandwidth_audio_test.py",
        "../resources/voice_engine/audio_tiny16.wav",
        "../resources/voice_engine/audio_tiny48.wav",
      ]
      if (is_win) {
        data += [ "${root_out_dir}/low_bandwidth_audio_test.exe" ]
      } else {
        data += [ "${root_out_dir}/low_bandwidth_audio_test" ]
      }

      if (is_linux || is_android) {
        data += [
          "../tools_webrtc/audio_quality/linux/PolqaOem64",
          "../tools_webrtc/audio_quality/linux/pesq",
        ]
      }
      if (is_win) {
        data += [
          "../tools_webrtc/audio_quality/win/PolqaOem64.dll",
          "../tools_webrtc/audio_quality/win/PolqaOem64.exe",
          "../tools_webrtc/audio_quality/win/pesq.exe",
          "../tools_webrtc/audio_quality/win/vcomp120.dll",
        ]
      }
      if (is_mac) {
        data += [ "../tools_webrtc/audio_quality/mac/pesq" ]
      }

      write_runtime_deps = "${root_out_dir}/${target_name}.runtime_deps"
    }
  }

  rtc_source_set("audio_perf_tests") {
    testonly = true

    sources = [
      "test/audio_bwe_integration_test.cc",
      "test/audio_bwe_integration_test.h",
    ]
    deps = [
      "../common_audio",
      "../rtc_base:rtc_base_approved",
      "../system_wrappers",
      "../test:field_trial",
      "../test:fileutils",
      "../test:single_threaded_task_queue",
      "../test:test_common",
      "../test:test_main",
      "//testing/gtest",
    ]

    data = [
      "//resources/voice_engine/audio_dtx16.wav",
    ]

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