blob: 72ec3f974335d834b37a17bbc80fbdc551ba04b6 [file] [log] [blame]
Shunkai Yao67b1be62022-07-13 05:01:42 +00001/*
2 * Copyright (C) 2022 The Android Open Source Project
3 *
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
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +000017#define LOG_TAG "VtsHalAudioEffectTargetTest"
18
Shunkai Yao812d5b42022-11-16 18:08:50 +000019#include <chrono>
Shunkai Yao45905172022-08-24 18:14:02 +000020#include <memory>
Shunkai Yao67b1be62022-07-13 05:01:42 +000021#include <string>
Shunkai Yao45905172022-08-24 18:14:02 +000022#include <vector>
Shunkai Yao67b1be62022-07-13 05:01:42 +000023
Shunkai Yao812d5b42022-11-16 18:08:50 +000024#include <Utils.h>
Shunkai Yao67b1be62022-07-13 05:01:42 +000025#include <aidl/Gtest.h>
26#include <aidl/Vintf.h>
Shunkai Yao812d5b42022-11-16 18:08:50 +000027#include <aidl/android/hardware/audio/effect/IEffect.h>
28#include <aidl/android/hardware/audio/effect/IFactory.h>
Shunkai Yao67b1be62022-07-13 05:01:42 +000029#include <android-base/logging.h>
Shunkai Yao67b1be62022-07-13 05:01:42 +000030#include <android/binder_interface_utils.h>
31#include <android/binder_manager.h>
32#include <android/binder_process.h>
Shunkai Yao812d5b42022-11-16 18:08:50 +000033#include <fmq/AidlMessageQueue.h>
Shunkai Yao67b1be62022-07-13 05:01:42 +000034
35#include "AudioHalBinderServiceUtil.h"
Shunkai Yao812d5b42022-11-16 18:08:50 +000036#include "EffectFactoryHelper.h"
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +000037#include "EffectHelper.h"
Shunkai Yao121c6dd2022-09-21 23:42:08 +000038#include "TestUtils.h"
Shunkai Yao67b1be62022-07-13 05:01:42 +000039
40using namespace android;
41
42using ndk::ScopedAStatus;
43
Shunkai Yaoea24c1a2022-09-28 17:39:23 +000044using aidl::android::hardware::audio::effect::CommandId;
Shunkai Yao67b1be62022-07-13 05:01:42 +000045using aidl::android::hardware::audio::effect::Descriptor;
Shunkai Yao45905172022-08-24 18:14:02 +000046using aidl::android::hardware::audio::effect::IEffect;
Shunkai Yao67b1be62022-07-13 05:01:42 +000047using aidl::android::hardware::audio::effect::IFactory;
Shunkai Yaoea24c1a2022-09-28 17:39:23 +000048using aidl::android::hardware::audio::effect::Parameter;
49using aidl::android::hardware::audio::effect::State;
Shunkai Yao5df4e6c2023-01-10 03:20:00 +000050using aidl::android::media::audio::common::AudioDeviceDescription;
51using aidl::android::media::audio::common::AudioDeviceType;
52using aidl::android::media::audio::common::AudioMode;
53using aidl::android::media::audio::common::AudioSource;
Shunkai Yao67b1be62022-07-13 05:01:42 +000054
Shunkai Yao812d5b42022-11-16 18:08:50 +000055enum ParamName { PARAM_INSTANCE_NAME };
Shunkai Yaocb0fc412022-12-15 20:34:32 +000056using EffectTestParam = std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>>;
Shunkai Yao812d5b42022-11-16 18:08:50 +000057
58class AudioEffectTest : public testing::TestWithParam<EffectTestParam>, public EffectHelper {
Shunkai Yao45905172022-08-24 18:14:02 +000059 public:
Shunkai Yaocb0fc412022-12-15 20:34:32 +000060 AudioEffectTest() {
61 std::tie(mFactory, mDescriptor) = std::get<PARAM_INSTANCE_NAME>(GetParam());
62 }
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +000063
Shunkai Yao812d5b42022-11-16 18:08:50 +000064 void SetUp() override {}
Shunkai Yaocb0fc412022-12-15 20:34:32 +000065
66 void TearDown() override {
67 // Do the cleanup for every test case
68 if (mEffect) {
69 ASSERT_NO_FATAL_FAILURE(commandIgnoreRet(mEffect, CommandId::STOP));
70 ASSERT_NO_FATAL_FAILURE(closeIgnoreRet(mEffect));
71 ASSERT_NO_FATAL_FAILURE(destroyIgnoreRet(mFactory, mEffect));
72 mEffect.reset();
73 }
74 }
Shunkai Yao45905172022-08-24 18:14:02 +000075
Shunkai Yao812d5b42022-11-16 18:08:50 +000076 static const long kInputFrameCount = 0x100, kOutputFrameCount = 0x100;
77 std::shared_ptr<IFactory> mFactory;
Shunkai Yaocb0fc412022-12-15 20:34:32 +000078 std::shared_ptr<IEffect> mEffect;
79 Descriptor mDescriptor;
Shunkai Yao5df4e6c2023-01-10 03:20:00 +000080
81 void setAndGetParameter(Parameter::Id id, const Parameter& set) {
82 Parameter get;
83 EXPECT_IS_OK(mEffect->setParameter(set));
84 EXPECT_IS_OK(mEffect->getParameter(id, &get));
Shunkai Yaoeea19942023-02-16 02:31:24 +000085 EXPECT_EQ(set, get) << set.toString() << "\n vs \n" << get.toString();
Shunkai Yao5df4e6c2023-01-10 03:20:00 +000086 }
Shunkai Yao45905172022-08-24 18:14:02 +000087};
88
Shunkai Yao812d5b42022-11-16 18:08:50 +000089TEST_P(AudioEffectTest, SetupAndTearDown) {
90 // Intentionally empty test body.
Shunkai Yao45905172022-08-24 18:14:02 +000091}
92
Shunkai Yao812d5b42022-11-16 18:08:50 +000093TEST_P(AudioEffectTest, CreateAndDestroy) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +000094 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
95 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao45905172022-08-24 18:14:02 +000096}
97
Shunkai Yao812d5b42022-11-16 18:08:50 +000098TEST_P(AudioEffectTest, OpenAndClose) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +000099 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
100 ASSERT_NO_FATAL_FAILURE(open(mEffect));
101 ASSERT_NO_FATAL_FAILURE(close(mEffect));
102 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao45905172022-08-24 18:14:02 +0000103}
104
Shunkai Yao812d5b42022-11-16 18:08:50 +0000105TEST_P(AudioEffectTest, CloseUnopenedEffect) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000106 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
107 ASSERT_NO_FATAL_FAILURE(close(mEffect));
108 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao45905172022-08-24 18:14:02 +0000109}
110
Shunkai Yao812d5b42022-11-16 18:08:50 +0000111TEST_P(AudioEffectTest, DoubleOpenAndClose) {
112 std::shared_ptr<IEffect> effect1, effect2;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000113 ASSERT_NO_FATAL_FAILURE(create(mFactory, effect1, mDescriptor));
114 ASSERT_NO_FATAL_FAILURE(create(mFactory, effect2, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000115 ASSERT_NO_FATAL_FAILURE(open(effect1));
116 ASSERT_NO_FATAL_FAILURE(open(effect2, 1 /* session */));
117 ASSERT_NO_FATAL_FAILURE(close(effect1));
118 ASSERT_NO_FATAL_FAILURE(close(effect2));
119 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, effect1));
120 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, effect2));
Shunkai Yao45905172022-08-24 18:14:02 +0000121}
122
Shunkai Yao812d5b42022-11-16 18:08:50 +0000123TEST_P(AudioEffectTest, TripleOpenAndClose) {
124 std::shared_ptr<IEffect> effect1, effect2, effect3;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000125 ASSERT_NO_FATAL_FAILURE(create(mFactory, effect1, mDescriptor));
126 ASSERT_NO_FATAL_FAILURE(create(mFactory, effect2, mDescriptor));
127 ASSERT_NO_FATAL_FAILURE(create(mFactory, effect3, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000128 ASSERT_NO_FATAL_FAILURE(open(effect1));
129 ASSERT_NO_FATAL_FAILURE(open(effect2, 1 /* session */));
130 ASSERT_NO_FATAL_FAILURE(open(effect3, 2 /* session */));
131 ASSERT_NO_FATAL_FAILURE(close(effect1));
132 ASSERT_NO_FATAL_FAILURE(close(effect2));
133 ASSERT_NO_FATAL_FAILURE(close(effect3));
134 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, effect1));
135 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, effect2));
136 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, effect3));
137}
Shunkai Yao45905172022-08-24 18:14:02 +0000138
Shunkai Yao812d5b42022-11-16 18:08:50 +0000139TEST_P(AudioEffectTest, GetDescritorBeforeOpen) {
Shunkai Yao812d5b42022-11-16 18:08:50 +0000140 Descriptor desc;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000141 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
142 ASSERT_NO_FATAL_FAILURE(getDescriptor(mEffect, desc));
Shunkai Yao4c4f3cd2023-02-28 01:50:40 +0000143 EXPECT_EQ(mDescriptor.common.id.type, desc.common.id.type);
144 EXPECT_EQ(mDescriptor.common.id.uuid, desc.common.id.uuid);
145 EXPECT_EQ(mDescriptor.common.name, desc.common.name);
146 EXPECT_EQ(mDescriptor.common.implementor, desc.common.implementor);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000147 // Effect implementation Must fill in implementor and name
Shunkai Yao812d5b42022-11-16 18:08:50 +0000148 EXPECT_NE("", desc.common.name);
149 EXPECT_NE("", desc.common.implementor);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000150 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000151}
152
153TEST_P(AudioEffectTest, GetDescritorAfterOpen) {
Shunkai Yao812d5b42022-11-16 18:08:50 +0000154 Descriptor beforeOpen, afterOpen, afterClose;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000155 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
156 ASSERT_NO_FATAL_FAILURE(getDescriptor(mEffect, beforeOpen));
157 ASSERT_NO_FATAL_FAILURE(open(mEffect));
158 ASSERT_NO_FATAL_FAILURE(getDescriptor(mEffect, afterOpen));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000159 EXPECT_EQ(beforeOpen.toString(), afterOpen.toString()) << "\n"
160 << beforeOpen.toString() << "\n"
161 << afterOpen.toString();
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000162 ASSERT_NO_FATAL_FAILURE(close(mEffect));
163 ASSERT_NO_FATAL_FAILURE(getDescriptor(mEffect, afterClose));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000164 EXPECT_EQ(beforeOpen.toString(), afterClose.toString()) << "\n"
165 << beforeOpen.toString() << "\n"
166 << afterClose.toString();
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000167 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000168}
169
170TEST_P(AudioEffectTest, DescriptorExistAndUnique) {
Shunkai Yao812d5b42022-11-16 18:08:50 +0000171 Descriptor desc;
172
173 auto descList = EffectFactoryHelper::getAllEffectDescriptors(IFactory::descriptor);
174 std::set<Descriptor::Identity> idSet;
175 for (const auto& it : descList) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000176 auto& id = it.second.common.id;
Shunkai Yao812d5b42022-11-16 18:08:50 +0000177 EXPECT_EQ(0ul, idSet.count(id));
178 idSet.insert(id);
Shunkai Yao45905172022-08-24 18:14:02 +0000179 }
Shunkai Yao812d5b42022-11-16 18:08:50 +0000180
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000181 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
182 ASSERT_NO_FATAL_FAILURE(getDescriptor(mEffect, desc));
Shunkai Yao4c4f3cd2023-02-28 01:50:40 +0000183 int uuidCount = std::count_if(idSet.begin(), idSet.end(), [&](const auto& id) {
184 return id.uuid == desc.common.id.uuid && id.type == desc.common.id.type;
185 });
186
187 EXPECT_EQ(1, uuidCount);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000188 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao45905172022-08-24 18:14:02 +0000189}
190
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000191/// State testing.
192// An effect instance is in INIT state by default after it was created.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000193TEST_P(AudioEffectTest, InitStateAfterCreation) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000194 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
195 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::INIT));
196 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000197}
198
Shunkai Yao812d5b42022-11-16 18:08:50 +0000199// An effect instance transfer to IDLE state after IEffect.ASSERT_NO_FATAL_FAILURE(open().
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000200TEST_P(AudioEffectTest, IdleStateAfterOpen) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000201 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
202 ASSERT_NO_FATAL_FAILURE(open(mEffect));
203 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
204 ASSERT_NO_FATAL_FAILURE(close(mEffect));
205 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000206}
207
208// An effect instance is in PROCESSING state after it receive an START command.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000209TEST_P(AudioEffectTest, ProcessingStateAfterStart) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000210 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
211 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::INIT));
212 ASSERT_NO_FATAL_FAILURE(open(mEffect));
213 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
214 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
215 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
216 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
217 ASSERT_NO_FATAL_FAILURE(close(mEffect));
218 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000219}
220
221// An effect instance transfer to IDLE state after Command.Id.STOP in PROCESSING state.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000222TEST_P(AudioEffectTest, IdleStateAfterStop) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000223 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
224 ASSERT_NO_FATAL_FAILURE(open(mEffect));
225 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
226 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
227 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
228 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
229 ASSERT_NO_FATAL_FAILURE(close(mEffect));
230 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000231}
232
233// An effect instance transfer to IDLE state after Command.Id.RESET in PROCESSING state.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000234TEST_P(AudioEffectTest, IdleStateAfterReset) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000235 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
236 ASSERT_NO_FATAL_FAILURE(open(mEffect));
237 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
238 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
239 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::RESET));
240 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
241 ASSERT_NO_FATAL_FAILURE(close(mEffect));
242 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000243}
244
Shunkai Yao812d5b42022-11-16 18:08:50 +0000245// An effect instance transfer to INIT after IEffect.ASSERT_NO_FATAL_FAILURE(close().
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000246TEST_P(AudioEffectTest, InitStateAfterClose) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000247 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
248 ASSERT_NO_FATAL_FAILURE(open(mEffect));
249 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
250 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
251 ASSERT_NO_FATAL_FAILURE(close(mEffect));
252 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::INIT));
253 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000254}
255
256// An effect instance shouldn't accept any command before open.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000257TEST_P(AudioEffectTest, NoCommandAcceptedBeforeOpen) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000258 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
259 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START, EX_ILLEGAL_STATE));
260 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP, EX_ILLEGAL_STATE));
261 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::RESET, EX_ILLEGAL_STATE));
262 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000263}
264
265// No-op when receive STOP command in IDLE state.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000266TEST_P(AudioEffectTest, StopCommandInIdleStateNoOp) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000267 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
268 ASSERT_NO_FATAL_FAILURE(open(mEffect));
269 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
270 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
271 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
272 ASSERT_NO_FATAL_FAILURE(close(mEffect));
273 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000274}
275
Shunkai Yao812d5b42022-11-16 18:08:50 +0000276// No-op when receive RESET command in IDLE state.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000277TEST_P(AudioEffectTest, ResetCommandInIdleStateNoOp) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000278 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
279 ASSERT_NO_FATAL_FAILURE(open(mEffect));
280 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
281 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::RESET));
282 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
283 ASSERT_NO_FATAL_FAILURE(close(mEffect));
284 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000285}
286
287// Repeat START and STOP command.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000288TEST_P(AudioEffectTest, RepeatStartAndStop) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000289 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
290 ASSERT_NO_FATAL_FAILURE(open(mEffect));
291 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
292 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
293 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
294 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
295 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000296
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000297 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
298 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
299 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
300 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
301 ASSERT_NO_FATAL_FAILURE(close(mEffect));
302 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000303}
304
305// Repeat START and RESET command.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000306TEST_P(AudioEffectTest, RepeatStartAndReset) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000307 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
308 ASSERT_NO_FATAL_FAILURE(open(mEffect));
309 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
310 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
311 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
312 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::RESET));
313 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000314
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000315 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
316 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
317 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::RESET));
318 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
319 ASSERT_NO_FATAL_FAILURE(close(mEffect));
320 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000321}
322
Shunkai Yao812d5b42022-11-16 18:08:50 +0000323// Try to close an effect instance at PROCESSING state.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000324TEST_P(AudioEffectTest, CloseProcessingStateEffects) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000325 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
326 ASSERT_NO_FATAL_FAILURE(open(mEffect));
327 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
328 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
329 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000330
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000331 ASSERT_NO_FATAL_FAILURE(close(mEffect, EX_ILLEGAL_STATE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000332
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000333 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
334 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
335 ASSERT_NO_FATAL_FAILURE(close(mEffect));
336 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000337}
338
339// Expect EX_ILLEGAL_STATE if the effect instance is not in a proper state to be destroyed.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000340TEST_P(AudioEffectTest, DestroyOpenEffects) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000341 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
342 ASSERT_NO_FATAL_FAILURE(open(mEffect));
343 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000344
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000345 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect, EX_ILLEGAL_STATE));
346
347 // cleanup
348 ASSERT_NO_FATAL_FAILURE(close(mEffect));
349 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000350}
351
352// Expect EX_ILLEGAL_STATE if the effect instance is not in a proper state to be destroyed.
353TEST_P(AudioEffectTest, DestroyProcessingEffects) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000354 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
355 ASSERT_NO_FATAL_FAILURE(open(mEffect));
356 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
357 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
358 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000359
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000360 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect, EX_ILLEGAL_STATE));
361
362 // cleanup
363 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
364 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
365 ASSERT_NO_FATAL_FAILURE(close(mEffect));
366 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000367}
368
369TEST_P(AudioEffectTest, NormalSequenceStates) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000370 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
371 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::INIT));
372 ASSERT_NO_FATAL_FAILURE(open(mEffect));
373 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
374 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
375 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
376 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
377 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
378 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
379 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
380 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::RESET));
381 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
382 ASSERT_NO_FATAL_FAILURE(close(mEffect));
383 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000384}
385
386/// Parameter testing.
387// Verify parameters pass in open can be successfully get.
Shunkai Yao812d5b42022-11-16 18:08:50 +0000388TEST_P(AudioEffectTest, VerifyCommonParametersAfterOpen) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000389 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000390
391 Parameter::Common common = EffectHelper::createParamCommon();
392 IEffect::OpenEffectReturn ret;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000393 ASSERT_NO_FATAL_FAILURE(open(mEffect, common, std::nullopt /* specific */, &ret, EX_NONE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000394
395 Parameter get = Parameter(), expect = Parameter();
396 expect.set<Parameter::common>(common);
397 Parameter::Id id;
398 id.set<Parameter::Id::commonTag>(Parameter::common);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000399 EXPECT_IS_OK(mEffect->getParameter(id, &get));
Shunkai Yaoeea19942023-02-16 02:31:24 +0000400 EXPECT_EQ(expect, get) << expect.toString() << "\n vs \n" << get.toString();
Shunkai Yao812d5b42022-11-16 18:08:50 +0000401
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000402 ASSERT_NO_FATAL_FAILURE(close(mEffect));
403 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000404}
405
406// Verify parameters pass in set can be successfully get.
Shunkai Yao812d5b42022-11-16 18:08:50 +0000407TEST_P(AudioEffectTest, SetAndGetCommonParameter) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000408 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
409 ASSERT_NO_FATAL_FAILURE(open(mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000410
411 Parameter::Common common = EffectHelper::createParamCommon(
412 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */);
Shunkai Yao5df4e6c2023-01-10 03:20:00 +0000413 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::common);
414 ASSERT_NO_FATAL_FAILURE(setAndGetParameter(id, Parameter::make<Parameter::common>(common)));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000415
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000416 ASSERT_NO_FATAL_FAILURE(close(mEffect));
417 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000418}
419
Shunkai Yao812d5b42022-11-16 18:08:50 +0000420// Verify parameters set and get in PROCESSING state.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000421TEST_P(AudioEffectTest, SetAndGetParameterInProcessing) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000422 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
423 ASSERT_NO_FATAL_FAILURE(open(mEffect));
424 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
425 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000426
427 Parameter::Common common = EffectHelper::createParamCommon(
428 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */);
Shunkai Yao5df4e6c2023-01-10 03:20:00 +0000429 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::common);
430 ASSERT_NO_FATAL_FAILURE(setAndGetParameter(id, Parameter::make<Parameter::common>(common)));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000431
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000432 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
433 ASSERT_NO_FATAL_FAILURE(close(mEffect));
434 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000435}
436
Shunkai Yao812d5b42022-11-16 18:08:50 +0000437// Verify parameters set and get in IDLE state.
438TEST_P(AudioEffectTest, SetAndGetParameterInIdle) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000439 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
440 ASSERT_NO_FATAL_FAILURE(open(mEffect));
441 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
442 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
443 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
444 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000445
446 Parameter::Common common = EffectHelper::createParamCommon(
447 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */);
Shunkai Yao5df4e6c2023-01-10 03:20:00 +0000448 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::common);
449 ASSERT_NO_FATAL_FAILURE(setAndGetParameter(id, Parameter::make<Parameter::common>(common)));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000450
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000451 ASSERT_NO_FATAL_FAILURE(close(mEffect));
452 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000453}
454
Shunkai Yao812d5b42022-11-16 18:08:50 +0000455// Verify Parameters kept after stop.
456TEST_P(AudioEffectTest, SetAndGetParameterAfterStop) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000457 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
458 ASSERT_NO_FATAL_FAILURE(open(mEffect));
459 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
460 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000461
Shunkai Yao812d5b42022-11-16 18:08:50 +0000462 Parameter::Common common = EffectHelper::createParamCommon(
463 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */);
Shunkai Yao5df4e6c2023-01-10 03:20:00 +0000464 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::common);
465 ASSERT_NO_FATAL_FAILURE(setAndGetParameter(id, Parameter::make<Parameter::common>(common)));
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000466
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000467 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
468 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000469 ASSERT_NO_FATAL_FAILURE(close(mEffect));
470 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000471}
472
Shunkai Yao812d5b42022-11-16 18:08:50 +0000473// Verify Parameters kept after reset.
474TEST_P(AudioEffectTest, SetAndGetParameterAfterReset) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000475 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
476 ASSERT_NO_FATAL_FAILURE(open(mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000477
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000478 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
479 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000480
481 Parameter::Common common = EffectHelper::createParamCommon(
482 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */);
Shunkai Yao5df4e6c2023-01-10 03:20:00 +0000483 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::common);
484 ASSERT_NO_FATAL_FAILURE(setAndGetParameter(id, Parameter::make<Parameter::common>(common)));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000485
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000486 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::RESET));
487 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000488
Shunkai Yao5df4e6c2023-01-10 03:20:00 +0000489 ASSERT_NO_FATAL_FAILURE(setAndGetParameter(id, Parameter::make<Parameter::common>(common)));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000490
Shunkai Yao5df4e6c2023-01-10 03:20:00 +0000491 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
492 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000493 ASSERT_NO_FATAL_FAILURE(close(mEffect));
494 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000495}
Shunkai Yao5df4e6c2023-01-10 03:20:00 +0000496
497// Set and get AudioDeviceDescription in Parameter
498TEST_P(AudioEffectTest, SetAndGetParameterDeviceDescription) {
499 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
500 ASSERT_NO_FATAL_FAILURE(open(mEffect));
501
502 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
503 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
504
505 std::vector<AudioDeviceDescription> deviceDescs = {
506 {.type = AudioDeviceType::IN_DEFAULT,
507 .connection = AudioDeviceDescription::CONNECTION_ANALOG},
508 {.type = AudioDeviceType::IN_DEVICE,
509 .connection = AudioDeviceDescription::CONNECTION_BT_A2DP}};
510 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::deviceDescription);
511 ASSERT_NO_FATAL_FAILURE(
512 setAndGetParameter(id, Parameter::make<Parameter::deviceDescription>(deviceDescs)));
513
514 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
515 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
516 ASSERT_NO_FATAL_FAILURE(close(mEffect));
517 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
518}
519
520// Set and get AudioMode in Parameter
521TEST_P(AudioEffectTest, SetAndGetParameterAudioMode) {
522 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
523 ASSERT_NO_FATAL_FAILURE(open(mEffect));
524
525 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
526 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
527
528 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::mode);
529 ASSERT_NO_FATAL_FAILURE(
530 setAndGetParameter(id, Parameter::make<Parameter::mode>(AudioMode::NORMAL)));
531 ASSERT_NO_FATAL_FAILURE(
532 setAndGetParameter(id, Parameter::make<Parameter::mode>(AudioMode::IN_COMMUNICATION)));
533
534 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
535 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
536 ASSERT_NO_FATAL_FAILURE(close(mEffect));
537 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
538}
539
540// Set and get AudioSource in Parameter
541TEST_P(AudioEffectTest, SetAndGetParameterAudioSource) {
542 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
543 ASSERT_NO_FATAL_FAILURE(open(mEffect));
544
545 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
546 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
547
548 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::source);
549 ASSERT_NO_FATAL_FAILURE(
550 setAndGetParameter(id, Parameter::make<Parameter::source>(AudioSource::DEFAULT)));
551 ASSERT_NO_FATAL_FAILURE(setAndGetParameter(
552 id, Parameter::make<Parameter::source>(AudioSource::VOICE_RECOGNITION)));
553
554 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
555 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
556 ASSERT_NO_FATAL_FAILURE(close(mEffect));
557 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
558}
559
560// Set and get VolumeStereo in Parameter
561TEST_P(AudioEffectTest, SetAndGetParameterVolume) {
562 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
563 ASSERT_NO_FATAL_FAILURE(open(mEffect));
564
565 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
566 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
567
568 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::volumeStereo);
569 Parameter::VolumeStereo volume = {.left = 10.0, .right = 10.0};
570 ASSERT_NO_FATAL_FAILURE(
571 setAndGetParameter(id, Parameter::make<Parameter::volumeStereo>(volume)));
572
573 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
574 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
575 ASSERT_NO_FATAL_FAILURE(close(mEffect));
576 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
577}
578
Shunkai Yao812d5b42022-11-16 18:08:50 +0000579/// Data processing test
580// Send data to effects and expect it to be consumed by checking statusMQ.
581TEST_P(AudioEffectTest, ConsumeDataInProcessingState) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000582 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000583
584 Parameter::Common common = EffectHelper::createParamCommon(
585 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
586 kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
587 IEffect::OpenEffectReturn ret;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000588 ASSERT_NO_FATAL_FAILURE(open(mEffect, common, std::nullopt /* specific */, &ret, EX_NONE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000589 auto statusMQ = std::make_unique<EffectHelper::StatusMQ>(ret.statusMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000590 ASSERT_TRUE(statusMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000591 auto inputMQ = std::make_unique<EffectHelper::DataMQ>(ret.inputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000592 ASSERT_TRUE(inputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000593 auto outputMQ = std::make_unique<EffectHelper::DataMQ>(ret.outputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000594 ASSERT_TRUE(outputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000595
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000596 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
597 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000598
599 std::vector<float> buffer;
Shunkai Yaob49631f2023-02-03 01:44:32 +0000600 EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common, inputMQ, buffer));
601 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(inputMQ, buffer));
602 EXPECT_NO_FATAL_FAILURE(
603 EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000604
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000605 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
606 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000607 EXPECT_NO_FATAL_FAILURE(EffectHelper::readFromFmq(statusMQ, 0, outputMQ, 0, buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000608
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000609 ASSERT_NO_FATAL_FAILURE(close(mEffect));
610 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000611}
612
613// Send data to effects and expect it to be consumed after effect restart.
614TEST_P(AudioEffectTest, ConsumeDataAfterRestart) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000615 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000616
617 Parameter::Common common = EffectHelper::createParamCommon(
618 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
619 kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
620 IEffect::OpenEffectReturn ret;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000621 ASSERT_NO_FATAL_FAILURE(open(mEffect, common, std::nullopt /* specific */, &ret, EX_NONE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000622 auto statusMQ = std::make_unique<EffectHelper::StatusMQ>(ret.statusMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000623 ASSERT_TRUE(statusMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000624 auto inputMQ = std::make_unique<EffectHelper::DataMQ>(ret.inputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000625 ASSERT_TRUE(inputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000626 auto outputMQ = std::make_unique<EffectHelper::DataMQ>(ret.outputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000627 ASSERT_TRUE(outputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000628
Shunkai Yao812d5b42022-11-16 18:08:50 +0000629 std::vector<float> buffer;
Shunkai Yaob49631f2023-02-03 01:44:32 +0000630 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
631 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
632 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
633 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
634 EXPECT_NO_FATAL_FAILURE(
635 EffectHelper::readFromFmq(statusMQ, 0, outputMQ, buffer.size(), buffer));
636 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
637 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
638
639 EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common, inputMQ, buffer));
640 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(inputMQ, buffer));
641 EXPECT_NO_FATAL_FAILURE(
642 EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000643
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000644 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
645 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000646 EXPECT_NO_FATAL_FAILURE(EffectHelper::readFromFmq(statusMQ, 0, outputMQ, 0, buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000647
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000648 ASSERT_NO_FATAL_FAILURE(close(mEffect));
649 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000650}
651
652// Send data to IDLE effects and expect it to be consumed after effect start.
653TEST_P(AudioEffectTest, SendDataAtIdleAndConsumeDataInProcessing) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000654 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000655
656 Parameter::Common common = EffectHelper::createParamCommon(
657 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
658 kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
659 IEffect::OpenEffectReturn ret;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000660 ASSERT_NO_FATAL_FAILURE(open(mEffect, common, std::nullopt /* specific */, &ret, EX_NONE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000661 auto statusMQ = std::make_unique<EffectHelper::StatusMQ>(ret.statusMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000662 ASSERT_TRUE(statusMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000663 auto inputMQ = std::make_unique<EffectHelper::DataMQ>(ret.inputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000664 ASSERT_TRUE(inputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000665 auto outputMQ = std::make_unique<EffectHelper::DataMQ>(ret.outputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000666 ASSERT_TRUE(outputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000667
668 std::vector<float> buffer;
Shunkai Yaob49631f2023-02-03 01:44:32 +0000669 EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common, inputMQ, buffer));
670 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(inputMQ, buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000671
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000672 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
673 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000674
Shunkai Yaob49631f2023-02-03 01:44:32 +0000675 EXPECT_NO_FATAL_FAILURE(
676 EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000677
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000678 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
679 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000680
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000681 ASSERT_NO_FATAL_FAILURE(close(mEffect));
682 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000683}
684
685// Send data multiple times.
686TEST_P(AudioEffectTest, ProcessDataMultipleTimes) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000687 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000688
689 Parameter::Common common = EffectHelper::createParamCommon(
690 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
691 kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
692 IEffect::OpenEffectReturn ret;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000693 ASSERT_NO_FATAL_FAILURE(open(mEffect, common, std::nullopt /* specific */, &ret, EX_NONE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000694 auto statusMQ = std::make_unique<EffectHelper::StatusMQ>(ret.statusMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000695 ASSERT_TRUE(statusMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000696 auto inputMQ = std::make_unique<EffectHelper::DataMQ>(ret.inputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000697 ASSERT_TRUE(inputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000698 auto outputMQ = std::make_unique<EffectHelper::DataMQ>(ret.outputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000699 ASSERT_TRUE(outputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000700
701 std::vector<float> buffer;
Shunkai Yaob49631f2023-02-03 01:44:32 +0000702 EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common, inputMQ, buffer));
703 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(inputMQ, buffer));
704 EXPECT_NO_FATAL_FAILURE(EffectHelper::readFromFmq(statusMQ, 0, outputMQ, 0, buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000705
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000706 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
707 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000708
Shunkai Yaob49631f2023-02-03 01:44:32 +0000709 EXPECT_NO_FATAL_FAILURE(
710 EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000711
Shunkai Yaob49631f2023-02-03 01:44:32 +0000712 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(inputMQ, buffer));
713 EXPECT_NO_FATAL_FAILURE(
714 EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000715
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000716 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
717 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000718 EXPECT_NO_FATAL_FAILURE(EffectHelper::readFromFmq(statusMQ, 0, outputMQ, 0, buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000719
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000720 ASSERT_NO_FATAL_FAILURE(close(mEffect));
721 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000722}
723
Shunkai Yaob49631f2023-02-03 01:44:32 +0000724// Send data to processing state effects, stop, and restart.
725TEST_P(AudioEffectTest, ConsumeDataAndRestart) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000726 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000727
728 Parameter::Common common = EffectHelper::createParamCommon(
729 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
730 kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
731 IEffect::OpenEffectReturn ret;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000732 ASSERT_NO_FATAL_FAILURE(open(mEffect, common, std::nullopt /* specific */, &ret, EX_NONE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000733 auto statusMQ = std::make_unique<EffectHelper::StatusMQ>(ret.statusMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000734 ASSERT_TRUE(statusMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000735 auto inputMQ = std::make_unique<EffectHelper::DataMQ>(ret.inputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000736 ASSERT_TRUE(inputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000737 auto outputMQ = std::make_unique<EffectHelper::DataMQ>(ret.outputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000738 ASSERT_TRUE(outputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000739
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000740 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
741 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000742 std::vector<float> buffer;
743 EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common, inputMQ, buffer));
744 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(inputMQ, buffer));
745 EXPECT_NO_FATAL_FAILURE(
746 EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
747
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000748 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
749 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000750 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(inputMQ, buffer));
751 EXPECT_NO_FATAL_FAILURE(EffectHelper::readFromFmq(statusMQ, 0, outputMQ, 0, buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000752
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000753 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
754 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000755 EXPECT_NO_FATAL_FAILURE(
756 EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000757
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000758 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
759 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000760
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000761 ASSERT_NO_FATAL_FAILURE(close(mEffect));
762 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000763}
764
765// Send data to closed effects and expect it not be consumed.
766TEST_P(AudioEffectTest, NotConsumeDataByClosedEffect) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000767 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000768
769 Parameter::Common common = EffectHelper::createParamCommon(
770 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
771 kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
772 IEffect::OpenEffectReturn ret;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000773 ASSERT_NO_FATAL_FAILURE(open(mEffect, common, std::nullopt /* specific */, &ret, EX_NONE));
774 ASSERT_NO_FATAL_FAILURE(close(mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000775
776 auto statusMQ = std::make_unique<EffectHelper::StatusMQ>(ret.statusMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000777 ASSERT_TRUE(statusMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000778 auto inputMQ = std::make_unique<EffectHelper::DataMQ>(ret.inputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000779 ASSERT_TRUE(inputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000780 auto outputMQ = std::make_unique<EffectHelper::DataMQ>(ret.outputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000781 ASSERT_TRUE(outputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000782
783 std::vector<float> buffer;
Shunkai Yaob49631f2023-02-03 01:44:32 +0000784 EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common, inputMQ, buffer));
785 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(inputMQ, buffer));
786 EXPECT_NO_FATAL_FAILURE(EffectHelper::readFromFmq(statusMQ, 0, outputMQ, 0, buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000787
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000788 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000789}
790
791// Send data to multiple effects.
792TEST_P(AudioEffectTest, ConsumeDataMultipleEffects) {
793 std::shared_ptr<IEffect> effect1, effect2;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000794 ASSERT_NO_FATAL_FAILURE(create(mFactory, effect1, mDescriptor));
795 ASSERT_NO_FATAL_FAILURE(create(mFactory, effect2, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000796
797 Parameter::Common common1 = EffectHelper::createParamCommon(
798 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
799 kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
800 Parameter::Common common2 = EffectHelper::createParamCommon(
801 1 /* session */, 1 /* ioHandle */, 48000 /* iSampleRate */, 48000 /* oSampleRate */,
802 2 * kInputFrameCount /* iFrameCount */, 2 * kOutputFrameCount /* oFrameCount */);
803 IEffect::OpenEffectReturn ret1, ret2;
804 ASSERT_NO_FATAL_FAILURE(open(effect1, common1, std::nullopt /* specific */, &ret1, EX_NONE));
805 ASSERT_NO_FATAL_FAILURE(open(effect2, common2, std::nullopt /* specific */, &ret2, EX_NONE));
806 ASSERT_NO_FATAL_FAILURE(command(effect1, CommandId::START));
807 ASSERT_NO_FATAL_FAILURE(expectState(effect1, State::PROCESSING));
808 ASSERT_NO_FATAL_FAILURE(command(effect2, CommandId::START));
809 ASSERT_NO_FATAL_FAILURE(expectState(effect2, State::PROCESSING));
810
811 auto statusMQ1 = std::make_unique<EffectHelper::StatusMQ>(ret1.statusMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000812 ASSERT_TRUE(statusMQ1->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000813 auto inputMQ1 = std::make_unique<EffectHelper::DataMQ>(ret1.inputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000814 ASSERT_TRUE(inputMQ1->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000815 auto outputMQ1 = std::make_unique<EffectHelper::DataMQ>(ret1.outputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000816 ASSERT_TRUE(outputMQ1->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000817
818 std::vector<float> buffer1, buffer2;
Shunkai Yaob49631f2023-02-03 01:44:32 +0000819 EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common1, inputMQ1, buffer1));
820 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(inputMQ1, buffer1));
821 EXPECT_NO_FATAL_FAILURE(
822 EffectHelper::readFromFmq(statusMQ1, 1, outputMQ1, buffer1.size(), buffer1));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000823
824 auto statusMQ2 = std::make_unique<EffectHelper::StatusMQ>(ret2.statusMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000825 ASSERT_TRUE(statusMQ2->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000826 auto inputMQ2 = std::make_unique<EffectHelper::DataMQ>(ret2.inputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000827 ASSERT_TRUE(inputMQ2->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000828 auto outputMQ2 = std::make_unique<EffectHelper::DataMQ>(ret2.outputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000829 ASSERT_TRUE(outputMQ2->isValid());
Shunkai Yaob49631f2023-02-03 01:44:32 +0000830 EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common2, inputMQ2, buffer2));
831 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(inputMQ2, buffer2));
832 EXPECT_NO_FATAL_FAILURE(
833 EffectHelper::readFromFmq(statusMQ2, 1, outputMQ2, buffer2.size(), buffer2));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000834
835 ASSERT_NO_FATAL_FAILURE(command(effect1, CommandId::STOP));
836 ASSERT_NO_FATAL_FAILURE(expectState(effect1, State::IDLE));
837 ASSERT_NO_FATAL_FAILURE(close(effect1));
838 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, effect1));
839
840 ASSERT_NO_FATAL_FAILURE(command(effect2, CommandId::STOP));
841 ASSERT_NO_FATAL_FAILURE(expectState(effect2, State::IDLE));
842 ASSERT_NO_FATAL_FAILURE(close(effect2));
843 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, effect2));
844}
845
846INSTANTIATE_TEST_SUITE_P(
847 SingleEffectInstanceTest, AudioEffectTest,
848 ::testing::Combine(testing::ValuesIn(
849 EffectFactoryHelper::getAllEffectDescriptors(IFactory::descriptor))),
850 [](const testing::TestParamInfo<AudioEffectTest::ParamType>& info) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000851 auto descriptor = std::get<PARAM_INSTANCE_NAME>(info.param).second;
852 std::string name = "Implementor_" + descriptor.common.implementor + "_name_" +
853 descriptor.common.name + "_TYPE_" +
854 descriptor.common.id.type.toString() + "_UUID_" +
855 descriptor.common.id.uuid.toString();
Shunkai Yao812d5b42022-11-16 18:08:50 +0000856 std::replace_if(
857 name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
858 return name;
859 });
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000860GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(AudioEffectTest);
Shunkai Yao67b1be62022-07-13 05:01:42 +0000861
862int main(int argc, char** argv) {
863 ::testing::InitGoogleTest(&argc, argv);
864 ABinderProcess_setThreadPoolMaxThreadCount(1);
865 ABinderProcess_startThreadPool();
866 return RUN_ALL_TESTS();
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000867}