blob: ea755ae801ccf9b3880af93bedcda8813e556173 [file] [log] [blame]
Mikhail Naganovbf393172016-11-11 16:24:50 -08001/*
Mikhail Naganov9f289042017-02-23 08:39:36 -08002 * Copyright (C) 2017 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
17#define LOG_TAG "AudioEffectHidlHalTest"
18#include <android-base/logging.h>
Mikhail Naganov9f289042017-02-23 08:39:36 -080019#include <system/audio.h>
Mikhail Naganovbf393172016-11-11 16:24:50 -080020
Mikhail Naganov9f289042017-02-23 08:39:36 -080021#include <android/hardware/audio/effect/2.0/IEffect.h>
Mikhail Naganovbf393172016-11-11 16:24:50 -080022#include <android/hardware/audio/effect/2.0/IEffectsFactory.h>
Mikhail Naganov9f289042017-02-23 08:39:36 -080023#include <android/hardware/audio/effect/2.0/IEqualizerEffect.h>
24#include <android/hardware/audio/effect/2.0/ILoudnessEnhancerEffect.h>
Mikhail Naganovbf393172016-11-11 16:24:50 -080025#include <android/hardware/audio/effect/2.0/types.h>
Mikhail Naganov9f289042017-02-23 08:39:36 -080026#include <android/hidl/allocator/1.0/IAllocator.h>
27#include <android/hidl/memory/1.0/IMemory.h>
Mikhail Naganovbf393172016-11-11 16:24:50 -080028
Yuexi Maed2bb4e2017-03-10 00:44:45 -080029#include <VtsHalHidlTargetTestBase.h>
Zhuoyao Zhang7dc6ce82018-02-08 12:44:27 -080030#include <VtsHalHidlTargetTestEnvBase.h>
Mikhail Naganovbf393172016-11-11 16:24:50 -080031
Kevin Rocard55b10612018-11-12 12:33:16 -080032using android::sp;
33using android::hardware::hidl_handle;
34using android::hardware::hidl_memory;
35using android::hardware::hidl_string;
36using android::hardware::hidl_vec;
37using android::hardware::MQDescriptorSync;
38using android::hardware::Return;
39using android::hardware::Void;
Mikhail Naganov9f289042017-02-23 08:39:36 -080040using android::hardware::audio::common::V2_0::AudioDevice;
41using android::hardware::audio::common::V2_0::AudioHandleConsts;
42using android::hardware::audio::common::V2_0::AudioMode;
Mikhail Naganov05fa0d02017-03-24 17:06:25 -070043using android::hardware::audio::common::V2_0::AudioSource;
Mikhail Naganov9f289042017-02-23 08:39:36 -080044using android::hardware::audio::common::V2_0::Uuid;
45using android::hardware::audio::effect::V2_0::AudioBuffer;
Mikhail Naganov05fa0d02017-03-24 17:06:25 -070046using android::hardware::audio::effect::V2_0::EffectAuxChannelsConfig;
Mikhail Naganov9f289042017-02-23 08:39:36 -080047using android::hardware::audio::effect::V2_0::EffectBufferConfig;
48using android::hardware::audio::effect::V2_0::EffectConfig;
49using android::hardware::audio::effect::V2_0::EffectDescriptor;
50using android::hardware::audio::effect::V2_0::EffectOffloadParameter;
51using android::hardware::audio::effect::V2_0::IEffect;
52using android::hardware::audio::effect::V2_0::IEffectsFactory;
53using android::hardware::audio::effect::V2_0::IEqualizerEffect;
54using android::hardware::audio::effect::V2_0::ILoudnessEnhancerEffect;
55using android::hardware::audio::effect::V2_0::Result;
Mikhail Naganov9f289042017-02-23 08:39:36 -080056using android::hidl::allocator::V1_0::IAllocator;
57using android::hidl::memory::V1_0::IMemory;
Mikhail Naganovbf393172016-11-11 16:24:50 -080058
Mikhail Naganov9f289042017-02-23 08:39:36 -080059#ifndef ARRAY_SIZE
60#define ARRAY_SIZE(a) (sizeof(a) / sizeof(*(a)))
61#endif
62
Zhuoyao Zhang7dc6ce82018-02-08 12:44:27 -080063// Test environment for Audio Effects Factory HIDL HAL.
64class AudioEffectsFactoryHidlEnvironment : public ::testing::VtsHalHidlTargetTestEnvBase {
65 public:
66 // get the test environment singleton
67 static AudioEffectsFactoryHidlEnvironment* Instance() {
68 static AudioEffectsFactoryHidlEnvironment* instance =
69 new AudioEffectsFactoryHidlEnvironment;
70 return instance;
71 }
72
73 virtual void registerTestServices() override { registerTestService<IEffectsFactory>(); }
74};
75
Mikhail Naganov9f289042017-02-23 08:39:36 -080076// The main test class for Audio Effects Factory HIDL HAL.
77class AudioEffectsFactoryHidlTest : public ::testing::VtsHalHidlTargetTestBase {
Kevin Rocard55b10612018-11-12 12:33:16 -080078 public:
79 void SetUp() override {
80 effectsFactory = ::testing::VtsHalHidlTargetTestBase::getService<IEffectsFactory>(
81 AudioEffectsFactoryHidlEnvironment::Instance()->getServiceName<IEffectsFactory>());
82 ASSERT_NE(effectsFactory, nullptr);
83 }
Mikhail Naganovbf393172016-11-11 16:24:50 -080084
Kevin Rocard55b10612018-11-12 12:33:16 -080085 void TearDown() override { effectsFactory.clear(); }
Mikhail Naganov9f289042017-02-23 08:39:36 -080086
Kevin Rocard55b10612018-11-12 12:33:16 -080087 protected:
88 static void description(const std::string& description) {
89 RecordProperty("description", description);
90 }
Mikhail Naganovbf393172016-11-11 16:24:50 -080091
Kevin Rocard55b10612018-11-12 12:33:16 -080092 sp<IEffectsFactory> effectsFactory;
Mikhail Naganovbf393172016-11-11 16:24:50 -080093};
94
Mikhail Naganov9f289042017-02-23 08:39:36 -080095TEST_F(AudioEffectsFactoryHidlTest, EnumerateEffects) {
Kevin Rocard55b10612018-11-12 12:33:16 -080096 description("Verify that EnumerateEffects returns at least one effect");
97 Result retval = Result::NOT_INITIALIZED;
98 size_t effectCount = 0;
99 Return<void> ret =
100 effectsFactory->getAllDescriptors([&](Result r, const hidl_vec<EffectDescriptor>& result) {
101 retval = r;
102 effectCount = result.size();
103 });
104 EXPECT_TRUE(ret.isOk());
105 EXPECT_EQ(Result::OK, retval);
106 EXPECT_GT(effectCount, 0u);
Mikhail Naganovbf393172016-11-11 16:24:50 -0800107}
108
Mikhail Naganov9f289042017-02-23 08:39:36 -0800109TEST_F(AudioEffectsFactoryHidlTest, CreateEffect) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800110 description("Verify that an effect can be created via CreateEffect");
111 bool gotEffect = false;
112 Uuid effectUuid;
113 Return<void> ret =
114 effectsFactory->getAllDescriptors([&](Result r, const hidl_vec<EffectDescriptor>& result) {
115 if (r == Result::OK && result.size() > 0) {
116 gotEffect = true;
117 effectUuid = result[0].uuid;
118 }
119 });
120 ASSERT_TRUE(ret.isOk());
121 ASSERT_TRUE(gotEffect);
122 Result retval = Result::NOT_INITIALIZED;
123 sp<IEffect> effect;
124 ret = effectsFactory->createEffect(
125 effectUuid, 1 /*session*/, 1 /*ioHandle*/,
126 [&](Result r, const sp<IEffect>& result, uint64_t /*effectId*/) {
127 retval = r;
128 if (r == Result::OK) {
129 effect = result;
130 }
131 });
132 EXPECT_TRUE(ret.isOk());
133 EXPECT_EQ(Result::OK, retval);
134 EXPECT_NE(nullptr, effect.get());
Mikhail Naganovbf393172016-11-11 16:24:50 -0800135}
136
Mikhail Naganov9f289042017-02-23 08:39:36 -0800137TEST_F(AudioEffectsFactoryHidlTest, GetDescriptor) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800138 description(
139 "Verify that effects factory can provide an effect descriptor via "
140 "GetDescriptor");
141 hidl_vec<EffectDescriptor> allDescriptors;
142 Return<void> ret =
143 effectsFactory->getAllDescriptors([&](Result r, const hidl_vec<EffectDescriptor>& result) {
144 if (r == Result::OK) {
145 allDescriptors = result;
146 }
Mikhail Naganovbf393172016-11-11 16:24:50 -0800147 });
Kevin Rocard55b10612018-11-12 12:33:16 -0800148 ASSERT_TRUE(ret.isOk());
149 ASSERT_GT(allDescriptors.size(), 0u);
150 for (size_t i = 0; i < allDescriptors.size(); ++i) {
151 ret = effectsFactory->getDescriptor(allDescriptors[i].uuid,
152 [&](Result r, const EffectDescriptor& result) {
153 EXPECT_EQ(r, Result::OK);
154 EXPECT_EQ(result, allDescriptors[i]);
155 });
156 }
157 EXPECT_TRUE(ret.isOk());
Mikhail Naganovbf393172016-11-11 16:24:50 -0800158}
159
Mikhail Naganov3e6fe752017-04-24 10:44:08 -0700160TEST_F(AudioEffectsFactoryHidlTest, DebugDumpInvalidArgument) {
161 description("Verify that debugDump doesn't crash on invalid arguments");
162 Return<void> ret = effectsFactory->debugDump(hidl_handle());
163 ASSERT_TRUE(ret.isOk());
164}
165
Mikhail Naganov9f289042017-02-23 08:39:36 -0800166// Equalizer effect is required by CDD, but only the type is fixed.
167// This is the same UUID as AudioEffect.EFFECT_TYPE_EQUALIZER in Java.
168static const Uuid EQUALIZER_EFFECT_TYPE = {
169 0x0bed4300, 0xddd6, 0x11db, 0x8f34,
170 std::array<uint8_t, 6>{{0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}}};
171// Loudness Enhancer effect is required by CDD, but only the type is fixed.
172// This is the same UUID as AudioEffect.EFFECT_TYPE_LOUDNESS_ENHANCER in Java.
173static const Uuid LOUDNESS_ENHANCER_EFFECT_TYPE = {
174 0xfe3199be, 0xaed0, 0x413f, 0x87bb,
175 std::array<uint8_t, 6>{{0x11, 0x26, 0x0e, 0xb6, 0x3c, 0xf1}}};
176
177// The main test class for Audio Effect HIDL HAL.
178class AudioEffectHidlTest : public ::testing::VtsHalHidlTargetTestBase {
Kevin Rocard55b10612018-11-12 12:33:16 -0800179 public:
180 void SetUp() override {
181 effectsFactory = ::testing::VtsHalHidlTargetTestBase::getService<IEffectsFactory>();
182 ASSERT_NE(nullptr, effectsFactory.get());
Mikhail Naganov9f289042017-02-23 08:39:36 -0800183
Kevin Rocard55b10612018-11-12 12:33:16 -0800184 findAndCreateEffect(getEffectType());
185 ASSERT_NE(nullptr, effect.get());
Mikhail Naganov9f289042017-02-23 08:39:36 -0800186
Kevin Rocard55b10612018-11-12 12:33:16 -0800187 Return<Result> ret = effect->init();
188 ASSERT_TRUE(ret.isOk());
189 ASSERT_EQ(Result::OK, ret);
190 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800191
Kevin Rocard55b10612018-11-12 12:33:16 -0800192 void TearDown() override {
193 effect.clear();
194 effectsFactory.clear();
195 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800196
Kevin Rocard55b10612018-11-12 12:33:16 -0800197 protected:
198 static void description(const std::string& description) {
199 RecordProperty("description", description);
200 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800201
Kevin Rocard55b10612018-11-12 12:33:16 -0800202 virtual Uuid getEffectType() { return EQUALIZER_EFFECT_TYPE; }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800203
Kevin Rocard55b10612018-11-12 12:33:16 -0800204 void findAndCreateEffect(const Uuid& type);
205 void findEffectInstance(const Uuid& type, Uuid* uuid);
206 void getChannelCount(uint32_t* channelCount);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800207
Kevin Rocard55b10612018-11-12 12:33:16 -0800208 sp<IEffectsFactory> effectsFactory;
209 sp<IEffect> effect;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800210};
211
212void AudioEffectHidlTest::findAndCreateEffect(const Uuid& type) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800213 Uuid effectUuid;
214 findEffectInstance(type, &effectUuid);
215 Return<void> ret = effectsFactory->createEffect(
216 effectUuid, 1 /*session*/, 1 /*ioHandle*/,
217 [&](Result r, const sp<IEffect>& result, uint64_t /*effectId*/) {
218 if (r == Result::OK) {
219 effect = result;
220 }
221 });
222 ASSERT_TRUE(ret.isOk());
Mikhail Naganov9f289042017-02-23 08:39:36 -0800223}
224
225void AudioEffectHidlTest::findEffectInstance(const Uuid& type, Uuid* uuid) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800226 bool effectFound = false;
227 Return<void> ret =
228 effectsFactory->getAllDescriptors([&](Result r, const hidl_vec<EffectDescriptor>& result) {
229 if (r == Result::OK) {
230 for (const auto& desc : result) {
231 if (desc.type == type) {
232 effectFound = true;
233 *uuid = desc.uuid;
234 break;
235 }
236 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800237 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800238 });
239 ASSERT_TRUE(ret.isOk());
240 ASSERT_TRUE(effectFound);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800241}
242
243void AudioEffectHidlTest::getChannelCount(uint32_t* channelCount) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800244 Result retval;
245 EffectConfig currentConfig;
246 Return<void> ret = effect->getConfig([&](Result r, const EffectConfig& conf) {
247 retval = r;
248 if (r == Result::OK) {
249 currentConfig = conf;
250 }
251 });
252 ASSERT_TRUE(ret.isOk());
253 ASSERT_EQ(Result::OK, retval);
254 ASSERT_TRUE(audio_channel_mask_is_valid(
255 static_cast<audio_channel_mask_t>(currentConfig.outputCfg.channels)));
256 *channelCount = audio_channel_count_from_out_mask(
257 static_cast<audio_channel_mask_t>(currentConfig.outputCfg.channels));
Mikhail Naganov9f289042017-02-23 08:39:36 -0800258}
259
260TEST_F(AudioEffectHidlTest, Close) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800261 description("Verify that an effect can be closed");
262 Return<Result> ret = effect->close();
263 EXPECT_TRUE(ret.isOk());
264 EXPECT_EQ(Result::OK, ret);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800265}
266
267TEST_F(AudioEffectHidlTest, GetDescriptor) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800268 description("Verify that an effect can return its own descriptor via GetDescriptor");
269 Result retval = Result::NOT_INITIALIZED;
270 Uuid actualType;
271 Return<void> ret = effect->getDescriptor([&](Result r, const EffectDescriptor& desc) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800272 retval = r;
273 if (r == Result::OK) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800274 actualType = desc.type;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800275 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800276 });
277 EXPECT_TRUE(ret.isOk());
278 EXPECT_EQ(Result::OK, retval);
279 EXPECT_EQ(getEffectType(), actualType);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800280}
281
282TEST_F(AudioEffectHidlTest, GetSetConfig) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800283 description(
284 "Verify that it is possible to manipulate effect config via Get / "
285 "SetConfig");
286 Result retval = Result::NOT_INITIALIZED;
287 EffectConfig currentConfig;
288 Return<void> ret = effect->getConfig([&](Result r, const EffectConfig& conf) {
289 retval = r;
290 if (r == Result::OK) {
291 currentConfig = conf;
292 }
293 });
294 EXPECT_TRUE(ret.isOk());
295 EXPECT_EQ(Result::OK, retval);
296 Return<Result> ret2 = effect->setConfig(currentConfig, nullptr, nullptr);
297 EXPECT_TRUE(ret2.isOk());
298 EXPECT_EQ(Result::OK, ret2);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800299}
300
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700301TEST_F(AudioEffectHidlTest, GetConfigReverse) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800302 description("Verify that GetConfigReverse does not crash");
303 Return<void> ret = effect->getConfigReverse([&](Result, const EffectConfig&) {});
304 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700305}
306
307TEST_F(AudioEffectHidlTest, GetSupportedAuxChannelsConfigs) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800308 description("Verify that GetSupportedAuxChannelsConfigs does not crash");
309 Return<void> ret = effect->getSupportedAuxChannelsConfigs(
310 0, [&](Result, const hidl_vec<EffectAuxChannelsConfig>&) {});
311 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700312}
313
314TEST_F(AudioEffectHidlTest, GetAuxChannelsConfig) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800315 description("Verify that GetAuxChannelsConfig does not crash");
316 Return<void> ret = effect->getAuxChannelsConfig([&](Result, const EffectAuxChannelsConfig&) {});
317 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700318}
319
320TEST_F(AudioEffectHidlTest, SetAuxChannelsConfig) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800321 description("Verify that SetAuxChannelsConfig does not crash");
322 Return<Result> ret = effect->setAuxChannelsConfig(EffectAuxChannelsConfig());
323 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700324}
325
Mikhail Naganov9f289042017-02-23 08:39:36 -0800326// Not generated automatically because AudioBuffer contains
327// instances of hidl_memory which can't be compared properly
328// in general case due to presence of handles.
329//
330// However, in this particular case, handles must not present
331// thus comparison is possible.
332//
333// operator== must be defined in the same namespace as the structures.
334namespace android {
335namespace hardware {
336namespace audio {
337namespace effect {
338namespace V2_0 {
339inline bool operator==(const AudioBuffer& lhs, const AudioBuffer& rhs) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800340 return lhs.id == rhs.id && lhs.frameCount == rhs.frameCount && lhs.data.handle() == nullptr &&
341 rhs.data.handle() == nullptr;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800342}
343
Kevin Rocard55b10612018-11-12 12:33:16 -0800344inline bool operator==(const EffectBufferConfig& lhs, const EffectBufferConfig& rhs) {
345 return lhs.buffer == rhs.buffer && lhs.samplingRateHz == rhs.samplingRateHz &&
346 lhs.channels == rhs.channels && lhs.format == rhs.format &&
347 lhs.accessMode == rhs.accessMode && lhs.mask == rhs.mask;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800348}
349
350inline bool operator==(const EffectConfig& lhs, const EffectConfig& rhs) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800351 return lhs.inputCfg == rhs.inputCfg && lhs.outputCfg == rhs.outputCfg;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800352}
353} // namespace V2_0
354} // namespace effect
355} // namespace audio
356} // namespace hardware
357} // namespace android
358
359TEST_F(AudioEffectHidlTest, Reset) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800360 description("Verify that Reset preserves effect configuration");
361 Result retval = Result::NOT_INITIALIZED;
362 EffectConfig originalConfig;
363 Return<void> ret = effect->getConfig([&](Result r, const EffectConfig& conf) {
364 retval = r;
365 if (r == Result::OK) {
366 originalConfig = conf;
367 }
368 });
369 ASSERT_TRUE(ret.isOk());
370 ASSERT_EQ(Result::OK, retval);
371 Return<Result> ret2 = effect->reset();
372 EXPECT_TRUE(ret2.isOk());
373 EXPECT_EQ(Result::OK, ret2);
374 EffectConfig configAfterReset;
375 ret = effect->getConfig([&](Result r, const EffectConfig& conf) {
376 retval = r;
377 if (r == Result::OK) {
378 configAfterReset = conf;
379 }
380 });
381 EXPECT_EQ(originalConfig, configAfterReset);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800382}
383
384TEST_F(AudioEffectHidlTest, DisableEnableDisable) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800385 description("Verify Disable -> Enable -> Disable sequence for an effect");
386 Return<Result> ret = effect->disable();
387 EXPECT_TRUE(ret.isOk());
388 EXPECT_EQ(Result::INVALID_ARGUMENTS, ret);
389 ret = effect->enable();
390 EXPECT_TRUE(ret.isOk());
391 EXPECT_EQ(Result::OK, ret);
392 ret = effect->disable();
393 EXPECT_TRUE(ret.isOk());
394 EXPECT_EQ(Result::OK, ret);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800395}
396
397TEST_F(AudioEffectHidlTest, SetDevice) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800398 description("Verify that SetDevice works for an output chain effect");
399 Return<Result> ret = effect->setDevice(AudioDevice::OUT_SPEAKER);
400 EXPECT_TRUE(ret.isOk());
401 EXPECT_EQ(Result::OK, ret);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800402}
403
404TEST_F(AudioEffectHidlTest, SetAndGetVolume) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800405 description("Verify that SetAndGetVolume method works for an effect");
406 uint32_t channelCount;
407 getChannelCount(&channelCount);
408 hidl_vec<uint32_t> volumes;
409 volumes.resize(channelCount);
410 for (uint32_t i = 0; i < channelCount; ++i) {
411 volumes[i] = 0;
412 }
413 Result retval = Result::NOT_INITIALIZED;
414 Return<void> ret =
415 effect->setAndGetVolume(volumes, [&](Result r, const hidl_vec<uint32_t>&) { retval = r; });
416 EXPECT_TRUE(ret.isOk());
417 EXPECT_EQ(Result::OK, retval);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800418}
419
420TEST_F(AudioEffectHidlTest, VolumeChangeNotification) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800421 description("Verify that effect accepts VolumeChangeNotification");
422 uint32_t channelCount;
423 getChannelCount(&channelCount);
424 hidl_vec<uint32_t> volumes;
425 volumes.resize(channelCount);
426 for (uint32_t i = 0; i < channelCount; ++i) {
427 volumes[i] = 0;
428 }
429 Return<Result> ret = effect->volumeChangeNotification(volumes);
430 EXPECT_TRUE(ret.isOk());
431 EXPECT_EQ(Result::OK, ret);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800432}
433
434TEST_F(AudioEffectHidlTest, SetAudioMode) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800435 description("Verify that SetAudioMode works for an effect");
436 Return<Result> ret = effect->setAudioMode(AudioMode::NORMAL);
437 EXPECT_TRUE(ret.isOk());
438 EXPECT_EQ(Result::OK, ret);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800439}
440
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700441TEST_F(AudioEffectHidlTest, SetConfigReverse) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800442 description("Verify that SetConfigReverse does not crash");
443 Return<Result> ret = effect->setConfigReverse(EffectConfig(), nullptr, nullptr);
444 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700445}
446
447TEST_F(AudioEffectHidlTest, SetInputDevice) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800448 description("Verify that SetInputDevice does not crash");
449 Return<Result> ret = effect->setInputDevice(AudioDevice::IN_BUILTIN_MIC);
450 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700451}
452
453TEST_F(AudioEffectHidlTest, SetAudioSource) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800454 description("Verify that SetAudioSource does not crash");
455 Return<Result> ret = effect->setAudioSource(AudioSource::MIC);
456 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700457}
458
Mikhail Naganov9f289042017-02-23 08:39:36 -0800459TEST_F(AudioEffectHidlTest, Offload) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800460 description("Verify that calling Offload method does not crash");
461 EffectOffloadParameter offloadParam;
462 offloadParam.isOffload = false;
463 offloadParam.ioHandle = static_cast<int>(AudioHandleConsts::AUDIO_IO_HANDLE_NONE);
464 Return<Result> ret = effect->offload(offloadParam);
465 EXPECT_TRUE(ret.isOk());
Mikhail Naganov9f289042017-02-23 08:39:36 -0800466}
467
468TEST_F(AudioEffectHidlTest, PrepareForProcessing) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800469 description("Verify that PrepareForProcessing method works for an effect");
470 Result retval = Result::NOT_INITIALIZED;
471 Return<void> ret = effect->prepareForProcessing(
472 [&](Result r, const MQDescriptorSync<Result>&) { retval = r; });
473 EXPECT_TRUE(ret.isOk());
474 EXPECT_EQ(Result::OK, retval);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800475}
476
477TEST_F(AudioEffectHidlTest, SetProcessBuffers) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800478 description("Verify that SetProcessBuffers works for an effect");
479 sp<IAllocator> ashmem = IAllocator::getService("ashmem");
480 ASSERT_NE(nullptr, ashmem.get());
481 bool success = false;
482 AudioBuffer buffer;
483 Return<void> ret = ashmem->allocate(1024, [&](bool s, const hidl_memory& memory) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800484 success = s;
485 if (s) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800486 buffer.data = memory;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800487 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800488 });
489 ASSERT_TRUE(ret.isOk());
490 ASSERT_TRUE(success);
491 Return<Result> ret2 = effect->setProcessBuffers(buffer, buffer);
492 EXPECT_TRUE(ret2.isOk());
493 EXPECT_EQ(Result::OK, ret2);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800494}
495
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700496TEST_F(AudioEffectHidlTest, Command) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800497 description("Verify that Command does not crash");
498 Return<void> ret =
499 effect->command(0, hidl_vec<uint8_t>(), 0, [&](int32_t, const hidl_vec<uint8_t>&) {});
500 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700501}
Mikhail Naganov9f289042017-02-23 08:39:36 -0800502
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700503TEST_F(AudioEffectHidlTest, SetParameter) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800504 description("Verify that SetParameter does not crash");
505 Return<Result> ret = effect->setParameter(hidl_vec<uint8_t>(), hidl_vec<uint8_t>());
506 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700507}
508
509TEST_F(AudioEffectHidlTest, GetParameter) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800510 description("Verify that GetParameter does not crash");
511 Return<void> ret =
512 effect->getParameter(hidl_vec<uint8_t>(), 0, [&](Result, const hidl_vec<uint8_t>&) {});
513 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700514}
515
516TEST_F(AudioEffectHidlTest, GetSupportedConfigsForFeature) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800517 description("Verify that GetSupportedConfigsForFeature does not crash");
518 Return<void> ret = effect->getSupportedConfigsForFeature(
519 0, 0, 0, [&](Result, uint32_t, const hidl_vec<uint8_t>&) {});
520 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700521}
522
523TEST_F(AudioEffectHidlTest, GetCurrentConfigForFeature) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800524 description("Verify that GetCurrentConfigForFeature does not crash");
525 Return<void> ret =
526 effect->getCurrentConfigForFeature(0, 0, [&](Result, const hidl_vec<uint8_t>&) {});
527 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700528}
529
530TEST_F(AudioEffectHidlTest, SetCurrentConfigForFeature) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800531 description("Verify that SetCurrentConfigForFeature does not crash");
532 Return<Result> ret = effect->setCurrentConfigForFeature(0, hidl_vec<uint8_t>());
533 EXPECT_TRUE(ret.isOk());
Mikhail Naganov05fa0d02017-03-24 17:06:25 -0700534}
535
Mikhail Naganov9f289042017-02-23 08:39:36 -0800536// The main test class for Equalizer Audio Effect HIDL HAL.
537class EqualizerAudioEffectHidlTest : public AudioEffectHidlTest {
Kevin Rocard55b10612018-11-12 12:33:16 -0800538 public:
539 void SetUp() override {
540 AudioEffectHidlTest::SetUp();
541 equalizer = IEqualizerEffect::castFrom(effect);
542 ASSERT_NE(nullptr, equalizer.get());
543 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800544
Kevin Rocard55b10612018-11-12 12:33:16 -0800545 protected:
546 Uuid getEffectType() override { return EQUALIZER_EFFECT_TYPE; }
547 void getNumBands(uint16_t* numBands);
548 void getLevelRange(int16_t* minLevel, int16_t* maxLevel);
549 void getBandFrequencyRange(uint16_t band, uint32_t* minFreq, uint32_t* centerFreq,
550 uint32_t* maxFreq);
551 void getPresetCount(size_t* count);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800552
Kevin Rocard55b10612018-11-12 12:33:16 -0800553 sp<IEqualizerEffect> equalizer;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800554};
555
556void EqualizerAudioEffectHidlTest::getNumBands(uint16_t* numBands) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800557 Result retval = Result::NOT_INITIALIZED;
558 Return<void> ret = equalizer->getNumBands([&](Result r, uint16_t b) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800559 retval = r;
560 if (retval == Result::OK) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800561 *numBands = b;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800562 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800563 });
564 ASSERT_TRUE(ret.isOk());
565 ASSERT_EQ(Result::OK, retval);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800566}
567
Kevin Rocard55b10612018-11-12 12:33:16 -0800568void EqualizerAudioEffectHidlTest::getLevelRange(int16_t* minLevel, int16_t* maxLevel) {
569 Result retval = Result::NOT_INITIALIZED;
570 Return<void> ret = equalizer->getLevelRange([&](Result r, int16_t min, int16_t max) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800571 retval = r;
572 if (retval == Result::OK) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800573 *minLevel = min;
574 *maxLevel = max;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800575 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800576 });
577 ASSERT_TRUE(ret.isOk());
578 ASSERT_EQ(Result::OK, retval);
579}
580
581void EqualizerAudioEffectHidlTest::getBandFrequencyRange(uint16_t band, uint32_t* minFreq,
582 uint32_t* centerFreq, uint32_t* maxFreq) {
583 Result retval = Result::NOT_INITIALIZED;
584 Return<void> ret =
585 equalizer->getBandFrequencyRange(band, [&](Result r, uint32_t min, uint32_t max) {
586 retval = r;
587 if (retval == Result::OK) {
588 *minFreq = min;
589 *maxFreq = max;
590 }
591 });
592 ASSERT_TRUE(ret.isOk());
593 ASSERT_EQ(Result::OK, retval);
594 ret = equalizer->getBandCenterFrequency(band, [&](Result r, uint32_t center) {
595 retval = r;
596 if (retval == Result::OK) {
597 *centerFreq = center;
598 }
599 });
600 ASSERT_TRUE(ret.isOk());
601 ASSERT_EQ(Result::OK, retval);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800602}
603
604void EqualizerAudioEffectHidlTest::getPresetCount(size_t* count) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800605 Result retval = Result::NOT_INITIALIZED;
606 Return<void> ret = equalizer->getPresetNames([&](Result r, const hidl_vec<hidl_string>& names) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800607 retval = r;
608 if (retval == Result::OK) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800609 *count = names.size();
Mikhail Naganov9f289042017-02-23 08:39:36 -0800610 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800611 });
612 ASSERT_TRUE(ret.isOk());
613 ASSERT_EQ(Result::OK, retval);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800614}
615
616TEST_F(EqualizerAudioEffectHidlTest, GetNumBands) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800617 description("Verify that Equalizer effect reports at least one band");
618 uint16_t numBands = 0;
619 getNumBands(&numBands);
620 EXPECT_GT(numBands, 0);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800621}
622
623TEST_F(EqualizerAudioEffectHidlTest, GetLevelRange) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800624 description("Verify that Equalizer effect reports adequate band level range");
625 int16_t minLevel = 0x7fff, maxLevel = 0;
626 getLevelRange(&minLevel, &maxLevel);
627 EXPECT_GT(maxLevel, minLevel);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800628}
629
630TEST_F(EqualizerAudioEffectHidlTest, GetSetBandLevel) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800631 description("Verify that manipulating band levels works for Equalizer effect");
632 uint16_t numBands = 0;
633 getNumBands(&numBands);
634 ASSERT_GT(numBands, 0);
635 int16_t levels[3]{0x7fff, 0, 0};
636 getLevelRange(&levels[0], &levels[2]);
637 ASSERT_GT(levels[2], levels[0]);
638 levels[1] = (levels[2] + levels[0]) / 2;
639 for (uint16_t i = 0; i < numBands; ++i) {
640 for (size_t j = 0; j < ARRAY_SIZE(levels); ++j) {
641 Return<Result> ret = equalizer->setBandLevel(i, levels[j]);
642 EXPECT_TRUE(ret.isOk());
643 EXPECT_EQ(Result::OK, ret);
644 Result retval = Result::NOT_INITIALIZED;
645 int16_t actualLevel;
646 Return<void> ret2 = equalizer->getBandLevel(i, [&](Result r, int16_t l) {
647 retval = r;
648 if (retval == Result::OK) {
649 actualLevel = l;
650 }
651 });
652 EXPECT_TRUE(ret2.isOk());
653 EXPECT_EQ(Result::OK, retval);
654 EXPECT_EQ(levels[j], actualLevel);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800655 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800656 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800657}
658
659TEST_F(EqualizerAudioEffectHidlTest, GetBandCenterFrequencyAndRange) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800660 description("Verify that Equalizer effect reports adequate band frequency range");
661 uint16_t numBands = 0;
662 getNumBands(&numBands);
663 ASSERT_GT(numBands, 0);
664 for (uint16_t i = 0; i < numBands; ++i) {
665 uint32_t minFreq = 0xffffffff, centerFreq = 0xffffffff, maxFreq = 0xffffffff;
666 getBandFrequencyRange(i, &minFreq, &centerFreq, &maxFreq);
667 // Note: NXP legacy implementation reports "1" as upper bound for last band,
668 // so this check fails.
669 EXPECT_GE(maxFreq, centerFreq);
670 EXPECT_GE(centerFreq, minFreq);
671 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800672}
673
674TEST_F(EqualizerAudioEffectHidlTest, GetBandForFrequency) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800675 description("Verify that Equalizer effect supports GetBandForFrequency correctly");
676 uint16_t numBands = 0;
677 getNumBands(&numBands);
678 ASSERT_GT(numBands, 0);
679 for (uint16_t i = 0; i < numBands; ++i) {
680 uint32_t freqs[3]{0, 0, 0};
681 getBandFrequencyRange(i, &freqs[0], &freqs[1], &freqs[2]);
682 // NXP legacy implementation reports "1" as upper bound for last band, some
683 // of the checks fail.
684 for (size_t j = 0; j < ARRAY_SIZE(freqs); ++j) {
685 if (j == 0) {
686 freqs[j]++;
687 } // Min frequency is an open interval.
688 Result retval = Result::NOT_INITIALIZED;
689 uint16_t actualBand = numBands + 1;
690 Return<void> ret = equalizer->getBandForFrequency(freqs[j], [&](Result r, uint16_t b) {
691 retval = r;
692 if (retval == Result::OK) {
693 actualBand = b;
694 }
695 });
696 EXPECT_TRUE(ret.isOk());
697 EXPECT_EQ(Result::OK, retval);
698 EXPECT_EQ(i, actualBand) << "Frequency: " << freqs[j];
699 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800700 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800701}
702
703TEST_F(EqualizerAudioEffectHidlTest, GetPresetNames) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800704 description("Verify that Equalizer effect reports at least one preset");
705 size_t presetCount;
706 getPresetCount(&presetCount);
707 EXPECT_GT(presetCount, 0u);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800708}
709
710TEST_F(EqualizerAudioEffectHidlTest, GetSetCurrentPreset) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800711 description("Verify that manipulating the current preset for Equalizer effect");
712 size_t presetCount;
713 getPresetCount(&presetCount);
714 ASSERT_GT(presetCount, 0u);
715 for (uint16_t i = 0; i < presetCount; ++i) {
716 Return<Result> ret = equalizer->setCurrentPreset(i);
717 EXPECT_TRUE(ret.isOk());
718 EXPECT_EQ(Result::OK, ret);
719 Result retval = Result::NOT_INITIALIZED;
720 uint16_t actualPreset = 0xffff;
721 Return<void> ret2 = equalizer->getCurrentPreset([&](Result r, uint16_t p) {
722 retval = r;
723 if (retval == Result::OK) {
724 actualPreset = p;
725 }
726 });
727 EXPECT_TRUE(ret2.isOk());
728 EXPECT_EQ(Result::OK, retval);
729 EXPECT_EQ(i, actualPreset);
730 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800731}
732
733TEST_F(EqualizerAudioEffectHidlTest, GetSetAllProperties) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800734 description(
735 "Verify that setting band levels and presets works via Get / "
736 "SetAllProperties for Equalizer effect");
737 using AllProperties = android::hardware::audio::effect::V2_0::IEqualizerEffect::AllProperties;
738 uint16_t numBands = 0;
739 getNumBands(&numBands);
740 ASSERT_GT(numBands, 0);
741 AllProperties props;
742 props.bandLevels.resize(numBands);
743 for (size_t i = 0; i < numBands; ++i) {
744 props.bandLevels[i] = 0;
745 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800746
Kevin Rocard55b10612018-11-12 12:33:16 -0800747 AllProperties actualProps;
748 Result retval = Result::NOT_INITIALIZED;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800749
Kevin Rocard55b10612018-11-12 12:33:16 -0800750 // Verify setting of the band levels via properties.
751 props.curPreset = -1;
752 Return<Result> ret = equalizer->setAllProperties(props);
753 EXPECT_TRUE(ret.isOk());
754 EXPECT_EQ(Result::OK, ret);
755 Return<void> ret2 = equalizer->getAllProperties([&](Result r, AllProperties p) {
Mikhail Naganov9f289042017-02-23 08:39:36 -0800756 retval = r;
757 if (retval == Result::OK) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800758 actualProps = p;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800759 }
Kevin Rocard55b10612018-11-12 12:33:16 -0800760 });
761 EXPECT_TRUE(ret2.isOk());
762 EXPECT_EQ(Result::OK, retval);
763 EXPECT_EQ(props.bandLevels, actualProps.bandLevels);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800764
Kevin Rocard55b10612018-11-12 12:33:16 -0800765 // Verify setting of the current preset via properties.
766 props.curPreset = 0; // Assuming there is at least one preset.
767 ret = equalizer->setAllProperties(props);
768 EXPECT_TRUE(ret.isOk());
769 EXPECT_EQ(Result::OK, ret);
770 ret2 = equalizer->getAllProperties([&](Result r, AllProperties p) {
771 retval = r;
772 if (retval == Result::OK) {
773 actualProps = p;
774 }
775 });
776 EXPECT_TRUE(ret2.isOk());
777 EXPECT_EQ(Result::OK, retval);
778 EXPECT_EQ(props.curPreset, actualProps.curPreset);
Mikhail Naganov9f289042017-02-23 08:39:36 -0800779}
780
781// The main test class for Equalizer Audio Effect HIDL HAL.
782class LoudnessEnhancerAudioEffectHidlTest : public AudioEffectHidlTest {
Kevin Rocard55b10612018-11-12 12:33:16 -0800783 public:
784 void SetUp() override {
785 AudioEffectHidlTest::SetUp();
786 enhancer = ILoudnessEnhancerEffect::castFrom(effect);
787 ASSERT_NE(nullptr, enhancer.get());
788 }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800789
Kevin Rocard55b10612018-11-12 12:33:16 -0800790 protected:
791 Uuid getEffectType() override { return LOUDNESS_ENHANCER_EFFECT_TYPE; }
Mikhail Naganov9f289042017-02-23 08:39:36 -0800792
Kevin Rocard55b10612018-11-12 12:33:16 -0800793 sp<ILoudnessEnhancerEffect> enhancer;
Mikhail Naganov9f289042017-02-23 08:39:36 -0800794};
795
796TEST_F(LoudnessEnhancerAudioEffectHidlTest, GetSetTargetGain) {
Kevin Rocard55b10612018-11-12 12:33:16 -0800797 description(
798 "Verify that manipulating the target gain works for Loudness Enhancer "
799 "effect");
800 const int32_t gain = 100;
801 Return<Result> ret = enhancer->setTargetGain(gain);
802 EXPECT_TRUE(ret.isOk());
803 EXPECT_EQ(Result::OK, ret);
804 int32_t actualGain = 0;
805 Result retval;
806 Return<void> ret2 = enhancer->getTargetGain([&](Result r, int32_t g) {
807 retval = r;
808 if (retval == Result::OK) {
809 actualGain = g;
810 }
811 });
812 EXPECT_TRUE(ret2.isOk());
813 EXPECT_EQ(Result::OK, retval);
814 EXPECT_EQ(gain, actualGain);
Mikhail Naganovbf393172016-11-11 16:24:50 -0800815}
Zhuoyao Zhang7dc6ce82018-02-08 12:44:27 -0800816
817int main(int argc, char** argv) {
818 ::testing::AddGlobalTestEnvironment(AudioEffectsFactoryHidlEnvironment::Instance());
819 ::testing::InitGoogleTest(&argc, argv);
820 AudioEffectsFactoryHidlEnvironment::Instance()->init(&argc, argv);
821 int status = RUN_ALL_TESTS();
822 LOG(INFO) << "Test result = " << status;
823 return status;
824}