1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Use of this source code is governed by a BSD-style license
5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  that can be found in the LICENSE file in the root of the source
6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  tree. An additional intellectual property rights grant can be found
7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  in the file PATENTS.  All contributing project authors may
8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
11cf9ab12db22e50271900386e12d52974f8f455fetina.legrand@webrtc.org#include "webrtc/modules/audio_coding/main/test/iSACTest.h"
12cf9ab12db22e50271900386e12d52974f8f455fetina.legrand@webrtc.org
133f45c2e0ac4cb280f941efa3a3476895795e3dd6pbos@webrtc.org#include <ctype.h>
14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <stdio.h>
15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <string.h>
16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
17b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if _WIN32
18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <windows.h>
19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#elif WEBRTC_LINUX
203f45c2e0ac4cb280f941efa3a3476895795e3dd6pbos@webrtc.org#include <time.h>
21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#else
22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <sys/time.h>
23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <time.h>
245e3379e47b802f3aaef17b9b34308e057bf39675andrew@webrtc.org#endif
25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
264d081990603c0fc3c08a81523efc811b8e0828baturaj@webrtc.org#include "webrtc/modules/audio_coding/main/acm2/acm_common_defs.h"
27cf9ab12db22e50271900386e12d52974f8f455fetina.legrand@webrtc.org#include "webrtc/modules/audio_coding/main/test/utility.h"
28cf9ab12db22e50271900386e12d52974f8f455fetina.legrand@webrtc.org#include "webrtc/system_wrappers/interface/event_wrapper.h"
29cf9ab12db22e50271900386e12d52974f8f455fetina.legrand@webrtc.org#include "webrtc/system_wrappers/interface/tick_util.h"
30cf9ab12db22e50271900386e12d52974f8f455fetina.legrand@webrtc.org#include "webrtc/system_wrappers/interface/trace.h"
31cf9ab12db22e50271900386e12d52974f8f455fetina.legrand@webrtc.org#include "webrtc/test/testsupport/fileutils.h"
32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc {
34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
35b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.orgvoid SetISACConfigDefault(ACMTestISACConfig& isacConfig) {
36b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  isacConfig.currentRateBitPerSec = 0;
37b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  isacConfig.currentFrameSizeMsec = 0;
38b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  isacConfig.maxRateBitPerSec = 0;
39b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  isacConfig.maxPayloadSizeByte = 0;
40b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  isacConfig.encodingMode = -1;
41b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  isacConfig.initRateBitPerSec = 0;
42b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  isacConfig.initFrameSizeInMsec = 0;
43b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  isacConfig.enforceFrameSize = false;
44b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  return;
45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
47b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.orgint16_t SetISAConfig(ACMTestISACConfig& isacConfig, AudioCodingModule* acm,
48b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org                     int testMode) {
49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
50b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  if ((isacConfig.currentRateBitPerSec != 0)
51b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org      || (isacConfig.currentFrameSizeMsec != 0)) {
52b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    CodecInst sendCodec;
53584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.org    EXPECT_EQ(0, acm->SendCodec(&sendCodec));
54b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    if (isacConfig.currentRateBitPerSec < 0) {
55584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.org      // Register iSAC in adaptive (channel-dependent) mode.
56b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org      sendCodec.rate = -1;
57584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.org      EXPECT_EQ(0, acm->RegisterSendCodec(sendCodec));
58b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    } else {
59b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org      if (isacConfig.currentRateBitPerSec != 0) {
60b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org        sendCodec.rate = isacConfig.currentRateBitPerSec;
61b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org      }
62b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org      if (isacConfig.currentFrameSizeMsec != 0) {
63b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org        sendCodec.pacsize = isacConfig.currentFrameSizeMsec
64b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org            * (sendCodec.plfreq / 1000);
65b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org      }
66584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.org      EXPECT_EQ(0, acm->RegisterSendCodec(sendCodec));
67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
68b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  }
69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
70b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  if (isacConfig.maxRateBitPerSec > 0) {
71584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.org    // Set max rate.
72584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.org    EXPECT_EQ(0, acm->SetISACMaxRate(isacConfig.maxRateBitPerSec));
73b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  }
74b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  if (isacConfig.maxPayloadSizeByte > 0) {
75584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.org    // Set max payload size.
76584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.org    EXPECT_EQ(0, acm->SetISACMaxPayloadSize(isacConfig.maxPayloadSizeByte));
77b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  }
78b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  if ((isacConfig.initFrameSizeInMsec != 0)
79b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org      || (isacConfig.initRateBitPerSec != 0)) {
80584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.org    EXPECT_EQ(0, acm->ConfigISACBandwidthEstimator(
81584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.org        static_cast<uint8_t>(isacConfig.initFrameSizeInMsec),
82584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.org        static_cast<uint16_t>(isacConfig.initRateBitPerSec),
83584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.org        isacConfig.enforceFrameSize));
84b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  }
85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
86b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  return 0;
87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
89c68f88e9287a1e4e07f7739f39574a203b1c7750henrik.lundin@webrtc.orgISACTest::ISACTest(int testMode)
90c68f88e9287a1e4e07f7739f39574a203b1c7750henrik.lundin@webrtc.org    : _acmA(AudioCodingModule::Create(1)),
91c68f88e9287a1e4e07f7739f39574a203b1c7750henrik.lundin@webrtc.org      _acmB(AudioCodingModule::Create(2)),
92c68f88e9287a1e4e07f7739f39574a203b1c7750henrik.lundin@webrtc.org      _testMode(testMode) {}
93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
94367af84454999aced8fe21019adfaa8052c5f45fturaj@webrtc.orgISACTest::~ISACTest() {}
95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
96584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.orgvoid ISACTest::Setup() {
97b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  int codecCntr;
98b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  CodecInst codecParam;
99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
100b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  for (codecCntr = 0; codecCntr < AudioCodingModule::NumberOfCodecs();
101b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org      codecCntr++) {
102584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.org    EXPECT_EQ(0, AudioCodingModule::Codec(codecCntr, &codecParam));
103b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    if (!STR_CASE_CMP(codecParam.plname, "ISAC")
104b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org        && codecParam.plfreq == 16000) {
105b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org      memcpy(&_paramISAC16kHz, &codecParam, sizeof(CodecInst));
106b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org      _idISAC16kHz = codecCntr;
107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
108b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    if (!STR_CASE_CMP(codecParam.plname, "ISAC")
109b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org        && codecParam.plfreq == 32000) {
110b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org      memcpy(&_paramISAC32kHz, &codecParam, sizeof(CodecInst));
111b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org      _idISAC32kHz = codecCntr;
112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
113b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  }
114b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org
115584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.org  // Register both iSAC-wb & iSAC-swb in both sides as receiver codecs.
116584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.org  EXPECT_EQ(0, _acmA->RegisterReceiveCodec(_paramISAC16kHz));
117584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.org  EXPECT_EQ(0, _acmA->RegisterReceiveCodec(_paramISAC32kHz));
118584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.org  EXPECT_EQ(0, _acmB->RegisterReceiveCodec(_paramISAC16kHz));
119584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.org  EXPECT_EQ(0, _acmB->RegisterReceiveCodec(_paramISAC32kHz));
120b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org
121b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  //--- Set A-to-B channel
122367af84454999aced8fe21019adfaa8052c5f45fturaj@webrtc.org  _channel_A2B.reset(new Channel);
123367af84454999aced8fe21019adfaa8052c5f45fturaj@webrtc.org  EXPECT_EQ(0, _acmA->RegisterTransportCallback(_channel_A2B.get()));
124367af84454999aced8fe21019adfaa8052c5f45fturaj@webrtc.org  _channel_A2B->RegisterReceiverACM(_acmB.get());
125b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org
126b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  //--- Set B-to-A channel
127367af84454999aced8fe21019adfaa8052c5f45fturaj@webrtc.org  _channel_B2A.reset(new Channel);
128367af84454999aced8fe21019adfaa8052c5f45fturaj@webrtc.org  EXPECT_EQ(0, _acmB->RegisterTransportCallback(_channel_B2A.get()));
129367af84454999aced8fe21019adfaa8052c5f45fturaj@webrtc.org  _channel_B2A->RegisterReceiverACM(_acmA.get());
130b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org
131b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  file_name_swb_ = webrtc::test::ResourcePath("audio_coding/testfile32kHz",
132b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org                                              "pcm");
133b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org
134584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.org  EXPECT_EQ(0, _acmB->RegisterSendCodec(_paramISAC16kHz));
135584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.org  EXPECT_EQ(0, _acmA->RegisterSendCodec(_paramISAC32kHz));
136b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org
137b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  _inFileA.Open(file_name_swb_, 32000, "rb");
138b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  std::string fileNameA = webrtc::test::OutputPath() + "testisac_a.pcm";
139b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  std::string fileNameB = webrtc::test::OutputPath() + "testisac_b.pcm";
140b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  _outFileA.Open(fileNameA, 32000, "wb");
141b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  _outFileB.Open(fileNameB, 32000, "wb");
142b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org
143b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  while (!_inFileA.EndOfFile()) {
144b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    Run10ms();
145b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  }
146b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  CodecInst receiveCodec;
147584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.org  EXPECT_EQ(0, _acmA->ReceiveCodec(&receiveCodec));
148584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.org  EXPECT_EQ(0, _acmB->ReceiveCodec(&receiveCodec));
149b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org
150b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  _inFileA.Close();
151b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  _outFileA.Close();
152b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  _outFileB.Close();
153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
154b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
155b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.orgvoid ISACTest::Perform() {
156b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  Setup();
157b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org
158b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  int16_t testNr = 0;
159b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  ACMTestISACConfig wbISACConfig;
160b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  ACMTestISACConfig swbISACConfig;
161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
162b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  SetISACConfigDefault(wbISACConfig);
163b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  SetISACConfigDefault(swbISACConfig);
164b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
165b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  wbISACConfig.currentRateBitPerSec = -1;
166b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  swbISACConfig.currentRateBitPerSec = -1;
167b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  testNr++;
168b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  EncodeDecode(testNr, wbISACConfig, swbISACConfig);
169b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
170b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  if (_testMode != 0) {
171b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    SetISACConfigDefault(wbISACConfig);
172b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    SetISACConfigDefault(swbISACConfig);
173b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
174b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    wbISACConfig.currentRateBitPerSec = -1;
175b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    swbISACConfig.currentRateBitPerSec = -1;
176b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    wbISACConfig.initRateBitPerSec = 13000;
177b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    wbISACConfig.initFrameSizeInMsec = 60;
178b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    swbISACConfig.initRateBitPerSec = 20000;
179b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    swbISACConfig.initFrameSizeInMsec = 30;
180b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    testNr++;
181b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EncodeDecode(testNr, wbISACConfig, swbISACConfig);
182b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
183b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    SetISACConfigDefault(wbISACConfig);
184b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    SetISACConfigDefault(swbISACConfig);
185fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org
186b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    wbISACConfig.currentRateBitPerSec = 20000;
187b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    swbISACConfig.currentRateBitPerSec = 48000;
188b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    testNr++;
189b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EncodeDecode(testNr, wbISACConfig, swbISACConfig);
190b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
191b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    wbISACConfig.currentRateBitPerSec = 16000;
192b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    swbISACConfig.currentRateBitPerSec = 30000;
193b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    wbISACConfig.currentFrameSizeMsec = 60;
194b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    testNr++;
195b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EncodeDecode(testNr, wbISACConfig, swbISACConfig);
196b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  }
197b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org
198b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  SetISACConfigDefault(wbISACConfig);
199b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  SetISACConfigDefault(swbISACConfig);
200b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  testNr++;
201b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  EncodeDecode(testNr, wbISACConfig, swbISACConfig);
202b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org
203b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  int user_input;
204b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  if ((_testMode == 0) || (_testMode == 1)) {
205584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.org    swbISACConfig.maxPayloadSizeByte = static_cast<uint16_t>(200);
206584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.org    wbISACConfig.maxPayloadSizeByte = static_cast<uint16_t>(200);
207b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  } else {
208b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    printf("Enter the max payload-size for side A: ");
209b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    CHECK_ERROR(scanf("%d", &user_input));
210b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    swbISACConfig.maxPayloadSizeByte = (uint16_t) user_input;
211b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    printf("Enter the max payload-size for side B: ");
212b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    CHECK_ERROR(scanf("%d", &user_input));
213b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    wbISACConfig.maxPayloadSizeByte = (uint16_t) user_input;
214b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  }
215b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  testNr++;
216b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  EncodeDecode(testNr, wbISACConfig, swbISACConfig);
217b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org
218b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  _acmA->ResetEncoder();
219b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  _acmB->ResetEncoder();
220b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  SetISACConfigDefault(wbISACConfig);
221b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  SetISACConfigDefault(swbISACConfig);
222b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org
223b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  if ((_testMode == 0) || (_testMode == 1)) {
224584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.org    swbISACConfig.maxRateBitPerSec = static_cast<uint32_t>(48000);
225584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.org    wbISACConfig.maxRateBitPerSec = static_cast<uint32_t>(48000);
226b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  } else {
227b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    printf("Enter the max rate for side A: ");
228b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    CHECK_ERROR(scanf("%d", &user_input));
229b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    swbISACConfig.maxRateBitPerSec = (uint32_t) user_input;
230b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    printf("Enter the max rate for side B: ");
231b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    CHECK_ERROR(scanf("%d", &user_input));
232b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    wbISACConfig.maxRateBitPerSec = (uint32_t) user_input;
233b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  }
234b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org
235b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  testNr++;
236b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  EncodeDecode(testNr, wbISACConfig, swbISACConfig);
237b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org
238b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  testNr++;
239b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  if (_testMode == 0) {
240b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    SwitchingSamplingRate(testNr, 4);
241b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  } else {
242b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    SwitchingSamplingRate(testNr, 80);
243b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  }
244b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
245b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
246ad584b66a1dd9a7983f6dce047beb5a539a8ca17andresp@webrtc.orgvoid ISACTest::Run10ms() {
247ad584b66a1dd9a7983f6dce047beb5a539a8ca17andresp@webrtc.org  AudioFrame audioFrame;
248ad584b66a1dd9a7983f6dce047beb5a539a8ca17andresp@webrtc.org  EXPECT_GT(_inFileA.Read10MsData(audioFrame), 0);
249ad584b66a1dd9a7983f6dce047beb5a539a8ca17andresp@webrtc.org  EXPECT_EQ(0, _acmA->Add10MsData(audioFrame));
250ad584b66a1dd9a7983f6dce047beb5a539a8ca17andresp@webrtc.org  EXPECT_EQ(0, _acmB->Add10MsData(audioFrame));
251ad584b66a1dd9a7983f6dce047beb5a539a8ca17andresp@webrtc.org  EXPECT_GT(_acmA->Process(), -1);
252ad584b66a1dd9a7983f6dce047beb5a539a8ca17andresp@webrtc.org  EXPECT_GT(_acmB->Process(), -1);
253ad584b66a1dd9a7983f6dce047beb5a539a8ca17andresp@webrtc.org  EXPECT_EQ(0, _acmA->PlayoutData10Ms(32000, &audioFrame));
254ad584b66a1dd9a7983f6dce047beb5a539a8ca17andresp@webrtc.org  _outFileA.Write10MsData(audioFrame);
255ad584b66a1dd9a7983f6dce047beb5a539a8ca17andresp@webrtc.org  EXPECT_EQ(0, _acmB->PlayoutData10Ms(32000, &audioFrame));
256ad584b66a1dd9a7983f6dce047beb5a539a8ca17andresp@webrtc.org  _outFileB.Write10MsData(audioFrame);
257ad584b66a1dd9a7983f6dce047beb5a539a8ca17andresp@webrtc.org}
258ad584b66a1dd9a7983f6dce047beb5a539a8ca17andresp@webrtc.org
259b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.orgvoid ISACTest::EncodeDecode(int testNr, ACMTestISACConfig& wbISACConfig,
260b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org                            ACMTestISACConfig& swbISACConfig) {
261b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  // Files in Side A and B
262b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  _inFileA.Open(file_name_swb_, 32000, "rb", true);
263b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  _inFileB.Open(file_name_swb_, 32000, "rb", true);
264b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org
265b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  std::string file_name_out;
266b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  std::stringstream file_stream_a;
267b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  std::stringstream file_stream_b;
268b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  file_stream_a << webrtc::test::OutputPath();
269b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  file_stream_b << webrtc::test::OutputPath();
270584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.org  file_stream_a << "out_iSACTest_A_" << testNr << ".pcm";
271584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.org  file_stream_b << "out_iSACTest_B_" << testNr << ".pcm";
272b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  file_name_out = file_stream_a.str();
273b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  _outFileA.Open(file_name_out, 32000, "wb");
274b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  file_name_out = file_stream_b.str();
275b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  _outFileB.Open(file_name_out, 32000, "wb");
276b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org
277584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.org  EXPECT_EQ(0, _acmA->RegisterSendCodec(_paramISAC16kHz));
278584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.org  EXPECT_EQ(0, _acmA->RegisterSendCodec(_paramISAC32kHz));
279584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.org  EXPECT_EQ(0, _acmB->RegisterSendCodec(_paramISAC32kHz));
280584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.org  EXPECT_EQ(0, _acmB->RegisterSendCodec(_paramISAC16kHz));
281b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org
282584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.org  // Side A is sending super-wideband, and side B is sending wideband.
283367af84454999aced8fe21019adfaa8052c5f45fturaj@webrtc.org  SetISAConfig(swbISACConfig, _acmA.get(), _testMode);
284367af84454999aced8fe21019adfaa8052c5f45fturaj@webrtc.org  SetISAConfig(wbISACConfig, _acmB.get(), _testMode);
285b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org
286b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  bool adaptiveMode = false;
287b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  if ((swbISACConfig.currentRateBitPerSec == -1)
288b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org      || (wbISACConfig.currentRateBitPerSec == -1)) {
289b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    adaptiveMode = true;
290b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  }
291b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  _myTimer.Reset();
292b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  _channel_A2B->ResetStats();
293b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  _channel_B2A->ResetStats();
294b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org
295b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  char currentTime[500];
296b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  CodecInst sendCodec;
297b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  EventWrapper* myEvent = EventWrapper::Create();
298584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.org  EXPECT_TRUE(myEvent->StartTimer(true, 10));
299b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  while (!(_inFileA.EndOfFile() || _inFileA.Rewinded())) {
300b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    Run10ms();
301b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    _myTimer.Tick10ms();
302b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    _myTimer.CurrentTimeHMS(currentTime);
303b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org
304b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    if ((adaptiveMode) && (_testMode != 0)) {
305b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org      myEvent->Wait(5000);
306584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.org      EXPECT_EQ(0, _acmA->SendCodec(&sendCodec));
307584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.org      EXPECT_EQ(0, _acmB->SendCodec(&sendCodec));
308b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
309b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  }
310b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
311b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  if (_testMode != 0) {
312b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    printf("\n\nSide A statistics\n\n");
313b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    _channel_A2B->PrintStats(_paramISAC32kHz);
314b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
315b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    printf("\n\nSide B statistics\n\n");
316b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    _channel_B2A->PrintStats(_paramISAC16kHz);
317b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  }
318b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
319ad584b66a1dd9a7983f6dce047beb5a539a8ca17andresp@webrtc.org  _channel_A2B->ResetStats();
320ad584b66a1dd9a7983f6dce047beb5a539a8ca17andresp@webrtc.org  _channel_B2A->ResetStats();
321ad584b66a1dd9a7983f6dce047beb5a539a8ca17andresp@webrtc.org
322b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  _outFileA.Close();
323b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  _outFileB.Close();
324b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  _inFileA.Close();
325b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  _inFileB.Close();
326b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
327b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
328b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.orgvoid ISACTest::SwitchingSamplingRate(int testNr, int maxSampRateChange) {
329b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  // Files in Side A
330b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  _inFileA.Open(file_name_swb_, 32000, "rb");
331b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  _inFileB.Open(file_name_swb_, 32000, "rb");
332b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org
333b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  std::string file_name_out;
334b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  std::stringstream file_stream_a;
335b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  std::stringstream file_stream_b;
336b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  file_stream_a << webrtc::test::OutputPath();
337b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  file_stream_b << webrtc::test::OutputPath();
338584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.org  file_stream_a << "out_iSACTest_A_" << testNr << ".pcm";
339584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.org  file_stream_b << "out_iSACTest_B_" << testNr << ".pcm";
340b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  file_name_out = file_stream_a.str();
341b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  _outFileA.Open(file_name_out, 32000, "wb");
342b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  file_name_out = file_stream_b.str();
343b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  _outFileB.Open(file_name_out, 32000, "wb");
344b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org
345584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.org  // Start with side A sending super-wideband and side B seding wideband.
346584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.org  // Toggle sending wideband/super-wideband in this test.
347584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.org  EXPECT_EQ(0, _acmA->RegisterSendCodec(_paramISAC32kHz));
348584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.org  EXPECT_EQ(0, _acmB->RegisterSendCodec(_paramISAC16kHz));
349b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org
350b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  int numSendCodecChanged = 0;
351b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  _myTimer.Reset();
352b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  char currentTime[50];
353b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  while (numSendCodecChanged < (maxSampRateChange << 1)) {
354b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    Run10ms();
355b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    _myTimer.Tick10ms();
356b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    _myTimer.CurrentTimeHMS(currentTime);
357b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    if (_testMode == 2)
358b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org      printf("\r%s", currentTime);
359b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    if (_inFileA.EndOfFile()) {
360b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org      if (_inFileA.SamplingFrequency() == 16000) {
361584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.org        // Switch side A to send super-wideband.
362b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org        _inFileA.Close();
363b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org        _inFileA.Open(file_name_swb_, 32000, "rb");
364584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.org        EXPECT_EQ(0, _acmA->RegisterSendCodec(_paramISAC32kHz));
365b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org      } else {
366584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.org        // Switch side A to send wideband.
367b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org        _inFileA.Close();
368b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org        _inFileA.Open(file_name_swb_, 32000, "rb");
369584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.org        EXPECT_EQ(0, _acmA->RegisterSendCodec(_paramISAC16kHz));
370b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org      }
371b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org      numSendCodecChanged++;
372b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
373b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
374b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    if (_inFileB.EndOfFile()) {
375b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org      if (_inFileB.SamplingFrequency() == 16000) {
376584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.org        // Switch side B to send super-wideband.
377b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org        _inFileB.Close();
378b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org        _inFileB.Open(file_name_swb_, 32000, "rb");
379584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.org        EXPECT_EQ(0, _acmB->RegisterSendCodec(_paramISAC32kHz));
380b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org      } else {
381584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.org        // Switch side B to send wideband.
382b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org        _inFileB.Close();
383b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org        _inFileB.Open(file_name_swb_, 32000, "rb");
384584b6885bd8cf5a64d18f9d50b4cdc4415651d78tina.legrand@webrtc.org        EXPECT_EQ(0, _acmB->RegisterSendCodec(_paramISAC16kHz));
385b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org      }
386b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org      numSendCodecChanged++;
387b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
388b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  }
389b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  _outFileA.Close();
390b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  _outFileB.Close();
391b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  _inFileA.Close();
392b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  _inFileB.Close();
393b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
394b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
395b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org}  // namespace webrtc
396