1 /* 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #include "webrtc/modules/audio_coding/neteq/tools/input_audio_file.h" 12 13 namespace webrtc { 14 namespace test { 15 16 InputAudioFile::InputAudioFile(const std::string file_name) { 17 fp_ = fopen(file_name.c_str(), "rb"); 18 } 19 20 InputAudioFile::~InputAudioFile() { fclose(fp_); } 21 22 bool InputAudioFile::Read(size_t samples, int16_t* destination) { 23 if (!fp_) { 24 return false; 25 } 26 size_t samples_read = fread(destination, sizeof(int16_t), samples, fp_); 27 if (samples_read < samples) { 28 // Rewind and read the missing samples. 29 rewind(fp_); 30 size_t missing_samples = samples - samples_read; 31 if (fread(destination, sizeof(int16_t), missing_samples, fp_) < 32 missing_samples) { 33 // Could not read enough even after rewinding the file. 34 return false; 35 } 36 } 37 return true; 38 } 39 40 void InputAudioFile::DuplicateInterleaved(const int16_t* source, size_t samples, 41 size_t channels, 42 int16_t* destination) { 43 // Start from the end of |source| and |destination|, and work towards the 44 // beginning. This is to allow in-place interleaving of the same array (i.e., 45 // |source| and |destination| are the same array). 46 for (int i = static_cast<int>(samples - 1); i >= 0; --i) { 47 for (int j = static_cast<int>(channels - 1); j >= 0; --j) { 48 destination[i * channels + j] = source[i]; 49 } 50 } 51 } 52 53 } // namespace test 54 } // namespace webrtc 55