/*
 *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#include "webrtc/modules/audio_coding/neteq4/tools/audio_loop.h"

#include <assert.h>
#include <stdio.h>
#include <string.h>

namespace webrtc {
namespace test {

bool AudioLoop::Init(const std::string file_name,
                     size_t max_loop_length_samples,
                     size_t block_length_samples) {
  FILE* fp = fopen(file_name.c_str(), "rb");
  if (!fp) return false;

  audio_array_.reset(new int16_t[max_loop_length_samples +
                                 block_length_samples]);
  size_t samples_read = fread(audio_array_.get(), sizeof(int16_t),
                              max_loop_length_samples, fp);
  fclose(fp);

  // Block length must be shorter than the loop length.
  if (block_length_samples > samples_read) return false;

  // Add an extra block length of samples to the end of the array, starting
  // over again from the beginning of the array. This is done to simplify
  // the reading process when reading over the end of the loop.
  memcpy(&audio_array_[samples_read], audio_array_.get(),
         block_length_samples * sizeof(int16_t));

  loop_length_samples_ = samples_read;
  block_length_samples_ = block_length_samples;
  return true;
}

const int16_t* AudioLoop::GetNextBlock() {
  // Check that the AudioLoop is initialized.
  if (block_length_samples_ == 0) return NULL;

  const int16_t* output_ptr = &audio_array_[next_index_];
  next_index_ = (next_index_ + block_length_samples_) % loop_length_samples_;
  return output_ptr;
}


}  // namespace test
}  // namespace webrtc
