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

// MSVC++ requires this to be set before any other includes to get M_PI.
#define _USE_MATH_DEFINES

#include "webrtc/common_audio/resampler/sinusoidal_linear_chirp_source.h"

#include <cmath>

namespace webrtc {

SinusoidalLinearChirpSource::SinusoidalLinearChirpSource(int sample_rate,
  int samples, double max_frequency, double delay_samples)
    : sample_rate_(sample_rate),
      total_samples_(samples),
      max_frequency_(max_frequency),
      current_index_(0),
      delay_samples_(delay_samples) {
  // Chirp rate.
  double duration = static_cast<double>(total_samples_) / sample_rate_;
  k_ = (max_frequency_ - kMinFrequency) / duration;
}

void SinusoidalLinearChirpSource::Run(float* destination, int frames) {
  for (int i = 0; i < frames; ++i, ++current_index_) {
    // Filter out frequencies higher than Nyquist.
    if (Frequency(current_index_) > 0.5 * sample_rate_) {
      destination[i] = 0;
    } else {
      // Calculate time in seconds.
      double t = (static_cast<double>(current_index_) - delay_samples_) /
          sample_rate_;
      if (t < 0) {
        destination[i] = 0;
      } else {
        // Sinusoidal linear chirp.
        destination[i] =
            sin(2 * M_PI * (kMinFrequency * t + (k_ / 2) * t * t));
      }
    }
  }
}

double SinusoidalLinearChirpSource::Frequency(int position) {
  return kMinFrequency + (position - delay_samples_) *
      (max_frequency_ - kMinFrequency) / total_samples_;
}

}  // namespace webrtc
