Merge "Audio AIDL : Add placeholder implementation and VTS test case for AGC1" am: adce82f9b5 am: 1d7b1df1c8 am: aca1e4fc99

Original change: https://android-review.googlesource.com/c/platform/hardware/interfaces/+/2437832

Change-Id: I10f190cad8dbf9b7789d59f172eb0157c5560a8b
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Treehugger Robot
2023-02-16 03:05:06 +00:00
committed by Automerger Merge Worker
12 changed files with 572 additions and 0 deletions

View File

@@ -39,6 +39,9 @@
{
"name": "VtsHalAECTargetTest"
},
{
"name": "VtsHalAGC1TargetTest"
},
{
"name": "VtsHalAGC2TargetTest"
},

View File

@@ -41,6 +41,7 @@ parcelable Descriptor {
const String EFFECT_TYPE_UUID_EQUALIZER = "0bed4300-ddd6-11db-8f34-0002a5d5c51b";
const String EFFECT_TYPE_UUID_BASS_BOOST = "0634f220-ddd4-11db-a0fc-0002a5d5c51b";
const String EFFECT_TYPE_UUID_VIRTUALIZER = "37cc2c00-dddd-11db-8577-0002a5d5c51b";
const String EFFECT_TYPE_UUID_AGC1 = "0a8abfe0-654c-11e0-ba26-0002a5d5c51b";
const String EFFECT_TYPE_UUID_AGC2 = "ae3c653b-be18-4ab8-8938-418f0a7f06ac";
const String EFFECT_TYPE_UUID_AEC = "7b491460-8d4d-11e0-bd61-0002a5d5c51b";
const String EFFECT_TYPE_UUID_NS = "58b4b260-8e06-11e0-aa8e-0002a5d5c51b";

View File

@@ -44,6 +44,7 @@ union Parameter {
union Id {
int vendorEffectTag;
android.hardware.audio.effect.AcousticEchoCanceler.Id acousticEchoCancelerTag;
android.hardware.audio.effect.AutomaticGainControlV1.Id automaticGainControlV1Tag;
android.hardware.audio.effect.AutomaticGainControlV2.Id automaticGainControlV2Tag;
android.hardware.audio.effect.BassBoost.Id bassBoostTag;
android.hardware.audio.effect.Downmix.Id downmixTag;
@@ -75,6 +76,7 @@ union Parameter {
union Specific {
android.hardware.audio.effect.VendorExtension vendorEffect;
android.hardware.audio.effect.AcousticEchoCanceler acousticEchoCanceler;
android.hardware.audio.effect.AutomaticGainControlV1 automaticGainControlV1;
android.hardware.audio.effect.AutomaticGainControlV2 automaticGainControlV2;
android.hardware.audio.effect.BassBoost bassBoost;
android.hardware.audio.effect.Downmix downmix;

View File

@@ -56,6 +56,10 @@ parcelable Descriptor {
* UUID for virtualizer effect type.
*/
const String EFFECT_TYPE_UUID_VIRTUALIZER = "37cc2c00-dddd-11db-8577-0002a5d5c51b";
/**
* UUID for Automatic Gain Control V1 (AGC1) type.
*/
const String EFFECT_TYPE_UUID_AGC1 = "0a8abfe0-654c-11e0-ba26-0002a5d5c51b";
/**
* UUID for Automatic Gain Control V2 (AGC2) type.
*/

View File

@@ -17,6 +17,7 @@
package android.hardware.audio.effect;
import android.hardware.audio.effect.AcousticEchoCanceler;
import android.hardware.audio.effect.AutomaticGainControlV1;
import android.hardware.audio.effect.AutomaticGainControlV2;
import android.hardware.audio.effect.BassBoost;
import android.hardware.audio.effect.Downmix;
@@ -83,6 +84,7 @@ union Parameter {
*
*/
AcousticEchoCanceler.Id acousticEchoCancelerTag;
AutomaticGainControlV1.Id automaticGainControlV1Tag;
AutomaticGainControlV2.Id automaticGainControlV2Tag;
BassBoost.Id bassBoostTag;
Downmix.Id downmixTag;
@@ -165,6 +167,7 @@ union Parameter {
union Specific {
VendorExtension vendorEffect;
AcousticEchoCanceler acousticEchoCanceler;
AutomaticGainControlV1 automaticGainControlV1;
AutomaticGainControlV2 automaticGainControlV2;
BassBoost bassBoost;
Downmix downmix;

View File

@@ -29,6 +29,7 @@
-->
<libraries>
<library name="aecsw" path="libaecsw.so"/>
<library name="agc1sw" path="libagc1sw.so"/>
<library name="agc2sw" path="libagc2sw.so"/>
<library name="bassboostsw" path="libbassboostsw.so"/>
<library name="bundle" path="libbundleaidl.so"/>
@@ -67,6 +68,7 @@
<effects>
<effect name="acoustic_echo_canceler" library="aecsw" uuid="bb392ec0-8d4d-11e0-a896-0002a5d5c51b"/>
<effect name="automatic_gain_control_v1" library="agc1sw" uuid="aa8130e0-66fc-11e0-bad0-0002a5d5c51b"/>
<effect name="automatic_gain_control_v2" library="agc2sw" uuid="89f38e65-d4d2-4d64-ad0e-2b3e799ea886"/>
<effectProxy name="bassboost" uuid="14804144-a5ee-4d24-aa88-0002a5d5c51b">
<libsw library="bassboostsw" uuid="fa8181f2-588b-11ed-9b6a-0242ac120002"/>

View File

@@ -0,0 +1,41 @@
/*
* Copyright (C) 2023 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.
*/
package {
// See: http://go/android-license-faq
// A large-scale-change added 'default_applicable_licenses' to import
// all of the 'license_kinds' from "hardware_interfaces_license"
// to get the below license kinds:
// SPDX-license-identifier-Apache-2.0
default_applicable_licenses: ["hardware_interfaces_license"],
}
cc_library_shared {
name: "libagc1sw",
defaults: [
"aidlaudioeffectservice_defaults",
"latest_android_media_audio_common_types_ndk_shared",
"latest_android_hardware_audio_effect_ndk_shared",
],
srcs: [
"AutomaticGainControlV1Sw.cpp",
":effectCommonFile",
],
relative_install_path: "soundfx",
visibility: [
"//hardware/interfaces/audio/aidl/default",
],
}

View File

@@ -0,0 +1,226 @@
/*
* Copyright (C) 2023 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 "AHAL_AutomaticGainControlV1Sw"
#include <android-base/logging.h>
#include "AutomaticGainControlV1Sw.h"
using aidl::android::hardware::audio::effect::AutomaticGainControlV1Sw;
using aidl::android::hardware::audio::effect::Descriptor;
using aidl::android::hardware::audio::effect::IEffect;
using aidl::android::hardware::audio::effect::kAutomaticGainControlV1SwImplUUID;
using aidl::android::media::audio::common::AudioUuid;
extern "C" binder_exception_t createEffect(const AudioUuid* in_impl_uuid,
std::shared_ptr<IEffect>* instanceSpp) {
if (!in_impl_uuid || *in_impl_uuid != kAutomaticGainControlV1SwImplUUID) {
LOG(ERROR) << __func__ << "uuid not supported";
return EX_ILLEGAL_ARGUMENT;
}
if (instanceSpp) {
*instanceSpp = ndk::SharedRefBase::make<AutomaticGainControlV1Sw>();
LOG(DEBUG) << __func__ << " instance " << instanceSpp->get() << " created";
return EX_NONE;
} else {
LOG(ERROR) << __func__ << " invalid input parameter!";
return EX_ILLEGAL_ARGUMENT;
}
}
extern "C" binder_exception_t queryEffect(const AudioUuid* in_impl_uuid, Descriptor* _aidl_return) {
if (!in_impl_uuid || *in_impl_uuid != kAutomaticGainControlV1SwImplUUID) {
LOG(ERROR) << __func__ << "uuid not supported";
return EX_ILLEGAL_ARGUMENT;
}
*_aidl_return = AutomaticGainControlV1Sw::kDescriptor;
return EX_NONE;
}
namespace aidl::android::hardware::audio::effect {
const std::string AutomaticGainControlV1Sw::kEffectName = "AutomaticGainControlV1Sw";
const std::vector<Range::AutomaticGainControlV1Range> AutomaticGainControlV1Sw::kRanges = {
MAKE_RANGE(AutomaticGainControlV1, targetPeakLevelDbFs, -3100, 0),
MAKE_RANGE(AutomaticGainControlV1, maxCompressionGainDb, 0, 9000)};
const Capability AutomaticGainControlV1Sw::kCapability = {
.range = AutomaticGainControlV1Sw::kRanges};
const Descriptor AutomaticGainControlV1Sw::kDescriptor = {
.common = {.id = {.type = kAutomaticGainControlV1TypeUUID,
.uuid = kAutomaticGainControlV1SwImplUUID,
.proxy = std::nullopt},
.flags = {.type = Flags::Type::INSERT,
.insert = Flags::Insert::FIRST,
.volume = Flags::Volume::CTRL},
.name = AutomaticGainControlV1Sw::kEffectName,
.implementor = "The Android Open Source Project"},
.capability = AutomaticGainControlV1Sw::kCapability};
ndk::ScopedAStatus AutomaticGainControlV1Sw::getDescriptor(Descriptor* _aidl_return) {
LOG(DEBUG) << __func__ << kDescriptor.toString();
*_aidl_return = kDescriptor;
return ndk::ScopedAStatus::ok();
}
ndk::ScopedAStatus AutomaticGainControlV1Sw::setParameterSpecific(
const Parameter::Specific& specific) {
RETURN_IF(Parameter::Specific::automaticGainControlV1 != specific.getTag(), EX_ILLEGAL_ARGUMENT,
"EffectNotSupported");
RETURN_IF(!mContext, EX_NULL_POINTER, "nullContext");
auto& param = specific.get<Parameter::Specific::automaticGainControlV1>();
RETURN_IF(!inRange(param, kRanges), EX_ILLEGAL_ARGUMENT, "outOfRange");
auto tag = param.getTag();
switch (tag) {
case AutomaticGainControlV1::targetPeakLevelDbFs: {
RETURN_IF(mContext->setTargetPeakLevel(
param.get<AutomaticGainControlV1::targetPeakLevelDbFs>()) !=
RetCode::SUCCESS,
EX_ILLEGAL_ARGUMENT, "targetPeakLevelNotSupported");
return ndk::ScopedAStatus::ok();
}
case AutomaticGainControlV1::maxCompressionGainDb: {
RETURN_IF(mContext->setMaxCompressionGain(
param.get<AutomaticGainControlV1::maxCompressionGainDb>()) !=
RetCode::SUCCESS,
EX_ILLEGAL_ARGUMENT, "maxCompressionGainNotSupported");
return ndk::ScopedAStatus::ok();
}
case AutomaticGainControlV1::enableLimiter: {
RETURN_IF(
mContext->setEnableLimiter(
param.get<AutomaticGainControlV1::enableLimiter>()) != RetCode::SUCCESS,
EX_ILLEGAL_ARGUMENT, "enableLimiterNotSupported");
return ndk::ScopedAStatus::ok();
}
default: {
LOG(ERROR) << __func__ << " unsupported tag: " << toString(tag);
return ndk::ScopedAStatus::fromExceptionCodeWithMessage(
EX_ILLEGAL_ARGUMENT, "AutomaticGainControlV1TagNotSupported");
}
}
}
ndk::ScopedAStatus AutomaticGainControlV1Sw::getParameterSpecific(const Parameter::Id& id,
Parameter::Specific* specific) {
auto tag = id.getTag();
RETURN_IF(Parameter::Id::automaticGainControlV1Tag != tag, EX_ILLEGAL_ARGUMENT, "wrongIdTag");
auto specificId = id.get<Parameter::Id::automaticGainControlV1Tag>();
auto specificIdTag = specificId.getTag();
switch (specificIdTag) {
case AutomaticGainControlV1::Id::commonTag:
return getParameterAutomaticGainControlV1(
specificId.get<AutomaticGainControlV1::Id::commonTag>(), specific);
default:
LOG(ERROR) << __func__ << " unsupported tag: " << toString(tag);
return ndk::ScopedAStatus::fromExceptionCodeWithMessage(
EX_ILLEGAL_ARGUMENT, "AutomaticGainControlV1TagNotSupported");
}
}
ndk::ScopedAStatus AutomaticGainControlV1Sw::getParameterAutomaticGainControlV1(
const AutomaticGainControlV1::Tag& tag, Parameter::Specific* specific) {
RETURN_IF(!mContext, EX_NULL_POINTER, "nullContext");
AutomaticGainControlV1 param;
switch (tag) {
case AutomaticGainControlV1::targetPeakLevelDbFs: {
param.set<AutomaticGainControlV1::targetPeakLevelDbFs>(mContext->getTargetPeakLevel());
break;
}
case AutomaticGainControlV1::maxCompressionGainDb: {
param.set<AutomaticGainControlV1::maxCompressionGainDb>(
mContext->getMaxCompressionGain());
break;
}
case AutomaticGainControlV1::enableLimiter: {
param.set<AutomaticGainControlV1::enableLimiter>(mContext->getEnableLimiter());
break;
}
default: {
LOG(ERROR) << __func__ << " unsupported tag: " << toString(tag);
return ndk::ScopedAStatus::fromExceptionCodeWithMessage(
EX_ILLEGAL_ARGUMENT, "AutomaticGainControlV1TagNotSupported");
}
}
specific->set<Parameter::Specific::automaticGainControlV1>(param);
return ndk::ScopedAStatus::ok();
}
std::shared_ptr<EffectContext> AutomaticGainControlV1Sw::createContext(
const Parameter::Common& common) {
if (mContext) {
LOG(DEBUG) << __func__ << " context already exist";
} else {
mContext =
std::make_shared<AutomaticGainControlV1SwContext>(1 /* statusFmqDepth */, common);
}
return mContext;
}
std::shared_ptr<EffectContext> AutomaticGainControlV1Sw::getContext() {
return mContext;
}
RetCode AutomaticGainControlV1Sw::releaseContext() {
if (mContext) {
mContext.reset();
}
return RetCode::SUCCESS;
}
// Processing method running in EffectWorker thread.
IEffect::Status AutomaticGainControlV1Sw::effectProcessImpl(float* in, float* out, int samples) {
// TODO: get data buffer and process.
LOG(DEBUG) << __func__ << " in " << in << " out " << out << " samples " << samples;
for (int i = 0; i < samples; i++) {
*out++ = *in++;
}
return {STATUS_OK, samples, samples};
}
RetCode AutomaticGainControlV1SwContext::setTargetPeakLevel(int targetPeakLevel) {
mTargetPeakLevel = targetPeakLevel;
return RetCode::SUCCESS;
}
int AutomaticGainControlV1SwContext::getTargetPeakLevel() {
return mTargetPeakLevel;
}
RetCode AutomaticGainControlV1SwContext::setMaxCompressionGain(int maxCompressionGain) {
mMaxCompressionGain = maxCompressionGain;
return RetCode::SUCCESS;
}
int AutomaticGainControlV1SwContext::getMaxCompressionGain() {
return mMaxCompressionGain;
}
RetCode AutomaticGainControlV1SwContext::setEnableLimiter(bool enableLimiter) {
mEnableLimiter = enableLimiter;
return RetCode::SUCCESS;
}
bool AutomaticGainControlV1SwContext::getEnableLimiter() {
return mEnableLimiter;
}
} // namespace aidl::android::hardware::audio::effect

View File

@@ -0,0 +1,74 @@
/*
* Copyright (C) 2023 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.
*/
#pragma once
#include "effect-impl/EffectImpl.h"
#include "effect-impl/EffectUUID.h"
namespace aidl::android::hardware::audio::effect {
class AutomaticGainControlV1SwContext final : public EffectContext {
public:
AutomaticGainControlV1SwContext(int statusDepth, const Parameter::Common& common)
: EffectContext(statusDepth, common) {
LOG(DEBUG) << __func__;
}
RetCode setTargetPeakLevel(int targetPeakLevel);
int getTargetPeakLevel();
RetCode setMaxCompressionGain(int maxCompressionGainDb);
int getMaxCompressionGain();
RetCode setEnableLimiter(bool enableLimiter);
bool getEnableLimiter();
private:
int mTargetPeakLevel = 0;
int mMaxCompressionGain = 0;
bool mEnableLimiter = false;
};
class AutomaticGainControlV1Sw final : public EffectImpl {
public:
static const std::string kEffectName;
static const bool kStrengthSupported;
static const Capability kCapability;
static const Descriptor kDescriptor;
AutomaticGainControlV1Sw() { LOG(DEBUG) << __func__; }
~AutomaticGainControlV1Sw() {
cleanUp();
LOG(DEBUG) << __func__;
}
ndk::ScopedAStatus getDescriptor(Descriptor* _aidl_return) override;
ndk::ScopedAStatus setParameterSpecific(const Parameter::Specific& specific) override;
ndk::ScopedAStatus getParameterSpecific(const Parameter::Id& id,
Parameter::Specific* specific) override;
std::shared_ptr<EffectContext> createContext(const Parameter::Common& common) override;
std::shared_ptr<EffectContext> getContext() override;
RetCode releaseContext() override;
std::string getEffectName() override { return kEffectName; };
IEffect::Status effectProcessImpl(float* in, float* out, int samples) override;
private:
static const std::vector<Range::AutomaticGainControlV1Range> kRanges;
std::shared_ptr<AutomaticGainControlV1SwContext> mContext;
ndk::ScopedAStatus getParameterAutomaticGainControlV1(const AutomaticGainControlV1::Tag& tag,
Parameter::Specific* specific);
};
} // namespace aidl::android::hardware::audio::effect

View File

@@ -45,6 +45,18 @@ static const AudioUuid kAcousticEchoCancelerSwImplUUID = {static_cast<int32_t>(0
0x11e0,
0xa896,
{0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}};
// 0a8abfe0-654c-11e0-ba26-0002a5d5c51b
static const AudioUuid kAutomaticGainControlV1TypeUUID = {static_cast<int32_t>(0x0a8abfe0),
0x654c,
0x11e0,
0xba26,
{0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}};
// aa8130e0-66fc-11e0-bad0-0002a5d5c51b
static const AudioUuid kAutomaticGainControlV1SwImplUUID = {static_cast<int32_t>(0xaa8130e0),
0x66fc,
0x11e0,
0xbad0,
{0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}};
// ae3c653b-be18-4ab8-8938-418f0a7f06ac
static const AudioUuid kAutomaticGainControlV2TypeUUID = {static_cast<int32_t>(0xae3c653b),
0xbe18,
@@ -306,6 +318,7 @@ static const AudioUuid kVolumeBundleImplUUID = {static_cast<int32_t>(0x119341a0)
*/
static const std::map<const std::string /* effect type */, const AudioUuid&> kUuidNameTypeMap = {
{"acoustic_echo_canceler", kAcousticEchoCancelerTypeUUID},
{"automatic_gain_control_v1", kAutomaticGainControlV1TypeUUID},
{"automatic_gain_control_v2", kAutomaticGainControlV2TypeUUID},
{"bassboost", kBassBoostTypeUUID},
{"downmix", kDownmixTypeUUID},

View File

@@ -140,6 +140,12 @@ cc_test {
srcs: ["VtsHalAECTargetTest.cpp"],
}
cc_test {
name: "VtsHalAGC1TargetTest",
defaults: ["VtsHalAudioTargetTestDefaults"],
srcs: ["VtsHalAGC1TargetTest.cpp"],
}
cc_test {
name: "VtsHalAGC2TargetTest",
defaults: ["VtsHalAudioTargetTestDefaults"],

View File

@@ -0,0 +1,197 @@
/*
* Copyright (C) 2023 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.
*/
#include <Utils.h>
#include <aidl/Vintf.h>
#define LOG_TAG "VtsHalAGC1ParamTest"
#include "EffectHelper.h"
using namespace android;
using aidl::android::hardware::audio::effect::AutomaticGainControlV1;
using aidl::android::hardware::audio::effect::Descriptor;
using aidl::android::hardware::audio::effect::IEffect;
using aidl::android::hardware::audio::effect::IFactory;
using aidl::android::hardware::audio::effect::kAutomaticGainControlV1TypeUUID;
using aidl::android::hardware::audio::effect::Parameter;
enum ParamName {
PARAM_INSTANCE_NAME,
PARAM_TARGET_PEAK_LEVEL,
PARAM_MAX_COMPRESSION_GAIN,
PARAM_ENABLE_LIMITER
};
using AGC1ParamTestParam =
std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>, int /* targetPeakLevel */,
int /* maxCompressionGain */, bool /* enableLimiter */>;
class AGC1ParamTest : public ::testing::TestWithParam<AGC1ParamTestParam>, public EffectHelper {
public:
AGC1ParamTest()
: mTargetPeakLevel(std::get<PARAM_TARGET_PEAK_LEVEL>(GetParam())),
mMaxCompressionGain(std::get<PARAM_MAX_COMPRESSION_GAIN>(GetParam())),
mEnableLimiter(std::get<PARAM_ENABLE_LIMITER>(GetParam())) {
std::tie(mFactory, mDescriptor) = std::get<PARAM_INSTANCE_NAME>(GetParam());
}
void SetUp() override {
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 TearDown() override {
ASSERT_NO_FATAL_FAILURE(close(mEffect));
ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
}
Parameter::Specific getDefaultParamSpecific() {
AutomaticGainControlV1 AGC1 =
AutomaticGainControlV1::make<AutomaticGainControlV1::targetPeakLevelDbFs>(0);
Parameter::Specific specific =
Parameter::Specific::make<Parameter::Specific::automaticGainControlV1>(AGC1);
return specific;
}
static const long kInputFrameCount = 0x100, kOutputFrameCount = 0x100;
std::shared_ptr<IFactory> mFactory;
std::shared_ptr<IEffect> mEffect;
Descriptor mDescriptor;
int mTargetPeakLevel;
int mMaxCompressionGain;
bool mEnableLimiter;
void SetAndGetParameters() {
for (auto& it : mTags) {
auto& tag = it.first;
auto& AGC1 = it.second;
// validate parameter
Descriptor desc;
ASSERT_STATUS(EX_NONE, mEffect->getDescriptor(&desc));
const bool valid =
isParameterValid<AutomaticGainControlV1, Range::automaticGainControlV1>(AGC1,
desc);
const binder_exception_t expected = valid ? EX_NONE : EX_ILLEGAL_ARGUMENT;
// set parameter
Parameter expectParam;
Parameter::Specific specific;
specific.set<Parameter::Specific::automaticGainControlV1>(AGC1);
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;
AutomaticGainControlV1::Id specificId;
specificId.set<AutomaticGainControlV1::Id::commonTag>(tag);
id.set<Parameter::Id::automaticGainControlV1Tag>(specificId);
EXPECT_STATUS(EX_NONE, mEffect->getParameter(id, &getParam));
EXPECT_EQ(expectParam, getParam) << "\nexpect:" << expectParam.toString()
<< "\ngetParam:" << getParam.toString();
}
}
}
void addTargetPeakLevelParam(int targetPeakLevel) {
AutomaticGainControlV1 AGC1;
AGC1.set<AutomaticGainControlV1::targetPeakLevelDbFs>(targetPeakLevel);
mTags.push_back({AutomaticGainControlV1::targetPeakLevelDbFs, AGC1});
}
void addMaxCompressionGainParam(int maxCompressionGainDb) {
AutomaticGainControlV1 AGC1;
AGC1.set<AutomaticGainControlV1::maxCompressionGainDb>(maxCompressionGainDb);
mTags.push_back({AutomaticGainControlV1::maxCompressionGainDb, AGC1});
}
void addEnableLimiterParam(bool enableLimiter) {
AutomaticGainControlV1 AGC1;
AGC1.set<AutomaticGainControlV1::enableLimiter>(enableLimiter);
mTags.push_back({AutomaticGainControlV1::enableLimiter, AGC1});
}
private:
std::vector<std::pair<AutomaticGainControlV1::Tag, AutomaticGainControlV1>> mTags;
void CleanUp() { mTags.clear(); }
};
TEST_P(AGC1ParamTest, SetAndGetTargetPeakLevelParam) {
EXPECT_NO_FATAL_FAILURE(addTargetPeakLevelParam(mTargetPeakLevel));
SetAndGetParameters();
}
TEST_P(AGC1ParamTest, SetAndGetMaxCompressionGain) {
EXPECT_NO_FATAL_FAILURE(addMaxCompressionGainParam(mMaxCompressionGain));
SetAndGetParameters();
}
TEST_P(AGC1ParamTest, SetAndGetEnableLimiter) {
EXPECT_NO_FATAL_FAILURE(addEnableLimiterParam(mEnableLimiter));
SetAndGetParameters();
}
std::vector<std::pair<std::shared_ptr<IFactory>, Descriptor>> kDescPair;
INSTANTIATE_TEST_SUITE_P(
AGC1ParamTest, AGC1ParamTest,
::testing::Combine(
testing::ValuesIn(kDescPair = EffectFactoryHelper::getAllEffectDescriptors(
IFactory::descriptor, kAutomaticGainControlV1TypeUUID)),
testing::ValuesIn(EffectHelper::getTestValueSet<
AutomaticGainControlV1, int, Range::automaticGainControlV1,
AutomaticGainControlV1::targetPeakLevelDbFs>(
kDescPair, EffectHelper::expandTestValueBasic<int>)),
testing::ValuesIn(EffectHelper::getTestValueSet<
AutomaticGainControlV1, int, Range::automaticGainControlV1,
AutomaticGainControlV1::maxCompressionGainDb>(
kDescPair, EffectHelper::expandTestValueBasic<int>)),
testing::Bool()),
[](const testing::TestParamInfo<AGC1ParamTest::ParamType>& info) {
auto descriptor = std::get<PARAM_INSTANCE_NAME>(info.param).second;
std::string targetPeakLevel =
std::to_string(std::get<PARAM_TARGET_PEAK_LEVEL>(info.param));
std::string maxCompressionGain =
std::to_string(std::get<PARAM_MAX_COMPRESSION_GAIN>(info.param));
std::string enableLimiter = std::to_string(std::get<PARAM_ENABLE_LIMITER>(info.param));
std::string name = "Implementor_" + descriptor.common.implementor + "_name_" +
descriptor.common.name + "_UUID_" +
descriptor.common.id.uuid.toString() + "_target_peak_level_" +
targetPeakLevel + "_max_compression_gain_" + maxCompressionGain +
"_enable_limiter_" + enableLimiter;
std::replace_if(
name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
return name;
});
GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(AGC1ParamTest);
int main(int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv);
ABinderProcess_setThreadPoolMaxThreadCount(1);
ABinderProcess_startThreadPool();
return RUN_ALL_TESTS();
}