blob: ff84f9d5623c9f3c4c8005a22262e5f51dd1991f [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 Naganov0d920592023-08-25 11:10:37 -0700172enum { PARAM_FACTORY_NAME, PARAM_EFFECT_UUID, PARAM_USE_AFTER_CLOSE };
173using EffectParameter = std::tuple<std::string, Uuid, bool>;
Mikhail Naganov892d1472020-03-19 10:44:06 -0700174
175static inline std::string EffectParameterToString(
176 const ::testing::TestParamInfo<EffectParameter>& info) {
Mikhail Naganov0d920592023-08-25 11:10:37 -0700177 std::string prefix = std::get<PARAM_USE_AFTER_CLOSE>(info.param) ? "UseAfterClose_" : "";
178 return prefix.append(
179 ::android::hardware::PrintInstanceNameToString(::testing::TestParamInfo<std::string>{
180 std::get<PARAM_FACTORY_NAME>(info.param), info.index}));
Mikhail Naganov892d1472020-03-19 10:44:06 -0700181}
182
Mikhail Naganov9f289042017-02-23 08:39:36 -0800183// The main test class for Audio Effect HIDL HAL.
Mikhail Naganov892d1472020-03-19 10:44:06 -0700184class AudioEffectHidlTest : public ::testing::TestWithParam<EffectParameter> {
Mikhail Naganov315ce412019-10-23 16:46:54 -0700185 public:
186 void SetUp() override {
Mikhail Naganov892d1472020-03-19 10:44:06 -0700187 effectsFactory = IEffectsFactory::getService(std::get<PARAM_FACTORY_NAME>(GetParam()));
Kevin Rocard55b10612018-11-12 12:33:16 -0800188 ASSERT_NE(nullptr, effectsFactory.get());
Mikhail Naganov9f289042017-02-23 08:39:36 -0800189
Mikhail Naganovd72a7c22020-08-14 00:16:09 +0000190 ASSERT_NO_FATAL_FAILURE(findAndCreateEffect(getEffectType()));
Kevin Rocard55b10612018-11-12 12:33:16 -0800191 ASSERT_NE(nullptr, effect.get());
Mikhail Naganov9f289042017-02-23 08:39:36 -0800192
Kevin Rocard55b10612018-11-12 12:33:16 -0800193 Return<Result> ret = effect->init();
194 ASSERT_TRUE(ret.isOk());
195 ASSERT_EQ(Result::OK, ret);
Mikhail Naganov0d920592023-08-25 11:10:37 -0700196
197 useAfterClose = std::get<PARAM_USE_AFTER_CLOSE>(GetParam());
198 if (useAfterClose) {
199 Return<Result> ret = effect->close();
200 ASSERT_TRUE(ret.isOk());
201 ASSERT_EQ(Result::OK, ret);
202 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800203 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800204
Kevin Rocard55b10612018-11-12 12:33:16 -0800205 void TearDown() override {
206 effect.clear();
207 effectsFactory.clear();
208 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800209
Kevin Rocard55b10612018-11-12 12:33:16 -0800210 protected:
211 static void description(const std::string& description) {
212 RecordProperty("description", description);
213 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800214
Mikhail Naganov892d1472020-03-19 10:44:06 -0700215 Uuid getEffectType() const { return std::get<PARAM_EFFECT_UUID>(GetParam()); }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800216
Mikhail Naganov0d920592023-08-25 11:10:37 -0700217 void checkResult(const Result& result);
218 void checkResultForUseAfterClose(const Result& result);
Kevin Rocard55b10612018-11-12 12:33:16 -0800219 void findAndCreateEffect(const Uuid& type);
220 void findEffectInstance(const Uuid& type, Uuid* uuid);
221 void getChannelCount(uint32_t* channelCount);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800222
Kevin Rocard55b10612018-11-12 12:33:16 -0800223 sp<IEffectsFactory> effectsFactory;
224 sp<IEffect> effect;
Mikhail Naganov0d920592023-08-25 11:10:37 -0700225 bool useAfterClose;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800226};
227
Mikhail Naganov0d920592023-08-25 11:10:37 -0700228void AudioEffectHidlTest::checkResult(const Result& result) {
229 if (!useAfterClose) {
230 ASSERT_EQ(Result::OK, result);
231 } else {
232 ASSERT_NO_FATAL_FAILURE(checkResultForUseAfterClose(result));
233 }
234}
235
236void AudioEffectHidlTest::checkResultForUseAfterClose(const Result& result) {
237 if (useAfterClose) {
238 // The actual error does not matter. It's important that the effect did not crash
239 // while executing any command after a call to "close", and that the returned status
240 // is not OK.
241 ASSERT_NE(Result::OK, result);
242 }
243}
244
Mikhail Naganov9f289042017-02-23 08:39:36 -0800245void AudioEffectHidlTest::findAndCreateEffect(const Uuid& type) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800246 Uuid effectUuid;
Mikhail Naganovd72a7c22020-08-14 00:16:09 +0000247 ASSERT_NO_FATAL_FAILURE(findEffectInstance(type, &effectUuid));
Kevin Rocard55b10612018-11-12 12:33:16 -0800248 Return<void> ret = effectsFactory->createEffect(
Eric Laurentd33e6932019-11-13 13:47:50 -0800249 effectUuid, 1 /*session*/, 1 /*ioHandle*/,
250#if MAJOR_VERSION >= 6
251 0 /*device*/,
252#endif
253 [&](Result r, const sp<IEffect>& result, uint64_t /*effectId*/) {
254 if (r == Result::OK) {
255 effect = result;
256 }
257 });
Kevin Rocard55b10612018-11-12 12:33:16 -0800258 ASSERT_TRUE(ret.isOk());
Mikhail Naganov9f289042017-02-23 08:39:36 -0800259}
260
261void AudioEffectHidlTest::findEffectInstance(const Uuid& type, Uuid* uuid) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800262 bool effectFound = false;
263 Return<void> ret =
264 effectsFactory->getAllDescriptors([&](Result r, const hidl_vec<EffectDescriptor>& result) {
265 if (r == Result::OK) {
266 for (const auto& desc : result) {
267 if (desc.type == type) {
268 effectFound = true;
269 *uuid = desc.uuid;
270 break;
271 }
272 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800273 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800274 });
275 ASSERT_TRUE(ret.isOk());
276 ASSERT_TRUE(effectFound);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800277}
278
279void AudioEffectHidlTest::getChannelCount(uint32_t* channelCount) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800280 Result retval;
281 EffectConfig currentConfig;
282 Return<void> ret = effect->getConfig([&](Result r, const EffectConfig& conf) {
283 retval = r;
284 if (r == Result::OK) {
285 currentConfig = conf;
286 }
287 });
288 ASSERT_TRUE(ret.isOk());
Mikhail Naganov0d920592023-08-25 11:10:37 -0700289 ASSERT_NO_FATAL_FAILURE(checkResult(retval));
290 if (useAfterClose) {
291 *channelCount = 1;
292 return;
293 }
Mikhail Naganovd72a7c22020-08-14 00:16:09 +0000294#if MAJOR_VERSION <= 6
Kevin Rocard55b10612018-11-12 12:33:16 -0800295 ASSERT_TRUE(audio_channel_mask_is_valid(
296 static_cast<audio_channel_mask_t>(currentConfig.outputCfg.channels)));
297 *channelCount = audio_channel_count_from_out_mask(
298 static_cast<audio_channel_mask_t>(currentConfig.outputCfg.channels));
Mikhail Naganovd72a7c22020-08-14 00:16:09 +0000299#else
Mikhail Naganovff611982021-01-27 02:16:53 +0000300 ASSERT_EQ(AudioConfigBaseOptional::ChannelMask::hidl_discriminator::value,
301 currentConfig.outputCfg.base.channelMask.getDiscriminator());
Hayden Gomes4e7d69e2020-11-06 15:15:26 -0800302 *channelCount = android::audio::policy::configuration::V7_0::getChannelCount(
Mikhail Naganovff611982021-01-27 02:16:53 +0000303 currentConfig.outputCfg.base.channelMask.value());
Mikhail Naganovd72a7c22020-08-14 00:16:09 +0000304 ASSERT_NE(*channelCount, 0);
305#endif
Mikhail Naganov9f289042017-02-23 08:39:36 -0800306}
307
nelsonli3c12e582019-12-12 13:53:49 +0800308TEST_P(AudioEffectHidlTest, Close) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800309 description("Verify that an effect can be closed");
310 Return<Result> ret = effect->close();
311 EXPECT_TRUE(ret.isOk());
Mikhail Naganov0d920592023-08-25 11:10:37 -0700312 ASSERT_NO_FATAL_FAILURE(checkResult(ret));
Mikhail Naganov9f289042017-02-23 08:39:36 -0800313}
314
nelsonli3c12e582019-12-12 13:53:49 +0800315TEST_P(AudioEffectHidlTest, GetDescriptor) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800316 description("Verify that an effect can return its own descriptor via GetDescriptor");
317 Result retval = Result::NOT_INITIALIZED;
318 Uuid actualType;
319 Return<void> ret = effect->getDescriptor([&](Result r, const EffectDescriptor& desc) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800320 retval = r;
321 if (r == Result::OK) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800322 actualType = desc.type;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800323 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800324 });
325 EXPECT_TRUE(ret.isOk());
Mikhail Naganov0d920592023-08-25 11:10:37 -0700326 ASSERT_NO_FATAL_FAILURE(checkResult(retval));
327 if (useAfterClose) return;
Kevin Rocard55b10612018-11-12 12:33:16 -0800328 EXPECT_EQ(getEffectType(), actualType);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800329}
330
nelsonli3c12e582019-12-12 13:53:49 +0800331TEST_P(AudioEffectHidlTest, GetSetConfig) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800332 description(
333 "Verify that it is possible to manipulate effect config via Get / "
334 "SetConfig");
335 Result retval = Result::NOT_INITIALIZED;
336 EffectConfig currentConfig;
337 Return<void> ret = effect->getConfig([&](Result r, const EffectConfig& conf) {
338 retval = r;
339 if (r == Result::OK) {
340 currentConfig = conf;
341 }
342 });
343 EXPECT_TRUE(ret.isOk());
Mikhail Naganov0d920592023-08-25 11:10:37 -0700344 EXPECT_NO_FATAL_FAILURE(checkResult(retval));
345 if (useAfterClose) return;
Kevin Rocard55b10612018-11-12 12:33:16 -0800346 Return<Result> ret2 = effect->setConfig(currentConfig, nullptr, nullptr);
347 EXPECT_TRUE(ret2.isOk());
348 EXPECT_EQ(Result::OK, ret2);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800349}
350
Mikhail Naganov0dbf3982021-01-08 17:48:22 -0800351#if MAJOR_VERSION >= 7
352std::vector<EffectBufferConfig> generateInvalidConfigs(const EffectBufferConfig& src) {
353 std::vector<EffectBufferConfig> result;
354 EffectBufferConfig invalidFormat = src;
Mikhail Naganovff611982021-01-27 02:16:53 +0000355 invalidFormat.base.format.value("random_string");
Mikhail Naganov0dbf3982021-01-08 17:48:22 -0800356 result.push_back(std::move(invalidFormat));
357 EffectBufferConfig invalidChannelMask = src;
Mikhail Naganovff611982021-01-27 02:16:53 +0000358 invalidChannelMask.base.channelMask.value("random_string");
Mikhail Naganov0dbf3982021-01-08 17:48:22 -0800359 result.push_back(std::move(invalidChannelMask));
360 return result;
361}
362
363TEST_P(AudioEffectHidlTest, SetConfigInvalidArguments) {
364 description("Verify that invalid arguments are rejected by SetConfig");
365 Result retval = Result::NOT_INITIALIZED;
366 EffectConfig currentConfig;
367 Return<void> ret = effect->getConfig([&](Result r, const EffectConfig& conf) {
368 retval = r;
369 if (r == Result::OK) {
370 currentConfig = conf;
371 }
372 });
373 EXPECT_TRUE(ret.isOk());
Mikhail Naganov0d920592023-08-25 11:10:37 -0700374 EXPECT_NO_FATAL_FAILURE(checkResult(retval));
375 if (useAfterClose) return;
Mikhail Naganov0dbf3982021-01-08 17:48:22 -0800376 for (const auto& invalidInputCfg : generateInvalidConfigs(currentConfig.inputCfg)) {
377 EffectConfig invalidConfig = currentConfig;
378 invalidConfig.inputCfg = invalidInputCfg;
379 Return<Result> ret = effect->setConfig(invalidConfig, nullptr, nullptr);
380 EXPECT_TRUE(ret.isOk());
381 EXPECT_EQ(Result::INVALID_ARGUMENTS, ret);
382 }
383 for (const auto& invalidOutputCfg : generateInvalidConfigs(currentConfig.outputCfg)) {
384 EffectConfig invalidConfig = currentConfig;
385 invalidConfig.outputCfg = invalidOutputCfg;
386 Return<Result> ret = effect->setConfig(invalidConfig, nullptr, nullptr);
387 EXPECT_TRUE(ret.isOk());
388 EXPECT_EQ(Result::INVALID_ARGUMENTS, ret);
389 }
390}
391#endif
392
nelsonli3c12e582019-12-12 13:53:49 +0800393TEST_P(AudioEffectHidlTest, GetConfigReverse) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800394 description("Verify that GetConfigReverse does not crash");
Mikhail Naganov0d920592023-08-25 11:10:37 -0700395 Result retval = Result::OK;
396 Return<void> ret = effect->getConfigReverse([&](Result r, const EffectConfig&) { retval = r; });
Kevin Rocard55b10612018-11-12 12:33:16 -0800397 EXPECT_TRUE(ret.isOk());
Mikhail Naganov0d920592023-08-25 11:10:37 -0700398 EXPECT_NO_FATAL_FAILURE(checkResultForUseAfterClose(retval));
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700399}
400
nelsonli3c12e582019-12-12 13:53:49 +0800401TEST_P(AudioEffectHidlTest, GetSupportedAuxChannelsConfigs) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800402 description("Verify that GetSupportedAuxChannelsConfigs does not crash");
Mikhail Naganov0d920592023-08-25 11:10:37 -0700403 Result retval = Result::OK;
Kevin Rocard55b10612018-11-12 12:33:16 -0800404 Return<void> ret = effect->getSupportedAuxChannelsConfigs(
Mikhail Naganov0d920592023-08-25 11:10:37 -0700405 0, [&](Result r, const hidl_vec<EffectAuxChannelsConfig>&) { retval = r; });
Kevin Rocard55b10612018-11-12 12:33:16 -0800406 EXPECT_TRUE(ret.isOk());
Mikhail Naganov0d920592023-08-25 11:10:37 -0700407 EXPECT_NO_FATAL_FAILURE(checkResultForUseAfterClose(retval));
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700408}
409
nelsonli3c12e582019-12-12 13:53:49 +0800410TEST_P(AudioEffectHidlTest, GetAuxChannelsConfig) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800411 description("Verify that GetAuxChannelsConfig does not crash");
Mikhail Naganov0d920592023-08-25 11:10:37 -0700412 Result retval = Result::OK;
413 Return<void> ret = effect->getAuxChannelsConfig(
414 [&](Result r, const EffectAuxChannelsConfig&) { retval = r; });
Kevin Rocard55b10612018-11-12 12:33:16 -0800415 EXPECT_TRUE(ret.isOk());
Mikhail Naganov0d920592023-08-25 11:10:37 -0700416 EXPECT_NO_FATAL_FAILURE(checkResultForUseAfterClose(retval));
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700417}
418
nelsonli3c12e582019-12-12 13:53:49 +0800419TEST_P(AudioEffectHidlTest, SetAuxChannelsConfig) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800420 description("Verify that SetAuxChannelsConfig does not crash");
421 Return<Result> ret = effect->setAuxChannelsConfig(EffectAuxChannelsConfig());
422 EXPECT_TRUE(ret.isOk());
Mikhail Naganov0d920592023-08-25 11:10:37 -0700423 EXPECT_NO_FATAL_FAILURE(checkResultForUseAfterClose(ret));
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700424}
425
Mikhail Naganov9f289042017-02-23 08:39:36 -0800426// Not generated automatically because AudioBuffer contains
427// instances of hidl_memory which can't be compared properly
428// in general case due to presence of handles.
429//
430// However, in this particular case, handles must not present
431// thus comparison is possible.
432//
433// operator== must be defined in the same namespace as the structures.
434namespace android {
435namespace hardware {
436namespace audio {
437namespace effect {
Kevin Rocard96d2cd92018-11-14 16:22:07 -0800438namespace CPP_VERSION {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800439inline bool operator==(const AudioBuffer& lhs, const AudioBuffer& rhs) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800440 return lhs.id == rhs.id && lhs.frameCount == rhs.frameCount && lhs.data.handle() == nullptr &&
441 rhs.data.handle() == nullptr;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800442}
443
Mikhail Naganovff611982021-01-27 02:16:53 +0000444#if MAJOR_VERSION <= 6
Kevin Rocard55b10612018-11-12 12:33:16 -0800445inline bool operator==(const EffectBufferConfig& lhs, const EffectBufferConfig& rhs) {
Mikhail Naganovf363ed42020-12-10 18:47:51 -0800446 return lhs.buffer == rhs.buffer &&
Mikhail Naganovf363ed42020-12-10 18:47:51 -0800447 lhs.samplingRateHz == rhs.samplingRateHz && lhs.channels == rhs.channels &&
448 lhs.format == rhs.format &&
Kevin Rocard55b10612018-11-12 12:33:16 -0800449 lhs.accessMode == rhs.accessMode && lhs.mask == rhs.mask;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800450}
Mikhail Naganovff611982021-01-27 02:16:53 +0000451#else
452inline bool operator==(const EffectBufferConfig& lhs, const EffectBufferConfig& rhs) {
453 return lhs.buffer.getDiscriminator() == rhs.buffer.getDiscriminator() &&
454 (lhs.buffer.getDiscriminator() ==
455 EffectBufferConfig::OptionalBuffer::hidl_discriminator::unspecified ||
456 lhs.buffer.buf() == rhs.buffer.buf()) &&
457 lhs.base == rhs.base && lhs.accessMode == rhs.accessMode;
458}
459#endif // MAJOR_VERSION <= 6
Mikhail Naganov9f289042017-02-23 08:39:36 -0800460
461inline bool operator==(const EffectConfig& lhs, const EffectConfig& rhs) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800462 return lhs.inputCfg == rhs.inputCfg && lhs.outputCfg == rhs.outputCfg;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800463}
Kevin Rocard96d2cd92018-11-14 16:22:07 -0800464} // namespace CPP_VERSION
Mikhail Naganov9f289042017-02-23 08:39:36 -0800465} // namespace effect
466} // namespace audio
467} // namespace hardware
468} // namespace android
469
nelsonli3c12e582019-12-12 13:53:49 +0800470TEST_P(AudioEffectHidlTest, Reset) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800471 description("Verify that Reset preserves effect configuration");
472 Result retval = Result::NOT_INITIALIZED;
473 EffectConfig originalConfig;
Mikhail Naganov0d920592023-08-25 11:10:37 -0700474 if (!useAfterClose) {
475 Return<void> ret = effect->getConfig([&](Result r, const EffectConfig& conf) {
476 retval = r;
477 if (r == Result::OK) {
478 originalConfig = conf;
479 }
480 });
481 ASSERT_TRUE(ret.isOk());
482 ASSERT_EQ(Result::OK, retval);
483 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800484 Return<Result> ret2 = effect->reset();
485 EXPECT_TRUE(ret2.isOk());
Mikhail Naganov0d920592023-08-25 11:10:37 -0700486 EXPECT_NO_FATAL_FAILURE(checkResult(ret2));
487 if (!useAfterClose) {
488 EffectConfig configAfterReset;
489 Return<void> ret = effect->getConfig([&](Result r, const EffectConfig& conf) {
490 retval = r;
491 if (r == Result::OK) {
492 configAfterReset = conf;
493 }
494 });
495 EXPECT_EQ(originalConfig, configAfterReset);
496 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800497}
498
nelsonli3c12e582019-12-12 13:53:49 +0800499TEST_P(AudioEffectHidlTest, DisableEnableDisable) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800500 description("Verify Disable -> Enable -> Disable sequence for an effect");
501 Return<Result> ret = effect->disable();
502 EXPECT_TRUE(ret.isOk());
Mikhail Naganov0d920592023-08-25 11:10:37 -0700503 if (!useAfterClose) {
504 // Note: some legacy effects may return -EINVAL (INVALID_ARGUMENTS),
505 // more canonical is to return -ENOSYS (NOT_SUPPORTED)
506 EXPECT_TRUE(ret == Result::NOT_SUPPORTED || ret == Result::INVALID_ARGUMENTS);
507 } else {
508 EXPECT_NO_FATAL_FAILURE(checkResultForUseAfterClose(ret));
509 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800510 ret = effect->enable();
511 EXPECT_TRUE(ret.isOk());
Mikhail Naganov0d920592023-08-25 11:10:37 -0700512 EXPECT_NO_FATAL_FAILURE(checkResult(ret));
Kevin Rocard55b10612018-11-12 12:33:16 -0800513 ret = effect->disable();
514 EXPECT_TRUE(ret.isOk());
Mikhail Naganov0d920592023-08-25 11:10:37 -0700515 EXPECT_NO_FATAL_FAILURE(checkResult(ret));
Mikhail Naganov9f289042017-02-23 08:39:36 -0800516}
517
Mikhail Naganov0dbf3982021-01-08 17:48:22 -0800518#if MAJOR_VERSION >= 7
519TEST_P(AudioEffectHidlTest, SetDeviceInvalidDeviceAddress) {
520 description("Verify that invalid device address is rejected by SetDevice");
Mikhail Naganov0d920592023-08-25 11:10:37 -0700521 if (useAfterClose) {
522 GTEST_SKIP() << "Does not make sense for the useAfterClose case";
523 }
Mikhail Naganov0dbf3982021-01-08 17:48:22 -0800524 DeviceAddress device{.deviceType = "random_string"};
525 Return<Result> ret = effect->setDevice(device);
526 EXPECT_TRUE(ret.isOk());
527 EXPECT_EQ(Result::INVALID_ARGUMENTS, ret);
528}
529#endif
530
nelsonli3c12e582019-12-12 13:53:49 +0800531TEST_P(AudioEffectHidlTest, SetDevice) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800532 description("Verify that SetDevice works for an output chain effect");
Mikhail Naganovd72a7c22020-08-14 00:16:09 +0000533#if MAJOR_VERSION <= 6
Kevin Rocardf5305b32018-11-13 10:41:53 -0800534 Return<Result> ret = effect->setDevice(mkEnumBitfield(AudioDevice::OUT_SPEAKER));
Mikhail Naganovd72a7c22020-08-14 00:16:09 +0000535#else
536 DeviceAddress device{.deviceType = toString(xsd::AudioDevice::AUDIO_DEVICE_OUT_SPEAKER)};
537 Return<Result> ret = effect->setDevice(device);
538#endif
Kevin Rocard55b10612018-11-12 12:33:16 -0800539 EXPECT_TRUE(ret.isOk());
Mikhail Naganov0d920592023-08-25 11:10:37 -0700540 EXPECT_NO_FATAL_FAILURE(checkResult(ret));
Mikhail Naganov9f289042017-02-23 08:39:36 -0800541}
542
nelsonli3c12e582019-12-12 13:53:49 +0800543TEST_P(AudioEffectHidlTest, SetAndGetVolume) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800544 description("Verify that SetAndGetVolume method works for an effect");
545 uint32_t channelCount;
Mikhail Naganov0d920592023-08-25 11:10:37 -0700546 ASSERT_NO_FATAL_FAILURE(getChannelCount(&channelCount));
Kevin Rocard55b10612018-11-12 12:33:16 -0800547 hidl_vec<uint32_t> volumes;
548 volumes.resize(channelCount);
549 for (uint32_t i = 0; i < channelCount; ++i) {
550 volumes[i] = 0;
551 }
552 Result retval = Result::NOT_INITIALIZED;
553 Return<void> ret =
554 effect->setAndGetVolume(volumes, [&](Result r, const hidl_vec<uint32_t>&) { retval = r; });
555 EXPECT_TRUE(ret.isOk());
Mikhail Naganov0d920592023-08-25 11:10:37 -0700556 EXPECT_NO_FATAL_FAILURE(checkResult(retval));
Mikhail Naganov9f289042017-02-23 08:39:36 -0800557}
558
nelsonli3c12e582019-12-12 13:53:49 +0800559TEST_P(AudioEffectHidlTest, VolumeChangeNotification) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800560 description("Verify that effect accepts VolumeChangeNotification");
561 uint32_t channelCount;
Mikhail Naganov0d920592023-08-25 11:10:37 -0700562 ASSERT_NO_FATAL_FAILURE(getChannelCount(&channelCount));
Kevin Rocard55b10612018-11-12 12:33:16 -0800563 hidl_vec<uint32_t> volumes;
564 volumes.resize(channelCount);
565 for (uint32_t i = 0; i < channelCount; ++i) {
566 volumes[i] = 0;
567 }
568 Return<Result> ret = effect->volumeChangeNotification(volumes);
569 EXPECT_TRUE(ret.isOk());
Mikhail Naganov0d920592023-08-25 11:10:37 -0700570 EXPECT_NO_FATAL_FAILURE(checkResult(ret));
Mikhail Naganov9f289042017-02-23 08:39:36 -0800571}
572
nelsonli3c12e582019-12-12 13:53:49 +0800573TEST_P(AudioEffectHidlTest, SetAudioMode) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800574 description("Verify that SetAudioMode works for an effect");
575 Return<Result> ret = effect->setAudioMode(AudioMode::NORMAL);
576 EXPECT_TRUE(ret.isOk());
Mikhail Naganov0d920592023-08-25 11:10:37 -0700577 EXPECT_NO_FATAL_FAILURE(checkResult(ret));
Mikhail Naganov9f289042017-02-23 08:39:36 -0800578}
579
nelsonli3c12e582019-12-12 13:53:49 +0800580TEST_P(AudioEffectHidlTest, SetConfigReverse) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800581 description("Verify that SetConfigReverse does not crash");
582 Return<Result> ret = effect->setConfigReverse(EffectConfig(), nullptr, nullptr);
583 EXPECT_TRUE(ret.isOk());
Mikhail Naganov0d920592023-08-25 11:10:37 -0700584 EXPECT_NO_FATAL_FAILURE(checkResultForUseAfterClose(ret));
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700585}
586
Mikhail Naganov0dbf3982021-01-08 17:48:22 -0800587#if MAJOR_VERSION >= 7
588TEST_P(AudioEffectHidlTest, SetInputDeviceInvalidDeviceAddress) {
589 description("Verify that invalid device address is rejected by SetInputDevice");
Mikhail Naganov0d920592023-08-25 11:10:37 -0700590 if (useAfterClose) {
591 GTEST_SKIP() << "Does not make sense for the useAfterClose case";
592 }
Mikhail Naganov0dbf3982021-01-08 17:48:22 -0800593 DeviceAddress device{.deviceType = "random_string"};
594 Return<Result> ret = effect->setInputDevice(device);
595 EXPECT_TRUE(ret.isOk());
596 EXPECT_TRUE(ret == Result::INVALID_ARGUMENTS || ret == Result::NOT_SUPPORTED)
597 << ::testing::PrintToString(ret);
598}
599#endif
600
nelsonli3c12e582019-12-12 13:53:49 +0800601TEST_P(AudioEffectHidlTest, SetInputDevice) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800602 description("Verify that SetInputDevice does not crash");
Mikhail Naganovd72a7c22020-08-14 00:16:09 +0000603#if MAJOR_VERSION <= 6
Kevin Rocardf5305b32018-11-13 10:41:53 -0800604 Return<Result> ret = effect->setInputDevice(mkEnumBitfield(AudioDevice::IN_BUILTIN_MIC));
Mikhail Naganovd72a7c22020-08-14 00:16:09 +0000605#else
606 DeviceAddress device{.deviceType = toString(xsd::AudioDevice::AUDIO_DEVICE_IN_BUILTIN_MIC)};
607 Return<Result> ret = effect->setInputDevice(device);
608#endif
Kevin Rocard55b10612018-11-12 12:33:16 -0800609 EXPECT_TRUE(ret.isOk());
Mikhail Naganov0d920592023-08-25 11:10:37 -0700610 EXPECT_NO_FATAL_FAILURE(checkResultForUseAfterClose(ret));
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700611}
612
Mikhail Naganov0dbf3982021-01-08 17:48:22 -0800613#if MAJOR_VERSION >= 7
614TEST_P(AudioEffectHidlTest, SetInvalidAudioSource) {
615 description("Verify that an invalid audio source is rejected by SetAudioSource");
Mikhail Naganov0d920592023-08-25 11:10:37 -0700616 if (useAfterClose) {
617 GTEST_SKIP() << "Does not make sense for the useAfterClose case";
618 }
Mikhail Naganov0dbf3982021-01-08 17:48:22 -0800619 Return<Result> ret = effect->setAudioSource("random_string");
620 ASSERT_TRUE(ret.isOk());
621 EXPECT_TRUE(ret == Result::INVALID_ARGUMENTS || ret == Result::NOT_SUPPORTED)
622 << ::testing::PrintToString(ret);
623}
624#endif
625
nelsonli3c12e582019-12-12 13:53:49 +0800626TEST_P(AudioEffectHidlTest, SetAudioSource) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800627 description("Verify that SetAudioSource does not crash");
Mikhail Naganovd72a7c22020-08-14 00:16:09 +0000628#if MAJOR_VERSION <= 6
Kevin Rocard55b10612018-11-12 12:33:16 -0800629 Return<Result> ret = effect->setAudioSource(AudioSource::MIC);
Mikhail Naganovd72a7c22020-08-14 00:16:09 +0000630#else
631 Return<Result> ret = effect->setAudioSource(toString(xsd::AudioSource::AUDIO_SOURCE_MIC));
632#endif
Kevin Rocard55b10612018-11-12 12:33:16 -0800633 EXPECT_TRUE(ret.isOk());
Mikhail Naganov0d920592023-08-25 11:10:37 -0700634 EXPECT_NO_FATAL_FAILURE(checkResultForUseAfterClose(ret));
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700635}
636
nelsonli3c12e582019-12-12 13:53:49 +0800637TEST_P(AudioEffectHidlTest, Offload) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800638 description("Verify that calling Offload method does not crash");
Mikhail Naganovd72a7c22020-08-14 00:16:09 +0000639 Return<Result> ret = effect->offload(EffectOffloadParameter{});
Kevin Rocard55b10612018-11-12 12:33:16 -0800640 EXPECT_TRUE(ret.isOk());
Mikhail Naganov0d920592023-08-25 11:10:37 -0700641 EXPECT_NO_FATAL_FAILURE(checkResultForUseAfterClose(ret));
Mikhail Naganov9f289042017-02-23 08:39:36 -0800642}
643
nelsonli3c12e582019-12-12 13:53:49 +0800644TEST_P(AudioEffectHidlTest, PrepareForProcessing) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800645 description("Verify that PrepareForProcessing method works for an effect");
646 Result retval = Result::NOT_INITIALIZED;
647 Return<void> ret = effect->prepareForProcessing(
648 [&](Result r, const MQDescriptorSync<Result>&) { retval = r; });
649 EXPECT_TRUE(ret.isOk());
Mikhail Naganov0d920592023-08-25 11:10:37 -0700650 EXPECT_NO_FATAL_FAILURE(checkResult(retval));
Mikhail Naganov9f289042017-02-23 08:39:36 -0800651}
652
nelsonli3c12e582019-12-12 13:53:49 +0800653TEST_P(AudioEffectHidlTest, SetProcessBuffers) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800654 description("Verify that SetProcessBuffers works for an effect");
655 sp<IAllocator> ashmem = IAllocator::getService("ashmem");
656 ASSERT_NE(nullptr, ashmem.get());
657 bool success = false;
658 AudioBuffer buffer;
659 Return<void> ret = ashmem->allocate(1024, [&](bool s, const hidl_memory& memory) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800660 success = s;
661 if (s) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800662 buffer.data = memory;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800663 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800664 });
665 ASSERT_TRUE(ret.isOk());
666 ASSERT_TRUE(success);
667 Return<Result> ret2 = effect->setProcessBuffers(buffer, buffer);
668 EXPECT_TRUE(ret2.isOk());
Mikhail Naganov0d920592023-08-25 11:10:37 -0700669 EXPECT_NO_FATAL_FAILURE(checkResult(ret2));
Mikhail Naganov9f289042017-02-23 08:39:36 -0800670}
671
nelsonli3c12e582019-12-12 13:53:49 +0800672TEST_P(AudioEffectHidlTest, Command) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800673 description("Verify that Command does not crash");
674 Return<void> ret =
675 effect->command(0, hidl_vec<uint8_t>(), 0, [&](int32_t, const hidl_vec<uint8_t>&) {});
676 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700677}
Mikhail Naganov9f289042017-02-23 08:39:36 -0800678
nelsonli3c12e582019-12-12 13:53:49 +0800679TEST_P(AudioEffectHidlTest, SetParameter) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800680 description("Verify that SetParameter does not crash");
681 Return<Result> ret = effect->setParameter(hidl_vec<uint8_t>(), hidl_vec<uint8_t>());
682 EXPECT_TRUE(ret.isOk());
Mikhail Naganov0d920592023-08-25 11:10:37 -0700683 EXPECT_NO_FATAL_FAILURE(checkResultForUseAfterClose(ret));
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700684}
685
nelsonli3c12e582019-12-12 13:53:49 +0800686TEST_P(AudioEffectHidlTest, GetParameter) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800687 description("Verify that GetParameter does not crash");
688 Return<void> ret =
689 effect->getParameter(hidl_vec<uint8_t>(), 0, [&](Result, const hidl_vec<uint8_t>&) {});
690 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700691}
692
Mikhail Naganov4f110342022-07-07 20:37:42 +0000693TEST_P(AudioEffectHidlTest, GetParameterInvalidMaxReplySize) {
694 description("Verify that GetParameter caps the maximum reply size");
Mikhail Naganov978a0f92022-08-05 00:24:27 +0000695 const bool isNewDeviceLaunchingOnTPlus = property_get_int32("ro.vendor.api_level", 0) >= 33;
696 if (!isNewDeviceLaunchingOnTPlus) {
697 GTEST_SKIP() << "The test only applies to devices launching on T or later";
698 }
Mikhail Naganov0d920592023-08-25 11:10:37 -0700699 if (useAfterClose) {
700 GTEST_SKIP() << "Does not make sense for the useAfterClose case";
701 }
Mikhail Naganov4f110342022-07-07 20:37:42 +0000702 // Use a non-empty parameter to avoid being rejected by any earlier checks.
703 hidl_vec<uint8_t> parameter;
704 parameter.resize(16);
705 // Use very large size to ensure that the service does not crash. Since parameters
706 // are specific to each effect, and some effects may not have parameters at all,
707 // simply checking the return value would not reveal an issue of using an uncapped value.
708 const uint32_t veryLargeReplySize = std::numeric_limits<uint32_t>::max() - 100;
709 Result retval = Result::OK;
710 Return<void> ret =
711 effect->getParameter(parameter, veryLargeReplySize,
712 [&](Result r, const hidl_vec<uint8_t>&) { retval = r; });
713 EXPECT_TRUE(ret.isOk());
714 EXPECT_EQ(Result::INVALID_ARGUMENTS, retval);
715}
716
nelsonli3c12e582019-12-12 13:53:49 +0800717TEST_P(AudioEffectHidlTest, GetSupportedConfigsForFeature) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800718 description("Verify that GetSupportedConfigsForFeature does not crash");
Mikhail Naganov0d920592023-08-25 11:10:37 -0700719 Result retval = Result::OK;
Kevin Rocard55b10612018-11-12 12:33:16 -0800720 Return<void> ret = effect->getSupportedConfigsForFeature(
Mikhail Naganov0d920592023-08-25 11:10:37 -0700721 0, 0, 0, [&](Result r, uint32_t, const hidl_vec<uint8_t>&) { retval = r; });
Kevin Rocard55b10612018-11-12 12:33:16 -0800722 EXPECT_TRUE(ret.isOk());
Mikhail Naganov0d920592023-08-25 11:10:37 -0700723 EXPECT_NO_FATAL_FAILURE(checkResultForUseAfterClose(retval));
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700724}
725
nelsonli3c12e582019-12-12 13:53:49 +0800726TEST_P(AudioEffectHidlTest, GetCurrentConfigForFeature) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800727 description("Verify that GetCurrentConfigForFeature does not crash");
Mikhail Naganov0d920592023-08-25 11:10:37 -0700728 Result retval = Result::OK;
729 Return<void> ret = effect->getCurrentConfigForFeature(
730 0, 0, [&](Result r, const hidl_vec<uint8_t>&) { retval = r; });
Kevin Rocard55b10612018-11-12 12:33:16 -0800731 EXPECT_TRUE(ret.isOk());
Mikhail Naganov0d920592023-08-25 11:10:37 -0700732 EXPECT_NO_FATAL_FAILURE(checkResultForUseAfterClose(retval));
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700733}
734
nelsonli3c12e582019-12-12 13:53:49 +0800735TEST_P(AudioEffectHidlTest, SetCurrentConfigForFeature) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800736 description("Verify that SetCurrentConfigForFeature does not crash");
737 Return<Result> ret = effect->setCurrentConfigForFeature(0, hidl_vec<uint8_t>());
738 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700739}
740
Mikhail Naganov8e3480e2022-09-01 00:31:43 +0000741TEST_P(AudioEffectHidlTest, GetSupportedConfigsForFeatureInvalidConfigSize) {
742 description("Verify that GetSupportedConfigsForFeature caps the maximum config size");
743 const bool isNewDeviceLaunchingOnTPlus = property_get_int32("ro.vendor.api_level", 0) >= 33;
744 if (!isNewDeviceLaunchingOnTPlus) {
745 GTEST_SKIP() << "The test only applies to devices launching on T or later";
746 }
Mikhail Naganov0d920592023-08-25 11:10:37 -0700747 if (useAfterClose) {
748 GTEST_SKIP() << "Does not make sense for the useAfterClose case";
749 }
Mikhail Naganov8e3480e2022-09-01 00:31:43 +0000750 // Use very large size to ensure that the service does not crash.
751 const uint32_t veryLargeConfigSize = std::numeric_limits<uint32_t>::max() - 100;
752 Result retval = Result::OK;
753 Return<void> ret = effect->getSupportedConfigsForFeature(
754 0, 1, veryLargeConfigSize,
755 [&](Result r, uint32_t, const hidl_vec<uint8_t>&) { retval = r; });
756 EXPECT_TRUE(ret.isOk());
757 EXPECT_EQ(Result::INVALID_ARGUMENTS, retval);
758}
759
760TEST_P(AudioEffectHidlTest, GetCurrentConfigForFeatureInvalidConfigSize) {
761 description("Verify that GetCurrentConfigForFeature caps the maximum config size");
762 const bool isNewDeviceLaunchingOnTPlus = property_get_int32("ro.vendor.api_level", 0) >= 33;
763 if (!isNewDeviceLaunchingOnTPlus) {
764 GTEST_SKIP() << "The test only applies to devices launching on T or later";
765 }
Mikhail Naganov0d920592023-08-25 11:10:37 -0700766 if (useAfterClose) {
767 GTEST_SKIP() << "Does not make sense for the useAfterClose case";
768 }
Mikhail Naganov8e3480e2022-09-01 00:31:43 +0000769 // Use very large size to ensure that the service does not crash.
770 const uint32_t veryLargeConfigSize = std::numeric_limits<uint32_t>::max() - 100;
771 Result retval = Result::OK;
772 Return<void> ret = effect->getCurrentConfigForFeature(
773 0, veryLargeConfigSize, [&](Result r, const hidl_vec<uint8_t>&) { retval = r; });
774 EXPECT_TRUE(ret.isOk());
775 EXPECT_EQ(Result::INVALID_ARGUMENTS, retval);
776}
777
Mikhail Naganov9f289042017-02-23 08:39:36 -0800778// The main test class for Equalizer Audio Effect HIDL HAL.
779class EqualizerAudioEffectHidlTest : public AudioEffectHidlTest {
Mikhail Naganov892d1472020-03-19 10:44:06 -0700780 public:
Kevin Rocard55b10612018-11-12 12:33:16 -0800781 void SetUp() override {
782 AudioEffectHidlTest::SetUp();
783 equalizer = IEqualizerEffect::castFrom(effect);
784 ASSERT_NE(nullptr, equalizer.get());
785 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800786
Mikhail Naganov892d1472020-03-19 10:44:06 -0700787 void TearDown() override {
788 equalizer.clear();
789 AudioEffectHidlTest::TearDown();
790 }
791
792 protected:
Kevin Rocard55b10612018-11-12 12:33:16 -0800793 void getNumBands(uint16_t* numBands);
794 void getLevelRange(int16_t* minLevel, int16_t* maxLevel);
795 void getBandFrequencyRange(uint16_t band, uint32_t* minFreq, uint32_t* centerFreq,
796 uint32_t* maxFreq);
797 void getPresetCount(size_t* count);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800798
Kevin Rocard55b10612018-11-12 12:33:16 -0800799 sp<IEqualizerEffect> equalizer;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800800};
801
802void EqualizerAudioEffectHidlTest::getNumBands(uint16_t* numBands) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800803 Result retval = Result::NOT_INITIALIZED;
804 Return<void> ret = equalizer->getNumBands([&](Result r, uint16_t b) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800805 retval = r;
806 if (retval == Result::OK) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800807 *numBands = b;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800808 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800809 });
810 ASSERT_TRUE(ret.isOk());
Mikhail Naganov0d920592023-08-25 11:10:37 -0700811 ASSERT_NO_FATAL_FAILURE(checkResult(retval));
812 if (useAfterClose) *numBands = 1;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800813}
814
Kevin Rocard55b10612018-11-12 12:33:16 -0800815void EqualizerAudioEffectHidlTest::getLevelRange(int16_t* minLevel, int16_t* maxLevel) {
816 Result retval = Result::NOT_INITIALIZED;
817 Return<void> ret = equalizer->getLevelRange([&](Result r, int16_t min, int16_t max) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800818 retval = r;
819 if (retval == Result::OK) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800820 *minLevel = min;
821 *maxLevel = max;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800822 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800823 });
824 ASSERT_TRUE(ret.isOk());
Mikhail Naganov0d920592023-08-25 11:10:37 -0700825 ASSERT_NO_FATAL_FAILURE(checkResult(retval));
826 if (useAfterClose) {
827 *minLevel = 0;
828 *maxLevel = 255;
829 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800830}
831
832void EqualizerAudioEffectHidlTest::getBandFrequencyRange(uint16_t band, uint32_t* minFreq,
833 uint32_t* centerFreq, uint32_t* maxFreq) {
834 Result retval = Result::NOT_INITIALIZED;
835 Return<void> ret =
836 equalizer->getBandFrequencyRange(band, [&](Result r, uint32_t min, uint32_t max) {
837 retval = r;
838 if (retval == Result::OK) {
839 *minFreq = min;
840 *maxFreq = max;
841 }
842 });
843 ASSERT_TRUE(ret.isOk());
Mikhail Naganov0d920592023-08-25 11:10:37 -0700844 ASSERT_NO_FATAL_FAILURE(checkResult(retval));
Kevin Rocard55b10612018-11-12 12:33:16 -0800845 ret = equalizer->getBandCenterFrequency(band, [&](Result r, uint32_t center) {
846 retval = r;
847 if (retval == Result::OK) {
848 *centerFreq = center;
849 }
850 });
851 ASSERT_TRUE(ret.isOk());
Mikhail Naganov0d920592023-08-25 11:10:37 -0700852 ASSERT_NO_FATAL_FAILURE(checkResult(retval));
853 if (useAfterClose) {
854 *minFreq = 20;
855 *centerFreq = 10000;
856 *maxFreq = 20000;
857 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800858}
859
860void EqualizerAudioEffectHidlTest::getPresetCount(size_t* count) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800861 Result retval = Result::NOT_INITIALIZED;
862 Return<void> ret = equalizer->getPresetNames([&](Result r, const hidl_vec<hidl_string>& names) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800863 retval = r;
864 if (retval == Result::OK) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800865 *count = names.size();
Mikhail Naganov9f289042017-02-23 08:39:36 -0800866 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800867 });
868 ASSERT_TRUE(ret.isOk());
Mikhail Naganov0d920592023-08-25 11:10:37 -0700869 ASSERT_NO_FATAL_FAILURE(checkResult(retval));
870 if (useAfterClose) *count = 1;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800871}
872
nelsonli3c12e582019-12-12 13:53:49 +0800873TEST_P(EqualizerAudioEffectHidlTest, GetNumBands) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800874 description("Verify that Equalizer effect reports at least one band");
875 uint16_t numBands = 0;
Mikhail Naganov0d920592023-08-25 11:10:37 -0700876 ASSERT_NO_FATAL_FAILURE(getNumBands(&numBands));
Kevin Rocard55b10612018-11-12 12:33:16 -0800877 EXPECT_GT(numBands, 0);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800878}
879
nelsonli3c12e582019-12-12 13:53:49 +0800880TEST_P(EqualizerAudioEffectHidlTest, GetLevelRange) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800881 description("Verify that Equalizer effect reports adequate band level range");
882 int16_t minLevel = 0x7fff, maxLevel = 0;
Mikhail Naganov0d920592023-08-25 11:10:37 -0700883 ASSERT_NO_FATAL_FAILURE(getLevelRange(&minLevel, &maxLevel));
Kevin Rocard55b10612018-11-12 12:33:16 -0800884 EXPECT_GT(maxLevel, minLevel);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800885}
886
nelsonli3c12e582019-12-12 13:53:49 +0800887TEST_P(EqualizerAudioEffectHidlTest, GetSetBandLevel) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800888 description("Verify that manipulating band levels works for Equalizer effect");
889 uint16_t numBands = 0;
Mikhail Naganov0d920592023-08-25 11:10:37 -0700890 ASSERT_NO_FATAL_FAILURE(getNumBands(&numBands));
Kevin Rocard55b10612018-11-12 12:33:16 -0800891 ASSERT_GT(numBands, 0);
892 int16_t levels[3]{0x7fff, 0, 0};
Mikhail Naganov0d920592023-08-25 11:10:37 -0700893 ASSERT_NO_FATAL_FAILURE(getLevelRange(&levels[0], &levels[2]));
Kevin Rocard55b10612018-11-12 12:33:16 -0800894 ASSERT_GT(levels[2], levels[0]);
895 levels[1] = (levels[2] + levels[0]) / 2;
896 for (uint16_t i = 0; i < numBands; ++i) {
897 for (size_t j = 0; j < ARRAY_SIZE(levels); ++j) {
898 Return<Result> ret = equalizer->setBandLevel(i, levels[j]);
899 EXPECT_TRUE(ret.isOk());
Mikhail Naganov0d920592023-08-25 11:10:37 -0700900 EXPECT_NO_FATAL_FAILURE(checkResult(ret));
Kevin Rocard55b10612018-11-12 12:33:16 -0800901 Result retval = Result::NOT_INITIALIZED;
902 int16_t actualLevel;
903 Return<void> ret2 = equalizer->getBandLevel(i, [&](Result r, int16_t l) {
904 retval = r;
905 if (retval == Result::OK) {
906 actualLevel = l;
907 }
908 });
909 EXPECT_TRUE(ret2.isOk());
Mikhail Naganov0d920592023-08-25 11:10:37 -0700910 EXPECT_NO_FATAL_FAILURE(checkResult(retval));
911 if (!useAfterClose) {
912 EXPECT_EQ(levels[j], actualLevel);
913 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800914 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800915 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800916}
917
nelsonli3c12e582019-12-12 13:53:49 +0800918TEST_P(EqualizerAudioEffectHidlTest, GetBandCenterFrequencyAndRange) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800919 description("Verify that Equalizer effect reports adequate band frequency range");
920 uint16_t numBands = 0;
Mikhail Naganov0d920592023-08-25 11:10:37 -0700921 ASSERT_NO_FATAL_FAILURE(getNumBands(&numBands));
Kevin Rocard55b10612018-11-12 12:33:16 -0800922 ASSERT_GT(numBands, 0);
923 for (uint16_t i = 0; i < numBands; ++i) {
924 uint32_t minFreq = 0xffffffff, centerFreq = 0xffffffff, maxFreq = 0xffffffff;
Mikhail Naganov0d920592023-08-25 11:10:37 -0700925 ASSERT_NO_FATAL_FAILURE(getBandFrequencyRange(i, &minFreq, &centerFreq, &maxFreq));
Kevin Rocard55b10612018-11-12 12:33:16 -0800926 // Note: NXP legacy implementation reports "1" as upper bound for last band,
927 // so this check fails.
928 EXPECT_GE(maxFreq, centerFreq);
929 EXPECT_GE(centerFreq, minFreq);
930 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800931}
932
nelsonli3c12e582019-12-12 13:53:49 +0800933TEST_P(EqualizerAudioEffectHidlTest, GetBandForFrequency) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800934 description("Verify that Equalizer effect supports GetBandForFrequency correctly");
935 uint16_t numBands = 0;
Mikhail Naganov0d920592023-08-25 11:10:37 -0700936 ASSERT_NO_FATAL_FAILURE(getNumBands(&numBands));
Kevin Rocard55b10612018-11-12 12:33:16 -0800937 ASSERT_GT(numBands, 0);
938 for (uint16_t i = 0; i < numBands; ++i) {
939 uint32_t freqs[3]{0, 0, 0};
940 getBandFrequencyRange(i, &freqs[0], &freqs[1], &freqs[2]);
941 // NXP legacy implementation reports "1" as upper bound for last band, some
942 // of the checks fail.
943 for (size_t j = 0; j < ARRAY_SIZE(freqs); ++j) {
944 if (j == 0) {
945 freqs[j]++;
946 } // Min frequency is an open interval.
947 Result retval = Result::NOT_INITIALIZED;
948 uint16_t actualBand = numBands + 1;
949 Return<void> ret = equalizer->getBandForFrequency(freqs[j], [&](Result r, uint16_t b) {
950 retval = r;
951 if (retval == Result::OK) {
952 actualBand = b;
953 }
954 });
955 EXPECT_TRUE(ret.isOk());
Mikhail Naganov0d920592023-08-25 11:10:37 -0700956 EXPECT_NO_FATAL_FAILURE(checkResult(retval));
957 if (!useAfterClose) {
958 EXPECT_EQ(i, actualBand) << "Frequency: " << freqs[j];
959 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800960 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800961 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800962}
963
nelsonli3c12e582019-12-12 13:53:49 +0800964TEST_P(EqualizerAudioEffectHidlTest, GetPresetNames) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800965 description("Verify that Equalizer effect reports at least one preset");
966 size_t presetCount;
Mikhail Naganov0d920592023-08-25 11:10:37 -0700967 ASSERT_NO_FATAL_FAILURE(getPresetCount(&presetCount));
Kevin Rocard55b10612018-11-12 12:33:16 -0800968 EXPECT_GT(presetCount, 0u);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800969}
970
nelsonli3c12e582019-12-12 13:53:49 +0800971TEST_P(EqualizerAudioEffectHidlTest, GetSetCurrentPreset) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800972 description("Verify that manipulating the current preset for Equalizer effect");
973 size_t presetCount;
Mikhail Naganov0d920592023-08-25 11:10:37 -0700974 ASSERT_NO_FATAL_FAILURE(getPresetCount(&presetCount));
Kevin Rocard55b10612018-11-12 12:33:16 -0800975 ASSERT_GT(presetCount, 0u);
976 for (uint16_t i = 0; i < presetCount; ++i) {
977 Return<Result> ret = equalizer->setCurrentPreset(i);
978 EXPECT_TRUE(ret.isOk());
Mikhail Naganov0d920592023-08-25 11:10:37 -0700979 EXPECT_NO_FATAL_FAILURE(checkResult(ret));
Kevin Rocard55b10612018-11-12 12:33:16 -0800980 Result retval = Result::NOT_INITIALIZED;
981 uint16_t actualPreset = 0xffff;
982 Return<void> ret2 = equalizer->getCurrentPreset([&](Result r, uint16_t p) {
983 retval = r;
984 if (retval == Result::OK) {
985 actualPreset = p;
986 }
987 });
988 EXPECT_TRUE(ret2.isOk());
Mikhail Naganov0d920592023-08-25 11:10:37 -0700989 EXPECT_NO_FATAL_FAILURE(checkResult(retval));
990 if (!useAfterClose) {
991 EXPECT_EQ(i, actualPreset);
992 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800993 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800994}
995
nelsonli3c12e582019-12-12 13:53:49 +0800996TEST_P(EqualizerAudioEffectHidlTest, GetSetAllProperties) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800997 description(
998 "Verify that setting band levels and presets works via Get / "
999 "SetAllProperties for Equalizer effect");
Kevin Rocard96d2cd92018-11-14 16:22:07 -08001000 using AllProperties =
Mikhail Naganov00a44c02018-12-14 14:31:45 -08001001 ::android::hardware::audio::effect::CPP_VERSION::IEqualizerEffect::AllProperties;
Kevin Rocard55b10612018-11-12 12:33:16 -08001002 uint16_t numBands = 0;
Mikhail Naganov0d920592023-08-25 11:10:37 -07001003 ASSERT_NO_FATAL_FAILURE(getNumBands(&numBands));
Kevin Rocard55b10612018-11-12 12:33:16 -08001004 ASSERT_GT(numBands, 0);
1005 AllProperties props;
1006 props.bandLevels.resize(numBands);
1007 for (size_t i = 0; i < numBands; ++i) {
1008 props.bandLevels[i] = 0;
1009 }
Mikhail Naganov9f289042017-02-23 08:39:36 -08001010
Kevin Rocard55b10612018-11-12 12:33:16 -08001011 AllProperties actualProps;
1012 Result retval = Result::NOT_INITIALIZED;
Mikhail Naganov9f289042017-02-23 08:39:36 -08001013
Kevin Rocard55b10612018-11-12 12:33:16 -08001014 // Verify setting of the band levels via properties.
1015 props.curPreset = -1;
1016 Return<Result> ret = equalizer->setAllProperties(props);
1017 EXPECT_TRUE(ret.isOk());
Mikhail Naganov0d920592023-08-25 11:10:37 -07001018 EXPECT_NO_FATAL_FAILURE(checkResult(ret));
Kevin Rocard55b10612018-11-12 12:33:16 -08001019 Return<void> ret2 = equalizer->getAllProperties([&](Result r, AllProperties p) {
Mikhail Naganov9f289042017-02-23 08:39:36 -08001020 retval = r;
1021 if (retval == Result::OK) {
Kevin Rocard55b10612018-11-12 12:33:16 -08001022 actualProps = p;
Mikhail Naganov9f289042017-02-23 08:39:36 -08001023 }
Kevin Rocard55b10612018-11-12 12:33:16 -08001024 });
1025 EXPECT_TRUE(ret2.isOk());
Mikhail Naganov0d920592023-08-25 11:10:37 -07001026 EXPECT_NO_FATAL_FAILURE(checkResult(retval));
1027 if (!useAfterClose) {
1028 EXPECT_EQ(props.bandLevels, actualProps.bandLevels);
1029 }
Mikhail Naganov9f289042017-02-23 08:39:36 -08001030
Kevin Rocard55b10612018-11-12 12:33:16 -08001031 // Verify setting of the current preset via properties.
1032 props.curPreset = 0; // Assuming there is at least one preset.
1033 ret = equalizer->setAllProperties(props);
1034 EXPECT_TRUE(ret.isOk());
Mikhail Naganov0d920592023-08-25 11:10:37 -07001035 EXPECT_NO_FATAL_FAILURE(checkResult(ret));
Kevin Rocard55b10612018-11-12 12:33:16 -08001036 ret2 = equalizer->getAllProperties([&](Result r, AllProperties p) {
1037 retval = r;
1038 if (retval == Result::OK) {
1039 actualProps = p;
1040 }
1041 });
1042 EXPECT_TRUE(ret2.isOk());
Mikhail Naganov0d920592023-08-25 11:10:37 -07001043 EXPECT_NO_FATAL_FAILURE(checkResult(retval));
1044 if (!useAfterClose) {
1045 EXPECT_EQ(props.curPreset, actualProps.curPreset);
1046 }
Mikhail Naganov9f289042017-02-23 08:39:36 -08001047}
1048
1049// The main test class for Equalizer Audio Effect HIDL HAL.
1050class LoudnessEnhancerAudioEffectHidlTest : public AudioEffectHidlTest {
Mikhail Naganov892d1472020-03-19 10:44:06 -07001051 public:
Kevin Rocard55b10612018-11-12 12:33:16 -08001052 void SetUp() override {
1053 AudioEffectHidlTest::SetUp();
1054 enhancer = ILoudnessEnhancerEffect::castFrom(effect);
1055 ASSERT_NE(nullptr, enhancer.get());
1056 }
Mikhail Naganov9f289042017-02-23 08:39:36 -08001057
Mikhail Naganov892d1472020-03-19 10:44:06 -07001058 void TearDown() override {
1059 enhancer.clear();
1060 AudioEffectHidlTest::TearDown();
1061 }
Mikhail Naganov9f289042017-02-23 08:39:36 -08001062
Mikhail Naganov892d1472020-03-19 10:44:06 -07001063 protected:
Kevin Rocard55b10612018-11-12 12:33:16 -08001064 sp<ILoudnessEnhancerEffect> enhancer;
Mikhail Naganov9f289042017-02-23 08:39:36 -08001065};
1066
nelsonli3c12e582019-12-12 13:53:49 +08001067TEST_P(LoudnessEnhancerAudioEffectHidlTest, GetSetTargetGain) {
Kevin Rocard55b10612018-11-12 12:33:16 -08001068 description(
1069 "Verify that manipulating the target gain works for Loudness Enhancer "
1070 "effect");
1071 const int32_t gain = 100;
1072 Return<Result> ret = enhancer->setTargetGain(gain);
1073 EXPECT_TRUE(ret.isOk());
Mikhail Naganov0d920592023-08-25 11:10:37 -07001074 EXPECT_NO_FATAL_FAILURE(checkResult(ret));
Kevin Rocard55b10612018-11-12 12:33:16 -08001075 int32_t actualGain = 0;
1076 Result retval;
1077 Return<void> ret2 = enhancer->getTargetGain([&](Result r, int32_t g) {
1078 retval = r;
1079 if (retval == Result::OK) {
1080 actualGain = g;
1081 }
1082 });
1083 EXPECT_TRUE(ret2.isOk());
Mikhail Naganov0d920592023-08-25 11:10:37 -07001084 EXPECT_NO_FATAL_FAILURE(checkResult(retval));
1085 if (!useAfterClose) {
1086 EXPECT_EQ(gain, actualGain);
1087 }
Mikhail Naganovbf393172016-11-11 16:24:50 -08001088}
Zhuoyao Zhang7dc6ce82018-02-08 12:44:27 -08001089
Mikhail Naganov892d1472020-03-19 10:44:06 -07001090INSTANTIATE_TEST_SUITE_P(EffectsFactory, AudioEffectsFactoryHidlTest,
1091 ::testing::ValuesIn(::android::hardware::getAllHalInstanceNames(
1092 IEffectsFactory::descriptor)),
1093 ::android::hardware::PrintInstanceNameToString);
Mikhail Naganov315ce412019-10-23 16:46:54 -07001094INSTANTIATE_TEST_SUITE_P(
Mikhail Naganov892d1472020-03-19 10:44:06 -07001095 Equalizer_IEffect, AudioEffectHidlTest,
1096 ::testing::Combine(::testing::ValuesIn(::android::hardware::getAllHalInstanceNames(
1097 IEffectsFactory::descriptor)),
Mikhail Naganov0d920592023-08-25 11:10:37 -07001098 ::testing::Values(EQUALIZER_EFFECT_TYPE),
1099 ::testing::Values(false, true) /*useAfterClose*/),
Mikhail Naganov892d1472020-03-19 10:44:06 -07001100 EffectParameterToString);
Mikhail Naganov315ce412019-10-23 16:46:54 -07001101INSTANTIATE_TEST_SUITE_P(
Mikhail Naganov892d1472020-03-19 10:44:06 -07001102 LoudnessEnhancer_IEffect, AudioEffectHidlTest,
1103 ::testing::Combine(::testing::ValuesIn(::android::hardware::getAllHalInstanceNames(
1104 IEffectsFactory::descriptor)),
Mikhail Naganov0d920592023-08-25 11:10:37 -07001105 ::testing::Values(LOUDNESS_ENHANCER_EFFECT_TYPE),
1106 ::testing::Values(false, true) /*useAfterClose*/),
Mikhail Naganov892d1472020-03-19 10:44:06 -07001107 EffectParameterToString);
nelsonli3c12e582019-12-12 13:53:49 +08001108INSTANTIATE_TEST_SUITE_P(
Mikhail Naganov315ce412019-10-23 16:46:54 -07001109 Equalizer, EqualizerAudioEffectHidlTest,
Mikhail Naganov892d1472020-03-19 10:44:06 -07001110 ::testing::Combine(::testing::ValuesIn(::android::hardware::getAllHalInstanceNames(
1111 IEffectsFactory::descriptor)),
Mikhail Naganov0d920592023-08-25 11:10:37 -07001112 ::testing::Values(EQUALIZER_EFFECT_TYPE),
1113 ::testing::Values(false, true) /*useAfterClose*/),
Mikhail Naganov892d1472020-03-19 10:44:06 -07001114 EffectParameterToString);
Mikhail Naganov315ce412019-10-23 16:46:54 -07001115INSTANTIATE_TEST_SUITE_P(
1116 LoudnessEnhancer, LoudnessEnhancerAudioEffectHidlTest,
Mikhail Naganov892d1472020-03-19 10:44:06 -07001117 ::testing::Combine(::testing::ValuesIn(::android::hardware::getAllHalInstanceNames(
1118 IEffectsFactory::descriptor)),
Mikhail Naganov0d920592023-08-25 11:10:37 -07001119 ::testing::Values(LOUDNESS_ENHANCER_EFFECT_TYPE),
1120 ::testing::Values(false, true) /*useAfterClose*/),
Mikhail Naganov892d1472020-03-19 10:44:06 -07001121 EffectParameterToString);
Mikhail Naganovb9743d42020-07-21 10:57:03 -07001122// When the VTS test runs on a device lacking the corresponding HAL version the parameter
1123// list is empty, this isn't a problem.
1124GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(AudioEffectsFactoryHidlTest);
1125GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(AudioEffectHidlTest);
1126GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(EqualizerAudioEffectHidlTest);
1127GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(LoudnessEnhancerAudioEffectHidlTest);