blob: 9b1a3b3ba7cc7a43543de5b7e30196e8c1af9f56 [file] [log] [blame] [edit]
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#define LOG_TAG "VtsHalEnvironmentalReverbTest"
#include <android-base/logging.h>
#include <audio_utils/power.h>
#include <audio_utils/primitives.h>
#include <system/audio.h>
#include <numeric>
#include "EffectHelper.h"
using namespace android;
using namespace aidl::android::hardware::audio::effect;
using aidl::android::hardware::audio::common::getChannelCount;
using android::hardware::audio::common::testing::detail::TestExecutionTracer;
using TagVectorPair = std::pair<EnvironmentalReverb::Tag, std::vector<int>>;
using TagValuePair = std::pair<EnvironmentalReverb::Tag, int>;
static constexpr int kMaxRoomLevel = 0;
static constexpr int kMinRoomLevel = -6000;
static constexpr int kMinRoomHfLevel = -4000;
static constexpr int kMinDecayTime = 0;
static constexpr int kMinHfRatio = 100;
static constexpr int kMinLevel = -6000;
static constexpr int kMinDensity = 0;
static constexpr int kMinDiffusion = 0;
static constexpr int kMinDelay = 0;
static const std::vector<TagVectorPair> kParamsIncreasingVector = {
{EnvironmentalReverb::roomLevelMb, {-3500, -2800, -2100, -1400, -700, 0}},
{EnvironmentalReverb::roomHfLevelMb, {-4000, -3200, -2400, -1600, -800, 0}},
{EnvironmentalReverb::decayTimeMs, {400, 800, 1200, 1600, 2000}},
{EnvironmentalReverb::decayHfRatioPm, {1000, 900, 800, 700}},
{EnvironmentalReverb::levelMb, {-3500, -2800, -2100, -1400, -700, 0}},
};
static const TagVectorPair kDiffusionParam = {EnvironmentalReverb::diffusionPm,
{100, 300, 500, 700, 900}};
static const TagVectorPair kDensityParam = {EnvironmentalReverb::densityPm,
{0, 200, 400, 600, 800, 1000}};
static const std::vector<TagValuePair> kParamsMinimumValue = {
{EnvironmentalReverb::roomLevelMb, kMinRoomLevel},
{EnvironmentalReverb::decayTimeMs, kMinDecayTime},
{EnvironmentalReverb::levelMb, kMinLevel}};
std::vector<std::pair<std::shared_ptr<IFactory>, Descriptor>> kDescPair;
using Maker = std::set<int> (*)();
static const std::array<Maker, static_cast<int>(EnvironmentalReverb::bypass) + 1>
kTestValueSetMaker = {
nullptr,
[]() -> std::set<int> {
return EffectHelper::getTestValueSet<EnvironmentalReverb, int,
Range::environmentalReverb,
EnvironmentalReverb::roomLevelMb>(
kDescPair, EffectHelper::expandTestValueBasic<int>);
},
[]() -> std::set<int> {
return EffectHelper::getTestValueSet<EnvironmentalReverb, int,
Range::environmentalReverb,
EnvironmentalReverb::roomHfLevelMb>(
kDescPair, EffectHelper::expandTestValueBasic<int>);
},
[]() -> std::set<int> {
return EffectHelper::getTestValueSet<EnvironmentalReverb, int,
Range::environmentalReverb,
EnvironmentalReverb::decayTimeMs>(
kDescPair, EffectHelper::expandTestValueBasic<int>);
},
[]() -> std::set<int> {
return EffectHelper::getTestValueSet<EnvironmentalReverb, int,
Range::environmentalReverb,
EnvironmentalReverb::decayHfRatioPm>(
kDescPair, EffectHelper::expandTestValueBasic<int>);
},
nullptr,
nullptr,
[]() -> std::set<int> {
return EffectHelper::getTestValueSet<EnvironmentalReverb, int,
Range::environmentalReverb,
EnvironmentalReverb::levelMb>(
kDescPair, EffectHelper::expandTestValueBasic<int>);
},
[]() -> std::set<int> {
return EffectHelper::getTestValueSet<EnvironmentalReverb, int,
Range::environmentalReverb,
EnvironmentalReverb::delayMs>(
kDescPair, EffectHelper::expandTestValueBasic<int>);
},
[]() -> std::set<int> {
return EffectHelper::getTestValueSet<EnvironmentalReverb, int,
Range::environmentalReverb,
EnvironmentalReverb::diffusionPm>(
kDescPair, EffectHelper::expandTestValueBasic<int>);
},
[]() -> std::set<int> {
return EffectHelper::getTestValueSet<EnvironmentalReverb, int,
Range::environmentalReverb,
EnvironmentalReverb::densityPm>(
kDescPair, EffectHelper::expandTestValueBasic<int>);
},
[]() -> std::set<int> {
return EffectHelper::getTestValueSet<EnvironmentalReverb, int,
Range::environmentalReverb,
EnvironmentalReverb::bypass>(
kDescPair, EffectHelper::expandTestValueBasic<int>);
},
};
static std::vector<TagValuePair> buildSetAndGetTestParams() {
std::vector<TagValuePair> valueTag;
for (EnvironmentalReverb::Tag tag : ndk::enum_range<EnvironmentalReverb::Tag>()) {
std::set<int> values;
int intTag = static_cast<int>(tag);
if (intTag <= static_cast<int>(EnvironmentalReverb::bypass) &&
kTestValueSetMaker[intTag] != nullptr) {
values = kTestValueSetMaker[intTag]();
}
for (const auto& value : values) {
valueTag.push_back(std::make_pair(tag, value));
}
}
return valueTag;
}
/**
* Tests do the following:
* - Testing parameter range supported by the effect. Range is verified with IEffect.getDescriptor()
* and range defined in the documentation.
* - Validating the effect by comparing the outputs of the supported parameters.
*/
enum ParamName { DESCRIPTOR_INDEX, TAG_VALUE_PAIR };
class EnvironmentalReverbHelper : public EffectHelper {
public:
EnvironmentalReverbHelper(std::pair<std::shared_ptr<IFactory>, Descriptor> pair) {
std::tie(mFactory, mDescriptor) = pair;
}
void SetUpReverb() {
ASSERT_NE(nullptr, mFactory);
ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
Parameter::Specific specific = getDefaultParamSpecific();
Parameter::Common common = createParamCommon(
0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
mFrameCount /* iFrameCount */, mFrameCount /* oFrameCount */);
ASSERT_NO_FATAL_FAILURE(open(mEffect, common, specific, &ret, EX_NONE));
ASSERT_NE(nullptr, mEffect);
}
void TearDownReverb() {
ASSERT_NO_FATAL_FAILURE(close(mEffect));
ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
}
Parameter::Specific getDefaultParamSpecific() {
EnvironmentalReverb er =
EnvironmentalReverb::make<EnvironmentalReverb::roomLevelMb>(kMaxRoomLevel);
Parameter::Specific specific =
Parameter::Specific::make<Parameter::Specific::environmentalReverb>(er);
return specific;
}
bool isParamValid(EnvironmentalReverb env) {
return isParameterValid<EnvironmentalReverb, Range::environmentalReverb>(env, mDescriptor);
}
Parameter createParam(EnvironmentalReverb env) {
return Parameter::make<Parameter::specific>(
Parameter::Specific::make<Parameter::Specific::environmentalReverb>(env));
}
void setAndVerifyParam(binder_exception_t expected, EnvironmentalReverb env,
EnvironmentalReverb::Tag tag) {
auto expectedParam = createParam(env);
EXPECT_STATUS(expected, mEffect->setParameter(expectedParam)) << expectedParam.toString();
if (expected == EX_NONE) {
auto erId = EnvironmentalReverb::Id::make<EnvironmentalReverb::Id::commonTag>(
EnvironmentalReverb::Tag(tag));
auto id = Parameter::Id::make<Parameter::Id::environmentalReverbTag>(erId);
// get parameter
Parameter getParam;
EXPECT_STATUS(EX_NONE, mEffect->getParameter(id, &getParam));
EXPECT_EQ(expectedParam, getParam) << "\nexpectedParam:" << expectedParam.toString()
<< "\ngetParam:" << getParam.toString();
}
}
bool isAuxiliary() {
return mDescriptor.common.flags.type ==
aidl::android::hardware::audio::effect::Flags::Type::AUXILIARY;
}
float computeOutputEnergy(const std::vector<float>& input, std::vector<float> output) {
if (!isAuxiliary()) {
// Extract auxiliary output
for (size_t i = 0; i < output.size(); i++) {
output[i] -= input[i];
}
}
return audio_utils_compute_energy_mono(output.data(), AUDIO_FORMAT_PCM_FLOAT,
output.size());
}
using Maker = EnvironmentalReverb (*)(int);
static constexpr std::array<Maker, static_cast<int>(EnvironmentalReverb::bypass) + 1>
kEnvironmentalReverbParamMaker = {
nullptr,
[](int value) -> EnvironmentalReverb {
return EnvironmentalReverb::make<EnvironmentalReverb::roomLevelMb>(value);
},
[](int value) -> EnvironmentalReverb {
return EnvironmentalReverb::make<EnvironmentalReverb::roomHfLevelMb>(value);
},
[](int value) -> EnvironmentalReverb {
return EnvironmentalReverb::make<EnvironmentalReverb::decayTimeMs>(value);
},
[](int value) -> EnvironmentalReverb {
return EnvironmentalReverb::make<EnvironmentalReverb::decayHfRatioPm>(
value);
},
nullptr,
nullptr,
[](int value) -> EnvironmentalReverb {
return EnvironmentalReverb::make<EnvironmentalReverb::levelMb>(value);
},
[](int value) -> EnvironmentalReverb {
return EnvironmentalReverb::make<EnvironmentalReverb::delayMs>(value);
},
[](int value) -> EnvironmentalReverb {
return EnvironmentalReverb::make<EnvironmentalReverb::diffusionPm>(value);
},
[](int value) -> EnvironmentalReverb {
return EnvironmentalReverb::make<EnvironmentalReverb::densityPm>(value);
},
[](int value) -> EnvironmentalReverb {
return EnvironmentalReverb::make<EnvironmentalReverb::bypass>(value);
}};
void createEnvParam(EnvironmentalReverb::Tag tag, int paramValue) {
int intTag = static_cast<int>(tag);
if (intTag <= static_cast<int>(EnvironmentalReverb::bypass) &&
kEnvironmentalReverbParamMaker[intTag] != NULL) {
mEnvParam = kEnvironmentalReverbParamMaker[intTag](paramValue);
} else {
GTEST_SKIP() << "Invalid parameter, skipping the test\n";
}
}
void setParameterAndProcess(std::vector<float>& input, std::vector<float>& output, int val,
EnvironmentalReverb::Tag tag) {
createEnvParam(tag, val);
if (isParamValid(mEnvParam)) {
ASSERT_NO_FATAL_FAILURE(setAndVerifyParam(EX_NONE, mEnvParam, tag));
ASSERT_NO_FATAL_FAILURE(processAndWriteToOutput(input, output, mEffect, &ret));
}
}
static constexpr int kDurationMilliSec = 500;
static constexpr int kBufferSize = kSamplingFrequency * kDurationMilliSec / 1000;
static constexpr int kInputFrequency = 2000;
static constexpr int mChannelLayout = AudioChannelLayout::LAYOUT_STEREO;
int mStereoChannelCount = getChannelCount(
AudioChannelLayout::make<AudioChannelLayout::layoutMask>(mChannelLayout));
int mFrameCount = kBufferSize / mStereoChannelCount;
std::shared_ptr<IFactory> mFactory;
std::shared_ptr<IEffect> mEffect;
IEffect::OpenEffectReturn ret;
Descriptor mDescriptor;
EnvironmentalReverb mEnvParam;
};
class EnvironmentalReverbParamTest
: public ::testing::TestWithParam<
std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>, TagValuePair>>,
public EnvironmentalReverbHelper {
public:
EnvironmentalReverbParamTest()
: EnvironmentalReverbHelper(std::get<DESCRIPTOR_INDEX>(GetParam())) {
std::tie(mTag, mParamValue) = std::get<TAG_VALUE_PAIR>(GetParam());
}
void SetUp() override { ASSERT_NO_FATAL_FAILURE(SetUpReverb()); }
void TearDown() override { TearDownReverb(); }
EnvironmentalReverb::Tag mTag;
int mParamValue;
};
TEST_P(EnvironmentalReverbParamTest, SetAndGetParameter) {
createEnvParam(mTag, mParamValue);
ASSERT_NO_FATAL_FAILURE(setAndVerifyParam(
isParamValid(mEnvParam) ? EX_NONE : EX_ILLEGAL_ARGUMENT, mEnvParam, mTag));
}
INSTANTIATE_TEST_SUITE_P(
EnvironmentalReverbTest, EnvironmentalReverbParamTest,
::testing::Combine(
testing::ValuesIn(kDescPair = EffectFactoryHelper::getAllEffectDescriptors(
IFactory::descriptor, getEffectTypeUuidEnvReverb())),
testing::ValuesIn(buildSetAndGetTestParams())),
[](const testing::TestParamInfo<EnvironmentalReverbParamTest::ParamType>& info) {
auto descriptor = std::get<DESCRIPTOR_INDEX>(info.param).second;
auto tag = std::get<TAG_VALUE_PAIR>(info.param).first;
auto val = std::get<TAG_VALUE_PAIR>(info.param).second;
std::string name =
getPrefix(descriptor) + "_Tag_" + toString(tag) + std::to_string(val);
std::replace_if(
name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
return name;
});
GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(EnvironmentalReverbParamTest);
class EnvironmentalReverbDataTest
: public ::testing::TestWithParam<
std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>, TagVectorPair>>,
public EnvironmentalReverbHelper {
public:
EnvironmentalReverbDataTest()
: EnvironmentalReverbHelper(std::get<DESCRIPTOR_INDEX>(GetParam())) {
std::tie(mTag, mParamValues) = std::get<TAG_VALUE_PAIR>(GetParam());
mInput.resize(kBufferSize);
}
void SetUp() override {
SKIP_TEST_IF_DATA_UNSUPPORTED(mDescriptor.common.flags);
ASSERT_NO_FATAL_FAILURE(
generateSineWave(kInputFrequency, mInput, 1.0, kSamplingFrequency, mChannelLayout));
ASSERT_NO_FATAL_FAILURE(SetUpReverb());
}
void TearDown() override {
SKIP_TEST_IF_DATA_UNSUPPORTED(mDescriptor.common.flags);
TearDownReverb();
}
void assertEnergyIncreasingWithParameter(bool bypass) {
createEnvParam(EnvironmentalReverb::bypass, bypass);
ASSERT_NO_FATAL_FAILURE(setAndVerifyParam(EX_NONE, mEnvParam, EnvironmentalReverb::bypass));
float baseEnergy = 0;
for (int val : mParamValues) {
std::vector<float> output(kBufferSize);
setParameterAndProcess(mInput, output, val, mTag);
float energy = computeOutputEnergy(mInput, output);
ASSERT_GT(energy, baseEnergy);
baseEnergy = energy;
}
}
void assertZeroEnergyWithBypass(bool bypass) {
createEnvParam(EnvironmentalReverb::bypass, bypass);
ASSERT_NO_FATAL_FAILURE(setAndVerifyParam(EX_NONE, mEnvParam, EnvironmentalReverb::bypass));
for (int val : mParamValues) {
std::vector<float> output(kBufferSize);
setParameterAndProcess(mInput, output, val, mTag);
float energy = computeOutputEnergy(mInput, output);
ASSERT_EQ(energy, 0);
}
}
EnvironmentalReverb::Tag mTag;
std::vector<int> mParamValues;
std::vector<float> mInput;
};
TEST_P(EnvironmentalReverbDataTest, IncreasingParamValue) {
ASSERT_NO_FATAL_FAILURE(assertEnergyIncreasingWithParameter(false));
}
TEST_P(EnvironmentalReverbDataTest, WithBypassEnabled) {
ASSERT_NO_FATAL_FAILURE(assertZeroEnergyWithBypass(true));
}
INSTANTIATE_TEST_SUITE_P(
EnvironmentalReverbTest, EnvironmentalReverbDataTest,
::testing::Combine(
testing::ValuesIn(kDescPair = EffectFactoryHelper::getAllEffectDescriptors(
IFactory::descriptor, getEffectTypeUuidEnvReverb())),
testing::ValuesIn(kParamsIncreasingVector)),
[](const testing::TestParamInfo<EnvironmentalReverbDataTest::ParamType>& info) {
auto descriptor = std::get<DESCRIPTOR_INDEX>(info.param).second;
auto tag = std::get<TAG_VALUE_PAIR>(info.param).first;
std::string name = getPrefix(descriptor) + "_Tag_" + toString(tag);
return name;
});
GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(EnvironmentalReverbDataTest);
class EnvironmentalReverbMinimumParamTest
: public ::testing::TestWithParam<
std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>, TagValuePair>>,
public EnvironmentalReverbHelper {
public:
EnvironmentalReverbMinimumParamTest()
: EnvironmentalReverbHelper(std::get<DESCRIPTOR_INDEX>(GetParam())) {
std::tie(mTag, mValue) = std::get<TAG_VALUE_PAIR>(GetParam());
}
void SetUp() override {
SKIP_TEST_IF_DATA_UNSUPPORTED(mDescriptor.common.flags);
ASSERT_NO_FATAL_FAILURE(SetUpReverb());
createEnvParam(EnvironmentalReverb::roomLevelMb, kMinRoomLevel);
ASSERT_NO_FATAL_FAILURE(
setAndVerifyParam(EX_NONE, mEnvParam, EnvironmentalReverb::roomLevelMb));
}
void TearDown() override {
SKIP_TEST_IF_DATA_UNSUPPORTED(mDescriptor.common.flags);
TearDownReverb();
}
EnvironmentalReverb::Tag mTag;
int mValue;
};
TEST_P(EnvironmentalReverbMinimumParamTest, MinimumValueTest) {
std::vector<float> input(kBufferSize);
ASSERT_NO_FATAL_FAILURE(
generateSineWave(kInputFrequency, input, 1.0, kSamplingFrequency, mChannelLayout));
std::vector<float> output(kBufferSize);
setParameterAndProcess(input, output, mValue, mTag);
float energy = computeOutputEnergy(input, output);
// No Auxiliary output for minimum param values
ASSERT_EQ(energy, 0);
}
INSTANTIATE_TEST_SUITE_P(
EnvironmentalReverbTest, EnvironmentalReverbMinimumParamTest,
::testing::Combine(
testing::ValuesIn(kDescPair = EffectFactoryHelper::getAllEffectDescriptors(
IFactory::descriptor, getEffectTypeUuidEnvReverb())),
testing::ValuesIn(kParamsMinimumValue)),
[](const testing::TestParamInfo<EnvironmentalReverbMinimumParamTest::ParamType>& info) {
auto descriptor = std::get<DESCRIPTOR_INDEX>(info.param).second;
auto tag = std::get<TAG_VALUE_PAIR>(info.param).first;
auto val = std::get<TAG_VALUE_PAIR>(info.param).second;
std::string name =
getPrefix(descriptor) + "_Tag_" + toString(tag) + std::to_string(val);
std::replace_if(
name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
return name;
});
GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(EnvironmentalReverbMinimumParamTest);
class EnvironmentalReverbDiffusionTest
: public ::testing::TestWithParam<
std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>, TagVectorPair>>,
public EnvironmentalReverbHelper {
public:
EnvironmentalReverbDiffusionTest()
: EnvironmentalReverbHelper(std::get<DESCRIPTOR_INDEX>(GetParam())) {
std::tie(mTag, mParamValues) = std::get<TAG_VALUE_PAIR>(GetParam());
mInput.resize(kBufferSize);
}
void SetUp() override {
SKIP_TEST_IF_DATA_UNSUPPORTED(mDescriptor.common.flags);
ASSERT_NO_FATAL_FAILURE(
generateSineWave(kInputFrequency, mInput, 1.0, kSamplingFrequency, mChannelLayout));
ASSERT_NO_FATAL_FAILURE(SetUpReverb());
}
void TearDown() override {
SKIP_TEST_IF_DATA_UNSUPPORTED(mDescriptor.common.flags);
TearDownReverb();
}
float getMean(std::vector<float>& buffer) {
return std::accumulate(buffer.begin(), buffer.end(), 0.0) / buffer.size();
}
float getVariance(std::vector<float>& buffer) {
if (isAuxiliary()) {
accumulate_float(buffer.data(), mInput.data(), buffer.size());
}
float mean = getMean(buffer);
float squaredDeltas =
std::accumulate(buffer.begin(), buffer.end(), 0.0,
[mean](float a, float b) { return a + pow(b - mean, 2); });
return squaredDeltas / buffer.size();
}
EnvironmentalReverb::Tag mTag;
std::vector<int> mParamValues;
std::vector<float> mInput;
};
TEST_P(EnvironmentalReverbDiffusionTest, DecreasingVarianceTest) {
std::vector<float> baseOutput(kBufferSize);
setParameterAndProcess(mInput, baseOutput, kMinDiffusion, mTag);
ASSERT_EQ(baseOutput.size(),
static_cast<size_t>(mFrameCount) * static_cast<size_t>(mStereoChannelCount));
float baseVariance = getVariance(baseOutput);
for (int value : mParamValues) {
std::vector<float> output(kBufferSize);
setParameterAndProcess(mInput, output, value, mTag);
ASSERT_EQ(output.size(),
static_cast<size_t>(mFrameCount) * static_cast<size_t>(mStereoChannelCount));
float variance = getVariance(output);
ASSERT_LT(variance, baseVariance);
baseVariance = variance;
}
}
INSTANTIATE_TEST_SUITE_P(
EnvironmentalReverbTest, EnvironmentalReverbDiffusionTest,
::testing::Combine(
testing::ValuesIn(kDescPair = EffectFactoryHelper::getAllEffectDescriptors(
IFactory::descriptor, getEffectTypeUuidEnvReverb())),
testing::Values(kDiffusionParam)),
[](const testing::TestParamInfo<EnvironmentalReverbDiffusionTest::ParamType>& info) {
auto descriptor = std::get<DESCRIPTOR_INDEX>(info.param).second;
auto tag = std::get<TAG_VALUE_PAIR>(info.param).first;
std::string name = getPrefix(descriptor) + "_Tag_" + toString(tag);
return name;
});
GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(EnvironmentalReverbDiffusionTest);
enum ParamDensityTest { DESCRIPTOR, TAG_DENSITY_VALUE, PARAM_DENSITY_VALUE, IS_INPUT_MUTE };
class EnvironmentalReverbDensityTest
: public ::testing::TestWithParam<std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>,
EnvironmentalReverb::Tag, int, bool>>,
public EnvironmentalReverbHelper {
public:
EnvironmentalReverbDensityTest() : EnvironmentalReverbHelper(std::get<DESCRIPTOR>(GetParam())) {
mTag = std::get<TAG_DENSITY_VALUE>(GetParam());
mParamValues = std::get<PARAM_DENSITY_VALUE>(GetParam());
mIsInputMute = (std::get<IS_INPUT_MUTE>(GetParam()));
mInput.resize(kBufferSize);
}
void SetUp() override {
SKIP_TEST_IF_DATA_UNSUPPORTED(mDescriptor.common.flags);
if (mIsInputMute) {
std::fill(mInput.begin(), mInput.end(), 0);
} else {
ASSERT_NO_FATAL_FAILURE(generateSineWave(kInputFrequency, mInput, 1.0,
kSamplingFrequency, mChannelLayout));
}
ASSERT_NO_FATAL_FAILURE(SetUpReverb());
}
void TearDown() override {
SKIP_TEST_IF_DATA_UNSUPPORTED(mDescriptor.common.flags);
TearDownReverb();
}
EnvironmentalReverb::Tag mTag;
int mParamValues;
std::vector<float> mInput;
bool mIsInputMute;
};
TEST_P(EnvironmentalReverbDensityTest, DensityOutput) {
float inputRmse =
audio_utils_compute_energy_mono(mInput.data(), AUDIO_FORMAT_PCM_FLOAT, mInput.size());
std::vector<float> output(kBufferSize);
setParameterAndProcess(mInput, output, mParamValues, mTag);
if (isAuxiliary() && !mIsInputMute) {
accumulate_float(output.data(), mInput.data(), output.size());
}
float outputRmse =
audio_utils_compute_energy_mono(output.data(), AUDIO_FORMAT_PCM_FLOAT, output.size());
if (inputRmse != 0) {
EXPECT_GT(outputRmse, 0);
} else {
EXPECT_EQ(outputRmse, inputRmse);
}
}
INSTANTIATE_TEST_SUITE_P(
EnvironmentalReverbTest, EnvironmentalReverbDensityTest,
::testing::Combine(
testing::ValuesIn(kDescPair = EffectFactoryHelper::getAllEffectDescriptors(
IFactory::descriptor, getEffectTypeUuidEnvReverb())),
testing::Values(kDensityParam.first), testing::ValuesIn(kDensityParam.second),
testing::Bool()),
[](const testing::TestParamInfo<EnvironmentalReverbDensityTest::ParamType>& info) {
auto descriptor = std::get<DESCRIPTOR>(info.param).second;
auto tag = std::get<TAG_DENSITY_VALUE>(info.param);
auto value = std::get<PARAM_DENSITY_VALUE>(info.param);
std::string isInputMute = std::to_string(std::get<IS_INPUT_MUTE>(info.param));
std::string name = getPrefix(descriptor) + "_Tag_" + toString(tag) + "_Value_" +
std::to_string(value) + "_isInputMute_" + isInputMute;
return name;
});
GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(EnvironmentalReverbDensityTest);
int main(int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv);
::testing::UnitTest::GetInstance()->listeners().Append(new TestExecutionTracer());
ABinderProcess_setThreadPoolMaxThreadCount(1);
ABinderProcess_startThreadPool();
return RUN_ALL_TESTS();
}