/*
 *  Copyright (c) 2012 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/tools/agc/test_utils.h"

#include <cmath>

#include <algorithm>

#include "webrtc/modules/include/module_common_types.h"

namespace webrtc {

float MicLevel2Gain(int gain_range_db, int level) {
  return (level - 127.0f) / 128.0f * gain_range_db / 2;
}

float Db2Linear(float db) {
  return powf(10.0f, db / 20.0f);
}

void ApplyGainLinear(float gain, float last_gain, AudioFrame* frame) {
  const size_t frame_length =
      frame->samples_per_channel_ * frame->num_channels_;
  // Smooth the transition between gain levels across the frame.
  float smoothed_gain = last_gain;
  float gain_step = (gain - last_gain) / (frame_length - 1);
  for (size_t i = 0; i < frame_length; ++i) {
    smoothed_gain += gain_step;
    float sample = std::floor(frame->data_[i] * smoothed_gain + 0.5);
    sample = std::max(std::min(32767.0f, sample), -32768.0f);
    frame->data_[i] = static_cast<int16_t>(sample);
  }
}

void ApplyGain(float gain_db, float last_gain_db, AudioFrame* frame) {
  ApplyGainLinear(Db2Linear(gain_db), Db2Linear(last_gain_db), frame);
}

void SimulateMic(int gain_range_db, int mic_level, int last_mic_level,
                 AudioFrame* frame) {
  assert(mic_level >= 0 && mic_level <= 255);
  assert(last_mic_level >= 0 && last_mic_level <= 255);
  ApplyGain(MicLevel2Gain(gain_range_db, mic_level),
            MicLevel2Gain(gain_range_db, last_mic_level),
            frame);
}

void SimulateMic(int gain_map[255], int mic_level, int last_mic_level,
                 AudioFrame* frame) {
  assert(mic_level >= 0 && mic_level <= 255);
  assert(last_mic_level >= 0 && last_mic_level <= 255);
  ApplyGain(gain_map[mic_level], gain_map[last_mic_level], frame);
}

}  // namespace webrtc

