# 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_receive.cc",
    "channel_receive.h",
    "channel_send.cc",
    "channel_send.h",
    "conversion.h",
    "null_audio_poller.cc",
    "null_audio_poller.h",
    "remix_resample.cc",
    "remix_resample.h",
    "transport_feedback_packet_loss_tracker.cc",
    "transport_feedback_packet_loss_tracker.h",
  ]

  deps = [
    "../api:array_view",
    "../api:call_api",
    "../api:function_view",
    "../api:libjingle_peerconnection_api",
    "../api:rtp_headers",
    "../api:scoped_refptr",
    "../api:transport_api",
    "../api/audio:aec3_factory",
    "../api/audio:audio_frame_api",
    "../api/audio:audio_mixer_api",
    "../api/audio_codecs:audio_codecs_api",
    "../api/task_queue",
    "../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",
    "../logging:rtc_stream_config",
    "../modules/audio_coding",
    "../modules/audio_coding:audio_encoder_cng",
    "../modules/audio_coding:audio_network_adaptor_config",
    "../modules/audio_device",
    "../modules/audio_processing",
    "../modules/audio_processing:api",
    "../modules/bitrate_controller",
    "../modules/pacing",
    "../modules/remote_bitrate_estimator",
    "../modules/rtp_rtcp",
    "../modules/rtp_rtcp:rtp_rtcp_format",
    "../modules/utility",
    "../rtc_base",
    "../rtc_base:audio_format_to_string",
    "../rtc_base:checks",
    "../rtc_base:rate_limiter",
    "../rtc_base:rtc_base_approved",
    "../rtc_base:rtc_task_queue",
    "../rtc_base:safe_minmax",
    "../rtc_base/experiments:audio_allocation_settings",
    "../system_wrappers",
    "../system_wrappers:field_trial",
    "../system_wrappers:metrics",
    "utility:audio_frame_operations",
    "//third_party/abseil-cpp/absl/memory",
    "//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",
      "../api:simulated_network_api",
      "../call:fake_network",
      "../call:simulated_network",
      "../system_wrappers",
      "../test:test_common",
      "../test:test_support",
      "//third_party/abseil-cpp/absl/memory",
    ]
  }

  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",
      "test/audio_stats_test.cc",
      "test/media_transport_test.cc",
      "transport_feedback_packet_loss_tracker_unittest.cc",
    ]
    deps = [
      ":audio",
      ":audio_end_to_end_test",
      "../api:loopback_media_transport",
      "../api:mock_audio_mixer",
      "../api:mock_frame_decryptor",
      "../api:mock_frame_encryptor",
      "../api/audio:audio_frame_api",
      "../api/audio_codecs:audio_codecs_api",
      "../api/audio_codecs/opus:audio_decoder_opus",
      "../api/audio_codecs/opus:audio_encoder_opus",
      "../api/task_queue:default_task_queue_factory",
      "../api/units:time_delta",
      "../call:mock_bitrate_allocator",
      "../call:mock_call_interfaces",
      "../call:mock_rtp_interfaces",
      "../call:rtp_interfaces",
      "../call:rtp_receiver",
      "../call:rtp_sender",
      "../common_audio",
      "../logging:mocks",
      "../logging:rtc_event_log_api",
      "../modules/audio_device:audio_device_impl",  # For TestAudioDeviceModule
      "../modules/audio_device:mock_audio_device",
      "../modules/audio_mixer:audio_mixer_impl",
      "../modules/audio_processing:audio_processing_statistics",
      "../modules/audio_processing:mocks",
      "../modules/pacing",
      "../modules/rtp_rtcp:mock_rtp_rtcp",
      "../modules/rtp_rtcp:rtp_rtcp_format",
      "../modules/utility",
      "../rtc_base:checks",
      "../rtc_base:rtc_base_approved",
      "../rtc_base:rtc_base_tests_utils",
      "../rtc_base:safe_compare",
      "../rtc_base:task_queue_for_test",
      "../rtc_base:timeutils",
      "../system_wrappers",
      "../test:audio_codec_mocks",
      "../test:field_trial",
      "../test:rtp_test_utils",
      "../test:test_common",
      "../test:test_support",
      "utility:utility_tests",
      "//testing/gtest",
      "//third_party/abseil-cpp/absl/memory",
    ]
  }

  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",
        "../api:simulated_network_api",
        "../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",
      ]
    }

    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 = [
      "../api:simulated_network_api",
      "../api/task_queue",
      "../call:fake_network",
      "../call:simulated_network",
      "../common_audio",
      "../rtc_base:rtc_base_approved",
      "../rtc_base:task_queue_for_test",
      "../system_wrappers",
      "../test:field_trial",
      "../test:fileutils",
      "../test:single_threaded_task_queue",
      "../test:test_common",
      "../test:test_main",
      "../test:test_support",
      "//testing/gtest",
      "//third_party/abseil-cpp/absl/memory",
    ]

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