blob: 5041469c50de66db96fac75d5fd87879fade525d [file] [log] [blame]
// Copyright 2022 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 "src/media/audio/lib/processing/gain.h"
#include <vector>
#include <gtest/gtest.h>
namespace media_audio {
namespace {
TEST(GainTest, ApplyGainSilent) {
const std::vector<float> values = {-0.5f, 0.2f, 1.0f, 2.0f};
const std::vector<float> scales = {0.0f, 0.5f, 1.0f, 1.5f};
for (const float value : values) {
for (const float scale : scales) {
EXPECT_FLOAT_EQ(ApplyGain<GainType::kSilent>(value, scale), 0.0f);
}
}
}
TEST(GainTest, ApplyGainNonUnity) {
const std::vector<float> values = {-1.0f, -0.25f, 0.5f, 1.5f};
const std::vector<float> scales = {0.0f, 0.5f, 1.0f, 1.5f};
for (const float value : values) {
for (const float scale : scales) {
EXPECT_FLOAT_EQ(ApplyGain<GainType::kNonUnity>(value, scale), value * scale);
}
}
}
TEST(GainTest, ApplyGainUnity) {
const std::vector<float> values = {-0.1f, 0.2f, -0.3f, 1.0f};
const std::vector<float> scales = {0.0f, 0.5f, 1.0f, 0.5f};
for (const float value : values) {
for (const float scale : scales) {
EXPECT_FLOAT_EQ(ApplyGain<GainType::kUnity>(value, scale), value);
}
}
}
TEST(GainTest, ApplyGainRamping) {
const std::vector<float> values = {-0.5f, 0.2f, 1.0f, 2.0f};
const std::vector<float> scales = {0.0f, 0.5f, 1.0f, 1.5f};
for (const float value : values) {
for (const float scale : scales) {
EXPECT_FLOAT_EQ(ApplyGain<GainType::kRamping>(value, scale), value * scale);
}
}
}
TEST(GainTest, DbToScale) {
const float gain_db = -6.0f;
const float gain_scale = 0.5f;
const float epsilon = 5e-2f;
EXPECT_NEAR(DbToScale(gain_db), gain_scale, epsilon);
EXPECT_NEAR(ScaleToDb(gain_scale), gain_db, epsilon);
// Verify back and forth conversions.
EXPECT_FLOAT_EQ(DbToScale(ScaleToDb(gain_scale)), gain_scale);
EXPECT_FLOAT_EQ(ScaleToDb(DbToScale(gain_db)), gain_db);
}
TEST(GainTest, DbToScaleMinGain) {
// Verify that the values are clamped at minimum gain.
EXPECT_FLOAT_EQ(DbToScale(kMinGainDb), 0.0f);
EXPECT_FLOAT_EQ(DbToScale(kMinGainDb - 12.0f), 0.0f);
EXPECT_FLOAT_EQ(ScaleToDb(kMinGainScale), kMinGainDb);
EXPECT_FLOAT_EQ(ScaleToDb(0.0f), kMinGainDb);
EXPECT_FLOAT_EQ(ScaleToDb(-1.0f), kMinGainDb);
// Verify back and forth conversions at minimum gain.
EXPECT_FLOAT_EQ(DbToScale(ScaleToDb(0.0f)), 0.0f);
EXPECT_FLOAT_EQ(DbToScale(ScaleToDb(kMinGainScale)), 0.0f);
EXPECT_FLOAT_EQ(ScaleToDb(DbToScale(kMinGainDb)), kMinGainDb);
}
} // namespace
} // namespace media_audio