# Copyright (c) 2011 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.

{
  'targets': [
    {
      'target_name': 'NetEq',
      'type': '<(library)',
      'dependencies': [
        'CNG',
        '<(webrtc_root)/common_audio/common_audio.gyp:signal_processing',
      ],
      'defines': [
        'NETEQ_VOICEENGINE_CODECS', # TODO: Should create a Chrome define which
        'SCRATCH',                  # specifies a subset of codecs to support.
      ],
      'include_dirs': [
        'interface',
      ],
      'direct_dependent_settings': {
        'include_dirs': [
          'interface',
        ],
      },
      'sources': [
        'interface/webrtc_neteq.h',
        'interface/webrtc_neteq_help_macros.h',
        'interface/webrtc_neteq_internal.h',
        'accelerate.c',
        'automode.c',
        'automode.h',
        'bgn_update.c',
        'buffer_stats.h',
        'bufstats_decision.c',
        'cng_internal.c',
        'codec_db.c',
        'codec_db.h',
        'codec_db_defines.h',
        'correlator.c',
        'delay_logging.h',
        'dsp.c',
        'dsp.h',
        'dsp_helpfunctions.c',
        'dsp_helpfunctions.h',
        'dtmf_buffer.c',
        'dtmf_buffer.h',
        'dtmf_tonegen.c',
        'dtmf_tonegen.h',
        'expand.c',
        'mcu.h',
        'mcu_address_init.c',
        'mcu_dsp_common.c',
        'mcu_dsp_common.h',
        'mcu_reset.c',
        'merge.c',
        'min_distortion.c',
        'mix_voice_unvoice.c',
        'mute_signal.c',
        'neteq_defines.h',
        'neteq_error_codes.h',
        'neteq_statistics.h',
        'normal.c',
        'packet_buffer.c',
        'packet_buffer.h',
        'peak_detection.c',
        'preemptive_expand.c',
        'random_vector.c',
        'recin.c',
        'recout.c',
        'rtcp.c',
        'rtcp.h',
        'rtp.c',
        'rtp.h',
        'set_fs.c',
        'signal_mcu.c',
        'split_and_insert.c',
        'unmute_signal.c',
        'webrtc_neteq.c',
      ],
    },
  ], # targets
  # Exclude the test target when building with chromium.
  'conditions': [
    ['build_with_chromium==0', {
      'targets': [
        {
          'target_name': 'neteq_unittests',
          'type': 'executable',
          'dependencies': [
            'NetEq',
            'NetEqTestTools',
            '<(webrtc_root)/../testing/gtest.gyp:gtest',
            '<(webrtc_root)/../test/test.gyp:test_support_main',
          ],
          'sources': [
            'webrtc_neteq_unittest.cc',
          ],
        }, # neteq_unittests
        {
          'target_name': 'NetEqRTPplay',
          'type': 'executable',
          'dependencies': [
            'NetEq',         # NetEQ library defined above
            'NetEqTestTools',# Test helpers
            'G711',
            'G722',
            'PCM16B',
            'iLBC',
            'iSAC',
            'CNG',
          ],
          'defines': [
            # TODO: Make codec selection conditional on definitions in target NetEq
            'CODEC_ILBC',
            'CODEC_PCM16B',
            'CODEC_G711',
            'CODEC_G722',
            'CODEC_ISAC',
            'CODEC_PCM16B_WB',
            'CODEC_ISAC_SWB',
            'CODEC_PCM16B_32KHZ',
            'CODEC_CNGCODEC8',
            'CODEC_CNGCODEC16',
            'CODEC_CNGCODEC32',
            'CODEC_ATEVENT_DECODE',
            'CODEC_RED',
          ],
          'include_dirs': [
            '.',
            'test',
          ],
          'sources': [
            'test/NetEqRTPplay.cc',
          ],
        },
       {
          'target_name': 'RTPencode',
          'type': 'executable',
          'dependencies': [
            'NetEqTestTools',# Test helpers
            'G711',
            'G722',
            'PCM16B',
            'iLBC',
            'iSAC',
            'CNG',
            '<(webrtc_root)/common_audio/common_audio.gyp:vad',
          ],
          'defines': [
            # TODO: Make codec selection conditional on definitions in target NetEq
            'CODEC_ILBC',
            'CODEC_PCM16B',
            'CODEC_G711',
            'CODEC_G722',
            'CODEC_ISAC',
            'CODEC_PCM16B_WB',
            'CODEC_ISAC_SWB',
            'CODEC_PCM16B_32KHZ',
            'CODEC_CNGCODEC8',
            'CODEC_CNGCODEC16',
            'CODEC_CNGCODEC32',
            'CODEC_ATEVENT_DECODE',
            'CODEC_RED',
          ],
          'include_dirs': [
            'interface',
            'test',
          ],
          'sources': [
            'test/RTPencode.cc',
          ],
        },
        {
          'target_name': 'RTPjitter',
          'type': 'executable',
          'dependencies': [
            '<(webrtc_root)/../testing/gtest.gyp:gtest',
          ],
          'sources': [
            'test/RTPjitter.cc',
          ],
        },
        {
          'target_name': 'RTPanalyze',
          'type': 'executable',
          'dependencies': [
            'NetEqTestTools',
            '<(webrtc_root)/../testing/gtest.gyp:gtest',
          ],
          'sources': [
            'test/RTPanalyze.cc',
          ],
        },
        {
          'target_name': 'RTPchange',
          'type': 'executable',
          'dependencies': [
            'NetEqTestTools',
            '<(webrtc_root)/../testing/gtest.gyp:gtest',
          ],
          'sources': [
           'test/RTPchange.cc',
          ],
        },
        {
          'target_name': 'RTPtimeshift',
          'type': 'executable',
          'dependencies': [
           'NetEqTestTools',
            '<(webrtc_root)/../testing/gtest.gyp:gtest',
          ],
          'sources': [
            'test/RTPtimeshift.cc',
          ],
        },
        {
          'target_name': 'RTPcat',
          'type': 'executable',
          'dependencies': [
            'NetEqTestTools',
            '<(webrtc_root)/../testing/gtest.gyp:gtest',
          ],
          'sources': [
            'test/RTPcat.cc',
          ],
        },
        {
         'target_name': 'NetEqTestTools',
          # Collection of useful functions used in other tests
          'type': '<(library)',
          'dependencies': [
            'G711',
            'G722',
            'PCM16B',
            'iLBC',
            'iSAC',
            'CNG',
            '<(webrtc_root)/../testing/gtest.gyp:gtest',
          ],
          'direct_dependent_settings': {
            'include_dirs': [
              'interface',
              'test',
            ],
          },
          'defines': [
            # TODO: Make codec selection conditional on definitions in target NetEq
            'CODEC_ILBC',
            'CODEC_PCM16B',
            'CODEC_G711',
            'CODEC_G722',
            'CODEC_ISAC',
            'CODEC_PCM16B_WB',
            'CODEC_ISAC_SWB',
            'CODEC_PCM16B_32KHZ',
            'CODEC_CNGCODEC8',
            'CODEC_CNGCODEC16',
            'CODEC_CNGCODEC32',
            'CODEC_ATEVENT_DECODE',
            'CODEC_RED',
          ],
          'include_dirs': [
            'interface',
            'test',
          ],
          'sources': [
            'test/NETEQTEST_NetEQClass.cc',
            'test/NETEQTEST_RTPpacket.cc',
            'test/NETEQTEST_CodecClass.cc',
            'test/NETEQTEST_NetEQClass.h',
            'test/NETEQTEST_RTPpacket.h',
            'test/NETEQTEST_CodecClass.h',
          ],
        },
      ], # targets
    }], # build_with_chromium
  ], # conditions
}

# Local Variables:
# tab-width:2
# indent-tabs-mode:nil
# End:
# vim: set expandtab tabstop=2 shiftwidth=2:
