// Copyright 2016 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "lib/media/audio/perceived_level.h"

#include <algorithm>
#include <cmath>

#include <fuchsia/media/cpp/fidl.h>

#include "lib/fxl/logging.h"

namespace media {
namespace {

static constexpr float kUnityGainDb = 0.0f;
static constexpr float kMinLevelGainDb = -60.0f;

}  // namespace

// static
float PerceivedLevel::GainToLevel(float gain_db) {
  if (gain_db <= kMinLevelGainDb) {
    return 0.0f;
  }

  if (gain_db >= kUnityGainDb) {
    return 1.0f;
  }

  return 1.0f - gain_db / kMinLevelGainDb;
}

// static
float PerceivedLevel::LevelToGain(float level) {
  if (level <= 0.0f) {
    return fuchsia::media::MUTED_GAIN_DB;
  }

  if (level >= 1.0f) {
    return kUnityGainDb;
  }

  return (1.0f - level) * kMinLevelGainDb;
}

// static
int PerceivedLevel::GainToLevel(float gain_db, int max_level) {
  FXL_DCHECK(max_level > 0);

  if (gain_db <= kMinLevelGainDb) {
    return 0;
  }

  if (gain_db >= kUnityGainDb) {
    return max_level;
  }

  return static_cast<int>(std::round(max_level * GainToLevel(gain_db)));
}

// static
float PerceivedLevel::LevelToGain(int level, int max_level) {
  FXL_DCHECK(max_level > 0);

  if (level <= 0) {
    return fuchsia::media::MUTED_GAIN_DB;
  }

  if (level >= max_level) {
    return kUnityGainDb;
  }

  return LevelToGain(static_cast<float>(level) / max_level);
}

}  // namespace media
