blob: 070242fc9da1b8988497f4103723b9c7ebbed7f3 [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#include <gtest/gtest.h>
32#include <hidl/GtestPrinter.h>
33#include <hidl/ServiceManagement.h>
Mikhail Naganovbf393172016-11-11 16:24:50 -080034
Mikhail Naganov00a44c02018-12-14 14:31:45 -080035using ::android::sp;
36using ::android::hardware::hidl_handle;
37using ::android::hardware::hidl_memory;
38using ::android::hardware::hidl_string;
39using ::android::hardware::hidl_vec;
40using ::android::hardware::MQDescriptorSync;
41using ::android::hardware::Return;
42using ::android::hardware::Void;
43using ::android::hardware::audio::common::utils::mkEnumBitfield;
44using ::android::hidl::allocator::V1_0::IAllocator;
45using ::android::hidl::memory::V1_0::IMemory;
46using namespace ::android::hardware::audio::common::CPP_VERSION;
47using namespace ::android::hardware::audio::effect::CPP_VERSION;
Mikhail Naganovbf393172016-11-11 16:24:50 -080048
Mikhail Naganov9f289042017-02-23 08:39:36 -080049#ifndef ARRAY_SIZE
50#define ARRAY_SIZE(a) (sizeof(a) / sizeof(*(a)))
51#endif
52
Mikhail Naganov315ce412019-10-23 16:46:54 -070053class AudioEffectsFactoryHidlTest : public ::testing::TestWithParam<std::string> {
54 public:
55 void SetUp() override {
56 effectsFactory = IEffectsFactory::getService(GetParam());
57 ASSERT_NE(effectsFactory, nullptr);
58 }
Kevin Rocard55b10612018-11-12 12:33:16 -080059 void TearDown() override { effectsFactory.clear(); }
Mikhail Naganov9f289042017-02-23 08:39:36 -080060
Kevin Rocard55b10612018-11-12 12:33:16 -080061 protected:
62 static void description(const std::string& description) {
63 RecordProperty("description", description);
64 }
Mikhail Naganovbf393172016-11-11 16:24:50 -080065
Kevin Rocard55b10612018-11-12 12:33:16 -080066 sp<IEffectsFactory> effectsFactory;
Mikhail Naganovbf393172016-11-11 16:24:50 -080067};
68
nelsonli3c12e582019-12-12 13:53:49 +080069TEST_P(AudioEffectsFactoryHidlTest, EnumerateEffects) {
Kevin Rocard55b10612018-11-12 12:33:16 -080070 description("Verify that EnumerateEffects returns at least one effect");
71 Result retval = Result::NOT_INITIALIZED;
72 size_t effectCount = 0;
73 Return<void> ret =
74 effectsFactory->getAllDescriptors([&](Result r, const hidl_vec<EffectDescriptor>& result) {
75 retval = r;
76 effectCount = result.size();
77 });
78 EXPECT_TRUE(ret.isOk());
79 EXPECT_EQ(Result::OK, retval);
80 EXPECT_GT(effectCount, 0u);
Mikhail Naganovbf393172016-11-11 16:24:50 -080081}
82
nelsonli3c12e582019-12-12 13:53:49 +080083TEST_P(AudioEffectsFactoryHidlTest, CreateEffect) {
Kevin Rocard55b10612018-11-12 12:33:16 -080084 description("Verify that an effect can be created via CreateEffect");
85 bool gotEffect = false;
86 Uuid effectUuid;
87 Return<void> ret =
88 effectsFactory->getAllDescriptors([&](Result r, const hidl_vec<EffectDescriptor>& result) {
89 if (r == Result::OK && result.size() > 0) {
90 gotEffect = true;
91 effectUuid = result[0].uuid;
92 }
93 });
94 ASSERT_TRUE(ret.isOk());
95 ASSERT_TRUE(gotEffect);
96 Result retval = Result::NOT_INITIALIZED;
97 sp<IEffect> effect;
98 ret = effectsFactory->createEffect(
Eric Laurentd33e6932019-11-13 13:47:50 -080099 effectUuid, 1 /*session*/, 1 /*ioHandle*/,
100#if MAJOR_VERSION >= 6
101 0 /*device*/,
102#endif
103 [&](Result r, const sp<IEffect>& result, uint64_t /*effectId*/) {
104 retval = r;
105 if (r == Result::OK) {
106 effect = result;
107 }
108 });
Kevin Rocard55b10612018-11-12 12:33:16 -0800109 EXPECT_TRUE(ret.isOk());
110 EXPECT_EQ(Result::OK, retval);
111 EXPECT_NE(nullptr, effect.get());
Mikhail Naganovbf393172016-11-11 16:24:50 -0800112}
113
nelsonli3c12e582019-12-12 13:53:49 +0800114TEST_P(AudioEffectsFactoryHidlTest, GetDescriptor) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800115 description(
116 "Verify that effects factory can provide an effect descriptor via "
117 "GetDescriptor");
118 hidl_vec<EffectDescriptor> allDescriptors;
119 Return<void> ret =
120 effectsFactory->getAllDescriptors([&](Result r, const hidl_vec<EffectDescriptor>& result) {
121 if (r == Result::OK) {
122 allDescriptors = result;
123 }
Mikhail Naganovbf393172016-11-11 16:24:50 -0800124 });
Kevin Rocard55b10612018-11-12 12:33:16 -0800125 ASSERT_TRUE(ret.isOk());
126 ASSERT_GT(allDescriptors.size(), 0u);
127 for (size_t i = 0; i < allDescriptors.size(); ++i) {
128 ret = effectsFactory->getDescriptor(allDescriptors[i].uuid,
129 [&](Result r, const EffectDescriptor& result) {
130 EXPECT_EQ(r, Result::OK);
131 EXPECT_EQ(result, allDescriptors[i]);
132 });
133 }
134 EXPECT_TRUE(ret.isOk());
Mikhail Naganovbf393172016-11-11 16:24:50 -0800135}
136
nelsonli3c12e582019-12-12 13:53:49 +0800137TEST_P(AudioEffectsFactoryHidlTest, DebugDumpInvalidArgument) {
Mikhail Naganov3e6fe752017-04-24 10:44:08 -0700138 description("Verify that debugDump doesn't crash on invalid arguments");
Kevin Rocard96d2cd92018-11-14 16:22:07 -0800139#if MAJOR_VERSION == 2
Mikhail Naganov3e6fe752017-04-24 10:44:08 -0700140 Return<void> ret = effectsFactory->debugDump(hidl_handle());
Kevin Rocard20614ba2018-11-10 07:20:17 -0800141#elif MAJOR_VERSION >= 4
Kevin Rocard96d2cd92018-11-14 16:22:07 -0800142 Return<void> ret = effectsFactory->debug(hidl_handle(), {});
143#endif
Mikhail Naganov3e6fe752017-04-24 10:44:08 -0700144 ASSERT_TRUE(ret.isOk());
145}
146
Mikhail Naganov9f289042017-02-23 08:39:36 -0800147// Equalizer effect is required by CDD, but only the type is fixed.
148// This is the same UUID as AudioEffect.EFFECT_TYPE_EQUALIZER in Java.
149static const Uuid EQUALIZER_EFFECT_TYPE = {
150 0x0bed4300, 0xddd6, 0x11db, 0x8f34,
151 std::array<uint8_t, 6>{{0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}}};
152// Loudness Enhancer effect is required by CDD, but only the type is fixed.
153// This is the same UUID as AudioEffect.EFFECT_TYPE_LOUDNESS_ENHANCER in Java.
154static const Uuid LOUDNESS_ENHANCER_EFFECT_TYPE = {
155 0xfe3199be, 0xaed0, 0x413f, 0x87bb,
156 std::array<uint8_t, 6>{{0x11, 0x26, 0x0e, 0xb6, 0x3c, 0xf1}}};
157
Mikhail Naganov892d1472020-03-19 10:44:06 -0700158enum { PARAM_FACTORY_NAME, PARAM_EFFECT_UUID };
159using EffectParameter = std::tuple<std::string, Uuid>;
160
161static inline std::string EffectParameterToString(
162 const ::testing::TestParamInfo<EffectParameter>& info) {
163 return ::android::hardware::PrintInstanceNameToString(::testing::TestParamInfo<std::string>{
164 std::get<PARAM_FACTORY_NAME>(info.param), info.index});
165}
166
Mikhail Naganov9f289042017-02-23 08:39:36 -0800167// The main test class for Audio Effect HIDL HAL.
Mikhail Naganov892d1472020-03-19 10:44:06 -0700168class AudioEffectHidlTest : public ::testing::TestWithParam<EffectParameter> {
Mikhail Naganov315ce412019-10-23 16:46:54 -0700169 public:
170 void SetUp() override {
Mikhail Naganov892d1472020-03-19 10:44:06 -0700171 effectsFactory = IEffectsFactory::getService(std::get<PARAM_FACTORY_NAME>(GetParam()));
Kevin Rocard55b10612018-11-12 12:33:16 -0800172 ASSERT_NE(nullptr, effectsFactory.get());
Mikhail Naganov9f289042017-02-23 08:39:36 -0800173
Kevin Rocard55b10612018-11-12 12:33:16 -0800174 findAndCreateEffect(getEffectType());
175 ASSERT_NE(nullptr, effect.get());
Mikhail Naganov9f289042017-02-23 08:39:36 -0800176
Kevin Rocard55b10612018-11-12 12:33:16 -0800177 Return<Result> ret = effect->init();
178 ASSERT_TRUE(ret.isOk());
179 ASSERT_EQ(Result::OK, ret);
180 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800181
Kevin Rocard55b10612018-11-12 12:33:16 -0800182 void TearDown() override {
183 effect.clear();
184 effectsFactory.clear();
185 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800186
Kevin Rocard55b10612018-11-12 12:33:16 -0800187 protected:
188 static void description(const std::string& description) {
189 RecordProperty("description", description);
190 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800191
Mikhail Naganov892d1472020-03-19 10:44:06 -0700192 Uuid getEffectType() const { return std::get<PARAM_EFFECT_UUID>(GetParam()); }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800193
Kevin Rocard55b10612018-11-12 12:33:16 -0800194 void findAndCreateEffect(const Uuid& type);
195 void findEffectInstance(const Uuid& type, Uuid* uuid);
196 void getChannelCount(uint32_t* channelCount);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800197
Kevin Rocard55b10612018-11-12 12:33:16 -0800198 sp<IEffectsFactory> effectsFactory;
199 sp<IEffect> effect;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800200};
201
202void AudioEffectHidlTest::findAndCreateEffect(const Uuid& type) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800203 Uuid effectUuid;
204 findEffectInstance(type, &effectUuid);
205 Return<void> ret = effectsFactory->createEffect(
Eric Laurentd33e6932019-11-13 13:47:50 -0800206 effectUuid, 1 /*session*/, 1 /*ioHandle*/,
207#if MAJOR_VERSION >= 6
208 0 /*device*/,
209#endif
210 [&](Result r, const sp<IEffect>& result, uint64_t /*effectId*/) {
211 if (r == Result::OK) {
212 effect = result;
213 }
214 });
Kevin Rocard55b10612018-11-12 12:33:16 -0800215 ASSERT_TRUE(ret.isOk());
Mikhail Naganov9f289042017-02-23 08:39:36 -0800216}
217
218void AudioEffectHidlTest::findEffectInstance(const Uuid& type, Uuid* uuid) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800219 bool effectFound = false;
220 Return<void> ret =
221 effectsFactory->getAllDescriptors([&](Result r, const hidl_vec<EffectDescriptor>& result) {
222 if (r == Result::OK) {
223 for (const auto& desc : result) {
224 if (desc.type == type) {
225 effectFound = true;
226 *uuid = desc.uuid;
227 break;
228 }
229 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800230 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800231 });
232 ASSERT_TRUE(ret.isOk());
233 ASSERT_TRUE(effectFound);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800234}
235
236void AudioEffectHidlTest::getChannelCount(uint32_t* channelCount) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800237 Result retval;
238 EffectConfig currentConfig;
239 Return<void> ret = effect->getConfig([&](Result r, const EffectConfig& conf) {
240 retval = r;
241 if (r == Result::OK) {
242 currentConfig = conf;
243 }
244 });
245 ASSERT_TRUE(ret.isOk());
246 ASSERT_EQ(Result::OK, retval);
247 ASSERT_TRUE(audio_channel_mask_is_valid(
248 static_cast<audio_channel_mask_t>(currentConfig.outputCfg.channels)));
249 *channelCount = audio_channel_count_from_out_mask(
250 static_cast<audio_channel_mask_t>(currentConfig.outputCfg.channels));
Mikhail Naganov9f289042017-02-23 08:39:36 -0800251}
252
nelsonli3c12e582019-12-12 13:53:49 +0800253TEST_P(AudioEffectHidlTest, Close) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800254 description("Verify that an effect can be closed");
255 Return<Result> ret = effect->close();
256 EXPECT_TRUE(ret.isOk());
257 EXPECT_EQ(Result::OK, ret);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800258}
259
nelsonli3c12e582019-12-12 13:53:49 +0800260TEST_P(AudioEffectHidlTest, GetDescriptor) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800261 description("Verify that an effect can return its own descriptor via GetDescriptor");
262 Result retval = Result::NOT_INITIALIZED;
263 Uuid actualType;
264 Return<void> ret = effect->getDescriptor([&](Result r, const EffectDescriptor& desc) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800265 retval = r;
266 if (r == Result::OK) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800267 actualType = desc.type;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800268 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800269 });
270 EXPECT_TRUE(ret.isOk());
271 EXPECT_EQ(Result::OK, retval);
272 EXPECT_EQ(getEffectType(), actualType);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800273}
274
nelsonli3c12e582019-12-12 13:53:49 +0800275TEST_P(AudioEffectHidlTest, GetSetConfig) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800276 description(
277 "Verify that it is possible to manipulate effect config via Get / "
278 "SetConfig");
279 Result retval = Result::NOT_INITIALIZED;
280 EffectConfig currentConfig;
281 Return<void> ret = effect->getConfig([&](Result r, const EffectConfig& conf) {
282 retval = r;
283 if (r == Result::OK) {
284 currentConfig = conf;
285 }
286 });
287 EXPECT_TRUE(ret.isOk());
288 EXPECT_EQ(Result::OK, retval);
289 Return<Result> ret2 = effect->setConfig(currentConfig, nullptr, nullptr);
290 EXPECT_TRUE(ret2.isOk());
291 EXPECT_EQ(Result::OK, ret2);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800292}
293
nelsonli3c12e582019-12-12 13:53:49 +0800294TEST_P(AudioEffectHidlTest, GetConfigReverse) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800295 description("Verify that GetConfigReverse does not crash");
296 Return<void> ret = effect->getConfigReverse([&](Result, const EffectConfig&) {});
297 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700298}
299
nelsonli3c12e582019-12-12 13:53:49 +0800300TEST_P(AudioEffectHidlTest, GetSupportedAuxChannelsConfigs) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800301 description("Verify that GetSupportedAuxChannelsConfigs does not crash");
302 Return<void> ret = effect->getSupportedAuxChannelsConfigs(
303 0, [&](Result, const hidl_vec<EffectAuxChannelsConfig>&) {});
304 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700305}
306
nelsonli3c12e582019-12-12 13:53:49 +0800307TEST_P(AudioEffectHidlTest, GetAuxChannelsConfig) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800308 description("Verify that GetAuxChannelsConfig does not crash");
309 Return<void> ret = effect->getAuxChannelsConfig([&](Result, const EffectAuxChannelsConfig&) {});
310 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700311}
312
nelsonli3c12e582019-12-12 13:53:49 +0800313TEST_P(AudioEffectHidlTest, SetAuxChannelsConfig) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800314 description("Verify that SetAuxChannelsConfig does not crash");
315 Return<Result> ret = effect->setAuxChannelsConfig(EffectAuxChannelsConfig());
316 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700317}
318
Mikhail Naganov9f289042017-02-23 08:39:36 -0800319// Not generated automatically because AudioBuffer contains
320// instances of hidl_memory which can't be compared properly
321// in general case due to presence of handles.
322//
323// However, in this particular case, handles must not present
324// thus comparison is possible.
325//
326// operator== must be defined in the same namespace as the structures.
327namespace android {
328namespace hardware {
329namespace audio {
330namespace effect {
Kevin Rocard96d2cd92018-11-14 16:22:07 -0800331namespace CPP_VERSION {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800332inline bool operator==(const AudioBuffer& lhs, const AudioBuffer& rhs) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800333 return lhs.id == rhs.id && lhs.frameCount == rhs.frameCount && lhs.data.handle() == nullptr &&
334 rhs.data.handle() == nullptr;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800335}
336
Kevin Rocard55b10612018-11-12 12:33:16 -0800337inline bool operator==(const EffectBufferConfig& lhs, const EffectBufferConfig& rhs) {
338 return lhs.buffer == rhs.buffer && lhs.samplingRateHz == rhs.samplingRateHz &&
339 lhs.channels == rhs.channels && lhs.format == rhs.format &&
340 lhs.accessMode == rhs.accessMode && lhs.mask == rhs.mask;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800341}
342
343inline bool operator==(const EffectConfig& lhs, const EffectConfig& rhs) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800344 return lhs.inputCfg == rhs.inputCfg && lhs.outputCfg == rhs.outputCfg;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800345}
Kevin Rocard96d2cd92018-11-14 16:22:07 -0800346} // namespace CPP_VERSION
Mikhail Naganov9f289042017-02-23 08:39:36 -0800347} // namespace effect
348} // namespace audio
349} // namespace hardware
350} // namespace android
351
nelsonli3c12e582019-12-12 13:53:49 +0800352TEST_P(AudioEffectHidlTest, Reset) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800353 description("Verify that Reset preserves effect configuration");
354 Result retval = Result::NOT_INITIALIZED;
355 EffectConfig originalConfig;
356 Return<void> ret = effect->getConfig([&](Result r, const EffectConfig& conf) {
357 retval = r;
358 if (r == Result::OK) {
359 originalConfig = conf;
360 }
361 });
362 ASSERT_TRUE(ret.isOk());
363 ASSERT_EQ(Result::OK, retval);
364 Return<Result> ret2 = effect->reset();
365 EXPECT_TRUE(ret2.isOk());
366 EXPECT_EQ(Result::OK, ret2);
367 EffectConfig configAfterReset;
368 ret = effect->getConfig([&](Result r, const EffectConfig& conf) {
369 retval = r;
370 if (r == Result::OK) {
371 configAfterReset = conf;
372 }
373 });
374 EXPECT_EQ(originalConfig, configAfterReset);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800375}
376
nelsonli3c12e582019-12-12 13:53:49 +0800377TEST_P(AudioEffectHidlTest, DisableEnableDisable) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800378 description("Verify Disable -> Enable -> Disable sequence for an effect");
379 Return<Result> ret = effect->disable();
380 EXPECT_TRUE(ret.isOk());
Mikhail Naganov892d1472020-03-19 10:44:06 -0700381 // Note: some legacy effects may return -EINVAL (INVALID_ARGUMENTS),
382 // more canonical is to return -ENOSYS (NOT_SUPPORTED)
383 EXPECT_TRUE(ret == Result::NOT_SUPPORTED || ret == Result::INVALID_ARGUMENTS);
Kevin Rocard55b10612018-11-12 12:33:16 -0800384 ret = effect->enable();
385 EXPECT_TRUE(ret.isOk());
386 EXPECT_EQ(Result::OK, ret);
387 ret = effect->disable();
388 EXPECT_TRUE(ret.isOk());
389 EXPECT_EQ(Result::OK, ret);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800390}
391
nelsonli3c12e582019-12-12 13:53:49 +0800392TEST_P(AudioEffectHidlTest, SetDevice) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800393 description("Verify that SetDevice works for an output chain effect");
Kevin Rocardf5305b32018-11-13 10:41:53 -0800394 Return<Result> ret = effect->setDevice(mkEnumBitfield(AudioDevice::OUT_SPEAKER));
Kevin Rocard55b10612018-11-12 12:33:16 -0800395 EXPECT_TRUE(ret.isOk());
396 EXPECT_EQ(Result::OK, ret);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800397}
398
nelsonli3c12e582019-12-12 13:53:49 +0800399TEST_P(AudioEffectHidlTest, SetAndGetVolume) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800400 description("Verify that SetAndGetVolume method works for an effect");
401 uint32_t channelCount;
402 getChannelCount(&channelCount);
403 hidl_vec<uint32_t> volumes;
404 volumes.resize(channelCount);
405 for (uint32_t i = 0; i < channelCount; ++i) {
406 volumes[i] = 0;
407 }
408 Result retval = Result::NOT_INITIALIZED;
409 Return<void> ret =
410 effect->setAndGetVolume(volumes, [&](Result r, const hidl_vec<uint32_t>&) { retval = r; });
411 EXPECT_TRUE(ret.isOk());
412 EXPECT_EQ(Result::OK, retval);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800413}
414
nelsonli3c12e582019-12-12 13:53:49 +0800415TEST_P(AudioEffectHidlTest, VolumeChangeNotification) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800416 description("Verify that effect accepts VolumeChangeNotification");
417 uint32_t channelCount;
418 getChannelCount(&channelCount);
419 hidl_vec<uint32_t> volumes;
420 volumes.resize(channelCount);
421 for (uint32_t i = 0; i < channelCount; ++i) {
422 volumes[i] = 0;
423 }
424 Return<Result> ret = effect->volumeChangeNotification(volumes);
425 EXPECT_TRUE(ret.isOk());
426 EXPECT_EQ(Result::OK, ret);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800427}
428
nelsonli3c12e582019-12-12 13:53:49 +0800429TEST_P(AudioEffectHidlTest, SetAudioMode) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800430 description("Verify that SetAudioMode works for an effect");
431 Return<Result> ret = effect->setAudioMode(AudioMode::NORMAL);
432 EXPECT_TRUE(ret.isOk());
433 EXPECT_EQ(Result::OK, ret);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800434}
435
nelsonli3c12e582019-12-12 13:53:49 +0800436TEST_P(AudioEffectHidlTest, SetConfigReverse) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800437 description("Verify that SetConfigReverse does not crash");
438 Return<Result> ret = effect->setConfigReverse(EffectConfig(), nullptr, nullptr);
439 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700440}
441
nelsonli3c12e582019-12-12 13:53:49 +0800442TEST_P(AudioEffectHidlTest, SetInputDevice) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800443 description("Verify that SetInputDevice does not crash");
Kevin Rocardf5305b32018-11-13 10:41:53 -0800444 Return<Result> ret = effect->setInputDevice(mkEnumBitfield(AudioDevice::IN_BUILTIN_MIC));
Kevin Rocard55b10612018-11-12 12:33:16 -0800445 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700446}
447
nelsonli3c12e582019-12-12 13:53:49 +0800448TEST_P(AudioEffectHidlTest, SetAudioSource) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800449 description("Verify that SetAudioSource does not crash");
450 Return<Result> ret = effect->setAudioSource(AudioSource::MIC);
451 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700452}
453
nelsonli3c12e582019-12-12 13:53:49 +0800454TEST_P(AudioEffectHidlTest, Offload) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800455 description("Verify that calling Offload method does not crash");
456 EffectOffloadParameter offloadParam;
457 offloadParam.isOffload = false;
458 offloadParam.ioHandle = static_cast<int>(AudioHandleConsts::AUDIO_IO_HANDLE_NONE);
459 Return<Result> ret = effect->offload(offloadParam);
460 EXPECT_TRUE(ret.isOk());
Mikhail Naganov9f289042017-02-23 08:39:36 -0800461}
462
nelsonli3c12e582019-12-12 13:53:49 +0800463TEST_P(AudioEffectHidlTest, PrepareForProcessing) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800464 description("Verify that PrepareForProcessing method works for an effect");
465 Result retval = Result::NOT_INITIALIZED;
466 Return<void> ret = effect->prepareForProcessing(
467 [&](Result r, const MQDescriptorSync<Result>&) { retval = r; });
468 EXPECT_TRUE(ret.isOk());
469 EXPECT_EQ(Result::OK, retval);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800470}
471
nelsonli3c12e582019-12-12 13:53:49 +0800472TEST_P(AudioEffectHidlTest, SetProcessBuffers) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800473 description("Verify that SetProcessBuffers works for an effect");
474 sp<IAllocator> ashmem = IAllocator::getService("ashmem");
475 ASSERT_NE(nullptr, ashmem.get());
476 bool success = false;
477 AudioBuffer buffer;
478 Return<void> ret = ashmem->allocate(1024, [&](bool s, const hidl_memory& memory) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800479 success = s;
480 if (s) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800481 buffer.data = memory;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800482 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800483 });
484 ASSERT_TRUE(ret.isOk());
485 ASSERT_TRUE(success);
486 Return<Result> ret2 = effect->setProcessBuffers(buffer, buffer);
487 EXPECT_TRUE(ret2.isOk());
488 EXPECT_EQ(Result::OK, ret2);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800489}
490
nelsonli3c12e582019-12-12 13:53:49 +0800491TEST_P(AudioEffectHidlTest, Command) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800492 description("Verify that Command does not crash");
493 Return<void> ret =
494 effect->command(0, hidl_vec<uint8_t>(), 0, [&](int32_t, const hidl_vec<uint8_t>&) {});
495 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700496}
Mikhail Naganov9f289042017-02-23 08:39:36 -0800497
nelsonli3c12e582019-12-12 13:53:49 +0800498TEST_P(AudioEffectHidlTest, SetParameter) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800499 description("Verify that SetParameter does not crash");
500 Return<Result> ret = effect->setParameter(hidl_vec<uint8_t>(), hidl_vec<uint8_t>());
501 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700502}
503
nelsonli3c12e582019-12-12 13:53:49 +0800504TEST_P(AudioEffectHidlTest, GetParameter) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800505 description("Verify that GetParameter does not crash");
506 Return<void> ret =
507 effect->getParameter(hidl_vec<uint8_t>(), 0, [&](Result, const hidl_vec<uint8_t>&) {});
508 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700509}
510
nelsonli3c12e582019-12-12 13:53:49 +0800511TEST_P(AudioEffectHidlTest, GetSupportedConfigsForFeature) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800512 description("Verify that GetSupportedConfigsForFeature does not crash");
513 Return<void> ret = effect->getSupportedConfigsForFeature(
514 0, 0, 0, [&](Result, uint32_t, const hidl_vec<uint8_t>&) {});
515 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700516}
517
nelsonli3c12e582019-12-12 13:53:49 +0800518TEST_P(AudioEffectHidlTest, GetCurrentConfigForFeature) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800519 description("Verify that GetCurrentConfigForFeature does not crash");
520 Return<void> ret =
521 effect->getCurrentConfigForFeature(0, 0, [&](Result, const hidl_vec<uint8_t>&) {});
522 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700523}
524
nelsonli3c12e582019-12-12 13:53:49 +0800525TEST_P(AudioEffectHidlTest, SetCurrentConfigForFeature) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800526 description("Verify that SetCurrentConfigForFeature does not crash");
527 Return<Result> ret = effect->setCurrentConfigForFeature(0, hidl_vec<uint8_t>());
528 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700529}
530
Mikhail Naganov9f289042017-02-23 08:39:36 -0800531// The main test class for Equalizer Audio Effect HIDL HAL.
532class EqualizerAudioEffectHidlTest : public AudioEffectHidlTest {
Mikhail Naganov892d1472020-03-19 10:44:06 -0700533 public:
Kevin Rocard55b10612018-11-12 12:33:16 -0800534 void SetUp() override {
535 AudioEffectHidlTest::SetUp();
536 equalizer = IEqualizerEffect::castFrom(effect);
537 ASSERT_NE(nullptr, equalizer.get());
538 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800539
Mikhail Naganov892d1472020-03-19 10:44:06 -0700540 void TearDown() override {
541 equalizer.clear();
542 AudioEffectHidlTest::TearDown();
543 }
544
545 protected:
Kevin Rocard55b10612018-11-12 12:33:16 -0800546 void getNumBands(uint16_t* numBands);
547 void getLevelRange(int16_t* minLevel, int16_t* maxLevel);
548 void getBandFrequencyRange(uint16_t band, uint32_t* minFreq, uint32_t* centerFreq,
549 uint32_t* maxFreq);
550 void getPresetCount(size_t* count);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800551
Kevin Rocard55b10612018-11-12 12:33:16 -0800552 sp<IEqualizerEffect> equalizer;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800553};
554
555void EqualizerAudioEffectHidlTest::getNumBands(uint16_t* numBands) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800556 Result retval = Result::NOT_INITIALIZED;
557 Return<void> ret = equalizer->getNumBands([&](Result r, uint16_t b) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800558 retval = r;
559 if (retval == Result::OK) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800560 *numBands = b;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800561 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800562 });
563 ASSERT_TRUE(ret.isOk());
564 ASSERT_EQ(Result::OK, retval);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800565}
566
Kevin Rocard55b10612018-11-12 12:33:16 -0800567void EqualizerAudioEffectHidlTest::getLevelRange(int16_t* minLevel, int16_t* maxLevel) {
568 Result retval = Result::NOT_INITIALIZED;
569 Return<void> ret = equalizer->getLevelRange([&](Result r, int16_t min, int16_t max) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800570 retval = r;
571 if (retval == Result::OK) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800572 *minLevel = min;
573 *maxLevel = max;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800574 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800575 });
576 ASSERT_TRUE(ret.isOk());
577 ASSERT_EQ(Result::OK, retval);
578}
579
580void EqualizerAudioEffectHidlTest::getBandFrequencyRange(uint16_t band, uint32_t* minFreq,
581 uint32_t* centerFreq, uint32_t* maxFreq) {
582 Result retval = Result::NOT_INITIALIZED;
583 Return<void> ret =
584 equalizer->getBandFrequencyRange(band, [&](Result r, uint32_t min, uint32_t max) {
585 retval = r;
586 if (retval == Result::OK) {
587 *minFreq = min;
588 *maxFreq = max;
589 }
590 });
591 ASSERT_TRUE(ret.isOk());
592 ASSERT_EQ(Result::OK, retval);
593 ret = equalizer->getBandCenterFrequency(band, [&](Result r, uint32_t center) {
594 retval = r;
595 if (retval == Result::OK) {
596 *centerFreq = center;
597 }
598 });
599 ASSERT_TRUE(ret.isOk());
600 ASSERT_EQ(Result::OK, retval);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800601}
602
603void EqualizerAudioEffectHidlTest::getPresetCount(size_t* count) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800604 Result retval = Result::NOT_INITIALIZED;
605 Return<void> ret = equalizer->getPresetNames([&](Result r, const hidl_vec<hidl_string>& names) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800606 retval = r;
607 if (retval == Result::OK) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800608 *count = names.size();
Mikhail Naganov9f289042017-02-23 08:39:36 -0800609 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800610 });
611 ASSERT_TRUE(ret.isOk());
612 ASSERT_EQ(Result::OK, retval);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800613}
614
nelsonli3c12e582019-12-12 13:53:49 +0800615TEST_P(EqualizerAudioEffectHidlTest, GetNumBands) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800616 description("Verify that Equalizer effect reports at least one band");
617 uint16_t numBands = 0;
618 getNumBands(&numBands);
619 EXPECT_GT(numBands, 0);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800620}
621
nelsonli3c12e582019-12-12 13:53:49 +0800622TEST_P(EqualizerAudioEffectHidlTest, GetLevelRange) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800623 description("Verify that Equalizer effect reports adequate band level range");
624 int16_t minLevel = 0x7fff, maxLevel = 0;
625 getLevelRange(&minLevel, &maxLevel);
626 EXPECT_GT(maxLevel, minLevel);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800627}
628
nelsonli3c12e582019-12-12 13:53:49 +0800629TEST_P(EqualizerAudioEffectHidlTest, GetSetBandLevel) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800630 description("Verify that manipulating band levels works for Equalizer effect");
631 uint16_t numBands = 0;
632 getNumBands(&numBands);
633 ASSERT_GT(numBands, 0);
634 int16_t levels[3]{0x7fff, 0, 0};
635 getLevelRange(&levels[0], &levels[2]);
636 ASSERT_GT(levels[2], levels[0]);
637 levels[1] = (levels[2] + levels[0]) / 2;
638 for (uint16_t i = 0; i < numBands; ++i) {
639 for (size_t j = 0; j < ARRAY_SIZE(levels); ++j) {
640 Return<Result> ret = equalizer->setBandLevel(i, levels[j]);
641 EXPECT_TRUE(ret.isOk());
642 EXPECT_EQ(Result::OK, ret);
643 Result retval = Result::NOT_INITIALIZED;
644 int16_t actualLevel;
645 Return<void> ret2 = equalizer->getBandLevel(i, [&](Result r, int16_t l) {
646 retval = r;
647 if (retval == Result::OK) {
648 actualLevel = l;
649 }
650 });
651 EXPECT_TRUE(ret2.isOk());
652 EXPECT_EQ(Result::OK, retval);
653 EXPECT_EQ(levels[j], actualLevel);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800654 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800655 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800656}
657
nelsonli3c12e582019-12-12 13:53:49 +0800658TEST_P(EqualizerAudioEffectHidlTest, GetBandCenterFrequencyAndRange) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800659 description("Verify that Equalizer effect reports adequate band frequency range");
660 uint16_t numBands = 0;
661 getNumBands(&numBands);
662 ASSERT_GT(numBands, 0);
663 for (uint16_t i = 0; i < numBands; ++i) {
664 uint32_t minFreq = 0xffffffff, centerFreq = 0xffffffff, maxFreq = 0xffffffff;
665 getBandFrequencyRange(i, &minFreq, &centerFreq, &maxFreq);
666 // Note: NXP legacy implementation reports "1" as upper bound for last band,
667 // so this check fails.
668 EXPECT_GE(maxFreq, centerFreq);
669 EXPECT_GE(centerFreq, minFreq);
670 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800671}
672
nelsonli3c12e582019-12-12 13:53:49 +0800673TEST_P(EqualizerAudioEffectHidlTest, GetBandForFrequency) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800674 description("Verify that Equalizer effect supports GetBandForFrequency correctly");
675 uint16_t numBands = 0;
676 getNumBands(&numBands);
677 ASSERT_GT(numBands, 0);
678 for (uint16_t i = 0; i < numBands; ++i) {
679 uint32_t freqs[3]{0, 0, 0};
680 getBandFrequencyRange(i, &freqs[0], &freqs[1], &freqs[2]);
681 // NXP legacy implementation reports "1" as upper bound for last band, some
682 // of the checks fail.
683 for (size_t j = 0; j < ARRAY_SIZE(freqs); ++j) {
684 if (j == 0) {
685 freqs[j]++;
686 } // Min frequency is an open interval.
687 Result retval = Result::NOT_INITIALIZED;
688 uint16_t actualBand = numBands + 1;
689 Return<void> ret = equalizer->getBandForFrequency(freqs[j], [&](Result r, uint16_t b) {
690 retval = r;
691 if (retval == Result::OK) {
692 actualBand = b;
693 }
694 });
695 EXPECT_TRUE(ret.isOk());
696 EXPECT_EQ(Result::OK, retval);
697 EXPECT_EQ(i, actualBand) << "Frequency: " << freqs[j];
698 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800699 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800700}
701
nelsonli3c12e582019-12-12 13:53:49 +0800702TEST_P(EqualizerAudioEffectHidlTest, GetPresetNames) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800703 description("Verify that Equalizer effect reports at least one preset");
704 size_t presetCount;
705 getPresetCount(&presetCount);
706 EXPECT_GT(presetCount, 0u);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800707}
708
nelsonli3c12e582019-12-12 13:53:49 +0800709TEST_P(EqualizerAudioEffectHidlTest, GetSetCurrentPreset) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800710 description("Verify that manipulating the current preset for Equalizer effect");
711 size_t presetCount;
712 getPresetCount(&presetCount);
713 ASSERT_GT(presetCount, 0u);
714 for (uint16_t i = 0; i < presetCount; ++i) {
715 Return<Result> ret = equalizer->setCurrentPreset(i);
716 EXPECT_TRUE(ret.isOk());
717 EXPECT_EQ(Result::OK, ret);
718 Result retval = Result::NOT_INITIALIZED;
719 uint16_t actualPreset = 0xffff;
720 Return<void> ret2 = equalizer->getCurrentPreset([&](Result r, uint16_t p) {
721 retval = r;
722 if (retval == Result::OK) {
723 actualPreset = p;
724 }
725 });
726 EXPECT_TRUE(ret2.isOk());
727 EXPECT_EQ(Result::OK, retval);
728 EXPECT_EQ(i, actualPreset);
729 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800730}
731
nelsonli3c12e582019-12-12 13:53:49 +0800732TEST_P(EqualizerAudioEffectHidlTest, GetSetAllProperties) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800733 description(
734 "Verify that setting band levels and presets works via Get / "
735 "SetAllProperties for Equalizer effect");
Kevin Rocard96d2cd92018-11-14 16:22:07 -0800736 using AllProperties =
Mikhail Naganov00a44c02018-12-14 14:31:45 -0800737 ::android::hardware::audio::effect::CPP_VERSION::IEqualizerEffect::AllProperties;
Kevin Rocard55b10612018-11-12 12:33:16 -0800738 uint16_t numBands = 0;
739 getNumBands(&numBands);
740 ASSERT_GT(numBands, 0);
741 AllProperties props;
742 props.bandLevels.resize(numBands);
743 for (size_t i = 0; i < numBands; ++i) {
744 props.bandLevels[i] = 0;
745 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800746
Kevin Rocard55b10612018-11-12 12:33:16 -0800747 AllProperties actualProps;
748 Result retval = Result::NOT_INITIALIZED;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800749
Kevin Rocard55b10612018-11-12 12:33:16 -0800750 // Verify setting of the band levels via properties.
751 props.curPreset = -1;
752 Return<Result> ret = equalizer->setAllProperties(props);
753 EXPECT_TRUE(ret.isOk());
754 EXPECT_EQ(Result::OK, ret);
755 Return<void> ret2 = equalizer->getAllProperties([&](Result r, AllProperties p) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800756 retval = r;
757 if (retval == Result::OK) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800758 actualProps = p;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800759 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800760 });
761 EXPECT_TRUE(ret2.isOk());
762 EXPECT_EQ(Result::OK, retval);
763 EXPECT_EQ(props.bandLevels, actualProps.bandLevels);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800764
Kevin Rocard55b10612018-11-12 12:33:16 -0800765 // Verify setting of the current preset via properties.
766 props.curPreset = 0; // Assuming there is at least one preset.
767 ret = equalizer->setAllProperties(props);
768 EXPECT_TRUE(ret.isOk());
769 EXPECT_EQ(Result::OK, ret);
770 ret2 = equalizer->getAllProperties([&](Result r, AllProperties p) {
771 retval = r;
772 if (retval == Result::OK) {
773 actualProps = p;
774 }
775 });
776 EXPECT_TRUE(ret2.isOk());
777 EXPECT_EQ(Result::OK, retval);
778 EXPECT_EQ(props.curPreset, actualProps.curPreset);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800779}
780
781// The main test class for Equalizer Audio Effect HIDL HAL.
782class LoudnessEnhancerAudioEffectHidlTest : public AudioEffectHidlTest {
Mikhail Naganov892d1472020-03-19 10:44:06 -0700783 public:
Kevin Rocard55b10612018-11-12 12:33:16 -0800784 void SetUp() override {
785 AudioEffectHidlTest::SetUp();
786 enhancer = ILoudnessEnhancerEffect::castFrom(effect);
787 ASSERT_NE(nullptr, enhancer.get());
788 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800789
Mikhail Naganov892d1472020-03-19 10:44:06 -0700790 void TearDown() override {
791 enhancer.clear();
792 AudioEffectHidlTest::TearDown();
793 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800794
Mikhail Naganov892d1472020-03-19 10:44:06 -0700795 protected:
Kevin Rocard55b10612018-11-12 12:33:16 -0800796 sp<ILoudnessEnhancerEffect> enhancer;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800797};
798
nelsonli3c12e582019-12-12 13:53:49 +0800799TEST_P(LoudnessEnhancerAudioEffectHidlTest, GetSetTargetGain) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800800 description(
801 "Verify that manipulating the target gain works for Loudness Enhancer "
802 "effect");
803 const int32_t gain = 100;
804 Return<Result> ret = enhancer->setTargetGain(gain);
805 EXPECT_TRUE(ret.isOk());
806 EXPECT_EQ(Result::OK, ret);
807 int32_t actualGain = 0;
808 Result retval;
809 Return<void> ret2 = enhancer->getTargetGain([&](Result r, int32_t g) {
810 retval = r;
811 if (retval == Result::OK) {
812 actualGain = g;
813 }
814 });
815 EXPECT_TRUE(ret2.isOk());
816 EXPECT_EQ(Result::OK, retval);
817 EXPECT_EQ(gain, actualGain);
Mikhail Naganovbf393172016-11-11 16:24:50 -0800818}
Zhuoyao Zhang7dc6ce82018-02-08 12:44:27 -0800819
Mikhail Naganov892d1472020-03-19 10:44:06 -0700820INSTANTIATE_TEST_SUITE_P(EffectsFactory, AudioEffectsFactoryHidlTest,
821 ::testing::ValuesIn(::android::hardware::getAllHalInstanceNames(
822 IEffectsFactory::descriptor)),
823 ::android::hardware::PrintInstanceNameToString);
Mikhail Naganov315ce412019-10-23 16:46:54 -0700824INSTANTIATE_TEST_SUITE_P(
Mikhail Naganov892d1472020-03-19 10:44:06 -0700825 Equalizer_IEffect, AudioEffectHidlTest,
826 ::testing::Combine(::testing::ValuesIn(::android::hardware::getAllHalInstanceNames(
827 IEffectsFactory::descriptor)),
828 ::testing::Values(EQUALIZER_EFFECT_TYPE)),
829 EffectParameterToString);
Mikhail Naganov315ce412019-10-23 16:46:54 -0700830INSTANTIATE_TEST_SUITE_P(
Mikhail Naganov892d1472020-03-19 10:44:06 -0700831 LoudnessEnhancer_IEffect, AudioEffectHidlTest,
832 ::testing::Combine(::testing::ValuesIn(::android::hardware::getAllHalInstanceNames(
833 IEffectsFactory::descriptor)),
834 ::testing::Values(LOUDNESS_ENHANCER_EFFECT_TYPE)),
835 EffectParameterToString);
nelsonli3c12e582019-12-12 13:53:49 +0800836INSTANTIATE_TEST_SUITE_P(
Mikhail Naganov315ce412019-10-23 16:46:54 -0700837 Equalizer, EqualizerAudioEffectHidlTest,
Mikhail Naganov892d1472020-03-19 10:44:06 -0700838 ::testing::Combine(::testing::ValuesIn(::android::hardware::getAllHalInstanceNames(
839 IEffectsFactory::descriptor)),
840 ::testing::Values(EQUALIZER_EFFECT_TYPE)),
841 EffectParameterToString);
Mikhail Naganov315ce412019-10-23 16:46:54 -0700842INSTANTIATE_TEST_SUITE_P(
843 LoudnessEnhancer, LoudnessEnhancerAudioEffectHidlTest,
Mikhail Naganov892d1472020-03-19 10:44:06 -0700844 ::testing::Combine(::testing::ValuesIn(::android::hardware::getAllHalInstanceNames(
845 IEffectsFactory::descriptor)),
846 ::testing::Values(LOUDNESS_ENHANCER_EFFECT_TYPE)),
847 EffectParameterToString);