1 /*
2 * Copyright (C) 2018 The Android Open Source Project
3 *
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 #include <vector>
18
19 #define LOG_TAG "AudioEffectHidlHalTest"
20 #include <android-base/logging.h>
21 #if MAJOR_VERSION <= 6
22 #include <system/audio.h>
23 #endif
24
25 #include PATH(android/hardware/audio/effect/FILE_VERSION/IEffect.h)
26 #include PATH(android/hardware/audio/effect/FILE_VERSION/IEffectsFactory.h)
27 #include PATH(android/hardware/audio/effect/FILE_VERSION/IEqualizerEffect.h)
28 #include PATH(android/hardware/audio/effect/FILE_VERSION/ILoudnessEnhancerEffect.h)
29 #include PATH(android/hardware/audio/effect/FILE_VERSION/types.h)
30 #include <android/hidl/allocator/1.0/IAllocator.h>
31 #include <android/hidl/memory/1.0/IMemory.h>
32 #if MAJOR_VERSION >= 7
33 #include <android_audio_policy_configuration_V7_0-enums.h>
34 #endif
35
36 #include <common/all-versions/VersionUtils.h>
37
38 #include <cutils/properties.h>
39 #include <gtest/gtest.h>
40 #include <hidl/GtestPrinter.h>
41 #include <hidl/ServiceManagement.h>
42 #include <hwbinder/IPCThreadState.h>
43
44 using ::android::sp;
45 using ::android::hardware::hidl_handle;
46 using ::android::hardware::hidl_memory;
47 using ::android::hardware::hidl_string;
48 using ::android::hardware::hidl_vec;
49 using ::android::hardware::MQDescriptorSync;
50 using ::android::hardware::Return;
51 using ::android::hardware::Void;
52 using ::android::hardware::audio::common::utils::mkEnumBitfield;
53 using ::android::hidl::allocator::V1_0::IAllocator;
54 using ::android::hidl::memory::V1_0::IMemory;
55 using namespace ::android::hardware::audio::common::COMMON_TYPES_CPP_VERSION;
56 using namespace ::android::hardware::audio::effect::CPP_VERSION;
57 #if MAJOR_VERSION >= 7
58 // Make an alias for enumerations generated from the APM config XSD.
59 namespace xsd {
60 using namespace ::android::audio::policy::configuration::CPP_VERSION;
61 }
62 #endif
63
64 #ifndef ARRAY_SIZE
65 #define ARRAY_SIZE(a) (sizeof(a) / sizeof(*(a)))
66 #endif
67
68 class AudioEffectsFactoryHidlTest : public ::testing::TestWithParam<std::string> {
69 public:
SetUp()70 void SetUp() override {
71 effectsFactory = IEffectsFactory::getService(GetParam());
72 ASSERT_NE(effectsFactory, nullptr);
73 }
TearDown()74 void TearDown() override { effectsFactory.clear(); }
75
76 protected:
description(const std::string & description)77 static void description(const std::string& description) {
78 RecordProperty("description", description);
79 }
80
81 sp<IEffectsFactory> effectsFactory;
82 };
83
TEST_P(AudioEffectsFactoryHidlTest,EnumerateEffects)84 TEST_P(AudioEffectsFactoryHidlTest, EnumerateEffects) {
85 description("Verify that EnumerateEffects returns at least one effect");
86 Result retval = Result::NOT_INITIALIZED;
87 size_t effectCount = 0;
88 Return<void> ret =
89 effectsFactory->getAllDescriptors([&](Result r, const hidl_vec<EffectDescriptor>& result) {
90 retval = r;
91 effectCount = result.size();
92 });
93 EXPECT_TRUE(ret.isOk());
94 EXPECT_EQ(Result::OK, retval);
95 EXPECT_GT(effectCount, 0u);
96 }
97
TEST_P(AudioEffectsFactoryHidlTest,CreateEffect)98 TEST_P(AudioEffectsFactoryHidlTest, CreateEffect) {
99 description("Verify that an effect can be created via CreateEffect");
100 bool gotEffect = false;
101 Uuid effectUuid;
102 Return<void> ret =
103 effectsFactory->getAllDescriptors([&](Result r, const hidl_vec<EffectDescriptor>& result) {
104 if (r == Result::OK && result.size() > 0) {
105 gotEffect = true;
106 effectUuid = result[0].uuid;
107 }
108 });
109 ASSERT_TRUE(ret.isOk());
110 ASSERT_TRUE(gotEffect);
111 Result retval = Result::NOT_INITIALIZED;
112 sp<IEffect> effect;
113 ret = effectsFactory->createEffect(
114 effectUuid, 1 /*session*/, 1 /*ioHandle*/,
115 #if MAJOR_VERSION >= 6
116 0 /*device*/,
117 #endif
118 [&](Result r, const sp<IEffect>& result, uint64_t /*effectId*/) {
119 retval = r;
120 if (r == Result::OK) {
121 effect = result;
122 }
123 });
124 EXPECT_TRUE(ret.isOk());
125 EXPECT_EQ(Result::OK, retval);
126 EXPECT_NE(nullptr, effect.get());
127 }
128
TEST_P(AudioEffectsFactoryHidlTest,GetDescriptor)129 TEST_P(AudioEffectsFactoryHidlTest, GetDescriptor) {
130 description(
131 "Verify that effects factory can provide an effect descriptor via "
132 "GetDescriptor");
133 hidl_vec<EffectDescriptor> allDescriptors;
134 Return<void> ret =
135 effectsFactory->getAllDescriptors([&](Result r, const hidl_vec<EffectDescriptor>& result) {
136 if (r == Result::OK) {
137 allDescriptors = result;
138 }
139 });
140 ASSERT_TRUE(ret.isOk());
141 ASSERT_GT(allDescriptors.size(), 0u);
142 for (size_t i = 0; i < allDescriptors.size(); ++i) {
143 ret = effectsFactory->getDescriptor(allDescriptors[i].uuid,
144 [&](Result r, const EffectDescriptor& result) {
145 EXPECT_EQ(r, Result::OK);
146 EXPECT_EQ(result, allDescriptors[i]);
147 });
148 }
149 EXPECT_TRUE(ret.isOk());
150 }
151
TEST_P(AudioEffectsFactoryHidlTest,DebugDumpInvalidArgument)152 TEST_P(AudioEffectsFactoryHidlTest, DebugDumpInvalidArgument) {
153 description("Verify that debugDump doesn't crash on invalid arguments");
154 #if MAJOR_VERSION == 2
155 Return<void> ret = effectsFactory->debugDump(hidl_handle());
156 #elif MAJOR_VERSION >= 4
157 Return<void> ret = effectsFactory->debug(hidl_handle(), {});
158 #endif
159 ASSERT_TRUE(ret.isOk());
160 }
161
162 // Equalizer effect is required by CDD, but only the type is fixed.
163 // This is the same UUID as AudioEffect.EFFECT_TYPE_EQUALIZER in Java.
164 static const Uuid EQUALIZER_EFFECT_TYPE = {
165 0x0bed4300, 0xddd6, 0x11db, 0x8f34,
166 std::array<uint8_t, 6>{{0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}}};
167 // Loudness Enhancer effect is required by CDD, but only the type is fixed.
168 // This is the same UUID as AudioEffect.EFFECT_TYPE_LOUDNESS_ENHANCER in Java.
169 static const Uuid LOUDNESS_ENHANCER_EFFECT_TYPE = {
170 0xfe3199be, 0xaed0, 0x413f, 0x87bb,
171 std::array<uint8_t, 6>{{0x11, 0x26, 0x0e, 0xb6, 0x3c, 0xf1}}};
172
173 enum { PARAM_FACTORY_NAME, PARAM_EFFECT_UUID, PARAM_USE_AFTER_CLOSE };
174 using EffectParameter = std::tuple<std::string, Uuid, bool>;
175
EffectParameterToString(const::testing::TestParamInfo<EffectParameter> & info)176 static inline std::string EffectParameterToString(
177 const ::testing::TestParamInfo<EffectParameter>& info) {
178 std::string prefix = std::get<PARAM_USE_AFTER_CLOSE>(info.param) ? "UseAfterClose_" : "";
179 return prefix.append(
180 ::android::hardware::PrintInstanceNameToString(::testing::TestParamInfo<std::string>{
181 std::get<PARAM_FACTORY_NAME>(info.param), info.index}));
182 }
183
184 // The main test class for Audio Effect HIDL HAL.
185 class AudioEffectHidlTest : public ::testing::TestWithParam<EffectParameter> {
186 public:
SetUp()187 void SetUp() override {
188 effectsFactory = IEffectsFactory::getService(std::get<PARAM_FACTORY_NAME>(GetParam()));
189 ASSERT_NE(nullptr, effectsFactory.get());
190
191 ASSERT_NO_FATAL_FAILURE(findAndCreateEffect(getEffectType()));
192 ASSERT_NE(nullptr, effect.get());
193
194 Return<Result> ret = effect->init();
195 ASSERT_TRUE(ret.isOk());
196 ASSERT_EQ(Result::OK, ret);
197
198 useAfterClose = std::get<PARAM_USE_AFTER_CLOSE>(GetParam());
199 if (useAfterClose) {
200 Return<Result> ret = effect->close();
201 ASSERT_TRUE(ret.isOk());
202 ASSERT_EQ(Result::OK, ret);
203 }
204 }
205
TearDown()206 void TearDown() override {
207 effect.clear();
208 effectsFactory.clear();
209 // Ensure all pending binder transactions are completed before proceeding.
210 android::hardware::IPCThreadState::self()->flushCommands();
211 // Add a delay to allow the binder destruction to propagate and ensure
212 // the remote objects are properly cleaned up.
213 usleep(100 * 1000);
214 }
215
216 protected:
description(const std::string & description)217 static void description(const std::string& description) {
218 RecordProperty("description", description);
219 }
220
getEffectType() const221 Uuid getEffectType() const { return std::get<PARAM_EFFECT_UUID>(GetParam()); }
222
223 void checkResult(const Result& result);
224 void checkResultForUseAfterClose(const Result& result);
225 void findAndCreateEffect(const Uuid& type);
226 void findEffectInstance(const Uuid& type, Uuid* uuid);
227 void getChannelCount(uint32_t* channelCount);
228
229 sp<IEffectsFactory> effectsFactory;
230 sp<IEffect> effect;
231 bool useAfterClose;
232 };
233
checkResult(const Result & result)234 void AudioEffectHidlTest::checkResult(const Result& result) {
235 if (!useAfterClose) {
236 ASSERT_EQ(Result::OK, result);
237 } else {
238 ASSERT_NO_FATAL_FAILURE(checkResultForUseAfterClose(result));
239 }
240 }
241
checkResultForUseAfterClose(const Result & result)242 void AudioEffectHidlTest::checkResultForUseAfterClose(const Result& result) {
243 if (useAfterClose) {
244 // The actual error does not matter. It's important that the effect did not crash
245 // while executing any command after a call to "close", and that the returned status
246 // is not OK.
247 ASSERT_NE(Result::OK, result);
248 }
249 }
250
findAndCreateEffect(const Uuid & type)251 void AudioEffectHidlTest::findAndCreateEffect(const Uuid& type) {
252 Uuid effectUuid;
253 ASSERT_NO_FATAL_FAILURE(findEffectInstance(type, &effectUuid));
254 Return<void> ret = effectsFactory->createEffect(
255 effectUuid, 1 /*session*/, 1 /*ioHandle*/,
256 #if MAJOR_VERSION >= 6
257 0 /*device*/,
258 #endif
259 [&](Result r, const sp<IEffect>& result, uint64_t /*effectId*/) {
260 if (r == Result::OK) {
261 effect = result;
262 }
263 });
264 ASSERT_TRUE(ret.isOk());
265 }
266
findEffectInstance(const Uuid & type,Uuid * uuid)267 void AudioEffectHidlTest::findEffectInstance(const Uuid& type, Uuid* uuid) {
268 bool effectFound = false;
269 Return<void> ret =
270 effectsFactory->getAllDescriptors([&](Result r, const hidl_vec<EffectDescriptor>& result) {
271 if (r == Result::OK) {
272 for (const auto& desc : result) {
273 if (desc.type == type) {
274 effectFound = true;
275 *uuid = desc.uuid;
276 break;
277 }
278 }
279 }
280 });
281 ASSERT_TRUE(ret.isOk());
282 ASSERT_TRUE(effectFound);
283 }
284
getChannelCount(uint32_t * channelCount)285 void AudioEffectHidlTest::getChannelCount(uint32_t* channelCount) {
286 Result retval;
287 EffectConfig currentConfig;
288 Return<void> ret = effect->getConfig([&](Result r, const EffectConfig& conf) {
289 retval = r;
290 if (r == Result::OK) {
291 currentConfig = conf;
292 }
293 });
294 ASSERT_TRUE(ret.isOk());
295 ASSERT_NO_FATAL_FAILURE(checkResult(retval));
296 if (useAfterClose) {
297 *channelCount = 1;
298 return;
299 }
300 #if MAJOR_VERSION <= 6
301 ASSERT_TRUE(audio_channel_mask_is_valid(
302 static_cast<audio_channel_mask_t>(currentConfig.outputCfg.channels)));
303 *channelCount = audio_channel_count_from_out_mask(
304 static_cast<audio_channel_mask_t>(currentConfig.outputCfg.channels));
305 #else
306 ASSERT_EQ(AudioConfigBaseOptional::ChannelMask::hidl_discriminator::value,
307 currentConfig.outputCfg.base.channelMask.getDiscriminator());
308 *channelCount = android::audio::policy::configuration::V7_0::getChannelCount(
309 currentConfig.outputCfg.base.channelMask.value());
310 ASSERT_NE(*channelCount, 0);
311 #endif
312 }
313
TEST_P(AudioEffectHidlTest,Close)314 TEST_P(AudioEffectHidlTest, Close) {
315 description("Verify that an effect can be closed");
316 Return<Result> ret = effect->close();
317 EXPECT_TRUE(ret.isOk());
318 ASSERT_NO_FATAL_FAILURE(checkResult(ret));
319 }
320
TEST_P(AudioEffectHidlTest,GetDescriptor)321 TEST_P(AudioEffectHidlTest, GetDescriptor) {
322 description("Verify that an effect can return its own descriptor via GetDescriptor");
323 Result retval = Result::NOT_INITIALIZED;
324 Uuid actualType;
325 Return<void> ret = effect->getDescriptor([&](Result r, const EffectDescriptor& desc) {
326 retval = r;
327 if (r == Result::OK) {
328 actualType = desc.type;
329 }
330 });
331 EXPECT_TRUE(ret.isOk());
332 ASSERT_NO_FATAL_FAILURE(checkResult(retval));
333 if (useAfterClose) return;
334 EXPECT_EQ(getEffectType(), actualType);
335 }
336
TEST_P(AudioEffectHidlTest,GetSetConfig)337 TEST_P(AudioEffectHidlTest, GetSetConfig) {
338 description(
339 "Verify that it is possible to manipulate effect config via Get / "
340 "SetConfig");
341 Result retval = Result::NOT_INITIALIZED;
342 EffectConfig currentConfig;
343 Return<void> ret = effect->getConfig([&](Result r, const EffectConfig& conf) {
344 retval = r;
345 if (r == Result::OK) {
346 currentConfig = conf;
347 }
348 });
349 EXPECT_TRUE(ret.isOk());
350 EXPECT_NO_FATAL_FAILURE(checkResult(retval));
351 if (useAfterClose) return;
352 Return<Result> ret2 = effect->setConfig(currentConfig, nullptr, nullptr);
353 EXPECT_TRUE(ret2.isOk());
354 EXPECT_EQ(Result::OK, ret2);
355 }
356
357 #if MAJOR_VERSION >= 7
generateInvalidConfigs(const EffectBufferConfig & src)358 std::vector<EffectBufferConfig> generateInvalidConfigs(const EffectBufferConfig& src) {
359 std::vector<EffectBufferConfig> result;
360 EffectBufferConfig invalidFormat = src;
361 invalidFormat.base.format.value("random_string");
362 result.push_back(std::move(invalidFormat));
363 EffectBufferConfig invalidChannelMask = src;
364 invalidChannelMask.base.channelMask.value("random_string");
365 result.push_back(std::move(invalidChannelMask));
366 return result;
367 }
368
TEST_P(AudioEffectHidlTest,SetConfigInvalidArguments)369 TEST_P(AudioEffectHidlTest, SetConfigInvalidArguments) {
370 description("Verify that invalid arguments are rejected by SetConfig");
371 Result retval = Result::NOT_INITIALIZED;
372 EffectConfig currentConfig;
373 Return<void> ret = effect->getConfig([&](Result r, const EffectConfig& conf) {
374 retval = r;
375 if (r == Result::OK) {
376 currentConfig = conf;
377 }
378 });
379 EXPECT_TRUE(ret.isOk());
380 EXPECT_NO_FATAL_FAILURE(checkResult(retval));
381 if (useAfterClose) return;
382 for (const auto& invalidInputCfg : generateInvalidConfigs(currentConfig.inputCfg)) {
383 EffectConfig invalidConfig = currentConfig;
384 invalidConfig.inputCfg = invalidInputCfg;
385 Return<Result> ret = effect->setConfig(invalidConfig, nullptr, nullptr);
386 EXPECT_TRUE(ret.isOk());
387 EXPECT_EQ(Result::INVALID_ARGUMENTS, ret);
388 }
389 for (const auto& invalidOutputCfg : generateInvalidConfigs(currentConfig.outputCfg)) {
390 EffectConfig invalidConfig = currentConfig;
391 invalidConfig.outputCfg = invalidOutputCfg;
392 Return<Result> ret = effect->setConfig(invalidConfig, nullptr, nullptr);
393 EXPECT_TRUE(ret.isOk());
394 EXPECT_EQ(Result::INVALID_ARGUMENTS, ret);
395 }
396 }
397 #endif
398
TEST_P(AudioEffectHidlTest,GetConfigReverse)399 TEST_P(AudioEffectHidlTest, GetConfigReverse) {
400 description("Verify that GetConfigReverse does not crash");
401 Result retval = Result::OK;
402 Return<void> ret = effect->getConfigReverse([&](Result r, const EffectConfig&) { retval = r; });
403 EXPECT_TRUE(ret.isOk());
404 EXPECT_NO_FATAL_FAILURE(checkResultForUseAfterClose(retval));
405 }
406
TEST_P(AudioEffectHidlTest,GetSupportedAuxChannelsConfigs)407 TEST_P(AudioEffectHidlTest, GetSupportedAuxChannelsConfigs) {
408 description("Verify that GetSupportedAuxChannelsConfigs does not crash");
409 Result retval = Result::OK;
410 Return<void> ret = effect->getSupportedAuxChannelsConfigs(
411 0, [&](Result r, const hidl_vec<EffectAuxChannelsConfig>&) { retval = r; });
412 EXPECT_TRUE(ret.isOk());
413 EXPECT_NO_FATAL_FAILURE(checkResultForUseAfterClose(retval));
414 }
415
TEST_P(AudioEffectHidlTest,GetAuxChannelsConfig)416 TEST_P(AudioEffectHidlTest, GetAuxChannelsConfig) {
417 description("Verify that GetAuxChannelsConfig does not crash");
418 Result retval = Result::OK;
419 Return<void> ret = effect->getAuxChannelsConfig(
420 [&](Result r, const EffectAuxChannelsConfig&) { retval = r; });
421 EXPECT_TRUE(ret.isOk());
422 EXPECT_NO_FATAL_FAILURE(checkResultForUseAfterClose(retval));
423 }
424
TEST_P(AudioEffectHidlTest,SetAuxChannelsConfig)425 TEST_P(AudioEffectHidlTest, SetAuxChannelsConfig) {
426 description("Verify that SetAuxChannelsConfig does not crash");
427 Return<Result> ret = effect->setAuxChannelsConfig(EffectAuxChannelsConfig());
428 EXPECT_TRUE(ret.isOk());
429 EXPECT_NO_FATAL_FAILURE(checkResultForUseAfterClose(ret));
430 }
431
432 // Not generated automatically because AudioBuffer contains
433 // instances of hidl_memory which can't be compared properly
434 // in general case due to presence of handles.
435 //
436 // However, in this particular case, handles must not present
437 // thus comparison is possible.
438 //
439 // operator== must be defined in the same namespace as the structures.
440 namespace android {
441 namespace hardware {
442 namespace audio {
443 namespace effect {
444 namespace CPP_VERSION {
operator ==(const AudioBuffer & lhs,const AudioBuffer & rhs)445 inline bool operator==(const AudioBuffer& lhs, const AudioBuffer& rhs) {
446 return lhs.id == rhs.id && lhs.frameCount == rhs.frameCount && lhs.data.handle() == nullptr &&
447 rhs.data.handle() == nullptr;
448 }
449
450 #if MAJOR_VERSION <= 6
operator ==(const EffectBufferConfig & lhs,const EffectBufferConfig & rhs)451 inline bool operator==(const EffectBufferConfig& lhs, const EffectBufferConfig& rhs) {
452 return lhs.buffer == rhs.buffer &&
453 lhs.samplingRateHz == rhs.samplingRateHz && lhs.channels == rhs.channels &&
454 lhs.format == rhs.format &&
455 lhs.accessMode == rhs.accessMode && lhs.mask == rhs.mask;
456 }
457 #else
operator ==(const EffectBufferConfig & lhs,const EffectBufferConfig & rhs)458 inline bool operator==(const EffectBufferConfig& lhs, const EffectBufferConfig& rhs) {
459 return lhs.buffer.getDiscriminator() == rhs.buffer.getDiscriminator() &&
460 (lhs.buffer.getDiscriminator() ==
461 EffectBufferConfig::OptionalBuffer::hidl_discriminator::unspecified ||
462 lhs.buffer.buf() == rhs.buffer.buf()) &&
463 lhs.base == rhs.base && lhs.accessMode == rhs.accessMode;
464 }
465 #endif // MAJOR_VERSION <= 6
466
operator ==(const EffectConfig & lhs,const EffectConfig & rhs)467 inline bool operator==(const EffectConfig& lhs, const EffectConfig& rhs) {
468 return lhs.inputCfg == rhs.inputCfg && lhs.outputCfg == rhs.outputCfg;
469 }
470 } // namespace CPP_VERSION
471 } // namespace effect
472 } // namespace audio
473 } // namespace hardware
474 } // namespace android
475
TEST_P(AudioEffectHidlTest,Reset)476 TEST_P(AudioEffectHidlTest, Reset) {
477 description("Verify that Reset preserves effect configuration");
478 Result retval = Result::NOT_INITIALIZED;
479 EffectConfig originalConfig;
480 if (!useAfterClose) {
481 Return<void> ret = effect->getConfig([&](Result r, const EffectConfig& conf) {
482 retval = r;
483 if (r == Result::OK) {
484 originalConfig = conf;
485 }
486 });
487 ASSERT_TRUE(ret.isOk());
488 ASSERT_EQ(Result::OK, retval);
489 }
490 Return<Result> ret2 = effect->reset();
491 EXPECT_TRUE(ret2.isOk());
492 EXPECT_NO_FATAL_FAILURE(checkResult(ret2));
493 if (!useAfterClose) {
494 EffectConfig configAfterReset;
495 Return<void> ret = effect->getConfig([&](Result r, const EffectConfig& conf) {
496 retval = r;
497 if (r == Result::OK) {
498 configAfterReset = conf;
499 }
500 });
501 EXPECT_EQ(originalConfig, configAfterReset);
502 }
503 }
504
TEST_P(AudioEffectHidlTest,DisableEnableDisable)505 TEST_P(AudioEffectHidlTest, DisableEnableDisable) {
506 description("Verify Disable -> Enable -> Disable sequence for an effect");
507 Return<Result> ret = effect->disable();
508 EXPECT_TRUE(ret.isOk());
509 if (!useAfterClose) {
510 // Note: some legacy effects may return -EINVAL (INVALID_ARGUMENTS),
511 // more canonical is to return -ENOSYS (NOT_SUPPORTED)
512 EXPECT_TRUE(ret == Result::NOT_SUPPORTED || ret == Result::INVALID_ARGUMENTS);
513 } else {
514 EXPECT_NO_FATAL_FAILURE(checkResultForUseAfterClose(ret));
515 }
516 ret = effect->enable();
517 EXPECT_TRUE(ret.isOk());
518 EXPECT_NO_FATAL_FAILURE(checkResult(ret));
519 ret = effect->disable();
520 EXPECT_TRUE(ret.isOk());
521 EXPECT_NO_FATAL_FAILURE(checkResult(ret));
522 }
523
524 #if MAJOR_VERSION >= 7
TEST_P(AudioEffectHidlTest,SetDeviceInvalidDeviceAddress)525 TEST_P(AudioEffectHidlTest, SetDeviceInvalidDeviceAddress) {
526 description("Verify that invalid device address is rejected by SetDevice");
527 if (useAfterClose) {
528 GTEST_SKIP() << "Does not make sense for the useAfterClose case";
529 }
530 DeviceAddress device{.deviceType = "random_string"};
531 Return<Result> ret = effect->setDevice(device);
532 EXPECT_TRUE(ret.isOk());
533 EXPECT_EQ(Result::INVALID_ARGUMENTS, ret);
534 }
535 #endif
536
TEST_P(AudioEffectHidlTest,SetDevice)537 TEST_P(AudioEffectHidlTest, SetDevice) {
538 description("Verify that SetDevice works for an output chain effect");
539 #if MAJOR_VERSION <= 6
540 Return<Result> ret = effect->setDevice(mkEnumBitfield(AudioDevice::OUT_SPEAKER));
541 #else
542 DeviceAddress device{.deviceType = toString(xsd::AudioDevice::AUDIO_DEVICE_OUT_SPEAKER)};
543 Return<Result> ret = effect->setDevice(device);
544 #endif
545 EXPECT_TRUE(ret.isOk());
546 EXPECT_NO_FATAL_FAILURE(checkResult(ret));
547 }
548
TEST_P(AudioEffectHidlTest,SetAndGetVolume)549 TEST_P(AudioEffectHidlTest, SetAndGetVolume) {
550 description("Verify that SetAndGetVolume method works for an effect");
551 uint32_t channelCount;
552 ASSERT_NO_FATAL_FAILURE(getChannelCount(&channelCount));
553 hidl_vec<uint32_t> volumes;
554 volumes.resize(channelCount);
555 for (uint32_t i = 0; i < channelCount; ++i) {
556 volumes[i] = 0;
557 }
558 Result retval = Result::NOT_INITIALIZED;
559 Return<void> ret =
560 effect->setAndGetVolume(volumes, [&](Result r, const hidl_vec<uint32_t>&) { retval = r; });
561 EXPECT_TRUE(ret.isOk());
562 EXPECT_NO_FATAL_FAILURE(checkResult(retval));
563 }
564
TEST_P(AudioEffectHidlTest,VolumeChangeNotification)565 TEST_P(AudioEffectHidlTest, VolumeChangeNotification) {
566 description("Verify that effect accepts VolumeChangeNotification");
567 uint32_t channelCount;
568 ASSERT_NO_FATAL_FAILURE(getChannelCount(&channelCount));
569 hidl_vec<uint32_t> volumes;
570 volumes.resize(channelCount);
571 for (uint32_t i = 0; i < channelCount; ++i) {
572 volumes[i] = 0;
573 }
574 Return<Result> ret = effect->volumeChangeNotification(volumes);
575 EXPECT_TRUE(ret.isOk());
576 EXPECT_NO_FATAL_FAILURE(checkResult(ret));
577 }
578
TEST_P(AudioEffectHidlTest,SetAudioMode)579 TEST_P(AudioEffectHidlTest, SetAudioMode) {
580 description("Verify that SetAudioMode works for an effect");
581 Return<Result> ret = effect->setAudioMode(AudioMode::NORMAL);
582 EXPECT_TRUE(ret.isOk());
583 EXPECT_NO_FATAL_FAILURE(checkResult(ret));
584 }
585
TEST_P(AudioEffectHidlTest,SetConfigReverse)586 TEST_P(AudioEffectHidlTest, SetConfigReverse) {
587 description("Verify that SetConfigReverse does not crash");
588 Return<Result> ret = effect->setConfigReverse(EffectConfig(), nullptr, nullptr);
589 EXPECT_TRUE(ret.isOk());
590 EXPECT_NO_FATAL_FAILURE(checkResultForUseAfterClose(ret));
591 }
592
593 #if MAJOR_VERSION >= 7
TEST_P(AudioEffectHidlTest,SetInputDeviceInvalidDeviceAddress)594 TEST_P(AudioEffectHidlTest, SetInputDeviceInvalidDeviceAddress) {
595 description("Verify that invalid device address is rejected by SetInputDevice");
596 if (useAfterClose) {
597 GTEST_SKIP() << "Does not make sense for the useAfterClose case";
598 }
599 DeviceAddress device{.deviceType = "random_string"};
600 Return<Result> ret = effect->setInputDevice(device);
601 EXPECT_TRUE(ret.isOk());
602 EXPECT_TRUE(ret == Result::INVALID_ARGUMENTS || ret == Result::NOT_SUPPORTED)
603 << ::testing::PrintToString(ret);
604 }
605 #endif
606
TEST_P(AudioEffectHidlTest,SetInputDevice)607 TEST_P(AudioEffectHidlTest, SetInputDevice) {
608 description("Verify that SetInputDevice does not crash");
609 #if MAJOR_VERSION <= 6
610 Return<Result> ret = effect->setInputDevice(mkEnumBitfield(AudioDevice::IN_BUILTIN_MIC));
611 #else
612 DeviceAddress device{.deviceType = toString(xsd::AudioDevice::AUDIO_DEVICE_IN_BUILTIN_MIC)};
613 Return<Result> ret = effect->setInputDevice(device);
614 #endif
615 EXPECT_TRUE(ret.isOk());
616 EXPECT_NO_FATAL_FAILURE(checkResultForUseAfterClose(ret));
617 }
618
619 #if MAJOR_VERSION >= 7
TEST_P(AudioEffectHidlTest,SetInvalidAudioSource)620 TEST_P(AudioEffectHidlTest, SetInvalidAudioSource) {
621 description("Verify that an invalid audio source is rejected by SetAudioSource");
622 if (useAfterClose) {
623 GTEST_SKIP() << "Does not make sense for the useAfterClose case";
624 }
625 Return<Result> ret = effect->setAudioSource("random_string");
626 ASSERT_TRUE(ret.isOk());
627 EXPECT_TRUE(ret == Result::INVALID_ARGUMENTS || ret == Result::NOT_SUPPORTED)
628 << ::testing::PrintToString(ret);
629 }
630 #endif
631
TEST_P(AudioEffectHidlTest,SetAudioSource)632 TEST_P(AudioEffectHidlTest, SetAudioSource) {
633 description("Verify that SetAudioSource does not crash");
634 #if MAJOR_VERSION <= 6
635 Return<Result> ret = effect->setAudioSource(AudioSource::MIC);
636 #else
637 Return<Result> ret = effect->setAudioSource(toString(xsd::AudioSource::AUDIO_SOURCE_MIC));
638 #endif
639 EXPECT_TRUE(ret.isOk());
640 EXPECT_NO_FATAL_FAILURE(checkResultForUseAfterClose(ret));
641 }
642
TEST_P(AudioEffectHidlTest,Offload)643 TEST_P(AudioEffectHidlTest, Offload) {
644 description("Verify that calling Offload method does not crash");
645 Return<Result> ret = effect->offload(EffectOffloadParameter{});
646 EXPECT_TRUE(ret.isOk());
647 EXPECT_NO_FATAL_FAILURE(checkResultForUseAfterClose(ret));
648 }
649
TEST_P(AudioEffectHidlTest,PrepareForProcessing)650 TEST_P(AudioEffectHidlTest, PrepareForProcessing) {
651 description("Verify that PrepareForProcessing method works for an effect");
652 Result retval = Result::NOT_INITIALIZED;
653 Return<void> ret = effect->prepareForProcessing(
654 [&](Result r, const MQDescriptorSync<Result>&) { retval = r; });
655 EXPECT_TRUE(ret.isOk());
656 EXPECT_NO_FATAL_FAILURE(checkResult(retval));
657 }
658
TEST_P(AudioEffectHidlTest,SetProcessBuffers)659 TEST_P(AudioEffectHidlTest, SetProcessBuffers) {
660 description("Verify that SetProcessBuffers works for an effect");
661 sp<IAllocator> ashmem = IAllocator::getService("ashmem");
662 ASSERT_NE(nullptr, ashmem.get());
663 bool success = false;
664 AudioBuffer buffer;
665 Return<void> ret = ashmem->allocate(1024, [&](bool s, const hidl_memory& memory) {
666 success = s;
667 if (s) {
668 buffer.data = memory;
669 }
670 });
671 ASSERT_TRUE(ret.isOk());
672 ASSERT_TRUE(success);
673 Return<Result> ret2 = effect->setProcessBuffers(buffer, buffer);
674 EXPECT_TRUE(ret2.isOk());
675 EXPECT_NO_FATAL_FAILURE(checkResult(ret2));
676 }
677
TEST_P(AudioEffectHidlTest,Command)678 TEST_P(AudioEffectHidlTest, Command) {
679 description("Verify that Command does not crash");
680 Return<void> ret =
681 effect->command(0, hidl_vec<uint8_t>(), 0, [&](int32_t, const hidl_vec<uint8_t>&) {});
682 EXPECT_TRUE(ret.isOk());
683 }
684
TEST_P(AudioEffectHidlTest,SetParameter)685 TEST_P(AudioEffectHidlTest, SetParameter) {
686 description("Verify that SetParameter does not crash");
687 Return<Result> ret = effect->setParameter(hidl_vec<uint8_t>(), hidl_vec<uint8_t>());
688 EXPECT_TRUE(ret.isOk());
689 EXPECT_NO_FATAL_FAILURE(checkResultForUseAfterClose(ret));
690 }
691
TEST_P(AudioEffectHidlTest,GetParameter)692 TEST_P(AudioEffectHidlTest, GetParameter) {
693 description("Verify that GetParameter does not crash");
694 Return<void> ret =
695 effect->getParameter(hidl_vec<uint8_t>(), 0, [&](Result, const hidl_vec<uint8_t>&) {});
696 EXPECT_TRUE(ret.isOk());
697 }
698
TEST_P(AudioEffectHidlTest,GetParameterInvalidMaxReplySize)699 TEST_P(AudioEffectHidlTest, GetParameterInvalidMaxReplySize) {
700 description("Verify that GetParameter caps the maximum reply size");
701 const bool isNewDeviceLaunchingOnTPlus = property_get_int32("ro.vendor.api_level", 0) >= 33;
702 if (!isNewDeviceLaunchingOnTPlus) {
703 GTEST_SKIP() << "The test only applies to devices launching on T or later";
704 }
705 if (useAfterClose) {
706 GTEST_SKIP() << "Does not make sense for the useAfterClose case";
707 }
708 // Use a non-empty parameter to avoid being rejected by any earlier checks.
709 hidl_vec<uint8_t> parameter;
710 parameter.resize(16);
711 // Use very large size to ensure that the service does not crash. Since parameters
712 // are specific to each effect, and some effects may not have parameters at all,
713 // simply checking the return value would not reveal an issue of using an uncapped value.
714 const uint32_t veryLargeReplySize = std::numeric_limits<uint32_t>::max() - 100;
715 Result retval = Result::OK;
716 Return<void> ret =
717 effect->getParameter(parameter, veryLargeReplySize,
718 [&](Result r, const hidl_vec<uint8_t>&) { retval = r; });
719 EXPECT_TRUE(ret.isOk());
720 EXPECT_EQ(Result::INVALID_ARGUMENTS, retval);
721 }
722
TEST_P(AudioEffectHidlTest,GetSupportedConfigsForFeature)723 TEST_P(AudioEffectHidlTest, GetSupportedConfigsForFeature) {
724 description("Verify that GetSupportedConfigsForFeature does not crash");
725 Result retval = Result::OK;
726 Return<void> ret = effect->getSupportedConfigsForFeature(
727 0, 0, 0, [&](Result r, uint32_t, const hidl_vec<uint8_t>&) { retval = r; });
728 EXPECT_TRUE(ret.isOk());
729 EXPECT_NO_FATAL_FAILURE(checkResultForUseAfterClose(retval));
730 }
731
TEST_P(AudioEffectHidlTest,GetCurrentConfigForFeature)732 TEST_P(AudioEffectHidlTest, GetCurrentConfigForFeature) {
733 description("Verify that GetCurrentConfigForFeature does not crash");
734 Result retval = Result::OK;
735 Return<void> ret = effect->getCurrentConfigForFeature(
736 0, 0, [&](Result r, const hidl_vec<uint8_t>&) { retval = r; });
737 EXPECT_TRUE(ret.isOk());
738 EXPECT_NO_FATAL_FAILURE(checkResultForUseAfterClose(retval));
739 }
740
TEST_P(AudioEffectHidlTest,SetCurrentConfigForFeature)741 TEST_P(AudioEffectHidlTest, SetCurrentConfigForFeature) {
742 description("Verify that SetCurrentConfigForFeature does not crash");
743 Return<Result> ret = effect->setCurrentConfigForFeature(0, hidl_vec<uint8_t>());
744 EXPECT_TRUE(ret.isOk());
745 }
746
TEST_P(AudioEffectHidlTest,GetSupportedConfigsForFeatureInvalidConfigSize)747 TEST_P(AudioEffectHidlTest, GetSupportedConfigsForFeatureInvalidConfigSize) {
748 description("Verify that GetSupportedConfigsForFeature caps the maximum config size");
749 const bool isNewDeviceLaunchingOnTPlus = property_get_int32("ro.vendor.api_level", 0) >= 33;
750 if (!isNewDeviceLaunchingOnTPlus) {
751 GTEST_SKIP() << "The test only applies to devices launching on T or later";
752 }
753 if (useAfterClose) {
754 GTEST_SKIP() << "Does not make sense for the useAfterClose case";
755 }
756 // Use very large size to ensure that the service does not crash.
757 const uint32_t veryLargeConfigSize = std::numeric_limits<uint32_t>::max() - 100;
758 Result retval = Result::OK;
759 Return<void> ret = effect->getSupportedConfigsForFeature(
760 0, 1, veryLargeConfigSize,
761 [&](Result r, uint32_t, const hidl_vec<uint8_t>&) { retval = r; });
762 EXPECT_TRUE(ret.isOk());
763 EXPECT_EQ(Result::INVALID_ARGUMENTS, retval);
764 }
765
TEST_P(AudioEffectHidlTest,GetCurrentConfigForFeatureInvalidConfigSize)766 TEST_P(AudioEffectHidlTest, GetCurrentConfigForFeatureInvalidConfigSize) {
767 description("Verify that GetCurrentConfigForFeature caps the maximum config size");
768 const bool isNewDeviceLaunchingOnTPlus = property_get_int32("ro.vendor.api_level", 0) >= 33;
769 if (!isNewDeviceLaunchingOnTPlus) {
770 GTEST_SKIP() << "The test only applies to devices launching on T or later";
771 }
772 if (useAfterClose) {
773 GTEST_SKIP() << "Does not make sense for the useAfterClose case";
774 }
775 // Use very large size to ensure that the service does not crash.
776 const uint32_t veryLargeConfigSize = std::numeric_limits<uint32_t>::max() - 100;
777 Result retval = Result::OK;
778 Return<void> ret = effect->getCurrentConfigForFeature(
779 0, veryLargeConfigSize, [&](Result r, const hidl_vec<uint8_t>&) { retval = r; });
780 EXPECT_TRUE(ret.isOk());
781 EXPECT_EQ(Result::INVALID_ARGUMENTS, retval);
782 }
783
784 // The main test class for Equalizer Audio Effect HIDL HAL.
785 class EqualizerAudioEffectHidlTest : public AudioEffectHidlTest {
786 public:
SetUp()787 void SetUp() override {
788 AudioEffectHidlTest::SetUp();
789 equalizer = IEqualizerEffect::castFrom(effect);
790 ASSERT_NE(nullptr, equalizer.get());
791 }
792
TearDown()793 void TearDown() override {
794 equalizer.clear();
795 AudioEffectHidlTest::TearDown();
796 }
797
798 protected:
799 void getNumBands(uint16_t* numBands);
800 void getLevelRange(int16_t* minLevel, int16_t* maxLevel);
801 void getBandFrequencyRange(uint16_t band, uint32_t* minFreq, uint32_t* centerFreq,
802 uint32_t* maxFreq);
803 void getPresetCount(size_t* count);
804
805 sp<IEqualizerEffect> equalizer;
806 };
807
getNumBands(uint16_t * numBands)808 void EqualizerAudioEffectHidlTest::getNumBands(uint16_t* numBands) {
809 Result retval = Result::NOT_INITIALIZED;
810 Return<void> ret = equalizer->getNumBands([&](Result r, uint16_t b) {
811 retval = r;
812 if (retval == Result::OK) {
813 *numBands = b;
814 }
815 });
816 ASSERT_TRUE(ret.isOk());
817 ASSERT_NO_FATAL_FAILURE(checkResult(retval));
818 if (useAfterClose) *numBands = 1;
819 }
820
getLevelRange(int16_t * minLevel,int16_t * maxLevel)821 void EqualizerAudioEffectHidlTest::getLevelRange(int16_t* minLevel, int16_t* maxLevel) {
822 Result retval = Result::NOT_INITIALIZED;
823 Return<void> ret = equalizer->getLevelRange([&](Result r, int16_t min, int16_t max) {
824 retval = r;
825 if (retval == Result::OK) {
826 *minLevel = min;
827 *maxLevel = max;
828 }
829 });
830 ASSERT_TRUE(ret.isOk());
831 ASSERT_NO_FATAL_FAILURE(checkResult(retval));
832 if (useAfterClose) {
833 *minLevel = 0;
834 *maxLevel = 255;
835 }
836 }
837
getBandFrequencyRange(uint16_t band,uint32_t * minFreq,uint32_t * centerFreq,uint32_t * maxFreq)838 void EqualizerAudioEffectHidlTest::getBandFrequencyRange(uint16_t band, uint32_t* minFreq,
839 uint32_t* centerFreq, uint32_t* maxFreq) {
840 Result retval = Result::NOT_INITIALIZED;
841 Return<void> ret =
842 equalizer->getBandFrequencyRange(band, [&](Result r, uint32_t min, uint32_t max) {
843 retval = r;
844 if (retval == Result::OK) {
845 *minFreq = min;
846 *maxFreq = max;
847 }
848 });
849 ASSERT_TRUE(ret.isOk());
850 ASSERT_NO_FATAL_FAILURE(checkResult(retval));
851 ret = equalizer->getBandCenterFrequency(band, [&](Result r, uint32_t center) {
852 retval = r;
853 if (retval == Result::OK) {
854 *centerFreq = center;
855 }
856 });
857 ASSERT_TRUE(ret.isOk());
858 ASSERT_NO_FATAL_FAILURE(checkResult(retval));
859 if (useAfterClose) {
860 *minFreq = 20;
861 *centerFreq = 10000;
862 *maxFreq = 20000;
863 }
864 }
865
getPresetCount(size_t * count)866 void EqualizerAudioEffectHidlTest::getPresetCount(size_t* count) {
867 Result retval = Result::NOT_INITIALIZED;
868 Return<void> ret = equalizer->getPresetNames([&](Result r, const hidl_vec<hidl_string>& names) {
869 retval = r;
870 if (retval == Result::OK) {
871 *count = names.size();
872 }
873 });
874 ASSERT_TRUE(ret.isOk());
875 ASSERT_NO_FATAL_FAILURE(checkResult(retval));
876 if (useAfterClose) *count = 1;
877 }
878
TEST_P(EqualizerAudioEffectHidlTest,GetNumBands)879 TEST_P(EqualizerAudioEffectHidlTest, GetNumBands) {
880 description("Verify that Equalizer effect reports at least one band");
881 uint16_t numBands = 0;
882 ASSERT_NO_FATAL_FAILURE(getNumBands(&numBands));
883 EXPECT_GT(numBands, 0);
884 }
885
TEST_P(EqualizerAudioEffectHidlTest,GetLevelRange)886 TEST_P(EqualizerAudioEffectHidlTest, GetLevelRange) {
887 description("Verify that Equalizer effect reports adequate band level range");
888 int16_t minLevel = 0x7fff, maxLevel = 0;
889 ASSERT_NO_FATAL_FAILURE(getLevelRange(&minLevel, &maxLevel));
890 EXPECT_GT(maxLevel, minLevel);
891 }
892
TEST_P(EqualizerAudioEffectHidlTest,GetSetBandLevel)893 TEST_P(EqualizerAudioEffectHidlTest, GetSetBandLevel) {
894 description("Verify that manipulating band levels works for Equalizer effect");
895 uint16_t numBands = 0;
896 ASSERT_NO_FATAL_FAILURE(getNumBands(&numBands));
897 ASSERT_GT(numBands, 0);
898 int16_t levels[3]{0x7fff, 0, 0};
899 ASSERT_NO_FATAL_FAILURE(getLevelRange(&levels[0], &levels[2]));
900 ASSERT_GT(levels[2], levels[0]);
901 levels[1] = (levels[2] + levels[0]) / 2;
902 for (uint16_t i = 0; i < numBands; ++i) {
903 for (size_t j = 0; j < ARRAY_SIZE(levels); ++j) {
904 Return<Result> ret = equalizer->setBandLevel(i, levels[j]);
905 EXPECT_TRUE(ret.isOk());
906 EXPECT_NO_FATAL_FAILURE(checkResult(ret));
907 Result retval = Result::NOT_INITIALIZED;
908 int16_t actualLevel;
909 Return<void> ret2 = equalizer->getBandLevel(i, [&](Result r, int16_t l) {
910 retval = r;
911 if (retval == Result::OK) {
912 actualLevel = l;
913 }
914 });
915 EXPECT_TRUE(ret2.isOk());
916 EXPECT_NO_FATAL_FAILURE(checkResult(retval));
917 if (!useAfterClose) {
918 EXPECT_EQ(levels[j], actualLevel);
919 }
920 }
921 }
922 }
923
TEST_P(EqualizerAudioEffectHidlTest,GetBandCenterFrequencyAndRange)924 TEST_P(EqualizerAudioEffectHidlTest, GetBandCenterFrequencyAndRange) {
925 description("Verify that Equalizer effect reports adequate band frequency range");
926 uint16_t numBands = 0;
927 ASSERT_NO_FATAL_FAILURE(getNumBands(&numBands));
928 ASSERT_GT(numBands, 0);
929 for (uint16_t i = 0; i < numBands; ++i) {
930 uint32_t minFreq = 0xffffffff, centerFreq = 0xffffffff, maxFreq = 0xffffffff;
931 ASSERT_NO_FATAL_FAILURE(getBandFrequencyRange(i, &minFreq, ¢erFreq, &maxFreq));
932 // Note: NXP legacy implementation reports "1" as upper bound for last band,
933 // so this check fails.
934 EXPECT_GE(maxFreq, centerFreq);
935 EXPECT_GE(centerFreq, minFreq);
936 }
937 }
938
TEST_P(EqualizerAudioEffectHidlTest,GetBandForFrequency)939 TEST_P(EqualizerAudioEffectHidlTest, GetBandForFrequency) {
940 description("Verify that Equalizer effect supports GetBandForFrequency correctly");
941 uint16_t numBands = 0;
942 ASSERT_NO_FATAL_FAILURE(getNumBands(&numBands));
943 ASSERT_GT(numBands, 0);
944 for (uint16_t i = 0; i < numBands; ++i) {
945 uint32_t freqs[3]{0, 0, 0};
946 getBandFrequencyRange(i, &freqs[0], &freqs[1], &freqs[2]);
947 // NXP legacy implementation reports "1" as upper bound for last band, some
948 // of the checks fail.
949 for (size_t j = 0; j < ARRAY_SIZE(freqs); ++j) {
950 if (j == 0) {
951 freqs[j]++;
952 } // Min frequency is an open interval.
953 Result retval = Result::NOT_INITIALIZED;
954 uint16_t actualBand = numBands + 1;
955 Return<void> ret = equalizer->getBandForFrequency(freqs[j], [&](Result r, uint16_t b) {
956 retval = r;
957 if (retval == Result::OK) {
958 actualBand = b;
959 }
960 });
961 EXPECT_TRUE(ret.isOk());
962 EXPECT_NO_FATAL_FAILURE(checkResult(retval));
963 if (!useAfterClose) {
964 EXPECT_EQ(i, actualBand) << "Frequency: " << freqs[j];
965 }
966 }
967 }
968 }
969
TEST_P(EqualizerAudioEffectHidlTest,GetPresetNames)970 TEST_P(EqualizerAudioEffectHidlTest, GetPresetNames) {
971 description("Verify that Equalizer effect reports at least one preset");
972 size_t presetCount;
973 ASSERT_NO_FATAL_FAILURE(getPresetCount(&presetCount));
974 EXPECT_GT(presetCount, 0u);
975 }
976
TEST_P(EqualizerAudioEffectHidlTest,GetSetCurrentPreset)977 TEST_P(EqualizerAudioEffectHidlTest, GetSetCurrentPreset) {
978 description("Verify that manipulating the current preset for Equalizer effect");
979 size_t presetCount;
980 ASSERT_NO_FATAL_FAILURE(getPresetCount(&presetCount));
981 ASSERT_GT(presetCount, 0u);
982 for (uint16_t i = 0; i < presetCount; ++i) {
983 Return<Result> ret = equalizer->setCurrentPreset(i);
984 EXPECT_TRUE(ret.isOk());
985 EXPECT_NO_FATAL_FAILURE(checkResult(ret));
986 Result retval = Result::NOT_INITIALIZED;
987 uint16_t actualPreset = 0xffff;
988 Return<void> ret2 = equalizer->getCurrentPreset([&](Result r, uint16_t p) {
989 retval = r;
990 if (retval == Result::OK) {
991 actualPreset = p;
992 }
993 });
994 EXPECT_TRUE(ret2.isOk());
995 EXPECT_NO_FATAL_FAILURE(checkResult(retval));
996 if (!useAfterClose) {
997 EXPECT_EQ(i, actualPreset);
998 }
999 }
1000 }
1001
TEST_P(EqualizerAudioEffectHidlTest,GetSetAllProperties)1002 TEST_P(EqualizerAudioEffectHidlTest, GetSetAllProperties) {
1003 description(
1004 "Verify that setting band levels and presets works via Get / "
1005 "SetAllProperties for Equalizer effect");
1006 using AllProperties =
1007 ::android::hardware::audio::effect::CPP_VERSION::IEqualizerEffect::AllProperties;
1008 uint16_t numBands = 0;
1009 ASSERT_NO_FATAL_FAILURE(getNumBands(&numBands));
1010 ASSERT_GT(numBands, 0);
1011 AllProperties props;
1012 props.bandLevels.resize(numBands);
1013 for (size_t i = 0; i < numBands; ++i) {
1014 props.bandLevels[i] = 0;
1015 }
1016
1017 AllProperties actualProps;
1018 Result retval = Result::NOT_INITIALIZED;
1019
1020 // Verify setting of the band levels via properties.
1021 props.curPreset = -1;
1022 Return<Result> ret = equalizer->setAllProperties(props);
1023 EXPECT_TRUE(ret.isOk());
1024 EXPECT_NO_FATAL_FAILURE(checkResult(ret));
1025 Return<void> ret2 = equalizer->getAllProperties([&](Result r, AllProperties p) {
1026 retval = r;
1027 if (retval == Result::OK) {
1028 actualProps = p;
1029 }
1030 });
1031 EXPECT_TRUE(ret2.isOk());
1032 EXPECT_NO_FATAL_FAILURE(checkResult(retval));
1033 if (!useAfterClose) {
1034 EXPECT_EQ(props.bandLevels, actualProps.bandLevels);
1035 }
1036
1037 // Verify setting of the current preset via properties.
1038 props.curPreset = 0; // Assuming there is at least one preset.
1039 ret = equalizer->setAllProperties(props);
1040 EXPECT_TRUE(ret.isOk());
1041 EXPECT_NO_FATAL_FAILURE(checkResult(ret));
1042 ret2 = equalizer->getAllProperties([&](Result r, AllProperties p) {
1043 retval = r;
1044 if (retval == Result::OK) {
1045 actualProps = p;
1046 }
1047 });
1048 EXPECT_TRUE(ret2.isOk());
1049 EXPECT_NO_FATAL_FAILURE(checkResult(retval));
1050 if (!useAfterClose) {
1051 EXPECT_EQ(props.curPreset, actualProps.curPreset);
1052 }
1053 }
1054
1055 // The main test class for Equalizer Audio Effect HIDL HAL.
1056 class LoudnessEnhancerAudioEffectHidlTest : public AudioEffectHidlTest {
1057 public:
SetUp()1058 void SetUp() override {
1059 AudioEffectHidlTest::SetUp();
1060 enhancer = ILoudnessEnhancerEffect::castFrom(effect);
1061 ASSERT_NE(nullptr, enhancer.get());
1062 }
1063
TearDown()1064 void TearDown() override {
1065 enhancer.clear();
1066 AudioEffectHidlTest::TearDown();
1067 }
1068
1069 protected:
1070 sp<ILoudnessEnhancerEffect> enhancer;
1071 };
1072
TEST_P(LoudnessEnhancerAudioEffectHidlTest,GetSetTargetGain)1073 TEST_P(LoudnessEnhancerAudioEffectHidlTest, GetSetTargetGain) {
1074 description(
1075 "Verify that manipulating the target gain works for Loudness Enhancer "
1076 "effect");
1077 const int32_t gain = 100;
1078 Return<Result> ret = enhancer->setTargetGain(gain);
1079 EXPECT_TRUE(ret.isOk());
1080 EXPECT_NO_FATAL_FAILURE(checkResult(ret));
1081 int32_t actualGain = 0;
1082 Result retval;
1083 Return<void> ret2 = enhancer->getTargetGain([&](Result r, int32_t g) {
1084 retval = r;
1085 if (retval == Result::OK) {
1086 actualGain = g;
1087 }
1088 });
1089 EXPECT_TRUE(ret2.isOk());
1090 EXPECT_NO_FATAL_FAILURE(checkResult(retval));
1091 if (!useAfterClose) {
1092 EXPECT_EQ(gain, actualGain);
1093 }
1094 }
1095
1096 INSTANTIATE_TEST_SUITE_P(EffectsFactory, AudioEffectsFactoryHidlTest,
1097 ::testing::ValuesIn(::android::hardware::getAllHalInstanceNames(
1098 IEffectsFactory::descriptor)),
1099 ::android::hardware::PrintInstanceNameToString);
1100 INSTANTIATE_TEST_SUITE_P(
1101 Equalizer_IEffect, AudioEffectHidlTest,
1102 ::testing::Combine(::testing::ValuesIn(::android::hardware::getAllHalInstanceNames(
1103 IEffectsFactory::descriptor)),
1104 ::testing::Values(EQUALIZER_EFFECT_TYPE),
1105 ::testing::Values(false, true) /*useAfterClose*/),
1106 EffectParameterToString);
1107 INSTANTIATE_TEST_SUITE_P(
1108 LoudnessEnhancer_IEffect, AudioEffectHidlTest,
1109 ::testing::Combine(::testing::ValuesIn(::android::hardware::getAllHalInstanceNames(
1110 IEffectsFactory::descriptor)),
1111 ::testing::Values(LOUDNESS_ENHANCER_EFFECT_TYPE),
1112 ::testing::Values(false, true) /*useAfterClose*/),
1113 EffectParameterToString);
1114 INSTANTIATE_TEST_SUITE_P(
1115 Equalizer, EqualizerAudioEffectHidlTest,
1116 ::testing::Combine(::testing::ValuesIn(::android::hardware::getAllHalInstanceNames(
1117 IEffectsFactory::descriptor)),
1118 ::testing::Values(EQUALIZER_EFFECT_TYPE),
1119 ::testing::Values(false, true) /*useAfterClose*/),
1120 EffectParameterToString);
1121 INSTANTIATE_TEST_SUITE_P(
1122 LoudnessEnhancer, LoudnessEnhancerAudioEffectHidlTest,
1123 ::testing::Combine(::testing::ValuesIn(::android::hardware::getAllHalInstanceNames(
1124 IEffectsFactory::descriptor)),
1125 ::testing::Values(LOUDNESS_ENHANCER_EFFECT_TYPE),
1126 ::testing::Values(false, true) /*useAfterClose*/),
1127 EffectParameterToString);
1128 // When the VTS test runs on a device lacking the corresponding HAL version the parameter
1129 // list is empty, this isn't a problem.
1130 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(AudioEffectsFactoryHidlTest);
1131 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(AudioEffectHidlTest);
1132 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(EqualizerAudioEffectHidlTest);
1133 GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(LoudnessEnhancerAudioEffectHidlTest);
1134