blob: c808ff6cc27b2556ae1a51446c5467c0fe6e529a [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>
Mikhail Naganovd72a7c22020-08-14 00:16:09 +000034#endif
Mikhail Naganovbf393172016-11-11 16:24:50 -080035
Kevin Rocardf5305b32018-11-13 10:41:53 -080036#include <common/all-versions/VersionUtils.h>
37
Mikhail Naganov978a0f92022-08-05 00:24:27 +000038#include <cutils/properties.h>
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;
Mikhail Naganov40fde0b2022-01-18 23:54:27 +000054using namespace ::android::hardware::audio::common::COMMON_TYPES_CPP_VERSION;
Mikhail Naganov00a44c02018-12-14 14:31:45 -080055using 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
Mikhail Naganovff611982021-01-27 02:16:53 +0000267 ASSERT_EQ(AudioConfigBaseOptional::ChannelMask::hidl_discriminator::value,
268 currentConfig.outputCfg.base.channelMask.getDiscriminator());
Hayden Gomes4e7d69e2020-11-06 15:15:26 -0800269 *channelCount = android::audio::policy::configuration::V7_0::getChannelCount(
Mikhail Naganovff611982021-01-27 02:16:53 +0000270 currentConfig.outputCfg.base.channelMask.value());
Mikhail Naganovd72a7c22020-08-14 00:16:09 +0000271 ASSERT_NE(*channelCount, 0);
272#endif
Mikhail Naganov9f289042017-02-23 08:39:36 -0800273}
274
nelsonli3c12e582019-12-12 13:53:49 +0800275TEST_P(AudioEffectHidlTest, Close) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800276 description("Verify that an effect can be closed");
277 Return<Result> ret = effect->close();
278 EXPECT_TRUE(ret.isOk());
279 EXPECT_EQ(Result::OK, ret);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800280}
281
nelsonli3c12e582019-12-12 13:53:49 +0800282TEST_P(AudioEffectHidlTest, GetDescriptor) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800283 description("Verify that an effect can return its own descriptor via GetDescriptor");
284 Result retval = Result::NOT_INITIALIZED;
285 Uuid actualType;
286 Return<void> ret = effect->getDescriptor([&](Result r, const EffectDescriptor& desc) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800287 retval = r;
288 if (r == Result::OK) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800289 actualType = desc.type;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800290 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800291 });
292 EXPECT_TRUE(ret.isOk());
293 EXPECT_EQ(Result::OK, retval);
294 EXPECT_EQ(getEffectType(), actualType);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800295}
296
nelsonli3c12e582019-12-12 13:53:49 +0800297TEST_P(AudioEffectHidlTest, GetSetConfig) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800298 description(
299 "Verify that it is possible to manipulate effect config via Get / "
300 "SetConfig");
301 Result retval = Result::NOT_INITIALIZED;
302 EffectConfig currentConfig;
303 Return<void> ret = effect->getConfig([&](Result r, const EffectConfig& conf) {
304 retval = r;
305 if (r == Result::OK) {
306 currentConfig = conf;
307 }
308 });
309 EXPECT_TRUE(ret.isOk());
310 EXPECT_EQ(Result::OK, retval);
311 Return<Result> ret2 = effect->setConfig(currentConfig, nullptr, nullptr);
312 EXPECT_TRUE(ret2.isOk());
313 EXPECT_EQ(Result::OK, ret2);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800314}
315
Mikhail Naganov0dbf3982021-01-08 17:48:22 -0800316#if MAJOR_VERSION >= 7
317std::vector<EffectBufferConfig> generateInvalidConfigs(const EffectBufferConfig& src) {
318 std::vector<EffectBufferConfig> result;
319 EffectBufferConfig invalidFormat = src;
Mikhail Naganovff611982021-01-27 02:16:53 +0000320 invalidFormat.base.format.value("random_string");
Mikhail Naganov0dbf3982021-01-08 17:48:22 -0800321 result.push_back(std::move(invalidFormat));
322 EffectBufferConfig invalidChannelMask = src;
Mikhail Naganovff611982021-01-27 02:16:53 +0000323 invalidChannelMask.base.channelMask.value("random_string");
Mikhail Naganov0dbf3982021-01-08 17:48:22 -0800324 result.push_back(std::move(invalidChannelMask));
325 return result;
326}
327
328TEST_P(AudioEffectHidlTest, SetConfigInvalidArguments) {
329 description("Verify that invalid arguments are rejected by SetConfig");
330 Result retval = Result::NOT_INITIALIZED;
331 EffectConfig currentConfig;
332 Return<void> ret = effect->getConfig([&](Result r, const EffectConfig& conf) {
333 retval = r;
334 if (r == Result::OK) {
335 currentConfig = conf;
336 }
337 });
338 EXPECT_TRUE(ret.isOk());
339 EXPECT_EQ(Result::OK, retval);
340 for (const auto& invalidInputCfg : generateInvalidConfigs(currentConfig.inputCfg)) {
341 EffectConfig invalidConfig = currentConfig;
342 invalidConfig.inputCfg = invalidInputCfg;
343 Return<Result> ret = effect->setConfig(invalidConfig, nullptr, nullptr);
344 EXPECT_TRUE(ret.isOk());
345 EXPECT_EQ(Result::INVALID_ARGUMENTS, ret);
346 }
347 for (const auto& invalidOutputCfg : generateInvalidConfigs(currentConfig.outputCfg)) {
348 EffectConfig invalidConfig = currentConfig;
349 invalidConfig.outputCfg = invalidOutputCfg;
350 Return<Result> ret = effect->setConfig(invalidConfig, nullptr, nullptr);
351 EXPECT_TRUE(ret.isOk());
352 EXPECT_EQ(Result::INVALID_ARGUMENTS, ret);
353 }
354}
355#endif
356
nelsonli3c12e582019-12-12 13:53:49 +0800357TEST_P(AudioEffectHidlTest, GetConfigReverse) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800358 description("Verify that GetConfigReverse does not crash");
359 Return<void> ret = effect->getConfigReverse([&](Result, const EffectConfig&) {});
360 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700361}
362
nelsonli3c12e582019-12-12 13:53:49 +0800363TEST_P(AudioEffectHidlTest, GetSupportedAuxChannelsConfigs) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800364 description("Verify that GetSupportedAuxChannelsConfigs does not crash");
365 Return<void> ret = effect->getSupportedAuxChannelsConfigs(
366 0, [&](Result, const hidl_vec<EffectAuxChannelsConfig>&) {});
367 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700368}
369
nelsonli3c12e582019-12-12 13:53:49 +0800370TEST_P(AudioEffectHidlTest, GetAuxChannelsConfig) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800371 description("Verify that GetAuxChannelsConfig does not crash");
372 Return<void> ret = effect->getAuxChannelsConfig([&](Result, const EffectAuxChannelsConfig&) {});
373 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700374}
375
nelsonli3c12e582019-12-12 13:53:49 +0800376TEST_P(AudioEffectHidlTest, SetAuxChannelsConfig) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800377 description("Verify that SetAuxChannelsConfig does not crash");
378 Return<Result> ret = effect->setAuxChannelsConfig(EffectAuxChannelsConfig());
379 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700380}
381
Mikhail Naganov9f289042017-02-23 08:39:36 -0800382// Not generated automatically because AudioBuffer contains
383// instances of hidl_memory which can't be compared properly
384// in general case due to presence of handles.
385//
386// However, in this particular case, handles must not present
387// thus comparison is possible.
388//
389// operator== must be defined in the same namespace as the structures.
390namespace android {
391namespace hardware {
392namespace audio {
393namespace effect {
Kevin Rocard96d2cd92018-11-14 16:22:07 -0800394namespace CPP_VERSION {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800395inline bool operator==(const AudioBuffer& lhs, const AudioBuffer& rhs) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800396 return lhs.id == rhs.id && lhs.frameCount == rhs.frameCount && lhs.data.handle() == nullptr &&
397 rhs.data.handle() == nullptr;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800398}
399
Mikhail Naganovff611982021-01-27 02:16:53 +0000400#if MAJOR_VERSION <= 6
Kevin Rocard55b10612018-11-12 12:33:16 -0800401inline bool operator==(const EffectBufferConfig& lhs, const EffectBufferConfig& rhs) {
Mikhail Naganovf363ed42020-12-10 18:47:51 -0800402 return lhs.buffer == rhs.buffer &&
Mikhail Naganovf363ed42020-12-10 18:47:51 -0800403 lhs.samplingRateHz == rhs.samplingRateHz && lhs.channels == rhs.channels &&
404 lhs.format == rhs.format &&
Kevin Rocard55b10612018-11-12 12:33:16 -0800405 lhs.accessMode == rhs.accessMode && lhs.mask == rhs.mask;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800406}
Mikhail Naganovff611982021-01-27 02:16:53 +0000407#else
408inline bool operator==(const EffectBufferConfig& lhs, const EffectBufferConfig& rhs) {
409 return lhs.buffer.getDiscriminator() == rhs.buffer.getDiscriminator() &&
410 (lhs.buffer.getDiscriminator() ==
411 EffectBufferConfig::OptionalBuffer::hidl_discriminator::unspecified ||
412 lhs.buffer.buf() == rhs.buffer.buf()) &&
413 lhs.base == rhs.base && lhs.accessMode == rhs.accessMode;
414}
415#endif // MAJOR_VERSION <= 6
Mikhail Naganov9f289042017-02-23 08:39:36 -0800416
417inline bool operator==(const EffectConfig& lhs, const EffectConfig& rhs) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800418 return lhs.inputCfg == rhs.inputCfg && lhs.outputCfg == rhs.outputCfg;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800419}
Kevin Rocard96d2cd92018-11-14 16:22:07 -0800420} // namespace CPP_VERSION
Mikhail Naganov9f289042017-02-23 08:39:36 -0800421} // namespace effect
422} // namespace audio
423} // namespace hardware
424} // namespace android
425
nelsonli3c12e582019-12-12 13:53:49 +0800426TEST_P(AudioEffectHidlTest, Reset) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800427 description("Verify that Reset preserves effect configuration");
428 Result retval = Result::NOT_INITIALIZED;
429 EffectConfig originalConfig;
430 Return<void> ret = effect->getConfig([&](Result r, const EffectConfig& conf) {
431 retval = r;
432 if (r == Result::OK) {
433 originalConfig = conf;
434 }
435 });
436 ASSERT_TRUE(ret.isOk());
437 ASSERT_EQ(Result::OK, retval);
438 Return<Result> ret2 = effect->reset();
439 EXPECT_TRUE(ret2.isOk());
440 EXPECT_EQ(Result::OK, ret2);
441 EffectConfig configAfterReset;
442 ret = effect->getConfig([&](Result r, const EffectConfig& conf) {
443 retval = r;
444 if (r == Result::OK) {
445 configAfterReset = conf;
446 }
447 });
448 EXPECT_EQ(originalConfig, configAfterReset);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800449}
450
nelsonli3c12e582019-12-12 13:53:49 +0800451TEST_P(AudioEffectHidlTest, DisableEnableDisable) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800452 description("Verify Disable -> Enable -> Disable sequence for an effect");
453 Return<Result> ret = effect->disable();
454 EXPECT_TRUE(ret.isOk());
Mikhail Naganov892d1472020-03-19 10:44:06 -0700455 // Note: some legacy effects may return -EINVAL (INVALID_ARGUMENTS),
456 // more canonical is to return -ENOSYS (NOT_SUPPORTED)
457 EXPECT_TRUE(ret == Result::NOT_SUPPORTED || ret == Result::INVALID_ARGUMENTS);
Kevin Rocard55b10612018-11-12 12:33:16 -0800458 ret = effect->enable();
459 EXPECT_TRUE(ret.isOk());
460 EXPECT_EQ(Result::OK, ret);
461 ret = effect->disable();
462 EXPECT_TRUE(ret.isOk());
463 EXPECT_EQ(Result::OK, ret);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800464}
465
Mikhail Naganov0dbf3982021-01-08 17:48:22 -0800466#if MAJOR_VERSION >= 7
467TEST_P(AudioEffectHidlTest, SetDeviceInvalidDeviceAddress) {
468 description("Verify that invalid device address is rejected by SetDevice");
469 DeviceAddress device{.deviceType = "random_string"};
470 Return<Result> ret = effect->setDevice(device);
471 EXPECT_TRUE(ret.isOk());
472 EXPECT_EQ(Result::INVALID_ARGUMENTS, ret);
473}
474#endif
475
nelsonli3c12e582019-12-12 13:53:49 +0800476TEST_P(AudioEffectHidlTest, SetDevice) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800477 description("Verify that SetDevice works for an output chain effect");
Mikhail Naganovd72a7c22020-08-14 00:16:09 +0000478#if MAJOR_VERSION <= 6
Kevin Rocardf5305b32018-11-13 10:41:53 -0800479 Return<Result> ret = effect->setDevice(mkEnumBitfield(AudioDevice::OUT_SPEAKER));
Mikhail Naganovd72a7c22020-08-14 00:16:09 +0000480#else
481 DeviceAddress device{.deviceType = toString(xsd::AudioDevice::AUDIO_DEVICE_OUT_SPEAKER)};
482 Return<Result> ret = effect->setDevice(device);
483#endif
Kevin Rocard55b10612018-11-12 12:33:16 -0800484 EXPECT_TRUE(ret.isOk());
485 EXPECT_EQ(Result::OK, ret);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800486}
487
nelsonli3c12e582019-12-12 13:53:49 +0800488TEST_P(AudioEffectHidlTest, SetAndGetVolume) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800489 description("Verify that SetAndGetVolume method works for an effect");
490 uint32_t channelCount;
491 getChannelCount(&channelCount);
492 hidl_vec<uint32_t> volumes;
493 volumes.resize(channelCount);
494 for (uint32_t i = 0; i < channelCount; ++i) {
495 volumes[i] = 0;
496 }
497 Result retval = Result::NOT_INITIALIZED;
498 Return<void> ret =
499 effect->setAndGetVolume(volumes, [&](Result r, const hidl_vec<uint32_t>&) { retval = r; });
500 EXPECT_TRUE(ret.isOk());
501 EXPECT_EQ(Result::OK, retval);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800502}
503
nelsonli3c12e582019-12-12 13:53:49 +0800504TEST_P(AudioEffectHidlTest, VolumeChangeNotification) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800505 description("Verify that effect accepts VolumeChangeNotification");
506 uint32_t channelCount;
507 getChannelCount(&channelCount);
508 hidl_vec<uint32_t> volumes;
509 volumes.resize(channelCount);
510 for (uint32_t i = 0; i < channelCount; ++i) {
511 volumes[i] = 0;
512 }
513 Return<Result> ret = effect->volumeChangeNotification(volumes);
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, SetAudioMode) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800519 description("Verify that SetAudioMode works for an effect");
520 Return<Result> ret = effect->setAudioMode(AudioMode::NORMAL);
521 EXPECT_TRUE(ret.isOk());
522 EXPECT_EQ(Result::OK, ret);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800523}
524
nelsonli3c12e582019-12-12 13:53:49 +0800525TEST_P(AudioEffectHidlTest, SetConfigReverse) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800526 description("Verify that SetConfigReverse does not crash");
527 Return<Result> ret = effect->setConfigReverse(EffectConfig(), nullptr, nullptr);
528 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700529}
530
Mikhail Naganov0dbf3982021-01-08 17:48:22 -0800531#if MAJOR_VERSION >= 7
532TEST_P(AudioEffectHidlTest, SetInputDeviceInvalidDeviceAddress) {
533 description("Verify that invalid device address is rejected by SetInputDevice");
534 DeviceAddress device{.deviceType = "random_string"};
535 Return<Result> ret = effect->setInputDevice(device);
536 EXPECT_TRUE(ret.isOk());
537 EXPECT_TRUE(ret == Result::INVALID_ARGUMENTS || ret == Result::NOT_SUPPORTED)
538 << ::testing::PrintToString(ret);
539}
540#endif
541
nelsonli3c12e582019-12-12 13:53:49 +0800542TEST_P(AudioEffectHidlTest, SetInputDevice) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800543 description("Verify that SetInputDevice does not crash");
Mikhail Naganovd72a7c22020-08-14 00:16:09 +0000544#if MAJOR_VERSION <= 6
Kevin Rocardf5305b32018-11-13 10:41:53 -0800545 Return<Result> ret = effect->setInputDevice(mkEnumBitfield(AudioDevice::IN_BUILTIN_MIC));
Mikhail Naganovd72a7c22020-08-14 00:16:09 +0000546#else
547 DeviceAddress device{.deviceType = toString(xsd::AudioDevice::AUDIO_DEVICE_IN_BUILTIN_MIC)};
548 Return<Result> ret = effect->setInputDevice(device);
549#endif
Kevin Rocard55b10612018-11-12 12:33:16 -0800550 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700551}
552
Mikhail Naganov0dbf3982021-01-08 17:48:22 -0800553#if MAJOR_VERSION >= 7
554TEST_P(AudioEffectHidlTest, SetInvalidAudioSource) {
555 description("Verify that an invalid audio source is rejected by SetAudioSource");
556 Return<Result> ret = effect->setAudioSource("random_string");
557 ASSERT_TRUE(ret.isOk());
558 EXPECT_TRUE(ret == Result::INVALID_ARGUMENTS || ret == Result::NOT_SUPPORTED)
559 << ::testing::PrintToString(ret);
560}
561#endif
562
nelsonli3c12e582019-12-12 13:53:49 +0800563TEST_P(AudioEffectHidlTest, SetAudioSource) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800564 description("Verify that SetAudioSource does not crash");
Mikhail Naganovd72a7c22020-08-14 00:16:09 +0000565#if MAJOR_VERSION <= 6
Kevin Rocard55b10612018-11-12 12:33:16 -0800566 Return<Result> ret = effect->setAudioSource(AudioSource::MIC);
Mikhail Naganovd72a7c22020-08-14 00:16:09 +0000567#else
568 Return<Result> ret = effect->setAudioSource(toString(xsd::AudioSource::AUDIO_SOURCE_MIC));
569#endif
Kevin Rocard55b10612018-11-12 12:33:16 -0800570 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700571}
572
nelsonli3c12e582019-12-12 13:53:49 +0800573TEST_P(AudioEffectHidlTest, Offload) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800574 description("Verify that calling Offload method does not crash");
Mikhail Naganovd72a7c22020-08-14 00:16:09 +0000575 Return<Result> ret = effect->offload(EffectOffloadParameter{});
Kevin Rocard55b10612018-11-12 12:33:16 -0800576 EXPECT_TRUE(ret.isOk());
Mikhail Naganov9f289042017-02-23 08:39:36 -0800577}
578
nelsonli3c12e582019-12-12 13:53:49 +0800579TEST_P(AudioEffectHidlTest, PrepareForProcessing) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800580 description("Verify that PrepareForProcessing method works for an effect");
581 Result retval = Result::NOT_INITIALIZED;
582 Return<void> ret = effect->prepareForProcessing(
583 [&](Result r, const MQDescriptorSync<Result>&) { retval = r; });
584 EXPECT_TRUE(ret.isOk());
585 EXPECT_EQ(Result::OK, retval);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800586}
587
nelsonli3c12e582019-12-12 13:53:49 +0800588TEST_P(AudioEffectHidlTest, SetProcessBuffers) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800589 description("Verify that SetProcessBuffers works for an effect");
590 sp<IAllocator> ashmem = IAllocator::getService("ashmem");
591 ASSERT_NE(nullptr, ashmem.get());
592 bool success = false;
593 AudioBuffer buffer;
594 Return<void> ret = ashmem->allocate(1024, [&](bool s, const hidl_memory& memory) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800595 success = s;
596 if (s) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800597 buffer.data = memory;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800598 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800599 });
600 ASSERT_TRUE(ret.isOk());
601 ASSERT_TRUE(success);
602 Return<Result> ret2 = effect->setProcessBuffers(buffer, buffer);
603 EXPECT_TRUE(ret2.isOk());
604 EXPECT_EQ(Result::OK, ret2);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800605}
606
nelsonli3c12e582019-12-12 13:53:49 +0800607TEST_P(AudioEffectHidlTest, Command) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800608 description("Verify that Command does not crash");
609 Return<void> ret =
610 effect->command(0, hidl_vec<uint8_t>(), 0, [&](int32_t, const hidl_vec<uint8_t>&) {});
611 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700612}
Mikhail Naganov9f289042017-02-23 08:39:36 -0800613
nelsonli3c12e582019-12-12 13:53:49 +0800614TEST_P(AudioEffectHidlTest, SetParameter) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800615 description("Verify that SetParameter does not crash");
616 Return<Result> ret = effect->setParameter(hidl_vec<uint8_t>(), 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, GetParameter) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800621 description("Verify that GetParameter does not crash");
622 Return<void> ret =
623 effect->getParameter(hidl_vec<uint8_t>(), 0, [&](Result, const hidl_vec<uint8_t>&) {});
624 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700625}
626
Mikhail Naganov4f110342022-07-07 20:37:42 +0000627TEST_P(AudioEffectHidlTest, GetParameterInvalidMaxReplySize) {
628 description("Verify that GetParameter caps the maximum reply size");
Mikhail Naganov978a0f92022-08-05 00:24:27 +0000629 const bool isNewDeviceLaunchingOnTPlus = property_get_int32("ro.vendor.api_level", 0) >= 33;
630 if (!isNewDeviceLaunchingOnTPlus) {
631 GTEST_SKIP() << "The test only applies to devices launching on T or later";
632 }
Mikhail Naganov4f110342022-07-07 20:37:42 +0000633 // Use a non-empty parameter to avoid being rejected by any earlier checks.
634 hidl_vec<uint8_t> parameter;
635 parameter.resize(16);
636 // Use very large size to ensure that the service does not crash. Since parameters
637 // are specific to each effect, and some effects may not have parameters at all,
638 // simply checking the return value would not reveal an issue of using an uncapped value.
639 const uint32_t veryLargeReplySize = std::numeric_limits<uint32_t>::max() - 100;
640 Result retval = Result::OK;
641 Return<void> ret =
642 effect->getParameter(parameter, veryLargeReplySize,
643 [&](Result r, const hidl_vec<uint8_t>&) { retval = r; });
644 EXPECT_TRUE(ret.isOk());
645 EXPECT_EQ(Result::INVALID_ARGUMENTS, retval);
646}
647
nelsonli3c12e582019-12-12 13:53:49 +0800648TEST_P(AudioEffectHidlTest, GetSupportedConfigsForFeature) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800649 description("Verify that GetSupportedConfigsForFeature does not crash");
650 Return<void> ret = effect->getSupportedConfigsForFeature(
651 0, 0, 0, [&](Result, uint32_t, const hidl_vec<uint8_t>&) {});
652 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700653}
654
nelsonli3c12e582019-12-12 13:53:49 +0800655TEST_P(AudioEffectHidlTest, GetCurrentConfigForFeature) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800656 description("Verify that GetCurrentConfigForFeature does not crash");
657 Return<void> ret =
658 effect->getCurrentConfigForFeature(0, 0, [&](Result, const hidl_vec<uint8_t>&) {});
659 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700660}
661
nelsonli3c12e582019-12-12 13:53:49 +0800662TEST_P(AudioEffectHidlTest, SetCurrentConfigForFeature) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800663 description("Verify that SetCurrentConfigForFeature does not crash");
664 Return<Result> ret = effect->setCurrentConfigForFeature(0, hidl_vec<uint8_t>());
665 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700666}
667
Mikhail Naganov9f289042017-02-23 08:39:36 -0800668// The main test class for Equalizer Audio Effect HIDL HAL.
669class EqualizerAudioEffectHidlTest : public AudioEffectHidlTest {
Mikhail Naganov892d1472020-03-19 10:44:06 -0700670 public:
Kevin Rocard55b10612018-11-12 12:33:16 -0800671 void SetUp() override {
672 AudioEffectHidlTest::SetUp();
673 equalizer = IEqualizerEffect::castFrom(effect);
674 ASSERT_NE(nullptr, equalizer.get());
675 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800676
Mikhail Naganov892d1472020-03-19 10:44:06 -0700677 void TearDown() override {
678 equalizer.clear();
679 AudioEffectHidlTest::TearDown();
680 }
681
682 protected:
Kevin Rocard55b10612018-11-12 12:33:16 -0800683 void getNumBands(uint16_t* numBands);
684 void getLevelRange(int16_t* minLevel, int16_t* maxLevel);
685 void getBandFrequencyRange(uint16_t band, uint32_t* minFreq, uint32_t* centerFreq,
686 uint32_t* maxFreq);
687 void getPresetCount(size_t* count);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800688
Kevin Rocard55b10612018-11-12 12:33:16 -0800689 sp<IEqualizerEffect> equalizer;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800690};
691
692void EqualizerAudioEffectHidlTest::getNumBands(uint16_t* numBands) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800693 Result retval = Result::NOT_INITIALIZED;
694 Return<void> ret = equalizer->getNumBands([&](Result r, uint16_t b) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800695 retval = r;
696 if (retval == Result::OK) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800697 *numBands = b;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800698 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800699 });
700 ASSERT_TRUE(ret.isOk());
701 ASSERT_EQ(Result::OK, retval);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800702}
703
Kevin Rocard55b10612018-11-12 12:33:16 -0800704void EqualizerAudioEffectHidlTest::getLevelRange(int16_t* minLevel, int16_t* maxLevel) {
705 Result retval = Result::NOT_INITIALIZED;
706 Return<void> ret = equalizer->getLevelRange([&](Result r, int16_t min, int16_t max) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800707 retval = r;
708 if (retval == Result::OK) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800709 *minLevel = min;
710 *maxLevel = max;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800711 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800712 });
713 ASSERT_TRUE(ret.isOk());
714 ASSERT_EQ(Result::OK, retval);
715}
716
717void EqualizerAudioEffectHidlTest::getBandFrequencyRange(uint16_t band, uint32_t* minFreq,
718 uint32_t* centerFreq, uint32_t* maxFreq) {
719 Result retval = Result::NOT_INITIALIZED;
720 Return<void> ret =
721 equalizer->getBandFrequencyRange(band, [&](Result r, uint32_t min, uint32_t max) {
722 retval = r;
723 if (retval == Result::OK) {
724 *minFreq = min;
725 *maxFreq = max;
726 }
727 });
728 ASSERT_TRUE(ret.isOk());
729 ASSERT_EQ(Result::OK, retval);
730 ret = equalizer->getBandCenterFrequency(band, [&](Result r, uint32_t center) {
731 retval = r;
732 if (retval == Result::OK) {
733 *centerFreq = center;
734 }
735 });
736 ASSERT_TRUE(ret.isOk());
737 ASSERT_EQ(Result::OK, retval);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800738}
739
740void EqualizerAudioEffectHidlTest::getPresetCount(size_t* count) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800741 Result retval = Result::NOT_INITIALIZED;
742 Return<void> ret = equalizer->getPresetNames([&](Result r, const hidl_vec<hidl_string>& names) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800743 retval = r;
744 if (retval == Result::OK) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800745 *count = names.size();
Mikhail Naganov9f289042017-02-23 08:39:36 -0800746 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800747 });
748 ASSERT_TRUE(ret.isOk());
749 ASSERT_EQ(Result::OK, retval);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800750}
751
nelsonli3c12e582019-12-12 13:53:49 +0800752TEST_P(EqualizerAudioEffectHidlTest, GetNumBands) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800753 description("Verify that Equalizer effect reports at least one band");
754 uint16_t numBands = 0;
755 getNumBands(&numBands);
756 EXPECT_GT(numBands, 0);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800757}
758
nelsonli3c12e582019-12-12 13:53:49 +0800759TEST_P(EqualizerAudioEffectHidlTest, GetLevelRange) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800760 description("Verify that Equalizer effect reports adequate band level range");
761 int16_t minLevel = 0x7fff, maxLevel = 0;
762 getLevelRange(&minLevel, &maxLevel);
763 EXPECT_GT(maxLevel, minLevel);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800764}
765
nelsonli3c12e582019-12-12 13:53:49 +0800766TEST_P(EqualizerAudioEffectHidlTest, GetSetBandLevel) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800767 description("Verify that manipulating band levels works for Equalizer effect");
768 uint16_t numBands = 0;
769 getNumBands(&numBands);
770 ASSERT_GT(numBands, 0);
771 int16_t levels[3]{0x7fff, 0, 0};
772 getLevelRange(&levels[0], &levels[2]);
773 ASSERT_GT(levels[2], levels[0]);
774 levels[1] = (levels[2] + levels[0]) / 2;
775 for (uint16_t i = 0; i < numBands; ++i) {
776 for (size_t j = 0; j < ARRAY_SIZE(levels); ++j) {
777 Return<Result> ret = equalizer->setBandLevel(i, levels[j]);
778 EXPECT_TRUE(ret.isOk());
779 EXPECT_EQ(Result::OK, ret);
780 Result retval = Result::NOT_INITIALIZED;
781 int16_t actualLevel;
782 Return<void> ret2 = equalizer->getBandLevel(i, [&](Result r, int16_t l) {
783 retval = r;
784 if (retval == Result::OK) {
785 actualLevel = l;
786 }
787 });
788 EXPECT_TRUE(ret2.isOk());
789 EXPECT_EQ(Result::OK, retval);
790 EXPECT_EQ(levels[j], actualLevel);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800791 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800792 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800793}
794
nelsonli3c12e582019-12-12 13:53:49 +0800795TEST_P(EqualizerAudioEffectHidlTest, GetBandCenterFrequencyAndRange) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800796 description("Verify that Equalizer effect reports adequate band frequency range");
797 uint16_t numBands = 0;
798 getNumBands(&numBands);
799 ASSERT_GT(numBands, 0);
800 for (uint16_t i = 0; i < numBands; ++i) {
801 uint32_t minFreq = 0xffffffff, centerFreq = 0xffffffff, maxFreq = 0xffffffff;
802 getBandFrequencyRange(i, &minFreq, &centerFreq, &maxFreq);
803 // Note: NXP legacy implementation reports "1" as upper bound for last band,
804 // so this check fails.
805 EXPECT_GE(maxFreq, centerFreq);
806 EXPECT_GE(centerFreq, minFreq);
807 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800808}
809
nelsonli3c12e582019-12-12 13:53:49 +0800810TEST_P(EqualizerAudioEffectHidlTest, GetBandForFrequency) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800811 description("Verify that Equalizer effect supports GetBandForFrequency correctly");
812 uint16_t numBands = 0;
813 getNumBands(&numBands);
814 ASSERT_GT(numBands, 0);
815 for (uint16_t i = 0; i < numBands; ++i) {
816 uint32_t freqs[3]{0, 0, 0};
817 getBandFrequencyRange(i, &freqs[0], &freqs[1], &freqs[2]);
818 // NXP legacy implementation reports "1" as upper bound for last band, some
819 // of the checks fail.
820 for (size_t j = 0; j < ARRAY_SIZE(freqs); ++j) {
821 if (j == 0) {
822 freqs[j]++;
823 } // Min frequency is an open interval.
824 Result retval = Result::NOT_INITIALIZED;
825 uint16_t actualBand = numBands + 1;
826 Return<void> ret = equalizer->getBandForFrequency(freqs[j], [&](Result r, uint16_t b) {
827 retval = r;
828 if (retval == Result::OK) {
829 actualBand = b;
830 }
831 });
832 EXPECT_TRUE(ret.isOk());
833 EXPECT_EQ(Result::OK, retval);
834 EXPECT_EQ(i, actualBand) << "Frequency: " << freqs[j];
835 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800836 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800837}
838
nelsonli3c12e582019-12-12 13:53:49 +0800839TEST_P(EqualizerAudioEffectHidlTest, GetPresetNames) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800840 description("Verify that Equalizer effect reports at least one preset");
841 size_t presetCount;
842 getPresetCount(&presetCount);
843 EXPECT_GT(presetCount, 0u);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800844}
845
nelsonli3c12e582019-12-12 13:53:49 +0800846TEST_P(EqualizerAudioEffectHidlTest, GetSetCurrentPreset) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800847 description("Verify that manipulating the current preset for Equalizer effect");
848 size_t presetCount;
849 getPresetCount(&presetCount);
850 ASSERT_GT(presetCount, 0u);
851 for (uint16_t i = 0; i < presetCount; ++i) {
852 Return<Result> ret = equalizer->setCurrentPreset(i);
853 EXPECT_TRUE(ret.isOk());
854 EXPECT_EQ(Result::OK, ret);
855 Result retval = Result::NOT_INITIALIZED;
856 uint16_t actualPreset = 0xffff;
857 Return<void> ret2 = equalizer->getCurrentPreset([&](Result r, uint16_t p) {
858 retval = r;
859 if (retval == Result::OK) {
860 actualPreset = p;
861 }
862 });
863 EXPECT_TRUE(ret2.isOk());
864 EXPECT_EQ(Result::OK, retval);
865 EXPECT_EQ(i, actualPreset);
866 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800867}
868
nelsonli3c12e582019-12-12 13:53:49 +0800869TEST_P(EqualizerAudioEffectHidlTest, GetSetAllProperties) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800870 description(
871 "Verify that setting band levels and presets works via Get / "
872 "SetAllProperties for Equalizer effect");
Kevin Rocard96d2cd92018-11-14 16:22:07 -0800873 using AllProperties =
Mikhail Naganov00a44c02018-12-14 14:31:45 -0800874 ::android::hardware::audio::effect::CPP_VERSION::IEqualizerEffect::AllProperties;
Kevin Rocard55b10612018-11-12 12:33:16 -0800875 uint16_t numBands = 0;
876 getNumBands(&numBands);
877 ASSERT_GT(numBands, 0);
878 AllProperties props;
879 props.bandLevels.resize(numBands);
880 for (size_t i = 0; i < numBands; ++i) {
881 props.bandLevels[i] = 0;
882 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800883
Kevin Rocard55b10612018-11-12 12:33:16 -0800884 AllProperties actualProps;
885 Result retval = Result::NOT_INITIALIZED;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800886
Kevin Rocard55b10612018-11-12 12:33:16 -0800887 // Verify setting of the band levels via properties.
888 props.curPreset = -1;
889 Return<Result> ret = equalizer->setAllProperties(props);
890 EXPECT_TRUE(ret.isOk());
891 EXPECT_EQ(Result::OK, ret);
892 Return<void> ret2 = equalizer->getAllProperties([&](Result r, AllProperties p) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800893 retval = r;
894 if (retval == Result::OK) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800895 actualProps = p;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800896 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800897 });
898 EXPECT_TRUE(ret2.isOk());
899 EXPECT_EQ(Result::OK, retval);
900 EXPECT_EQ(props.bandLevels, actualProps.bandLevels);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800901
Kevin Rocard55b10612018-11-12 12:33:16 -0800902 // Verify setting of the current preset via properties.
903 props.curPreset = 0; // Assuming there is at least one preset.
904 ret = equalizer->setAllProperties(props);
905 EXPECT_TRUE(ret.isOk());
906 EXPECT_EQ(Result::OK, ret);
907 ret2 = equalizer->getAllProperties([&](Result r, AllProperties p) {
908 retval = r;
909 if (retval == Result::OK) {
910 actualProps = p;
911 }
912 });
913 EXPECT_TRUE(ret2.isOk());
914 EXPECT_EQ(Result::OK, retval);
915 EXPECT_EQ(props.curPreset, actualProps.curPreset);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800916}
917
918// The main test class for Equalizer Audio Effect HIDL HAL.
919class LoudnessEnhancerAudioEffectHidlTest : public AudioEffectHidlTest {
Mikhail Naganov892d1472020-03-19 10:44:06 -0700920 public:
Kevin Rocard55b10612018-11-12 12:33:16 -0800921 void SetUp() override {
922 AudioEffectHidlTest::SetUp();
923 enhancer = ILoudnessEnhancerEffect::castFrom(effect);
924 ASSERT_NE(nullptr, enhancer.get());
925 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800926
Mikhail Naganov892d1472020-03-19 10:44:06 -0700927 void TearDown() override {
928 enhancer.clear();
929 AudioEffectHidlTest::TearDown();
930 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800931
Mikhail Naganov892d1472020-03-19 10:44:06 -0700932 protected:
Kevin Rocard55b10612018-11-12 12:33:16 -0800933 sp<ILoudnessEnhancerEffect> enhancer;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800934};
935
nelsonli3c12e582019-12-12 13:53:49 +0800936TEST_P(LoudnessEnhancerAudioEffectHidlTest, GetSetTargetGain) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800937 description(
938 "Verify that manipulating the target gain works for Loudness Enhancer "
939 "effect");
940 const int32_t gain = 100;
941 Return<Result> ret = enhancer->setTargetGain(gain);
942 EXPECT_TRUE(ret.isOk());
943 EXPECT_EQ(Result::OK, ret);
944 int32_t actualGain = 0;
945 Result retval;
946 Return<void> ret2 = enhancer->getTargetGain([&](Result r, int32_t g) {
947 retval = r;
948 if (retval == Result::OK) {
949 actualGain = g;
950 }
951 });
952 EXPECT_TRUE(ret2.isOk());
953 EXPECT_EQ(Result::OK, retval);
954 EXPECT_EQ(gain, actualGain);
Mikhail Naganovbf393172016-11-11 16:24:50 -0800955}
Zhuoyao Zhang7dc6ce82018-02-08 12:44:27 -0800956
Mikhail Naganov892d1472020-03-19 10:44:06 -0700957INSTANTIATE_TEST_SUITE_P(EffectsFactory, AudioEffectsFactoryHidlTest,
958 ::testing::ValuesIn(::android::hardware::getAllHalInstanceNames(
959 IEffectsFactory::descriptor)),
960 ::android::hardware::PrintInstanceNameToString);
Mikhail Naganov315ce412019-10-23 16:46:54 -0700961INSTANTIATE_TEST_SUITE_P(
Mikhail Naganov892d1472020-03-19 10:44:06 -0700962 Equalizer_IEffect, AudioEffectHidlTest,
963 ::testing::Combine(::testing::ValuesIn(::android::hardware::getAllHalInstanceNames(
964 IEffectsFactory::descriptor)),
965 ::testing::Values(EQUALIZER_EFFECT_TYPE)),
966 EffectParameterToString);
Mikhail Naganov315ce412019-10-23 16:46:54 -0700967INSTANTIATE_TEST_SUITE_P(
Mikhail Naganov892d1472020-03-19 10:44:06 -0700968 LoudnessEnhancer_IEffect, AudioEffectHidlTest,
969 ::testing::Combine(::testing::ValuesIn(::android::hardware::getAllHalInstanceNames(
970 IEffectsFactory::descriptor)),
971 ::testing::Values(LOUDNESS_ENHANCER_EFFECT_TYPE)),
972 EffectParameterToString);
nelsonli3c12e582019-12-12 13:53:49 +0800973INSTANTIATE_TEST_SUITE_P(
Mikhail Naganov315ce412019-10-23 16:46:54 -0700974 Equalizer, EqualizerAudioEffectHidlTest,
Mikhail Naganov892d1472020-03-19 10:44:06 -0700975 ::testing::Combine(::testing::ValuesIn(::android::hardware::getAllHalInstanceNames(
976 IEffectsFactory::descriptor)),
977 ::testing::Values(EQUALIZER_EFFECT_TYPE)),
978 EffectParameterToString);
Mikhail Naganov315ce412019-10-23 16:46:54 -0700979INSTANTIATE_TEST_SUITE_P(
980 LoudnessEnhancer, LoudnessEnhancerAudioEffectHidlTest,
Mikhail Naganov892d1472020-03-19 10:44:06 -0700981 ::testing::Combine(::testing::ValuesIn(::android::hardware::getAllHalInstanceNames(
982 IEffectsFactory::descriptor)),
983 ::testing::Values(LOUDNESS_ENHANCER_EFFECT_TYPE)),
984 EffectParameterToString);
Mikhail Naganovb9743d42020-07-21 10:57:03 -0700985// When the VTS test runs on a device lacking the corresponding HAL version the parameter
986// list is empty, this isn't a problem.
987GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(AudioEffectsFactoryHidlTest);
988GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(AudioEffectHidlTest);
989GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(EqualizerAudioEffectHidlTest);
990GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(LoudnessEnhancerAudioEffectHidlTest);