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
11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <stdio.h>
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <string.h>
13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <math.h>
15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include "common_types.h"
17b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include "SpatialAudio.h"
18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include "trace.h"
19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include "utility.h"
20705b38db77124a0d9622ca34bfbfcbf8e9cbee3bpbos@webrtc.org#include "webrtc/test/testsupport/fileutils.h"
21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc {
23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define NUM_PANN_COEFFS 10
25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
265e3379e47b802f3aaef17b9b34308e057bf39675andrew@webrtc.orgSpatialAudio::SpatialAudio(int testMode)
275e3379e47b802f3aaef17b9b34308e057bf39675andrew@webrtc.org    : _acmLeft(AudioCodingModule::Create(1)),
285e3379e47b802f3aaef17b9b34308e057bf39675andrew@webrtc.org      _acmRight(AudioCodingModule::Create(2)),
295e3379e47b802f3aaef17b9b34308e057bf39675andrew@webrtc.org      _acmReceiver(AudioCodingModule::Create(3)),
305e3379e47b802f3aaef17b9b34308e057bf39675andrew@webrtc.org      _testMode(testMode) {
31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
33b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.orgSpatialAudio::~SpatialAudio() {
34b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  delete _channel;
35b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  _inFile.Close();
36b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  _outFile.Close();
37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
39b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.orgint16_t SpatialAudio::Setup() {
40b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  _channel = new Channel;
41b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org
42b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  // Register callback for the sender side.
43b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  CHECK_ERROR(_acmLeft->RegisterTransportCallback(_channel));
44b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  CHECK_ERROR(_acmRight->RegisterTransportCallback(_channel));
45b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  // Register the receiver ACM in channel
465e3379e47b802f3aaef17b9b34308e057bf39675andrew@webrtc.org  _channel->RegisterReceiverACM(_acmReceiver.get());
47b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org
48b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  uint16_t sampFreqHz = 32000;
49b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org
50b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  const std::string file_name = webrtc::test::ResourcePath(
51b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org      "audio_coding/testfile32kHz", "pcm");
52b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  _inFile.Open(file_name, sampFreqHz, "rb", false);
53b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org
54b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  std::string output_file = webrtc::test::OutputPath()
55b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org      + "out_spatial_autotest.pcm";
56b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  if (_testMode == 1) {
57b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    output_file = webrtc::test::OutputPath() + "testspatial_out.pcm";
58b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    printf("\n");
59b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    printf("Enter the output file [%s]: ", output_file.c_str());
60b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    PCMFile::ChooseFile(&output_file, MAX_FILE_NAME_LENGTH_BYTE, &sampFreqHz);
61b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  } else {
62b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    output_file = webrtc::test::OutputPath() + "testspatial_out.pcm";
63b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  }
64b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  _outFile.Open(output_file, sampFreqHz, "wb", false);
65b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  _outFile.SaveStereo(true);
66b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org
67b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  // Register all available codes as receiving codecs.
68b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  CodecInst codecInst;
69b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  int status;
70b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  uint8_t num_encoders = _acmReceiver->NumberOfCodecs();
71b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  // Register all available codes as receiving codecs once more.
72b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  for (uint8_t n = 0; n < num_encoders; n++) {
73b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    status = _acmReceiver->Codec(n, &codecInst);
74b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    if (status < 0) {
75b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org      printf("Error in Codec(), no matching codec found");
76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
77b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    status = _acmReceiver->RegisterReceiveCodec(codecInst);
78b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    if (status < 0) {
79b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org      printf("Error in RegisterReceiveCodec() for payload type %d",
80b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org             codecInst.pltype);
81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
82b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  }
83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
84b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  return 0;
85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
87b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.orgvoid SpatialAudio::Perform() {
88b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  if (_testMode == 0) {
89b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    printf("Running SpatialAudio Test");
90b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    WEBRTC_TRACE(webrtc::kTraceStateInfo, webrtc::kTraceAudioCoding, -1,
91b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org                 "---------- SpatialAudio ----------");
92b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  }
93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
94b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  Setup();
95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
96b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  CodecInst codecInst;
97b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  _acmLeft->Codec((uint8_t) 1, &codecInst);
98b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  CHECK_ERROR(_acmLeft->RegisterSendCodec(codecInst));
99b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  EncodeDecode();
100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
101b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  int16_t pannCntr = 0;
102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
103b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  double leftPanning[NUM_PANN_COEFFS] = { 1.00, 0.95, 0.90, 0.85, 0.80, 0.75,
104b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org      0.70, 0.60, 0.55, 0.50 };
105b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  double rightPanning[NUM_PANN_COEFFS] = { 0.50, 0.55, 0.60, 0.70, 0.75, 0.80,
106b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org      0.85, 0.90, 0.95, 1.00 };
107b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org
108b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  while ((pannCntr + 1) < NUM_PANN_COEFFS) {
109b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    _acmLeft->Codec((uint8_t) 0, &codecInst);
110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    codecInst.pacsize = 480;
111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    CHECK_ERROR(_acmLeft->RegisterSendCodec(codecInst));
112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    CHECK_ERROR(_acmRight->RegisterSendCodec(codecInst));
113b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org
114b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    EncodeDecode(leftPanning[pannCntr], rightPanning[pannCntr]);
115b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    pannCntr++;
116b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org
117b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    // Change codec
118b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    _acmLeft->Codec((uint8_t) 3, &codecInst);
119b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    codecInst.pacsize = 320;
120b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    CHECK_ERROR(_acmLeft->RegisterSendCodec(codecInst));
121b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    CHECK_ERROR(_acmRight->RegisterSendCodec(codecInst));
122b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org
123b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    EncodeDecode(leftPanning[pannCntr], rightPanning[pannCntr]);
124b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    pannCntr++;
125b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    if (_testMode == 0) {
126b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org      printf(".");
127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
128b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  }
129b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org
130b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  _acmLeft->Codec((uint8_t) 4, &codecInst);
131b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  CHECK_ERROR(_acmLeft->RegisterSendCodec(codecInst));
132b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  EncodeDecode();
133b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org
134b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  _acmLeft->Codec((uint8_t) 0, &codecInst);
135b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  codecInst.pacsize = 480;
136b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  CHECK_ERROR(_acmLeft->RegisterSendCodec(codecInst));
137b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  CHECK_ERROR(_acmRight->RegisterSendCodec(codecInst));
138b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  pannCntr = NUM_PANN_COEFFS - 1;
139b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  while (pannCntr >= 0) {
140b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    EncodeDecode(leftPanning[pannCntr], rightPanning[pannCntr]);
141b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    pannCntr--;
142b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    if (_testMode == 0) {
143b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org      printf(".");
144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
145b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  }
146b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  if (_testMode == 0) {
147b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    printf("Done!\n");
148b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  }
149b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
150b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
151b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.orgvoid SpatialAudio::EncodeDecode(const double leftPanning,
152b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org                                const double rightPanning) {
153b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  AudioFrame audioFrame;
154b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  int32_t outFileSampFreq = _outFile.SamplingFrequency();
155b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org
156b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  const double rightToLeftRatio = rightPanning / leftPanning;
157b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org
158b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  _channel->SetIsStereo(true);
159b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org
160b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  while (!_inFile.EndOfFile()) {
161b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    _inFile.Read10MsData(audioFrame);
162b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    for (int n = 0; n < audioFrame.samples_per_channel_; n++) {
163b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org      audioFrame.data_[n] = (int16_t) floor(
164b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org          audioFrame.data_[n] * leftPanning + 0.5);
165b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    }
166b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    CHECK_ERROR(_acmLeft->Add10MsData(audioFrame));
167b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org
168b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    for (int n = 0; n < audioFrame.samples_per_channel_; n++) {
169b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org      audioFrame.data_[n] = (int16_t) floor(
170b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org          audioFrame.data_[n] * rightToLeftRatio + 0.5);
171b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    }
172b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    CHECK_ERROR(_acmRight->Add10MsData(audioFrame));
173b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org
174b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    CHECK_ERROR(_acmLeft->Process());
175b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    CHECK_ERROR(_acmRight->Process());
176b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org
177b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    CHECK_ERROR(_acmReceiver->PlayoutData10Ms(outFileSampFreq, &audioFrame));
178b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    _outFile.Write10MsData(audioFrame);
179b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  }
180b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  _inFile.Rewind();
181b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
182b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
183b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.orgvoid SpatialAudio::EncodeDecode() {
184b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  AudioFrame audioFrame;
185b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  int32_t outFileSampFreq = _outFile.SamplingFrequency();
186b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
187b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  _channel->SetIsStereo(false);
188b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
189b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  while (!_inFile.EndOfFile()) {
190b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    _inFile.Read10MsData(audioFrame);
191b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    CHECK_ERROR(_acmLeft->Add10MsData(audioFrame));
192b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
193b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    CHECK_ERROR(_acmLeft->Process());
194b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
195b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    CHECK_ERROR(_acmReceiver->PlayoutData10Ms(outFileSampFreq, &audioFrame));
196b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org    _outFile.Write10MsData(audioFrame);
197b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  }
198b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org  _inFile.Rewind();
199b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
200b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
201b31332e75f97ef3d41d5393772be11f24b0f174ftina.legrand@webrtc.org}  // namespace webrtc
202