1bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov/* 29f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov * Copyright (C) 2017 The Android Open Source Project 3bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov * 4bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov * Licensed under the Apache License, Version 2.0 (the "License"); 5bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov * you may not use this file except in compliance with the License. 6bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov * You may obtain a copy of the License at 7bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov * 8bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov * http://www.apache.org/licenses/LICENSE-2.0 9bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov * 10bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov * Unless required by applicable law or agreed to in writing, software 11bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov * distributed under the License is distributed on an "AS IS" BASIS, 12bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov * See the License for the specific language governing permissions and 14bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov * limitations under the License. 15bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov */ 16bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov 17bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov#define LOG_TAG "AudioEffectHidlHalTest" 18bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov#include <android-base/logging.h> 199f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov#include <system/audio.h> 20bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov 219f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov#include <android/hardware/audio/effect/2.0/IEffect.h> 22bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov#include <android/hardware/audio/effect/2.0/IEffectsFactory.h> 239f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov#include <android/hardware/audio/effect/2.0/IEqualizerEffect.h> 249f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov#include <android/hardware/audio/effect/2.0/ILoudnessEnhancerEffect.h> 25bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov#include <android/hardware/audio/effect/2.0/types.h> 269f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov#include <android/hidl/allocator/1.0/IAllocator.h> 279f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov#include <android/hidl/memory/1.0/IMemory.h> 28bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov 29ed2bb4e8f851688c09f7639a9183b1285aa0967cYuexi Ma#include <VtsHalHidlTargetTestBase.h> 30bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov 319f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganovusing android::hardware::audio::common::V2_0::AudioDevice; 329f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganovusing android::hardware::audio::common::V2_0::AudioHandleConsts; 339f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganovusing android::hardware::audio::common::V2_0::AudioMode; 3405fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganovusing android::hardware::audio::common::V2_0::AudioSource; 359f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganovusing android::hardware::audio::common::V2_0::Uuid; 369f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganovusing android::hardware::audio::effect::V2_0::AudioBuffer; 3705fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganovusing android::hardware::audio::effect::V2_0::EffectAuxChannelsConfig; 389f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganovusing android::hardware::audio::effect::V2_0::EffectBufferConfig; 399f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganovusing android::hardware::audio::effect::V2_0::EffectConfig; 409f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganovusing android::hardware::audio::effect::V2_0::EffectDescriptor; 419f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganovusing android::hardware::audio::effect::V2_0::EffectOffloadParameter; 429f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganovusing android::hardware::audio::effect::V2_0::IEffect; 439f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganovusing android::hardware::audio::effect::V2_0::IEffectsFactory; 449f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganovusing android::hardware::audio::effect::V2_0::IEqualizerEffect; 459f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganovusing android::hardware::audio::effect::V2_0::ILoudnessEnhancerEffect; 469f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganovusing android::hardware::audio::effect::V2_0::Result; 479f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganovusing android::hardware::MQDescriptorSync; 489f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganovusing android::hardware::Return; 499f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganovusing android::hardware::Void; 503e6fe754f647db202a7a455adcf1ab5d686105d3Mikhail Naganovusing android::hardware::hidl_handle; 519f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganovusing android::hardware::hidl_memory; 529f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganovusing android::hardware::hidl_string; 539f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganovusing android::hardware::hidl_vec; 549f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganovusing android::hidl::allocator::V1_0::IAllocator; 559f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganovusing android::hidl::memory::V1_0::IMemory; 569f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganovusing android::sp; 57bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov 589f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov#ifndef ARRAY_SIZE 599f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov#define ARRAY_SIZE(a) (sizeof(a) / sizeof(*(a))) 609f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov#endif 619f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 629f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov// The main test class for Audio Effects Factory HIDL HAL. 639f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganovclass AudioEffectsFactoryHidlTest : public ::testing::VtsHalHidlTargetTestBase { 64bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov public: 659f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov void SetUp() override { 669f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov effectsFactory = 679f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov ::testing::VtsHalHidlTargetTestBase::getService<IEffectsFactory>(); 68bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov ASSERT_NE(effectsFactory, nullptr); 69bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov } 70bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov 719f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov void TearDown() override { effectsFactory.clear(); } 72bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov 739f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov protected: 749f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov static void description(const std::string& description) { 759f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov RecordProperty("description", description); 769f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov } 77bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov 789f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov sp<IEffectsFactory> effectsFactory; 79bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov}; 80bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov 819f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail NaganovTEST_F(AudioEffectsFactoryHidlTest, EnumerateEffects) { 829f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov description("Verify that EnumerateEffects returns at least one effect"); 83bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov Result retval = Result::NOT_INITIALIZED; 84bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov size_t effectCount = 0; 85bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov Return<void> ret = effectsFactory->getAllDescriptors( 86bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov [&](Result r, const hidl_vec<EffectDescriptor>& result) { 87bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov retval = r; 88bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov effectCount = result.size(); 89bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov }); 90b6438421923590b765905efe151e26129dce4094Steven Moreland EXPECT_TRUE(ret.isOk()); 919f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_EQ(Result::OK, retval); 92bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov EXPECT_GT(effectCount, 0u); 93bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov} 94bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov 959f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail NaganovTEST_F(AudioEffectsFactoryHidlTest, CreateEffect) { 969f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov description("Verify that an effect can be created via CreateEffect"); 97bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov bool gotEffect = false; 98bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov Uuid effectUuid; 99bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov Return<void> ret = effectsFactory->getAllDescriptors( 100bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov [&](Result r, const hidl_vec<EffectDescriptor>& result) { 101bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov if (r == Result::OK && result.size() > 0) { 102bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov gotEffect = true; 103bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov effectUuid = result[0].uuid; 104bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov } 105bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov }); 106b6438421923590b765905efe151e26129dce4094Steven Moreland ASSERT_TRUE(ret.isOk()); 107bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov ASSERT_TRUE(gotEffect); 108bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov Result retval = Result::NOT_INITIALIZED; 109bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov sp<IEffect> effect; 11010548295023bee99108e418499aff09fe578211eMikhail Naganov ret = effectsFactory->createEffect( 1119f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov effectUuid, 1 /*session*/, 1 /*ioHandle*/, 11210548295023bee99108e418499aff09fe578211eMikhail Naganov [&](Result r, const sp<IEffect>& result, uint64_t /*effectId*/) { 11310548295023bee99108e418499aff09fe578211eMikhail Naganov retval = r; 11410548295023bee99108e418499aff09fe578211eMikhail Naganov if (r == Result::OK) { 11510548295023bee99108e418499aff09fe578211eMikhail Naganov effect = result; 11610548295023bee99108e418499aff09fe578211eMikhail Naganov } 11710548295023bee99108e418499aff09fe578211eMikhail Naganov }); 118b6438421923590b765905efe151e26129dce4094Steven Moreland EXPECT_TRUE(ret.isOk()); 1199f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_EQ(Result::OK, retval); 1209f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_NE(nullptr, effect.get()); 121bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov} 122bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov 1239f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail NaganovTEST_F(AudioEffectsFactoryHidlTest, GetDescriptor) { 1249f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov description( 1259f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov "Verify that effects factory can provide an effect descriptor via " 1269f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov "GetDescriptor"); 127bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov hidl_vec<EffectDescriptor> allDescriptors; 128bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov Return<void> ret = effectsFactory->getAllDescriptors( 129bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov [&](Result r, const hidl_vec<EffectDescriptor>& result) { 130bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov if (r == Result::OK) { 131bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov allDescriptors = result; 132bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov } 133bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov }); 134b6438421923590b765905efe151e26129dce4094Steven Moreland ASSERT_TRUE(ret.isOk()); 135bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov ASSERT_GT(allDescriptors.size(), 0u); 136bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov for (size_t i = 0; i < allDescriptors.size(); ++i) { 137bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov ret = effectsFactory->getDescriptor( 138bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov allDescriptors[i].uuid, [&](Result r, const EffectDescriptor& result) { 139bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov EXPECT_EQ(r, Result::OK); 140bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov EXPECT_EQ(result, allDescriptors[i]); 141bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov }); 142bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov } 143b6438421923590b765905efe151e26129dce4094Steven Moreland EXPECT_TRUE(ret.isOk()); 144bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov} 145bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov 1463e6fe754f647db202a7a455adcf1ab5d686105d3Mikhail NaganovTEST_F(AudioEffectsFactoryHidlTest, DebugDumpInvalidArgument) { 1473e6fe754f647db202a7a455adcf1ab5d686105d3Mikhail Naganov description("Verify that debugDump doesn't crash on invalid arguments"); 1483e6fe754f647db202a7a455adcf1ab5d686105d3Mikhail Naganov Return<void> ret = effectsFactory->debugDump(hidl_handle()); 1493e6fe754f647db202a7a455adcf1ab5d686105d3Mikhail Naganov ASSERT_TRUE(ret.isOk()); 1503e6fe754f647db202a7a455adcf1ab5d686105d3Mikhail Naganov} 1513e6fe754f647db202a7a455adcf1ab5d686105d3Mikhail Naganov 1529f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov// Equalizer effect is required by CDD, but only the type is fixed. 1539f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov// This is the same UUID as AudioEffect.EFFECT_TYPE_EQUALIZER in Java. 1549f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganovstatic const Uuid EQUALIZER_EFFECT_TYPE = { 1559f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 0x0bed4300, 0xddd6, 0x11db, 0x8f34, 1569f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov std::array<uint8_t, 6>{{0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}}}; 1579f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov// Loudness Enhancer effect is required by CDD, but only the type is fixed. 1589f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov// This is the same UUID as AudioEffect.EFFECT_TYPE_LOUDNESS_ENHANCER in Java. 1599f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganovstatic const Uuid LOUDNESS_ENHANCER_EFFECT_TYPE = { 1609f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 0xfe3199be, 0xaed0, 0x413f, 0x87bb, 1619f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov std::array<uint8_t, 6>{{0x11, 0x26, 0x0e, 0xb6, 0x3c, 0xf1}}}; 1629f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 1639f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov// The main test class for Audio Effect HIDL HAL. 1649f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganovclass AudioEffectHidlTest : public ::testing::VtsHalHidlTargetTestBase { 1659f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov public: 1669f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov void SetUp() override { 1679f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov effectsFactory = 1689f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov ::testing::VtsHalHidlTargetTestBase::getService<IEffectsFactory>(); 1699f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov ASSERT_NE(nullptr, effectsFactory.get()); 1709f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 1719f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov findAndCreateEffect(getEffectType()); 1729f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov ASSERT_NE(nullptr, effect.get()); 1739f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 1749f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Return<Result> ret = effect->init(); 1759f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov ASSERT_TRUE(ret.isOk()); 1769f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov ASSERT_EQ(Result::OK, ret); 1779f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov } 1789f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 1799f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov void TearDown() override { 1809f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov effect.clear(); 1819f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov effectsFactory.clear(); 1829f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov } 1839f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 1849f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov protected: 1859f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov static void description(const std::string& description) { 1869f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov RecordProperty("description", description); 1879f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov } 1889f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 1899f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov virtual Uuid getEffectType() { return EQUALIZER_EFFECT_TYPE; } 1909f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 1919f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov void findAndCreateEffect(const Uuid& type); 1929f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov void findEffectInstance(const Uuid& type, Uuid* uuid); 1939f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov void getChannelCount(uint32_t* channelCount); 1949f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 1959f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov sp<IEffectsFactory> effectsFactory; 1969f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov sp<IEffect> effect; 1979f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov}; 1989f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 1999f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganovvoid AudioEffectHidlTest::findAndCreateEffect(const Uuid& type) { 2009f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Uuid effectUuid; 2019f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov findEffectInstance(type, &effectUuid); 2029f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Return<void> ret = effectsFactory->createEffect( 2039f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov effectUuid, 1 /*session*/, 1 /*ioHandle*/, 2049f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov [&](Result r, const sp<IEffect>& result, uint64_t /*effectId*/) { 2059f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov if (r == Result::OK) { 2069f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov effect = result; 2079f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov } 2089f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov }); 2099f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov ASSERT_TRUE(ret.isOk()); 2109f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov} 2119f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 2129f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganovvoid AudioEffectHidlTest::findEffectInstance(const Uuid& type, Uuid* uuid) { 2139f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov bool effectFound = false; 2149f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Return<void> ret = effectsFactory->getAllDescriptors( 2159f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov [&](Result r, const hidl_vec<EffectDescriptor>& result) { 2169f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov if (r == Result::OK) { 2179f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov for (const auto& desc : result) { 2189f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov if (desc.type == type) { 2199f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov effectFound = true; 2209f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov *uuid = desc.uuid; 2219f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov break; 2229f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov } 2239f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov } 2249f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov } 2259f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov }); 2269f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov ASSERT_TRUE(ret.isOk()); 2279f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov ASSERT_TRUE(effectFound); 2289f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov} 2299f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 2309f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganovvoid AudioEffectHidlTest::getChannelCount(uint32_t* channelCount) { 2319f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Result retval; 2329f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EffectConfig currentConfig; 2339f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Return<void> ret = effect->getConfig([&](Result r, const EffectConfig& conf) { 2349f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov retval = r; 2359f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov if (r == Result::OK) { 2369f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov currentConfig = conf; 2379f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov } 2389f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov }); 2399f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov ASSERT_TRUE(ret.isOk()); 2409f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov ASSERT_EQ(Result::OK, retval); 2419f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov ASSERT_TRUE(audio_channel_mask_is_valid( 2429f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov static_cast<audio_channel_mask_t>(currentConfig.outputCfg.channels))); 2439f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov *channelCount = audio_channel_count_from_out_mask( 2449f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov static_cast<audio_channel_mask_t>(currentConfig.outputCfg.channels)); 2459f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov} 2469f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 2479f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail NaganovTEST_F(AudioEffectHidlTest, Close) { 2489f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov description("Verify that an effect can be closed"); 2499f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Return<Result> ret = effect->close(); 2509f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_TRUE(ret.isOk()); 2519f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_EQ(Result::OK, ret); 2529f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov} 2539f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 2549f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail NaganovTEST_F(AudioEffectHidlTest, GetDescriptor) { 2559f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov description( 2569f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov "Verify that an effect can return its own descriptor via GetDescriptor"); 2579f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Result retval = Result::NOT_INITIALIZED; 2589f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Uuid actualType; 2599f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Return<void> ret = 2609f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov effect->getDescriptor([&](Result r, const EffectDescriptor& desc) { 2619f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov retval = r; 2629f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov if (r == Result::OK) { 2639f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov actualType = desc.type; 2649f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov } 2659f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov }); 2669f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_TRUE(ret.isOk()); 2679f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_EQ(Result::OK, retval); 2689f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_EQ(getEffectType(), actualType); 2699f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov} 2709f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 2719f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail NaganovTEST_F(AudioEffectHidlTest, GetSetConfig) { 2729f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov description( 2739f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov "Verify that it is possible to manipulate effect config via Get / " 2749f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov "SetConfig"); 2759f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Result retval = Result::NOT_INITIALIZED; 2769f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EffectConfig currentConfig; 2779f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Return<void> ret = effect->getConfig([&](Result r, const EffectConfig& conf) { 2789f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov retval = r; 2799f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov if (r == Result::OK) { 2809f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov currentConfig = conf; 2819f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov } 2829f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov }); 2839f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_TRUE(ret.isOk()); 2849f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_EQ(Result::OK, retval); 2859f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Return<Result> ret2 = effect->setConfig(currentConfig, nullptr, nullptr); 2869f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_TRUE(ret2.isOk()); 2879f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_EQ(Result::OK, ret2); 2889f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov} 2899f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 29005fa0d0312e8702b90944c522a95f98d67044bc2Mikhail NaganovTEST_F(AudioEffectHidlTest, GetConfigReverse) { 29105fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov description("Verify that GetConfigReverse does not crash"); 29205fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov Return<void> ret = 29305fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov effect->getConfigReverse([&](Result, const EffectConfig&) {}); 29405fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov EXPECT_TRUE(ret.isOk()); 29505fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov} 29605fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov 29705fa0d0312e8702b90944c522a95f98d67044bc2Mikhail NaganovTEST_F(AudioEffectHidlTest, GetSupportedAuxChannelsConfigs) { 29805fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov description("Verify that GetSupportedAuxChannelsConfigs does not crash"); 29905fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov Return<void> ret = effect->getSupportedAuxChannelsConfigs( 30005fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov 0, [&](Result, const hidl_vec<EffectAuxChannelsConfig>&) {}); 30105fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov EXPECT_TRUE(ret.isOk()); 30205fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov} 30305fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov 30405fa0d0312e8702b90944c522a95f98d67044bc2Mikhail NaganovTEST_F(AudioEffectHidlTest, GetAuxChannelsConfig) { 30505fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov description("Verify that GetAuxChannelsConfig does not crash"); 30605fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov Return<void> ret = effect->getAuxChannelsConfig( 30705fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov [&](Result, const EffectAuxChannelsConfig&) {}); 30805fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov EXPECT_TRUE(ret.isOk()); 30905fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov} 31005fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov 31105fa0d0312e8702b90944c522a95f98d67044bc2Mikhail NaganovTEST_F(AudioEffectHidlTest, SetAuxChannelsConfig) { 31205fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov description("Verify that SetAuxChannelsConfig does not crash"); 31305fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov Return<Result> ret = effect->setAuxChannelsConfig(EffectAuxChannelsConfig()); 31405fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov EXPECT_TRUE(ret.isOk()); 31505fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov} 31605fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov 3179f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov// Not generated automatically because AudioBuffer contains 3189f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov// instances of hidl_memory which can't be compared properly 3199f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov// in general case due to presence of handles. 3209f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov// 3219f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov// However, in this particular case, handles must not present 3229f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov// thus comparison is possible. 3239f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov// 3249f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov// operator== must be defined in the same namespace as the structures. 3259f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganovnamespace android { 3269f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganovnamespace hardware { 3279f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganovnamespace audio { 3289f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganovnamespace effect { 3299f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganovnamespace V2_0 { 3309f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganovinline bool operator==(const AudioBuffer& lhs, const AudioBuffer& rhs) { 3319f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov return lhs.id == rhs.id && lhs.frameCount == rhs.frameCount && 3329f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov lhs.data.handle() == nullptr && rhs.data.handle() == nullptr; 3339f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov} 3349f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 3359f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganovinline bool operator==(const EffectBufferConfig& lhs, 3369f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov const EffectBufferConfig& rhs) { 3379f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov return lhs.buffer == rhs.buffer && lhs.samplingRateHz == rhs.samplingRateHz && 3389f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov lhs.channels == rhs.channels && lhs.format == rhs.format && 3399f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov lhs.accessMode == rhs.accessMode && lhs.mask == rhs.mask; 3409f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov} 3419f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 3429f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganovinline bool operator==(const EffectConfig& lhs, const EffectConfig& rhs) { 3439f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov return lhs.inputCfg == rhs.inputCfg && lhs.outputCfg == rhs.outputCfg; 3449f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov} 3459f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov} // namespace V2_0 3469f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov} // namespace effect 3479f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov} // namespace audio 3489f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov} // namespace hardware 3499f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov} // namespace android 3509f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 3519f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail NaganovTEST_F(AudioEffectHidlTest, Reset) { 3529f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov description("Verify that Reset preserves effect configuration"); 3539f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Result retval = Result::NOT_INITIALIZED; 3549f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EffectConfig originalConfig; 3559f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Return<void> ret = effect->getConfig([&](Result r, const EffectConfig& conf) { 3569f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov retval = r; 3579f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov if (r == Result::OK) { 3589f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov originalConfig = conf; 3599f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov } 3609f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov }); 3619f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov ASSERT_TRUE(ret.isOk()); 3629f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov ASSERT_EQ(Result::OK, retval); 3639f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Return<Result> ret2 = effect->reset(); 3649f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_TRUE(ret2.isOk()); 3659f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_EQ(Result::OK, ret2); 3669f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EffectConfig configAfterReset; 3679f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov ret = effect->getConfig([&](Result r, const EffectConfig& conf) { 3689f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov retval = r; 3699f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov if (r == Result::OK) { 3709f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov configAfterReset = conf; 3719f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov } 3729f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov }); 3739f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_EQ(originalConfig, configAfterReset); 3749f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov} 3759f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 3769f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail NaganovTEST_F(AudioEffectHidlTest, DisableEnableDisable) { 3779f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov description("Verify Disable -> Enable -> Disable sequence for an effect"); 3789f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Return<Result> ret = effect->disable(); 3799f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_TRUE(ret.isOk()); 3809f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_EQ(Result::INVALID_ARGUMENTS, ret); 3819f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov ret = effect->enable(); 3829f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_TRUE(ret.isOk()); 3839f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_EQ(Result::OK, ret); 3849f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov ret = effect->disable(); 3859f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_TRUE(ret.isOk()); 3869f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_EQ(Result::OK, ret); 3879f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov} 3889f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 3899f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail NaganovTEST_F(AudioEffectHidlTest, SetDevice) { 3909f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov description("Verify that SetDevice works for an output chain effect"); 3919f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Return<Result> ret = effect->setDevice(AudioDevice::OUT_SPEAKER); 3929f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_TRUE(ret.isOk()); 3939f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_EQ(Result::OK, ret); 3949f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov} 3959f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 3969f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail NaganovTEST_F(AudioEffectHidlTest, SetAndGetVolume) { 3979f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov description("Verify that SetAndGetVolume method works for an effect"); 3989f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov uint32_t channelCount; 3999f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov getChannelCount(&channelCount); 4009f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov hidl_vec<uint32_t> volumes; 4019f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov volumes.resize(channelCount); 4029f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov for (uint32_t i = 0; i < channelCount; ++i) { 4039f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov volumes[i] = 0; 4049f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov } 4059f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Result retval = Result::NOT_INITIALIZED; 4069f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Return<void> ret = effect->setAndGetVolume( 4079f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov volumes, [&](Result r, const hidl_vec<uint32_t>&) { retval = r; }); 4089f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_TRUE(ret.isOk()); 4099f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_EQ(Result::OK, retval); 4109f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov} 4119f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 4129f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail NaganovTEST_F(AudioEffectHidlTest, VolumeChangeNotification) { 4139f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov description("Verify that effect accepts VolumeChangeNotification"); 4149f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov uint32_t channelCount; 4159f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov getChannelCount(&channelCount); 4169f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov hidl_vec<uint32_t> volumes; 4179f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov volumes.resize(channelCount); 4189f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov for (uint32_t i = 0; i < channelCount; ++i) { 4199f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov volumes[i] = 0; 4209f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov } 4219f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Return<Result> ret = effect->volumeChangeNotification(volumes); 4229f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_TRUE(ret.isOk()); 4239f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_EQ(Result::OK, ret); 4249f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov} 4259f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 4269f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail NaganovTEST_F(AudioEffectHidlTest, SetAudioMode) { 4279f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov description("Verify that SetAudioMode works for an effect"); 4289f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Return<Result> ret = effect->setAudioMode(AudioMode::NORMAL); 4299f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_TRUE(ret.isOk()); 4309f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_EQ(Result::OK, ret); 4319f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov} 4329f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 43305fa0d0312e8702b90944c522a95f98d67044bc2Mikhail NaganovTEST_F(AudioEffectHidlTest, SetConfigReverse) { 43405fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov description("Verify that SetConfigReverse does not crash"); 43505fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov Return<Result> ret = 43605fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov effect->setConfigReverse(EffectConfig(), nullptr, nullptr); 43705fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov EXPECT_TRUE(ret.isOk()); 43805fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov} 43905fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov 44005fa0d0312e8702b90944c522a95f98d67044bc2Mikhail NaganovTEST_F(AudioEffectHidlTest, SetInputDevice) { 44105fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov description("Verify that SetInputDevice does not crash"); 44205fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov Return<Result> ret = effect->setInputDevice(AudioDevice::IN_BUILTIN_MIC); 44305fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov EXPECT_TRUE(ret.isOk()); 44405fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov} 44505fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov 44605fa0d0312e8702b90944c522a95f98d67044bc2Mikhail NaganovTEST_F(AudioEffectHidlTest, SetAudioSource) { 44705fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov description("Verify that SetAudioSource does not crash"); 44805fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov Return<Result> ret = effect->setAudioSource(AudioSource::MIC); 44905fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov EXPECT_TRUE(ret.isOk()); 45005fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov} 45105fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov 4529f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail NaganovTEST_F(AudioEffectHidlTest, Offload) { 4535abb15e9872a203bf2e5a8b879ac4842c8cac789Mikhail Naganov description("Verify that calling Offload method does not crash"); 4549f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EffectOffloadParameter offloadParam; 4559f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov offloadParam.isOffload = false; 4569f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov offloadParam.ioHandle = 4579f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov static_cast<int>(AudioHandleConsts::AUDIO_IO_HANDLE_NONE); 4589f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Return<Result> ret = effect->offload(offloadParam); 4599f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_TRUE(ret.isOk()); 4609f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov} 4619f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 4629f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail NaganovTEST_F(AudioEffectHidlTest, PrepareForProcessing) { 4639f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov description("Verify that PrepareForProcessing method works for an effect"); 4649f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Result retval = Result::NOT_INITIALIZED; 4659f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Return<void> ret = effect->prepareForProcessing( 4669f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov [&](Result r, const MQDescriptorSync<Result>&) { retval = r; }); 4679f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_TRUE(ret.isOk()); 4689f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_EQ(Result::OK, retval); 4699f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov} 4709f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 4719f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail NaganovTEST_F(AudioEffectHidlTest, SetProcessBuffers) { 4729f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov description("Verify that SetProcessBuffers works for an effect"); 4739f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov sp<IAllocator> ashmem = IAllocator::getService("ashmem"); 4749f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov ASSERT_NE(nullptr, ashmem.get()); 4759f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov bool success = false; 4769f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov AudioBuffer buffer; 4779f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Return<void> ret = 4789f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov ashmem->allocate(1024, [&](bool s, const hidl_memory& memory) { 4799f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov success = s; 4809f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov if (s) { 4819f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov buffer.data = memory; 4829f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov } 4839f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov }); 4849f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov ASSERT_TRUE(ret.isOk()); 4859f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov ASSERT_TRUE(success); 4869f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Return<Result> ret2 = effect->setProcessBuffers(buffer, buffer); 4879f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_TRUE(ret2.isOk()); 4889f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_EQ(Result::OK, ret2); 4899f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov} 4909f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 49105fa0d0312e8702b90944c522a95f98d67044bc2Mikhail NaganovTEST_F(AudioEffectHidlTest, Command) { 49205fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov description("Verify that Command does not crash"); 49305fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov Return<void> ret = effect->command(0, hidl_vec<uint8_t>(), 0, 49405fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov [&](int32_t, const hidl_vec<uint8_t>&) {}); 49505fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov EXPECT_TRUE(ret.isOk()); 49605fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov} 49705fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov 49805fa0d0312e8702b90944c522a95f98d67044bc2Mikhail NaganovTEST_F(AudioEffectHidlTest, SetParameter) { 49905fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov description("Verify that SetParameter does not crash"); 50005fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov Return<Result> ret = 50105fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov effect->setParameter(hidl_vec<uint8_t>(), hidl_vec<uint8_t>()); 50205fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov EXPECT_TRUE(ret.isOk()); 50305fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov} 50405fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov 50505fa0d0312e8702b90944c522a95f98d67044bc2Mikhail NaganovTEST_F(AudioEffectHidlTest, GetParameter) { 50605fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov description("Verify that GetParameter does not crash"); 50705fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov Return<void> ret = effect->getParameter( 50805fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov hidl_vec<uint8_t>(), 0, [&](Result, const hidl_vec<uint8_t>&) {}); 50905fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov EXPECT_TRUE(ret.isOk()); 51005fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov} 51105fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov 51205fa0d0312e8702b90944c522a95f98d67044bc2Mikhail NaganovTEST_F(AudioEffectHidlTest, GetSupportedConfigsForFeature) { 51305fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov description("Verify that GetSupportedConfigsForFeature does not crash"); 51405fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov Return<void> ret = effect->getSupportedConfigsForFeature( 51505fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov 0, 0, 0, [&](Result, uint32_t, const hidl_vec<uint8_t>&) {}); 51605fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov EXPECT_TRUE(ret.isOk()); 51705fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov} 51805fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov 51905fa0d0312e8702b90944c522a95f98d67044bc2Mikhail NaganovTEST_F(AudioEffectHidlTest, GetCurrentConfigForFeature) { 52005fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov description("Verify that GetCurrentConfigForFeature does not crash"); 52105fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov Return<void> ret = effect->getCurrentConfigForFeature( 52205fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov 0, 0, [&](Result, const hidl_vec<uint8_t>&) {}); 52305fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov EXPECT_TRUE(ret.isOk()); 52405fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov} 52505fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov 52605fa0d0312e8702b90944c522a95f98d67044bc2Mikhail NaganovTEST_F(AudioEffectHidlTest, SetCurrentConfigForFeature) { 52705fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov description("Verify that SetCurrentConfigForFeature does not crash"); 52805fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov Return<Result> ret = 52905fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov effect->setCurrentConfigForFeature(0, hidl_vec<uint8_t>()); 53005fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov EXPECT_TRUE(ret.isOk()); 53105fa0d0312e8702b90944c522a95f98d67044bc2Mikhail Naganov} 5329f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 5339f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 5349f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov// The main test class for Equalizer Audio Effect HIDL HAL. 5359f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganovclass EqualizerAudioEffectHidlTest : public AudioEffectHidlTest { 5369f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov public: 5379f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov void SetUp() override { 5389f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov AudioEffectHidlTest::SetUp(); 5399f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov equalizer = IEqualizerEffect::castFrom(effect); 5409f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov ASSERT_NE(nullptr, equalizer.get()); 5419f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov } 5429f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 5439f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov protected: 5449f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Uuid getEffectType() override { return EQUALIZER_EFFECT_TYPE; } 5459f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov void getNumBands(uint16_t* numBands); 5469f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov void getLevelRange(int16_t* minLevel, int16_t* maxLevel); 5479f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov void getBandFrequencyRange(uint16_t band, uint32_t* minFreq, 5489f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov uint32_t* centerFreq, uint32_t* maxFreq); 5499f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov void getPresetCount(size_t* count); 5509f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 5519f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov sp<IEqualizerEffect> equalizer; 5529f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov}; 5539f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 5549f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganovvoid EqualizerAudioEffectHidlTest::getNumBands(uint16_t* numBands) { 5559f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Result retval = Result::NOT_INITIALIZED; 5569f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Return<void> ret = equalizer->getNumBands([&](Result r, uint16_t b) { 5579f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov retval = r; 5589f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov if (retval == Result::OK) { 5599f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov *numBands = b; 5609f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov } 5619f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov }); 5629f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov ASSERT_TRUE(ret.isOk()); 5639f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov ASSERT_EQ(Result::OK, retval); 5649f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov} 5659f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 5669f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganovvoid EqualizerAudioEffectHidlTest::getLevelRange(int16_t* minLevel, 5679f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov int16_t* maxLevel) { 5689f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Result retval = Result::NOT_INITIALIZED; 5699f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Return<void> ret = 5709f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov equalizer->getLevelRange([&](Result r, int16_t min, int16_t max) { 5719f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov retval = r; 5729f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov if (retval == Result::OK) { 5739f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov *minLevel = min; 5749f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov *maxLevel = max; 5759f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov } 5769f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov }); 5779f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov ASSERT_TRUE(ret.isOk()); 5789f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov ASSERT_EQ(Result::OK, retval); 5799f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov} 5809f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 5819f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganovvoid EqualizerAudioEffectHidlTest::getBandFrequencyRange(uint16_t band, 5829f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov uint32_t* minFreq, 5839f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov uint32_t* centerFreq, 5849f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov uint32_t* maxFreq) { 5859f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Result retval = Result::NOT_INITIALIZED; 5869f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Return<void> ret = equalizer->getBandFrequencyRange( 5879f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov band, [&](Result r, uint32_t min, uint32_t max) { 5889f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov retval = r; 5899f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov if (retval == Result::OK) { 5909f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov *minFreq = min; 5919f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov *maxFreq = max; 5929f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov } 5939f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov }); 5949f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov ASSERT_TRUE(ret.isOk()); 5959f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov ASSERT_EQ(Result::OK, retval); 5969f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov ret = equalizer->getBandCenterFrequency(band, [&](Result r, uint32_t center) { 5979f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov retval = r; 5989f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov if (retval == Result::OK) { 5999f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov *centerFreq = center; 6009f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov } 6019f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov }); 6029f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov ASSERT_TRUE(ret.isOk()); 6039f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov ASSERT_EQ(Result::OK, retval); 6049f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov} 6059f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 6069f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganovvoid EqualizerAudioEffectHidlTest::getPresetCount(size_t* count) { 6079f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Result retval = Result::NOT_INITIALIZED; 6089f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Return<void> ret = equalizer->getPresetNames( 6099f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov [&](Result r, const hidl_vec<hidl_string>& names) { 6109f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov retval = r; 6119f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov if (retval == Result::OK) { 6129f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov *count = names.size(); 6139f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov } 6149f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov }); 6159f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov ASSERT_TRUE(ret.isOk()); 6169f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov ASSERT_EQ(Result::OK, retval); 6179f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov} 6189f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 6199f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail NaganovTEST_F(EqualizerAudioEffectHidlTest, GetNumBands) { 6209f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov description("Verify that Equalizer effect reports at least one band"); 6219f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov uint16_t numBands = 0; 6229f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov getNumBands(&numBands); 6239f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_GT(numBands, 0); 6249f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov} 6259f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 6269f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail NaganovTEST_F(EqualizerAudioEffectHidlTest, GetLevelRange) { 6279f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov description("Verify that Equalizer effect reports adequate band level range"); 6289f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov int16_t minLevel = 0x7fff, maxLevel = 0; 6299f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov getLevelRange(&minLevel, &maxLevel); 6309f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_GT(maxLevel, minLevel); 6319f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov} 6329f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 6339f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail NaganovTEST_F(EqualizerAudioEffectHidlTest, GetSetBandLevel) { 6349f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov description( 6359f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov "Verify that manipulating band levels works for Equalizer effect"); 6369f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov uint16_t numBands = 0; 6379f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov getNumBands(&numBands); 6389f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov ASSERT_GT(numBands, 0); 6399f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov int16_t levels[3]{0x7fff, 0, 0}; 6409f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov getLevelRange(&levels[0], &levels[2]); 6419f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov ASSERT_GT(levels[2], levels[0]); 6429f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov levels[1] = (levels[2] + levels[0]) / 2; 6439f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov for (uint16_t i = 0; i < numBands; ++i) { 6449f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov for (size_t j = 0; j < ARRAY_SIZE(levels); ++j) { 6459f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Return<Result> ret = equalizer->setBandLevel(i, levels[j]); 6469f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_TRUE(ret.isOk()); 6479f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_EQ(Result::OK, ret); 6489f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Result retval = Result::NOT_INITIALIZED; 6499f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov int16_t actualLevel; 6509f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Return<void> ret2 = equalizer->getBandLevel(i, [&](Result r, int16_t l) { 6519f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov retval = r; 6529f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov if (retval == Result::OK) { 6539f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov actualLevel = l; 6549f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov } 6559f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov }); 6569f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_TRUE(ret2.isOk()); 6579f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_EQ(Result::OK, retval); 6589f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_EQ(levels[j], actualLevel); 6599f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov } 6609f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov } 6619f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov} 6629f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 6639f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail NaganovTEST_F(EqualizerAudioEffectHidlTest, GetBandCenterFrequencyAndRange) { 6649f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov description( 6659f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov "Verify that Equalizer effect reports adequate band frequency range"); 6669f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov uint16_t numBands = 0; 6679f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov getNumBands(&numBands); 6689f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov ASSERT_GT(numBands, 0); 6699f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov for (uint16_t i = 0; i < numBands; ++i) { 6709f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov uint32_t minFreq = 0xffffffff, centerFreq = 0xffffffff, 6719f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov maxFreq = 0xffffffff; 6729f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov getBandFrequencyRange(i, &minFreq, ¢erFreq, &maxFreq); 6739f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov // Note: NXP legacy implementation reports "1" as upper bound for last band, 6749f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov // so this check fails. 6759f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_GE(maxFreq, centerFreq); 6769f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_GE(centerFreq, minFreq); 6779f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov } 6789f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov} 6799f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 6809f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail NaganovTEST_F(EqualizerAudioEffectHidlTest, GetBandForFrequency) { 6819f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov description( 6829f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov "Verify that Equalizer effect supports GetBandForFrequency correctly"); 6839f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov uint16_t numBands = 0; 6849f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov getNumBands(&numBands); 6859f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov ASSERT_GT(numBands, 0); 6869f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov for (uint16_t i = 0; i < numBands; ++i) { 6879f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov uint32_t freqs[3]{0, 0, 0}; 6889f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov getBandFrequencyRange(i, &freqs[0], &freqs[1], &freqs[2]); 6899f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov // NXP legacy implementation reports "1" as upper bound for last band, some 6909f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov // of the checks fail. 6919f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov for (size_t j = 0; j < ARRAY_SIZE(freqs); ++j) { 6929f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov if (j == 0) { 6939f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov freqs[j]++; 6949f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov } // Min frequency is an open interval. 6959f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Result retval = Result::NOT_INITIALIZED; 6969f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov uint16_t actualBand = numBands + 1; 6979f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Return<void> ret = 6989f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov equalizer->getBandForFrequency(freqs[j], [&](Result r, uint16_t b) { 6999f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov retval = r; 7009f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov if (retval == Result::OK) { 7019f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov actualBand = b; 7029f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov } 7039f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov }); 7049f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_TRUE(ret.isOk()); 7059f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_EQ(Result::OK, retval); 7069f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_EQ(i, actualBand) << "Frequency: " << freqs[j]; 7079f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov } 7089f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov } 7099f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov} 7109f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 7119f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail NaganovTEST_F(EqualizerAudioEffectHidlTest, GetPresetNames) { 7129f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov description("Verify that Equalizer effect reports at least one preset"); 7139f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov size_t presetCount; 7149f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov getPresetCount(&presetCount); 7159f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_GT(presetCount, 0u); 7169f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov} 7179f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 7189f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail NaganovTEST_F(EqualizerAudioEffectHidlTest, GetSetCurrentPreset) { 7199f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov description( 7209f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov "Verify that manipulating the current preset for Equalizer effect"); 7219f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov size_t presetCount; 7229f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov getPresetCount(&presetCount); 7239f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov ASSERT_GT(presetCount, 0u); 7249f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov for (uint16_t i = 0; i < presetCount; ++i) { 7259f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Return<Result> ret = equalizer->setCurrentPreset(i); 7269f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_TRUE(ret.isOk()); 7279f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_EQ(Result::OK, ret); 7289f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Result retval = Result::NOT_INITIALIZED; 7299f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov uint16_t actualPreset = 0xffff; 7309f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Return<void> ret2 = equalizer->getCurrentPreset([&](Result r, uint16_t p) { 7319f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov retval = r; 7329f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov if (retval == Result::OK) { 7339f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov actualPreset = p; 7349f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov } 7359f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov }); 7369f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_TRUE(ret2.isOk()); 7379f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_EQ(Result::OK, retval); 7389f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_EQ(i, actualPreset); 7399f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov } 7409f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov} 7419f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 7429f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail NaganovTEST_F(EqualizerAudioEffectHidlTest, GetSetAllProperties) { 7439f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov description( 7449f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov "Verify that setting band levels and presets works via Get / " 7459f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov "SetAllProperties for Equalizer effect"); 7469f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov using AllProperties = 7479f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov android::hardware::audio::effect::V2_0::IEqualizerEffect::AllProperties; 7489f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov uint16_t numBands = 0; 7499f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov getNumBands(&numBands); 7509f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov ASSERT_GT(numBands, 0); 7519f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov AllProperties props; 7529f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov props.bandLevels.resize(numBands); 7539f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov for (size_t i = 0; i < numBands; ++i) { 7549f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov props.bandLevels[i] = 0; 7559f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov } 7569f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 7579f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov AllProperties actualProps; 7589f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Result retval = Result::NOT_INITIALIZED; 7599f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 7609f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov // Verify setting of the band levels via properties. 7619f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov props.curPreset = -1; 7629f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Return<Result> ret = equalizer->setAllProperties(props); 7639f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_TRUE(ret.isOk()); 7649f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_EQ(Result::OK, ret); 7659f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Return<void> ret2 = 7669f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov equalizer->getAllProperties([&](Result r, AllProperties p) { 7679f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov retval = r; 7689f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov if (retval == Result::OK) { 7699f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov actualProps = p; 7709f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov } 7719f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov }); 7729f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_TRUE(ret2.isOk()); 7739f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_EQ(Result::OK, retval); 7749f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_EQ(props.bandLevels, actualProps.bandLevels); 7759f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 7769f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov // Verify setting of the current preset via properties. 7779f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov props.curPreset = 0; // Assuming there is at least one preset. 7789f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov ret = equalizer->setAllProperties(props); 7799f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_TRUE(ret.isOk()); 7809f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_EQ(Result::OK, ret); 7819f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov ret2 = equalizer->getAllProperties([&](Result r, AllProperties p) { 7829f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov retval = r; 7839f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov if (retval == Result::OK) { 7849f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov actualProps = p; 7859f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov } 7869f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov }); 7879f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_TRUE(ret2.isOk()); 7889f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_EQ(Result::OK, retval); 7899f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_EQ(props.curPreset, actualProps.curPreset); 7909f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov} 7919f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 7929f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov// The main test class for Equalizer Audio Effect HIDL HAL. 7939f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganovclass LoudnessEnhancerAudioEffectHidlTest : public AudioEffectHidlTest { 7949f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov public: 7959f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov void SetUp() override { 7969f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov AudioEffectHidlTest::SetUp(); 7979f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov enhancer = ILoudnessEnhancerEffect::castFrom(effect); 7989f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov ASSERT_NE(nullptr, enhancer.get()); 7999f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov } 8009f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 8019f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov protected: 8029f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Uuid getEffectType() override { return LOUDNESS_ENHANCER_EFFECT_TYPE; } 8039f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 8049f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov sp<ILoudnessEnhancerEffect> enhancer; 8059f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov}; 8069f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov 8079f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail NaganovTEST_F(LoudnessEnhancerAudioEffectHidlTest, GetSetTargetGain) { 8089f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov description( 8099f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov "Verify that manipulating the target gain works for Loudness Enhancer " 8109f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov "effect"); 8119f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov const int32_t gain = 100; 8129f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Return<Result> ret = enhancer->setTargetGain(gain); 8139f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_TRUE(ret.isOk()); 8149f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_EQ(Result::OK, ret); 8159f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov int32_t actualGain = 0; 8169f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Result retval; 8179f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov Return<void> ret2 = enhancer->getTargetGain([&](Result r, int32_t g) { 8189f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov retval = r; 8199f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov if (retval == Result::OK) { 8209f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov actualGain = g; 8219f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov } 8229f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov }); 8239f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_TRUE(ret2.isOk()); 8249f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_EQ(Result::OK, retval); 8259f2890458a2e0b9fa09ceeba64c869bf3f1560c3Mikhail Naganov EXPECT_EQ(gain, actualGain); 826bf39317f3793a04ab43e921ee2cbb9f72ef003c9Mikhail Naganov} 827