blob: ffa4c56e7a77c45f2a055ffc15191c270b573fc8 [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 Naganov315ce412019-10-23 16:46:54 -070038#include <gtest/gtest.h>
39#include <hidl/GtestPrinter.h>
40#include <hidl/ServiceManagement.h>
Mikhail Naganovbf393172016-11-11 16:24:50 -080041
Mikhail Naganov00a44c02018-12-14 14:31:45 -080042using ::android::sp;
43using ::android::hardware::hidl_handle;
44using ::android::hardware::hidl_memory;
45using ::android::hardware::hidl_string;
46using ::android::hardware::hidl_vec;
47using ::android::hardware::MQDescriptorSync;
48using ::android::hardware::Return;
49using ::android::hardware::Void;
50using ::android::hardware::audio::common::utils::mkEnumBitfield;
51using ::android::hidl::allocator::V1_0::IAllocator;
52using ::android::hidl::memory::V1_0::IMemory;
Mikhail Naganov40fde0b2022-01-18 23:54:27 +000053using namespace ::android::hardware::audio::common::COMMON_TYPES_CPP_VERSION;
Mikhail Naganov00a44c02018-12-14 14:31:45 -080054using namespace ::android::hardware::audio::effect::CPP_VERSION;
Mikhail Naganovd72a7c22020-08-14 00:16:09 +000055#if MAJOR_VERSION >= 7
56// Make an alias for enumerations generated from the APM config XSD.
57namespace xsd {
Hayden Gomes4e7d69e2020-11-06 15:15:26 -080058using namespace ::android::audio::policy::configuration::CPP_VERSION;
Mikhail Naganovd72a7c22020-08-14 00:16:09 +000059}
60#endif
Mikhail Naganovbf393172016-11-11 16:24:50 -080061
Mikhail Naganov9f289042017-02-23 08:39:36 -080062#ifndef ARRAY_SIZE
63#define ARRAY_SIZE(a) (sizeof(a) / sizeof(*(a)))
64#endif
65
Mikhail Naganov315ce412019-10-23 16:46:54 -070066class AudioEffectsFactoryHidlTest : public ::testing::TestWithParam<std::string> {
67 public:
68 void SetUp() override {
69 effectsFactory = IEffectsFactory::getService(GetParam());
70 ASSERT_NE(effectsFactory, nullptr);
71 }
Kevin Rocard55b10612018-11-12 12:33:16 -080072 void TearDown() override { effectsFactory.clear(); }
Mikhail Naganov9f289042017-02-23 08:39:36 -080073
Kevin Rocard55b10612018-11-12 12:33:16 -080074 protected:
75 static void description(const std::string& description) {
76 RecordProperty("description", description);
77 }
Mikhail Naganovbf393172016-11-11 16:24:50 -080078
Kevin Rocard55b10612018-11-12 12:33:16 -080079 sp<IEffectsFactory> effectsFactory;
Mikhail Naganovbf393172016-11-11 16:24:50 -080080};
81
nelsonli3c12e582019-12-12 13:53:49 +080082TEST_P(AudioEffectsFactoryHidlTest, EnumerateEffects) {
Kevin Rocard55b10612018-11-12 12:33:16 -080083 description("Verify that EnumerateEffects returns at least one effect");
84 Result retval = Result::NOT_INITIALIZED;
85 size_t effectCount = 0;
86 Return<void> ret =
87 effectsFactory->getAllDescriptors([&](Result r, const hidl_vec<EffectDescriptor>& result) {
88 retval = r;
89 effectCount = result.size();
90 });
91 EXPECT_TRUE(ret.isOk());
92 EXPECT_EQ(Result::OK, retval);
93 EXPECT_GT(effectCount, 0u);
Mikhail Naganovbf393172016-11-11 16:24:50 -080094}
95
nelsonli3c12e582019-12-12 13:53:49 +080096TEST_P(AudioEffectsFactoryHidlTest, CreateEffect) {
Kevin Rocard55b10612018-11-12 12:33:16 -080097 description("Verify that an effect can be created via CreateEffect");
98 bool gotEffect = false;
99 Uuid effectUuid;
100 Return<void> ret =
101 effectsFactory->getAllDescriptors([&](Result r, const hidl_vec<EffectDescriptor>& result) {
102 if (r == Result::OK && result.size() > 0) {
103 gotEffect = true;
104 effectUuid = result[0].uuid;
105 }
106 });
107 ASSERT_TRUE(ret.isOk());
108 ASSERT_TRUE(gotEffect);
109 Result retval = Result::NOT_INITIALIZED;
110 sp<IEffect> effect;
111 ret = effectsFactory->createEffect(
Eric Laurentd33e6932019-11-13 13:47:50 -0800112 effectUuid, 1 /*session*/, 1 /*ioHandle*/,
113#if MAJOR_VERSION >= 6
114 0 /*device*/,
115#endif
116 [&](Result r, const sp<IEffect>& result, uint64_t /*effectId*/) {
117 retval = r;
118 if (r == Result::OK) {
119 effect = result;
120 }
121 });
Kevin Rocard55b10612018-11-12 12:33:16 -0800122 EXPECT_TRUE(ret.isOk());
123 EXPECT_EQ(Result::OK, retval);
124 EXPECT_NE(nullptr, effect.get());
Mikhail Naganovbf393172016-11-11 16:24:50 -0800125}
126
nelsonli3c12e582019-12-12 13:53:49 +0800127TEST_P(AudioEffectsFactoryHidlTest, GetDescriptor) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800128 description(
129 "Verify that effects factory can provide an effect descriptor via "
130 "GetDescriptor");
131 hidl_vec<EffectDescriptor> allDescriptors;
132 Return<void> ret =
133 effectsFactory->getAllDescriptors([&](Result r, const hidl_vec<EffectDescriptor>& result) {
134 if (r == Result::OK) {
135 allDescriptors = result;
136 }
Mikhail Naganovbf393172016-11-11 16:24:50 -0800137 });
Kevin Rocard55b10612018-11-12 12:33:16 -0800138 ASSERT_TRUE(ret.isOk());
139 ASSERT_GT(allDescriptors.size(), 0u);
140 for (size_t i = 0; i < allDescriptors.size(); ++i) {
141 ret = effectsFactory->getDescriptor(allDescriptors[i].uuid,
142 [&](Result r, const EffectDescriptor& result) {
143 EXPECT_EQ(r, Result::OK);
144 EXPECT_EQ(result, allDescriptors[i]);
145 });
146 }
147 EXPECT_TRUE(ret.isOk());
Mikhail Naganovbf393172016-11-11 16:24:50 -0800148}
149
nelsonli3c12e582019-12-12 13:53:49 +0800150TEST_P(AudioEffectsFactoryHidlTest, DebugDumpInvalidArgument) {
Mikhail Naganov3e6fe752017-04-24 10:44:08 -0700151 description("Verify that debugDump doesn't crash on invalid arguments");
Kevin Rocard96d2cd92018-11-14 16:22:07 -0800152#if MAJOR_VERSION == 2
Mikhail Naganov3e6fe752017-04-24 10:44:08 -0700153 Return<void> ret = effectsFactory->debugDump(hidl_handle());
Kevin Rocard20614ba2018-11-10 07:20:17 -0800154#elif MAJOR_VERSION >= 4
Kevin Rocard96d2cd92018-11-14 16:22:07 -0800155 Return<void> ret = effectsFactory->debug(hidl_handle(), {});
156#endif
Mikhail Naganov3e6fe752017-04-24 10:44:08 -0700157 ASSERT_TRUE(ret.isOk());
158}
159
Mikhail Naganov9f289042017-02-23 08:39:36 -0800160// Equalizer effect is required by CDD, but only the type is fixed.
161// This is the same UUID as AudioEffect.EFFECT_TYPE_EQUALIZER in Java.
162static const Uuid EQUALIZER_EFFECT_TYPE = {
163 0x0bed4300, 0xddd6, 0x11db, 0x8f34,
164 std::array<uint8_t, 6>{{0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}}};
165// Loudness Enhancer effect is required by CDD, but only the type is fixed.
166// This is the same UUID as AudioEffect.EFFECT_TYPE_LOUDNESS_ENHANCER in Java.
167static const Uuid LOUDNESS_ENHANCER_EFFECT_TYPE = {
168 0xfe3199be, 0xaed0, 0x413f, 0x87bb,
169 std::array<uint8_t, 6>{{0x11, 0x26, 0x0e, 0xb6, 0x3c, 0xf1}}};
170
Mikhail Naganov892d1472020-03-19 10:44:06 -0700171enum { PARAM_FACTORY_NAME, PARAM_EFFECT_UUID };
172using EffectParameter = std::tuple<std::string, Uuid>;
173
174static inline std::string EffectParameterToString(
175 const ::testing::TestParamInfo<EffectParameter>& info) {
176 return ::android::hardware::PrintInstanceNameToString(::testing::TestParamInfo<std::string>{
177 std::get<PARAM_FACTORY_NAME>(info.param), info.index});
178}
179
Mikhail Naganov9f289042017-02-23 08:39:36 -0800180// The main test class for Audio Effect HIDL HAL.
Mikhail Naganov892d1472020-03-19 10:44:06 -0700181class AudioEffectHidlTest : public ::testing::TestWithParam<EffectParameter> {
Mikhail Naganov315ce412019-10-23 16:46:54 -0700182 public:
183 void SetUp() override {
Mikhail Naganov892d1472020-03-19 10:44:06 -0700184 effectsFactory = IEffectsFactory::getService(std::get<PARAM_FACTORY_NAME>(GetParam()));
Kevin Rocard55b10612018-11-12 12:33:16 -0800185 ASSERT_NE(nullptr, effectsFactory.get());
Mikhail Naganov9f289042017-02-23 08:39:36 -0800186
Mikhail Naganovd72a7c22020-08-14 00:16:09 +0000187 ASSERT_NO_FATAL_FAILURE(findAndCreateEffect(getEffectType()));
Kevin Rocard55b10612018-11-12 12:33:16 -0800188 ASSERT_NE(nullptr, effect.get());
Mikhail Naganov9f289042017-02-23 08:39:36 -0800189
Kevin Rocard55b10612018-11-12 12:33:16 -0800190 Return<Result> ret = effect->init();
191 ASSERT_TRUE(ret.isOk());
192 ASSERT_EQ(Result::OK, ret);
193 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800194
Kevin Rocard55b10612018-11-12 12:33:16 -0800195 void TearDown() override {
196 effect.clear();
197 effectsFactory.clear();
198 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800199
Kevin Rocard55b10612018-11-12 12:33:16 -0800200 protected:
201 static void description(const std::string& description) {
202 RecordProperty("description", description);
203 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800204
Mikhail Naganov892d1472020-03-19 10:44:06 -0700205 Uuid getEffectType() const { return std::get<PARAM_EFFECT_UUID>(GetParam()); }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800206
Kevin Rocard55b10612018-11-12 12:33:16 -0800207 void findAndCreateEffect(const Uuid& type);
208 void findEffectInstance(const Uuid& type, Uuid* uuid);
209 void getChannelCount(uint32_t* channelCount);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800210
Kevin Rocard55b10612018-11-12 12:33:16 -0800211 sp<IEffectsFactory> effectsFactory;
212 sp<IEffect> effect;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800213};
214
215void AudioEffectHidlTest::findAndCreateEffect(const Uuid& type) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800216 Uuid effectUuid;
Mikhail Naganovd72a7c22020-08-14 00:16:09 +0000217 ASSERT_NO_FATAL_FAILURE(findEffectInstance(type, &effectUuid));
Kevin Rocard55b10612018-11-12 12:33:16 -0800218 Return<void> ret = effectsFactory->createEffect(
Eric Laurentd33e6932019-11-13 13:47:50 -0800219 effectUuid, 1 /*session*/, 1 /*ioHandle*/,
220#if MAJOR_VERSION >= 6
221 0 /*device*/,
222#endif
223 [&](Result r, const sp<IEffect>& result, uint64_t /*effectId*/) {
224 if (r == Result::OK) {
225 effect = result;
226 }
227 });
Kevin Rocard55b10612018-11-12 12:33:16 -0800228 ASSERT_TRUE(ret.isOk());
Mikhail Naganov9f289042017-02-23 08:39:36 -0800229}
230
231void AudioEffectHidlTest::findEffectInstance(const Uuid& type, Uuid* uuid) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800232 bool effectFound = false;
233 Return<void> ret =
234 effectsFactory->getAllDescriptors([&](Result r, const hidl_vec<EffectDescriptor>& result) {
235 if (r == Result::OK) {
236 for (const auto& desc : result) {
237 if (desc.type == type) {
238 effectFound = true;
239 *uuid = desc.uuid;
240 break;
241 }
242 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800243 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800244 });
245 ASSERT_TRUE(ret.isOk());
246 ASSERT_TRUE(effectFound);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800247}
248
249void AudioEffectHidlTest::getChannelCount(uint32_t* channelCount) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800250 Result retval;
251 EffectConfig currentConfig;
252 Return<void> ret = effect->getConfig([&](Result r, const EffectConfig& conf) {
253 retval = r;
254 if (r == Result::OK) {
255 currentConfig = conf;
256 }
257 });
258 ASSERT_TRUE(ret.isOk());
259 ASSERT_EQ(Result::OK, retval);
Mikhail Naganovd72a7c22020-08-14 00:16:09 +0000260#if MAJOR_VERSION <= 6
Kevin Rocard55b10612018-11-12 12:33:16 -0800261 ASSERT_TRUE(audio_channel_mask_is_valid(
262 static_cast<audio_channel_mask_t>(currentConfig.outputCfg.channels)));
263 *channelCount = audio_channel_count_from_out_mask(
264 static_cast<audio_channel_mask_t>(currentConfig.outputCfg.channels));
Mikhail Naganovd72a7c22020-08-14 00:16:09 +0000265#else
Mikhail Naganovff611982021-01-27 02:16:53 +0000266 ASSERT_EQ(AudioConfigBaseOptional::ChannelMask::hidl_discriminator::value,
267 currentConfig.outputCfg.base.channelMask.getDiscriminator());
Hayden Gomes4e7d69e2020-11-06 15:15:26 -0800268 *channelCount = android::audio::policy::configuration::V7_0::getChannelCount(
Mikhail Naganovff611982021-01-27 02:16:53 +0000269 currentConfig.outputCfg.base.channelMask.value());
Mikhail Naganovd72a7c22020-08-14 00:16:09 +0000270 ASSERT_NE(*channelCount, 0);
271#endif
Mikhail Naganov9f289042017-02-23 08:39:36 -0800272}
273
nelsonli3c12e582019-12-12 13:53:49 +0800274TEST_P(AudioEffectHidlTest, Close) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800275 description("Verify that an effect can be closed");
276 Return<Result> ret = effect->close();
277 EXPECT_TRUE(ret.isOk());
278 EXPECT_EQ(Result::OK, ret);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800279}
280
nelsonli3c12e582019-12-12 13:53:49 +0800281TEST_P(AudioEffectHidlTest, GetDescriptor) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800282 description("Verify that an effect can return its own descriptor via GetDescriptor");
283 Result retval = Result::NOT_INITIALIZED;
284 Uuid actualType;
285 Return<void> ret = effect->getDescriptor([&](Result r, const EffectDescriptor& desc) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800286 retval = r;
287 if (r == Result::OK) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800288 actualType = desc.type;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800289 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800290 });
291 EXPECT_TRUE(ret.isOk());
292 EXPECT_EQ(Result::OK, retval);
293 EXPECT_EQ(getEffectType(), actualType);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800294}
295
nelsonli3c12e582019-12-12 13:53:49 +0800296TEST_P(AudioEffectHidlTest, GetSetConfig) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800297 description(
298 "Verify that it is possible to manipulate effect config via Get / "
299 "SetConfig");
300 Result retval = Result::NOT_INITIALIZED;
301 EffectConfig currentConfig;
302 Return<void> ret = effect->getConfig([&](Result r, const EffectConfig& conf) {
303 retval = r;
304 if (r == Result::OK) {
305 currentConfig = conf;
306 }
307 });
308 EXPECT_TRUE(ret.isOk());
309 EXPECT_EQ(Result::OK, retval);
310 Return<Result> ret2 = effect->setConfig(currentConfig, nullptr, nullptr);
311 EXPECT_TRUE(ret2.isOk());
312 EXPECT_EQ(Result::OK, ret2);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800313}
314
Mikhail Naganov0dbf3982021-01-08 17:48:22 -0800315#if MAJOR_VERSION >= 7
316std::vector<EffectBufferConfig> generateInvalidConfigs(const EffectBufferConfig& src) {
317 std::vector<EffectBufferConfig> result;
318 EffectBufferConfig invalidFormat = src;
Mikhail Naganovff611982021-01-27 02:16:53 +0000319 invalidFormat.base.format.value("random_string");
Mikhail Naganov0dbf3982021-01-08 17:48:22 -0800320 result.push_back(std::move(invalidFormat));
321 EffectBufferConfig invalidChannelMask = src;
Mikhail Naganovff611982021-01-27 02:16:53 +0000322 invalidChannelMask.base.channelMask.value("random_string");
Mikhail Naganov0dbf3982021-01-08 17:48:22 -0800323 result.push_back(std::move(invalidChannelMask));
324 return result;
325}
326
327TEST_P(AudioEffectHidlTest, SetConfigInvalidArguments) {
328 description("Verify that invalid arguments are rejected by SetConfig");
329 Result retval = Result::NOT_INITIALIZED;
330 EffectConfig currentConfig;
331 Return<void> ret = effect->getConfig([&](Result r, const EffectConfig& conf) {
332 retval = r;
333 if (r == Result::OK) {
334 currentConfig = conf;
335 }
336 });
337 EXPECT_TRUE(ret.isOk());
338 EXPECT_EQ(Result::OK, retval);
339 for (const auto& invalidInputCfg : generateInvalidConfigs(currentConfig.inputCfg)) {
340 EffectConfig invalidConfig = currentConfig;
341 invalidConfig.inputCfg = invalidInputCfg;
342 Return<Result> ret = effect->setConfig(invalidConfig, nullptr, nullptr);
343 EXPECT_TRUE(ret.isOk());
344 EXPECT_EQ(Result::INVALID_ARGUMENTS, ret);
345 }
346 for (const auto& invalidOutputCfg : generateInvalidConfigs(currentConfig.outputCfg)) {
347 EffectConfig invalidConfig = currentConfig;
348 invalidConfig.outputCfg = invalidOutputCfg;
349 Return<Result> ret = effect->setConfig(invalidConfig, nullptr, nullptr);
350 EXPECT_TRUE(ret.isOk());
351 EXPECT_EQ(Result::INVALID_ARGUMENTS, ret);
352 }
353}
354#endif
355
nelsonli3c12e582019-12-12 13:53:49 +0800356TEST_P(AudioEffectHidlTest, GetConfigReverse) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800357 description("Verify that GetConfigReverse does not crash");
358 Return<void> ret = effect->getConfigReverse([&](Result, const EffectConfig&) {});
359 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700360}
361
nelsonli3c12e582019-12-12 13:53:49 +0800362TEST_P(AudioEffectHidlTest, GetSupportedAuxChannelsConfigs) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800363 description("Verify that GetSupportedAuxChannelsConfigs does not crash");
364 Return<void> ret = effect->getSupportedAuxChannelsConfigs(
365 0, [&](Result, const hidl_vec<EffectAuxChannelsConfig>&) {});
366 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700367}
368
nelsonli3c12e582019-12-12 13:53:49 +0800369TEST_P(AudioEffectHidlTest, GetAuxChannelsConfig) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800370 description("Verify that GetAuxChannelsConfig does not crash");
371 Return<void> ret = effect->getAuxChannelsConfig([&](Result, const EffectAuxChannelsConfig&) {});
372 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700373}
374
nelsonli3c12e582019-12-12 13:53:49 +0800375TEST_P(AudioEffectHidlTest, SetAuxChannelsConfig) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800376 description("Verify that SetAuxChannelsConfig does not crash");
377 Return<Result> ret = effect->setAuxChannelsConfig(EffectAuxChannelsConfig());
378 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700379}
380
Mikhail Naganov9f289042017-02-23 08:39:36 -0800381// Not generated automatically because AudioBuffer contains
382// instances of hidl_memory which can't be compared properly
383// in general case due to presence of handles.
384//
385// However, in this particular case, handles must not present
386// thus comparison is possible.
387//
388// operator== must be defined in the same namespace as the structures.
389namespace android {
390namespace hardware {
391namespace audio {
392namespace effect {
Kevin Rocard96d2cd92018-11-14 16:22:07 -0800393namespace CPP_VERSION {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800394inline bool operator==(const AudioBuffer& lhs, const AudioBuffer& rhs) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800395 return lhs.id == rhs.id && lhs.frameCount == rhs.frameCount && lhs.data.handle() == nullptr &&
396 rhs.data.handle() == nullptr;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800397}
398
Mikhail Naganovff611982021-01-27 02:16:53 +0000399#if MAJOR_VERSION <= 6
Kevin Rocard55b10612018-11-12 12:33:16 -0800400inline bool operator==(const EffectBufferConfig& lhs, const EffectBufferConfig& rhs) {
Mikhail Naganovf363ed42020-12-10 18:47:51 -0800401 return lhs.buffer == rhs.buffer &&
Mikhail Naganovf363ed42020-12-10 18:47:51 -0800402 lhs.samplingRateHz == rhs.samplingRateHz && lhs.channels == rhs.channels &&
403 lhs.format == rhs.format &&
Kevin Rocard55b10612018-11-12 12:33:16 -0800404 lhs.accessMode == rhs.accessMode && lhs.mask == rhs.mask;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800405}
Mikhail Naganovff611982021-01-27 02:16:53 +0000406#else
407inline bool operator==(const EffectBufferConfig& lhs, const EffectBufferConfig& rhs) {
408 return lhs.buffer.getDiscriminator() == rhs.buffer.getDiscriminator() &&
409 (lhs.buffer.getDiscriminator() ==
410 EffectBufferConfig::OptionalBuffer::hidl_discriminator::unspecified ||
411 lhs.buffer.buf() == rhs.buffer.buf()) &&
412 lhs.base == rhs.base && lhs.accessMode == rhs.accessMode;
413}
414#endif // MAJOR_VERSION <= 6
Mikhail Naganov9f289042017-02-23 08:39:36 -0800415
416inline bool operator==(const EffectConfig& lhs, const EffectConfig& rhs) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800417 return lhs.inputCfg == rhs.inputCfg && lhs.outputCfg == rhs.outputCfg;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800418}
Kevin Rocard96d2cd92018-11-14 16:22:07 -0800419} // namespace CPP_VERSION
Mikhail Naganov9f289042017-02-23 08:39:36 -0800420} // namespace effect
421} // namespace audio
422} // namespace hardware
423} // namespace android
424
nelsonli3c12e582019-12-12 13:53:49 +0800425TEST_P(AudioEffectHidlTest, Reset) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800426 description("Verify that Reset preserves effect configuration");
427 Result retval = Result::NOT_INITIALIZED;
428 EffectConfig originalConfig;
429 Return<void> ret = effect->getConfig([&](Result r, const EffectConfig& conf) {
430 retval = r;
431 if (r == Result::OK) {
432 originalConfig = conf;
433 }
434 });
435 ASSERT_TRUE(ret.isOk());
436 ASSERT_EQ(Result::OK, retval);
437 Return<Result> ret2 = effect->reset();
438 EXPECT_TRUE(ret2.isOk());
439 EXPECT_EQ(Result::OK, ret2);
440 EffectConfig configAfterReset;
441 ret = effect->getConfig([&](Result r, const EffectConfig& conf) {
442 retval = r;
443 if (r == Result::OK) {
444 configAfterReset = conf;
445 }
446 });
447 EXPECT_EQ(originalConfig, configAfterReset);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800448}
449
nelsonli3c12e582019-12-12 13:53:49 +0800450TEST_P(AudioEffectHidlTest, DisableEnableDisable) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800451 description("Verify Disable -> Enable -> Disable sequence for an effect");
452 Return<Result> ret = effect->disable();
453 EXPECT_TRUE(ret.isOk());
Mikhail Naganov892d1472020-03-19 10:44:06 -0700454 // Note: some legacy effects may return -EINVAL (INVALID_ARGUMENTS),
455 // more canonical is to return -ENOSYS (NOT_SUPPORTED)
456 EXPECT_TRUE(ret == Result::NOT_SUPPORTED || ret == Result::INVALID_ARGUMENTS);
Kevin Rocard55b10612018-11-12 12:33:16 -0800457 ret = effect->enable();
458 EXPECT_TRUE(ret.isOk());
459 EXPECT_EQ(Result::OK, ret);
460 ret = effect->disable();
461 EXPECT_TRUE(ret.isOk());
462 EXPECT_EQ(Result::OK, ret);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800463}
464
Mikhail Naganov0dbf3982021-01-08 17:48:22 -0800465#if MAJOR_VERSION >= 7
466TEST_P(AudioEffectHidlTest, SetDeviceInvalidDeviceAddress) {
467 description("Verify that invalid device address is rejected by SetDevice");
468 DeviceAddress device{.deviceType = "random_string"};
469 Return<Result> ret = effect->setDevice(device);
470 EXPECT_TRUE(ret.isOk());
471 EXPECT_EQ(Result::INVALID_ARGUMENTS, ret);
472}
473#endif
474
nelsonli3c12e582019-12-12 13:53:49 +0800475TEST_P(AudioEffectHidlTest, SetDevice) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800476 description("Verify that SetDevice works for an output chain effect");
Mikhail Naganovd72a7c22020-08-14 00:16:09 +0000477#if MAJOR_VERSION <= 6
Kevin Rocardf5305b32018-11-13 10:41:53 -0800478 Return<Result> ret = effect->setDevice(mkEnumBitfield(AudioDevice::OUT_SPEAKER));
Mikhail Naganovd72a7c22020-08-14 00:16:09 +0000479#else
480 DeviceAddress device{.deviceType = toString(xsd::AudioDevice::AUDIO_DEVICE_OUT_SPEAKER)};
481 Return<Result> ret = effect->setDevice(device);
482#endif
Kevin Rocard55b10612018-11-12 12:33:16 -0800483 EXPECT_TRUE(ret.isOk());
484 EXPECT_EQ(Result::OK, ret);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800485}
486
nelsonli3c12e582019-12-12 13:53:49 +0800487TEST_P(AudioEffectHidlTest, SetAndGetVolume) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800488 description("Verify that SetAndGetVolume method works for an effect");
489 uint32_t channelCount;
490 getChannelCount(&channelCount);
491 hidl_vec<uint32_t> volumes;
492 volumes.resize(channelCount);
493 for (uint32_t i = 0; i < channelCount; ++i) {
494 volumes[i] = 0;
495 }
496 Result retval = Result::NOT_INITIALIZED;
497 Return<void> ret =
498 effect->setAndGetVolume(volumes, [&](Result r, const hidl_vec<uint32_t>&) { retval = r; });
499 EXPECT_TRUE(ret.isOk());
500 EXPECT_EQ(Result::OK, retval);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800501}
502
nelsonli3c12e582019-12-12 13:53:49 +0800503TEST_P(AudioEffectHidlTest, VolumeChangeNotification) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800504 description("Verify that effect accepts VolumeChangeNotification");
505 uint32_t channelCount;
506 getChannelCount(&channelCount);
507 hidl_vec<uint32_t> volumes;
508 volumes.resize(channelCount);
509 for (uint32_t i = 0; i < channelCount; ++i) {
510 volumes[i] = 0;
511 }
512 Return<Result> ret = effect->volumeChangeNotification(volumes);
513 EXPECT_TRUE(ret.isOk());
514 EXPECT_EQ(Result::OK, ret);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800515}
516
nelsonli3c12e582019-12-12 13:53:49 +0800517TEST_P(AudioEffectHidlTest, SetAudioMode) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800518 description("Verify that SetAudioMode works for an effect");
519 Return<Result> ret = effect->setAudioMode(AudioMode::NORMAL);
520 EXPECT_TRUE(ret.isOk());
521 EXPECT_EQ(Result::OK, ret);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800522}
523
nelsonli3c12e582019-12-12 13:53:49 +0800524TEST_P(AudioEffectHidlTest, SetConfigReverse) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800525 description("Verify that SetConfigReverse does not crash");
526 Return<Result> ret = effect->setConfigReverse(EffectConfig(), nullptr, nullptr);
527 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700528}
529
Mikhail Naganov0dbf3982021-01-08 17:48:22 -0800530#if MAJOR_VERSION >= 7
531TEST_P(AudioEffectHidlTest, SetInputDeviceInvalidDeviceAddress) {
532 description("Verify that invalid device address is rejected by SetInputDevice");
533 DeviceAddress device{.deviceType = "random_string"};
534 Return<Result> ret = effect->setInputDevice(device);
535 EXPECT_TRUE(ret.isOk());
536 EXPECT_TRUE(ret == Result::INVALID_ARGUMENTS || ret == Result::NOT_SUPPORTED)
537 << ::testing::PrintToString(ret);
538}
539#endif
540
nelsonli3c12e582019-12-12 13:53:49 +0800541TEST_P(AudioEffectHidlTest, SetInputDevice) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800542 description("Verify that SetInputDevice does not crash");
Mikhail Naganovd72a7c22020-08-14 00:16:09 +0000543#if MAJOR_VERSION <= 6
Kevin Rocardf5305b32018-11-13 10:41:53 -0800544 Return<Result> ret = effect->setInputDevice(mkEnumBitfield(AudioDevice::IN_BUILTIN_MIC));
Mikhail Naganovd72a7c22020-08-14 00:16:09 +0000545#else
546 DeviceAddress device{.deviceType = toString(xsd::AudioDevice::AUDIO_DEVICE_IN_BUILTIN_MIC)};
547 Return<Result> ret = effect->setInputDevice(device);
548#endif
Kevin Rocard55b10612018-11-12 12:33:16 -0800549 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700550}
551
Mikhail Naganov0dbf3982021-01-08 17:48:22 -0800552#if MAJOR_VERSION >= 7
553TEST_P(AudioEffectHidlTest, SetInvalidAudioSource) {
554 description("Verify that an invalid audio source is rejected by SetAudioSource");
555 Return<Result> ret = effect->setAudioSource("random_string");
556 ASSERT_TRUE(ret.isOk());
557 EXPECT_TRUE(ret == Result::INVALID_ARGUMENTS || ret == Result::NOT_SUPPORTED)
558 << ::testing::PrintToString(ret);
559}
560#endif
561
nelsonli3c12e582019-12-12 13:53:49 +0800562TEST_P(AudioEffectHidlTest, SetAudioSource) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800563 description("Verify that SetAudioSource does not crash");
Mikhail Naganovd72a7c22020-08-14 00:16:09 +0000564#if MAJOR_VERSION <= 6
Kevin Rocard55b10612018-11-12 12:33:16 -0800565 Return<Result> ret = effect->setAudioSource(AudioSource::MIC);
Mikhail Naganovd72a7c22020-08-14 00:16:09 +0000566#else
567 Return<Result> ret = effect->setAudioSource(toString(xsd::AudioSource::AUDIO_SOURCE_MIC));
568#endif
Kevin Rocard55b10612018-11-12 12:33:16 -0800569 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700570}
571
nelsonli3c12e582019-12-12 13:53:49 +0800572TEST_P(AudioEffectHidlTest, Offload) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800573 description("Verify that calling Offload method does not crash");
Mikhail Naganovd72a7c22020-08-14 00:16:09 +0000574 Return<Result> ret = effect->offload(EffectOffloadParameter{});
Kevin Rocard55b10612018-11-12 12:33:16 -0800575 EXPECT_TRUE(ret.isOk());
Mikhail Naganov9f289042017-02-23 08:39:36 -0800576}
577
nelsonli3c12e582019-12-12 13:53:49 +0800578TEST_P(AudioEffectHidlTest, PrepareForProcessing) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800579 description("Verify that PrepareForProcessing method works for an effect");
580 Result retval = Result::NOT_INITIALIZED;
581 Return<void> ret = effect->prepareForProcessing(
582 [&](Result r, const MQDescriptorSync<Result>&) { retval = r; });
583 EXPECT_TRUE(ret.isOk());
584 EXPECT_EQ(Result::OK, retval);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800585}
586
nelsonli3c12e582019-12-12 13:53:49 +0800587TEST_P(AudioEffectHidlTest, SetProcessBuffers) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800588 description("Verify that SetProcessBuffers works for an effect");
589 sp<IAllocator> ashmem = IAllocator::getService("ashmem");
590 ASSERT_NE(nullptr, ashmem.get());
591 bool success = false;
592 AudioBuffer buffer;
593 Return<void> ret = ashmem->allocate(1024, [&](bool s, const hidl_memory& memory) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800594 success = s;
595 if (s) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800596 buffer.data = memory;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800597 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800598 });
599 ASSERT_TRUE(ret.isOk());
600 ASSERT_TRUE(success);
601 Return<Result> ret2 = effect->setProcessBuffers(buffer, buffer);
602 EXPECT_TRUE(ret2.isOk());
603 EXPECT_EQ(Result::OK, ret2);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800604}
605
nelsonli3c12e582019-12-12 13:53:49 +0800606TEST_P(AudioEffectHidlTest, Command) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800607 description("Verify that Command does not crash");
608 Return<void> ret =
609 effect->command(0, hidl_vec<uint8_t>(), 0, [&](int32_t, const hidl_vec<uint8_t>&) {});
610 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700611}
Mikhail Naganov9f289042017-02-23 08:39:36 -0800612
nelsonli3c12e582019-12-12 13:53:49 +0800613TEST_P(AudioEffectHidlTest, SetParameter) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800614 description("Verify that SetParameter does not crash");
615 Return<Result> ret = effect->setParameter(hidl_vec<uint8_t>(), hidl_vec<uint8_t>());
616 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700617}
618
nelsonli3c12e582019-12-12 13:53:49 +0800619TEST_P(AudioEffectHidlTest, GetParameter) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800620 description("Verify that GetParameter does not crash");
621 Return<void> ret =
622 effect->getParameter(hidl_vec<uint8_t>(), 0, [&](Result, const hidl_vec<uint8_t>&) {});
623 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700624}
625
Mikhail Naganov4f110342022-07-07 20:37:42 +0000626TEST_P(AudioEffectHidlTest, GetParameterInvalidMaxReplySize) {
627 description("Verify that GetParameter caps the maximum reply size");
628 // Use a non-empty parameter to avoid being rejected by any earlier checks.
629 hidl_vec<uint8_t> parameter;
630 parameter.resize(16);
631 // Use very large size to ensure that the service does not crash. Since parameters
632 // are specific to each effect, and some effects may not have parameters at all,
633 // simply checking the return value would not reveal an issue of using an uncapped value.
634 const uint32_t veryLargeReplySize = std::numeric_limits<uint32_t>::max() - 100;
635 Result retval = Result::OK;
636 Return<void> ret =
637 effect->getParameter(parameter, veryLargeReplySize,
638 [&](Result r, const hidl_vec<uint8_t>&) { retval = r; });
639 EXPECT_TRUE(ret.isOk());
640 EXPECT_EQ(Result::INVALID_ARGUMENTS, retval);
641}
642
nelsonli3c12e582019-12-12 13:53:49 +0800643TEST_P(AudioEffectHidlTest, GetSupportedConfigsForFeature) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800644 description("Verify that GetSupportedConfigsForFeature does not crash");
645 Return<void> ret = effect->getSupportedConfigsForFeature(
646 0, 0, 0, [&](Result, uint32_t, const hidl_vec<uint8_t>&) {});
647 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700648}
649
nelsonli3c12e582019-12-12 13:53:49 +0800650TEST_P(AudioEffectHidlTest, GetCurrentConfigForFeature) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800651 description("Verify that GetCurrentConfigForFeature does not crash");
652 Return<void> ret =
653 effect->getCurrentConfigForFeature(0, 0, [&](Result, const hidl_vec<uint8_t>&) {});
654 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700655}
656
nelsonli3c12e582019-12-12 13:53:49 +0800657TEST_P(AudioEffectHidlTest, SetCurrentConfigForFeature) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800658 description("Verify that SetCurrentConfigForFeature does not crash");
659 Return<Result> ret = effect->setCurrentConfigForFeature(0, hidl_vec<uint8_t>());
660 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700661}
662
Mikhail Naganov9f289042017-02-23 08:39:36 -0800663// The main test class for Equalizer Audio Effect HIDL HAL.
664class EqualizerAudioEffectHidlTest : public AudioEffectHidlTest {
Mikhail Naganov892d1472020-03-19 10:44:06 -0700665 public:
Kevin Rocard55b10612018-11-12 12:33:16 -0800666 void SetUp() override {
667 AudioEffectHidlTest::SetUp();
668 equalizer = IEqualizerEffect::castFrom(effect);
669 ASSERT_NE(nullptr, equalizer.get());
670 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800671
Mikhail Naganov892d1472020-03-19 10:44:06 -0700672 void TearDown() override {
673 equalizer.clear();
674 AudioEffectHidlTest::TearDown();
675 }
676
677 protected:
Kevin Rocard55b10612018-11-12 12:33:16 -0800678 void getNumBands(uint16_t* numBands);
679 void getLevelRange(int16_t* minLevel, int16_t* maxLevel);
680 void getBandFrequencyRange(uint16_t band, uint32_t* minFreq, uint32_t* centerFreq,
681 uint32_t* maxFreq);
682 void getPresetCount(size_t* count);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800683
Kevin Rocard55b10612018-11-12 12:33:16 -0800684 sp<IEqualizerEffect> equalizer;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800685};
686
687void EqualizerAudioEffectHidlTest::getNumBands(uint16_t* numBands) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800688 Result retval = Result::NOT_INITIALIZED;
689 Return<void> ret = equalizer->getNumBands([&](Result r, uint16_t b) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800690 retval = r;
691 if (retval == Result::OK) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800692 *numBands = b;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800693 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800694 });
695 ASSERT_TRUE(ret.isOk());
696 ASSERT_EQ(Result::OK, retval);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800697}
698
Kevin Rocard55b10612018-11-12 12:33:16 -0800699void EqualizerAudioEffectHidlTest::getLevelRange(int16_t* minLevel, int16_t* maxLevel) {
700 Result retval = Result::NOT_INITIALIZED;
701 Return<void> ret = equalizer->getLevelRange([&](Result r, int16_t min, int16_t max) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800702 retval = r;
703 if (retval == Result::OK) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800704 *minLevel = min;
705 *maxLevel = max;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800706 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800707 });
708 ASSERT_TRUE(ret.isOk());
709 ASSERT_EQ(Result::OK, retval);
710}
711
712void EqualizerAudioEffectHidlTest::getBandFrequencyRange(uint16_t band, uint32_t* minFreq,
713 uint32_t* centerFreq, uint32_t* maxFreq) {
714 Result retval = Result::NOT_INITIALIZED;
715 Return<void> ret =
716 equalizer->getBandFrequencyRange(band, [&](Result r, uint32_t min, uint32_t max) {
717 retval = r;
718 if (retval == Result::OK) {
719 *minFreq = min;
720 *maxFreq = max;
721 }
722 });
723 ASSERT_TRUE(ret.isOk());
724 ASSERT_EQ(Result::OK, retval);
725 ret = equalizer->getBandCenterFrequency(band, [&](Result r, uint32_t center) {
726 retval = r;
727 if (retval == Result::OK) {
728 *centerFreq = center;
729 }
730 });
731 ASSERT_TRUE(ret.isOk());
732 ASSERT_EQ(Result::OK, retval);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800733}
734
735void EqualizerAudioEffectHidlTest::getPresetCount(size_t* count) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800736 Result retval = Result::NOT_INITIALIZED;
737 Return<void> ret = equalizer->getPresetNames([&](Result r, const hidl_vec<hidl_string>& names) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800738 retval = r;
739 if (retval == Result::OK) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800740 *count = names.size();
Mikhail Naganov9f289042017-02-23 08:39:36 -0800741 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800742 });
743 ASSERT_TRUE(ret.isOk());
744 ASSERT_EQ(Result::OK, retval);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800745}
746
nelsonli3c12e582019-12-12 13:53:49 +0800747TEST_P(EqualizerAudioEffectHidlTest, GetNumBands) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800748 description("Verify that Equalizer effect reports at least one band");
749 uint16_t numBands = 0;
750 getNumBands(&numBands);
751 EXPECT_GT(numBands, 0);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800752}
753
nelsonli3c12e582019-12-12 13:53:49 +0800754TEST_P(EqualizerAudioEffectHidlTest, GetLevelRange) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800755 description("Verify that Equalizer effect reports adequate band level range");
756 int16_t minLevel = 0x7fff, maxLevel = 0;
757 getLevelRange(&minLevel, &maxLevel);
758 EXPECT_GT(maxLevel, minLevel);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800759}
760
nelsonli3c12e582019-12-12 13:53:49 +0800761TEST_P(EqualizerAudioEffectHidlTest, GetSetBandLevel) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800762 description("Verify that manipulating band levels works for Equalizer effect");
763 uint16_t numBands = 0;
764 getNumBands(&numBands);
765 ASSERT_GT(numBands, 0);
766 int16_t levels[3]{0x7fff, 0, 0};
767 getLevelRange(&levels[0], &levels[2]);
768 ASSERT_GT(levels[2], levels[0]);
769 levels[1] = (levels[2] + levels[0]) / 2;
770 for (uint16_t i = 0; i < numBands; ++i) {
771 for (size_t j = 0; j < ARRAY_SIZE(levels); ++j) {
772 Return<Result> ret = equalizer->setBandLevel(i, levels[j]);
773 EXPECT_TRUE(ret.isOk());
774 EXPECT_EQ(Result::OK, ret);
775 Result retval = Result::NOT_INITIALIZED;
776 int16_t actualLevel;
777 Return<void> ret2 = equalizer->getBandLevel(i, [&](Result r, int16_t l) {
778 retval = r;
779 if (retval == Result::OK) {
780 actualLevel = l;
781 }
782 });
783 EXPECT_TRUE(ret2.isOk());
784 EXPECT_EQ(Result::OK, retval);
785 EXPECT_EQ(levels[j], actualLevel);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800786 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800787 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800788}
789
nelsonli3c12e582019-12-12 13:53:49 +0800790TEST_P(EqualizerAudioEffectHidlTest, GetBandCenterFrequencyAndRange) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800791 description("Verify that Equalizer effect reports adequate band frequency range");
792 uint16_t numBands = 0;
793 getNumBands(&numBands);
794 ASSERT_GT(numBands, 0);
795 for (uint16_t i = 0; i < numBands; ++i) {
796 uint32_t minFreq = 0xffffffff, centerFreq = 0xffffffff, maxFreq = 0xffffffff;
797 getBandFrequencyRange(i, &minFreq, &centerFreq, &maxFreq);
798 // Note: NXP legacy implementation reports "1" as upper bound for last band,
799 // so this check fails.
800 EXPECT_GE(maxFreq, centerFreq);
801 EXPECT_GE(centerFreq, minFreq);
802 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800803}
804
nelsonli3c12e582019-12-12 13:53:49 +0800805TEST_P(EqualizerAudioEffectHidlTest, GetBandForFrequency) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800806 description("Verify that Equalizer effect supports GetBandForFrequency correctly");
807 uint16_t numBands = 0;
808 getNumBands(&numBands);
809 ASSERT_GT(numBands, 0);
810 for (uint16_t i = 0; i < numBands; ++i) {
811 uint32_t freqs[3]{0, 0, 0};
812 getBandFrequencyRange(i, &freqs[0], &freqs[1], &freqs[2]);
813 // NXP legacy implementation reports "1" as upper bound for last band, some
814 // of the checks fail.
815 for (size_t j = 0; j < ARRAY_SIZE(freqs); ++j) {
816 if (j == 0) {
817 freqs[j]++;
818 } // Min frequency is an open interval.
819 Result retval = Result::NOT_INITIALIZED;
820 uint16_t actualBand = numBands + 1;
821 Return<void> ret = equalizer->getBandForFrequency(freqs[j], [&](Result r, uint16_t b) {
822 retval = r;
823 if (retval == Result::OK) {
824 actualBand = b;
825 }
826 });
827 EXPECT_TRUE(ret.isOk());
828 EXPECT_EQ(Result::OK, retval);
829 EXPECT_EQ(i, actualBand) << "Frequency: " << freqs[j];
830 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800831 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800832}
833
nelsonli3c12e582019-12-12 13:53:49 +0800834TEST_P(EqualizerAudioEffectHidlTest, GetPresetNames) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800835 description("Verify that Equalizer effect reports at least one preset");
836 size_t presetCount;
837 getPresetCount(&presetCount);
838 EXPECT_GT(presetCount, 0u);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800839}
840
nelsonli3c12e582019-12-12 13:53:49 +0800841TEST_P(EqualizerAudioEffectHidlTest, GetSetCurrentPreset) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800842 description("Verify that manipulating the current preset for Equalizer effect");
843 size_t presetCount;
844 getPresetCount(&presetCount);
845 ASSERT_GT(presetCount, 0u);
846 for (uint16_t i = 0; i < presetCount; ++i) {
847 Return<Result> ret = equalizer->setCurrentPreset(i);
848 EXPECT_TRUE(ret.isOk());
849 EXPECT_EQ(Result::OK, ret);
850 Result retval = Result::NOT_INITIALIZED;
851 uint16_t actualPreset = 0xffff;
852 Return<void> ret2 = equalizer->getCurrentPreset([&](Result r, uint16_t p) {
853 retval = r;
854 if (retval == Result::OK) {
855 actualPreset = p;
856 }
857 });
858 EXPECT_TRUE(ret2.isOk());
859 EXPECT_EQ(Result::OK, retval);
860 EXPECT_EQ(i, actualPreset);
861 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800862}
863
nelsonli3c12e582019-12-12 13:53:49 +0800864TEST_P(EqualizerAudioEffectHidlTest, GetSetAllProperties) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800865 description(
866 "Verify that setting band levels and presets works via Get / "
867 "SetAllProperties for Equalizer effect");
Kevin Rocard96d2cd92018-11-14 16:22:07 -0800868 using AllProperties =
Mikhail Naganov00a44c02018-12-14 14:31:45 -0800869 ::android::hardware::audio::effect::CPP_VERSION::IEqualizerEffect::AllProperties;
Kevin Rocard55b10612018-11-12 12:33:16 -0800870 uint16_t numBands = 0;
871 getNumBands(&numBands);
872 ASSERT_GT(numBands, 0);
873 AllProperties props;
874 props.bandLevels.resize(numBands);
875 for (size_t i = 0; i < numBands; ++i) {
876 props.bandLevels[i] = 0;
877 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800878
Kevin Rocard55b10612018-11-12 12:33:16 -0800879 AllProperties actualProps;
880 Result retval = Result::NOT_INITIALIZED;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800881
Kevin Rocard55b10612018-11-12 12:33:16 -0800882 // Verify setting of the band levels via properties.
883 props.curPreset = -1;
884 Return<Result> ret = equalizer->setAllProperties(props);
885 EXPECT_TRUE(ret.isOk());
886 EXPECT_EQ(Result::OK, ret);
887 Return<void> ret2 = equalizer->getAllProperties([&](Result r, AllProperties p) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800888 retval = r;
889 if (retval == Result::OK) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800890 actualProps = p;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800891 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800892 });
893 EXPECT_TRUE(ret2.isOk());
894 EXPECT_EQ(Result::OK, retval);
895 EXPECT_EQ(props.bandLevels, actualProps.bandLevels);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800896
Kevin Rocard55b10612018-11-12 12:33:16 -0800897 // Verify setting of the current preset via properties.
898 props.curPreset = 0; // Assuming there is at least one preset.
899 ret = equalizer->setAllProperties(props);
900 EXPECT_TRUE(ret.isOk());
901 EXPECT_EQ(Result::OK, ret);
902 ret2 = equalizer->getAllProperties([&](Result r, AllProperties p) {
903 retval = r;
904 if (retval == Result::OK) {
905 actualProps = p;
906 }
907 });
908 EXPECT_TRUE(ret2.isOk());
909 EXPECT_EQ(Result::OK, retval);
910 EXPECT_EQ(props.curPreset, actualProps.curPreset);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800911}
912
913// The main test class for Equalizer Audio Effect HIDL HAL.
914class LoudnessEnhancerAudioEffectHidlTest : public AudioEffectHidlTest {
Mikhail Naganov892d1472020-03-19 10:44:06 -0700915 public:
Kevin Rocard55b10612018-11-12 12:33:16 -0800916 void SetUp() override {
917 AudioEffectHidlTest::SetUp();
918 enhancer = ILoudnessEnhancerEffect::castFrom(effect);
919 ASSERT_NE(nullptr, enhancer.get());
920 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800921
Mikhail Naganov892d1472020-03-19 10:44:06 -0700922 void TearDown() override {
923 enhancer.clear();
924 AudioEffectHidlTest::TearDown();
925 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800926
Mikhail Naganov892d1472020-03-19 10:44:06 -0700927 protected:
Kevin Rocard55b10612018-11-12 12:33:16 -0800928 sp<ILoudnessEnhancerEffect> enhancer;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800929};
930
nelsonli3c12e582019-12-12 13:53:49 +0800931TEST_P(LoudnessEnhancerAudioEffectHidlTest, GetSetTargetGain) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800932 description(
933 "Verify that manipulating the target gain works for Loudness Enhancer "
934 "effect");
935 const int32_t gain = 100;
936 Return<Result> ret = enhancer->setTargetGain(gain);
937 EXPECT_TRUE(ret.isOk());
938 EXPECT_EQ(Result::OK, ret);
939 int32_t actualGain = 0;
940 Result retval;
941 Return<void> ret2 = enhancer->getTargetGain([&](Result r, int32_t g) {
942 retval = r;
943 if (retval == Result::OK) {
944 actualGain = g;
945 }
946 });
947 EXPECT_TRUE(ret2.isOk());
948 EXPECT_EQ(Result::OK, retval);
949 EXPECT_EQ(gain, actualGain);
Mikhail Naganovbf393172016-11-11 16:24:50 -0800950}
Zhuoyao Zhang7dc6ce82018-02-08 12:44:27 -0800951
Mikhail Naganov892d1472020-03-19 10:44:06 -0700952INSTANTIATE_TEST_SUITE_P(EffectsFactory, AudioEffectsFactoryHidlTest,
953 ::testing::ValuesIn(::android::hardware::getAllHalInstanceNames(
954 IEffectsFactory::descriptor)),
955 ::android::hardware::PrintInstanceNameToString);
Mikhail Naganov315ce412019-10-23 16:46:54 -0700956INSTANTIATE_TEST_SUITE_P(
Mikhail Naganov892d1472020-03-19 10:44:06 -0700957 Equalizer_IEffect, AudioEffectHidlTest,
958 ::testing::Combine(::testing::ValuesIn(::android::hardware::getAllHalInstanceNames(
959 IEffectsFactory::descriptor)),
960 ::testing::Values(EQUALIZER_EFFECT_TYPE)),
961 EffectParameterToString);
Mikhail Naganov315ce412019-10-23 16:46:54 -0700962INSTANTIATE_TEST_SUITE_P(
Mikhail Naganov892d1472020-03-19 10:44:06 -0700963 LoudnessEnhancer_IEffect, AudioEffectHidlTest,
964 ::testing::Combine(::testing::ValuesIn(::android::hardware::getAllHalInstanceNames(
965 IEffectsFactory::descriptor)),
966 ::testing::Values(LOUDNESS_ENHANCER_EFFECT_TYPE)),
967 EffectParameterToString);
nelsonli3c12e582019-12-12 13:53:49 +0800968INSTANTIATE_TEST_SUITE_P(
Mikhail Naganov315ce412019-10-23 16:46:54 -0700969 Equalizer, EqualizerAudioEffectHidlTest,
Mikhail Naganov892d1472020-03-19 10:44:06 -0700970 ::testing::Combine(::testing::ValuesIn(::android::hardware::getAllHalInstanceNames(
971 IEffectsFactory::descriptor)),
972 ::testing::Values(EQUALIZER_EFFECT_TYPE)),
973 EffectParameterToString);
Mikhail Naganov315ce412019-10-23 16:46:54 -0700974INSTANTIATE_TEST_SUITE_P(
975 LoudnessEnhancer, LoudnessEnhancerAudioEffectHidlTest,
Mikhail Naganov892d1472020-03-19 10:44:06 -0700976 ::testing::Combine(::testing::ValuesIn(::android::hardware::getAllHalInstanceNames(
977 IEffectsFactory::descriptor)),
978 ::testing::Values(LOUDNESS_ENHANCER_EFFECT_TYPE)),
979 EffectParameterToString);
Mikhail Naganovb9743d42020-07-21 10:57:03 -0700980// When the VTS test runs on a device lacking the corresponding HAL version the parameter
981// list is empty, this isn't a problem.
982GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(AudioEffectsFactoryHidlTest);
983GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(AudioEffectHidlTest);
984GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(EqualizerAudioEffectHidlTest);
985GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(LoudnessEnhancerAudioEffectHidlTest);