blob: 947d30ed8d089c093a11aa3704da2dbf99462c68 [file] [log] [blame]
Shunkai Yao67b1be62022-07-13 05:01:42 +00001/*
2 * Copyright (C) 2022 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +000017#define LOG_TAG "VtsHalAudioEffectTargetTest"
18
Shunkai Yao812d5b42022-11-16 18:08:50 +000019#include <chrono>
Shunkai Yao45905172022-08-24 18:14:02 +000020#include <memory>
Shunkai Yao67b1be62022-07-13 05:01:42 +000021#include <string>
Shunkai Yao45905172022-08-24 18:14:02 +000022#include <vector>
Shunkai Yao67b1be62022-07-13 05:01:42 +000023
Shunkai Yao812d5b42022-11-16 18:08:50 +000024#include <Utils.h>
Shunkai Yao67b1be62022-07-13 05:01:42 +000025#include <aidl/Gtest.h>
26#include <aidl/Vintf.h>
Shunkai Yao812d5b42022-11-16 18:08:50 +000027#include <aidl/android/hardware/audio/effect/IEffect.h>
28#include <aidl/android/hardware/audio/effect/IFactory.h>
Shunkai Yao67b1be62022-07-13 05:01:42 +000029#include <android-base/logging.h>
Shunkai Yao67b1be62022-07-13 05:01:42 +000030#include <android/binder_interface_utils.h>
31#include <android/binder_manager.h>
32#include <android/binder_process.h>
Shunkai Yao812d5b42022-11-16 18:08:50 +000033#include <fmq/AidlMessageQueue.h>
Shunkai Yao67b1be62022-07-13 05:01:42 +000034
35#include "AudioHalBinderServiceUtil.h"
Shunkai Yao812d5b42022-11-16 18:08:50 +000036#include "EffectFactoryHelper.h"
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +000037#include "EffectHelper.h"
Shunkai Yao121c6dd2022-09-21 23:42:08 +000038#include "TestUtils.h"
Shunkai Yao67b1be62022-07-13 05:01:42 +000039
40using namespace android;
41
42using ndk::ScopedAStatus;
43
Shunkai Yaoea24c1a2022-09-28 17:39:23 +000044using aidl::android::hardware::audio::effect::CommandId;
Shunkai Yao67b1be62022-07-13 05:01:42 +000045using aidl::android::hardware::audio::effect::Descriptor;
Shunkai Yao45905172022-08-24 18:14:02 +000046using aidl::android::hardware::audio::effect::IEffect;
Shunkai Yao67b1be62022-07-13 05:01:42 +000047using aidl::android::hardware::audio::effect::IFactory;
Shunkai Yaoea24c1a2022-09-28 17:39:23 +000048using aidl::android::hardware::audio::effect::Parameter;
49using aidl::android::hardware::audio::effect::State;
Shunkai Yao5df4e6c2023-01-10 03:20:00 +000050using aidl::android::media::audio::common::AudioDeviceDescription;
51using aidl::android::media::audio::common::AudioDeviceType;
52using aidl::android::media::audio::common::AudioMode;
53using aidl::android::media::audio::common::AudioSource;
Shunkai Yao67b1be62022-07-13 05:01:42 +000054
Shunkai Yao812d5b42022-11-16 18:08:50 +000055enum ParamName { PARAM_INSTANCE_NAME };
Shunkai Yaocb0fc412022-12-15 20:34:32 +000056using EffectTestParam = std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>>;
Shunkai Yao812d5b42022-11-16 18:08:50 +000057
58class AudioEffectTest : public testing::TestWithParam<EffectTestParam>, public EffectHelper {
Shunkai Yao45905172022-08-24 18:14:02 +000059 public:
Shunkai Yaocb0fc412022-12-15 20:34:32 +000060 AudioEffectTest() {
61 std::tie(mFactory, mDescriptor) = std::get<PARAM_INSTANCE_NAME>(GetParam());
62 }
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +000063
Shunkai Yao812d5b42022-11-16 18:08:50 +000064 void SetUp() override {}
Shunkai Yaocb0fc412022-12-15 20:34:32 +000065
66 void TearDown() override {
67 // Do the cleanup for every test case
68 if (mEffect) {
69 ASSERT_NO_FATAL_FAILURE(commandIgnoreRet(mEffect, CommandId::STOP));
70 ASSERT_NO_FATAL_FAILURE(closeIgnoreRet(mEffect));
71 ASSERT_NO_FATAL_FAILURE(destroyIgnoreRet(mFactory, mEffect));
72 mEffect.reset();
73 }
74 }
Shunkai Yao45905172022-08-24 18:14:02 +000075
Shunkai Yao812d5b42022-11-16 18:08:50 +000076 static const long kInputFrameCount = 0x100, kOutputFrameCount = 0x100;
77 std::shared_ptr<IFactory> mFactory;
Shunkai Yaocb0fc412022-12-15 20:34:32 +000078 std::shared_ptr<IEffect> mEffect;
79 Descriptor mDescriptor;
Shunkai Yao5df4e6c2023-01-10 03:20:00 +000080
81 void setAndGetParameter(Parameter::Id id, const Parameter& set) {
82 Parameter get;
83 EXPECT_IS_OK(mEffect->setParameter(set));
84 EXPECT_IS_OK(mEffect->getParameter(id, &get));
Shunkai Yaoeea19942023-02-16 02:31:24 +000085 EXPECT_EQ(set, get) << set.toString() << "\n vs \n" << get.toString();
Shunkai Yao5df4e6c2023-01-10 03:20:00 +000086 }
Shunkai Yao45905172022-08-24 18:14:02 +000087};
88
Shunkai Yao812d5b42022-11-16 18:08:50 +000089TEST_P(AudioEffectTest, SetupAndTearDown) {
90 // Intentionally empty test body.
Shunkai Yao45905172022-08-24 18:14:02 +000091}
92
Shunkai Yao812d5b42022-11-16 18:08:50 +000093TEST_P(AudioEffectTest, CreateAndDestroy) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +000094 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
95 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao45905172022-08-24 18:14:02 +000096}
97
Shunkai Yao812d5b42022-11-16 18:08:50 +000098TEST_P(AudioEffectTest, OpenAndClose) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +000099 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
100 ASSERT_NO_FATAL_FAILURE(open(mEffect));
101 ASSERT_NO_FATAL_FAILURE(close(mEffect));
102 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao45905172022-08-24 18:14:02 +0000103}
104
Shunkai Yao812d5b42022-11-16 18:08:50 +0000105TEST_P(AudioEffectTest, CloseUnopenedEffect) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000106 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
107 ASSERT_NO_FATAL_FAILURE(close(mEffect));
108 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao45905172022-08-24 18:14:02 +0000109}
110
Shunkai Yao812d5b42022-11-16 18:08:50 +0000111TEST_P(AudioEffectTest, DoubleOpenAndClose) {
112 std::shared_ptr<IEffect> effect1, effect2;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000113 ASSERT_NO_FATAL_FAILURE(create(mFactory, effect1, mDescriptor));
114 ASSERT_NO_FATAL_FAILURE(create(mFactory, effect2, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000115 ASSERT_NO_FATAL_FAILURE(open(effect1));
116 ASSERT_NO_FATAL_FAILURE(open(effect2, 1 /* session */));
117 ASSERT_NO_FATAL_FAILURE(close(effect1));
118 ASSERT_NO_FATAL_FAILURE(close(effect2));
119 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, effect1));
120 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, effect2));
Shunkai Yao45905172022-08-24 18:14:02 +0000121}
122
Shunkai Yao812d5b42022-11-16 18:08:50 +0000123TEST_P(AudioEffectTest, TripleOpenAndClose) {
124 std::shared_ptr<IEffect> effect1, effect2, effect3;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000125 ASSERT_NO_FATAL_FAILURE(create(mFactory, effect1, mDescriptor));
126 ASSERT_NO_FATAL_FAILURE(create(mFactory, effect2, mDescriptor));
127 ASSERT_NO_FATAL_FAILURE(create(mFactory, effect3, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000128 ASSERT_NO_FATAL_FAILURE(open(effect1));
129 ASSERT_NO_FATAL_FAILURE(open(effect2, 1 /* session */));
130 ASSERT_NO_FATAL_FAILURE(open(effect3, 2 /* session */));
131 ASSERT_NO_FATAL_FAILURE(close(effect1));
132 ASSERT_NO_FATAL_FAILURE(close(effect2));
133 ASSERT_NO_FATAL_FAILURE(close(effect3));
134 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, effect1));
135 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, effect2));
136 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, effect3));
137}
Shunkai Yao45905172022-08-24 18:14:02 +0000138
Shunkai Yao812d5b42022-11-16 18:08:50 +0000139TEST_P(AudioEffectTest, GetDescritorBeforeOpen) {
Shunkai Yao812d5b42022-11-16 18:08:50 +0000140 Descriptor desc;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000141 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
142 ASSERT_NO_FATAL_FAILURE(getDescriptor(mEffect, desc));
143 EXPECT_EQ(mDescriptor.common, desc.common);
144 // Effect implementation Must fill in implementor and name
Shunkai Yao812d5b42022-11-16 18:08:50 +0000145 EXPECT_NE("", desc.common.name);
146 EXPECT_NE("", desc.common.implementor);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000147 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000148}
149
150TEST_P(AudioEffectTest, GetDescritorAfterOpen) {
Shunkai Yao812d5b42022-11-16 18:08:50 +0000151 Descriptor beforeOpen, afterOpen, afterClose;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000152 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
153 ASSERT_NO_FATAL_FAILURE(getDescriptor(mEffect, beforeOpen));
154 ASSERT_NO_FATAL_FAILURE(open(mEffect));
155 ASSERT_NO_FATAL_FAILURE(getDescriptor(mEffect, afterOpen));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000156 EXPECT_EQ(beforeOpen.toString(), afterOpen.toString()) << "\n"
157 << beforeOpen.toString() << "\n"
158 << afterOpen.toString();
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000159 ASSERT_NO_FATAL_FAILURE(close(mEffect));
160 ASSERT_NO_FATAL_FAILURE(getDescriptor(mEffect, afterClose));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000161 EXPECT_EQ(beforeOpen.toString(), afterClose.toString()) << "\n"
162 << beforeOpen.toString() << "\n"
163 << afterClose.toString();
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000164 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000165}
166
167TEST_P(AudioEffectTest, DescriptorExistAndUnique) {
Shunkai Yao812d5b42022-11-16 18:08:50 +0000168 Descriptor desc;
169
170 auto descList = EffectFactoryHelper::getAllEffectDescriptors(IFactory::descriptor);
171 std::set<Descriptor::Identity> idSet;
172 for (const auto& it : descList) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000173 auto& id = it.second.common.id;
Shunkai Yao812d5b42022-11-16 18:08:50 +0000174 EXPECT_EQ(0ul, idSet.count(id));
175 idSet.insert(id);
Shunkai Yao45905172022-08-24 18:14:02 +0000176 }
Shunkai Yao812d5b42022-11-16 18:08:50 +0000177
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000178 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
179 ASSERT_NO_FATAL_FAILURE(getDescriptor(mEffect, desc));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000180 EXPECT_EQ(1ul, idSet.count(desc.common.id));
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000181 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao45905172022-08-24 18:14:02 +0000182}
183
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000184/// State testing.
185// An effect instance is in INIT state by default after it was created.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000186TEST_P(AudioEffectTest, InitStateAfterCreation) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000187 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
188 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::INIT));
189 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000190}
191
Shunkai Yao812d5b42022-11-16 18:08:50 +0000192// An effect instance transfer to IDLE state after IEffect.ASSERT_NO_FATAL_FAILURE(open().
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000193TEST_P(AudioEffectTest, IdleStateAfterOpen) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000194 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
195 ASSERT_NO_FATAL_FAILURE(open(mEffect));
196 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
197 ASSERT_NO_FATAL_FAILURE(close(mEffect));
198 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000199}
200
201// An effect instance is in PROCESSING state after it receive an START command.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000202TEST_P(AudioEffectTest, ProcessingStateAfterStart) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000203 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
204 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::INIT));
205 ASSERT_NO_FATAL_FAILURE(open(mEffect));
206 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
207 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
208 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
209 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
210 ASSERT_NO_FATAL_FAILURE(close(mEffect));
211 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000212}
213
214// An effect instance transfer to IDLE state after Command.Id.STOP in PROCESSING state.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000215TEST_P(AudioEffectTest, IdleStateAfterStop) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000216 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
217 ASSERT_NO_FATAL_FAILURE(open(mEffect));
218 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
219 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
220 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
221 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
222 ASSERT_NO_FATAL_FAILURE(close(mEffect));
223 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000224}
225
226// An effect instance transfer to IDLE state after Command.Id.RESET in PROCESSING state.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000227TEST_P(AudioEffectTest, IdleStateAfterReset) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000228 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
229 ASSERT_NO_FATAL_FAILURE(open(mEffect));
230 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
231 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
232 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::RESET));
233 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
234 ASSERT_NO_FATAL_FAILURE(close(mEffect));
235 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000236}
237
Shunkai Yao812d5b42022-11-16 18:08:50 +0000238// An effect instance transfer to INIT after IEffect.ASSERT_NO_FATAL_FAILURE(close().
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000239TEST_P(AudioEffectTest, InitStateAfterClose) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000240 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
241 ASSERT_NO_FATAL_FAILURE(open(mEffect));
242 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
243 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
244 ASSERT_NO_FATAL_FAILURE(close(mEffect));
245 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::INIT));
246 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000247}
248
249// An effect instance shouldn't accept any command before open.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000250TEST_P(AudioEffectTest, NoCommandAcceptedBeforeOpen) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000251 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
252 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START, EX_ILLEGAL_STATE));
253 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP, EX_ILLEGAL_STATE));
254 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::RESET, EX_ILLEGAL_STATE));
255 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000256}
257
258// No-op when receive STOP command in IDLE state.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000259TEST_P(AudioEffectTest, StopCommandInIdleStateNoOp) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000260 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
261 ASSERT_NO_FATAL_FAILURE(open(mEffect));
262 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
263 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
264 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
265 ASSERT_NO_FATAL_FAILURE(close(mEffect));
266 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000267}
268
Shunkai Yao812d5b42022-11-16 18:08:50 +0000269// No-op when receive RESET command in IDLE state.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000270TEST_P(AudioEffectTest, ResetCommandInIdleStateNoOp) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000271 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
272 ASSERT_NO_FATAL_FAILURE(open(mEffect));
273 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
274 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::RESET));
275 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
276 ASSERT_NO_FATAL_FAILURE(close(mEffect));
277 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000278}
279
280// Repeat START and STOP command.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000281TEST_P(AudioEffectTest, RepeatStartAndStop) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000282 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
283 ASSERT_NO_FATAL_FAILURE(open(mEffect));
284 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
285 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
286 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
287 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
288 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000289
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000290 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
291 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
292 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
293 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
294 ASSERT_NO_FATAL_FAILURE(close(mEffect));
295 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000296}
297
298// Repeat START and RESET command.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000299TEST_P(AudioEffectTest, RepeatStartAndReset) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000300 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
301 ASSERT_NO_FATAL_FAILURE(open(mEffect));
302 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
303 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
304 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
305 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::RESET));
306 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000307
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000308 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
309 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
310 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::RESET));
311 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
312 ASSERT_NO_FATAL_FAILURE(close(mEffect));
313 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000314}
315
Shunkai Yao812d5b42022-11-16 18:08:50 +0000316// Try to close an effect instance at PROCESSING state.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000317TEST_P(AudioEffectTest, CloseProcessingStateEffects) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000318 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
319 ASSERT_NO_FATAL_FAILURE(open(mEffect));
320 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
321 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
322 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000323
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000324 ASSERT_NO_FATAL_FAILURE(close(mEffect, EX_ILLEGAL_STATE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000325
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000326 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
327 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
328 ASSERT_NO_FATAL_FAILURE(close(mEffect));
329 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000330}
331
332// Expect EX_ILLEGAL_STATE if the effect instance is not in a proper state to be destroyed.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000333TEST_P(AudioEffectTest, DestroyOpenEffects) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000334 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
335 ASSERT_NO_FATAL_FAILURE(open(mEffect));
336 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000337
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000338 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect, EX_ILLEGAL_STATE));
339
340 // cleanup
341 ASSERT_NO_FATAL_FAILURE(close(mEffect));
342 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000343}
344
345// Expect EX_ILLEGAL_STATE if the effect instance is not in a proper state to be destroyed.
346TEST_P(AudioEffectTest, DestroyProcessingEffects) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000347 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
348 ASSERT_NO_FATAL_FAILURE(open(mEffect));
349 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
350 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
351 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000352
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000353 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect, EX_ILLEGAL_STATE));
354
355 // cleanup
356 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
357 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
358 ASSERT_NO_FATAL_FAILURE(close(mEffect));
359 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000360}
361
362TEST_P(AudioEffectTest, NormalSequenceStates) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000363 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
364 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::INIT));
365 ASSERT_NO_FATAL_FAILURE(open(mEffect));
366 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
367 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
368 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
369 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
370 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
371 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
372 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
373 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::RESET));
374 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
375 ASSERT_NO_FATAL_FAILURE(close(mEffect));
376 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000377}
378
379/// Parameter testing.
380// Verify parameters pass in open can be successfully get.
Shunkai Yao812d5b42022-11-16 18:08:50 +0000381TEST_P(AudioEffectTest, VerifyCommonParametersAfterOpen) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000382 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000383
384 Parameter::Common common = EffectHelper::createParamCommon();
385 IEffect::OpenEffectReturn ret;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000386 ASSERT_NO_FATAL_FAILURE(open(mEffect, common, std::nullopt /* specific */, &ret, EX_NONE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000387
388 Parameter get = Parameter(), expect = Parameter();
389 expect.set<Parameter::common>(common);
390 Parameter::Id id;
391 id.set<Parameter::Id::commonTag>(Parameter::common);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000392 EXPECT_IS_OK(mEffect->getParameter(id, &get));
Shunkai Yaoeea19942023-02-16 02:31:24 +0000393 EXPECT_EQ(expect, get) << expect.toString() << "\n vs \n" << get.toString();
Shunkai Yao812d5b42022-11-16 18:08:50 +0000394
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000395 ASSERT_NO_FATAL_FAILURE(close(mEffect));
396 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000397}
398
399// Verify parameters pass in set can be successfully get.
Shunkai Yao812d5b42022-11-16 18:08:50 +0000400TEST_P(AudioEffectTest, SetAndGetCommonParameter) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000401 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
402 ASSERT_NO_FATAL_FAILURE(open(mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000403
404 Parameter::Common common = EffectHelper::createParamCommon(
405 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */);
Shunkai Yao5df4e6c2023-01-10 03:20:00 +0000406 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::common);
407 ASSERT_NO_FATAL_FAILURE(setAndGetParameter(id, Parameter::make<Parameter::common>(common)));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000408
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000409 ASSERT_NO_FATAL_FAILURE(close(mEffect));
410 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000411}
412
Shunkai Yao812d5b42022-11-16 18:08:50 +0000413// Verify parameters set and get in PROCESSING state.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000414TEST_P(AudioEffectTest, SetAndGetParameterInProcessing) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000415 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
416 ASSERT_NO_FATAL_FAILURE(open(mEffect));
417 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
418 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000419
420 Parameter::Common common = EffectHelper::createParamCommon(
421 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */);
Shunkai Yao5df4e6c2023-01-10 03:20:00 +0000422 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::common);
423 ASSERT_NO_FATAL_FAILURE(setAndGetParameter(id, Parameter::make<Parameter::common>(common)));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000424
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000425 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
426 ASSERT_NO_FATAL_FAILURE(close(mEffect));
427 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000428}
429
Shunkai Yao812d5b42022-11-16 18:08:50 +0000430// Verify parameters set and get in IDLE state.
431TEST_P(AudioEffectTest, SetAndGetParameterInIdle) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000432 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
433 ASSERT_NO_FATAL_FAILURE(open(mEffect));
434 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
435 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
436 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
437 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000438
439 Parameter::Common common = EffectHelper::createParamCommon(
440 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */);
Shunkai Yao5df4e6c2023-01-10 03:20:00 +0000441 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::common);
442 ASSERT_NO_FATAL_FAILURE(setAndGetParameter(id, Parameter::make<Parameter::common>(common)));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000443
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000444 ASSERT_NO_FATAL_FAILURE(close(mEffect));
445 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000446}
447
Shunkai Yao812d5b42022-11-16 18:08:50 +0000448// Verify Parameters kept after stop.
449TEST_P(AudioEffectTest, SetAndGetParameterAfterStop) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000450 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
451 ASSERT_NO_FATAL_FAILURE(open(mEffect));
452 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
453 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000454
Shunkai Yao812d5b42022-11-16 18:08:50 +0000455 Parameter::Common common = EffectHelper::createParamCommon(
456 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */);
Shunkai Yao5df4e6c2023-01-10 03:20:00 +0000457 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::common);
458 ASSERT_NO_FATAL_FAILURE(setAndGetParameter(id, Parameter::make<Parameter::common>(common)));
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000459
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000460 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
461 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000462 ASSERT_NO_FATAL_FAILURE(close(mEffect));
463 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000464}
465
Shunkai Yao812d5b42022-11-16 18:08:50 +0000466// Verify Parameters kept after reset.
467TEST_P(AudioEffectTest, SetAndGetParameterAfterReset) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000468 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
469 ASSERT_NO_FATAL_FAILURE(open(mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000470
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000471 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
472 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000473
474 Parameter::Common common = EffectHelper::createParamCommon(
475 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */);
Shunkai Yao5df4e6c2023-01-10 03:20:00 +0000476 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::common);
477 ASSERT_NO_FATAL_FAILURE(setAndGetParameter(id, Parameter::make<Parameter::common>(common)));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000478
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000479 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::RESET));
480 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000481
Shunkai Yao5df4e6c2023-01-10 03:20:00 +0000482 ASSERT_NO_FATAL_FAILURE(setAndGetParameter(id, Parameter::make<Parameter::common>(common)));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000483
Shunkai Yao5df4e6c2023-01-10 03:20:00 +0000484 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
485 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000486 ASSERT_NO_FATAL_FAILURE(close(mEffect));
487 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000488}
Shunkai Yao5df4e6c2023-01-10 03:20:00 +0000489
490// Set and get AudioDeviceDescription in Parameter
491TEST_P(AudioEffectTest, SetAndGetParameterDeviceDescription) {
492 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
493 ASSERT_NO_FATAL_FAILURE(open(mEffect));
494
495 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
496 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
497
498 std::vector<AudioDeviceDescription> deviceDescs = {
499 {.type = AudioDeviceType::IN_DEFAULT,
500 .connection = AudioDeviceDescription::CONNECTION_ANALOG},
501 {.type = AudioDeviceType::IN_DEVICE,
502 .connection = AudioDeviceDescription::CONNECTION_BT_A2DP}};
503 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::deviceDescription);
504 ASSERT_NO_FATAL_FAILURE(
505 setAndGetParameter(id, Parameter::make<Parameter::deviceDescription>(deviceDescs)));
506
507 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
508 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
509 ASSERT_NO_FATAL_FAILURE(close(mEffect));
510 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
511}
512
513// Set and get AudioMode in Parameter
514TEST_P(AudioEffectTest, SetAndGetParameterAudioMode) {
515 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
516 ASSERT_NO_FATAL_FAILURE(open(mEffect));
517
518 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
519 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
520
521 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::mode);
522 ASSERT_NO_FATAL_FAILURE(
523 setAndGetParameter(id, Parameter::make<Parameter::mode>(AudioMode::NORMAL)));
524 ASSERT_NO_FATAL_FAILURE(
525 setAndGetParameter(id, Parameter::make<Parameter::mode>(AudioMode::IN_COMMUNICATION)));
526
527 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
528 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
529 ASSERT_NO_FATAL_FAILURE(close(mEffect));
530 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
531}
532
533// Set and get AudioSource in Parameter
534TEST_P(AudioEffectTest, SetAndGetParameterAudioSource) {
535 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
536 ASSERT_NO_FATAL_FAILURE(open(mEffect));
537
538 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
539 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
540
541 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::source);
542 ASSERT_NO_FATAL_FAILURE(
543 setAndGetParameter(id, Parameter::make<Parameter::source>(AudioSource::DEFAULT)));
544 ASSERT_NO_FATAL_FAILURE(setAndGetParameter(
545 id, Parameter::make<Parameter::source>(AudioSource::VOICE_RECOGNITION)));
546
547 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
548 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
549 ASSERT_NO_FATAL_FAILURE(close(mEffect));
550 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
551}
552
553// Set and get VolumeStereo in Parameter
554TEST_P(AudioEffectTest, SetAndGetParameterVolume) {
555 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
556 ASSERT_NO_FATAL_FAILURE(open(mEffect));
557
558 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
559 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
560
561 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::volumeStereo);
562 Parameter::VolumeStereo volume = {.left = 10.0, .right = 10.0};
563 ASSERT_NO_FATAL_FAILURE(
564 setAndGetParameter(id, Parameter::make<Parameter::volumeStereo>(volume)));
565
566 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
567 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
568 ASSERT_NO_FATAL_FAILURE(close(mEffect));
569 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
570}
571
Shunkai Yao812d5b42022-11-16 18:08:50 +0000572/// Data processing test
573// Send data to effects and expect it to be consumed by checking statusMQ.
574TEST_P(AudioEffectTest, ConsumeDataInProcessingState) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000575 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000576
577 Parameter::Common common = EffectHelper::createParamCommon(
578 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
579 kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
580 IEffect::OpenEffectReturn ret;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000581 ASSERT_NO_FATAL_FAILURE(open(mEffect, common, std::nullopt /* specific */, &ret, EX_NONE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000582 auto statusMQ = std::make_unique<EffectHelper::StatusMQ>(ret.statusMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000583 ASSERT_TRUE(statusMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000584 auto inputMQ = std::make_unique<EffectHelper::DataMQ>(ret.inputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000585 ASSERT_TRUE(inputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000586 auto outputMQ = std::make_unique<EffectHelper::DataMQ>(ret.outputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000587 ASSERT_TRUE(outputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000588
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000589 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
590 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000591
592 std::vector<float> buffer;
Shunkai Yaob49631f2023-02-03 01:44:32 +0000593 EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common, inputMQ, buffer));
594 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(inputMQ, buffer));
595 EXPECT_NO_FATAL_FAILURE(
596 EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000597
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000598 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
599 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000600 EXPECT_NO_FATAL_FAILURE(EffectHelper::readFromFmq(statusMQ, 0, outputMQ, 0, buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000601
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000602 ASSERT_NO_FATAL_FAILURE(close(mEffect));
603 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000604}
605
606// Send data to effects and expect it to be consumed after effect restart.
607TEST_P(AudioEffectTest, ConsumeDataAfterRestart) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000608 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000609
610 Parameter::Common common = EffectHelper::createParamCommon(
611 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
612 kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
613 IEffect::OpenEffectReturn ret;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000614 ASSERT_NO_FATAL_FAILURE(open(mEffect, common, std::nullopt /* specific */, &ret, EX_NONE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000615 auto statusMQ = std::make_unique<EffectHelper::StatusMQ>(ret.statusMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000616 ASSERT_TRUE(statusMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000617 auto inputMQ = std::make_unique<EffectHelper::DataMQ>(ret.inputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000618 ASSERT_TRUE(inputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000619 auto outputMQ = std::make_unique<EffectHelper::DataMQ>(ret.outputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000620 ASSERT_TRUE(outputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000621
Shunkai Yao812d5b42022-11-16 18:08:50 +0000622 std::vector<float> buffer;
Shunkai Yaob49631f2023-02-03 01:44:32 +0000623 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
624 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
625 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
626 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
627 EXPECT_NO_FATAL_FAILURE(
628 EffectHelper::readFromFmq(statusMQ, 0, outputMQ, buffer.size(), buffer));
629 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
630 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
631
632 EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common, inputMQ, buffer));
633 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(inputMQ, buffer));
634 EXPECT_NO_FATAL_FAILURE(
635 EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000636
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000637 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
638 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000639 EXPECT_NO_FATAL_FAILURE(EffectHelper::readFromFmq(statusMQ, 0, outputMQ, 0, buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000640
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000641 ASSERT_NO_FATAL_FAILURE(close(mEffect));
642 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000643}
644
645// Send data to IDLE effects and expect it to be consumed after effect start.
646TEST_P(AudioEffectTest, SendDataAtIdleAndConsumeDataInProcessing) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000647 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000648
649 Parameter::Common common = EffectHelper::createParamCommon(
650 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
651 kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
652 IEffect::OpenEffectReturn ret;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000653 ASSERT_NO_FATAL_FAILURE(open(mEffect, common, std::nullopt /* specific */, &ret, EX_NONE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000654 auto statusMQ = std::make_unique<EffectHelper::StatusMQ>(ret.statusMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000655 ASSERT_TRUE(statusMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000656 auto inputMQ = std::make_unique<EffectHelper::DataMQ>(ret.inputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000657 ASSERT_TRUE(inputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000658 auto outputMQ = std::make_unique<EffectHelper::DataMQ>(ret.outputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000659 ASSERT_TRUE(outputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000660
661 std::vector<float> buffer;
Shunkai Yaob49631f2023-02-03 01:44:32 +0000662 EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common, inputMQ, buffer));
663 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(inputMQ, buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000664
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000665 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
666 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000667
Shunkai Yaob49631f2023-02-03 01:44:32 +0000668 EXPECT_NO_FATAL_FAILURE(
669 EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000670
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000671 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
672 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000673
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000674 ASSERT_NO_FATAL_FAILURE(close(mEffect));
675 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000676}
677
678// Send data multiple times.
679TEST_P(AudioEffectTest, ProcessDataMultipleTimes) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000680 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000681
682 Parameter::Common common = EffectHelper::createParamCommon(
683 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
684 kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
685 IEffect::OpenEffectReturn ret;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000686 ASSERT_NO_FATAL_FAILURE(open(mEffect, common, std::nullopt /* specific */, &ret, EX_NONE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000687 auto statusMQ = std::make_unique<EffectHelper::StatusMQ>(ret.statusMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000688 ASSERT_TRUE(statusMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000689 auto inputMQ = std::make_unique<EffectHelper::DataMQ>(ret.inputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000690 ASSERT_TRUE(inputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000691 auto outputMQ = std::make_unique<EffectHelper::DataMQ>(ret.outputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000692 ASSERT_TRUE(outputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000693
694 std::vector<float> buffer;
Shunkai Yaob49631f2023-02-03 01:44:32 +0000695 EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common, inputMQ, buffer));
696 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(inputMQ, buffer));
697 EXPECT_NO_FATAL_FAILURE(EffectHelper::readFromFmq(statusMQ, 0, outputMQ, 0, buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000698
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000699 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
700 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000701
Shunkai Yaob49631f2023-02-03 01:44:32 +0000702 EXPECT_NO_FATAL_FAILURE(
703 EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000704
Shunkai Yaob49631f2023-02-03 01:44:32 +0000705 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(inputMQ, buffer));
706 EXPECT_NO_FATAL_FAILURE(
707 EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000708
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000709 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
710 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000711 EXPECT_NO_FATAL_FAILURE(EffectHelper::readFromFmq(statusMQ, 0, outputMQ, 0, buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000712
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000713 ASSERT_NO_FATAL_FAILURE(close(mEffect));
714 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000715}
716
Shunkai Yaob49631f2023-02-03 01:44:32 +0000717// Send data to processing state effects, stop, and restart.
718TEST_P(AudioEffectTest, ConsumeDataAndRestart) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000719 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000720
721 Parameter::Common common = EffectHelper::createParamCommon(
722 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
723 kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
724 IEffect::OpenEffectReturn ret;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000725 ASSERT_NO_FATAL_FAILURE(open(mEffect, common, std::nullopt /* specific */, &ret, EX_NONE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000726 auto statusMQ = std::make_unique<EffectHelper::StatusMQ>(ret.statusMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000727 ASSERT_TRUE(statusMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000728 auto inputMQ = std::make_unique<EffectHelper::DataMQ>(ret.inputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000729 ASSERT_TRUE(inputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000730 auto outputMQ = std::make_unique<EffectHelper::DataMQ>(ret.outputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000731 ASSERT_TRUE(outputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000732
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000733 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
734 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000735 std::vector<float> buffer;
736 EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common, inputMQ, buffer));
737 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(inputMQ, buffer));
738 EXPECT_NO_FATAL_FAILURE(
739 EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
740
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000741 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
742 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000743 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(inputMQ, buffer));
744 EXPECT_NO_FATAL_FAILURE(EffectHelper::readFromFmq(statusMQ, 0, outputMQ, 0, buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000745
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000746 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
747 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000748 EXPECT_NO_FATAL_FAILURE(
749 EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000750
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000751 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
752 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000753
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000754 ASSERT_NO_FATAL_FAILURE(close(mEffect));
755 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000756}
757
758// Send data to closed effects and expect it not be consumed.
759TEST_P(AudioEffectTest, NotConsumeDataByClosedEffect) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000760 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000761
762 Parameter::Common common = EffectHelper::createParamCommon(
763 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
764 kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
765 IEffect::OpenEffectReturn ret;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000766 ASSERT_NO_FATAL_FAILURE(open(mEffect, common, std::nullopt /* specific */, &ret, EX_NONE));
767 ASSERT_NO_FATAL_FAILURE(close(mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000768
769 auto statusMQ = std::make_unique<EffectHelper::StatusMQ>(ret.statusMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000770 ASSERT_TRUE(statusMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000771 auto inputMQ = std::make_unique<EffectHelper::DataMQ>(ret.inputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000772 ASSERT_TRUE(inputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000773 auto outputMQ = std::make_unique<EffectHelper::DataMQ>(ret.outputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000774 ASSERT_TRUE(outputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000775
776 std::vector<float> buffer;
Shunkai Yaob49631f2023-02-03 01:44:32 +0000777 EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common, inputMQ, buffer));
778 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(inputMQ, buffer));
779 EXPECT_NO_FATAL_FAILURE(EffectHelper::readFromFmq(statusMQ, 0, outputMQ, 0, buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000780
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000781 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000782}
783
784// Send data to multiple effects.
785TEST_P(AudioEffectTest, ConsumeDataMultipleEffects) {
786 std::shared_ptr<IEffect> effect1, effect2;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000787 ASSERT_NO_FATAL_FAILURE(create(mFactory, effect1, mDescriptor));
788 ASSERT_NO_FATAL_FAILURE(create(mFactory, effect2, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000789
790 Parameter::Common common1 = EffectHelper::createParamCommon(
791 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
792 kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
793 Parameter::Common common2 = EffectHelper::createParamCommon(
794 1 /* session */, 1 /* ioHandle */, 48000 /* iSampleRate */, 48000 /* oSampleRate */,
795 2 * kInputFrameCount /* iFrameCount */, 2 * kOutputFrameCount /* oFrameCount */);
796 IEffect::OpenEffectReturn ret1, ret2;
797 ASSERT_NO_FATAL_FAILURE(open(effect1, common1, std::nullopt /* specific */, &ret1, EX_NONE));
798 ASSERT_NO_FATAL_FAILURE(open(effect2, common2, std::nullopt /* specific */, &ret2, EX_NONE));
799 ASSERT_NO_FATAL_FAILURE(command(effect1, CommandId::START));
800 ASSERT_NO_FATAL_FAILURE(expectState(effect1, State::PROCESSING));
801 ASSERT_NO_FATAL_FAILURE(command(effect2, CommandId::START));
802 ASSERT_NO_FATAL_FAILURE(expectState(effect2, State::PROCESSING));
803
804 auto statusMQ1 = std::make_unique<EffectHelper::StatusMQ>(ret1.statusMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000805 ASSERT_TRUE(statusMQ1->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000806 auto inputMQ1 = std::make_unique<EffectHelper::DataMQ>(ret1.inputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000807 ASSERT_TRUE(inputMQ1->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000808 auto outputMQ1 = std::make_unique<EffectHelper::DataMQ>(ret1.outputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000809 ASSERT_TRUE(outputMQ1->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000810
811 std::vector<float> buffer1, buffer2;
Shunkai Yaob49631f2023-02-03 01:44:32 +0000812 EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common1, inputMQ1, buffer1));
813 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(inputMQ1, buffer1));
814 EXPECT_NO_FATAL_FAILURE(
815 EffectHelper::readFromFmq(statusMQ1, 1, outputMQ1, buffer1.size(), buffer1));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000816
817 auto statusMQ2 = std::make_unique<EffectHelper::StatusMQ>(ret2.statusMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000818 ASSERT_TRUE(statusMQ2->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000819 auto inputMQ2 = std::make_unique<EffectHelper::DataMQ>(ret2.inputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000820 ASSERT_TRUE(inputMQ2->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000821 auto outputMQ2 = std::make_unique<EffectHelper::DataMQ>(ret2.outputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000822 ASSERT_TRUE(outputMQ2->isValid());
Shunkai Yaob49631f2023-02-03 01:44:32 +0000823 EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common2, inputMQ2, buffer2));
824 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(inputMQ2, buffer2));
825 EXPECT_NO_FATAL_FAILURE(
826 EffectHelper::readFromFmq(statusMQ2, 1, outputMQ2, buffer2.size(), buffer2));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000827
828 ASSERT_NO_FATAL_FAILURE(command(effect1, CommandId::STOP));
829 ASSERT_NO_FATAL_FAILURE(expectState(effect1, State::IDLE));
830 ASSERT_NO_FATAL_FAILURE(close(effect1));
831 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, effect1));
832
833 ASSERT_NO_FATAL_FAILURE(command(effect2, CommandId::STOP));
834 ASSERT_NO_FATAL_FAILURE(expectState(effect2, State::IDLE));
835 ASSERT_NO_FATAL_FAILURE(close(effect2));
836 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, effect2));
837}
838
839INSTANTIATE_TEST_SUITE_P(
840 SingleEffectInstanceTest, AudioEffectTest,
841 ::testing::Combine(testing::ValuesIn(
842 EffectFactoryHelper::getAllEffectDescriptors(IFactory::descriptor))),
843 [](const testing::TestParamInfo<AudioEffectTest::ParamType>& info) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000844 auto descriptor = std::get<PARAM_INSTANCE_NAME>(info.param).second;
845 std::string name = "Implementor_" + descriptor.common.implementor + "_name_" +
846 descriptor.common.name + "_TYPE_" +
847 descriptor.common.id.type.toString() + "_UUID_" +
848 descriptor.common.id.uuid.toString();
Shunkai Yao812d5b42022-11-16 18:08:50 +0000849 std::replace_if(
850 name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
851 return name;
852 });
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000853GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(AudioEffectTest);
Shunkai Yao67b1be62022-07-13 05:01:42 +0000854
855int main(int argc, char** argv) {
856 ::testing::InitGoogleTest(&argc, argv);
857 ABinderProcess_setThreadPoolMaxThreadCount(1);
858 ABinderProcess_startThreadPool();
859 return RUN_ALL_TESTS();
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000860}