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, &centerFreq, &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