blob: 436f2a3164ff2a0b08b440267ebc3c8ba751453d [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 Yao67b1be62022-07-13 05:01:42 +000024#include <aidl/Gtest.h>
25#include <aidl/Vintf.h>
Shunkai Yao812d5b42022-11-16 18:08:50 +000026#include <aidl/android/hardware/audio/effect/IEffect.h>
27#include <aidl/android/hardware/audio/effect/IFactory.h>
Shunkai Yao67b1be62022-07-13 05:01:42 +000028#include <android-base/logging.h>
Shunkai Yao67b1be62022-07-13 05:01:42 +000029#include <android/binder_interface_utils.h>
30#include <android/binder_manager.h>
31#include <android/binder_process.h>
Shunkai Yao812d5b42022-11-16 18:08:50 +000032#include <fmq/AidlMessageQueue.h>
Shunkai Yao67b1be62022-07-13 05:01:42 +000033
34#include "AudioHalBinderServiceUtil.h"
Shunkai Yao812d5b42022-11-16 18:08:50 +000035#include "EffectFactoryHelper.h"
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +000036#include "EffectHelper.h"
Shunkai Yao121c6dd2022-09-21 23:42:08 +000037#include "TestUtils.h"
Shunkai Yao67b1be62022-07-13 05:01:42 +000038
39using namespace android;
40
41using ndk::ScopedAStatus;
42
Shunkai Yaoea24c1a2022-09-28 17:39:23 +000043using aidl::android::hardware::audio::effect::CommandId;
Shunkai Yao67b1be62022-07-13 05:01:42 +000044using aidl::android::hardware::audio::effect::Descriptor;
Shunkai Yao45905172022-08-24 18:14:02 +000045using aidl::android::hardware::audio::effect::IEffect;
Shunkai Yao67b1be62022-07-13 05:01:42 +000046using aidl::android::hardware::audio::effect::IFactory;
Shunkai Yaoea24c1a2022-09-28 17:39:23 +000047using aidl::android::hardware::audio::effect::Parameter;
48using aidl::android::hardware::audio::effect::State;
Shunkai Yao5df4e6c2023-01-10 03:20:00 +000049using aidl::android::media::audio::common::AudioDeviceDescription;
50using aidl::android::media::audio::common::AudioDeviceType;
51using aidl::android::media::audio::common::AudioMode;
52using aidl::android::media::audio::common::AudioSource;
Shunkai Yao67b1be62022-07-13 05:01:42 +000053
Shunkai Yao812d5b42022-11-16 18:08:50 +000054enum ParamName { PARAM_INSTANCE_NAME };
Shunkai Yaocb0fc412022-12-15 20:34:32 +000055using EffectTestParam = std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>>;
Shunkai Yao812d5b42022-11-16 18:08:50 +000056
57class AudioEffectTest : public testing::TestWithParam<EffectTestParam>, public EffectHelper {
Shunkai Yao45905172022-08-24 18:14:02 +000058 public:
Shunkai Yaocb0fc412022-12-15 20:34:32 +000059 AudioEffectTest() {
60 std::tie(mFactory, mDescriptor) = std::get<PARAM_INSTANCE_NAME>(GetParam());
61 }
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +000062
Shunkai Yao812d5b42022-11-16 18:08:50 +000063 void SetUp() override {}
Shunkai Yaocb0fc412022-12-15 20:34:32 +000064
65 void TearDown() override {
66 // Do the cleanup for every test case
67 if (mEffect) {
68 ASSERT_NO_FATAL_FAILURE(commandIgnoreRet(mEffect, CommandId::STOP));
69 ASSERT_NO_FATAL_FAILURE(closeIgnoreRet(mEffect));
70 ASSERT_NO_FATAL_FAILURE(destroyIgnoreRet(mFactory, mEffect));
71 mEffect.reset();
72 }
73 }
Shunkai Yao45905172022-08-24 18:14:02 +000074
Shunkai Yao812d5b42022-11-16 18:08:50 +000075 static const long kInputFrameCount = 0x100, kOutputFrameCount = 0x100;
76 std::shared_ptr<IFactory> mFactory;
Shunkai Yaocb0fc412022-12-15 20:34:32 +000077 std::shared_ptr<IEffect> mEffect;
78 Descriptor mDescriptor;
Shunkai Yao5df4e6c2023-01-10 03:20:00 +000079
80 void setAndGetParameter(Parameter::Id id, const Parameter& set) {
81 Parameter get;
82 EXPECT_IS_OK(mEffect->setParameter(set));
83 EXPECT_IS_OK(mEffect->getParameter(id, &get));
Shunkai Yaoeea19942023-02-16 02:31:24 +000084 EXPECT_EQ(set, get) << set.toString() << "\n vs \n" << get.toString();
Shunkai Yao5df4e6c2023-01-10 03:20:00 +000085 }
Shunkai Yao45905172022-08-24 18:14:02 +000086};
87
Shunkai Yao812d5b42022-11-16 18:08:50 +000088TEST_P(AudioEffectTest, SetupAndTearDown) {
89 // Intentionally empty test body.
Shunkai Yao45905172022-08-24 18:14:02 +000090}
91
Shunkai Yao812d5b42022-11-16 18:08:50 +000092TEST_P(AudioEffectTest, CreateAndDestroy) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +000093 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
94 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao45905172022-08-24 18:14:02 +000095}
96
Shunkai Yao812d5b42022-11-16 18:08:50 +000097TEST_P(AudioEffectTest, OpenAndClose) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +000098 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
99 ASSERT_NO_FATAL_FAILURE(open(mEffect));
100 ASSERT_NO_FATAL_FAILURE(close(mEffect));
101 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao45905172022-08-24 18:14:02 +0000102}
103
Shunkai Yao812d5b42022-11-16 18:08:50 +0000104TEST_P(AudioEffectTest, CloseUnopenedEffect) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000105 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
106 ASSERT_NO_FATAL_FAILURE(close(mEffect));
107 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao45905172022-08-24 18:14:02 +0000108}
109
Shunkai Yao812d5b42022-11-16 18:08:50 +0000110TEST_P(AudioEffectTest, DoubleOpenAndClose) {
111 std::shared_ptr<IEffect> effect1, effect2;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000112 ASSERT_NO_FATAL_FAILURE(create(mFactory, effect1, mDescriptor));
113 ASSERT_NO_FATAL_FAILURE(create(mFactory, effect2, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000114 ASSERT_NO_FATAL_FAILURE(open(effect1));
115 ASSERT_NO_FATAL_FAILURE(open(effect2, 1 /* session */));
116 ASSERT_NO_FATAL_FAILURE(close(effect1));
117 ASSERT_NO_FATAL_FAILURE(close(effect2));
118 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, effect1));
119 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, effect2));
Shunkai Yao45905172022-08-24 18:14:02 +0000120}
121
Shunkai Yao812d5b42022-11-16 18:08:50 +0000122TEST_P(AudioEffectTest, TripleOpenAndClose) {
123 std::shared_ptr<IEffect> effect1, effect2, effect3;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000124 ASSERT_NO_FATAL_FAILURE(create(mFactory, effect1, mDescriptor));
125 ASSERT_NO_FATAL_FAILURE(create(mFactory, effect2, mDescriptor));
126 ASSERT_NO_FATAL_FAILURE(create(mFactory, effect3, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000127 ASSERT_NO_FATAL_FAILURE(open(effect1));
128 ASSERT_NO_FATAL_FAILURE(open(effect2, 1 /* session */));
129 ASSERT_NO_FATAL_FAILURE(open(effect3, 2 /* session */));
130 ASSERT_NO_FATAL_FAILURE(close(effect1));
131 ASSERT_NO_FATAL_FAILURE(close(effect2));
132 ASSERT_NO_FATAL_FAILURE(close(effect3));
133 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, effect1));
134 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, effect2));
135 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, effect3));
136}
Shunkai Yao45905172022-08-24 18:14:02 +0000137
Shunkai Yao812d5b42022-11-16 18:08:50 +0000138TEST_P(AudioEffectTest, GetDescritorBeforeOpen) {
Shunkai Yao812d5b42022-11-16 18:08:50 +0000139 Descriptor desc;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000140 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
141 ASSERT_NO_FATAL_FAILURE(getDescriptor(mEffect, desc));
Shunkai Yao4c4f3cd2023-02-28 01:50:40 +0000142 EXPECT_EQ(mDescriptor.common.id.type, desc.common.id.type);
143 EXPECT_EQ(mDescriptor.common.id.uuid, desc.common.id.uuid);
144 EXPECT_EQ(mDescriptor.common.name, desc.common.name);
145 EXPECT_EQ(mDescriptor.common.implementor, desc.common.implementor);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000146 // Effect implementation Must fill in implementor and name
Shunkai Yao812d5b42022-11-16 18:08:50 +0000147 EXPECT_NE("", desc.common.name);
148 EXPECT_NE("", desc.common.implementor);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000149 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000150}
151
152TEST_P(AudioEffectTest, GetDescritorAfterOpen) {
Shunkai Yao812d5b42022-11-16 18:08:50 +0000153 Descriptor beforeOpen, afterOpen, afterClose;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000154 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
155 ASSERT_NO_FATAL_FAILURE(getDescriptor(mEffect, beforeOpen));
156 ASSERT_NO_FATAL_FAILURE(open(mEffect));
157 ASSERT_NO_FATAL_FAILURE(getDescriptor(mEffect, afterOpen));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000158 EXPECT_EQ(beforeOpen.toString(), afterOpen.toString()) << "\n"
159 << beforeOpen.toString() << "\n"
160 << afterOpen.toString();
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000161 ASSERT_NO_FATAL_FAILURE(close(mEffect));
162 ASSERT_NO_FATAL_FAILURE(getDescriptor(mEffect, afterClose));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000163 EXPECT_EQ(beforeOpen.toString(), afterClose.toString()) << "\n"
164 << beforeOpen.toString() << "\n"
165 << afterClose.toString();
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000166 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000167}
168
169TEST_P(AudioEffectTest, DescriptorExistAndUnique) {
Shunkai Yao812d5b42022-11-16 18:08:50 +0000170 Descriptor desc;
171
172 auto descList = EffectFactoryHelper::getAllEffectDescriptors(IFactory::descriptor);
173 std::set<Descriptor::Identity> idSet;
174 for (const auto& it : descList) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000175 auto& id = it.second.common.id;
Shunkai Yao812d5b42022-11-16 18:08:50 +0000176 EXPECT_EQ(0ul, idSet.count(id));
177 idSet.insert(id);
Shunkai Yao45905172022-08-24 18:14:02 +0000178 }
Shunkai Yao812d5b42022-11-16 18:08:50 +0000179
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000180 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
181 ASSERT_NO_FATAL_FAILURE(getDescriptor(mEffect, desc));
Shunkai Yao4c4f3cd2023-02-28 01:50:40 +0000182 int uuidCount = std::count_if(idSet.begin(), idSet.end(), [&](const auto& id) {
183 return id.uuid == desc.common.id.uuid && id.type == desc.common.id.type;
184 });
185
186 EXPECT_EQ(1, uuidCount);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000187 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao45905172022-08-24 18:14:02 +0000188}
189
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000190/// State testing.
191// An effect instance is in INIT state by default after it was created.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000192TEST_P(AudioEffectTest, InitStateAfterCreation) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000193 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
194 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::INIT));
195 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000196}
197
Shunkai Yao812d5b42022-11-16 18:08:50 +0000198// An effect instance transfer to IDLE state after IEffect.ASSERT_NO_FATAL_FAILURE(open().
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000199TEST_P(AudioEffectTest, IdleStateAfterOpen) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000200 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
201 ASSERT_NO_FATAL_FAILURE(open(mEffect));
202 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
203 ASSERT_NO_FATAL_FAILURE(close(mEffect));
204 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000205}
206
207// An effect instance is in PROCESSING state after it receive an START command.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000208TEST_P(AudioEffectTest, ProcessingStateAfterStart) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000209 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
210 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::INIT));
211 ASSERT_NO_FATAL_FAILURE(open(mEffect));
212 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
213 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
214 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
215 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
216 ASSERT_NO_FATAL_FAILURE(close(mEffect));
217 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000218}
219
220// An effect instance transfer to IDLE state after Command.Id.STOP in PROCESSING state.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000221TEST_P(AudioEffectTest, IdleStateAfterStop) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000222 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
223 ASSERT_NO_FATAL_FAILURE(open(mEffect));
224 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
225 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
226 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
227 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
228 ASSERT_NO_FATAL_FAILURE(close(mEffect));
229 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000230}
231
232// An effect instance transfer to IDLE state after Command.Id.RESET in PROCESSING state.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000233TEST_P(AudioEffectTest, IdleStateAfterReset) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000234 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
235 ASSERT_NO_FATAL_FAILURE(open(mEffect));
236 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
237 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
238 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::RESET));
239 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
240 ASSERT_NO_FATAL_FAILURE(close(mEffect));
241 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000242}
243
Shunkai Yao812d5b42022-11-16 18:08:50 +0000244// An effect instance transfer to INIT after IEffect.ASSERT_NO_FATAL_FAILURE(close().
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000245TEST_P(AudioEffectTest, InitStateAfterClose) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000246 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
247 ASSERT_NO_FATAL_FAILURE(open(mEffect));
248 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
249 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
250 ASSERT_NO_FATAL_FAILURE(close(mEffect));
251 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::INIT));
252 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000253}
254
255// An effect instance shouldn't accept any command before open.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000256TEST_P(AudioEffectTest, NoCommandAcceptedBeforeOpen) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000257 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
258 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START, EX_ILLEGAL_STATE));
259 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP, EX_ILLEGAL_STATE));
260 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::RESET, EX_ILLEGAL_STATE));
261 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000262}
263
264// No-op when receive STOP command in IDLE state.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000265TEST_P(AudioEffectTest, StopCommandInIdleStateNoOp) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000266 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
267 ASSERT_NO_FATAL_FAILURE(open(mEffect));
268 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
269 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
270 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
271 ASSERT_NO_FATAL_FAILURE(close(mEffect));
272 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000273}
274
Shunkai Yao812d5b42022-11-16 18:08:50 +0000275// No-op when receive RESET command in IDLE state.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000276TEST_P(AudioEffectTest, ResetCommandInIdleStateNoOp) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000277 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
278 ASSERT_NO_FATAL_FAILURE(open(mEffect));
279 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
280 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::RESET));
281 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
282 ASSERT_NO_FATAL_FAILURE(close(mEffect));
283 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000284}
285
286// Repeat START and STOP command.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000287TEST_P(AudioEffectTest, RepeatStartAndStop) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000288 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
289 ASSERT_NO_FATAL_FAILURE(open(mEffect));
290 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
291 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
292 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
293 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
294 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000295
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000296 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
297 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
298 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
299 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
300 ASSERT_NO_FATAL_FAILURE(close(mEffect));
301 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000302}
303
304// Repeat START and RESET command.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000305TEST_P(AudioEffectTest, RepeatStartAndReset) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000306 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
307 ASSERT_NO_FATAL_FAILURE(open(mEffect));
308 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
309 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
310 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
311 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::RESET));
312 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000313
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000314 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
315 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
316 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::RESET));
317 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
318 ASSERT_NO_FATAL_FAILURE(close(mEffect));
319 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000320}
321
Shunkai Yao812d5b42022-11-16 18:08:50 +0000322// Try to close an effect instance at PROCESSING state.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000323TEST_P(AudioEffectTest, CloseProcessingStateEffects) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000324 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
325 ASSERT_NO_FATAL_FAILURE(open(mEffect));
326 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
327 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
328 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000329
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000330 ASSERT_NO_FATAL_FAILURE(close(mEffect, EX_ILLEGAL_STATE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000331
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000332 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
333 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
334 ASSERT_NO_FATAL_FAILURE(close(mEffect));
335 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000336}
337
338// Expect EX_ILLEGAL_STATE if the effect instance is not in a proper state to be destroyed.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000339TEST_P(AudioEffectTest, DestroyOpenEffects) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000340 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
341 ASSERT_NO_FATAL_FAILURE(open(mEffect));
342 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000343
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000344 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect, EX_ILLEGAL_STATE));
345
346 // cleanup
347 ASSERT_NO_FATAL_FAILURE(close(mEffect));
348 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000349}
350
351// Expect EX_ILLEGAL_STATE if the effect instance is not in a proper state to be destroyed.
352TEST_P(AudioEffectTest, DestroyProcessingEffects) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000353 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
354 ASSERT_NO_FATAL_FAILURE(open(mEffect));
355 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
356 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
357 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000358
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000359 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect, EX_ILLEGAL_STATE));
360
361 // cleanup
362 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
363 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
364 ASSERT_NO_FATAL_FAILURE(close(mEffect));
365 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000366}
367
368TEST_P(AudioEffectTest, NormalSequenceStates) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000369 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
370 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::INIT));
371 ASSERT_NO_FATAL_FAILURE(open(mEffect));
372 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
373 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
374 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
375 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
376 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
377 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
378 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
379 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::RESET));
380 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
381 ASSERT_NO_FATAL_FAILURE(close(mEffect));
382 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000383}
384
385/// Parameter testing.
386// Verify parameters pass in open can be successfully get.
Shunkai Yao812d5b42022-11-16 18:08:50 +0000387TEST_P(AudioEffectTest, VerifyCommonParametersAfterOpen) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000388 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000389
390 Parameter::Common common = EffectHelper::createParamCommon();
391 IEffect::OpenEffectReturn ret;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000392 ASSERT_NO_FATAL_FAILURE(open(mEffect, common, std::nullopt /* specific */, &ret, EX_NONE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000393
394 Parameter get = Parameter(), expect = Parameter();
395 expect.set<Parameter::common>(common);
396 Parameter::Id id;
397 id.set<Parameter::Id::commonTag>(Parameter::common);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000398 EXPECT_IS_OK(mEffect->getParameter(id, &get));
Shunkai Yaoeea19942023-02-16 02:31:24 +0000399 EXPECT_EQ(expect, get) << expect.toString() << "\n vs \n" << get.toString();
Shunkai Yao812d5b42022-11-16 18:08:50 +0000400
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000401 ASSERT_NO_FATAL_FAILURE(close(mEffect));
402 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000403}
404
405// Verify parameters pass in set can be successfully get.
Shunkai Yao812d5b42022-11-16 18:08:50 +0000406TEST_P(AudioEffectTest, SetAndGetCommonParameter) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000407 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
408 ASSERT_NO_FATAL_FAILURE(open(mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000409
410 Parameter::Common common = EffectHelper::createParamCommon(
411 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */);
Shunkai Yao5df4e6c2023-01-10 03:20:00 +0000412 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::common);
413 ASSERT_NO_FATAL_FAILURE(setAndGetParameter(id, Parameter::make<Parameter::common>(common)));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000414
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000415 ASSERT_NO_FATAL_FAILURE(close(mEffect));
416 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000417}
418
Shunkai Yao812d5b42022-11-16 18:08:50 +0000419// Verify parameters set and get in PROCESSING state.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000420TEST_P(AudioEffectTest, SetAndGetParameterInProcessing) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000421 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
422 ASSERT_NO_FATAL_FAILURE(open(mEffect));
423 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
424 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000425
426 Parameter::Common common = EffectHelper::createParamCommon(
427 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */);
Shunkai Yao5df4e6c2023-01-10 03:20:00 +0000428 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::common);
429 ASSERT_NO_FATAL_FAILURE(setAndGetParameter(id, Parameter::make<Parameter::common>(common)));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000430
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000431 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
432 ASSERT_NO_FATAL_FAILURE(close(mEffect));
433 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000434}
435
Shunkai Yao812d5b42022-11-16 18:08:50 +0000436// Verify parameters set and get in IDLE state.
437TEST_P(AudioEffectTest, SetAndGetParameterInIdle) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000438 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
439 ASSERT_NO_FATAL_FAILURE(open(mEffect));
440 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
441 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
442 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
443 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000444
445 Parameter::Common common = EffectHelper::createParamCommon(
446 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */);
Shunkai Yao5df4e6c2023-01-10 03:20:00 +0000447 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::common);
448 ASSERT_NO_FATAL_FAILURE(setAndGetParameter(id, Parameter::make<Parameter::common>(common)));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000449
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000450 ASSERT_NO_FATAL_FAILURE(close(mEffect));
451 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000452}
453
Shunkai Yao812d5b42022-11-16 18:08:50 +0000454// Verify Parameters kept after stop.
455TEST_P(AudioEffectTest, SetAndGetParameterAfterStop) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000456 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
457 ASSERT_NO_FATAL_FAILURE(open(mEffect));
458 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
459 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000460
Shunkai Yao812d5b42022-11-16 18:08:50 +0000461 Parameter::Common common = EffectHelper::createParamCommon(
462 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */);
Shunkai Yao5df4e6c2023-01-10 03:20:00 +0000463 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::common);
464 ASSERT_NO_FATAL_FAILURE(setAndGetParameter(id, Parameter::make<Parameter::common>(common)));
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000465
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000466 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
467 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000468 ASSERT_NO_FATAL_FAILURE(close(mEffect));
469 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000470}
471
Shunkai Yao812d5b42022-11-16 18:08:50 +0000472// Verify Parameters kept after reset.
473TEST_P(AudioEffectTest, SetAndGetParameterAfterReset) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000474 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
475 ASSERT_NO_FATAL_FAILURE(open(mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000476
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000477 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
478 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000479
480 Parameter::Common common = EffectHelper::createParamCommon(
481 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */);
Shunkai Yao5df4e6c2023-01-10 03:20:00 +0000482 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::common);
483 ASSERT_NO_FATAL_FAILURE(setAndGetParameter(id, Parameter::make<Parameter::common>(common)));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000484
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000485 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::RESET));
486 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000487
Shunkai Yao5df4e6c2023-01-10 03:20:00 +0000488 ASSERT_NO_FATAL_FAILURE(setAndGetParameter(id, Parameter::make<Parameter::common>(common)));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000489
Shunkai Yao5df4e6c2023-01-10 03:20:00 +0000490 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
491 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000492 ASSERT_NO_FATAL_FAILURE(close(mEffect));
493 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000494}
Shunkai Yao5df4e6c2023-01-10 03:20:00 +0000495
496// Set and get AudioDeviceDescription in Parameter
497TEST_P(AudioEffectTest, SetAndGetParameterDeviceDescription) {
498 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
499 ASSERT_NO_FATAL_FAILURE(open(mEffect));
500
501 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
502 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
503
504 std::vector<AudioDeviceDescription> deviceDescs = {
505 {.type = AudioDeviceType::IN_DEFAULT,
506 .connection = AudioDeviceDescription::CONNECTION_ANALOG},
507 {.type = AudioDeviceType::IN_DEVICE,
508 .connection = AudioDeviceDescription::CONNECTION_BT_A2DP}};
509 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::deviceDescription);
510 ASSERT_NO_FATAL_FAILURE(
511 setAndGetParameter(id, Parameter::make<Parameter::deviceDescription>(deviceDescs)));
512
513 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
514 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
515 ASSERT_NO_FATAL_FAILURE(close(mEffect));
516 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
517}
518
519// Set and get AudioMode in Parameter
520TEST_P(AudioEffectTest, SetAndGetParameterAudioMode) {
521 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
522 ASSERT_NO_FATAL_FAILURE(open(mEffect));
523
524 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
525 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
526
527 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::mode);
528 ASSERT_NO_FATAL_FAILURE(
529 setAndGetParameter(id, Parameter::make<Parameter::mode>(AudioMode::NORMAL)));
530 ASSERT_NO_FATAL_FAILURE(
531 setAndGetParameter(id, Parameter::make<Parameter::mode>(AudioMode::IN_COMMUNICATION)));
532
533 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
534 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
535 ASSERT_NO_FATAL_FAILURE(close(mEffect));
536 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
537}
538
539// Set and get AudioSource in Parameter
540TEST_P(AudioEffectTest, SetAndGetParameterAudioSource) {
541 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
542 ASSERT_NO_FATAL_FAILURE(open(mEffect));
543
544 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
545 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
546
547 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::source);
548 ASSERT_NO_FATAL_FAILURE(
549 setAndGetParameter(id, Parameter::make<Parameter::source>(AudioSource::DEFAULT)));
550 ASSERT_NO_FATAL_FAILURE(setAndGetParameter(
551 id, Parameter::make<Parameter::source>(AudioSource::VOICE_RECOGNITION)));
552
553 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
554 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
555 ASSERT_NO_FATAL_FAILURE(close(mEffect));
556 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
557}
558
559// Set and get VolumeStereo in Parameter
560TEST_P(AudioEffectTest, SetAndGetParameterVolume) {
561 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
562 ASSERT_NO_FATAL_FAILURE(open(mEffect));
563
564 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
565 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
566
567 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::volumeStereo);
568 Parameter::VolumeStereo volume = {.left = 10.0, .right = 10.0};
569 ASSERT_NO_FATAL_FAILURE(
570 setAndGetParameter(id, Parameter::make<Parameter::volumeStereo>(volume)));
571
572 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
573 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
574 ASSERT_NO_FATAL_FAILURE(close(mEffect));
575 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
576}
577
Shunkai Yao812d5b42022-11-16 18:08:50 +0000578/// Data processing test
579// Send data to effects and expect it to be consumed by checking statusMQ.
580TEST_P(AudioEffectTest, ConsumeDataInProcessingState) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000581 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000582
583 Parameter::Common common = EffectHelper::createParamCommon(
584 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
585 kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
586 IEffect::OpenEffectReturn ret;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000587 ASSERT_NO_FATAL_FAILURE(open(mEffect, common, std::nullopt /* specific */, &ret, EX_NONE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000588 auto statusMQ = std::make_unique<EffectHelper::StatusMQ>(ret.statusMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000589 ASSERT_TRUE(statusMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000590 auto inputMQ = std::make_unique<EffectHelper::DataMQ>(ret.inputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000591 ASSERT_TRUE(inputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000592 auto outputMQ = std::make_unique<EffectHelper::DataMQ>(ret.outputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000593 ASSERT_TRUE(outputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000594
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000595 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
596 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000597
598 std::vector<float> buffer;
Shunkai Yaob49631f2023-02-03 01:44:32 +0000599 EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common, inputMQ, buffer));
Shunkai Yao41888a22023-04-10 17:13:30 +0000600 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(statusMQ, inputMQ, buffer));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000601 EXPECT_NO_FATAL_FAILURE(
602 EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000603
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000604 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
605 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000606 EXPECT_NO_FATAL_FAILURE(EffectHelper::readFromFmq(statusMQ, 0, outputMQ, 0, buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000607
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000608 ASSERT_NO_FATAL_FAILURE(close(mEffect));
609 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000610}
611
612// Send data to effects and expect it to be consumed after effect restart.
613TEST_P(AudioEffectTest, ConsumeDataAfterRestart) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000614 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000615
616 Parameter::Common common = EffectHelper::createParamCommon(
617 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
618 kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
619 IEffect::OpenEffectReturn ret;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000620 ASSERT_NO_FATAL_FAILURE(open(mEffect, common, std::nullopt /* specific */, &ret, EX_NONE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000621 auto statusMQ = std::make_unique<EffectHelper::StatusMQ>(ret.statusMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000622 ASSERT_TRUE(statusMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000623 auto inputMQ = std::make_unique<EffectHelper::DataMQ>(ret.inputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000624 ASSERT_TRUE(inputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000625 auto outputMQ = std::make_unique<EffectHelper::DataMQ>(ret.outputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000626 ASSERT_TRUE(outputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000627
Shunkai Yao812d5b42022-11-16 18:08:50 +0000628 std::vector<float> buffer;
Shunkai Yaob49631f2023-02-03 01:44:32 +0000629 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
630 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
631 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
632 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
633 EXPECT_NO_FATAL_FAILURE(
634 EffectHelper::readFromFmq(statusMQ, 0, outputMQ, buffer.size(), buffer));
635 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
636 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
637
638 EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common, inputMQ, buffer));
Shunkai Yao41888a22023-04-10 17:13:30 +0000639 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(statusMQ, inputMQ, buffer));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000640 EXPECT_NO_FATAL_FAILURE(
641 EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000642
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000643 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
644 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000645 EXPECT_NO_FATAL_FAILURE(EffectHelper::readFromFmq(statusMQ, 0, outputMQ, 0, buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000646
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000647 ASSERT_NO_FATAL_FAILURE(close(mEffect));
648 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000649}
650
651// Send data to IDLE effects and expect it to be consumed after effect start.
652TEST_P(AudioEffectTest, SendDataAtIdleAndConsumeDataInProcessing) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000653 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000654
655 Parameter::Common common = EffectHelper::createParamCommon(
656 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
657 kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
658 IEffect::OpenEffectReturn ret;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000659 ASSERT_NO_FATAL_FAILURE(open(mEffect, common, std::nullopt /* specific */, &ret, EX_NONE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000660 auto statusMQ = std::make_unique<EffectHelper::StatusMQ>(ret.statusMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000661 ASSERT_TRUE(statusMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000662 auto inputMQ = std::make_unique<EffectHelper::DataMQ>(ret.inputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000663 ASSERT_TRUE(inputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000664 auto outputMQ = std::make_unique<EffectHelper::DataMQ>(ret.outputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000665 ASSERT_TRUE(outputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000666
667 std::vector<float> buffer;
Shunkai Yaob49631f2023-02-03 01:44:32 +0000668 EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common, inputMQ, buffer));
Shunkai Yao41888a22023-04-10 17:13:30 +0000669 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(statusMQ, inputMQ, buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000670
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000671 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
672 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000673
Shunkai Yaob49631f2023-02-03 01:44:32 +0000674 EXPECT_NO_FATAL_FAILURE(
675 EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000676
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000677 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
678 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000679
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000680 ASSERT_NO_FATAL_FAILURE(close(mEffect));
681 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000682}
683
684// Send data multiple times.
685TEST_P(AudioEffectTest, ProcessDataMultipleTimes) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000686 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000687
688 Parameter::Common common = EffectHelper::createParamCommon(
689 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
690 kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
691 IEffect::OpenEffectReturn ret;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000692 ASSERT_NO_FATAL_FAILURE(open(mEffect, common, std::nullopt /* specific */, &ret, EX_NONE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000693 auto statusMQ = std::make_unique<EffectHelper::StatusMQ>(ret.statusMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000694 ASSERT_TRUE(statusMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000695 auto inputMQ = std::make_unique<EffectHelper::DataMQ>(ret.inputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000696 ASSERT_TRUE(inputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000697 auto outputMQ = std::make_unique<EffectHelper::DataMQ>(ret.outputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000698 ASSERT_TRUE(outputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000699
700 std::vector<float> buffer;
Shunkai Yaob49631f2023-02-03 01:44:32 +0000701 EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common, inputMQ, buffer));
Shunkai Yao41888a22023-04-10 17:13:30 +0000702 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(statusMQ, inputMQ, buffer));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000703 EXPECT_NO_FATAL_FAILURE(EffectHelper::readFromFmq(statusMQ, 0, outputMQ, 0, buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000704
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000705 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
706 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000707
Shunkai Yaob49631f2023-02-03 01:44:32 +0000708 EXPECT_NO_FATAL_FAILURE(
709 EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000710
Shunkai Yao41888a22023-04-10 17:13:30 +0000711 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(statusMQ, inputMQ, buffer));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000712 EXPECT_NO_FATAL_FAILURE(
713 EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000714
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000715 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
716 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000717 EXPECT_NO_FATAL_FAILURE(EffectHelper::readFromFmq(statusMQ, 0, outputMQ, 0, buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000718
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000719 ASSERT_NO_FATAL_FAILURE(close(mEffect));
720 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000721}
722
Shunkai Yaob49631f2023-02-03 01:44:32 +0000723// Send data to processing state effects, stop, and restart.
724TEST_P(AudioEffectTest, ConsumeDataAndRestart) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000725 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000726
727 Parameter::Common common = EffectHelper::createParamCommon(
728 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
729 kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
730 IEffect::OpenEffectReturn ret;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000731 ASSERT_NO_FATAL_FAILURE(open(mEffect, common, std::nullopt /* specific */, &ret, EX_NONE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000732 auto statusMQ = std::make_unique<EffectHelper::StatusMQ>(ret.statusMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000733 ASSERT_TRUE(statusMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000734 auto inputMQ = std::make_unique<EffectHelper::DataMQ>(ret.inputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000735 ASSERT_TRUE(inputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000736 auto outputMQ = std::make_unique<EffectHelper::DataMQ>(ret.outputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000737 ASSERT_TRUE(outputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000738
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000739 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
740 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000741 std::vector<float> buffer;
742 EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common, inputMQ, buffer));
Shunkai Yao41888a22023-04-10 17:13:30 +0000743 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(statusMQ, inputMQ, buffer));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000744 EXPECT_NO_FATAL_FAILURE(
745 EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
746
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000747 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
748 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yao41888a22023-04-10 17:13:30 +0000749 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(statusMQ, inputMQ, buffer));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000750 EXPECT_NO_FATAL_FAILURE(EffectHelper::readFromFmq(statusMQ, 0, outputMQ, 0, buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000751
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000752 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
753 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000754 EXPECT_NO_FATAL_FAILURE(
755 EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000756
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000757 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
758 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000759
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000760 ASSERT_NO_FATAL_FAILURE(close(mEffect));
761 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000762}
763
764// Send data to closed effects and expect it not be consumed.
765TEST_P(AudioEffectTest, NotConsumeDataByClosedEffect) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000766 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000767
768 Parameter::Common common = EffectHelper::createParamCommon(
769 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
770 kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
771 IEffect::OpenEffectReturn ret;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000772 ASSERT_NO_FATAL_FAILURE(open(mEffect, common, std::nullopt /* specific */, &ret, EX_NONE));
773 ASSERT_NO_FATAL_FAILURE(close(mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000774
775 auto statusMQ = std::make_unique<EffectHelper::StatusMQ>(ret.statusMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000776 ASSERT_TRUE(statusMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000777 auto inputMQ = std::make_unique<EffectHelper::DataMQ>(ret.inputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000778 ASSERT_TRUE(inputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000779 auto outputMQ = std::make_unique<EffectHelper::DataMQ>(ret.outputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000780 ASSERT_TRUE(outputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000781
782 std::vector<float> buffer;
Shunkai Yaob49631f2023-02-03 01:44:32 +0000783 EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common, inputMQ, buffer));
Shunkai Yao41888a22023-04-10 17:13:30 +0000784 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(statusMQ, inputMQ, buffer));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000785 EXPECT_NO_FATAL_FAILURE(EffectHelper::readFromFmq(statusMQ, 0, outputMQ, 0, buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000786
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000787 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000788}
789
790// Send data to multiple effects.
791TEST_P(AudioEffectTest, ConsumeDataMultipleEffects) {
792 std::shared_ptr<IEffect> effect1, effect2;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000793 ASSERT_NO_FATAL_FAILURE(create(mFactory, effect1, mDescriptor));
794 ASSERT_NO_FATAL_FAILURE(create(mFactory, effect2, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000795
796 Parameter::Common common1 = EffectHelper::createParamCommon(
797 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
798 kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
799 Parameter::Common common2 = EffectHelper::createParamCommon(
800 1 /* session */, 1 /* ioHandle */, 48000 /* iSampleRate */, 48000 /* oSampleRate */,
801 2 * kInputFrameCount /* iFrameCount */, 2 * kOutputFrameCount /* oFrameCount */);
802 IEffect::OpenEffectReturn ret1, ret2;
803 ASSERT_NO_FATAL_FAILURE(open(effect1, common1, std::nullopt /* specific */, &ret1, EX_NONE));
804 ASSERT_NO_FATAL_FAILURE(open(effect2, common2, std::nullopt /* specific */, &ret2, EX_NONE));
805 ASSERT_NO_FATAL_FAILURE(command(effect1, CommandId::START));
806 ASSERT_NO_FATAL_FAILURE(expectState(effect1, State::PROCESSING));
807 ASSERT_NO_FATAL_FAILURE(command(effect2, CommandId::START));
808 ASSERT_NO_FATAL_FAILURE(expectState(effect2, State::PROCESSING));
809
810 auto statusMQ1 = std::make_unique<EffectHelper::StatusMQ>(ret1.statusMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000811 ASSERT_TRUE(statusMQ1->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000812 auto inputMQ1 = std::make_unique<EffectHelper::DataMQ>(ret1.inputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000813 ASSERT_TRUE(inputMQ1->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000814 auto outputMQ1 = std::make_unique<EffectHelper::DataMQ>(ret1.outputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000815 ASSERT_TRUE(outputMQ1->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000816
817 std::vector<float> buffer1, buffer2;
Shunkai Yaob49631f2023-02-03 01:44:32 +0000818 EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common1, inputMQ1, buffer1));
Shunkai Yao41888a22023-04-10 17:13:30 +0000819 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(statusMQ1, inputMQ1, buffer1));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000820 EXPECT_NO_FATAL_FAILURE(
821 EffectHelper::readFromFmq(statusMQ1, 1, outputMQ1, buffer1.size(), buffer1));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000822
823 auto statusMQ2 = std::make_unique<EffectHelper::StatusMQ>(ret2.statusMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000824 ASSERT_TRUE(statusMQ2->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000825 auto inputMQ2 = std::make_unique<EffectHelper::DataMQ>(ret2.inputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000826 ASSERT_TRUE(inputMQ2->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000827 auto outputMQ2 = std::make_unique<EffectHelper::DataMQ>(ret2.outputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000828 ASSERT_TRUE(outputMQ2->isValid());
Shunkai Yaob49631f2023-02-03 01:44:32 +0000829 EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common2, inputMQ2, buffer2));
Shunkai Yao41888a22023-04-10 17:13:30 +0000830 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(statusMQ2, inputMQ2, buffer2));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000831 EXPECT_NO_FATAL_FAILURE(
832 EffectHelper::readFromFmq(statusMQ2, 1, outputMQ2, buffer2.size(), buffer2));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000833
834 ASSERT_NO_FATAL_FAILURE(command(effect1, CommandId::STOP));
835 ASSERT_NO_FATAL_FAILURE(expectState(effect1, State::IDLE));
836 ASSERT_NO_FATAL_FAILURE(close(effect1));
837 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, effect1));
838
839 ASSERT_NO_FATAL_FAILURE(command(effect2, CommandId::STOP));
840 ASSERT_NO_FATAL_FAILURE(expectState(effect2, State::IDLE));
841 ASSERT_NO_FATAL_FAILURE(close(effect2));
842 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, effect2));
843}
844
845INSTANTIATE_TEST_SUITE_P(
846 SingleEffectInstanceTest, AudioEffectTest,
847 ::testing::Combine(testing::ValuesIn(
848 EffectFactoryHelper::getAllEffectDescriptors(IFactory::descriptor))),
849 [](const testing::TestParamInfo<AudioEffectTest::ParamType>& info) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000850 auto descriptor = std::get<PARAM_INSTANCE_NAME>(info.param).second;
851 std::string name = "Implementor_" + descriptor.common.implementor + "_name_" +
852 descriptor.common.name + "_TYPE_" +
853 descriptor.common.id.type.toString() + "_UUID_" +
854 descriptor.common.id.uuid.toString();
Shunkai Yao812d5b42022-11-16 18:08:50 +0000855 std::replace_if(
856 name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
857 return name;
858 });
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000859GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(AudioEffectTest);
Shunkai Yao67b1be62022-07-13 05:01:42 +0000860
861int main(int argc, char** argv) {
862 ::testing::InitGoogleTest(&argc, argv);
863 ABinderProcess_setThreadPoolMaxThreadCount(1);
864 ABinderProcess_startThreadPool();
865 return RUN_ALL_TESTS();
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000866}