/*
 *  Copyright (c) 2014 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_processing/intelligibility/intelligibility_utils.h"

#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <limits>

#include "rtc_base/numerics/safe_minmax.h"

namespace webrtc {

namespace intelligibility {

namespace {

const float kMinFactor = 0.01f;
const float kMaxFactor = 100.f;

// Return |current| changed towards |target|, with the relative change being at
// most |limit|.
float UpdateFactor(float target, float current, float limit) {
  const float gain = target / (current + std::numeric_limits<float>::epsilon());
  const float clamped_gain = rtc::SafeClamp(gain, 1 - limit, 1 + limit);
  return rtc::SafeClamp(current * clamped_gain, kMinFactor, kMaxFactor);
}

}  // namespace

template <typename T>
PowerEstimator<T>::PowerEstimator(size_t num_freqs, float decay)
    : power_(num_freqs, 0.f), decay_(decay) {}

template <typename T>
void PowerEstimator<T>::Step(const T* data) {
  for (size_t i = 0; i < power_.size(); ++i) {
    power_[i] = decay_ * power_[i] +
                (1.f - decay_) * std::abs(data[i]) * std::abs(data[i]);
  }
}

template class PowerEstimator<float>;
template class PowerEstimator<std::complex<float>>;

GainApplier::GainApplier(size_t freqs, float relative_change_limit)
    : num_freqs_(freqs),
      relative_change_limit_(relative_change_limit),
      target_(freqs, 1.f),
      current_(freqs, 1.f) {}

GainApplier::~GainApplier() {}

void GainApplier::Apply(const std::complex<float>* in_block,
                        std::complex<float>* out_block) {
  for (size_t i = 0; i < num_freqs_; ++i) {
    current_[i] = UpdateFactor(target_[i], current_[i], relative_change_limit_);
    out_block[i] = sqrtf(fabsf(current_[i])) * in_block[i];
  }
}

DelayBuffer::DelayBuffer(size_t delay, size_t num_channels)
    : buffer_(num_channels, std::vector<float>(delay, 0.f)), read_index_(0u) {}

DelayBuffer::~DelayBuffer() {}

void DelayBuffer::Delay(float* const* data, size_t length) {
  size_t sample_index = read_index_;
  for (size_t i = 0u; i < buffer_.size(); ++i) {
    sample_index = read_index_;
    for (size_t j = 0u; j < length; ++j) {
      float swap = data[i][j];
      data[i][j] = buffer_[i][sample_index];
      buffer_[i][sample_index] = swap;
      if (++sample_index == buffer_.size()) {
        sample_index = 0u;
      }
    }
  }
  read_index_ = sample_index;
}

}  // namespace intelligibility

}  // namespace webrtc
