1470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/*
263a509858d3988299726640c664b699d6229a1d4andrew@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
4470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  Use of this source code is governed by a BSD-style license
5470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  that can be found in the LICENSE file in the root of the source
6470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  tree. An additional intellectual property rights grant can be found
7470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  in the file PATENTS.  All contributing project authors may
8470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  be found in the AUTHORS file in the root of the source tree.
9470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */
10470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
113e6db2321ccdc8738c9cecbe9bdab13d4f0f658dkjellander#include "webrtc/modules/audio_coding/test/APITest.h"
1273222cff1a64cbc8eade9277cc63d516f7c20947tina.legrand@webrtc.org
1312dc1a38ca54a000e4fecfbc6d41138b895c9ca5pbos@webrtc.org#include <ctype.h>
14543c3eaa46434a7e3974012c4d33ed82fc81fd33kjellander@webrtc.org#include <stdio.h>
15543c3eaa46434a7e3974012c4d33ed82fc81fd33kjellander@webrtc.org#include <stdlib.h>
16543c3eaa46434a7e3974012c4d33ed82fc81fd33kjellander@webrtc.org#include <string.h>
1773222cff1a64cbc8eade9277cc63d516f7c20947tina.legrand@webrtc.org
185e7ca608d54043a09ce62193f372bb7b3ba7d8e1tina.legrand@webrtc.org#include <iostream>
195e7ca608d54043a09ce62193f372bb7b3ba7d8e1tina.legrand@webrtc.org#include <ostream>
205e7ca608d54043a09ce62193f372bb7b3ba7d8e1tina.legrand@webrtc.org#include <string>
215e7ca608d54043a09ce62193f372bb7b3ba7d8e1tina.legrand@webrtc.org
2273222cff1a64cbc8eade9277cc63d516f7c20947tina.legrand@webrtc.org#include "testing/gtest/include/gtest/gtest.h"
2312411ef40e08c5e28ccde54ab3418c96676ffcbcpbos#include "webrtc/base/platform_thread.h"
246ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org#include "webrtc/common.h"
2573222cff1a64cbc8eade9277cc63d516f7c20947tina.legrand@webrtc.org#include "webrtc/common_types.h"
2673222cff1a64cbc8eade9277cc63d516f7c20947tina.legrand@webrtc.org#include "webrtc/engine_configurations.h"
273e6db2321ccdc8738c9cecbe9bdab13d4f0f658dkjellander#include "webrtc/modules/audio_coding/acm2/acm_common_defs.h"
283e6db2321ccdc8738c9cecbe9bdab13d4f0f658dkjellander#include "webrtc/modules/audio_coding/test/utility.h"
2998f53510b222f71fdd8b799b2f33737ceeb28c61Henrik Kjellander#include "webrtc/system_wrappers/include/event_wrapper.h"
3098f53510b222f71fdd8b799b2f33737ceeb28c61Henrik Kjellander#include "webrtc/system_wrappers/include/tick_util.h"
3198f53510b222f71fdd8b799b2f33737ceeb28c61Henrik Kjellander#include "webrtc/system_wrappers/include/trace.h"
3273222cff1a64cbc8eade9277cc63d516f7c20947tina.legrand@webrtc.org#include "webrtc/test/testsupport/fileutils.h"
33470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
34554ae1ad4ed3e6d1d9d807f15324d2f875888d23tina.legrand@webrtc.orgnamespace webrtc {
35554ae1ad4ed3e6d1d9d807f15324d2f875888d23tina.legrand@webrtc.org
36470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#define TEST_DURATION_SEC 600
37470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#define NUMBER_OF_SENDER_TESTS 6
38470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#define MAX_FILE_NAME_LENGTH_BYTE 500
39d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
40d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.orgvoid APITest::Wait(uint32_t waitLengthMs) {
41d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  if (_randomTest) {
42d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    return;
43d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  } else {
44d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    EventWrapper* myEvent = EventWrapper::Create();
45d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    myEvent->Wait(waitLengthMs);
46d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    delete myEvent;
47d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    return;
48d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  }
49470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
50470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
516ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.orgAPITest::APITest(const Config& config)
52adaf80961280dfecd3fdcc23bd3fa0a312ce42dehenrik.lundin@webrtc.org    : _acmA(AudioCodingModule::Create(1)),
53adaf80961280dfecd3fdcc23bd3fa0a312ce42dehenrik.lundin@webrtc.org      _acmB(AudioCodingModule::Create(2)),
54d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      _channel_A2B(NULL),
55d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      _channel_B2A(NULL),
56d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      _writeToFile(true),
57d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      _pullEventA(NULL),
58d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      _pushEventA(NULL),
59d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      _processEventA(NULL),
60d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      _apiEventA(NULL),
61d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      _pullEventB(NULL),
62d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      _pushEventB(NULL),
63d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      _processEventB(NULL),
64d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      _apiEventB(NULL),
65d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      _codecCntrA(0),
66d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      _codecCntrB(0),
67d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      _thereIsEncoderA(false),
68d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      _thereIsEncoderB(false),
69d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      _thereIsDecoderA(false),
70d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      _thereIsDecoderB(false),
71d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      _sendVADA(false),
72d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      _sendDTXA(false),
73d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      _sendVADModeA(VADNormal),
74d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      _sendVADB(false),
75d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      _sendDTXB(false),
76d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      _sendVADModeB(VADNormal),
77d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      _minDelayA(0),
78d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      _minDelayB(0),
79d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      _dotPositionA(0),
80d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      _dotMoveDirectionA(1),
81d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      _dotPositionB(39),
82d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      _dotMoveDirectionB(-1),
83d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      _vadCallbackA(NULL),
84d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      _vadCallbackB(NULL),
85d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      _apiTestRWLock(*RWLockWrapper::CreateRWLock()),
86d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      _randomTest(false),
87d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      _testNumA(0),
88d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      _testNumB(1) {
89d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  int n;
90d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  for (n = 0; n < 32; n++) {
91d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    _payloadUsed[n] = false;
92d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  }
93d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
94d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  _movingDot[40] = '\0';
95d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
96d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  for (int n = 0; n < 40; n++) {
97d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    _movingDot[n] = ' ';
98d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  }
99470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
100470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
101d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.orgAPITest::~APITest() {
102d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  DELETE_POINTER(_channel_A2B);
103d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  DELETE_POINTER(_channel_B2A);
104470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
105d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  DELETE_POINTER(_pushEventA);
106d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  DELETE_POINTER(_pullEventA);
107d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  DELETE_POINTER(_processEventA);
108d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  DELETE_POINTER(_apiEventA);
109470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
110d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  DELETE_POINTER(_pushEventB);
111d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  DELETE_POINTER(_pullEventB);
112d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  DELETE_POINTER(_processEventB);
113d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  DELETE_POINTER(_apiEventB);
114470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
115d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  _inFileA.Close();
116d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  _outFileA.Close();
117470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
118d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  _inFileB.Close();
119d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  _outFileB.Close();
120470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
121d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  DELETE_POINTER(_vadCallbackA);
122d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  DELETE_POINTER(_vadCallbackB);
123470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
124d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  delete &_apiTestRWLock;
125470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
126470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
127d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.orgint16_t APITest::SetUp() {
128d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  CodecInst dummyCodec;
129d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  int lastPayloadType = 0;
130d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
131d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  int16_t numCodecs = _acmA->NumberOfCodecs();
132d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  for (uint8_t n = 0; n < numCodecs; n++) {
133d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    AudioCodingModule::Codec(n, &dummyCodec);
134d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    if ((STR_CASE_CMP(dummyCodec.plname, "CN") == 0)
135d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org        && (dummyCodec.plfreq == 32000)) {
136d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      continue;
137d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    }
138d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
139d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    printf("Register Receive Codec %s  ", dummyCodec.plname);
140d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
141d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    if ((n != 0) && !FixedPayloadTypeCodec(dummyCodec.plname)) {
142d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      // Check registration with an already occupied payload type
143d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      int currentPayloadType = dummyCodec.pltype;
144d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      dummyCodec.pltype = 97;  //lastPayloadType;
145d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      CHECK_ERROR(_acmB->RegisterReceiveCodec(dummyCodec));
146d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      dummyCodec.pltype = currentPayloadType;
147d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    }
148d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
149d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    if ((n < numCodecs - 1) && !FixedPayloadTypeCodec(dummyCodec.plname)) {
150d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      // test if re-registration works;
151d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      CodecInst nextCodec;
152d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      int currentPayloadType = dummyCodec.pltype;
153d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      AudioCodingModule::Codec(n + 1, &nextCodec);
154d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      dummyCodec.pltype = nextCodec.pltype;
155d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      if (!FixedPayloadTypeCodec(nextCodec.plname)) {
156d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org        _acmB->RegisterReceiveCodec(dummyCodec);
157d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      }
158d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      dummyCodec.pltype = currentPayloadType;
159d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    }
160d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
161d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    if ((n < numCodecs - 1) && !FixedPayloadTypeCodec(dummyCodec.plname)) {
162d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      // test if un-registration works;
163d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      CodecInst nextCodec;
164d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      AudioCodingModule::Codec(n + 1, &nextCodec);
165d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      nextCodec.pltype = dummyCodec.pltype;
166d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      if (!FixedPayloadTypeCodec(nextCodec.plname)) {
167d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org        CHECK_ERROR_MT(_acmA->RegisterReceiveCodec(nextCodec));
168d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org        CHECK_ERROR_MT(_acmA->UnregisterReceiveCodec(nextCodec.pltype));
169d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      }
170d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    }
171d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
172d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    CHECK_ERROR_MT(_acmA->RegisterReceiveCodec(dummyCodec));
173d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    printf("   side A done!");
174d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    CHECK_ERROR_MT(_acmB->RegisterReceiveCodec(dummyCodec));
175d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    printf("   side B done!\n");
176d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
177d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    if (!strcmp(dummyCodec.plname, "CN")) {
178d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      CHECK_ERROR_MT(_acmA->RegisterSendCodec(dummyCodec));
179d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      CHECK_ERROR_MT(_acmB->RegisterSendCodec(dummyCodec));
180d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    }
181d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    lastPayloadType = dummyCodec.pltype;
182d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    if ((lastPayloadType >= 96) && (lastPayloadType <= 127)) {
183d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      _payloadUsed[lastPayloadType - 96] = true;
184d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    }
185d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  }
186d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  _thereIsDecoderA = true;
187d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  _thereIsDecoderB = true;
188d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
189d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  // Register Send Codec
190d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  AudioCodingModule::Codec((uint8_t) _codecCntrA, &dummyCodec);
191d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  CHECK_ERROR_MT(_acmA->RegisterSendCodec(dummyCodec));
192d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  _thereIsEncoderA = true;
193d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  //
194d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  AudioCodingModule::Codec((uint8_t) _codecCntrB, &dummyCodec);
195d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  CHECK_ERROR_MT(_acmB->RegisterSendCodec(dummyCodec));
196d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  _thereIsEncoderB = true;
197d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
198d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  uint16_t frequencyHz;
199d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
200d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  printf("\n\nAPI Test\n");
201d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  printf("========\n");
202d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  printf("Hit enter to accept the default values indicated in []\n\n");
203d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
204d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  //--- Input A
205d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  std::string file_name = webrtc::test::ResourcePath(
206d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      "audio_coding/testfile32kHz", "pcm");
207d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  frequencyHz = 32000;
208d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  printf("Enter input file at side A [%s]: ", file_name.c_str());
209d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  PCMFile::ChooseFile(&file_name, 499, &frequencyHz);
210d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  _inFileA.Open(file_name, frequencyHz, "rb", true);
211d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
212d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  //--- Output A
213d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  std::string out_file_a = webrtc::test::OutputPath() + "outA.pcm";
214d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  printf("Enter output file at side A [%s]: ", out_file_a.c_str());
215d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  PCMFile::ChooseFile(&out_file_a, 499, &frequencyHz);
216d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  _outFileA.Open(out_file_a, frequencyHz, "wb");
217d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
218d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  //--- Input B
219d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  file_name = webrtc::test::ResourcePath("audio_coding/testfile32kHz", "pcm");
220d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  printf("\n\nEnter input file at side B [%s]: ", file_name.c_str());
221d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  PCMFile::ChooseFile(&file_name, 499, &frequencyHz);
222d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  _inFileB.Open(file_name, frequencyHz, "rb", true);
223d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
224d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  //--- Output B
225d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  std::string out_file_b = webrtc::test::OutputPath() + "outB.pcm";
226d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  printf("Enter output file at side B [%s]: ", out_file_b.c_str());
227d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  PCMFile::ChooseFile(&out_file_b, 499, &frequencyHz);
228d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  _outFileB.Open(out_file_b, frequencyHz, "wb");
229d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
230d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  //--- Set A-to-B channel
231d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  _channel_A2B = new Channel(2);
232d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  CHECK_ERROR_MT(_acmA->RegisterTransportCallback(_channel_A2B));
2336ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org  _channel_A2B->RegisterReceiverACM(_acmB.get());
234d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
235d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  //--- Set B-to-A channel
236d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  _channel_B2A = new Channel(1);
237d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  CHECK_ERROR_MT(_acmB->RegisterTransportCallback(_channel_B2A));
2386ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org  _channel_B2A->RegisterReceiverACM(_acmA.get());
239d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
240d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  //--- EVENT TIMERS
241d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  // A
24264c0366908f7a966cbb28a4b07a810f2597a888aPeter Boström  _pullEventA = EventTimerWrapper::Create();
24364c0366908f7a966cbb28a4b07a810f2597a888aPeter Boström  _pushEventA = EventTimerWrapper::Create();
24464c0366908f7a966cbb28a4b07a810f2597a888aPeter Boström  _processEventA = EventTimerWrapper::Create();
245d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  _apiEventA = EventWrapper::Create();
246d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  // B
24764c0366908f7a966cbb28a4b07a810f2597a888aPeter Boström  _pullEventB = EventTimerWrapper::Create();
24864c0366908f7a966cbb28a4b07a810f2597a888aPeter Boström  _pushEventB = EventTimerWrapper::Create();
24964c0366908f7a966cbb28a4b07a810f2597a888aPeter Boström  _processEventB = EventTimerWrapper::Create();
250d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  _apiEventB = EventWrapper::Create();
251d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
252d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  //--- I/O params
253d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  // A
254d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  _outFreqHzA = _outFileA.SamplingFrequency();
255d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  // B
256d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  _outFreqHzB = _outFileB.SamplingFrequency();
257d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
258d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  //Trace::SetEncryptedTraceFile("ACMAPITestEncrypted.txt");
259d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
260d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  char print[11];
261d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
262d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  // Create a trace file.
263d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  Trace::CreateTrace();
264d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  Trace::SetTraceFile(
265d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      (webrtc::test::OutputPath() + "acm_api_trace.txt").c_str());
266d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
267d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  printf("\nRandom Test (y/n)?");
268d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  EXPECT_TRUE(fgets(print, 10, stdin) != NULL);
269d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  print[10] = '\0';
270d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  if (strstr(print, "y") != NULL) {
271d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    _randomTest = true;
272d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    _verbose = false;
273d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    _writeToFile = false;
274d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  } else {
275d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    _randomTest = false;
276d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    printf("\nPrint Tests (y/n)? ");
277543c3eaa46434a7e3974012c4d33ed82fc81fd33kjellander@webrtc.org    EXPECT_TRUE(fgets(print, 10, stdin) != NULL);
278470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    print[10] = '\0';
279d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    if (strstr(print, "y") == NULL) {
280d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      EXPECT_TRUE(freopen("APITest_log.txt", "w", stdout) != 0);
281d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      _verbose = false;
282470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    }
283d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  }
284470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
285d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  _vadCallbackA = new VADCallback;
286d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  _vadCallbackB = new VADCallback;
287d7a71d0719251db2a31b71a9d6e9fef4f60ba778andrew@webrtc.org
288d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  return 0;
289470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
290470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
291d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.orgbool APITest::PushAudioThreadA(void* obj) {
292d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  return static_cast<APITest*>(obj)->PushAudioRunA();
293470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
294470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
295d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.orgbool APITest::PushAudioThreadB(void* obj) {
296d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  return static_cast<APITest*>(obj)->PushAudioRunB();
297470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
298470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
299d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.orgbool APITest::PullAudioThreadA(void* obj) {
300d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  return static_cast<APITest*>(obj)->PullAudioRunA();
301470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
302470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
303d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.orgbool APITest::PullAudioThreadB(void* obj) {
304d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  return static_cast<APITest*>(obj)->PullAudioRunB();
305470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
306470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
307d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.orgbool APITest::ProcessThreadA(void* obj) {
308d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  return static_cast<APITest*>(obj)->ProcessRunA();
309470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
310470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
311d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.orgbool APITest::ProcessThreadB(void* obj) {
312d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  return static_cast<APITest*>(obj)->ProcessRunB();
313470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
314470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
315d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.orgbool APITest::APIThreadA(void* obj) {
316d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  return static_cast<APITest*>(obj)->APIRunA();
317470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
318470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
319d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.orgbool APITest::APIThreadB(void* obj) {
320d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  return static_cast<APITest*>(obj)->APIRunB();
321470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
322470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
323d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.orgbool APITest::PullAudioRunA() {
324d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  _pullEventA->Wait(100);
325d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  AudioFrame audioFrame;
326d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  if (_acmA->PlayoutData10Ms(_outFreqHzA, &audioFrame) < 0) {
327d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    bool thereIsDecoder;
328470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    {
329d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      ReadLockScoped rl(_apiTestRWLock);
330d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      thereIsDecoder = _thereIsDecoderA;
331470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    }
332d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    if (thereIsDecoder) {
333d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      fprintf(stderr, "\n>>>>>>    cannot pull audio A       <<<<<<<< \n");
334d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    }
335d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  } else {
336d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    if (_writeToFile) {
337d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      _outFileA.Write10MsData(audioFrame);
338470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    }
339d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  }
340d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  return true;
341470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
342470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
343d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.orgbool APITest::PullAudioRunB() {
344d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  _pullEventB->Wait(100);
345d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  AudioFrame audioFrame;
346d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  if (_acmB->PlayoutData10Ms(_outFreqHzB, &audioFrame) < 0) {
347d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    bool thereIsDecoder;
348470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    {
349d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      ReadLockScoped rl(_apiTestRWLock);
350d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      thereIsDecoder = _thereIsDecoderB;
351470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    }
352d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    if (thereIsDecoder) {
353d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      fprintf(stderr, "\n>>>>>>    cannot pull audio B       <<<<<<<< \n");
354d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      fprintf(stderr, "%d %d\n", _testNumA, _testNumB);
355d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    }
356d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  } else {
357d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    if (_writeToFile) {
358d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      _outFileB.Write10MsData(audioFrame);
359d7a71d0719251db2a31b71a9d6e9fef4f60ba778andrew@webrtc.org    }
360d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  }
361d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  return true;
362470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
363470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
364d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.orgbool APITest::PushAudioRunA() {
365d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  _pushEventA->Wait(100);
366d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  AudioFrame audioFrame;
367d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  _inFileA.Read10MsData(audioFrame);
368d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  if (_acmA->Add10MsData(audioFrame) < 0) {
369d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    bool thereIsEncoder;
370470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    {
371d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      ReadLockScoped rl(_apiTestRWLock);
372d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      thereIsEncoder = _thereIsEncoderA;
373d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    }
374d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    if (thereIsEncoder) {
375d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      fprintf(stderr, "\n>>>>        add10MsData at A failed       <<<<\n");
376470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    }
377d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  }
378d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  return true;
379470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
380470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
381d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.orgbool APITest::PushAudioRunB() {
382d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  _pushEventB->Wait(100);
383d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  AudioFrame audioFrame;
384d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  _inFileB.Read10MsData(audioFrame);
385d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  if (_acmB->Add10MsData(audioFrame) < 0) {
386d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    bool thereIsEncoder;
387470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    {
388d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      ReadLockScoped rl(_apiTestRWLock);
389d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      thereIsEncoder = _thereIsEncoderB;
390d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    }
391470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
392d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    if (thereIsEncoder) {
393d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      fprintf(stderr, "\n>>>>   cannot add audio to B    <<<<");
394470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    }
395d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  }
396470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
397d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  return true;
398470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
399470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
400d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.orgbool APITest::ProcessRunA() {
401d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  _processEventA->Wait(100);
402d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  return true;
403470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
404470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
405d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.orgbool APITest::ProcessRunB() {
406d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  _processEventB->Wait(100);
407d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  return true;
408470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
409470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
410470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/*/
411470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
412470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * In side A we test the APIs which are related to sender Side.
413470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
414470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/*/
415470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
416d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.orgvoid APITest::RunTest(char thread) {
417d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  int testNum;
418d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  {
419d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    WriteLockScoped cs(_apiTestRWLock);
420d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    if (thread == 'A') {
4211bd0e03ce56ed5384c3377b6da171951ec654706henrik.lundin      _testNumA = (_testNumB + 1 + (rand() % 3)) % 4;
422d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      testNum = _testNumA;
423d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
424d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      _movingDot[_dotPositionA] = ' ';
425d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      if (_dotPositionA == 0) {
426d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org        _dotMoveDirectionA = 1;
427d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      }
428d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      if (_dotPositionA == 19) {
429d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org        _dotMoveDirectionA = -1;
430d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      }
431d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      _dotPositionA += _dotMoveDirectionA;
432d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      _movingDot[_dotPositionA] = (_dotMoveDirectionA > 0) ? '>' : '<';
433d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    } else {
4341bd0e03ce56ed5384c3377b6da171951ec654706henrik.lundin      _testNumB = (_testNumA + 1 + (rand() % 3)) % 4;
435d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      testNum = _testNumB;
436d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
437d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      _movingDot[_dotPositionB] = ' ';
438d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      if (_dotPositionB == 20) {
439d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org        _dotMoveDirectionB = 1;
440d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      }
441d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      if (_dotPositionB == 39) {
442d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org        _dotMoveDirectionB = -1;
443d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      }
444d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      _dotPositionB += _dotMoveDirectionB;
445d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      _movingDot[_dotPositionB] = (_dotMoveDirectionB > 0) ? '>' : '<';
446d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    }
447d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    //fprintf(stderr, "%c: %d \n", thread, testNum);
448d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    //fflush(stderr);
449d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  }
450d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  switch (testNum) {
451470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    case 0:
452d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      CurrentCodec('A');
453d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      ChangeCodec('A');
454d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      break;
455470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    case 1:
456d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      if (!_randomTest) {
457d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org        fprintf(stdout, "\nTesting Delay ...\n");
458d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      }
459d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      TestDelay('A');
460d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      break;
4611bd0e03ce56ed5384c3377b6da171951ec654706henrik.lundin    case 2:
462d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      TestSendVAD('A');
463d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      break;
4641bd0e03ce56ed5384c3377b6da171951ec654706henrik.lundin    case 3:
465d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      TestRegisteration('A');
466d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      break;
467470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    default:
468d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      fprintf(stderr, "Wrong Test Number\n");
4694765ca55f9203df57966317379d686904483fb63marpan@webrtc.org      getc(stdin);
470d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      exit(1);
471d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  }
472470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
473470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
474d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.orgbool APITest::APIRunA() {
475d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  _apiEventA->Wait(50);
476d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
477d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  bool randomTest;
478d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  {
479d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    ReadLockScoped rl(_apiTestRWLock);
480d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    randomTest = _randomTest;
481d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  }
482d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  if (randomTest) {
483d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    RunTest('A');
484d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  } else {
485d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    CurrentCodec('A');
486d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    ChangeCodec('A');
487d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    if (_codecCntrA == 0) {
488d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      fprintf(stdout, "\nTesting Delay ...\n");
489d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      TestDelay('A');
490d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    }
491d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    // VAD TEST
492d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    TestSendVAD('A');
493d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    TestRegisteration('A');
494d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  }
495d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  return true;
496470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
497470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
498d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.orgbool APITest::APIRunB() {
499d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  _apiEventB->Wait(50);
500d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  bool randomTest;
501d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  {
502d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    ReadLockScoped rl(_apiTestRWLock);
503d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    randomTest = _randomTest;
504d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  }
505d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  //_apiEventB->Wait(2000);
506d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  if (randomTest) {
507d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    RunTest('B');
508d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  }
509d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
510d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  return true;
511470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
512470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
513d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.orgvoid APITest::Perform() {
514d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  SetUp();
515d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
516d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  //--- THREADS
517d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  // A
518d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  // PUSH
5198c38e8b9b96d72317d6ce94c1442113b4e385dcbPeter Boström  rtc::PlatformThread myPushAudioThreadA(PushAudioThreadA, this,
5208c38e8b9b96d72317d6ce94c1442113b4e385dcbPeter Boström                                         "PushAudioThreadA");
5218c38e8b9b96d72317d6ce94c1442113b4e385dcbPeter Boström  myPushAudioThreadA.Start();
522d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  // PULL
5238c38e8b9b96d72317d6ce94c1442113b4e385dcbPeter Boström  rtc::PlatformThread myPullAudioThreadA(PullAudioThreadA, this,
5248c38e8b9b96d72317d6ce94c1442113b4e385dcbPeter Boström                                         "PullAudioThreadA");
5258c38e8b9b96d72317d6ce94c1442113b4e385dcbPeter Boström  myPullAudioThreadA.Start();
526d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  // Process
5278c38e8b9b96d72317d6ce94c1442113b4e385dcbPeter Boström  rtc::PlatformThread myProcessThreadA(ProcessThreadA, this, "ProcessThreadA");
5288c38e8b9b96d72317d6ce94c1442113b4e385dcbPeter Boström  myProcessThreadA.Start();
529d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  // API
5308c38e8b9b96d72317d6ce94c1442113b4e385dcbPeter Boström  rtc::PlatformThread myAPIThreadA(APIThreadA, this, "APIThreadA");
5318c38e8b9b96d72317d6ce94c1442113b4e385dcbPeter Boström  myAPIThreadA.Start();
532d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  // B
533d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  // PUSH
5348c38e8b9b96d72317d6ce94c1442113b4e385dcbPeter Boström  rtc::PlatformThread myPushAudioThreadB(PushAudioThreadB, this,
5358c38e8b9b96d72317d6ce94c1442113b4e385dcbPeter Boström                                         "PushAudioThreadB");
5368c38e8b9b96d72317d6ce94c1442113b4e385dcbPeter Boström  myPushAudioThreadB.Start();
537d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  // PULL
5388c38e8b9b96d72317d6ce94c1442113b4e385dcbPeter Boström  rtc::PlatformThread myPullAudioThreadB(PullAudioThreadB, this,
5398c38e8b9b96d72317d6ce94c1442113b4e385dcbPeter Boström                                         "PullAudioThreadB");
5408c38e8b9b96d72317d6ce94c1442113b4e385dcbPeter Boström  myPullAudioThreadB.Start();
541d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  // Process
5428c38e8b9b96d72317d6ce94c1442113b4e385dcbPeter Boström  rtc::PlatformThread myProcessThreadB(ProcessThreadB, this, "ProcessThreadB");
5438c38e8b9b96d72317d6ce94c1442113b4e385dcbPeter Boström  myProcessThreadB.Start();
544d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  // API
5458c38e8b9b96d72317d6ce94c1442113b4e385dcbPeter Boström  rtc::PlatformThread myAPIThreadB(APIThreadB, this, "APIThreadB");
5468c38e8b9b96d72317d6ce94c1442113b4e385dcbPeter Boström  myAPIThreadB.Start();
547d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
548d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  //_apiEventA->StartTimer(true, 5000);
549d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  //_apiEventB->StartTimer(true, 5000);
550d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
551d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  _processEventA->StartTimer(true, 10);
552d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  _processEventB->StartTimer(true, 10);
553d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
554d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  _pullEventA->StartTimer(true, 10);
555d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  _pullEventB->StartTimer(true, 10);
556d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
557d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  _pushEventA->StartTimer(true, 10);
558d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  _pushEventB->StartTimer(true, 10);
559d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
560d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  // Keep main thread waiting for sender/receiver
561d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  // threads to complete
562d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  EventWrapper* completeEvent = EventWrapper::Create();
563d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  uint64_t startTime = TickTime::MillisecondTimestamp();
564d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  uint64_t currentTime;
565d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  // Run test in 2 minutes (120000 ms).
566d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  do {
567d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    {
568d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      //ReadLockScoped rl(_apiTestRWLock);
569d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      //fprintf(stderr, "\r%s", _movingDot);
570d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    }
571d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    //fflush(stderr);
572d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    completeEvent->Wait(50);
573d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    currentTime = TickTime::MillisecondTimestamp();
574d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  } while ((currentTime - startTime) < 120000);
575d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
576d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  //completeEvent->Wait(0xFFFFFFFF);
577d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  //(unsigned long)((unsigned long)TEST_DURATION_SEC * (unsigned long)1000));
578d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  delete completeEvent;
579d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
5808c38e8b9b96d72317d6ce94c1442113b4e385dcbPeter Boström  myPushAudioThreadA.Stop();
5818c38e8b9b96d72317d6ce94c1442113b4e385dcbPeter Boström  myPullAudioThreadA.Stop();
5828c38e8b9b96d72317d6ce94c1442113b4e385dcbPeter Boström  myProcessThreadA.Stop();
5838c38e8b9b96d72317d6ce94c1442113b4e385dcbPeter Boström  myAPIThreadA.Stop();
584d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
5858c38e8b9b96d72317d6ce94c1442113b4e385dcbPeter Boström  myPushAudioThreadB.Stop();
5868c38e8b9b96d72317d6ce94c1442113b4e385dcbPeter Boström  myPullAudioThreadB.Stop();
5878c38e8b9b96d72317d6ce94c1442113b4e385dcbPeter Boström  myProcessThreadB.Stop();
5888c38e8b9b96d72317d6ce94c1442113b4e385dcbPeter Boström  myAPIThreadB.Stop();
589470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
590470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
591d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.orgvoid APITest::CheckVADStatus(char side) {
592d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
593d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  bool dtxEnabled;
594d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  bool vadEnabled;
595d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  ACMVADMode vadMode;
596d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
597d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  if (side == 'A') {
598d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    _acmA->VAD(&dtxEnabled, &vadEnabled, &vadMode);
599d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    _acmA->RegisterVADCallback(NULL);
600d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    _vadCallbackA->Reset();
601d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    _acmA->RegisterVADCallback(_vadCallbackA);
602d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
603d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    if (!_randomTest) {
604d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      if (_verbose) {
605d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org        fprintf(stdout, "DTX %3s, VAD %3s, Mode %d", dtxEnabled ? "ON" : "OFF",
606d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org                vadEnabled ? "ON" : "OFF", (int) vadMode);
607d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org        Wait(5000);
608d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org        fprintf(stdout, " => bit-rate %3.0f kbps\n", _channel_A2B->BitRate());
609d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      } else {
610d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org        Wait(5000);
611d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org        fprintf(stdout, "DTX %3s, VAD %3s, Mode %d => bit-rate %3.0f kbps\n",
612d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org                dtxEnabled ? "ON" : "OFF", vadEnabled ? "ON" : "OFF",
613d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org                (int) vadMode, _channel_A2B->BitRate());
614d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      }
615d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      _vadCallbackA->PrintFrameTypes();
616d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    }
617d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
618d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    if (dtxEnabled != _sendDTXA) {
619d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      fprintf(stderr, ">>>   Error Enabling DTX    <<<\n");
620d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    }
621d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    if ((vadEnabled != _sendVADA) && (!dtxEnabled)) {
622d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      fprintf(stderr, ">>>   Error Enabling VAD    <<<\n");
623d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    }
624d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    if ((vadMode != _sendVADModeA) && vadEnabled) {
625d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      fprintf(stderr, ">>>   Error setting VAD-mode    <<<\n");
626d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    }
627d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  } else {
628d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    _acmB->VAD(&dtxEnabled, &vadEnabled, &vadMode);
629d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
630d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    _acmB->RegisterVADCallback(NULL);
631d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    _vadCallbackB->Reset();
632d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    _acmB->RegisterVADCallback(_vadCallbackB);
633d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
634d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    if (!_randomTest) {
635d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      if (_verbose) {
636d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org        fprintf(stdout, "DTX %3s, VAD %3s, Mode %d", dtxEnabled ? "ON" : "OFF",
637d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org                vadEnabled ? "ON" : "OFF", (int) vadMode);
638d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org        Wait(5000);
639d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org        fprintf(stdout, " => bit-rate %3.0f kbps\n", _channel_B2A->BitRate());
640d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      } else {
641d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org        Wait(5000);
642d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org        fprintf(stdout, "DTX %3s, VAD %3s, Mode %d => bit-rate %3.0f kbps\n",
643d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org                dtxEnabled ? "ON" : "OFF", vadEnabled ? "ON" : "OFF",
644d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org                (int) vadMode, _channel_B2A->BitRate());
645d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      }
646d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      _vadCallbackB->PrintFrameTypes();
647d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    }
648d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
649d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    if (dtxEnabled != _sendDTXB) {
650d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      fprintf(stderr, ">>>   Error Enabling DTX    <<<\n");
651d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    }
652d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    if ((vadEnabled != _sendVADB) && (!dtxEnabled)) {
653d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      fprintf(stderr, ">>>   Error Enabling VAD    <<<\n");
654d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    }
655d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    if ((vadMode != _sendVADModeB) && vadEnabled) {
656d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      fprintf(stderr, ">>>   Error setting VAD-mode    <<<\n");
657d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    }
658d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  }
659470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
660470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
661470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com// Set Min delay, get delay, playout timestamp
662d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.orgvoid APITest::TestDelay(char side) {
663d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  AudioCodingModule* myACM;
664d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  Channel* myChannel;
665d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  int32_t* myMinDelay;
66664c0366908f7a966cbb28a4b07a810f2597a888aPeter Boström  EventTimerWrapper* myEvent = EventTimerWrapper::Create();
667d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
668d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  uint32_t inTimestamp = 0;
669d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  uint32_t outTimestamp = 0;
670d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  double estimDelay = 0;
671d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
672d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  double averageEstimDelay = 0;
673d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  double averageDelay = 0;
674d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
675d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  CircularBuffer estimDelayCB(100);
676d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  estimDelayCB.SetArithMean(true);
677d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
678d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  if (side == 'A') {
6796ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    myACM = _acmA.get();
680d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    myChannel = _channel_B2A;
681d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    myMinDelay = &_minDelayA;
682d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  } else {
6836ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    myACM = _acmB.get();
684d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    myChannel = _channel_A2B;
685d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    myMinDelay = &_minDelayB;
686d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  }
687d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
688d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  CHECK_ERROR_MT(myACM->SetMinimumPlayoutDelay(*myMinDelay));
689d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
690d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  inTimestamp = myChannel->LastInTimestamp();
691d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  CHECK_ERROR_MT(myACM->PlayoutTimestamp(&outTimestamp));
692d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
693d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  if (!_randomTest) {
694d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    myEvent->StartTimer(true, 30);
695d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    int n = 0;
696d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    int settlePoint = 5000;
697d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    while (n < settlePoint + 400) {
698d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      myEvent->Wait(1000);
699d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
700d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      inTimestamp = myChannel->LastInTimestamp();
701d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      CHECK_ERROR_MT(myACM->PlayoutTimestamp(&outTimestamp));
702d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
703d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      //std::cout << outTimestamp << std::endl << std::flush;
704d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      estimDelay = (double) ((uint32_t)(inTimestamp - outTimestamp))
705d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org          / ((double) myACM->ReceiveFrequency() / 1000.0);
706d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
707d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      estimDelayCB.Update(estimDelay);
708d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
709d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      estimDelayCB.ArithMean(averageEstimDelay);
710d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      //printf("\n %6.1f \n", estimDelay);
711d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      //std::cout << " " << std::flush;
712d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
713d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      if (_verbose) {
714d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org        fprintf(stdout,
715d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org                "\rExpected: %4d,    retreived: %6.1f,   measured: %6.1f",
716d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org                *myMinDelay, averageDelay, averageEstimDelay);
717d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org        std::cout << " " << std::flush;
718d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      }
719d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      if ((averageDelay > *myMinDelay) && (n < settlePoint)) {
720d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org        settlePoint = n;
721d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      }
722d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      n++;
723d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    }
724d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    myEvent->StopTimer();
725d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  }
726d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
727d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  if ((!_verbose) && (!_randomTest)) {
728d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    fprintf(stdout, "\nExpected: %4d,    retreived: %6.1f,   measured: %6.1f",
729470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            *myMinDelay, averageDelay, averageEstimDelay);
730d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  }
731d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
732d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  *myMinDelay = (rand() % 1000) + 1;
733d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
734c0bd7be0df67735d63f5cdd302a3b85f88239874minyue@webrtc.org  NetworkStatistics networkStat;
735c0bd7be0df67735d63f5cdd302a3b85f88239874minyue@webrtc.org  CHECK_ERROR_MT(myACM->GetNetworkStatistics(&networkStat));
736d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
737d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  if (!_randomTest) {
738d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    fprintf(stdout, "\n\nJitter Statistics at Side %c\n", side);
739d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    fprintf(stdout, "--------------------------------------\n");
740d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    fprintf(stdout, "buffer-size............. %d\n",
741d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org            networkStat.currentBufferSize);
742d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    fprintf(stdout, "Preferred buffer-size... %d\n",
743d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org            networkStat.preferredBufferSize);
744d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    fprintf(stdout, "Peaky jitter mode........%d\n",
745d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org            networkStat.jitterPeaksFound);
746d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    fprintf(stdout, "packet-size rate........ %d\n",
747d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org            networkStat.currentPacketLossRate);
748d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    fprintf(stdout, "discard rate............ %d\n",
749d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org            networkStat.currentDiscardRate);
750d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    fprintf(stdout, "expand rate............. %d\n",
751d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org            networkStat.currentExpandRate);
752c0bd7be0df67735d63f5cdd302a3b85f88239874minyue@webrtc.org    fprintf(stdout, "speech expand rate...... %d\n",
753c0bd7be0df67735d63f5cdd302a3b85f88239874minyue@webrtc.org            networkStat.currentSpeechExpandRate);
754d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    fprintf(stdout, "Preemptive rate......... %d\n",
755d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org            networkStat.currentPreemptiveRate);
756d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    fprintf(stdout, "Accelerate rate......... %d\n",
757d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org            networkStat.currentAccelerateRate);
758c0bd7be0df67735d63f5cdd302a3b85f88239874minyue@webrtc.org    fprintf(stdout, "Secondary decoded rate.. %d\n",
759c0bd7be0df67735d63f5cdd302a3b85f88239874minyue@webrtc.org            networkStat.currentSecondaryDecodedRate);
760d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    fprintf(stdout, "Clock-drift............. %d\n", networkStat.clockDriftPPM);
761d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    fprintf(stdout, "Mean waiting time....... %d\n",
762d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org            networkStat.meanWaitingTimeMs);
763d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    fprintf(stdout, "Median waiting time..... %d\n",
764d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org            networkStat.medianWaitingTimeMs);
765d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    fprintf(stdout, "Min waiting time........ %d\n",
766d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org            networkStat.minWaitingTimeMs);
767d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    fprintf(stdout, "Max waiting time........ %d\n",
768d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org            networkStat.maxWaitingTimeMs);
769d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  }
770d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
771d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  CHECK_ERROR_MT(myACM->SetMinimumPlayoutDelay(*myMinDelay));
772d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
773d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  if (!_randomTest) {
774d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    myEvent->Wait(500);
775d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    fprintf(stdout, "\n");
776d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    fprintf(stdout, "\n");
777d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  }
778d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  delete myEvent;
779470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
780470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
781470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com// Unregister a codec & register again.
782d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.orgvoid APITest::TestRegisteration(char sendSide) {
783d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  AudioCodingModule* sendACM;
784d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  AudioCodingModule* receiveACM;
785d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  bool* thereIsDecoder;
786d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  EventWrapper* myEvent = EventWrapper::Create();
787d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
788d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  if (!_randomTest) {
789d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    fprintf(stdout, "\n\n");
790d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    fprintf(stdout,
791d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org            "---------------------------------------------------------\n");
792d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    fprintf(stdout, "           Unregister/register Receive Codec\n");
793d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    fprintf(stdout,
794d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org            "---------------------------------------------------------\n");
795d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  }
796d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
797d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  switch (sendSide) {
798d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    case 'A': {
7996ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org      sendACM = _acmA.get();
8006ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org      receiveACM = _acmB.get();
801d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      thereIsDecoder = &_thereIsDecoderB;
802d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      break;
803d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    }
804d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    case 'B': {
8056ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org      sendACM = _acmB.get();
8066ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org      receiveACM = _acmA.get();
807d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      thereIsDecoder = &_thereIsDecoderA;
808d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      break;
809470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    }
810470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    default:
811d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      fprintf(stderr, "Invalid sender-side in TestRegistration(%c)\n",
812d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org              sendSide);
813d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      exit(-1);
814d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  }
815d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
8161fd4a4ab35f1fcb08b551befca180de9a1f55dfckwiberg  auto myCodec = sendACM->SendCodec();
8171fd4a4ab35f1fcb08b551befca180de9a1f55dfckwiberg  if (!myCodec) {
8181fd4a4ab35f1fcb08b551befca180de9a1f55dfckwiberg    CodecInst ci;
8191fd4a4ab35f1fcb08b551befca180de9a1f55dfckwiberg    AudioCodingModule::Codec(_codecCntrA, &ci);
820be57983f4bd875c39a229bab5112b32dad004057Karl Wiberg    myCodec = rtc::Optional<CodecInst>(ci);
821d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  }
822d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
823d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  if (!_randomTest) {
824d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    fprintf(stdout, "Unregistering reveive codec, NO AUDIO.\n");
825d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    fflush (stdout);
826d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  }
827d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  {
828d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    WriteLockScoped wl(_apiTestRWLock);
829d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    *thereIsDecoder = false;
830d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  }
831d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  //myEvent->Wait(20);
8321fd4a4ab35f1fcb08b551befca180de9a1f55dfckwiberg  CHECK_ERROR_MT(receiveACM->UnregisterReceiveCodec(myCodec->pltype));
833d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  Wait(1000);
834d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
8351fd4a4ab35f1fcb08b551befca180de9a1f55dfckwiberg  int currentPayload = myCodec->pltype;
836d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
8371fd4a4ab35f1fcb08b551befca180de9a1f55dfckwiberg  if (!FixedPayloadTypeCodec(myCodec->plname)) {
838d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    int32_t i;
839d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    for (i = 0; i < 32; i++) {
840d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      if (!_payloadUsed[i]) {
841d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org        if (!_randomTest) {
842d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org          fprintf(stdout,
843d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org                  "Register receive codec with new Payload, AUDIO BACK.\n");
844470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
8451fd4a4ab35f1fcb08b551befca180de9a1f55dfckwiberg        //myCodec->pltype = i + 96;
8461fd4a4ab35f1fcb08b551befca180de9a1f55dfckwiberg        //CHECK_ERROR_MT(receiveACM->RegisterReceiveCodec(*myCodec));
8471fd4a4ab35f1fcb08b551befca180de9a1f55dfckwiberg        //CHECK_ERROR_MT(sendACM->RegisterSendCodec(*myCodec));
848d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org        //myEvent->Wait(20);
849d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org        //{
850d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org        //    WriteLockScoped wl(_apiTestRWLock);
851d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org        //    *thereIsDecoder = true;
852d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org        //}
853d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org        Wait(1000);
854d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
855d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org        if (!_randomTest) {
856d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org          fprintf(stdout, "Unregistering reveive codec, NO AUDIO.\n");
857470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
858d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org        //{
859d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org        //    WriteLockScoped wl(_apiTestRWLock);
860d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org        //    *thereIsDecoder = false;
861d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org        //}
862d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org        //myEvent->Wait(20);
8631fd4a4ab35f1fcb08b551befca180de9a1f55dfckwiberg        //CHECK_ERROR_MT(receiveACM->UnregisterReceiveCodec(myCodec->pltype));
864d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org        Wait(1000);
865d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
8661fd4a4ab35f1fcb08b551befca180de9a1f55dfckwiberg        myCodec->pltype = currentPayload;
867d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org        if (!_randomTest) {
868d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org          fprintf(stdout,
869d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org                  "Register receive codec with default Payload, AUDIO BACK.\n");
870d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org          fflush (stdout);
871470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
8721fd4a4ab35f1fcb08b551befca180de9a1f55dfckwiberg        CHECK_ERROR_MT(receiveACM->RegisterReceiveCodec(*myCodec));
8731fd4a4ab35f1fcb08b551befca180de9a1f55dfckwiberg        //CHECK_ERROR_MT(sendACM->RegisterSendCodec(*myCodec));
874470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        myEvent->Wait(20);
875470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        {
876d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org          WriteLockScoped wl(_apiTestRWLock);
877d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org          *thereIsDecoder = true;
878470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com        }
879d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org        Wait(1000);
880d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
881d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org        break;
882d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      }
883470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com    }
884d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    if (i == 32) {
8851fd4a4ab35f1fcb08b551befca180de9a1f55dfckwiberg      CHECK_ERROR_MT(receiveACM->RegisterReceiveCodec(*myCodec));
886d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      {
887d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org        WriteLockScoped wl(_apiTestRWLock);
888d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org        *thereIsDecoder = true;
889d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      }
890d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    }
891d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  } else {
892d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    if (!_randomTest) {
893d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      fprintf(stdout,
894d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org              "Register receive codec with fixed Payload, AUDIO BACK.\n");
895d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      fflush (stdout);
896d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    }
8971fd4a4ab35f1fcb08b551befca180de9a1f55dfckwiberg    CHECK_ERROR_MT(receiveACM->RegisterReceiveCodec(*myCodec));
8981fd4a4ab35f1fcb08b551befca180de9a1f55dfckwiberg    //CHECK_ERROR_MT(receiveACM->UnregisterReceiveCodec(myCodec->pltype));
8991fd4a4ab35f1fcb08b551befca180de9a1f55dfckwiberg    //CHECK_ERROR_MT(receiveACM->RegisterReceiveCodec(*myCodec));
900d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    myEvent->Wait(20);
901d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    {
902d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      WriteLockScoped wl(_apiTestRWLock);
903d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      *thereIsDecoder = true;
904d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    }
905d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  }
906d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  delete myEvent;
907d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  if (!_randomTest) {
908d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    fprintf(stdout,
909d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org            "---------------------------------------------------------\n");
910d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  }
911470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
912470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
913d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.orgvoid APITest::TestSendVAD(char side) {
914d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  if (_randomTest) {
915d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    return;
916d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  }
917d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
918d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  bool* vad;
919d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  bool* dtx;
920d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  ACMVADMode* mode;
921d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  Channel* myChannel;
922d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  AudioCodingModule* myACM;
923d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
924d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  CodecInst myCodec;
925d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  if (!_randomTest) {
926d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    fprintf(stdout, "\n\n");
927d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    fprintf(stdout, "-----------------------------------------------\n");
928d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    fprintf(stdout, "                Test VAD API\n");
929d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    fprintf(stdout, "-----------------------------------------------\n");
930d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  }
931d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
932d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  if (side == 'A') {
933d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    AudioCodingModule::Codec(_codecCntrA, &myCodec);
934d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    vad = &_sendVADA;
935d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    dtx = &_sendDTXA;
936d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    mode = &_sendVADModeA;
937d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    myChannel = _channel_A2B;
9386ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    myACM = _acmA.get();
939d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  } else {
940d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    AudioCodingModule::Codec(_codecCntrB, &myCodec);
941d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    vad = &_sendVADB;
942d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    dtx = &_sendDTXB;
943d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    mode = &_sendVADModeB;
944d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    myChannel = _channel_B2A;
9456ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    myACM = _acmB.get();
946d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  }
947d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
948d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  CheckVADStatus(side);
949d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  if (!_randomTest) {
950d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    fprintf(stdout, "\n\n");
951d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  }
952d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
953d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  switch (*mode) {
954d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    case VADNormal:
955d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      *vad = true;
956d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      *dtx = true;
957d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      *mode = VADAggr;
958d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      break;
959d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    case VADLowBitrate:
960d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      *vad = true;
961d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      *dtx = true;
962d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      *mode = VADVeryAggr;
963d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      break;
964d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    case VADAggr:
965d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      *vad = true;
966d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      *dtx = true;
967d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      *mode = VADLowBitrate;
968d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      break;
969d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    case VADVeryAggr:
970d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      *vad = false;
971d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      *dtx = false;
972d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      *mode = VADNormal;
973d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      break;
974d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    default:
975d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      *mode = VADNormal;
976d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  }
977470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
978d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  *dtx = (myCodec.plfreq == 32000) ? false : *dtx;
979470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
980d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  CHECK_ERROR_MT(myACM->SetVAD(*dtx, *vad, *mode));
981d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  myChannel->ResetStats();
982d7a71d0719251db2a31b71a9d6e9fef4f60ba778andrew@webrtc.org
983d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  CheckVADStatus(side);
984d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  if (!_randomTest) {
985d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    fprintf(stdout, "\n");
986d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    fprintf(stdout, "-----------------------------------------------\n");
987d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  }
988470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
989d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  // Fault Test
990d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  CHECK_PROTECTED_MT(myACM->SetVAD(false, true, (ACMVADMode) - 1));
991d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  CHECK_PROTECTED_MT(myACM->SetVAD(false, true, (ACMVADMode) 4));
992470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
993470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
994470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
995d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.orgvoid APITest::CurrentCodec(char side) {
9961fd4a4ab35f1fcb08b551befca180de9a1f55dfckwiberg  auto myCodec = (side == 'A' ? _acmA : _acmB)->SendCodec();
997d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
998d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  if (!_randomTest) {
999d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    fprintf(stdout, "\n\n");
1000d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    fprintf(stdout, "Send codec in Side A\n");
1001d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    fprintf(stdout, "----------------------------\n");
10021fd4a4ab35f1fcb08b551befca180de9a1f55dfckwiberg    fprintf(stdout, "Name................. %s\n", myCodec->plname);
10031fd4a4ab35f1fcb08b551befca180de9a1f55dfckwiberg    fprintf(stdout, "Sampling Frequency... %d\n", myCodec->plfreq);
10041fd4a4ab35f1fcb08b551befca180de9a1f55dfckwiberg    fprintf(stdout, "Rate................. %d\n", myCodec->rate);
10051fd4a4ab35f1fcb08b551befca180de9a1f55dfckwiberg    fprintf(stdout, "Payload-type......... %d\n", myCodec->pltype);
10061fd4a4ab35f1fcb08b551befca180de9a1f55dfckwiberg    fprintf(stdout, "Packet-size.......... %d\n", myCodec->pacsize);
1007d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  }
1008d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
1009d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  Wait(100);
1010470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
1011470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1012d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.orgvoid APITest::ChangeCodec(char side) {
1013d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  CodecInst myCodec;
1014d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  AudioCodingModule* myACM;
1015d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  uint8_t* codecCntr;
1016d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  bool* thereIsEncoder;
1017d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  bool* vad;
1018d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  bool* dtx;
1019d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  ACMVADMode* mode;
1020d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  Channel* myChannel;
1021d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  // Reset and Wait
1022d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  if (!_randomTest) {
1023d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    fprintf(stdout, "Reset Encoder Side A \n");
1024d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  }
1025d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  if (side == 'A') {
10266ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    myACM = _acmA.get();
1027d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    codecCntr = &_codecCntrA;
1028d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    {
1029d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      WriteLockScoped wl(_apiTestRWLock);
1030d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      thereIsEncoder = &_thereIsEncoderA;
1031d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    }
1032d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    vad = &_sendVADA;
1033d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    dtx = &_sendDTXA;
1034d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    mode = &_sendVADModeA;
1035d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    myChannel = _channel_A2B;
1036d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  } else {
10376ea3d1cc9e45ca5661b06ec3390282fa50ded349turaj@webrtc.org    myACM = _acmB.get();
1038d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    codecCntr = &_codecCntrB;
1039d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    {
1040d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      WriteLockScoped wl(_apiTestRWLock);
1041d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      thereIsEncoder = &_thereIsEncoderB;
1042d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    }
1043d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    vad = &_sendVADB;
1044d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    dtx = &_sendDTXB;
1045d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    mode = &_sendVADModeB;
1046d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    myChannel = _channel_B2A;
1047d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  }
1048d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
1049d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  Wait(100);
1050d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
1051d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  // Register the next codec
1052d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  do {
1053d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    *codecCntr =
1054d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org        (*codecCntr < AudioCodingModule::NumberOfCodecs() - 1) ?
1055d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org            (*codecCntr + 1) : 0;
1056d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
1057d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    if (*codecCntr == 0) {
1058d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      //printf("Initialize Sender Side A \n");
1059d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      {
1060d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org        WriteLockScoped wl(_apiTestRWLock);
1061d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org        *thereIsEncoder = false;
1062d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      }
1063d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      // After Initialization CN is lost, re-register them
1064d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      if (AudioCodingModule::Codec("CN", &myCodec, 8000, 1) >= 0) {
1065d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org        CHECK_ERROR_MT(myACM->RegisterSendCodec(myCodec));
1066d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      }
1067d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      if (AudioCodingModule::Codec("CN", &myCodec, 16000, 1) >= 0) {
1068d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org        CHECK_ERROR_MT(myACM->RegisterSendCodec(myCodec));
1069d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      }
1070d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      // VAD & DTX are disabled after initialization
1071d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      *vad = false;
1072d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      *dtx = false;
1073d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      _writeToFile = false;
1074d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    }
1075d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
1076d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    AudioCodingModule::Codec(*codecCntr, &myCodec);
1077d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  } while (!STR_CASE_CMP(myCodec.plname, "CN")
1078d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      || !STR_CASE_CMP(myCodec.plname, "telephone-event")
1079d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org      || !STR_CASE_CMP(myCodec.plname, "RED"));
1080d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org
1081d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  if (!_randomTest) {
1082d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    fprintf(stdout,"\n=====================================================\n");
1083d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    fprintf(stdout, "      Registering New Codec %s, %d kHz, %d kbps\n",
1084470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com            myCodec.plname, myCodec.plfreq / 1000, myCodec.rate / 1000);
1085d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  }
1086d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  //std::cout<< std::flush;
1087470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1088d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  // NO DTX for supe-wideband codec at this point
1089d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  if (myCodec.plfreq == 32000) {
1090d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    *dtx = false;
1091d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    CHECK_ERROR_MT(myACM->SetVAD(*dtx, *vad, *mode));
1092470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1093d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  }
1094470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1095d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  CHECK_ERROR_MT(myACM->RegisterSendCodec(myCodec));
1096d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  myChannel->ResetStats();
1097d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  {
1098d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    WriteLockScoped wl(_apiTestRWLock);
1099d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org    *thereIsEncoder = true;
1100d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  }
1101d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org  Wait(500);
1102470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
1103470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1104d5726a1286ce53c47ebd2d21d61b2772fc24aaedtina.legrand@webrtc.org}  // namespace webrtc
1105