blob: 3c712b5ca3317d976d3ce9744b412e3b2390866e [file] [log] [blame]
Mikhail Naganovbf393172016-11-11 16:24:50 -08001/*
Kevin Rocard96d2cd92018-11-14 16:22:07 -08002 * Copyright (C) 2018 The Android Open Source Project
Mikhail Naganovbf393172016-11-11 16:24:50 -08003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_TAG "AudioEffectHidlHalTest"
18#include <android-base/logging.h>
Mikhail Naganov9f289042017-02-23 08:39:36 -080019#include <system/audio.h>
Mikhail Naganovbf393172016-11-11 16:24:50 -080020
Kevin Rocard96d2cd92018-11-14 16:22:07 -080021#include PATH(android/hardware/audio/effect/FILE_VERSION/IEffect.h)
22#include PATH(android/hardware/audio/effect/FILE_VERSION/IEffectsFactory.h)
23#include PATH(android/hardware/audio/effect/FILE_VERSION/IEqualizerEffect.h)
24#include PATH(android/hardware/audio/effect/FILE_VERSION/ILoudnessEnhancerEffect.h)
25#include PATH(android/hardware/audio/effect/FILE_VERSION/types.h)
Mikhail Naganov9f289042017-02-23 08:39:36 -080026#include <android/hidl/allocator/1.0/IAllocator.h>
27#include <android/hidl/memory/1.0/IMemory.h>
Mikhail Naganovbf393172016-11-11 16:24:50 -080028
Kevin Rocardf5305b32018-11-13 10:41:53 -080029#include <common/all-versions/VersionUtils.h>
30
Mikhail Naganov315ce412019-10-23 16:46:54 -070031#if MAJOR_VERSION <= 5
Yuexi Maed2bb4e2017-03-10 00:44:45 -080032#include <VtsHalHidlTargetTestBase.h>
Zhuoyao Zhang7dc6ce82018-02-08 12:44:27 -080033#include <VtsHalHidlTargetTestEnvBase.h>
Mikhail Naganov315ce412019-10-23 16:46:54 -070034#elif MAJOR_VERSION >= 6
35#include <gtest/gtest.h>
36#include <hidl/GtestPrinter.h>
37#include <hidl/ServiceManagement.h>
38#endif
Mikhail Naganovbf393172016-11-11 16:24:50 -080039
Mikhail Naganov00a44c02018-12-14 14:31:45 -080040using ::android::sp;
41using ::android::hardware::hidl_handle;
42using ::android::hardware::hidl_memory;
43using ::android::hardware::hidl_string;
44using ::android::hardware::hidl_vec;
45using ::android::hardware::MQDescriptorSync;
46using ::android::hardware::Return;
47using ::android::hardware::Void;
48using ::android::hardware::audio::common::utils::mkEnumBitfield;
49using ::android::hidl::allocator::V1_0::IAllocator;
50using ::android::hidl::memory::V1_0::IMemory;
51using namespace ::android::hardware::audio::common::CPP_VERSION;
52using namespace ::android::hardware::audio::effect::CPP_VERSION;
Mikhail Naganovbf393172016-11-11 16:24:50 -080053
Mikhail Naganov9f289042017-02-23 08:39:36 -080054#ifndef ARRAY_SIZE
55#define ARRAY_SIZE(a) (sizeof(a) / sizeof(*(a)))
56#endif
57
Mikhail Naganov315ce412019-10-23 16:46:54 -070058#if MAJOR_VERSION <= 5
59// For HAL versions 2..5 Vts Environment and Test base classes are used.
60// The tests are non-parametrized.
61#define EFFECT_TEST TEST_F
62
Zhuoyao Zhang7dc6ce82018-02-08 12:44:27 -080063// Test environment for Audio Effects Factory HIDL HAL.
64class AudioEffectsFactoryHidlEnvironment : public ::testing::VtsHalHidlTargetTestEnvBase {
65 public:
66 // get the test environment singleton
67 static AudioEffectsFactoryHidlEnvironment* Instance() {
68 static AudioEffectsFactoryHidlEnvironment* instance =
69 new AudioEffectsFactoryHidlEnvironment;
70 return instance;
71 }
72
73 virtual void registerTestServices() override { registerTestService<IEffectsFactory>(); }
74};
75
Mikhail Naganov9f289042017-02-23 08:39:36 -080076// The main test class for Audio Effects Factory HIDL HAL.
77class AudioEffectsFactoryHidlTest : public ::testing::VtsHalHidlTargetTestBase {
Kevin Rocard55b10612018-11-12 12:33:16 -080078 public:
79 void SetUp() override {
80 effectsFactory = ::testing::VtsHalHidlTargetTestBase::getService<IEffectsFactory>(
81 AudioEffectsFactoryHidlEnvironment::Instance()->getServiceName<IEffectsFactory>());
82 ASSERT_NE(effectsFactory, nullptr);
83 }
Mikhail Naganovbf393172016-11-11 16:24:50 -080084
Mikhail Naganov315ce412019-10-23 16:46:54 -070085#elif MAJOR_VERSION >= 6
86// For HAL version 6 and above, standard GTest Environment and Test base classes are used.
87// The tests are parametrized by the IEffectsFactory instance name.
88#define EFFECT_TEST TEST_P
89
90class AudioEffectsFactoryHidlTest : public ::testing::TestWithParam<std::string> {
91 public:
92 void SetUp() override {
93 effectsFactory = IEffectsFactory::getService(GetParam());
94 ASSERT_NE(effectsFactory, nullptr);
95 }
96#endif // The rest of the AudioEffectsFactoryHidlTest class definition is the same.
Kevin Rocard55b10612018-11-12 12:33:16 -080097 void TearDown() override { effectsFactory.clear(); }
Mikhail Naganov9f289042017-02-23 08:39:36 -080098
Kevin Rocard55b10612018-11-12 12:33:16 -080099 protected:
100 static void description(const std::string& description) {
101 RecordProperty("description", description);
102 }
Mikhail Naganovbf393172016-11-11 16:24:50 -0800103
Kevin Rocard55b10612018-11-12 12:33:16 -0800104 sp<IEffectsFactory> effectsFactory;
Mikhail Naganovbf393172016-11-11 16:24:50 -0800105};
106
Mikhail Naganov315ce412019-10-23 16:46:54 -0700107EFFECT_TEST(AudioEffectsFactoryHidlTest, EnumerateEffects) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800108 description("Verify that EnumerateEffects returns at least one effect");
109 Result retval = Result::NOT_INITIALIZED;
110 size_t effectCount = 0;
111 Return<void> ret =
112 effectsFactory->getAllDescriptors([&](Result r, const hidl_vec<EffectDescriptor>& result) {
113 retval = r;
114 effectCount = result.size();
115 });
116 EXPECT_TRUE(ret.isOk());
117 EXPECT_EQ(Result::OK, retval);
118 EXPECT_GT(effectCount, 0u);
Mikhail Naganovbf393172016-11-11 16:24:50 -0800119}
120
Mikhail Naganov315ce412019-10-23 16:46:54 -0700121EFFECT_TEST(AudioEffectsFactoryHidlTest, CreateEffect) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800122 description("Verify that an effect can be created via CreateEffect");
123 bool gotEffect = false;
124 Uuid effectUuid;
125 Return<void> ret =
126 effectsFactory->getAllDescriptors([&](Result r, const hidl_vec<EffectDescriptor>& result) {
127 if (r == Result::OK && result.size() > 0) {
128 gotEffect = true;
129 effectUuid = result[0].uuid;
130 }
131 });
132 ASSERT_TRUE(ret.isOk());
133 ASSERT_TRUE(gotEffect);
134 Result retval = Result::NOT_INITIALIZED;
135 sp<IEffect> effect;
136 ret = effectsFactory->createEffect(
137 effectUuid, 1 /*session*/, 1 /*ioHandle*/,
138 [&](Result r, const sp<IEffect>& result, uint64_t /*effectId*/) {
139 retval = r;
140 if (r == Result::OK) {
141 effect = result;
142 }
143 });
144 EXPECT_TRUE(ret.isOk());
145 EXPECT_EQ(Result::OK, retval);
146 EXPECT_NE(nullptr, effect.get());
Mikhail Naganovbf393172016-11-11 16:24:50 -0800147}
148
Mikhail Naganov315ce412019-10-23 16:46:54 -0700149EFFECT_TEST(AudioEffectsFactoryHidlTest, GetDescriptor) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800150 description(
151 "Verify that effects factory can provide an effect descriptor via "
152 "GetDescriptor");
153 hidl_vec<EffectDescriptor> allDescriptors;
154 Return<void> ret =
155 effectsFactory->getAllDescriptors([&](Result r, const hidl_vec<EffectDescriptor>& result) {
156 if (r == Result::OK) {
157 allDescriptors = result;
158 }
Mikhail Naganovbf393172016-11-11 16:24:50 -0800159 });
Kevin Rocard55b10612018-11-12 12:33:16 -0800160 ASSERT_TRUE(ret.isOk());
161 ASSERT_GT(allDescriptors.size(), 0u);
162 for (size_t i = 0; i < allDescriptors.size(); ++i) {
163 ret = effectsFactory->getDescriptor(allDescriptors[i].uuid,
164 [&](Result r, const EffectDescriptor& result) {
165 EXPECT_EQ(r, Result::OK);
166 EXPECT_EQ(result, allDescriptors[i]);
167 });
168 }
169 EXPECT_TRUE(ret.isOk());
Mikhail Naganovbf393172016-11-11 16:24:50 -0800170}
171
Mikhail Naganov315ce412019-10-23 16:46:54 -0700172EFFECT_TEST(AudioEffectsFactoryHidlTest, DebugDumpInvalidArgument) {
Mikhail Naganov3e6fe752017-04-24 10:44:08 -0700173 description("Verify that debugDump doesn't crash on invalid arguments");
Kevin Rocard96d2cd92018-11-14 16:22:07 -0800174#if MAJOR_VERSION == 2
Mikhail Naganov3e6fe752017-04-24 10:44:08 -0700175 Return<void> ret = effectsFactory->debugDump(hidl_handle());
Kevin Rocard20614ba2018-11-10 07:20:17 -0800176#elif MAJOR_VERSION >= 4
Kevin Rocard96d2cd92018-11-14 16:22:07 -0800177 Return<void> ret = effectsFactory->debug(hidl_handle(), {});
178#endif
Mikhail Naganov3e6fe752017-04-24 10:44:08 -0700179 ASSERT_TRUE(ret.isOk());
180}
181
Mikhail Naganov9f289042017-02-23 08:39:36 -0800182// Equalizer effect is required by CDD, but only the type is fixed.
183// This is the same UUID as AudioEffect.EFFECT_TYPE_EQUALIZER in Java.
184static const Uuid EQUALIZER_EFFECT_TYPE = {
185 0x0bed4300, 0xddd6, 0x11db, 0x8f34,
186 std::array<uint8_t, 6>{{0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}}};
187// Loudness Enhancer effect is required by CDD, but only the type is fixed.
188// This is the same UUID as AudioEffect.EFFECT_TYPE_LOUDNESS_ENHANCER in Java.
189static const Uuid LOUDNESS_ENHANCER_EFFECT_TYPE = {
190 0xfe3199be, 0xaed0, 0x413f, 0x87bb,
191 std::array<uint8_t, 6>{{0x11, 0x26, 0x0e, 0xb6, 0x3c, 0xf1}}};
192
193// The main test class for Audio Effect HIDL HAL.
Mikhail Naganov315ce412019-10-23 16:46:54 -0700194#if MAJOR_VERSION <= 5
Mikhail Naganov9f289042017-02-23 08:39:36 -0800195class AudioEffectHidlTest : public ::testing::VtsHalHidlTargetTestBase {
Kevin Rocard55b10612018-11-12 12:33:16 -0800196 public:
197 void SetUp() override {
198 effectsFactory = ::testing::VtsHalHidlTargetTestBase::getService<IEffectsFactory>();
Mikhail Naganov315ce412019-10-23 16:46:54 -0700199#elif MAJOR_VERSION >= 6
200class AudioEffectHidlTest : public ::testing::TestWithParam<std::string> {
201 public:
202 void SetUp() override {
203 effectsFactory = IEffectsFactory::getService(GetParam());
204#endif
Kevin Rocard55b10612018-11-12 12:33:16 -0800205 ASSERT_NE(nullptr, effectsFactory.get());
Mikhail Naganov9f289042017-02-23 08:39:36 -0800206
Kevin Rocard55b10612018-11-12 12:33:16 -0800207 findAndCreateEffect(getEffectType());
208 ASSERT_NE(nullptr, effect.get());
Mikhail Naganov9f289042017-02-23 08:39:36 -0800209
Kevin Rocard55b10612018-11-12 12:33:16 -0800210 Return<Result> ret = effect->init();
211 ASSERT_TRUE(ret.isOk());
212 ASSERT_EQ(Result::OK, ret);
213 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800214
Kevin Rocard55b10612018-11-12 12:33:16 -0800215 void TearDown() override {
216 effect.clear();
217 effectsFactory.clear();
218 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800219
Kevin Rocard55b10612018-11-12 12:33:16 -0800220 protected:
221 static void description(const std::string& description) {
222 RecordProperty("description", description);
223 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800224
Kevin Rocard55b10612018-11-12 12:33:16 -0800225 virtual Uuid getEffectType() { return EQUALIZER_EFFECT_TYPE; }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800226
Kevin Rocard55b10612018-11-12 12:33:16 -0800227 void findAndCreateEffect(const Uuid& type);
228 void findEffectInstance(const Uuid& type, Uuid* uuid);
229 void getChannelCount(uint32_t* channelCount);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800230
Kevin Rocard55b10612018-11-12 12:33:16 -0800231 sp<IEffectsFactory> effectsFactory;
232 sp<IEffect> effect;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800233};
234
235void AudioEffectHidlTest::findAndCreateEffect(const Uuid& type) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800236 Uuid effectUuid;
237 findEffectInstance(type, &effectUuid);
238 Return<void> ret = effectsFactory->createEffect(
239 effectUuid, 1 /*session*/, 1 /*ioHandle*/,
240 [&](Result r, const sp<IEffect>& result, uint64_t /*effectId*/) {
241 if (r == Result::OK) {
242 effect = result;
243 }
244 });
245 ASSERT_TRUE(ret.isOk());
Mikhail Naganov9f289042017-02-23 08:39:36 -0800246}
247
248void AudioEffectHidlTest::findEffectInstance(const Uuid& type, Uuid* uuid) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800249 bool effectFound = false;
250 Return<void> ret =
251 effectsFactory->getAllDescriptors([&](Result r, const hidl_vec<EffectDescriptor>& result) {
252 if (r == Result::OK) {
253 for (const auto& desc : result) {
254 if (desc.type == type) {
255 effectFound = true;
256 *uuid = desc.uuid;
257 break;
258 }
259 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800260 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800261 });
262 ASSERT_TRUE(ret.isOk());
263 ASSERT_TRUE(effectFound);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800264}
265
266void AudioEffectHidlTest::getChannelCount(uint32_t* channelCount) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800267 Result retval;
268 EffectConfig currentConfig;
269 Return<void> ret = effect->getConfig([&](Result r, const EffectConfig& conf) {
270 retval = r;
271 if (r == Result::OK) {
272 currentConfig = conf;
273 }
274 });
275 ASSERT_TRUE(ret.isOk());
276 ASSERT_EQ(Result::OK, retval);
277 ASSERT_TRUE(audio_channel_mask_is_valid(
278 static_cast<audio_channel_mask_t>(currentConfig.outputCfg.channels)));
279 *channelCount = audio_channel_count_from_out_mask(
280 static_cast<audio_channel_mask_t>(currentConfig.outputCfg.channels));
Mikhail Naganov9f289042017-02-23 08:39:36 -0800281}
282
Mikhail Naganov315ce412019-10-23 16:46:54 -0700283EFFECT_TEST(AudioEffectHidlTest, Close) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800284 description("Verify that an effect can be closed");
285 Return<Result> ret = effect->close();
286 EXPECT_TRUE(ret.isOk());
287 EXPECT_EQ(Result::OK, ret);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800288}
289
Mikhail Naganov315ce412019-10-23 16:46:54 -0700290EFFECT_TEST(AudioEffectHidlTest, GetDescriptor) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800291 description("Verify that an effect can return its own descriptor via GetDescriptor");
292 Result retval = Result::NOT_INITIALIZED;
293 Uuid actualType;
294 Return<void> ret = effect->getDescriptor([&](Result r, const EffectDescriptor& desc) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800295 retval = r;
296 if (r == Result::OK) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800297 actualType = desc.type;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800298 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800299 });
300 EXPECT_TRUE(ret.isOk());
301 EXPECT_EQ(Result::OK, retval);
302 EXPECT_EQ(getEffectType(), actualType);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800303}
304
Mikhail Naganov315ce412019-10-23 16:46:54 -0700305EFFECT_TEST(AudioEffectHidlTest, GetSetConfig) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800306 description(
307 "Verify that it is possible to manipulate effect config via Get / "
308 "SetConfig");
309 Result retval = Result::NOT_INITIALIZED;
310 EffectConfig currentConfig;
311 Return<void> ret = effect->getConfig([&](Result r, const EffectConfig& conf) {
312 retval = r;
313 if (r == Result::OK) {
314 currentConfig = conf;
315 }
316 });
317 EXPECT_TRUE(ret.isOk());
318 EXPECT_EQ(Result::OK, retval);
319 Return<Result> ret2 = effect->setConfig(currentConfig, nullptr, nullptr);
320 EXPECT_TRUE(ret2.isOk());
321 EXPECT_EQ(Result::OK, ret2);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800322}
323
Mikhail Naganov315ce412019-10-23 16:46:54 -0700324EFFECT_TEST(AudioEffectHidlTest, GetConfigReverse) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800325 description("Verify that GetConfigReverse does not crash");
326 Return<void> ret = effect->getConfigReverse([&](Result, const EffectConfig&) {});
327 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700328}
329
Mikhail Naganov315ce412019-10-23 16:46:54 -0700330EFFECT_TEST(AudioEffectHidlTest, GetSupportedAuxChannelsConfigs) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800331 description("Verify that GetSupportedAuxChannelsConfigs does not crash");
332 Return<void> ret = effect->getSupportedAuxChannelsConfigs(
333 0, [&](Result, const hidl_vec<EffectAuxChannelsConfig>&) {});
334 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700335}
336
Mikhail Naganov315ce412019-10-23 16:46:54 -0700337EFFECT_TEST(AudioEffectHidlTest, GetAuxChannelsConfig) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800338 description("Verify that GetAuxChannelsConfig does not crash");
339 Return<void> ret = effect->getAuxChannelsConfig([&](Result, const EffectAuxChannelsConfig&) {});
340 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700341}
342
Mikhail Naganov315ce412019-10-23 16:46:54 -0700343EFFECT_TEST(AudioEffectHidlTest, SetAuxChannelsConfig) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800344 description("Verify that SetAuxChannelsConfig does not crash");
345 Return<Result> ret = effect->setAuxChannelsConfig(EffectAuxChannelsConfig());
346 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700347}
348
Mikhail Naganov9f289042017-02-23 08:39:36 -0800349// Not generated automatically because AudioBuffer contains
350// instances of hidl_memory which can't be compared properly
351// in general case due to presence of handles.
352//
353// However, in this particular case, handles must not present
354// thus comparison is possible.
355//
356// operator== must be defined in the same namespace as the structures.
357namespace android {
358namespace hardware {
359namespace audio {
360namespace effect {
Kevin Rocard96d2cd92018-11-14 16:22:07 -0800361namespace CPP_VERSION {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800362inline bool operator==(const AudioBuffer& lhs, const AudioBuffer& rhs) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800363 return lhs.id == rhs.id && lhs.frameCount == rhs.frameCount && lhs.data.handle() == nullptr &&
364 rhs.data.handle() == nullptr;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800365}
366
Kevin Rocard55b10612018-11-12 12:33:16 -0800367inline bool operator==(const EffectBufferConfig& lhs, const EffectBufferConfig& rhs) {
368 return lhs.buffer == rhs.buffer && lhs.samplingRateHz == rhs.samplingRateHz &&
369 lhs.channels == rhs.channels && lhs.format == rhs.format &&
370 lhs.accessMode == rhs.accessMode && lhs.mask == rhs.mask;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800371}
372
373inline bool operator==(const EffectConfig& lhs, const EffectConfig& rhs) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800374 return lhs.inputCfg == rhs.inputCfg && lhs.outputCfg == rhs.outputCfg;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800375}
Kevin Rocard96d2cd92018-11-14 16:22:07 -0800376} // namespace CPP_VERSION
Mikhail Naganov9f289042017-02-23 08:39:36 -0800377} // namespace effect
378} // namespace audio
379} // namespace hardware
380} // namespace android
381
Mikhail Naganov315ce412019-10-23 16:46:54 -0700382EFFECT_TEST(AudioEffectHidlTest, Reset) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800383 description("Verify that Reset preserves effect configuration");
384 Result retval = Result::NOT_INITIALIZED;
385 EffectConfig originalConfig;
386 Return<void> ret = effect->getConfig([&](Result r, const EffectConfig& conf) {
387 retval = r;
388 if (r == Result::OK) {
389 originalConfig = conf;
390 }
391 });
392 ASSERT_TRUE(ret.isOk());
393 ASSERT_EQ(Result::OK, retval);
394 Return<Result> ret2 = effect->reset();
395 EXPECT_TRUE(ret2.isOk());
396 EXPECT_EQ(Result::OK, ret2);
397 EffectConfig configAfterReset;
398 ret = effect->getConfig([&](Result r, const EffectConfig& conf) {
399 retval = r;
400 if (r == Result::OK) {
401 configAfterReset = conf;
402 }
403 });
404 EXPECT_EQ(originalConfig, configAfterReset);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800405}
406
Mikhail Naganov315ce412019-10-23 16:46:54 -0700407EFFECT_TEST(AudioEffectHidlTest, DisableEnableDisable) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800408 description("Verify Disable -> Enable -> Disable sequence for an effect");
409 Return<Result> ret = effect->disable();
410 EXPECT_TRUE(ret.isOk());
411 EXPECT_EQ(Result::INVALID_ARGUMENTS, ret);
412 ret = effect->enable();
413 EXPECT_TRUE(ret.isOk());
414 EXPECT_EQ(Result::OK, ret);
415 ret = effect->disable();
416 EXPECT_TRUE(ret.isOk());
417 EXPECT_EQ(Result::OK, ret);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800418}
419
Mikhail Naganov315ce412019-10-23 16:46:54 -0700420EFFECT_TEST(AudioEffectHidlTest, SetDevice) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800421 description("Verify that SetDevice works for an output chain effect");
Kevin Rocardf5305b32018-11-13 10:41:53 -0800422 Return<Result> ret = effect->setDevice(mkEnumBitfield(AudioDevice::OUT_SPEAKER));
Kevin Rocard55b10612018-11-12 12:33:16 -0800423 EXPECT_TRUE(ret.isOk());
424 EXPECT_EQ(Result::OK, ret);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800425}
426
Mikhail Naganov315ce412019-10-23 16:46:54 -0700427EFFECT_TEST(AudioEffectHidlTest, SetAndGetVolume) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800428 description("Verify that SetAndGetVolume method works for an effect");
429 uint32_t channelCount;
430 getChannelCount(&channelCount);
431 hidl_vec<uint32_t> volumes;
432 volumes.resize(channelCount);
433 for (uint32_t i = 0; i < channelCount; ++i) {
434 volumes[i] = 0;
435 }
436 Result retval = Result::NOT_INITIALIZED;
437 Return<void> ret =
438 effect->setAndGetVolume(volumes, [&](Result r, const hidl_vec<uint32_t>&) { retval = r; });
439 EXPECT_TRUE(ret.isOk());
440 EXPECT_EQ(Result::OK, retval);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800441}
442
Mikhail Naganov315ce412019-10-23 16:46:54 -0700443EFFECT_TEST(AudioEffectHidlTest, VolumeChangeNotification) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800444 description("Verify that effect accepts VolumeChangeNotification");
445 uint32_t channelCount;
446 getChannelCount(&channelCount);
447 hidl_vec<uint32_t> volumes;
448 volumes.resize(channelCount);
449 for (uint32_t i = 0; i < channelCount; ++i) {
450 volumes[i] = 0;
451 }
452 Return<Result> ret = effect->volumeChangeNotification(volumes);
453 EXPECT_TRUE(ret.isOk());
454 EXPECT_EQ(Result::OK, ret);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800455}
456
Mikhail Naganov315ce412019-10-23 16:46:54 -0700457EFFECT_TEST(AudioEffectHidlTest, SetAudioMode) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800458 description("Verify that SetAudioMode works for an effect");
459 Return<Result> ret = effect->setAudioMode(AudioMode::NORMAL);
460 EXPECT_TRUE(ret.isOk());
461 EXPECT_EQ(Result::OK, ret);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800462}
463
Mikhail Naganov315ce412019-10-23 16:46:54 -0700464EFFECT_TEST(AudioEffectHidlTest, SetConfigReverse) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800465 description("Verify that SetConfigReverse does not crash");
466 Return<Result> ret = effect->setConfigReverse(EffectConfig(), nullptr, nullptr);
467 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700468}
469
Mikhail Naganov315ce412019-10-23 16:46:54 -0700470EFFECT_TEST(AudioEffectHidlTest, SetInputDevice) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800471 description("Verify that SetInputDevice does not crash");
Kevin Rocardf5305b32018-11-13 10:41:53 -0800472 Return<Result> ret = effect->setInputDevice(mkEnumBitfield(AudioDevice::IN_BUILTIN_MIC));
Kevin Rocard55b10612018-11-12 12:33:16 -0800473 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700474}
475
Mikhail Naganov315ce412019-10-23 16:46:54 -0700476EFFECT_TEST(AudioEffectHidlTest, SetAudioSource) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800477 description("Verify that SetAudioSource does not crash");
478 Return<Result> ret = effect->setAudioSource(AudioSource::MIC);
479 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700480}
481
Mikhail Naganov315ce412019-10-23 16:46:54 -0700482EFFECT_TEST(AudioEffectHidlTest, Offload) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800483 description("Verify that calling Offload method does not crash");
484 EffectOffloadParameter offloadParam;
485 offloadParam.isOffload = false;
486 offloadParam.ioHandle = static_cast<int>(AudioHandleConsts::AUDIO_IO_HANDLE_NONE);
487 Return<Result> ret = effect->offload(offloadParam);
488 EXPECT_TRUE(ret.isOk());
Mikhail Naganov9f289042017-02-23 08:39:36 -0800489}
490
Mikhail Naganov315ce412019-10-23 16:46:54 -0700491EFFECT_TEST(AudioEffectHidlTest, PrepareForProcessing) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800492 description("Verify that PrepareForProcessing method works for an effect");
493 Result retval = Result::NOT_INITIALIZED;
494 Return<void> ret = effect->prepareForProcessing(
495 [&](Result r, const MQDescriptorSync<Result>&) { retval = r; });
496 EXPECT_TRUE(ret.isOk());
497 EXPECT_EQ(Result::OK, retval);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800498}
499
Mikhail Naganov315ce412019-10-23 16:46:54 -0700500EFFECT_TEST(AudioEffectHidlTest, SetProcessBuffers) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800501 description("Verify that SetProcessBuffers works for an effect");
502 sp<IAllocator> ashmem = IAllocator::getService("ashmem");
503 ASSERT_NE(nullptr, ashmem.get());
504 bool success = false;
505 AudioBuffer buffer;
506 Return<void> ret = ashmem->allocate(1024, [&](bool s, const hidl_memory& memory) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800507 success = s;
508 if (s) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800509 buffer.data = memory;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800510 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800511 });
512 ASSERT_TRUE(ret.isOk());
513 ASSERT_TRUE(success);
514 Return<Result> ret2 = effect->setProcessBuffers(buffer, buffer);
515 EXPECT_TRUE(ret2.isOk());
516 EXPECT_EQ(Result::OK, ret2);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800517}
518
Mikhail Naganov315ce412019-10-23 16:46:54 -0700519EFFECT_TEST(AudioEffectHidlTest, Command) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800520 description("Verify that Command does not crash");
521 Return<void> ret =
522 effect->command(0, hidl_vec<uint8_t>(), 0, [&](int32_t, const hidl_vec<uint8_t>&) {});
523 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700524}
Mikhail Naganov9f289042017-02-23 08:39:36 -0800525
Mikhail Naganov315ce412019-10-23 16:46:54 -0700526EFFECT_TEST(AudioEffectHidlTest, SetParameter) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800527 description("Verify that SetParameter does not crash");
528 Return<Result> ret = effect->setParameter(hidl_vec<uint8_t>(), hidl_vec<uint8_t>());
529 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700530}
531
Mikhail Naganov315ce412019-10-23 16:46:54 -0700532EFFECT_TEST(AudioEffectHidlTest, GetParameter) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800533 description("Verify that GetParameter does not crash");
534 Return<void> ret =
535 effect->getParameter(hidl_vec<uint8_t>(), 0, [&](Result, const hidl_vec<uint8_t>&) {});
536 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700537}
538
Mikhail Naganov315ce412019-10-23 16:46:54 -0700539EFFECT_TEST(AudioEffectHidlTest, GetSupportedConfigsForFeature) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800540 description("Verify that GetSupportedConfigsForFeature does not crash");
541 Return<void> ret = effect->getSupportedConfigsForFeature(
542 0, 0, 0, [&](Result, uint32_t, const hidl_vec<uint8_t>&) {});
543 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700544}
545
Mikhail Naganov315ce412019-10-23 16:46:54 -0700546EFFECT_TEST(AudioEffectHidlTest, GetCurrentConfigForFeature) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800547 description("Verify that GetCurrentConfigForFeature does not crash");
548 Return<void> ret =
549 effect->getCurrentConfigForFeature(0, 0, [&](Result, const hidl_vec<uint8_t>&) {});
550 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700551}
552
Mikhail Naganov315ce412019-10-23 16:46:54 -0700553EFFECT_TEST(AudioEffectHidlTest, SetCurrentConfigForFeature) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800554 description("Verify that SetCurrentConfigForFeature does not crash");
555 Return<Result> ret = effect->setCurrentConfigForFeature(0, hidl_vec<uint8_t>());
556 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700557}
558
Mikhail Naganov9f289042017-02-23 08:39:36 -0800559// The main test class for Equalizer Audio Effect HIDL HAL.
560class EqualizerAudioEffectHidlTest : public AudioEffectHidlTest {
Kevin Rocard55b10612018-11-12 12:33:16 -0800561 public:
562 void SetUp() override {
563 AudioEffectHidlTest::SetUp();
564 equalizer = IEqualizerEffect::castFrom(effect);
565 ASSERT_NE(nullptr, equalizer.get());
566 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800567
Kevin Rocard55b10612018-11-12 12:33:16 -0800568 protected:
569 Uuid getEffectType() override { return EQUALIZER_EFFECT_TYPE; }
570 void getNumBands(uint16_t* numBands);
571 void getLevelRange(int16_t* minLevel, int16_t* maxLevel);
572 void getBandFrequencyRange(uint16_t band, uint32_t* minFreq, uint32_t* centerFreq,
573 uint32_t* maxFreq);
574 void getPresetCount(size_t* count);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800575
Kevin Rocard55b10612018-11-12 12:33:16 -0800576 sp<IEqualizerEffect> equalizer;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800577};
578
579void EqualizerAudioEffectHidlTest::getNumBands(uint16_t* numBands) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800580 Result retval = Result::NOT_INITIALIZED;
581 Return<void> ret = equalizer->getNumBands([&](Result r, uint16_t b) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800582 retval = r;
583 if (retval == Result::OK) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800584 *numBands = b;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800585 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800586 });
587 ASSERT_TRUE(ret.isOk());
588 ASSERT_EQ(Result::OK, retval);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800589}
590
Kevin Rocard55b10612018-11-12 12:33:16 -0800591void EqualizerAudioEffectHidlTest::getLevelRange(int16_t* minLevel, int16_t* maxLevel) {
592 Result retval = Result::NOT_INITIALIZED;
593 Return<void> ret = equalizer->getLevelRange([&](Result r, int16_t min, int16_t max) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800594 retval = r;
595 if (retval == Result::OK) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800596 *minLevel = min;
597 *maxLevel = max;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800598 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800599 });
600 ASSERT_TRUE(ret.isOk());
601 ASSERT_EQ(Result::OK, retval);
602}
603
604void EqualizerAudioEffectHidlTest::getBandFrequencyRange(uint16_t band, uint32_t* minFreq,
605 uint32_t* centerFreq, uint32_t* maxFreq) {
606 Result retval = Result::NOT_INITIALIZED;
607 Return<void> ret =
608 equalizer->getBandFrequencyRange(band, [&](Result r, uint32_t min, uint32_t max) {
609 retval = r;
610 if (retval == Result::OK) {
611 *minFreq = min;
612 *maxFreq = max;
613 }
614 });
615 ASSERT_TRUE(ret.isOk());
616 ASSERT_EQ(Result::OK, retval);
617 ret = equalizer->getBandCenterFrequency(band, [&](Result r, uint32_t center) {
618 retval = r;
619 if (retval == Result::OK) {
620 *centerFreq = center;
621 }
622 });
623 ASSERT_TRUE(ret.isOk());
624 ASSERT_EQ(Result::OK, retval);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800625}
626
627void EqualizerAudioEffectHidlTest::getPresetCount(size_t* count) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800628 Result retval = Result::NOT_INITIALIZED;
629 Return<void> ret = equalizer->getPresetNames([&](Result r, const hidl_vec<hidl_string>& names) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800630 retval = r;
631 if (retval == Result::OK) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800632 *count = names.size();
Mikhail Naganov9f289042017-02-23 08:39:36 -0800633 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800634 });
635 ASSERT_TRUE(ret.isOk());
636 ASSERT_EQ(Result::OK, retval);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800637}
638
Mikhail Naganov315ce412019-10-23 16:46:54 -0700639EFFECT_TEST(EqualizerAudioEffectHidlTest, GetNumBands) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800640 description("Verify that Equalizer effect reports at least one band");
641 uint16_t numBands = 0;
642 getNumBands(&numBands);
643 EXPECT_GT(numBands, 0);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800644}
645
Mikhail Naganov315ce412019-10-23 16:46:54 -0700646EFFECT_TEST(EqualizerAudioEffectHidlTest, GetLevelRange) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800647 description("Verify that Equalizer effect reports adequate band level range");
648 int16_t minLevel = 0x7fff, maxLevel = 0;
649 getLevelRange(&minLevel, &maxLevel);
650 EXPECT_GT(maxLevel, minLevel);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800651}
652
Mikhail Naganov315ce412019-10-23 16:46:54 -0700653EFFECT_TEST(EqualizerAudioEffectHidlTest, GetSetBandLevel) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800654 description("Verify that manipulating band levels works for Equalizer effect");
655 uint16_t numBands = 0;
656 getNumBands(&numBands);
657 ASSERT_GT(numBands, 0);
658 int16_t levels[3]{0x7fff, 0, 0};
659 getLevelRange(&levels[0], &levels[2]);
660 ASSERT_GT(levels[2], levels[0]);
661 levels[1] = (levels[2] + levels[0]) / 2;
662 for (uint16_t i = 0; i < numBands; ++i) {
663 for (size_t j = 0; j < ARRAY_SIZE(levels); ++j) {
664 Return<Result> ret = equalizer->setBandLevel(i, levels[j]);
665 EXPECT_TRUE(ret.isOk());
666 EXPECT_EQ(Result::OK, ret);
667 Result retval = Result::NOT_INITIALIZED;
668 int16_t actualLevel;
669 Return<void> ret2 = equalizer->getBandLevel(i, [&](Result r, int16_t l) {
670 retval = r;
671 if (retval == Result::OK) {
672 actualLevel = l;
673 }
674 });
675 EXPECT_TRUE(ret2.isOk());
676 EXPECT_EQ(Result::OK, retval);
677 EXPECT_EQ(levels[j], actualLevel);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800678 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800679 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800680}
681
Mikhail Naganov315ce412019-10-23 16:46:54 -0700682EFFECT_TEST(EqualizerAudioEffectHidlTest, GetBandCenterFrequencyAndRange) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800683 description("Verify that Equalizer effect reports adequate band frequency range");
684 uint16_t numBands = 0;
685 getNumBands(&numBands);
686 ASSERT_GT(numBands, 0);
687 for (uint16_t i = 0; i < numBands; ++i) {
688 uint32_t minFreq = 0xffffffff, centerFreq = 0xffffffff, maxFreq = 0xffffffff;
689 getBandFrequencyRange(i, &minFreq, &centerFreq, &maxFreq);
690 // Note: NXP legacy implementation reports "1" as upper bound for last band,
691 // so this check fails.
692 EXPECT_GE(maxFreq, centerFreq);
693 EXPECT_GE(centerFreq, minFreq);
694 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800695}
696
Mikhail Naganov315ce412019-10-23 16:46:54 -0700697EFFECT_TEST(EqualizerAudioEffectHidlTest, GetBandForFrequency) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800698 description("Verify that Equalizer effect supports GetBandForFrequency correctly");
699 uint16_t numBands = 0;
700 getNumBands(&numBands);
701 ASSERT_GT(numBands, 0);
702 for (uint16_t i = 0; i < numBands; ++i) {
703 uint32_t freqs[3]{0, 0, 0};
704 getBandFrequencyRange(i, &freqs[0], &freqs[1], &freqs[2]);
705 // NXP legacy implementation reports "1" as upper bound for last band, some
706 // of the checks fail.
707 for (size_t j = 0; j < ARRAY_SIZE(freqs); ++j) {
708 if (j == 0) {
709 freqs[j]++;
710 } // Min frequency is an open interval.
711 Result retval = Result::NOT_INITIALIZED;
712 uint16_t actualBand = numBands + 1;
713 Return<void> ret = equalizer->getBandForFrequency(freqs[j], [&](Result r, uint16_t b) {
714 retval = r;
715 if (retval == Result::OK) {
716 actualBand = b;
717 }
718 });
719 EXPECT_TRUE(ret.isOk());
720 EXPECT_EQ(Result::OK, retval);
721 EXPECT_EQ(i, actualBand) << "Frequency: " << freqs[j];
722 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800723 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800724}
725
Mikhail Naganov315ce412019-10-23 16:46:54 -0700726EFFECT_TEST(EqualizerAudioEffectHidlTest, GetPresetNames) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800727 description("Verify that Equalizer effect reports at least one preset");
728 size_t presetCount;
729 getPresetCount(&presetCount);
730 EXPECT_GT(presetCount, 0u);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800731}
732
Mikhail Naganov315ce412019-10-23 16:46:54 -0700733EFFECT_TEST(EqualizerAudioEffectHidlTest, GetSetCurrentPreset) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800734 description("Verify that manipulating the current preset for Equalizer effect");
735 size_t presetCount;
736 getPresetCount(&presetCount);
737 ASSERT_GT(presetCount, 0u);
738 for (uint16_t i = 0; i < presetCount; ++i) {
739 Return<Result> ret = equalizer->setCurrentPreset(i);
740 EXPECT_TRUE(ret.isOk());
741 EXPECT_EQ(Result::OK, ret);
742 Result retval = Result::NOT_INITIALIZED;
743 uint16_t actualPreset = 0xffff;
744 Return<void> ret2 = equalizer->getCurrentPreset([&](Result r, uint16_t p) {
745 retval = r;
746 if (retval == Result::OK) {
747 actualPreset = p;
748 }
749 });
750 EXPECT_TRUE(ret2.isOk());
751 EXPECT_EQ(Result::OK, retval);
752 EXPECT_EQ(i, actualPreset);
753 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800754}
755
Mikhail Naganov315ce412019-10-23 16:46:54 -0700756EFFECT_TEST(EqualizerAudioEffectHidlTest, GetSetAllProperties) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800757 description(
758 "Verify that setting band levels and presets works via Get / "
759 "SetAllProperties for Equalizer effect");
Kevin Rocard96d2cd92018-11-14 16:22:07 -0800760 using AllProperties =
Mikhail Naganov00a44c02018-12-14 14:31:45 -0800761 ::android::hardware::audio::effect::CPP_VERSION::IEqualizerEffect::AllProperties;
Kevin Rocard55b10612018-11-12 12:33:16 -0800762 uint16_t numBands = 0;
763 getNumBands(&numBands);
764 ASSERT_GT(numBands, 0);
765 AllProperties props;
766 props.bandLevels.resize(numBands);
767 for (size_t i = 0; i < numBands; ++i) {
768 props.bandLevels[i] = 0;
769 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800770
Kevin Rocard55b10612018-11-12 12:33:16 -0800771 AllProperties actualProps;
772 Result retval = Result::NOT_INITIALIZED;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800773
Kevin Rocard55b10612018-11-12 12:33:16 -0800774 // Verify setting of the band levels via properties.
775 props.curPreset = -1;
776 Return<Result> ret = equalizer->setAllProperties(props);
777 EXPECT_TRUE(ret.isOk());
778 EXPECT_EQ(Result::OK, ret);
779 Return<void> ret2 = equalizer->getAllProperties([&](Result r, AllProperties p) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800780 retval = r;
781 if (retval == Result::OK) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800782 actualProps = p;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800783 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800784 });
785 EXPECT_TRUE(ret2.isOk());
786 EXPECT_EQ(Result::OK, retval);
787 EXPECT_EQ(props.bandLevels, actualProps.bandLevels);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800788
Kevin Rocard55b10612018-11-12 12:33:16 -0800789 // Verify setting of the current preset via properties.
790 props.curPreset = 0; // Assuming there is at least one preset.
791 ret = equalizer->setAllProperties(props);
792 EXPECT_TRUE(ret.isOk());
793 EXPECT_EQ(Result::OK, ret);
794 ret2 = equalizer->getAllProperties([&](Result r, AllProperties p) {
795 retval = r;
796 if (retval == Result::OK) {
797 actualProps = p;
798 }
799 });
800 EXPECT_TRUE(ret2.isOk());
801 EXPECT_EQ(Result::OK, retval);
802 EXPECT_EQ(props.curPreset, actualProps.curPreset);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800803}
804
805// The main test class for Equalizer Audio Effect HIDL HAL.
806class LoudnessEnhancerAudioEffectHidlTest : public AudioEffectHidlTest {
Kevin Rocard55b10612018-11-12 12:33:16 -0800807 public:
808 void SetUp() override {
809 AudioEffectHidlTest::SetUp();
810 enhancer = ILoudnessEnhancerEffect::castFrom(effect);
811 ASSERT_NE(nullptr, enhancer.get());
812 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800813
Kevin Rocard55b10612018-11-12 12:33:16 -0800814 protected:
815 Uuid getEffectType() override { return LOUDNESS_ENHANCER_EFFECT_TYPE; }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800816
Kevin Rocard55b10612018-11-12 12:33:16 -0800817 sp<ILoudnessEnhancerEffect> enhancer;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800818};
819
Mikhail Naganov315ce412019-10-23 16:46:54 -0700820EFFECT_TEST(LoudnessEnhancerAudioEffectHidlTest, GetSetTargetGain) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800821 description(
822 "Verify that manipulating the target gain works for Loudness Enhancer "
823 "effect");
824 const int32_t gain = 100;
825 Return<Result> ret = enhancer->setTargetGain(gain);
826 EXPECT_TRUE(ret.isOk());
827 EXPECT_EQ(Result::OK, ret);
828 int32_t actualGain = 0;
829 Result retval;
830 Return<void> ret2 = enhancer->getTargetGain([&](Result r, int32_t g) {
831 retval = r;
832 if (retval == Result::OK) {
833 actualGain = g;
834 }
835 });
836 EXPECT_TRUE(ret2.isOk());
837 EXPECT_EQ(Result::OK, retval);
838 EXPECT_EQ(gain, actualGain);
Mikhail Naganovbf393172016-11-11 16:24:50 -0800839}
Zhuoyao Zhang7dc6ce82018-02-08 12:44:27 -0800840
Mikhail Naganov315ce412019-10-23 16:46:54 -0700841#if MAJOR_VERSION <= 5
Zhuoyao Zhang7dc6ce82018-02-08 12:44:27 -0800842int main(int argc, char** argv) {
843 ::testing::AddGlobalTestEnvironment(AudioEffectsFactoryHidlEnvironment::Instance());
844 ::testing::InitGoogleTest(&argc, argv);
845 AudioEffectsFactoryHidlEnvironment::Instance()->init(&argc, argv);
846 int status = RUN_ALL_TESTS();
847 LOG(INFO) << "Test result = " << status;
848 return status;
849}
Mikhail Naganov315ce412019-10-23 16:46:54 -0700850#elif MAJOR_VERSION >= 6
851INSTANTIATE_TEST_SUITE_P(
852 EffectsFactory, AudioEffectsFactoryHidlTest,
853 testing::ValuesIn(android::hardware::getAllHalInstanceNames(IEffectsFactory::descriptor)),
854 android::hardware::PrintInstanceNameToString);
855INSTANTIATE_TEST_SUITE_P(
856 Equalizer, EqualizerAudioEffectHidlTest,
857 testing::ValuesIn(android::hardware::getAllHalInstanceNames(IEffectsFactory::descriptor)),
858 android::hardware::PrintInstanceNameToString);
859INSTANTIATE_TEST_SUITE_P(
860 LoudnessEnhancer, LoudnessEnhancerAudioEffectHidlTest,
861 testing::ValuesIn(android::hardware::getAllHalInstanceNames(IEffectsFactory::descriptor)),
862 android::hardware::PrintInstanceNameToString);
863#endif