/*
 *  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/neteq/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
