blob: 35ff8693a483ba6a64650b0e0e63d102f463ee2b [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
Mikhail Naganov0dbf3982021-01-08 17:48:22 -080017#include <vector>
18
Mikhail Naganovbf393172016-11-11 16:24:50 -080019#define LOG_TAG "AudioEffectHidlHalTest"
20#include <android-base/logging.h>
Mikhail Naganovd72a7c22020-08-14 00:16:09 +000021#if MAJOR_VERSION <= 6
Mikhail Naganov9f289042017-02-23 08:39:36 -080022#include <system/audio.h>
Mikhail Naganovd72a7c22020-08-14 00:16:09 +000023#endif
Mikhail Naganovbf393172016-11-11 16:24:50 -080024
Kevin Rocard96d2cd92018-11-14 16:22:07 -080025#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)
Mikhail Naganov9f289042017-02-23 08:39:36 -080030#include <android/hidl/allocator/1.0/IAllocator.h>
31#include <android/hidl/memory/1.0/IMemory.h>
Mikhail Naganovd72a7c22020-08-14 00:16:09 +000032#if MAJOR_VERSION >= 7
Hayden Gomes4e7d69e2020-11-06 15:15:26 -080033#include <android_audio_policy_configuration_V7_0-enums.h>
34#include <android_audio_policy_configuration_V7_0.h>
Mikhail Naganovd72a7c22020-08-14 00:16:09 +000035#endif
Mikhail Naganovbf393172016-11-11 16:24:50 -080036
Kevin Rocardf5305b32018-11-13 10:41:53 -080037#include <common/all-versions/VersionUtils.h>
38
Mikhail Naganov315ce412019-10-23 16:46:54 -070039#include <gtest/gtest.h>
40#include <hidl/GtestPrinter.h>
41#include <hidl/ServiceManagement.h>
Mikhail Naganovbf393172016-11-11 16:24:50 -080042
Mikhail Naganov00a44c02018-12-14 14:31:45 -080043using ::android::sp;
44using ::android::hardware::hidl_handle;
45using ::android::hardware::hidl_memory;
46using ::android::hardware::hidl_string;
47using ::android::hardware::hidl_vec;
48using ::android::hardware::MQDescriptorSync;
49using ::android::hardware::Return;
50using ::android::hardware::Void;
51using ::android::hardware::audio::common::utils::mkEnumBitfield;
52using ::android::hidl::allocator::V1_0::IAllocator;
53using ::android::hidl::memory::V1_0::IMemory;
54using namespace ::android::hardware::audio::common::CPP_VERSION;
55using namespace ::android::hardware::audio::effect::CPP_VERSION;
Mikhail Naganovd72a7c22020-08-14 00:16:09 +000056#if MAJOR_VERSION >= 7
57// Make an alias for enumerations generated from the APM config XSD.
58namespace xsd {
Hayden Gomes4e7d69e2020-11-06 15:15:26 -080059using namespace ::android::audio::policy::configuration::CPP_VERSION;
Mikhail Naganovd72a7c22020-08-14 00:16:09 +000060}
61#endif
Mikhail Naganovbf393172016-11-11 16:24:50 -080062
Mikhail Naganov9f289042017-02-23 08:39:36 -080063#ifndef ARRAY_SIZE
64#define ARRAY_SIZE(a) (sizeof(a) / sizeof(*(a)))
65#endif
66
Mikhail Naganov315ce412019-10-23 16:46:54 -070067class AudioEffectsFactoryHidlTest : public ::testing::TestWithParam<std::string> {
68 public:
69 void SetUp() override {
70 effectsFactory = IEffectsFactory::getService(GetParam());
71 ASSERT_NE(effectsFactory, nullptr);
72 }
Kevin Rocard55b10612018-11-12 12:33:16 -080073 void TearDown() override { effectsFactory.clear(); }
Mikhail Naganov9f289042017-02-23 08:39:36 -080074
Kevin Rocard55b10612018-11-12 12:33:16 -080075 protected:
76 static void description(const std::string& description) {
77 RecordProperty("description", description);
78 }
Mikhail Naganovbf393172016-11-11 16:24:50 -080079
Kevin Rocard55b10612018-11-12 12:33:16 -080080 sp<IEffectsFactory> effectsFactory;
Mikhail Naganovbf393172016-11-11 16:24:50 -080081};
82
nelsonli3c12e582019-12-12 13:53:49 +080083TEST_P(AudioEffectsFactoryHidlTest, EnumerateEffects) {
Kevin Rocard55b10612018-11-12 12:33:16 -080084 description("Verify that EnumerateEffects returns at least one effect");
85 Result retval = Result::NOT_INITIALIZED;
86 size_t effectCount = 0;
87 Return<void> ret =
88 effectsFactory->getAllDescriptors([&](Result r, const hidl_vec<EffectDescriptor>& result) {
89 retval = r;
90 effectCount = result.size();
91 });
92 EXPECT_TRUE(ret.isOk());
93 EXPECT_EQ(Result::OK, retval);
94 EXPECT_GT(effectCount, 0u);
Mikhail Naganovbf393172016-11-11 16:24:50 -080095}
96
nelsonli3c12e582019-12-12 13:53:49 +080097TEST_P(AudioEffectsFactoryHidlTest, CreateEffect) {
Kevin Rocard55b10612018-11-12 12:33:16 -080098 description("Verify that an effect can be created via CreateEffect");
99 bool gotEffect = false;
100 Uuid effectUuid;
101 Return<void> ret =
102 effectsFactory->getAllDescriptors([&](Result r, const hidl_vec<EffectDescriptor>& result) {
103 if (r == Result::OK && result.size() > 0) {
104 gotEffect = true;
105 effectUuid = result[0].uuid;
106 }
107 });
108 ASSERT_TRUE(ret.isOk());
109 ASSERT_TRUE(gotEffect);
110 Result retval = Result::NOT_INITIALIZED;
111 sp<IEffect> effect;
112 ret = effectsFactory->createEffect(
Eric Laurentd33e6932019-11-13 13:47:50 -0800113 effectUuid, 1 /*session*/, 1 /*ioHandle*/,
114#if MAJOR_VERSION >= 6
115 0 /*device*/,
116#endif
117 [&](Result r, const sp<IEffect>& result, uint64_t /*effectId*/) {
118 retval = r;
119 if (r == Result::OK) {
120 effect = result;
121 }
122 });
Kevin Rocard55b10612018-11-12 12:33:16 -0800123 EXPECT_TRUE(ret.isOk());
124 EXPECT_EQ(Result::OK, retval);
125 EXPECT_NE(nullptr, effect.get());
Mikhail Naganovbf393172016-11-11 16:24:50 -0800126}
127
nelsonli3c12e582019-12-12 13:53:49 +0800128TEST_P(AudioEffectsFactoryHidlTest, GetDescriptor) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800129 description(
130 "Verify that effects factory can provide an effect descriptor via "
131 "GetDescriptor");
132 hidl_vec<EffectDescriptor> allDescriptors;
133 Return<void> ret =
134 effectsFactory->getAllDescriptors([&](Result r, const hidl_vec<EffectDescriptor>& result) {
135 if (r == Result::OK) {
136 allDescriptors = result;
137 }
Mikhail Naganovbf393172016-11-11 16:24:50 -0800138 });
Kevin Rocard55b10612018-11-12 12:33:16 -0800139 ASSERT_TRUE(ret.isOk());
140 ASSERT_GT(allDescriptors.size(), 0u);
141 for (size_t i = 0; i < allDescriptors.size(); ++i) {
142 ret = effectsFactory->getDescriptor(allDescriptors[i].uuid,
143 [&](Result r, const EffectDescriptor& result) {
144 EXPECT_EQ(r, Result::OK);
145 EXPECT_EQ(result, allDescriptors[i]);
146 });
147 }
148 EXPECT_TRUE(ret.isOk());
Mikhail Naganovbf393172016-11-11 16:24:50 -0800149}
150
nelsonli3c12e582019-12-12 13:53:49 +0800151TEST_P(AudioEffectsFactoryHidlTest, DebugDumpInvalidArgument) {
Mikhail Naganov3e6fe752017-04-24 10:44:08 -0700152 description("Verify that debugDump doesn't crash on invalid arguments");
Kevin Rocard96d2cd92018-11-14 16:22:07 -0800153#if MAJOR_VERSION == 2
Mikhail Naganov3e6fe752017-04-24 10:44:08 -0700154 Return<void> ret = effectsFactory->debugDump(hidl_handle());
Kevin Rocard20614ba2018-11-10 07:20:17 -0800155#elif MAJOR_VERSION >= 4
Kevin Rocard96d2cd92018-11-14 16:22:07 -0800156 Return<void> ret = effectsFactory->debug(hidl_handle(), {});
157#endif
Mikhail Naganov3e6fe752017-04-24 10:44:08 -0700158 ASSERT_TRUE(ret.isOk());
159}
160
Mikhail Naganov9f289042017-02-23 08:39:36 -0800161// Equalizer effect is required by CDD, but only the type is fixed.
162// This is the same UUID as AudioEffect.EFFECT_TYPE_EQUALIZER in Java.
163static const Uuid EQUALIZER_EFFECT_TYPE = {
164 0x0bed4300, 0xddd6, 0x11db, 0x8f34,
165 std::array<uint8_t, 6>{{0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}}};
166// Loudness Enhancer effect is required by CDD, but only the type is fixed.
167// This is the same UUID as AudioEffect.EFFECT_TYPE_LOUDNESS_ENHANCER in Java.
168static const Uuid LOUDNESS_ENHANCER_EFFECT_TYPE = {
169 0xfe3199be, 0xaed0, 0x413f, 0x87bb,
170 std::array<uint8_t, 6>{{0x11, 0x26, 0x0e, 0xb6, 0x3c, 0xf1}}};
171
Mikhail Naganov892d1472020-03-19 10:44:06 -0700172enum { PARAM_FACTORY_NAME, PARAM_EFFECT_UUID };
173using EffectParameter = std::tuple<std::string, Uuid>;
174
175static inline std::string EffectParameterToString(
176 const ::testing::TestParamInfo<EffectParameter>& info) {
177 return ::android::hardware::PrintInstanceNameToString(::testing::TestParamInfo<std::string>{
178 std::get<PARAM_FACTORY_NAME>(info.param), info.index});
179}
180
Mikhail Naganov9f289042017-02-23 08:39:36 -0800181// The main test class for Audio Effect HIDL HAL.
Mikhail Naganov892d1472020-03-19 10:44:06 -0700182class AudioEffectHidlTest : public ::testing::TestWithParam<EffectParameter> {
Mikhail Naganov315ce412019-10-23 16:46:54 -0700183 public:
184 void SetUp() override {
Mikhail Naganov892d1472020-03-19 10:44:06 -0700185 effectsFactory = IEffectsFactory::getService(std::get<PARAM_FACTORY_NAME>(GetParam()));
Kevin Rocard55b10612018-11-12 12:33:16 -0800186 ASSERT_NE(nullptr, effectsFactory.get());
Mikhail Naganov9f289042017-02-23 08:39:36 -0800187
Mikhail Naganovd72a7c22020-08-14 00:16:09 +0000188 ASSERT_NO_FATAL_FAILURE(findAndCreateEffect(getEffectType()));
Kevin Rocard55b10612018-11-12 12:33:16 -0800189 ASSERT_NE(nullptr, effect.get());
Mikhail Naganov9f289042017-02-23 08:39:36 -0800190
Kevin Rocard55b10612018-11-12 12:33:16 -0800191 Return<Result> ret = effect->init();
192 ASSERT_TRUE(ret.isOk());
193 ASSERT_EQ(Result::OK, ret);
194 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800195
Kevin Rocard55b10612018-11-12 12:33:16 -0800196 void TearDown() override {
197 effect.clear();
198 effectsFactory.clear();
199 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800200
Kevin Rocard55b10612018-11-12 12:33:16 -0800201 protected:
202 static void description(const std::string& description) {
203 RecordProperty("description", description);
204 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800205
Mikhail Naganov892d1472020-03-19 10:44:06 -0700206 Uuid getEffectType() const { return std::get<PARAM_EFFECT_UUID>(GetParam()); }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800207
Kevin Rocard55b10612018-11-12 12:33:16 -0800208 void findAndCreateEffect(const Uuid& type);
209 void findEffectInstance(const Uuid& type, Uuid* uuid);
210 void getChannelCount(uint32_t* channelCount);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800211
Kevin Rocard55b10612018-11-12 12:33:16 -0800212 sp<IEffectsFactory> effectsFactory;
213 sp<IEffect> effect;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800214};
215
216void AudioEffectHidlTest::findAndCreateEffect(const Uuid& type) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800217 Uuid effectUuid;
Mikhail Naganovd72a7c22020-08-14 00:16:09 +0000218 ASSERT_NO_FATAL_FAILURE(findEffectInstance(type, &effectUuid));
Kevin Rocard55b10612018-11-12 12:33:16 -0800219 Return<void> ret = effectsFactory->createEffect(
Eric Laurentd33e6932019-11-13 13:47:50 -0800220 effectUuid, 1 /*session*/, 1 /*ioHandle*/,
221#if MAJOR_VERSION >= 6
222 0 /*device*/,
223#endif
224 [&](Result r, const sp<IEffect>& result, uint64_t /*effectId*/) {
225 if (r == Result::OK) {
226 effect = result;
227 }
228 });
Kevin Rocard55b10612018-11-12 12:33:16 -0800229 ASSERT_TRUE(ret.isOk());
Mikhail Naganov9f289042017-02-23 08:39:36 -0800230}
231
232void AudioEffectHidlTest::findEffectInstance(const Uuid& type, Uuid* uuid) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800233 bool effectFound = false;
234 Return<void> ret =
235 effectsFactory->getAllDescriptors([&](Result r, const hidl_vec<EffectDescriptor>& result) {
236 if (r == Result::OK) {
237 for (const auto& desc : result) {
238 if (desc.type == type) {
239 effectFound = true;
240 *uuid = desc.uuid;
241 break;
242 }
243 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800244 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800245 });
246 ASSERT_TRUE(ret.isOk());
247 ASSERT_TRUE(effectFound);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800248}
249
250void AudioEffectHidlTest::getChannelCount(uint32_t* channelCount) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800251 Result retval;
252 EffectConfig currentConfig;
253 Return<void> ret = effect->getConfig([&](Result r, const EffectConfig& conf) {
254 retval = r;
255 if (r == Result::OK) {
256 currentConfig = conf;
257 }
258 });
259 ASSERT_TRUE(ret.isOk());
260 ASSERT_EQ(Result::OK, retval);
Mikhail Naganovd72a7c22020-08-14 00:16:09 +0000261#if MAJOR_VERSION <= 6
Kevin Rocard55b10612018-11-12 12:33:16 -0800262 ASSERT_TRUE(audio_channel_mask_is_valid(
263 static_cast<audio_channel_mask_t>(currentConfig.outputCfg.channels)));
264 *channelCount = audio_channel_count_from_out_mask(
265 static_cast<audio_channel_mask_t>(currentConfig.outputCfg.channels));
Mikhail Naganovd72a7c22020-08-14 00:16:09 +0000266#else
Hayden Gomes4e7d69e2020-11-06 15:15:26 -0800267 *channelCount = android::audio::policy::configuration::V7_0::getChannelCount(
Mikhail Naganovf363ed42020-12-10 18:47:51 -0800268 currentConfig.outputCfg.base.channelMask);
Mikhail Naganovd72a7c22020-08-14 00:16:09 +0000269 ASSERT_NE(*channelCount, 0);
270#endif
Mikhail Naganov9f289042017-02-23 08:39:36 -0800271}
272
nelsonli3c12e582019-12-12 13:53:49 +0800273TEST_P(AudioEffectHidlTest, Close) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800274 description("Verify that an effect can be closed");
275 Return<Result> ret = effect->close();
276 EXPECT_TRUE(ret.isOk());
277 EXPECT_EQ(Result::OK, ret);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800278}
279
nelsonli3c12e582019-12-12 13:53:49 +0800280TEST_P(AudioEffectHidlTest, GetDescriptor) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800281 description("Verify that an effect can return its own descriptor via GetDescriptor");
282 Result retval = Result::NOT_INITIALIZED;
283 Uuid actualType;
284 Return<void> ret = effect->getDescriptor([&](Result r, const EffectDescriptor& desc) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800285 retval = r;
286 if (r == Result::OK) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800287 actualType = desc.type;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800288 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800289 });
290 EXPECT_TRUE(ret.isOk());
291 EXPECT_EQ(Result::OK, retval);
292 EXPECT_EQ(getEffectType(), actualType);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800293}
294
nelsonli3c12e582019-12-12 13:53:49 +0800295TEST_P(AudioEffectHidlTest, GetSetConfig) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800296 description(
297 "Verify that it is possible to manipulate effect config via Get / "
298 "SetConfig");
299 Result retval = Result::NOT_INITIALIZED;
300 EffectConfig currentConfig;
301 Return<void> ret = effect->getConfig([&](Result r, const EffectConfig& conf) {
302 retval = r;
303 if (r == Result::OK) {
304 currentConfig = conf;
305 }
306 });
307 EXPECT_TRUE(ret.isOk());
308 EXPECT_EQ(Result::OK, retval);
309 Return<Result> ret2 = effect->setConfig(currentConfig, nullptr, nullptr);
310 EXPECT_TRUE(ret2.isOk());
311 EXPECT_EQ(Result::OK, ret2);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800312}
313
Mikhail Naganov0dbf3982021-01-08 17:48:22 -0800314#if MAJOR_VERSION >= 7
315std::vector<EffectBufferConfig> generateInvalidConfigs(const EffectBufferConfig& src) {
316 std::vector<EffectBufferConfig> result;
317 EffectBufferConfig invalidFormat = src;
318 invalidFormat.base.format = "random_string";
319 result.push_back(std::move(invalidFormat));
320 EffectBufferConfig invalidChannelMask = src;
321 invalidChannelMask.base.channelMask = "random_string";
322 result.push_back(std::move(invalidChannelMask));
323 return result;
324}
325
326TEST_P(AudioEffectHidlTest, SetConfigInvalidArguments) {
327 description("Verify that invalid arguments are rejected by SetConfig");
328 Result retval = Result::NOT_INITIALIZED;
329 EffectConfig currentConfig;
330 Return<void> ret = effect->getConfig([&](Result r, const EffectConfig& conf) {
331 retval = r;
332 if (r == Result::OK) {
333 currentConfig = conf;
334 }
335 });
336 EXPECT_TRUE(ret.isOk());
337 EXPECT_EQ(Result::OK, retval);
338 for (const auto& invalidInputCfg : generateInvalidConfigs(currentConfig.inputCfg)) {
339 EffectConfig invalidConfig = currentConfig;
340 invalidConfig.inputCfg = invalidInputCfg;
341 Return<Result> ret = effect->setConfig(invalidConfig, nullptr, nullptr);
342 EXPECT_TRUE(ret.isOk());
343 EXPECT_EQ(Result::INVALID_ARGUMENTS, ret);
344 }
345 for (const auto& invalidOutputCfg : generateInvalidConfigs(currentConfig.outputCfg)) {
346 EffectConfig invalidConfig = currentConfig;
347 invalidConfig.outputCfg = invalidOutputCfg;
348 Return<Result> ret = effect->setConfig(invalidConfig, nullptr, nullptr);
349 EXPECT_TRUE(ret.isOk());
350 EXPECT_EQ(Result::INVALID_ARGUMENTS, ret);
351 }
352}
353#endif
354
nelsonli3c12e582019-12-12 13:53:49 +0800355TEST_P(AudioEffectHidlTest, GetConfigReverse) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800356 description("Verify that GetConfigReverse does not crash");
357 Return<void> ret = effect->getConfigReverse([&](Result, const EffectConfig&) {});
358 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700359}
360
nelsonli3c12e582019-12-12 13:53:49 +0800361TEST_P(AudioEffectHidlTest, GetSupportedAuxChannelsConfigs) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800362 description("Verify that GetSupportedAuxChannelsConfigs does not crash");
363 Return<void> ret = effect->getSupportedAuxChannelsConfigs(
364 0, [&](Result, const hidl_vec<EffectAuxChannelsConfig>&) {});
365 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700366}
367
nelsonli3c12e582019-12-12 13:53:49 +0800368TEST_P(AudioEffectHidlTest, GetAuxChannelsConfig) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800369 description("Verify that GetAuxChannelsConfig does not crash");
370 Return<void> ret = effect->getAuxChannelsConfig([&](Result, const EffectAuxChannelsConfig&) {});
371 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700372}
373
nelsonli3c12e582019-12-12 13:53:49 +0800374TEST_P(AudioEffectHidlTest, SetAuxChannelsConfig) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800375 description("Verify that SetAuxChannelsConfig does not crash");
376 Return<Result> ret = effect->setAuxChannelsConfig(EffectAuxChannelsConfig());
377 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700378}
379
Mikhail Naganov9f289042017-02-23 08:39:36 -0800380// Not generated automatically because AudioBuffer contains
381// instances of hidl_memory which can't be compared properly
382// in general case due to presence of handles.
383//
384// However, in this particular case, handles must not present
385// thus comparison is possible.
386//
387// operator== must be defined in the same namespace as the structures.
388namespace android {
389namespace hardware {
390namespace audio {
391namespace effect {
Kevin Rocard96d2cd92018-11-14 16:22:07 -0800392namespace CPP_VERSION {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800393inline bool operator==(const AudioBuffer& lhs, const AudioBuffer& rhs) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800394 return lhs.id == rhs.id && lhs.frameCount == rhs.frameCount && lhs.data.handle() == nullptr &&
395 rhs.data.handle() == nullptr;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800396}
397
Kevin Rocard55b10612018-11-12 12:33:16 -0800398inline bool operator==(const EffectBufferConfig& lhs, const EffectBufferConfig& rhs) {
Mikhail Naganovf363ed42020-12-10 18:47:51 -0800399 return lhs.buffer == rhs.buffer &&
400#if MAJOR_VERSION <= 6
401 lhs.samplingRateHz == rhs.samplingRateHz && lhs.channels == rhs.channels &&
402 lhs.format == rhs.format &&
403#else
404 lhs.base.sampleRateHz == rhs.base.sampleRateHz &&
405 lhs.base.channelMask == rhs.base.channelMask && lhs.base.format == rhs.base.format &&
406#endif
Kevin Rocard55b10612018-11-12 12:33:16 -0800407 lhs.accessMode == rhs.accessMode && lhs.mask == rhs.mask;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800408}
409
410inline bool operator==(const EffectConfig& lhs, const EffectConfig& rhs) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800411 return lhs.inputCfg == rhs.inputCfg && lhs.outputCfg == rhs.outputCfg;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800412}
Kevin Rocard96d2cd92018-11-14 16:22:07 -0800413} // namespace CPP_VERSION
Mikhail Naganov9f289042017-02-23 08:39:36 -0800414} // namespace effect
415} // namespace audio
416} // namespace hardware
417} // namespace android
418
nelsonli3c12e582019-12-12 13:53:49 +0800419TEST_P(AudioEffectHidlTest, Reset) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800420 description("Verify that Reset preserves effect configuration");
421 Result retval = Result::NOT_INITIALIZED;
422 EffectConfig originalConfig;
423 Return<void> ret = effect->getConfig([&](Result r, const EffectConfig& conf) {
424 retval = r;
425 if (r == Result::OK) {
426 originalConfig = conf;
427 }
428 });
429 ASSERT_TRUE(ret.isOk());
430 ASSERT_EQ(Result::OK, retval);
431 Return<Result> ret2 = effect->reset();
432 EXPECT_TRUE(ret2.isOk());
433 EXPECT_EQ(Result::OK, ret2);
434 EffectConfig configAfterReset;
435 ret = effect->getConfig([&](Result r, const EffectConfig& conf) {
436 retval = r;
437 if (r == Result::OK) {
438 configAfterReset = conf;
439 }
440 });
441 EXPECT_EQ(originalConfig, configAfterReset);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800442}
443
nelsonli3c12e582019-12-12 13:53:49 +0800444TEST_P(AudioEffectHidlTest, DisableEnableDisable) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800445 description("Verify Disable -> Enable -> Disable sequence for an effect");
446 Return<Result> ret = effect->disable();
447 EXPECT_TRUE(ret.isOk());
Mikhail Naganov892d1472020-03-19 10:44:06 -0700448 // Note: some legacy effects may return -EINVAL (INVALID_ARGUMENTS),
449 // more canonical is to return -ENOSYS (NOT_SUPPORTED)
450 EXPECT_TRUE(ret == Result::NOT_SUPPORTED || ret == Result::INVALID_ARGUMENTS);
Kevin Rocard55b10612018-11-12 12:33:16 -0800451 ret = effect->enable();
452 EXPECT_TRUE(ret.isOk());
453 EXPECT_EQ(Result::OK, ret);
454 ret = effect->disable();
455 EXPECT_TRUE(ret.isOk());
456 EXPECT_EQ(Result::OK, ret);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800457}
458
Mikhail Naganov0dbf3982021-01-08 17:48:22 -0800459#if MAJOR_VERSION >= 7
460TEST_P(AudioEffectHidlTest, SetDeviceInvalidDeviceAddress) {
461 description("Verify that invalid device address is rejected by SetDevice");
462 DeviceAddress device{.deviceType = "random_string"};
463 Return<Result> ret = effect->setDevice(device);
464 EXPECT_TRUE(ret.isOk());
465 EXPECT_EQ(Result::INVALID_ARGUMENTS, ret);
466}
467#endif
468
nelsonli3c12e582019-12-12 13:53:49 +0800469TEST_P(AudioEffectHidlTest, SetDevice) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800470 description("Verify that SetDevice works for an output chain effect");
Mikhail Naganovd72a7c22020-08-14 00:16:09 +0000471#if MAJOR_VERSION <= 6
Kevin Rocardf5305b32018-11-13 10:41:53 -0800472 Return<Result> ret = effect->setDevice(mkEnumBitfield(AudioDevice::OUT_SPEAKER));
Mikhail Naganovd72a7c22020-08-14 00:16:09 +0000473#else
474 DeviceAddress device{.deviceType = toString(xsd::AudioDevice::AUDIO_DEVICE_OUT_SPEAKER)};
475 Return<Result> ret = effect->setDevice(device);
476#endif
Kevin Rocard55b10612018-11-12 12:33:16 -0800477 EXPECT_TRUE(ret.isOk());
478 EXPECT_EQ(Result::OK, ret);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800479}
480
nelsonli3c12e582019-12-12 13:53:49 +0800481TEST_P(AudioEffectHidlTest, SetAndGetVolume) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800482 description("Verify that SetAndGetVolume method works for an effect");
483 uint32_t channelCount;
484 getChannelCount(&channelCount);
485 hidl_vec<uint32_t> volumes;
486 volumes.resize(channelCount);
487 for (uint32_t i = 0; i < channelCount; ++i) {
488 volumes[i] = 0;
489 }
490 Result retval = Result::NOT_INITIALIZED;
491 Return<void> ret =
492 effect->setAndGetVolume(volumes, [&](Result r, const hidl_vec<uint32_t>&) { retval = r; });
493 EXPECT_TRUE(ret.isOk());
494 EXPECT_EQ(Result::OK, retval);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800495}
496
nelsonli3c12e582019-12-12 13:53:49 +0800497TEST_P(AudioEffectHidlTest, VolumeChangeNotification) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800498 description("Verify that effect accepts VolumeChangeNotification");
499 uint32_t channelCount;
500 getChannelCount(&channelCount);
501 hidl_vec<uint32_t> volumes;
502 volumes.resize(channelCount);
503 for (uint32_t i = 0; i < channelCount; ++i) {
504 volumes[i] = 0;
505 }
506 Return<Result> ret = effect->volumeChangeNotification(volumes);
507 EXPECT_TRUE(ret.isOk());
508 EXPECT_EQ(Result::OK, ret);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800509}
510
nelsonli3c12e582019-12-12 13:53:49 +0800511TEST_P(AudioEffectHidlTest, SetAudioMode) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800512 description("Verify that SetAudioMode works for an effect");
513 Return<Result> ret = effect->setAudioMode(AudioMode::NORMAL);
514 EXPECT_TRUE(ret.isOk());
515 EXPECT_EQ(Result::OK, ret);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800516}
517
nelsonli3c12e582019-12-12 13:53:49 +0800518TEST_P(AudioEffectHidlTest, SetConfigReverse) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800519 description("Verify that SetConfigReverse does not crash");
520 Return<Result> ret = effect->setConfigReverse(EffectConfig(), nullptr, nullptr);
521 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700522}
523
Mikhail Naganov0dbf3982021-01-08 17:48:22 -0800524#if MAJOR_VERSION >= 7
525TEST_P(AudioEffectHidlTest, SetInputDeviceInvalidDeviceAddress) {
526 description("Verify that invalid device address is rejected by SetInputDevice");
527 DeviceAddress device{.deviceType = "random_string"};
528 Return<Result> ret = effect->setInputDevice(device);
529 EXPECT_TRUE(ret.isOk());
530 EXPECT_TRUE(ret == Result::INVALID_ARGUMENTS || ret == Result::NOT_SUPPORTED)
531 << ::testing::PrintToString(ret);
532}
533#endif
534
nelsonli3c12e582019-12-12 13:53:49 +0800535TEST_P(AudioEffectHidlTest, SetInputDevice) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800536 description("Verify that SetInputDevice does not crash");
Mikhail Naganovd72a7c22020-08-14 00:16:09 +0000537#if MAJOR_VERSION <= 6
Kevin Rocardf5305b32018-11-13 10:41:53 -0800538 Return<Result> ret = effect->setInputDevice(mkEnumBitfield(AudioDevice::IN_BUILTIN_MIC));
Mikhail Naganovd72a7c22020-08-14 00:16:09 +0000539#else
540 DeviceAddress device{.deviceType = toString(xsd::AudioDevice::AUDIO_DEVICE_IN_BUILTIN_MIC)};
541 Return<Result> ret = effect->setInputDevice(device);
542#endif
Kevin Rocard55b10612018-11-12 12:33:16 -0800543 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700544}
545
Mikhail Naganov0dbf3982021-01-08 17:48:22 -0800546#if MAJOR_VERSION >= 7
547TEST_P(AudioEffectHidlTest, SetInvalidAudioSource) {
548 description("Verify that an invalid audio source is rejected by SetAudioSource");
549 Return<Result> ret = effect->setAudioSource("random_string");
550 ASSERT_TRUE(ret.isOk());
551 EXPECT_TRUE(ret == Result::INVALID_ARGUMENTS || ret == Result::NOT_SUPPORTED)
552 << ::testing::PrintToString(ret);
553}
554#endif
555
nelsonli3c12e582019-12-12 13:53:49 +0800556TEST_P(AudioEffectHidlTest, SetAudioSource) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800557 description("Verify that SetAudioSource does not crash");
Mikhail Naganovd72a7c22020-08-14 00:16:09 +0000558#if MAJOR_VERSION <= 6
Kevin Rocard55b10612018-11-12 12:33:16 -0800559 Return<Result> ret = effect->setAudioSource(AudioSource::MIC);
Mikhail Naganovd72a7c22020-08-14 00:16:09 +0000560#else
561 Return<Result> ret = effect->setAudioSource(toString(xsd::AudioSource::AUDIO_SOURCE_MIC));
562#endif
Kevin Rocard55b10612018-11-12 12:33:16 -0800563 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700564}
565
nelsonli3c12e582019-12-12 13:53:49 +0800566TEST_P(AudioEffectHidlTest, Offload) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800567 description("Verify that calling Offload method does not crash");
Mikhail Naganovd72a7c22020-08-14 00:16:09 +0000568 Return<Result> ret = effect->offload(EffectOffloadParameter{});
Kevin Rocard55b10612018-11-12 12:33:16 -0800569 EXPECT_TRUE(ret.isOk());
Mikhail Naganov9f289042017-02-23 08:39:36 -0800570}
571
nelsonli3c12e582019-12-12 13:53:49 +0800572TEST_P(AudioEffectHidlTest, PrepareForProcessing) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800573 description("Verify that PrepareForProcessing method works for an effect");
574 Result retval = Result::NOT_INITIALIZED;
575 Return<void> ret = effect->prepareForProcessing(
576 [&](Result r, const MQDescriptorSync<Result>&) { retval = r; });
577 EXPECT_TRUE(ret.isOk());
578 EXPECT_EQ(Result::OK, retval);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800579}
580
nelsonli3c12e582019-12-12 13:53:49 +0800581TEST_P(AudioEffectHidlTest, SetProcessBuffers) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800582 description("Verify that SetProcessBuffers works for an effect");
583 sp<IAllocator> ashmem = IAllocator::getService("ashmem");
584 ASSERT_NE(nullptr, ashmem.get());
585 bool success = false;
586 AudioBuffer buffer;
587 Return<void> ret = ashmem->allocate(1024, [&](bool s, const hidl_memory& memory) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800588 success = s;
589 if (s) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800590 buffer.data = memory;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800591 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800592 });
593 ASSERT_TRUE(ret.isOk());
594 ASSERT_TRUE(success);
595 Return<Result> ret2 = effect->setProcessBuffers(buffer, buffer);
596 EXPECT_TRUE(ret2.isOk());
597 EXPECT_EQ(Result::OK, ret2);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800598}
599
nelsonli3c12e582019-12-12 13:53:49 +0800600TEST_P(AudioEffectHidlTest, Command) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800601 description("Verify that Command does not crash");
602 Return<void> ret =
603 effect->command(0, hidl_vec<uint8_t>(), 0, [&](int32_t, const hidl_vec<uint8_t>&) {});
604 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700605}
Mikhail Naganov9f289042017-02-23 08:39:36 -0800606
nelsonli3c12e582019-12-12 13:53:49 +0800607TEST_P(AudioEffectHidlTest, SetParameter) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800608 description("Verify that SetParameter does not crash");
609 Return<Result> ret = effect->setParameter(hidl_vec<uint8_t>(), hidl_vec<uint8_t>());
610 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700611}
612
nelsonli3c12e582019-12-12 13:53:49 +0800613TEST_P(AudioEffectHidlTest, GetParameter) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800614 description("Verify that GetParameter does not crash");
615 Return<void> ret =
616 effect->getParameter(hidl_vec<uint8_t>(), 0, [&](Result, const hidl_vec<uint8_t>&) {});
617 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700618}
619
nelsonli3c12e582019-12-12 13:53:49 +0800620TEST_P(AudioEffectHidlTest, GetSupportedConfigsForFeature) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800621 description("Verify that GetSupportedConfigsForFeature does not crash");
622 Return<void> ret = effect->getSupportedConfigsForFeature(
623 0, 0, 0, [&](Result, uint32_t, const hidl_vec<uint8_t>&) {});
624 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700625}
626
nelsonli3c12e582019-12-12 13:53:49 +0800627TEST_P(AudioEffectHidlTest, GetCurrentConfigForFeature) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800628 description("Verify that GetCurrentConfigForFeature does not crash");
629 Return<void> ret =
630 effect->getCurrentConfigForFeature(0, 0, [&](Result, const hidl_vec<uint8_t>&) {});
631 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700632}
633
nelsonli3c12e582019-12-12 13:53:49 +0800634TEST_P(AudioEffectHidlTest, SetCurrentConfigForFeature) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800635 description("Verify that SetCurrentConfigForFeature does not crash");
636 Return<Result> ret = effect->setCurrentConfigForFeature(0, hidl_vec<uint8_t>());
637 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700638}
639
Mikhail Naganov9f289042017-02-23 08:39:36 -0800640// The main test class for Equalizer Audio Effect HIDL HAL.
641class EqualizerAudioEffectHidlTest : public AudioEffectHidlTest {
Mikhail Naganov892d1472020-03-19 10:44:06 -0700642 public:
Kevin Rocard55b10612018-11-12 12:33:16 -0800643 void SetUp() override {
644 AudioEffectHidlTest::SetUp();
645 equalizer = IEqualizerEffect::castFrom(effect);
646 ASSERT_NE(nullptr, equalizer.get());
647 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800648
Mikhail Naganov892d1472020-03-19 10:44:06 -0700649 void TearDown() override {
650 equalizer.clear();
651 AudioEffectHidlTest::TearDown();
652 }
653
654 protected:
Kevin Rocard55b10612018-11-12 12:33:16 -0800655 void getNumBands(uint16_t* numBands);
656 void getLevelRange(int16_t* minLevel, int16_t* maxLevel);
657 void getBandFrequencyRange(uint16_t band, uint32_t* minFreq, uint32_t* centerFreq,
658 uint32_t* maxFreq);
659 void getPresetCount(size_t* count);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800660
Kevin Rocard55b10612018-11-12 12:33:16 -0800661 sp<IEqualizerEffect> equalizer;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800662};
663
664void EqualizerAudioEffectHidlTest::getNumBands(uint16_t* numBands) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800665 Result retval = Result::NOT_INITIALIZED;
666 Return<void> ret = equalizer->getNumBands([&](Result r, uint16_t b) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800667 retval = r;
668 if (retval == Result::OK) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800669 *numBands = b;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800670 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800671 });
672 ASSERT_TRUE(ret.isOk());
673 ASSERT_EQ(Result::OK, retval);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800674}
675
Kevin Rocard55b10612018-11-12 12:33:16 -0800676void EqualizerAudioEffectHidlTest::getLevelRange(int16_t* minLevel, int16_t* maxLevel) {
677 Result retval = Result::NOT_INITIALIZED;
678 Return<void> ret = equalizer->getLevelRange([&](Result r, int16_t min, int16_t max) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800679 retval = r;
680 if (retval == Result::OK) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800681 *minLevel = min;
682 *maxLevel = max;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800683 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800684 });
685 ASSERT_TRUE(ret.isOk());
686 ASSERT_EQ(Result::OK, retval);
687}
688
689void EqualizerAudioEffectHidlTest::getBandFrequencyRange(uint16_t band, uint32_t* minFreq,
690 uint32_t* centerFreq, uint32_t* maxFreq) {
691 Result retval = Result::NOT_INITIALIZED;
692 Return<void> ret =
693 equalizer->getBandFrequencyRange(band, [&](Result r, uint32_t min, uint32_t max) {
694 retval = r;
695 if (retval == Result::OK) {
696 *minFreq = min;
697 *maxFreq = max;
698 }
699 });
700 ASSERT_TRUE(ret.isOk());
701 ASSERT_EQ(Result::OK, retval);
702 ret = equalizer->getBandCenterFrequency(band, [&](Result r, uint32_t center) {
703 retval = r;
704 if (retval == Result::OK) {
705 *centerFreq = center;
706 }
707 });
708 ASSERT_TRUE(ret.isOk());
709 ASSERT_EQ(Result::OK, retval);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800710}
711
712void EqualizerAudioEffectHidlTest::getPresetCount(size_t* count) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800713 Result retval = Result::NOT_INITIALIZED;
714 Return<void> ret = equalizer->getPresetNames([&](Result r, const hidl_vec<hidl_string>& names) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800715 retval = r;
716 if (retval == Result::OK) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800717 *count = names.size();
Mikhail Naganov9f289042017-02-23 08:39:36 -0800718 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800719 });
720 ASSERT_TRUE(ret.isOk());
721 ASSERT_EQ(Result::OK, retval);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800722}
723
nelsonli3c12e582019-12-12 13:53:49 +0800724TEST_P(EqualizerAudioEffectHidlTest, GetNumBands) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800725 description("Verify that Equalizer effect reports at least one band");
726 uint16_t numBands = 0;
727 getNumBands(&numBands);
728 EXPECT_GT(numBands, 0);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800729}
730
nelsonli3c12e582019-12-12 13:53:49 +0800731TEST_P(EqualizerAudioEffectHidlTest, GetLevelRange) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800732 description("Verify that Equalizer effect reports adequate band level range");
733 int16_t minLevel = 0x7fff, maxLevel = 0;
734 getLevelRange(&minLevel, &maxLevel);
735 EXPECT_GT(maxLevel, minLevel);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800736}
737
nelsonli3c12e582019-12-12 13:53:49 +0800738TEST_P(EqualizerAudioEffectHidlTest, GetSetBandLevel) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800739 description("Verify that manipulating band levels works for Equalizer effect");
740 uint16_t numBands = 0;
741 getNumBands(&numBands);
742 ASSERT_GT(numBands, 0);
743 int16_t levels[3]{0x7fff, 0, 0};
744 getLevelRange(&levels[0], &levels[2]);
745 ASSERT_GT(levels[2], levels[0]);
746 levels[1] = (levels[2] + levels[0]) / 2;
747 for (uint16_t i = 0; i < numBands; ++i) {
748 for (size_t j = 0; j < ARRAY_SIZE(levels); ++j) {
749 Return<Result> ret = equalizer->setBandLevel(i, levels[j]);
750 EXPECT_TRUE(ret.isOk());
751 EXPECT_EQ(Result::OK, ret);
752 Result retval = Result::NOT_INITIALIZED;
753 int16_t actualLevel;
754 Return<void> ret2 = equalizer->getBandLevel(i, [&](Result r, int16_t l) {
755 retval = r;
756 if (retval == Result::OK) {
757 actualLevel = l;
758 }
759 });
760 EXPECT_TRUE(ret2.isOk());
761 EXPECT_EQ(Result::OK, retval);
762 EXPECT_EQ(levels[j], actualLevel);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800763 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800764 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800765}
766
nelsonli3c12e582019-12-12 13:53:49 +0800767TEST_P(EqualizerAudioEffectHidlTest, GetBandCenterFrequencyAndRange) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800768 description("Verify that Equalizer effect reports adequate band frequency range");
769 uint16_t numBands = 0;
770 getNumBands(&numBands);
771 ASSERT_GT(numBands, 0);
772 for (uint16_t i = 0; i < numBands; ++i) {
773 uint32_t minFreq = 0xffffffff, centerFreq = 0xffffffff, maxFreq = 0xffffffff;
774 getBandFrequencyRange(i, &minFreq, &centerFreq, &maxFreq);
775 // Note: NXP legacy implementation reports "1" as upper bound for last band,
776 // so this check fails.
777 EXPECT_GE(maxFreq, centerFreq);
778 EXPECT_GE(centerFreq, minFreq);
779 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800780}
781
nelsonli3c12e582019-12-12 13:53:49 +0800782TEST_P(EqualizerAudioEffectHidlTest, GetBandForFrequency) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800783 description("Verify that Equalizer effect supports GetBandForFrequency correctly");
784 uint16_t numBands = 0;
785 getNumBands(&numBands);
786 ASSERT_GT(numBands, 0);
787 for (uint16_t i = 0; i < numBands; ++i) {
788 uint32_t freqs[3]{0, 0, 0};
789 getBandFrequencyRange(i, &freqs[0], &freqs[1], &freqs[2]);
790 // NXP legacy implementation reports "1" as upper bound for last band, some
791 // of the checks fail.
792 for (size_t j = 0; j < ARRAY_SIZE(freqs); ++j) {
793 if (j == 0) {
794 freqs[j]++;
795 } // Min frequency is an open interval.
796 Result retval = Result::NOT_INITIALIZED;
797 uint16_t actualBand = numBands + 1;
798 Return<void> ret = equalizer->getBandForFrequency(freqs[j], [&](Result r, uint16_t b) {
799 retval = r;
800 if (retval == Result::OK) {
801 actualBand = b;
802 }
803 });
804 EXPECT_TRUE(ret.isOk());
805 EXPECT_EQ(Result::OK, retval);
806 EXPECT_EQ(i, actualBand) << "Frequency: " << freqs[j];
807 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800808 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800809}
810
nelsonli3c12e582019-12-12 13:53:49 +0800811TEST_P(EqualizerAudioEffectHidlTest, GetPresetNames) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800812 description("Verify that Equalizer effect reports at least one preset");
813 size_t presetCount;
814 getPresetCount(&presetCount);
815 EXPECT_GT(presetCount, 0u);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800816}
817
nelsonli3c12e582019-12-12 13:53:49 +0800818TEST_P(EqualizerAudioEffectHidlTest, GetSetCurrentPreset) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800819 description("Verify that manipulating the current preset for Equalizer effect");
820 size_t presetCount;
821 getPresetCount(&presetCount);
822 ASSERT_GT(presetCount, 0u);
823 for (uint16_t i = 0; i < presetCount; ++i) {
824 Return<Result> ret = equalizer->setCurrentPreset(i);
825 EXPECT_TRUE(ret.isOk());
826 EXPECT_EQ(Result::OK, ret);
827 Result retval = Result::NOT_INITIALIZED;
828 uint16_t actualPreset = 0xffff;
829 Return<void> ret2 = equalizer->getCurrentPreset([&](Result r, uint16_t p) {
830 retval = r;
831 if (retval == Result::OK) {
832 actualPreset = p;
833 }
834 });
835 EXPECT_TRUE(ret2.isOk());
836 EXPECT_EQ(Result::OK, retval);
837 EXPECT_EQ(i, actualPreset);
838 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800839}
840
nelsonli3c12e582019-12-12 13:53:49 +0800841TEST_P(EqualizerAudioEffectHidlTest, GetSetAllProperties) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800842 description(
843 "Verify that setting band levels and presets works via Get / "
844 "SetAllProperties for Equalizer effect");
Kevin Rocard96d2cd92018-11-14 16:22:07 -0800845 using AllProperties =
Mikhail Naganov00a44c02018-12-14 14:31:45 -0800846 ::android::hardware::audio::effect::CPP_VERSION::IEqualizerEffect::AllProperties;
Kevin Rocard55b10612018-11-12 12:33:16 -0800847 uint16_t numBands = 0;
848 getNumBands(&numBands);
849 ASSERT_GT(numBands, 0);
850 AllProperties props;
851 props.bandLevels.resize(numBands);
852 for (size_t i = 0; i < numBands; ++i) {
853 props.bandLevels[i] = 0;
854 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800855
Kevin Rocard55b10612018-11-12 12:33:16 -0800856 AllProperties actualProps;
857 Result retval = Result::NOT_INITIALIZED;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800858
Kevin Rocard55b10612018-11-12 12:33:16 -0800859 // Verify setting of the band levels via properties.
860 props.curPreset = -1;
861 Return<Result> ret = equalizer->setAllProperties(props);
862 EXPECT_TRUE(ret.isOk());
863 EXPECT_EQ(Result::OK, ret);
864 Return<void> ret2 = equalizer->getAllProperties([&](Result r, AllProperties p) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800865 retval = r;
866 if (retval == Result::OK) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800867 actualProps = p;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800868 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800869 });
870 EXPECT_TRUE(ret2.isOk());
871 EXPECT_EQ(Result::OK, retval);
872 EXPECT_EQ(props.bandLevels, actualProps.bandLevels);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800873
Kevin Rocard55b10612018-11-12 12:33:16 -0800874 // Verify setting of the current preset via properties.
875 props.curPreset = 0; // Assuming there is at least one preset.
876 ret = equalizer->setAllProperties(props);
877 EXPECT_TRUE(ret.isOk());
878 EXPECT_EQ(Result::OK, ret);
879 ret2 = equalizer->getAllProperties([&](Result r, AllProperties p) {
880 retval = r;
881 if (retval == Result::OK) {
882 actualProps = p;
883 }
884 });
885 EXPECT_TRUE(ret2.isOk());
886 EXPECT_EQ(Result::OK, retval);
887 EXPECT_EQ(props.curPreset, actualProps.curPreset);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800888}
889
890// The main test class for Equalizer Audio Effect HIDL HAL.
891class LoudnessEnhancerAudioEffectHidlTest : public AudioEffectHidlTest {
Mikhail Naganov892d1472020-03-19 10:44:06 -0700892 public:
Kevin Rocard55b10612018-11-12 12:33:16 -0800893 void SetUp() override {
894 AudioEffectHidlTest::SetUp();
895 enhancer = ILoudnessEnhancerEffect::castFrom(effect);
896 ASSERT_NE(nullptr, enhancer.get());
897 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800898
Mikhail Naganov892d1472020-03-19 10:44:06 -0700899 void TearDown() override {
900 enhancer.clear();
901 AudioEffectHidlTest::TearDown();
902 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800903
Mikhail Naganov892d1472020-03-19 10:44:06 -0700904 protected:
Kevin Rocard55b10612018-11-12 12:33:16 -0800905 sp<ILoudnessEnhancerEffect> enhancer;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800906};
907
nelsonli3c12e582019-12-12 13:53:49 +0800908TEST_P(LoudnessEnhancerAudioEffectHidlTest, GetSetTargetGain) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800909 description(
910 "Verify that manipulating the target gain works for Loudness Enhancer "
911 "effect");
912 const int32_t gain = 100;
913 Return<Result> ret = enhancer->setTargetGain(gain);
914 EXPECT_TRUE(ret.isOk());
915 EXPECT_EQ(Result::OK, ret);
916 int32_t actualGain = 0;
917 Result retval;
918 Return<void> ret2 = enhancer->getTargetGain([&](Result r, int32_t g) {
919 retval = r;
920 if (retval == Result::OK) {
921 actualGain = g;
922 }
923 });
924 EXPECT_TRUE(ret2.isOk());
925 EXPECT_EQ(Result::OK, retval);
926 EXPECT_EQ(gain, actualGain);
Mikhail Naganovbf393172016-11-11 16:24:50 -0800927}
Zhuoyao Zhang7dc6ce82018-02-08 12:44:27 -0800928
Mikhail Naganov892d1472020-03-19 10:44:06 -0700929INSTANTIATE_TEST_SUITE_P(EffectsFactory, AudioEffectsFactoryHidlTest,
930 ::testing::ValuesIn(::android::hardware::getAllHalInstanceNames(
931 IEffectsFactory::descriptor)),
932 ::android::hardware::PrintInstanceNameToString);
Mikhail Naganov315ce412019-10-23 16:46:54 -0700933INSTANTIATE_TEST_SUITE_P(
Mikhail Naganov892d1472020-03-19 10:44:06 -0700934 Equalizer_IEffect, AudioEffectHidlTest,
935 ::testing::Combine(::testing::ValuesIn(::android::hardware::getAllHalInstanceNames(
936 IEffectsFactory::descriptor)),
937 ::testing::Values(EQUALIZER_EFFECT_TYPE)),
938 EffectParameterToString);
Mikhail Naganov315ce412019-10-23 16:46:54 -0700939INSTANTIATE_TEST_SUITE_P(
Mikhail Naganov892d1472020-03-19 10:44:06 -0700940 LoudnessEnhancer_IEffect, AudioEffectHidlTest,
941 ::testing::Combine(::testing::ValuesIn(::android::hardware::getAllHalInstanceNames(
942 IEffectsFactory::descriptor)),
943 ::testing::Values(LOUDNESS_ENHANCER_EFFECT_TYPE)),
944 EffectParameterToString);
nelsonli3c12e582019-12-12 13:53:49 +0800945INSTANTIATE_TEST_SUITE_P(
Mikhail Naganov315ce412019-10-23 16:46:54 -0700946 Equalizer, EqualizerAudioEffectHidlTest,
Mikhail Naganov892d1472020-03-19 10:44:06 -0700947 ::testing::Combine(::testing::ValuesIn(::android::hardware::getAllHalInstanceNames(
948 IEffectsFactory::descriptor)),
949 ::testing::Values(EQUALIZER_EFFECT_TYPE)),
950 EffectParameterToString);
Mikhail Naganov315ce412019-10-23 16:46:54 -0700951INSTANTIATE_TEST_SUITE_P(
952 LoudnessEnhancer, LoudnessEnhancerAudioEffectHidlTest,
Mikhail Naganov892d1472020-03-19 10:44:06 -0700953 ::testing::Combine(::testing::ValuesIn(::android::hardware::getAllHalInstanceNames(
954 IEffectsFactory::descriptor)),
955 ::testing::Values(LOUDNESS_ENHANCER_EFFECT_TYPE)),
956 EffectParameterToString);
Mikhail Naganovb9743d42020-07-21 10:57:03 -0700957// When the VTS test runs on a device lacking the corresponding HAL version the parameter
958// list is empty, this isn't a problem.
959GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(AudioEffectsFactoryHidlTest);
960GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(AudioEffectHidlTest);
961GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(EqualizerAudioEffectHidlTest);
962GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(LoudnessEnhancerAudioEffectHidlTest);