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