blob: 765c37739f5dcd12522a6c0183496c5bc5b6f576 [file] [log] [blame]
/*
* 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 "EffectHelper.h"
using namespace android;
using aidl::android::hardware::audio::effect::Descriptor;
using aidl::android::hardware::audio::effect::EnvironmentalReverb;
using aidl::android::hardware::audio::effect::getEffectTypeUuidEnvReverb;
using aidl::android::hardware::audio::effect::IEffect;
using aidl::android::hardware::audio::effect::IFactory;
using aidl::android::hardware::audio::effect::Parameter;
using android::hardware::audio::common::testing::detail::TestExecutionTracer;
/**
* Here we focus on specific parameter checking, general IEffect interfaces testing performed in
* VtsAudioEffectTargetTest.
* Testing parameter range, assuming the parameter supported by effect is in this range.
* This range is verified with IEffect.getDescriptor() and range defined in the documentation, for
* any index supported value test expects EX_NONE from IEffect.setParameter(), otherwise expects
* EX_ILLEGAL_ARGUMENT.
*/
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 = EffectHelper::createParamCommon(
0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
IEffect::OpenEffectReturn ret;
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>(-6000);
Parameter::Specific specific =
Parameter::Specific::make<Parameter::Specific::environmentalReverb>(er);
return specific;
}
static const long kInputFrameCount = 0x100, kOutputFrameCount = 0x100;
std::shared_ptr<IFactory> mFactory;
std::shared_ptr<IEffect> mEffect;
Descriptor mDescriptor;
int mRoomLevel = -6000;
int mRoomHfLevel = 0;
int mDecayTime = 1000;
int mDecayHfRatio = 500;
int mLevel = -6000;
int mDelay = 40;
int mDiffusion = 1000;
int mDensity = 1000;
bool mBypass = false;
void SetAndGetReverbParameters() {
for (auto& it : mTags) {
auto& tag = it.first;
auto& er = it.second;
// validate parameter
Descriptor desc;
ASSERT_STATUS(EX_NONE, mEffect->getDescriptor(&desc));
const bool valid = isParameterValid<EnvironmentalReverb, Range::environmentalReverb>(
it.second, desc);
const binder_exception_t expected = valid ? EX_NONE : EX_ILLEGAL_ARGUMENT;
// set
Parameter expectParam;
Parameter::Specific specific;
specific.set<Parameter::Specific::environmentalReverb>(er);
expectParam.set<Parameter::specific>(specific);
EXPECT_STATUS(expected, mEffect->setParameter(expectParam)) << expectParam.toString();
// only get if parameter in range and set success
if (expected == EX_NONE) {
Parameter getParam;
Parameter::Id id;
EnvironmentalReverb::Id erId;
erId.set<EnvironmentalReverb::Id::commonTag>(tag);
id.set<Parameter::Id::environmentalReverbTag>(erId);
// if set success, then get should match
EXPECT_STATUS(expected, mEffect->getParameter(id, &getParam));
EXPECT_EQ(expectParam, getParam);
}
}
}
void addRoomLevelParam() {
EnvironmentalReverb er;
er.set<EnvironmentalReverb::roomLevelMb>(mRoomLevel);
mTags.push_back({EnvironmentalReverb::roomLevelMb, er});
}
void addRoomHfLevelParam(int roomHfLevel) {
EnvironmentalReverb er;
er.set<EnvironmentalReverb::roomHfLevelMb>(roomHfLevel);
mTags.push_back({EnvironmentalReverb::roomHfLevelMb, er});
}
void addDecayTimeParam(int decayTime) {
EnvironmentalReverb er;
er.set<EnvironmentalReverb::decayTimeMs>(decayTime);
mTags.push_back({EnvironmentalReverb::decayTimeMs, er});
}
void addDecayHfRatioParam(int decayHfRatio) {
EnvironmentalReverb er;
er.set<EnvironmentalReverb::decayHfRatioPm>(decayHfRatio);
mTags.push_back({EnvironmentalReverb::decayHfRatioPm, er});
}
void addLevelParam(int level) {
EnvironmentalReverb er;
er.set<EnvironmentalReverb::levelMb>(level);
mTags.push_back({EnvironmentalReverb::levelMb, er});
}
void addDelayParam(int delay) {
EnvironmentalReverb er;
er.set<EnvironmentalReverb::delayMs>(delay);
mTags.push_back({EnvironmentalReverb::delayMs, er});
}
void addDiffusionParam(int diffusion) {
EnvironmentalReverb er;
er.set<EnvironmentalReverb::diffusionPm>(diffusion);
mTags.push_back({EnvironmentalReverb::diffusionPm, er});
}
void addDensityParam(int density) {
EnvironmentalReverb er;
er.set<EnvironmentalReverb::densityPm>(density);
mTags.push_back({EnvironmentalReverb::densityPm, er});
}
void addBypassParam(bool bypass) {
EnvironmentalReverb er;
er.set<EnvironmentalReverb::bypass>(bypass);
mTags.push_back({EnvironmentalReverb::bypass, er});
}
private:
std::vector<std::pair<EnvironmentalReverb::Tag, EnvironmentalReverb>> mTags;
void CleanUp() { mTags.clear(); }
};
class EnvironmentalReverbRoomLevelTest
: public ::testing::TestWithParam<
std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>, int>>,
public EnvironmentalReverbHelper {
public:
EnvironmentalReverbRoomLevelTest() : EnvironmentalReverbHelper(std::get<0>(GetParam())) {
mRoomLevel = std::get<1>(GetParam());
}
void SetUp() override { SetUpReverb(); }
void TearDown() override { TearDownReverb(); }
};
TEST_P(EnvironmentalReverbRoomLevelTest, SetAndGetRoomLevel) {
EXPECT_NO_FATAL_FAILURE(addRoomLevelParam());
SetAndGetReverbParameters();
}
std::vector<std::pair<std::shared_ptr<IFactory>, Descriptor>> kDescPair;
INSTANTIATE_TEST_SUITE_P(
EnvironmentalReverbTest, EnvironmentalReverbRoomLevelTest,
::testing::Combine(
testing::ValuesIn(kDescPair = EffectFactoryHelper::getAllEffectDescriptors(
IFactory::descriptor, getEffectTypeUuidEnvReverb())),
testing::ValuesIn(EffectHelper::getTestValueSet<EnvironmentalReverb, int,
Range::environmentalReverb,
EnvironmentalReverb::roomLevelMb>(
kDescPair, EffectHelper::expandTestValueBasic<int>))),
[](const testing::TestParamInfo<EnvironmentalReverbRoomLevelTest::ParamType>& info) {
auto descriptor = std::get<0>(info.param).second;
std::string roomLevel = std::to_string(std::get<1>(info.param));
std::string name = getPrefix(descriptor) + "_roomLevel" + roomLevel;
std::replace_if(
name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
return name;
});
GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(EnvironmentalReverbRoomLevelTest);
class EnvironmentalReverbRoomHfLevelTest
: public ::testing::TestWithParam<
std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>, int>>,
public EnvironmentalReverbHelper {
public:
EnvironmentalReverbRoomHfLevelTest() : EnvironmentalReverbHelper(std::get<0>(GetParam())) {
mRoomHfLevel = std::get<1>(GetParam());
}
void SetUp() override { SetUpReverb(); }
void TearDown() override { TearDownReverb(); }
};
TEST_P(EnvironmentalReverbRoomHfLevelTest, SetAndGetRoomHfLevel) {
EXPECT_NO_FATAL_FAILURE(addRoomHfLevelParam(mRoomHfLevel));
SetAndGetReverbParameters();
}
INSTANTIATE_TEST_SUITE_P(
EnvironmentalReverbTest, EnvironmentalReverbRoomHfLevelTest,
::testing::Combine(testing::ValuesIn(EffectFactoryHelper::getAllEffectDescriptors(
IFactory::descriptor, getEffectTypeUuidEnvReverb())),
testing::ValuesIn(EffectHelper::getTestValueSet<
EnvironmentalReverb, int, Range::environmentalReverb,
EnvironmentalReverb::roomHfLevelMb>(
kDescPair, EffectHelper::expandTestValueBasic<int>))),
[](const testing::TestParamInfo<EnvironmentalReverbRoomHfLevelTest::ParamType>& info) {
auto descriptor = std::get<0>(info.param).second;
std::string roomHfLevel = std::to_string(std::get<1>(info.param));
std::string name = "Implementor_" + descriptor.common.implementor + "_name_" +
descriptor.common.name + "_UUID_" +
descriptor.common.id.uuid.toString() + "_roomHfLevel" + roomHfLevel;
std::replace_if(
name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
return name;
});
GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(EnvironmentalReverbRoomHfLevelTest);
class EnvironmentalReverbDecayTimeTest
: public ::testing::TestWithParam<
std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>, int>>,
public EnvironmentalReverbHelper {
public:
EnvironmentalReverbDecayTimeTest() : EnvironmentalReverbHelper(std::get<0>(GetParam())) {
mDecayTime = std::get<1>(GetParam());
}
void SetUp() override { SetUpReverb(); }
void TearDown() override { TearDownReverb(); }
};
TEST_P(EnvironmentalReverbDecayTimeTest, SetAndGetDecayTime) {
EXPECT_NO_FATAL_FAILURE(addDecayTimeParam(mDecayTime));
SetAndGetReverbParameters();
}
INSTANTIATE_TEST_SUITE_P(
EnvironmentalReverbTest, EnvironmentalReverbDecayTimeTest,
::testing::Combine(testing::ValuesIn(EffectFactoryHelper::getAllEffectDescriptors(
IFactory::descriptor, getEffectTypeUuidEnvReverb())),
testing::ValuesIn(EffectHelper::getTestValueSet<
EnvironmentalReverb, int, Range::environmentalReverb,
EnvironmentalReverb::decayTimeMs>(
kDescPair, EffectHelper::expandTestValueBasic<int>))),
[](const testing::TestParamInfo<EnvironmentalReverbDecayTimeTest::ParamType>& info) {
auto descriptor = std::get<0>(info.param).second;
std::string decayTime = std::to_string(std::get<1>(info.param));
std::string name = "Implementor_" + descriptor.common.implementor + "_name_" +
descriptor.common.name + "_UUID_" +
descriptor.common.id.uuid.toString() + "_decayTime" + decayTime;
std::replace_if(
name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
return name;
});
GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(EnvironmentalReverbDecayTimeTest);
class EnvironmentalReverbDecayHfRatioTest
: public ::testing::TestWithParam<
std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>, int>>,
public EnvironmentalReverbHelper {
public:
EnvironmentalReverbDecayHfRatioTest() : EnvironmentalReverbHelper(std::get<0>(GetParam())) {
mDecayHfRatio = std::get<1>(GetParam());
}
void SetUp() override { SetUpReverb(); }
void TearDown() override { TearDownReverb(); }
};
TEST_P(EnvironmentalReverbDecayHfRatioTest, SetAndGetDecayHfRatio) {
EXPECT_NO_FATAL_FAILURE(addDecayHfRatioParam(mDecayHfRatio));
SetAndGetReverbParameters();
}
INSTANTIATE_TEST_SUITE_P(
EnvironmentalReverbTest, EnvironmentalReverbDecayHfRatioTest,
::testing::Combine(testing::ValuesIn(EffectFactoryHelper::getAllEffectDescriptors(
IFactory::descriptor, getEffectTypeUuidEnvReverb())),
testing::ValuesIn(EffectHelper::getTestValueSet<
EnvironmentalReverb, int, Range::environmentalReverb,
EnvironmentalReverb::decayHfRatioPm>(
kDescPair, EffectHelper::expandTestValueBasic<int>))),
[](const testing::TestParamInfo<EnvironmentalReverbDecayHfRatioTest::ParamType>& info) {
auto descriptor = std::get<0>(info.param).second;
std::string decayHfRatio = std::to_string(std::get<1>(info.param));
std::string name = "Implementor_" + descriptor.common.implementor + "_name_" +
descriptor.common.name + "_UUID_" +
descriptor.common.id.uuid.toString() + "_decayHfRatio" +
decayHfRatio;
std::replace_if(
name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
return name;
});
GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(EnvironmentalReverbDecayHfRatioTest);
class EnvironmentalReverbLevelTest
: public ::testing::TestWithParam<
std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>, int>>,
public EnvironmentalReverbHelper {
public:
EnvironmentalReverbLevelTest() : EnvironmentalReverbHelper(std::get<0>(GetParam())) {
mLevel = std::get<1>(GetParam());
}
void SetUp() override { SetUpReverb(); }
void TearDown() override { TearDownReverb(); }
};
TEST_P(EnvironmentalReverbLevelTest, SetAndGetLevel) {
EXPECT_NO_FATAL_FAILURE(addLevelParam(mLevel));
SetAndGetReverbParameters();
}
INSTANTIATE_TEST_SUITE_P(
EnvironmentalReverbTest, EnvironmentalReverbLevelTest,
::testing::Combine(testing::ValuesIn(EffectFactoryHelper::getAllEffectDescriptors(
IFactory::descriptor, getEffectTypeUuidEnvReverb())),
testing::ValuesIn(EffectHelper::getTestValueSet<
EnvironmentalReverb, int, Range::environmentalReverb,
EnvironmentalReverb::levelMb>(
kDescPair, EffectHelper::expandTestValueBasic<int>))),
[](const testing::TestParamInfo<EnvironmentalReverbDecayHfRatioTest::ParamType>& info) {
auto descriptor = std::get<0>(info.param).second;
std::string level = std::to_string(std::get<1>(info.param));
std::string name = "Implementor_" + descriptor.common.implementor + "_name_" +
descriptor.common.name + "_UUID_" +
descriptor.common.id.uuid.toString() + "_level" + level;
std::replace_if(
name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
return name;
});
GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(EnvironmentalReverbLevelTest);
class EnvironmentalReverbDelayTest
: public ::testing::TestWithParam<
std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>, int>>,
public EnvironmentalReverbHelper {
public:
EnvironmentalReverbDelayTest() : EnvironmentalReverbHelper(std::get<0>(GetParam())) {
mDelay = std::get<1>(GetParam());
}
void SetUp() override { SetUpReverb(); }
void TearDown() override { TearDownReverb(); }
};
TEST_P(EnvironmentalReverbDelayTest, SetAndGetDelay) {
EXPECT_NO_FATAL_FAILURE(addDelayParam(mDelay));
SetAndGetReverbParameters();
}
INSTANTIATE_TEST_SUITE_P(
EnvironmentalReverbTest, EnvironmentalReverbDelayTest,
::testing::Combine(testing::ValuesIn(EffectFactoryHelper::getAllEffectDescriptors(
IFactory::descriptor, getEffectTypeUuidEnvReverb())),
testing::ValuesIn(EffectHelper::getTestValueSet<
EnvironmentalReverb, int, Range::environmentalReverb,
EnvironmentalReverb::delayMs>(
kDescPair, EffectHelper::expandTestValueBasic<int>))),
[](const testing::TestParamInfo<EnvironmentalReverbDelayTest::ParamType>& info) {
auto descriptor = std::get<0>(info.param).second;
std::string delay = std::to_string(std::get<1>(info.param));
std::string name = "Implementor_" + descriptor.common.implementor + "_name_" +
descriptor.common.name + "_UUID_" +
descriptor.common.id.uuid.toString() + "_delay" + delay;
std::replace_if(
name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
return name;
});
GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(EnvironmentalReverbDelayTest);
class EnvironmentalReverbDiffusionTest
: public ::testing::TestWithParam<
std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>, int>>,
public EnvironmentalReverbHelper {
public:
EnvironmentalReverbDiffusionTest() : EnvironmentalReverbHelper(std::get<0>(GetParam())) {
mDiffusion = std::get<1>(GetParam());
}
void SetUp() override { SetUpReverb(); }
void TearDown() override { TearDownReverb(); }
};
TEST_P(EnvironmentalReverbDiffusionTest, SetAndGetDiffusion) {
EXPECT_NO_FATAL_FAILURE(addDiffusionParam(mDiffusion));
SetAndGetReverbParameters();
}
INSTANTIATE_TEST_SUITE_P(
EnvironmentalReverbTest, EnvironmentalReverbDiffusionTest,
::testing::Combine(testing::ValuesIn(EffectFactoryHelper::getAllEffectDescriptors(
IFactory::descriptor, getEffectTypeUuidEnvReverb())),
testing::ValuesIn(EffectHelper::getTestValueSet<
EnvironmentalReverb, int, Range::environmentalReverb,
EnvironmentalReverb::diffusionPm>(
kDescPair, EffectHelper::expandTestValueBasic<int>))),
[](const testing::TestParamInfo<EnvironmentalReverbDiffusionTest::ParamType>& info) {
auto descriptor = std::get<0>(info.param).second;
std::string diffusion = std::to_string(std::get<1>(info.param));
std::string name = "Implementor_" + descriptor.common.implementor + "_name_" +
descriptor.common.name + "_UUID_" +
descriptor.common.id.uuid.toString() + "_diffusion" + diffusion;
std::replace_if(
name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
return name;
});
GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(EnvironmentalReverbDiffusionTest);
class EnvironmentalReverbDensityTest
: public ::testing::TestWithParam<
std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>, int>>,
public EnvironmentalReverbHelper {
public:
EnvironmentalReverbDensityTest() : EnvironmentalReverbHelper(std::get<0>(GetParam())) {
mDensity = std::get<1>(GetParam());
}
void SetUp() override { SetUpReverb(); }
void TearDown() override { TearDownReverb(); }
};
TEST_P(EnvironmentalReverbDensityTest, SetAndGetDensity) {
EXPECT_NO_FATAL_FAILURE(addDensityParam(mDensity));
SetAndGetReverbParameters();
}
INSTANTIATE_TEST_SUITE_P(
EnvironmentalReverbTest, EnvironmentalReverbDensityTest,
::testing::Combine(testing::ValuesIn(EffectFactoryHelper::getAllEffectDescriptors(
IFactory::descriptor, getEffectTypeUuidEnvReverb())),
testing::ValuesIn(EffectHelper::getTestValueSet<
EnvironmentalReverb, int, Range::environmentalReverb,
EnvironmentalReverb::densityPm>(
kDescPair, EffectHelper::expandTestValueBasic<int>))),
[](const testing::TestParamInfo<EnvironmentalReverbDensityTest::ParamType>& info) {
auto descriptor = std::get<0>(info.param).second;
std::string density = std::to_string(std::get<1>(info.param));
std::string name = "Implementor_" + descriptor.common.implementor + "_name_" +
descriptor.common.name + "_UUID_" +
descriptor.common.id.uuid.toString() + "_density" + density;
std::replace_if(
name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
return name;
});
GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(EnvironmentalReverbDensityTest);
class EnvironmentalReverbBypassTest
: public ::testing::TestWithParam<
std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>, bool>>,
public EnvironmentalReverbHelper {
public:
EnvironmentalReverbBypassTest() : EnvironmentalReverbHelper(std::get<0>(GetParam())) {
mBypass = std::get<1>(GetParam());
}
void SetUp() override { SetUpReverb(); }
void TearDown() override { TearDownReverb(); }
};
TEST_P(EnvironmentalReverbBypassTest, SetAndGetBypass) {
EXPECT_NO_FATAL_FAILURE(addBypassParam(mBypass));
SetAndGetReverbParameters();
}
INSTANTIATE_TEST_SUITE_P(
EnvironmentalReverbTest, EnvironmentalReverbBypassTest,
::testing::Combine(testing::ValuesIn(EffectFactoryHelper::getAllEffectDescriptors(
IFactory::descriptor, getEffectTypeUuidEnvReverb())),
testing::Bool()),
[](const testing::TestParamInfo<EnvironmentalReverbBypassTest::ParamType>& info) {
auto descriptor = std::get<0>(info.param).second;
std::string bypass = std::to_string(std::get<1>(info.param));
std::string name = "Implementor_" + descriptor.common.implementor + "_name_" +
descriptor.common.name + "_UUID_" +
descriptor.common.id.uuid.toString() + "_bypass" + bypass;
std::replace_if(
name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
return name;
});
GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(EnvironmentalReverbBypassTest);
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();
}