179d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org/* 279d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 379d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org * 479d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org * Use of this source code is governed by a BSD-style license 579d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org * that can be found in the LICENSE file in the root of the source 679d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org * tree. An additional intellectual property rights grant can be found 779d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org * in the file PATENTS. All contributing project authors may 879d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org * be found in the AUTHORS file in the root of the source tree. 979d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org */ 1079d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org 11e5abc854f3dc47de16067c2a41476c39b7626722henrik.lundin@webrtc.org#include "webrtc/modules/audio_coding/neteq/tools/audio_loop.h" 1279d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org 1379d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org#include <assert.h> 1479d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org#include <stdio.h> 1579d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org#include <string.h> 1679d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org 1779d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.orgnamespace webrtc { 1879d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.orgnamespace test { 1979d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org 2079d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.orgbool AudioLoop::Init(const std::string file_name, 2179d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org size_t max_loop_length_samples, 2279d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org size_t block_length_samples) { 2379d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org FILE* fp = fopen(file_name.c_str(), "rb"); 2479d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org if (!fp) return false; 2579d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org 2679d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org audio_array_.reset(new int16_t[max_loop_length_samples + 2779d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org block_length_samples]); 2879d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org size_t samples_read = fread(audio_array_.get(), sizeof(int16_t), 2979d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org max_loop_length_samples, fp); 3079d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org fclose(fp); 3179d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org 3279d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org // Block length must be shorter than the loop length. 3379d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org if (block_length_samples > samples_read) return false; 3479d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org 3579d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org // Add an extra block length of samples to the end of the array, starting 3679d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org // over again from the beginning of the array. This is done to simplify 3779d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org // the reading process when reading over the end of the loop. 3879d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org memcpy(&audio_array_[samples_read], audio_array_.get(), 3979d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org block_length_samples * sizeof(int16_t)); 4079d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org 4179d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org loop_length_samples_ = samples_read; 4279d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org block_length_samples_ = block_length_samples; 4379d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org return true; 4479d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org} 4579d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org 4679d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.orgconst int16_t* AudioLoop::GetNextBlock() { 4779d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org // Check that the AudioLoop is initialized. 4879d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org if (block_length_samples_ == 0) return NULL; 4979d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org 5079d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org const int16_t* output_ptr = &audio_array_[next_index_]; 5179d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org next_index_ = (next_index_ + block_length_samples_) % loop_length_samples_; 5279d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org return output_ptr; 5379d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org} 5479d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org 5579d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org 5679d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org} // namespace test 5779d335569a55db7af56a77c712928522d147dbb9henrik.lundin@webrtc.org} // namespace webrtc 58