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