/*
 *  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 "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;
  next_index_ = 0;
  return true;
}

rtc::ArrayView<const int16_t> AudioLoop::GetNextBlock() {
  // Check that the AudioLoop is initialized.
  if (block_length_samples_ == 0)
    return rtc::ArrayView<const int16_t>();

  const int16_t* output_ptr = &audio_array_[next_index_];
  next_index_ = (next_index_ + block_length_samples_) % loop_length_samples_;
  return rtc::ArrayView<const int16_t>(output_ptr, block_length_samples_);
}


}  // namespace test
}  // namespace webrtc
