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 #define LOG_TAG "AudioEffectHidlHalTest" 18 #include <android-base/logging.h> 19 #include <system/audio.h> 20 21 #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) 26 #include <android/hidl/allocator/1.0/IAllocator.h> 27 #include <android/hidl/memory/1.0/IMemory.h> 28 29 #include <common/all-versions/VersionUtils.h> 30 31 #include <VtsHalHidlTargetTestBase.h> 32 #include <VtsHalHidlTargetTestEnvBase.h> 33 34 using ::android::sp; 35 using ::android::hardware::hidl_handle; 36 using ::android::hardware::hidl_memory; 37 using ::android::hardware::hidl_string; 38 using ::android::hardware::hidl_vec; 39 using ::android::hardware::MQDescriptorSync; 40 using ::android::hardware::Return; 41 using ::android::hardware::Void; 42 using ::android::hardware::audio::common::utils::mkEnumBitfield; 43 using ::android::hidl::allocator::V1_0::IAllocator; 44 using ::android::hidl::memory::V1_0::IMemory; 45 using namespace ::android::hardware::audio::common::CPP_VERSION; 46 using namespace ::android::hardware::audio::effect::CPP_VERSION; 47 48 #ifndef ARRAY_SIZE 49 #define ARRAY_SIZE(a) (sizeof(a) / sizeof(*(a))) 50 #endif 51 52 // Test environment for Audio Effects Factory HIDL HAL. 53 class AudioEffectsFactoryHidlEnvironment : public ::testing::VtsHalHidlTargetTestEnvBase { 54 public: 55 // get the test environment singleton 56 static AudioEffectsFactoryHidlEnvironment* Instance() { 57 static AudioEffectsFactoryHidlEnvironment* instance = 58 new AudioEffectsFactoryHidlEnvironment; 59 return instance; 60 } 61 62 virtual void registerTestServices() override { registerTestService<IEffectsFactory>(); } 63 }; 64 65 // The main test class for Audio Effects Factory HIDL HAL. 66 class AudioEffectsFactoryHidlTest : public ::testing::VtsHalHidlTargetTestBase { 67 public: 68 void SetUp() override { 69 effectsFactory = ::testing::VtsHalHidlTargetTestBase::getService<IEffectsFactory>( 70 AudioEffectsFactoryHidlEnvironment::Instance()->getServiceName<IEffectsFactory>()); 71 ASSERT_NE(effectsFactory, nullptr); 72 } 73 74 void TearDown() override { effectsFactory.clear(); } 75 76 protected: 77 static void description(const std::string& description) { 78 RecordProperty("description", description); 79 } 80 81 sp<IEffectsFactory> effectsFactory; 82 }; 83 84 TEST_F(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 98 TEST_F(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 [&](Result r, const sp<IEffect>& result, uint64_t /*effectId*/) { 116 retval = r; 117 if (r == Result::OK) { 118 effect = result; 119 } 120 }); 121 EXPECT_TRUE(ret.isOk()); 122 EXPECT_EQ(Result::OK, retval); 123 EXPECT_NE(nullptr, effect.get()); 124 } 125 126 TEST_F(AudioEffectsFactoryHidlTest, GetDescriptor) { 127 description( 128 "Verify that effects factory can provide an effect descriptor via " 129 "GetDescriptor"); 130 hidl_vec<EffectDescriptor> allDescriptors; 131 Return<void> ret = 132 effectsFactory->getAllDescriptors([&](Result r, const hidl_vec<EffectDescriptor>& result) { 133 if (r == Result::OK) { 134 allDescriptors = result; 135 } 136 }); 137 ASSERT_TRUE(ret.isOk()); 138 ASSERT_GT(allDescriptors.size(), 0u); 139 for (size_t i = 0; i < allDescriptors.size(); ++i) { 140 ret = effectsFactory->getDescriptor(allDescriptors[i].uuid, 141 [&](Result r, const EffectDescriptor& result) { 142 EXPECT_EQ(r, Result::OK); 143 EXPECT_EQ(result, allDescriptors[i]); 144 }); 145 } 146 EXPECT_TRUE(ret.isOk()); 147 } 148 149 TEST_F(AudioEffectsFactoryHidlTest, DebugDumpInvalidArgument) { 150 description("Verify that debugDump doesn't crash on invalid arguments"); 151 #if MAJOR_VERSION == 2 152 Return<void> ret = effectsFactory->debugDump(hidl_handle()); 153 #elif MAJOR_VERSION >= 4 154 Return<void> ret = effectsFactory->debug(hidl_handle(), {}); 155 #endif 156 ASSERT_TRUE(ret.isOk()); 157 } 158 159 // Equalizer effect is required by CDD, but only the type is fixed. 160 // This is the same UUID as AudioEffect.EFFECT_TYPE_EQUALIZER in Java. 161 static const Uuid EQUALIZER_EFFECT_TYPE = { 162 0x0bed4300, 0xddd6, 0x11db, 0x8f34, 163 std::array<uint8_t, 6>{{0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}}}; 164 // Loudness Enhancer effect is required by CDD, but only the type is fixed. 165 // This is the same UUID as AudioEffect.EFFECT_TYPE_LOUDNESS_ENHANCER in Java. 166 static const Uuid LOUDNESS_ENHANCER_EFFECT_TYPE = { 167 0xfe3199be, 0xaed0, 0x413f, 0x87bb, 168 std::array<uint8_t, 6>{{0x11, 0x26, 0x0e, 0xb6, 0x3c, 0xf1}}}; 169 170 // The main test class for Audio Effect HIDL HAL. 171 class AudioEffectHidlTest : public ::testing::VtsHalHidlTargetTestBase { 172 public: 173 void SetUp() override { 174 effectsFactory = ::testing::VtsHalHidlTargetTestBase::getService<IEffectsFactory>(); 175 ASSERT_NE(nullptr, effectsFactory.get()); 176 177 findAndCreateEffect(getEffectType()); 178 ASSERT_NE(nullptr, effect.get()); 179 180 Return<Result> ret = effect->init(); 181 ASSERT_TRUE(ret.isOk()); 182 ASSERT_EQ(Result::OK, ret); 183 } 184 185 void TearDown() override { 186 effect.clear(); 187 effectsFactory.clear(); 188 } 189 190 protected: 191 static void description(const std::string& description) { 192 RecordProperty("description", description); 193 } 194 195 virtual Uuid getEffectType() { return EQUALIZER_EFFECT_TYPE; } 196 197 void findAndCreateEffect(const Uuid& type); 198 void findEffectInstance(const Uuid& type, Uuid* uuid); 199 void getChannelCount(uint32_t* channelCount); 200 201 sp<IEffectsFactory> effectsFactory; 202 sp<IEffect> effect; 203 }; 204 205 void AudioEffectHidlTest::findAndCreateEffect(const Uuid& type) { 206 Uuid effectUuid; 207 findEffectInstance(type, &effectUuid); 208 Return<void> ret = effectsFactory->createEffect( 209 effectUuid, 1 /*session*/, 1 /*ioHandle*/, 210 [&](Result r, const sp<IEffect>& result, uint64_t /*effectId*/) { 211 if (r == Result::OK) { 212 effect = result; 213 } 214 }); 215 ASSERT_TRUE(ret.isOk()); 216 } 217 218 void AudioEffectHidlTest::findEffectInstance(const Uuid& type, Uuid* uuid) { 219 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 } 230 } 231 }); 232 ASSERT_TRUE(ret.isOk()); 233 ASSERT_TRUE(effectFound); 234 } 235 236 void AudioEffectHidlTest::getChannelCount(uint32_t* channelCount) { 237 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)); 251 } 252 253 TEST_F(AudioEffectHidlTest, Close) { 254 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); 258 } 259 260 TEST_F(AudioEffectHidlTest, GetDescriptor) { 261 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) { 265 retval = r; 266 if (r == Result::OK) { 267 actualType = desc.type; 268 } 269 }); 270 EXPECT_TRUE(ret.isOk()); 271 EXPECT_EQ(Result::OK, retval); 272 EXPECT_EQ(getEffectType(), actualType); 273 } 274 275 TEST_F(AudioEffectHidlTest, GetSetConfig) { 276 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); 292 } 293 294 TEST_F(AudioEffectHidlTest, GetConfigReverse) { 295 description("Verify that GetConfigReverse does not crash"); 296 Return<void> ret = effect->getConfigReverse([&](Result, const EffectConfig&) {}); 297 EXPECT_TRUE(ret.isOk()); 298 } 299 300 TEST_F(AudioEffectHidlTest, GetSupportedAuxChannelsConfigs) { 301 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()); 305 } 306 307 TEST_F(AudioEffectHidlTest, GetAuxChannelsConfig) { 308 description("Verify that GetAuxChannelsConfig does not crash"); 309 Return<void> ret = effect->getAuxChannelsConfig([&](Result, const EffectAuxChannelsConfig&) {}); 310 EXPECT_TRUE(ret.isOk()); 311 } 312 313 TEST_F(AudioEffectHidlTest, SetAuxChannelsConfig) { 314 description("Verify that SetAuxChannelsConfig does not crash"); 315 Return<Result> ret = effect->setAuxChannelsConfig(EffectAuxChannelsConfig()); 316 EXPECT_TRUE(ret.isOk()); 317 } 318 319 // 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. 327 namespace android { 328 namespace hardware { 329 namespace audio { 330 namespace effect { 331 namespace CPP_VERSION { 332 inline bool operator==(const AudioBuffer& lhs, const AudioBuffer& rhs) { 333 return lhs.id == rhs.id && lhs.frameCount == rhs.frameCount && lhs.data.handle() == nullptr && 334 rhs.data.handle() == nullptr; 335 } 336 337 inline 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; 341 } 342 343 inline bool operator==(const EffectConfig& lhs, const EffectConfig& rhs) { 344 return lhs.inputCfg == rhs.inputCfg && lhs.outputCfg == rhs.outputCfg; 345 } 346 } // namespace CPP_VERSION 347 } // namespace effect 348 } // namespace audio 349 } // namespace hardware 350 } // namespace android 351 352 TEST_F(AudioEffectHidlTest, Reset) { 353 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); 375 } 376 377 TEST_F(AudioEffectHidlTest, DisableEnableDisable) { 378 description("Verify Disable -> Enable -> Disable sequence for an effect"); 379 Return<Result> ret = effect->disable(); 380 EXPECT_TRUE(ret.isOk()); 381 EXPECT_EQ(Result::INVALID_ARGUMENTS, ret); 382 ret = effect->enable(); 383 EXPECT_TRUE(ret.isOk()); 384 EXPECT_EQ(Result::OK, ret); 385 ret = effect->disable(); 386 EXPECT_TRUE(ret.isOk()); 387 EXPECT_EQ(Result::OK, ret); 388 } 389 390 TEST_F(AudioEffectHidlTest, SetDevice) { 391 description("Verify that SetDevice works for an output chain effect"); 392 Return<Result> ret = effect->setDevice(mkEnumBitfield(AudioDevice::OUT_SPEAKER)); 393 EXPECT_TRUE(ret.isOk()); 394 EXPECT_EQ(Result::OK, ret); 395 } 396 397 TEST_F(AudioEffectHidlTest, SetAndGetVolume) { 398 description("Verify that SetAndGetVolume method works for an effect"); 399 uint32_t channelCount; 400 getChannelCount(&channelCount); 401 hidl_vec<uint32_t> volumes; 402 volumes.resize(channelCount); 403 for (uint32_t i = 0; i < channelCount; ++i) { 404 volumes[i] = 0; 405 } 406 Result retval = Result::NOT_INITIALIZED; 407 Return<void> ret = 408 effect->setAndGetVolume(volumes, [&](Result r, const hidl_vec<uint32_t>&) { retval = r; }); 409 EXPECT_TRUE(ret.isOk()); 410 EXPECT_EQ(Result::OK, retval); 411 } 412 413 TEST_F(AudioEffectHidlTest, VolumeChangeNotification) { 414 description("Verify that effect accepts VolumeChangeNotification"); 415 uint32_t channelCount; 416 getChannelCount(&channelCount); 417 hidl_vec<uint32_t> volumes; 418 volumes.resize(channelCount); 419 for (uint32_t i = 0; i < channelCount; ++i) { 420 volumes[i] = 0; 421 } 422 Return<Result> ret = effect->volumeChangeNotification(volumes); 423 EXPECT_TRUE(ret.isOk()); 424 EXPECT_EQ(Result::OK, ret); 425 } 426 427 TEST_F(AudioEffectHidlTest, SetAudioMode) { 428 description("Verify that SetAudioMode works for an effect"); 429 Return<Result> ret = effect->setAudioMode(AudioMode::NORMAL); 430 EXPECT_TRUE(ret.isOk()); 431 EXPECT_EQ(Result::OK, ret); 432 } 433 434 TEST_F(AudioEffectHidlTest, SetConfigReverse) { 435 description("Verify that SetConfigReverse does not crash"); 436 Return<Result> ret = effect->setConfigReverse(EffectConfig(), nullptr, nullptr); 437 EXPECT_TRUE(ret.isOk()); 438 } 439 440 TEST_F(AudioEffectHidlTest, SetInputDevice) { 441 description("Verify that SetInputDevice does not crash"); 442 Return<Result> ret = effect->setInputDevice(mkEnumBitfield(AudioDevice::IN_BUILTIN_MIC)); 443 EXPECT_TRUE(ret.isOk()); 444 } 445 446 TEST_F(AudioEffectHidlTest, SetAudioSource) { 447 description("Verify that SetAudioSource does not crash"); 448 Return<Result> ret = effect->setAudioSource(AudioSource::MIC); 449 EXPECT_TRUE(ret.isOk()); 450 } 451 452 TEST_F(AudioEffectHidlTest, Offload) { 453 description("Verify that calling Offload method does not crash"); 454 EffectOffloadParameter offloadParam; 455 offloadParam.isOffload = false; 456 offloadParam.ioHandle = static_cast<int>(AudioHandleConsts::AUDIO_IO_HANDLE_NONE); 457 Return<Result> ret = effect->offload(offloadParam); 458 EXPECT_TRUE(ret.isOk()); 459 } 460 461 TEST_F(AudioEffectHidlTest, PrepareForProcessing) { 462 description("Verify that PrepareForProcessing method works for an effect"); 463 Result retval = Result::NOT_INITIALIZED; 464 Return<void> ret = effect->prepareForProcessing( 465 [&](Result r, const MQDescriptorSync<Result>&) { retval = r; }); 466 EXPECT_TRUE(ret.isOk()); 467 EXPECT_EQ(Result::OK, retval); 468 } 469 470 TEST_F(AudioEffectHidlTest, SetProcessBuffers) { 471 description("Verify that SetProcessBuffers works for an effect"); 472 sp<IAllocator> ashmem = IAllocator::getService("ashmem"); 473 ASSERT_NE(nullptr, ashmem.get()); 474 bool success = false; 475 AudioBuffer buffer; 476 Return<void> ret = ashmem->allocate(1024, [&](bool s, const hidl_memory& memory) { 477 success = s; 478 if (s) { 479 buffer.data = memory; 480 } 481 }); 482 ASSERT_TRUE(ret.isOk()); 483 ASSERT_TRUE(success); 484 Return<Result> ret2 = effect->setProcessBuffers(buffer, buffer); 485 EXPECT_TRUE(ret2.isOk()); 486 EXPECT_EQ(Result::OK, ret2); 487 } 488 489 TEST_F(AudioEffectHidlTest, Command) { 490 description("Verify that Command does not crash"); 491 Return<void> ret = 492 effect->command(0, hidl_vec<uint8_t>(), 0, [&](int32_t, const hidl_vec<uint8_t>&) {}); 493 EXPECT_TRUE(ret.isOk()); 494 } 495 496 TEST_F(AudioEffectHidlTest, SetParameter) { 497 description("Verify that SetParameter does not crash"); 498 Return<Result> ret = effect->setParameter(hidl_vec<uint8_t>(), hidl_vec<uint8_t>()); 499 EXPECT_TRUE(ret.isOk()); 500 } 501 502 TEST_F(AudioEffectHidlTest, GetParameter) { 503 description("Verify that GetParameter does not crash"); 504 Return<void> ret = 505 effect->getParameter(hidl_vec<uint8_t>(), 0, [&](Result, const hidl_vec<uint8_t>&) {}); 506 EXPECT_TRUE(ret.isOk()); 507 } 508 509 TEST_F(AudioEffectHidlTest, GetSupportedConfigsForFeature) { 510 description("Verify that GetSupportedConfigsForFeature does not crash"); 511 Return<void> ret = effect->getSupportedConfigsForFeature( 512 0, 0, 0, [&](Result, uint32_t, const hidl_vec<uint8_t>&) {}); 513 EXPECT_TRUE(ret.isOk()); 514 } 515 516 TEST_F(AudioEffectHidlTest, GetCurrentConfigForFeature) { 517 description("Verify that GetCurrentConfigForFeature does not crash"); 518 Return<void> ret = 519 effect->getCurrentConfigForFeature(0, 0, [&](Result, const hidl_vec<uint8_t>&) {}); 520 EXPECT_TRUE(ret.isOk()); 521 } 522 523 TEST_F(AudioEffectHidlTest, SetCurrentConfigForFeature) { 524 description("Verify that SetCurrentConfigForFeature does not crash"); 525 Return<Result> ret = effect->setCurrentConfigForFeature(0, hidl_vec<uint8_t>()); 526 EXPECT_TRUE(ret.isOk()); 527 } 528 529 // The main test class for Equalizer Audio Effect HIDL HAL. 530 class EqualizerAudioEffectHidlTest : public AudioEffectHidlTest { 531 public: 532 void SetUp() override { 533 AudioEffectHidlTest::SetUp(); 534 equalizer = IEqualizerEffect::castFrom(effect); 535 ASSERT_NE(nullptr, equalizer.get()); 536 } 537 538 protected: 539 Uuid getEffectType() override { return EQUALIZER_EFFECT_TYPE; } 540 void getNumBands(uint16_t* numBands); 541 void getLevelRange(int16_t* minLevel, int16_t* maxLevel); 542 void getBandFrequencyRange(uint16_t band, uint32_t* minFreq, uint32_t* centerFreq, 543 uint32_t* maxFreq); 544 void getPresetCount(size_t* count); 545 546 sp<IEqualizerEffect> equalizer; 547 }; 548 549 void EqualizerAudioEffectHidlTest::getNumBands(uint16_t* numBands) { 550 Result retval = Result::NOT_INITIALIZED; 551 Return<void> ret = equalizer->getNumBands([&](Result r, uint16_t b) { 552 retval = r; 553 if (retval == Result::OK) { 554 *numBands = b; 555 } 556 }); 557 ASSERT_TRUE(ret.isOk()); 558 ASSERT_EQ(Result::OK, retval); 559 } 560 561 void EqualizerAudioEffectHidlTest::getLevelRange(int16_t* minLevel, int16_t* maxLevel) { 562 Result retval = Result::NOT_INITIALIZED; 563 Return<void> ret = equalizer->getLevelRange([&](Result r, int16_t min, int16_t max) { 564 retval = r; 565 if (retval == Result::OK) { 566 *minLevel = min; 567 *maxLevel = max; 568 } 569 }); 570 ASSERT_TRUE(ret.isOk()); 571 ASSERT_EQ(Result::OK, retval); 572 } 573 574 void EqualizerAudioEffectHidlTest::getBandFrequencyRange(uint16_t band, uint32_t* minFreq, 575 uint32_t* centerFreq, uint32_t* maxFreq) { 576 Result retval = Result::NOT_INITIALIZED; 577 Return<void> ret = 578 equalizer->getBandFrequencyRange(band, [&](Result r, uint32_t min, uint32_t max) { 579 retval = r; 580 if (retval == Result::OK) { 581 *minFreq = min; 582 *maxFreq = max; 583 } 584 }); 585 ASSERT_TRUE(ret.isOk()); 586 ASSERT_EQ(Result::OK, retval); 587 ret = equalizer->getBandCenterFrequency(band, [&](Result r, uint32_t center) { 588 retval = r; 589 if (retval == Result::OK) { 590 *centerFreq = center; 591 } 592 }); 593 ASSERT_TRUE(ret.isOk()); 594 ASSERT_EQ(Result::OK, retval); 595 } 596 597 void EqualizerAudioEffectHidlTest::getPresetCount(size_t* count) { 598 Result retval = Result::NOT_INITIALIZED; 599 Return<void> ret = equalizer->getPresetNames([&](Result r, const hidl_vec<hidl_string>& names) { 600 retval = r; 601 if (retval == Result::OK) { 602 *count = names.size(); 603 } 604 }); 605 ASSERT_TRUE(ret.isOk()); 606 ASSERT_EQ(Result::OK, retval); 607 } 608 609 TEST_F(EqualizerAudioEffectHidlTest, GetNumBands) { 610 description("Verify that Equalizer effect reports at least one band"); 611 uint16_t numBands = 0; 612 getNumBands(&numBands); 613 EXPECT_GT(numBands, 0); 614 } 615 616 TEST_F(EqualizerAudioEffectHidlTest, GetLevelRange) { 617 description("Verify that Equalizer effect reports adequate band level range"); 618 int16_t minLevel = 0x7fff, maxLevel = 0; 619 getLevelRange(&minLevel, &maxLevel); 620 EXPECT_GT(maxLevel, minLevel); 621 } 622 623 TEST_F(EqualizerAudioEffectHidlTest, GetSetBandLevel) { 624 description("Verify that manipulating band levels works for Equalizer effect"); 625 uint16_t numBands = 0; 626 getNumBands(&numBands); 627 ASSERT_GT(numBands, 0); 628 int16_t levels[3]{0x7fff, 0, 0}; 629 getLevelRange(&levels[0], &levels[2]); 630 ASSERT_GT(levels[2], levels[0]); 631 levels[1] = (levels[2] + levels[0]) / 2; 632 for (uint16_t i = 0; i < numBands; ++i) { 633 for (size_t j = 0; j < ARRAY_SIZE(levels); ++j) { 634 Return<Result> ret = equalizer->setBandLevel(i, levels[j]); 635 EXPECT_TRUE(ret.isOk()); 636 EXPECT_EQ(Result::OK, ret); 637 Result retval = Result::NOT_INITIALIZED; 638 int16_t actualLevel; 639 Return<void> ret2 = equalizer->getBandLevel(i, [&](Result r, int16_t l) { 640 retval = r; 641 if (retval == Result::OK) { 642 actualLevel = l; 643 } 644 }); 645 EXPECT_TRUE(ret2.isOk()); 646 EXPECT_EQ(Result::OK, retval); 647 EXPECT_EQ(levels[j], actualLevel); 648 } 649 } 650 } 651 652 TEST_F(EqualizerAudioEffectHidlTest, GetBandCenterFrequencyAndRange) { 653 description("Verify that Equalizer effect reports adequate band frequency range"); 654 uint16_t numBands = 0; 655 getNumBands(&numBands); 656 ASSERT_GT(numBands, 0); 657 for (uint16_t i = 0; i < numBands; ++i) { 658 uint32_t minFreq = 0xffffffff, centerFreq = 0xffffffff, maxFreq = 0xffffffff; 659 getBandFrequencyRange(i, &minFreq, ¢erFreq, &maxFreq); 660 // Note: NXP legacy implementation reports "1" as upper bound for last band, 661 // so this check fails. 662 EXPECT_GE(maxFreq, centerFreq); 663 EXPECT_GE(centerFreq, minFreq); 664 } 665 } 666 667 TEST_F(EqualizerAudioEffectHidlTest, GetBandForFrequency) { 668 description("Verify that Equalizer effect supports GetBandForFrequency correctly"); 669 uint16_t numBands = 0; 670 getNumBands(&numBands); 671 ASSERT_GT(numBands, 0); 672 for (uint16_t i = 0; i < numBands; ++i) { 673 uint32_t freqs[3]{0, 0, 0}; 674 getBandFrequencyRange(i, &freqs[0], &freqs[1], &freqs[2]); 675 // NXP legacy implementation reports "1" as upper bound for last band, some 676 // of the checks fail. 677 for (size_t j = 0; j < ARRAY_SIZE(freqs); ++j) { 678 if (j == 0) { 679 freqs[j]++; 680 } // Min frequency is an open interval. 681 Result retval = Result::NOT_INITIALIZED; 682 uint16_t actualBand = numBands + 1; 683 Return<void> ret = equalizer->getBandForFrequency(freqs[j], [&](Result r, uint16_t b) { 684 retval = r; 685 if (retval == Result::OK) { 686 actualBand = b; 687 } 688 }); 689 EXPECT_TRUE(ret.isOk()); 690 EXPECT_EQ(Result::OK, retval); 691 EXPECT_EQ(i, actualBand) << "Frequency: " << freqs[j]; 692 } 693 } 694 } 695 696 TEST_F(EqualizerAudioEffectHidlTest, GetPresetNames) { 697 description("Verify that Equalizer effect reports at least one preset"); 698 size_t presetCount; 699 getPresetCount(&presetCount); 700 EXPECT_GT(presetCount, 0u); 701 } 702 703 TEST_F(EqualizerAudioEffectHidlTest, GetSetCurrentPreset) { 704 description("Verify that manipulating the current preset for Equalizer effect"); 705 size_t presetCount; 706 getPresetCount(&presetCount); 707 ASSERT_GT(presetCount, 0u); 708 for (uint16_t i = 0; i < presetCount; ++i) { 709 Return<Result> ret = equalizer->setCurrentPreset(i); 710 EXPECT_TRUE(ret.isOk()); 711 EXPECT_EQ(Result::OK, ret); 712 Result retval = Result::NOT_INITIALIZED; 713 uint16_t actualPreset = 0xffff; 714 Return<void> ret2 = equalizer->getCurrentPreset([&](Result r, uint16_t p) { 715 retval = r; 716 if (retval == Result::OK) { 717 actualPreset = p; 718 } 719 }); 720 EXPECT_TRUE(ret2.isOk()); 721 EXPECT_EQ(Result::OK, retval); 722 EXPECT_EQ(i, actualPreset); 723 } 724 } 725 726 TEST_F(EqualizerAudioEffectHidlTest, GetSetAllProperties) { 727 description( 728 "Verify that setting band levels and presets works via Get / " 729 "SetAllProperties for Equalizer effect"); 730 using AllProperties = 731 ::android::hardware::audio::effect::CPP_VERSION::IEqualizerEffect::AllProperties; 732 uint16_t numBands = 0; 733 getNumBands(&numBands); 734 ASSERT_GT(numBands, 0); 735 AllProperties props; 736 props.bandLevels.resize(numBands); 737 for (size_t i = 0; i < numBands; ++i) { 738 props.bandLevels[i] = 0; 739 } 740 741 AllProperties actualProps; 742 Result retval = Result::NOT_INITIALIZED; 743 744 // Verify setting of the band levels via properties. 745 props.curPreset = -1; 746 Return<Result> ret = equalizer->setAllProperties(props); 747 EXPECT_TRUE(ret.isOk()); 748 EXPECT_EQ(Result::OK, ret); 749 Return<void> ret2 = equalizer->getAllProperties([&](Result r, AllProperties p) { 750 retval = r; 751 if (retval == Result::OK) { 752 actualProps = p; 753 } 754 }); 755 EXPECT_TRUE(ret2.isOk()); 756 EXPECT_EQ(Result::OK, retval); 757 EXPECT_EQ(props.bandLevels, actualProps.bandLevels); 758 759 // Verify setting of the current preset via properties. 760 props.curPreset = 0; // Assuming there is at least one preset. 761 ret = equalizer->setAllProperties(props); 762 EXPECT_TRUE(ret.isOk()); 763 EXPECT_EQ(Result::OK, ret); 764 ret2 = equalizer->getAllProperties([&](Result r, AllProperties p) { 765 retval = r; 766 if (retval == Result::OK) { 767 actualProps = p; 768 } 769 }); 770 EXPECT_TRUE(ret2.isOk()); 771 EXPECT_EQ(Result::OK, retval); 772 EXPECT_EQ(props.curPreset, actualProps.curPreset); 773 } 774 775 // The main test class for Equalizer Audio Effect HIDL HAL. 776 class LoudnessEnhancerAudioEffectHidlTest : public AudioEffectHidlTest { 777 public: 778 void SetUp() override { 779 AudioEffectHidlTest::SetUp(); 780 enhancer = ILoudnessEnhancerEffect::castFrom(effect); 781 ASSERT_NE(nullptr, enhancer.get()); 782 } 783 784 protected: 785 Uuid getEffectType() override { return LOUDNESS_ENHANCER_EFFECT_TYPE; } 786 787 sp<ILoudnessEnhancerEffect> enhancer; 788 }; 789 790 TEST_F(LoudnessEnhancerAudioEffectHidlTest, GetSetTargetGain) { 791 description( 792 "Verify that manipulating the target gain works for Loudness Enhancer " 793 "effect"); 794 const int32_t gain = 100; 795 Return<Result> ret = enhancer->setTargetGain(gain); 796 EXPECT_TRUE(ret.isOk()); 797 EXPECT_EQ(Result::OK, ret); 798 int32_t actualGain = 0; 799 Result retval; 800 Return<void> ret2 = enhancer->getTargetGain([&](Result r, int32_t g) { 801 retval = r; 802 if (retval == Result::OK) { 803 actualGain = g; 804 } 805 }); 806 EXPECT_TRUE(ret2.isOk()); 807 EXPECT_EQ(Result::OK, retval); 808 EXPECT_EQ(gain, actualGain); 809 } 810 811 int main(int argc, char** argv) { 812 ::testing::AddGlobalTestEnvironment(AudioEffectsFactoryHidlEnvironment::Instance()); 813 ::testing::InitGoogleTest(&argc, argv); 814 AudioEffectsFactoryHidlEnvironment::Instance()->init(&argc, argv); 815 int status = RUN_ALL_TESTS(); 816 LOG(INFO) << "Test result = " << status; 817 return status; 818 } 819