blob: df66bd3a6caf18bec550e276d6ef4cac391e1af2 [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));
142 EXPECT_EQ(mDescriptor.common, desc.common);
143 // Effect implementation Must fill in implementor and name
Shunkai Yao812d5b42022-11-16 18:08:50 +0000144 EXPECT_NE("", desc.common.name);
145 EXPECT_NE("", desc.common.implementor);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000146 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000147}
148
149TEST_P(AudioEffectTest, GetDescritorAfterOpen) {
Shunkai Yao812d5b42022-11-16 18:08:50 +0000150 Descriptor beforeOpen, afterOpen, afterClose;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000151 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
152 ASSERT_NO_FATAL_FAILURE(getDescriptor(mEffect, beforeOpen));
153 ASSERT_NO_FATAL_FAILURE(open(mEffect));
154 ASSERT_NO_FATAL_FAILURE(getDescriptor(mEffect, afterOpen));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000155 EXPECT_EQ(beforeOpen.toString(), afterOpen.toString()) << "\n"
156 << beforeOpen.toString() << "\n"
157 << afterOpen.toString();
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000158 ASSERT_NO_FATAL_FAILURE(close(mEffect));
159 ASSERT_NO_FATAL_FAILURE(getDescriptor(mEffect, afterClose));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000160 EXPECT_EQ(beforeOpen.toString(), afterClose.toString()) << "\n"
161 << beforeOpen.toString() << "\n"
162 << afterClose.toString();
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000163 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000164}
165
166TEST_P(AudioEffectTest, DescriptorExistAndUnique) {
Shunkai Yao812d5b42022-11-16 18:08:50 +0000167 Descriptor desc;
168
169 auto descList = EffectFactoryHelper::getAllEffectDescriptors(IFactory::descriptor);
170 std::set<Descriptor::Identity> idSet;
171 for (const auto& it : descList) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000172 auto& id = it.second.common.id;
Shunkai Yao812d5b42022-11-16 18:08:50 +0000173 EXPECT_EQ(0ul, idSet.count(id));
174 idSet.insert(id);
Shunkai Yao45905172022-08-24 18:14:02 +0000175 }
Shunkai Yao812d5b42022-11-16 18:08:50 +0000176
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000177 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
178 ASSERT_NO_FATAL_FAILURE(getDescriptor(mEffect, desc));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000179 EXPECT_EQ(1ul, idSet.count(desc.common.id));
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000180 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao45905172022-08-24 18:14:02 +0000181}
182
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000183/// State testing.
184// An effect instance is in INIT state by default after it was created.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000185TEST_P(AudioEffectTest, InitStateAfterCreation) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000186 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
187 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::INIT));
188 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000189}
190
Shunkai Yao812d5b42022-11-16 18:08:50 +0000191// An effect instance transfer to IDLE state after IEffect.ASSERT_NO_FATAL_FAILURE(open().
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000192TEST_P(AudioEffectTest, IdleStateAfterOpen) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000193 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
194 ASSERT_NO_FATAL_FAILURE(open(mEffect));
195 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
196 ASSERT_NO_FATAL_FAILURE(close(mEffect));
197 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000198}
199
200// An effect instance is in PROCESSING state after it receive an START command.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000201TEST_P(AudioEffectTest, ProcessingStateAfterStart) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000202 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
203 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::INIT));
204 ASSERT_NO_FATAL_FAILURE(open(mEffect));
205 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
206 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
207 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
208 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
209 ASSERT_NO_FATAL_FAILURE(close(mEffect));
210 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000211}
212
213// An effect instance transfer to IDLE state after Command.Id.STOP in PROCESSING state.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000214TEST_P(AudioEffectTest, IdleStateAfterStop) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000215 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
216 ASSERT_NO_FATAL_FAILURE(open(mEffect));
217 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
218 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
219 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
220 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
221 ASSERT_NO_FATAL_FAILURE(close(mEffect));
222 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000223}
224
225// An effect instance transfer to IDLE state after Command.Id.RESET in PROCESSING state.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000226TEST_P(AudioEffectTest, IdleStateAfterReset) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000227 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
228 ASSERT_NO_FATAL_FAILURE(open(mEffect));
229 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
230 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
231 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::RESET));
232 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
233 ASSERT_NO_FATAL_FAILURE(close(mEffect));
234 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000235}
236
Shunkai Yao812d5b42022-11-16 18:08:50 +0000237// An effect instance transfer to INIT after IEffect.ASSERT_NO_FATAL_FAILURE(close().
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000238TEST_P(AudioEffectTest, InitStateAfterClose) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000239 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
240 ASSERT_NO_FATAL_FAILURE(open(mEffect));
241 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
242 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
243 ASSERT_NO_FATAL_FAILURE(close(mEffect));
244 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::INIT));
245 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000246}
247
248// An effect instance shouldn't accept any command before open.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000249TEST_P(AudioEffectTest, NoCommandAcceptedBeforeOpen) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000250 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
251 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START, EX_ILLEGAL_STATE));
252 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP, EX_ILLEGAL_STATE));
253 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::RESET, EX_ILLEGAL_STATE));
254 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000255}
256
257// No-op when receive STOP command in IDLE state.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000258TEST_P(AudioEffectTest, StopCommandInIdleStateNoOp) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000259 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
260 ASSERT_NO_FATAL_FAILURE(open(mEffect));
261 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
262 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
263 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
264 ASSERT_NO_FATAL_FAILURE(close(mEffect));
265 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000266}
267
Shunkai Yao812d5b42022-11-16 18:08:50 +0000268// No-op when receive RESET command in IDLE state.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000269TEST_P(AudioEffectTest, ResetCommandInIdleStateNoOp) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000270 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
271 ASSERT_NO_FATAL_FAILURE(open(mEffect));
272 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
273 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::RESET));
274 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
275 ASSERT_NO_FATAL_FAILURE(close(mEffect));
276 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000277}
278
279// Repeat START and STOP command.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000280TEST_P(AudioEffectTest, RepeatStartAndStop) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000281 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
282 ASSERT_NO_FATAL_FAILURE(open(mEffect));
283 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
284 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
285 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
286 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
287 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000288
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000289 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
290 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
291 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
292 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
293 ASSERT_NO_FATAL_FAILURE(close(mEffect));
294 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000295}
296
297// Repeat START and RESET command.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000298TEST_P(AudioEffectTest, RepeatStartAndReset) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000299 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
300 ASSERT_NO_FATAL_FAILURE(open(mEffect));
301 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
302 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
303 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
304 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::RESET));
305 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000306
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000307 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
308 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
309 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::RESET));
310 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
311 ASSERT_NO_FATAL_FAILURE(close(mEffect));
312 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000313}
314
Shunkai Yao812d5b42022-11-16 18:08:50 +0000315// Try to close an effect instance at PROCESSING state.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000316TEST_P(AudioEffectTest, CloseProcessingStateEffects) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000317 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
318 ASSERT_NO_FATAL_FAILURE(open(mEffect));
319 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
320 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
321 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000322
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000323 ASSERT_NO_FATAL_FAILURE(close(mEffect, EX_ILLEGAL_STATE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000324
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000325 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
326 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
327 ASSERT_NO_FATAL_FAILURE(close(mEffect));
328 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000329}
330
331// Expect EX_ILLEGAL_STATE if the effect instance is not in a proper state to be destroyed.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000332TEST_P(AudioEffectTest, DestroyOpenEffects) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000333 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
334 ASSERT_NO_FATAL_FAILURE(open(mEffect));
335 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000336
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000337 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect, EX_ILLEGAL_STATE));
338
339 // cleanup
340 ASSERT_NO_FATAL_FAILURE(close(mEffect));
341 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000342}
343
344// Expect EX_ILLEGAL_STATE if the effect instance is not in a proper state to be destroyed.
345TEST_P(AudioEffectTest, DestroyProcessingEffects) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000346 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
347 ASSERT_NO_FATAL_FAILURE(open(mEffect));
348 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
349 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
350 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000351
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000352 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect, EX_ILLEGAL_STATE));
353
354 // cleanup
355 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
356 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
357 ASSERT_NO_FATAL_FAILURE(close(mEffect));
358 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000359}
360
361TEST_P(AudioEffectTest, NormalSequenceStates) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000362 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
363 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::INIT));
364 ASSERT_NO_FATAL_FAILURE(open(mEffect));
365 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
366 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
367 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
368 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
369 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
370 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
371 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
372 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::RESET));
373 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
374 ASSERT_NO_FATAL_FAILURE(close(mEffect));
375 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000376}
377
378/// Parameter testing.
379// Verify parameters pass in open can be successfully get.
Shunkai Yao812d5b42022-11-16 18:08:50 +0000380TEST_P(AudioEffectTest, VerifyCommonParametersAfterOpen) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000381 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000382
383 Parameter::Common common = EffectHelper::createParamCommon();
384 IEffect::OpenEffectReturn ret;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000385 ASSERT_NO_FATAL_FAILURE(open(mEffect, common, std::nullopt /* specific */, &ret, EX_NONE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000386
387 Parameter get = Parameter(), expect = Parameter();
388 expect.set<Parameter::common>(common);
389 Parameter::Id id;
390 id.set<Parameter::Id::commonTag>(Parameter::common);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000391 EXPECT_IS_OK(mEffect->getParameter(id, &get));
Shunkai Yaoeea19942023-02-16 02:31:24 +0000392 EXPECT_EQ(expect, get) << expect.toString() << "\n vs \n" << get.toString();
Shunkai Yao812d5b42022-11-16 18:08:50 +0000393
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000394 ASSERT_NO_FATAL_FAILURE(close(mEffect));
395 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000396}
397
398// Verify parameters pass in set can be successfully get.
Shunkai Yao812d5b42022-11-16 18:08:50 +0000399TEST_P(AudioEffectTest, SetAndGetCommonParameter) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000400 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
401 ASSERT_NO_FATAL_FAILURE(open(mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000402
403 Parameter::Common common = EffectHelper::createParamCommon(
404 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */);
Shunkai Yao5df4e6c2023-01-10 03:20:00 +0000405 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::common);
406 ASSERT_NO_FATAL_FAILURE(setAndGetParameter(id, Parameter::make<Parameter::common>(common)));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000407
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000408 ASSERT_NO_FATAL_FAILURE(close(mEffect));
409 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000410}
411
Shunkai Yao812d5b42022-11-16 18:08:50 +0000412// Verify parameters set and get in PROCESSING state.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000413TEST_P(AudioEffectTest, SetAndGetParameterInProcessing) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000414 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
415 ASSERT_NO_FATAL_FAILURE(open(mEffect));
416 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
417 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000418
419 Parameter::Common common = EffectHelper::createParamCommon(
420 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */);
Shunkai Yao5df4e6c2023-01-10 03:20:00 +0000421 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::common);
422 ASSERT_NO_FATAL_FAILURE(setAndGetParameter(id, Parameter::make<Parameter::common>(common)));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000423
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000424 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
425 ASSERT_NO_FATAL_FAILURE(close(mEffect));
426 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000427}
428
Shunkai Yao812d5b42022-11-16 18:08:50 +0000429// Verify parameters set and get in IDLE state.
430TEST_P(AudioEffectTest, SetAndGetParameterInIdle) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000431 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
432 ASSERT_NO_FATAL_FAILURE(open(mEffect));
433 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
434 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
435 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
436 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000437
438 Parameter::Common common = EffectHelper::createParamCommon(
439 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */);
Shunkai Yao5df4e6c2023-01-10 03:20:00 +0000440 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::common);
441 ASSERT_NO_FATAL_FAILURE(setAndGetParameter(id, Parameter::make<Parameter::common>(common)));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000442
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000443 ASSERT_NO_FATAL_FAILURE(close(mEffect));
444 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000445}
446
Shunkai Yao812d5b42022-11-16 18:08:50 +0000447// Verify Parameters kept after stop.
448TEST_P(AudioEffectTest, SetAndGetParameterAfterStop) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000449 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
450 ASSERT_NO_FATAL_FAILURE(open(mEffect));
451 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
452 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000453
Shunkai Yao812d5b42022-11-16 18:08:50 +0000454 Parameter::Common common = EffectHelper::createParamCommon(
455 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */);
Shunkai Yao5df4e6c2023-01-10 03:20:00 +0000456 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::common);
457 ASSERT_NO_FATAL_FAILURE(setAndGetParameter(id, Parameter::make<Parameter::common>(common)));
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000458
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000459 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
460 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000461 ASSERT_NO_FATAL_FAILURE(close(mEffect));
462 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000463}
464
Shunkai Yao812d5b42022-11-16 18:08:50 +0000465// Verify Parameters kept after reset.
466TEST_P(AudioEffectTest, SetAndGetParameterAfterReset) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000467 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
468 ASSERT_NO_FATAL_FAILURE(open(mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000469
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000470 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
471 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000472
473 Parameter::Common common = EffectHelper::createParamCommon(
474 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */);
Shunkai Yao5df4e6c2023-01-10 03:20:00 +0000475 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::common);
476 ASSERT_NO_FATAL_FAILURE(setAndGetParameter(id, Parameter::make<Parameter::common>(common)));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000477
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000478 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::RESET));
479 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000480
Shunkai Yao5df4e6c2023-01-10 03:20:00 +0000481 ASSERT_NO_FATAL_FAILURE(setAndGetParameter(id, Parameter::make<Parameter::common>(common)));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000482
Shunkai Yao5df4e6c2023-01-10 03:20:00 +0000483 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
484 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000485 ASSERT_NO_FATAL_FAILURE(close(mEffect));
486 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000487}
Shunkai Yao5df4e6c2023-01-10 03:20:00 +0000488
489// Set and get AudioDeviceDescription in Parameter
490TEST_P(AudioEffectTest, SetAndGetParameterDeviceDescription) {
491 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
492 ASSERT_NO_FATAL_FAILURE(open(mEffect));
493
494 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
495 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
496
497 std::vector<AudioDeviceDescription> deviceDescs = {
498 {.type = AudioDeviceType::IN_DEFAULT,
499 .connection = AudioDeviceDescription::CONNECTION_ANALOG},
500 {.type = AudioDeviceType::IN_DEVICE,
501 .connection = AudioDeviceDescription::CONNECTION_BT_A2DP}};
502 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::deviceDescription);
503 ASSERT_NO_FATAL_FAILURE(
504 setAndGetParameter(id, Parameter::make<Parameter::deviceDescription>(deviceDescs)));
505
506 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
507 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
508 ASSERT_NO_FATAL_FAILURE(close(mEffect));
509 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
510}
511
512// Set and get AudioMode in Parameter
513TEST_P(AudioEffectTest, SetAndGetParameterAudioMode) {
514 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
515 ASSERT_NO_FATAL_FAILURE(open(mEffect));
516
517 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
518 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
519
520 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::mode);
521 ASSERT_NO_FATAL_FAILURE(
522 setAndGetParameter(id, Parameter::make<Parameter::mode>(AudioMode::NORMAL)));
523 ASSERT_NO_FATAL_FAILURE(
524 setAndGetParameter(id, Parameter::make<Parameter::mode>(AudioMode::IN_COMMUNICATION)));
525
526 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
527 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
528 ASSERT_NO_FATAL_FAILURE(close(mEffect));
529 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
530}
531
532// Set and get AudioSource in Parameter
533TEST_P(AudioEffectTest, SetAndGetParameterAudioSource) {
534 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
535 ASSERT_NO_FATAL_FAILURE(open(mEffect));
536
537 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
538 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
539
540 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::source);
541 ASSERT_NO_FATAL_FAILURE(
542 setAndGetParameter(id, Parameter::make<Parameter::source>(AudioSource::DEFAULT)));
543 ASSERT_NO_FATAL_FAILURE(setAndGetParameter(
544 id, Parameter::make<Parameter::source>(AudioSource::VOICE_RECOGNITION)));
545
546 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
547 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
548 ASSERT_NO_FATAL_FAILURE(close(mEffect));
549 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
550}
551
552// Set and get VolumeStereo in Parameter
553TEST_P(AudioEffectTest, SetAndGetParameterVolume) {
554 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
555 ASSERT_NO_FATAL_FAILURE(open(mEffect));
556
557 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
558 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
559
560 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::volumeStereo);
561 Parameter::VolumeStereo volume = {.left = 10.0, .right = 10.0};
562 ASSERT_NO_FATAL_FAILURE(
563 setAndGetParameter(id, Parameter::make<Parameter::volumeStereo>(volume)));
564
565 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
566 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
567 ASSERT_NO_FATAL_FAILURE(close(mEffect));
568 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
569}
570
Shunkai Yao812d5b42022-11-16 18:08:50 +0000571/// Data processing test
572// Send data to effects and expect it to be consumed by checking statusMQ.
573TEST_P(AudioEffectTest, ConsumeDataInProcessingState) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000574 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000575
576 Parameter::Common common = EffectHelper::createParamCommon(
577 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
578 kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
579 IEffect::OpenEffectReturn ret;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000580 ASSERT_NO_FATAL_FAILURE(open(mEffect, common, std::nullopt /* specific */, &ret, EX_NONE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000581 auto statusMQ = std::make_unique<EffectHelper::StatusMQ>(ret.statusMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000582 ASSERT_TRUE(statusMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000583 auto inputMQ = std::make_unique<EffectHelper::DataMQ>(ret.inputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000584 ASSERT_TRUE(inputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000585 auto outputMQ = std::make_unique<EffectHelper::DataMQ>(ret.outputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000586 ASSERT_TRUE(outputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000587
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000588 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
589 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000590
591 std::vector<float> buffer;
Shunkai Yaob49631f2023-02-03 01:44:32 +0000592 EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common, inputMQ, buffer));
593 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(inputMQ, buffer));
594 EXPECT_NO_FATAL_FAILURE(
595 EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000596
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000597 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
598 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000599 EXPECT_NO_FATAL_FAILURE(EffectHelper::readFromFmq(statusMQ, 0, outputMQ, 0, buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000600
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000601 ASSERT_NO_FATAL_FAILURE(close(mEffect));
602 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000603}
604
605// Send data to effects and expect it to be consumed after effect restart.
606TEST_P(AudioEffectTest, ConsumeDataAfterRestart) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000607 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000608
609 Parameter::Common common = EffectHelper::createParamCommon(
610 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
611 kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
612 IEffect::OpenEffectReturn ret;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000613 ASSERT_NO_FATAL_FAILURE(open(mEffect, common, std::nullopt /* specific */, &ret, EX_NONE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000614 auto statusMQ = std::make_unique<EffectHelper::StatusMQ>(ret.statusMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000615 ASSERT_TRUE(statusMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000616 auto inputMQ = std::make_unique<EffectHelper::DataMQ>(ret.inputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000617 ASSERT_TRUE(inputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000618 auto outputMQ = std::make_unique<EffectHelper::DataMQ>(ret.outputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000619 ASSERT_TRUE(outputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000620
Shunkai Yao812d5b42022-11-16 18:08:50 +0000621 std::vector<float> buffer;
Shunkai Yaob49631f2023-02-03 01:44:32 +0000622 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
623 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
624 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
625 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
626 EXPECT_NO_FATAL_FAILURE(
627 EffectHelper::readFromFmq(statusMQ, 0, outputMQ, buffer.size(), buffer));
628 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
629 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
630
631 EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common, inputMQ, buffer));
632 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(inputMQ, buffer));
633 EXPECT_NO_FATAL_FAILURE(
634 EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000635
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000636 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
637 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000638 EXPECT_NO_FATAL_FAILURE(EffectHelper::readFromFmq(statusMQ, 0, outputMQ, 0, buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000639
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000640 ASSERT_NO_FATAL_FAILURE(close(mEffect));
641 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000642}
643
644// Send data to IDLE effects and expect it to be consumed after effect start.
645TEST_P(AudioEffectTest, SendDataAtIdleAndConsumeDataInProcessing) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000646 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000647
648 Parameter::Common common = EffectHelper::createParamCommon(
649 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
650 kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
651 IEffect::OpenEffectReturn ret;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000652 ASSERT_NO_FATAL_FAILURE(open(mEffect, common, std::nullopt /* specific */, &ret, EX_NONE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000653 auto statusMQ = std::make_unique<EffectHelper::StatusMQ>(ret.statusMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000654 ASSERT_TRUE(statusMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000655 auto inputMQ = std::make_unique<EffectHelper::DataMQ>(ret.inputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000656 ASSERT_TRUE(inputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000657 auto outputMQ = std::make_unique<EffectHelper::DataMQ>(ret.outputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000658 ASSERT_TRUE(outputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000659
660 std::vector<float> buffer;
Shunkai Yaob49631f2023-02-03 01:44:32 +0000661 EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common, inputMQ, buffer));
662 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(inputMQ, buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000663
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000664 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
665 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000666
Shunkai Yaob49631f2023-02-03 01:44:32 +0000667 EXPECT_NO_FATAL_FAILURE(
668 EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000669
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000670 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
671 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000672
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000673 ASSERT_NO_FATAL_FAILURE(close(mEffect));
674 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000675}
676
677// Send data multiple times.
678TEST_P(AudioEffectTest, ProcessDataMultipleTimes) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000679 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000680
681 Parameter::Common common = EffectHelper::createParamCommon(
682 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
683 kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
684 IEffect::OpenEffectReturn ret;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000685 ASSERT_NO_FATAL_FAILURE(open(mEffect, common, std::nullopt /* specific */, &ret, EX_NONE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000686 auto statusMQ = std::make_unique<EffectHelper::StatusMQ>(ret.statusMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000687 ASSERT_TRUE(statusMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000688 auto inputMQ = std::make_unique<EffectHelper::DataMQ>(ret.inputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000689 ASSERT_TRUE(inputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000690 auto outputMQ = std::make_unique<EffectHelper::DataMQ>(ret.outputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000691 ASSERT_TRUE(outputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000692
693 std::vector<float> buffer;
Shunkai Yaob49631f2023-02-03 01:44:32 +0000694 EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common, inputMQ, buffer));
695 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(inputMQ, buffer));
696 EXPECT_NO_FATAL_FAILURE(EffectHelper::readFromFmq(statusMQ, 0, outputMQ, 0, buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000697
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000698 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
699 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000700
Shunkai Yaob49631f2023-02-03 01:44:32 +0000701 EXPECT_NO_FATAL_FAILURE(
702 EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000703
Shunkai Yaob49631f2023-02-03 01:44:32 +0000704 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(inputMQ, buffer));
705 EXPECT_NO_FATAL_FAILURE(
706 EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000707
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000708 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
709 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000710 EXPECT_NO_FATAL_FAILURE(EffectHelper::readFromFmq(statusMQ, 0, outputMQ, 0, buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000711
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000712 ASSERT_NO_FATAL_FAILURE(close(mEffect));
713 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000714}
715
Shunkai Yaob49631f2023-02-03 01:44:32 +0000716// Send data to processing state effects, stop, and restart.
717TEST_P(AudioEffectTest, ConsumeDataAndRestart) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000718 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000719
720 Parameter::Common common = EffectHelper::createParamCommon(
721 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
722 kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
723 IEffect::OpenEffectReturn ret;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000724 ASSERT_NO_FATAL_FAILURE(open(mEffect, common, std::nullopt /* specific */, &ret, EX_NONE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000725 auto statusMQ = std::make_unique<EffectHelper::StatusMQ>(ret.statusMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000726 ASSERT_TRUE(statusMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000727 auto inputMQ = std::make_unique<EffectHelper::DataMQ>(ret.inputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000728 ASSERT_TRUE(inputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000729 auto outputMQ = std::make_unique<EffectHelper::DataMQ>(ret.outputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000730 ASSERT_TRUE(outputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000731
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000732 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
733 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000734 std::vector<float> buffer;
735 EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common, inputMQ, buffer));
736 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(inputMQ, buffer));
737 EXPECT_NO_FATAL_FAILURE(
738 EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
739
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000740 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
741 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000742 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(inputMQ, buffer));
743 EXPECT_NO_FATAL_FAILURE(EffectHelper::readFromFmq(statusMQ, 0, outputMQ, 0, buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000744
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000745 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
746 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000747 EXPECT_NO_FATAL_FAILURE(
748 EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000749
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000750 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
751 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000752
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000753 ASSERT_NO_FATAL_FAILURE(close(mEffect));
754 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000755}
756
757// Send data to closed effects and expect it not be consumed.
758TEST_P(AudioEffectTest, NotConsumeDataByClosedEffect) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000759 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000760
761 Parameter::Common common = EffectHelper::createParamCommon(
762 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
763 kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
764 IEffect::OpenEffectReturn ret;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000765 ASSERT_NO_FATAL_FAILURE(open(mEffect, common, std::nullopt /* specific */, &ret, EX_NONE));
766 ASSERT_NO_FATAL_FAILURE(close(mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000767
768 auto statusMQ = std::make_unique<EffectHelper::StatusMQ>(ret.statusMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000769 ASSERT_TRUE(statusMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000770 auto inputMQ = std::make_unique<EffectHelper::DataMQ>(ret.inputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000771 ASSERT_TRUE(inputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000772 auto outputMQ = std::make_unique<EffectHelper::DataMQ>(ret.outputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000773 ASSERT_TRUE(outputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000774
775 std::vector<float> buffer;
Shunkai Yaob49631f2023-02-03 01:44:32 +0000776 EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common, inputMQ, buffer));
777 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(inputMQ, buffer));
778 EXPECT_NO_FATAL_FAILURE(EffectHelper::readFromFmq(statusMQ, 0, outputMQ, 0, buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000779
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000780 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000781}
782
783// Send data to multiple effects.
784TEST_P(AudioEffectTest, ConsumeDataMultipleEffects) {
785 std::shared_ptr<IEffect> effect1, effect2;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000786 ASSERT_NO_FATAL_FAILURE(create(mFactory, effect1, mDescriptor));
787 ASSERT_NO_FATAL_FAILURE(create(mFactory, effect2, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000788
789 Parameter::Common common1 = EffectHelper::createParamCommon(
790 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
791 kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
792 Parameter::Common common2 = EffectHelper::createParamCommon(
793 1 /* session */, 1 /* ioHandle */, 48000 /* iSampleRate */, 48000 /* oSampleRate */,
794 2 * kInputFrameCount /* iFrameCount */, 2 * kOutputFrameCount /* oFrameCount */);
795 IEffect::OpenEffectReturn ret1, ret2;
796 ASSERT_NO_FATAL_FAILURE(open(effect1, common1, std::nullopt /* specific */, &ret1, EX_NONE));
797 ASSERT_NO_FATAL_FAILURE(open(effect2, common2, std::nullopt /* specific */, &ret2, EX_NONE));
798 ASSERT_NO_FATAL_FAILURE(command(effect1, CommandId::START));
799 ASSERT_NO_FATAL_FAILURE(expectState(effect1, State::PROCESSING));
800 ASSERT_NO_FATAL_FAILURE(command(effect2, CommandId::START));
801 ASSERT_NO_FATAL_FAILURE(expectState(effect2, State::PROCESSING));
802
803 auto statusMQ1 = std::make_unique<EffectHelper::StatusMQ>(ret1.statusMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000804 ASSERT_TRUE(statusMQ1->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000805 auto inputMQ1 = std::make_unique<EffectHelper::DataMQ>(ret1.inputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000806 ASSERT_TRUE(inputMQ1->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000807 auto outputMQ1 = std::make_unique<EffectHelper::DataMQ>(ret1.outputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000808 ASSERT_TRUE(outputMQ1->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000809
810 std::vector<float> buffer1, buffer2;
Shunkai Yaob49631f2023-02-03 01:44:32 +0000811 EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common1, inputMQ1, buffer1));
812 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(inputMQ1, buffer1));
813 EXPECT_NO_FATAL_FAILURE(
814 EffectHelper::readFromFmq(statusMQ1, 1, outputMQ1, buffer1.size(), buffer1));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000815
816 auto statusMQ2 = std::make_unique<EffectHelper::StatusMQ>(ret2.statusMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000817 ASSERT_TRUE(statusMQ2->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000818 auto inputMQ2 = std::make_unique<EffectHelper::DataMQ>(ret2.inputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000819 ASSERT_TRUE(inputMQ2->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000820 auto outputMQ2 = std::make_unique<EffectHelper::DataMQ>(ret2.outputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000821 ASSERT_TRUE(outputMQ2->isValid());
Shunkai Yaob49631f2023-02-03 01:44:32 +0000822 EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common2, inputMQ2, buffer2));
823 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(inputMQ2, buffer2));
824 EXPECT_NO_FATAL_FAILURE(
825 EffectHelper::readFromFmq(statusMQ2, 1, outputMQ2, buffer2.size(), buffer2));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000826
827 ASSERT_NO_FATAL_FAILURE(command(effect1, CommandId::STOP));
828 ASSERT_NO_FATAL_FAILURE(expectState(effect1, State::IDLE));
829 ASSERT_NO_FATAL_FAILURE(close(effect1));
830 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, effect1));
831
832 ASSERT_NO_FATAL_FAILURE(command(effect2, CommandId::STOP));
833 ASSERT_NO_FATAL_FAILURE(expectState(effect2, State::IDLE));
834 ASSERT_NO_FATAL_FAILURE(close(effect2));
835 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, effect2));
836}
837
838INSTANTIATE_TEST_SUITE_P(
839 SingleEffectInstanceTest, AudioEffectTest,
840 ::testing::Combine(testing::ValuesIn(
841 EffectFactoryHelper::getAllEffectDescriptors(IFactory::descriptor))),
842 [](const testing::TestParamInfo<AudioEffectTest::ParamType>& info) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000843 auto descriptor = std::get<PARAM_INSTANCE_NAME>(info.param).second;
844 std::string name = "Implementor_" + descriptor.common.implementor + "_name_" +
845 descriptor.common.name + "_TYPE_" +
846 descriptor.common.id.type.toString() + "_UUID_" +
847 descriptor.common.id.uuid.toString();
Shunkai Yao812d5b42022-11-16 18:08:50 +0000848 std::replace_if(
849 name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
850 return name;
851 });
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000852GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(AudioEffectTest);
Shunkai Yao67b1be62022-07-13 05:01:42 +0000853
854int main(int argc, char** argv) {
855 ::testing::InitGoogleTest(&argc, argv);
856 ABinderProcess_setThreadPoolMaxThreadCount(1);
857 ABinderProcess_startThreadPool();
858 return RUN_ALL_TESTS();
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000859}