/*
 *  Copyright (c) 2018 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/agc2/agc2_common.h"

#include <stdio.h>

#include <string>

#include "system_wrappers/include/field_trial.h"

namespace webrtc {

float GetInitialSaturationMarginDb() {
  constexpr char kForceInitialSaturationMarginFieldTrial[] =
      "WebRTC-Audio-Agc2ForceInitialSaturationMargin";

  const bool use_forced_initial_saturation_margin =
      webrtc::field_trial::IsEnabled(kForceInitialSaturationMarginFieldTrial);
  if (use_forced_initial_saturation_margin) {
    const std::string field_trial_string = webrtc::field_trial::FindFullName(
        kForceInitialSaturationMarginFieldTrial);
    float margin_db = -1;
    if (sscanf(field_trial_string.c_str(), "Enabled-%f", &margin_db) == 1 &&
        margin_db >= 12.f && margin_db <= 25.f) {
      return margin_db;
    }
  }
  constexpr float kDefaultInitialSaturationMarginDb = 20.f;
  return kDefaultInitialSaturationMarginDb;
}

float GetExtraSaturationMarginOffsetDb() {
  constexpr char kForceExtraSaturationMarginFieldTrial[] =
      "WebRTC-Audio-Agc2ForceExtraSaturationMargin";

  const bool use_forced_extra_saturation_margin =
      webrtc::field_trial::IsEnabled(kForceExtraSaturationMarginFieldTrial);
  if (use_forced_extra_saturation_margin) {
    const std::string field_trial_string = webrtc::field_trial::FindFullName(
        kForceExtraSaturationMarginFieldTrial);
    float margin_db = -1;
    if (sscanf(field_trial_string.c_str(), "Enabled-%f", &margin_db) == 1 &&
        margin_db >= 0.f && margin_db <= 10.f) {
      return margin_db;
    }
  }
  constexpr float kDefaultExtraSaturationMarginDb = 2.f;
  return kDefaultExtraSaturationMarginDb;
}
}  // namespace webrtc
