blob: ca1cea9aff37fc68bccab424a4b62d579396f8ec [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 Yao8771cec2023-09-20 22:46:59 +000045using aidl::android::hardware::audio::effect::Flags;
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;
Jaideep Sharma74498412023-09-13 15:25:25 +053054using android::hardware::audio::common::testing::detail::TestExecutionTracer;
Shunkai Yao67b1be62022-07-13 05:01:42 +000055
Shunkai Yao812d5b42022-11-16 18:08:50 +000056enum ParamName { PARAM_INSTANCE_NAME };
Shunkai Yaocb0fc412022-12-15 20:34:32 +000057using EffectTestParam = std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>>;
Shunkai Yao812d5b42022-11-16 18:08:50 +000058
59class AudioEffectTest : public testing::TestWithParam<EffectTestParam>, public EffectHelper {
Shunkai Yao45905172022-08-24 18:14:02 +000060 public:
Shunkai Yaocb0fc412022-12-15 20:34:32 +000061 AudioEffectTest() {
62 std::tie(mFactory, mDescriptor) = std::get<PARAM_INSTANCE_NAME>(GetParam());
63 }
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +000064
Shunkai Yao812d5b42022-11-16 18:08:50 +000065 void SetUp() override {}
Shunkai Yaocb0fc412022-12-15 20:34:32 +000066
67 void TearDown() override {
68 // Do the cleanup for every test case
69 if (mEffect) {
70 ASSERT_NO_FATAL_FAILURE(commandIgnoreRet(mEffect, CommandId::STOP));
71 ASSERT_NO_FATAL_FAILURE(closeIgnoreRet(mEffect));
72 ASSERT_NO_FATAL_FAILURE(destroyIgnoreRet(mFactory, mEffect));
73 mEffect.reset();
74 }
75 }
Shunkai Yao45905172022-08-24 18:14:02 +000076
Shunkai Yao812d5b42022-11-16 18:08:50 +000077 static const long kInputFrameCount = 0x100, kOutputFrameCount = 0x100;
78 std::shared_ptr<IFactory> mFactory;
Shunkai Yaocb0fc412022-12-15 20:34:32 +000079 std::shared_ptr<IEffect> mEffect;
80 Descriptor mDescriptor;
Shunkai Yao5df4e6c2023-01-10 03:20:00 +000081
82 void setAndGetParameter(Parameter::Id id, const Parameter& set) {
83 Parameter get;
84 EXPECT_IS_OK(mEffect->setParameter(set));
85 EXPECT_IS_OK(mEffect->getParameter(id, &get));
Shunkai Yaoeea19942023-02-16 02:31:24 +000086 EXPECT_EQ(set, get) << set.toString() << "\n vs \n" << get.toString();
Shunkai Yao5df4e6c2023-01-10 03:20:00 +000087 }
Shunkai Yao45905172022-08-24 18:14:02 +000088};
89
Jaideep Sharmacba42862023-06-23 10:27:39 +053090class AudioEffectDataPathTest : public AudioEffectTest {
Shunkai Yao8771cec2023-09-20 22:46:59 +000091 public:
92 void SetUp() override {
93 AudioEffectTest::SetUp();
94 SKIP_TEST_IF_DATA_UNSUPPORTED(mDescriptor.common.flags);
95 }
Jaideep Sharmacba42862023-06-23 10:27:39 +053096};
97
Shunkai Yao812d5b42022-11-16 18:08:50 +000098TEST_P(AudioEffectTest, SetupAndTearDown) {
99 // Intentionally empty test body.
Shunkai Yao45905172022-08-24 18:14:02 +0000100}
101
Shunkai Yao812d5b42022-11-16 18:08:50 +0000102TEST_P(AudioEffectTest, CreateAndDestroy) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000103 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
104 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao45905172022-08-24 18:14:02 +0000105}
106
Shunkai Yao812d5b42022-11-16 18:08:50 +0000107TEST_P(AudioEffectTest, OpenAndClose) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000108 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
109 ASSERT_NO_FATAL_FAILURE(open(mEffect));
110 ASSERT_NO_FATAL_FAILURE(close(mEffect));
111 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao45905172022-08-24 18:14:02 +0000112}
113
Shunkai Yao812d5b42022-11-16 18:08:50 +0000114TEST_P(AudioEffectTest, CloseUnopenedEffect) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000115 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
116 ASSERT_NO_FATAL_FAILURE(close(mEffect));
117 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao45905172022-08-24 18:14:02 +0000118}
119
Shunkai Yao812d5b42022-11-16 18:08:50 +0000120TEST_P(AudioEffectTest, DoubleOpenAndClose) {
121 std::shared_ptr<IEffect> effect1, effect2;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000122 ASSERT_NO_FATAL_FAILURE(create(mFactory, effect1, mDescriptor));
123 ASSERT_NO_FATAL_FAILURE(create(mFactory, effect2, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000124 ASSERT_NO_FATAL_FAILURE(open(effect1));
125 ASSERT_NO_FATAL_FAILURE(open(effect2, 1 /* session */));
126 ASSERT_NO_FATAL_FAILURE(close(effect1));
127 ASSERT_NO_FATAL_FAILURE(close(effect2));
128 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, effect1));
129 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, effect2));
Shunkai Yao45905172022-08-24 18:14:02 +0000130}
131
Shunkai Yao812d5b42022-11-16 18:08:50 +0000132TEST_P(AudioEffectTest, TripleOpenAndClose) {
133 std::shared_ptr<IEffect> effect1, effect2, effect3;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000134 ASSERT_NO_FATAL_FAILURE(create(mFactory, effect1, mDescriptor));
135 ASSERT_NO_FATAL_FAILURE(create(mFactory, effect2, mDescriptor));
136 ASSERT_NO_FATAL_FAILURE(create(mFactory, effect3, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000137 ASSERT_NO_FATAL_FAILURE(open(effect1));
138 ASSERT_NO_FATAL_FAILURE(open(effect2, 1 /* session */));
139 ASSERT_NO_FATAL_FAILURE(open(effect3, 2 /* session */));
140 ASSERT_NO_FATAL_FAILURE(close(effect1));
141 ASSERT_NO_FATAL_FAILURE(close(effect2));
142 ASSERT_NO_FATAL_FAILURE(close(effect3));
143 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, effect1));
144 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, effect2));
145 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, effect3));
146}
Shunkai Yao45905172022-08-24 18:14:02 +0000147
Shunkai Yao812d5b42022-11-16 18:08:50 +0000148TEST_P(AudioEffectTest, GetDescritorBeforeOpen) {
Shunkai Yao812d5b42022-11-16 18:08:50 +0000149 Descriptor desc;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000150 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
151 ASSERT_NO_FATAL_FAILURE(getDescriptor(mEffect, desc));
Shunkai Yao4c4f3cd2023-02-28 01:50:40 +0000152 EXPECT_EQ(mDescriptor.common.id.type, desc.common.id.type);
153 EXPECT_EQ(mDescriptor.common.id.uuid, desc.common.id.uuid);
154 EXPECT_EQ(mDescriptor.common.name, desc.common.name);
155 EXPECT_EQ(mDescriptor.common.implementor, desc.common.implementor);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000156 // Effect implementation Must fill in implementor and name
Shunkai Yao812d5b42022-11-16 18:08:50 +0000157 EXPECT_NE("", desc.common.name);
158 EXPECT_NE("", desc.common.implementor);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000159 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000160}
161
162TEST_P(AudioEffectTest, GetDescritorAfterOpen) {
Shunkai Yao812d5b42022-11-16 18:08:50 +0000163 Descriptor beforeOpen, afterOpen, afterClose;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000164 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
165 ASSERT_NO_FATAL_FAILURE(getDescriptor(mEffect, beforeOpen));
166 ASSERT_NO_FATAL_FAILURE(open(mEffect));
167 ASSERT_NO_FATAL_FAILURE(getDescriptor(mEffect, afterOpen));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000168 EXPECT_EQ(beforeOpen.toString(), afterOpen.toString()) << "\n"
169 << beforeOpen.toString() << "\n"
170 << afterOpen.toString();
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000171 ASSERT_NO_FATAL_FAILURE(close(mEffect));
172 ASSERT_NO_FATAL_FAILURE(getDescriptor(mEffect, afterClose));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000173 EXPECT_EQ(beforeOpen.toString(), afterClose.toString()) << "\n"
174 << beforeOpen.toString() << "\n"
175 << afterClose.toString();
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000176 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000177}
178
179TEST_P(AudioEffectTest, DescriptorExistAndUnique) {
Shunkai Yao812d5b42022-11-16 18:08:50 +0000180 Descriptor desc;
181
182 auto descList = EffectFactoryHelper::getAllEffectDescriptors(IFactory::descriptor);
183 std::set<Descriptor::Identity> idSet;
184 for (const auto& it : descList) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000185 auto& id = it.second.common.id;
Shunkai Yao812d5b42022-11-16 18:08:50 +0000186 EXPECT_EQ(0ul, idSet.count(id));
187 idSet.insert(id);
Shunkai Yao45905172022-08-24 18:14:02 +0000188 }
Shunkai Yao812d5b42022-11-16 18:08:50 +0000189
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000190 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
191 ASSERT_NO_FATAL_FAILURE(getDescriptor(mEffect, desc));
Shunkai Yao4c4f3cd2023-02-28 01:50:40 +0000192 int uuidCount = std::count_if(idSet.begin(), idSet.end(), [&](const auto& id) {
193 return id.uuid == desc.common.id.uuid && id.type == desc.common.id.type;
194 });
195
196 EXPECT_EQ(1, uuidCount);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000197 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao45905172022-08-24 18:14:02 +0000198}
199
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000200/// State testing.
201// An effect instance is in INIT state by default after it was created.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000202TEST_P(AudioEffectTest, InitStateAfterCreation) {
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(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000206}
207
Shunkai Yao812d5b42022-11-16 18:08:50 +0000208// An effect instance transfer to IDLE state after IEffect.ASSERT_NO_FATAL_FAILURE(open().
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000209TEST_P(AudioEffectTest, IdleStateAfterOpen) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000210 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
211 ASSERT_NO_FATAL_FAILURE(open(mEffect));
212 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
213 ASSERT_NO_FATAL_FAILURE(close(mEffect));
214 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000215}
216
217// An effect instance is in PROCESSING state after it receive an START command.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000218TEST_P(AudioEffectTest, ProcessingStateAfterStart) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000219 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
220 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::INIT));
221 ASSERT_NO_FATAL_FAILURE(open(mEffect));
222 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
223 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
224 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
225 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
226 ASSERT_NO_FATAL_FAILURE(close(mEffect));
227 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000228}
229
230// An effect instance transfer to IDLE state after Command.Id.STOP in PROCESSING state.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000231TEST_P(AudioEffectTest, IdleStateAfterStop) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000232 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
233 ASSERT_NO_FATAL_FAILURE(open(mEffect));
234 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
235 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
236 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
237 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
238 ASSERT_NO_FATAL_FAILURE(close(mEffect));
239 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000240}
241
242// An effect instance transfer to IDLE state after Command.Id.RESET in PROCESSING state.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000243TEST_P(AudioEffectTest, IdleStateAfterReset) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000244 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
245 ASSERT_NO_FATAL_FAILURE(open(mEffect));
246 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
247 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
248 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::RESET));
249 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
250 ASSERT_NO_FATAL_FAILURE(close(mEffect));
251 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000252}
253
Shunkai Yao812d5b42022-11-16 18:08:50 +0000254// An effect instance transfer to INIT after IEffect.ASSERT_NO_FATAL_FAILURE(close().
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000255TEST_P(AudioEffectTest, InitStateAfterClose) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000256 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
257 ASSERT_NO_FATAL_FAILURE(open(mEffect));
258 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
259 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
260 ASSERT_NO_FATAL_FAILURE(close(mEffect));
261 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::INIT));
262 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000263}
264
265// An effect instance shouldn't accept any command before open.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000266TEST_P(AudioEffectTest, NoCommandAcceptedBeforeOpen) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000267 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
268 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START, EX_ILLEGAL_STATE));
269 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP, EX_ILLEGAL_STATE));
270 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::RESET, EX_ILLEGAL_STATE));
271 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000272}
273
274// No-op when receive STOP command in IDLE state.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000275TEST_P(AudioEffectTest, StopCommandInIdleStateNoOp) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000276 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
277 ASSERT_NO_FATAL_FAILURE(open(mEffect));
278 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
279 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
280 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
281 ASSERT_NO_FATAL_FAILURE(close(mEffect));
282 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000283}
284
Shunkai Yao812d5b42022-11-16 18:08:50 +0000285// No-op when receive RESET command in IDLE state.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000286TEST_P(AudioEffectTest, ResetCommandInIdleStateNoOp) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000287 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
288 ASSERT_NO_FATAL_FAILURE(open(mEffect));
289 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
290 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::RESET));
291 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
292 ASSERT_NO_FATAL_FAILURE(close(mEffect));
293 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000294}
295
296// Repeat START and STOP command.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000297TEST_P(AudioEffectTest, RepeatStartAndStop) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000298 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
299 ASSERT_NO_FATAL_FAILURE(open(mEffect));
300 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
301 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
302 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
303 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
304 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000305
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000306 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
307 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
308 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
309 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
310 ASSERT_NO_FATAL_FAILURE(close(mEffect));
311 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000312}
313
314// Repeat START and RESET command.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000315TEST_P(AudioEffectTest, RepeatStartAndReset) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000316 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
317 ASSERT_NO_FATAL_FAILURE(open(mEffect));
318 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
319 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
320 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
321 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::RESET));
322 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000323
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000324 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
325 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
326 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::RESET));
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
Shunkai Yao812d5b42022-11-16 18:08:50 +0000332// Try to close an effect instance at PROCESSING state.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000333TEST_P(AudioEffectTest, CloseProcessingStateEffects) {
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));
337 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
338 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000339
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000340 ASSERT_NO_FATAL_FAILURE(close(mEffect, EX_ILLEGAL_STATE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000341
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000342 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
343 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
344 ASSERT_NO_FATAL_FAILURE(close(mEffect));
345 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000346}
347
348// Expect EX_ILLEGAL_STATE if the effect instance is not in a proper state to be destroyed.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000349TEST_P(AudioEffectTest, DestroyOpenEffects) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000350 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
351 ASSERT_NO_FATAL_FAILURE(open(mEffect));
352 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000353
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000354 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect, EX_ILLEGAL_STATE));
355
356 // cleanup
357 ASSERT_NO_FATAL_FAILURE(close(mEffect));
358 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000359}
360
361// Expect EX_ILLEGAL_STATE if the effect instance is not in a proper state to be destroyed.
362TEST_P(AudioEffectTest, DestroyProcessingEffects) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000363 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
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));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000368
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000369 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect, EX_ILLEGAL_STATE));
370
371 // cleanup
372 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
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 Yao812d5b42022-11-16 18:08:50 +0000376}
377
378TEST_P(AudioEffectTest, NormalSequenceStates) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000379 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
380 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::INIT));
381 ASSERT_NO_FATAL_FAILURE(open(mEffect));
382 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
383 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
384 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
385 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
386 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
387 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
388 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
389 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::RESET));
390 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
391 ASSERT_NO_FATAL_FAILURE(close(mEffect));
392 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000393}
394
395/// Parameter testing.
396// Verify parameters pass in open can be successfully get.
Shunkai Yao812d5b42022-11-16 18:08:50 +0000397TEST_P(AudioEffectTest, VerifyCommonParametersAfterOpen) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000398 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000399
400 Parameter::Common common = EffectHelper::createParamCommon();
401 IEffect::OpenEffectReturn ret;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000402 ASSERT_NO_FATAL_FAILURE(open(mEffect, common, std::nullopt /* specific */, &ret, EX_NONE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000403
404 Parameter get = Parameter(), expect = Parameter();
405 expect.set<Parameter::common>(common);
406 Parameter::Id id;
407 id.set<Parameter::Id::commonTag>(Parameter::common);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000408 EXPECT_IS_OK(mEffect->getParameter(id, &get));
Shunkai Yaoeea19942023-02-16 02:31:24 +0000409 EXPECT_EQ(expect, get) << expect.toString() << "\n vs \n" << get.toString();
Shunkai Yao812d5b42022-11-16 18:08:50 +0000410
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000411 ASSERT_NO_FATAL_FAILURE(close(mEffect));
412 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000413}
414
415// Verify parameters pass in set can be successfully get.
Shunkai Yao812d5b42022-11-16 18:08:50 +0000416TEST_P(AudioEffectTest, SetAndGetCommonParameter) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000417 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
418 ASSERT_NO_FATAL_FAILURE(open(mEffect));
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(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 PROCESSING state.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000430TEST_P(AudioEffectTest, SetAndGetParameterInProcessing) {
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));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000435
436 Parameter::Common common = EffectHelper::createParamCommon(
437 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */);
Shunkai Yao5df4e6c2023-01-10 03:20:00 +0000438 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::common);
439 ASSERT_NO_FATAL_FAILURE(setAndGetParameter(id, Parameter::make<Parameter::common>(common)));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000440
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000441 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
442 ASSERT_NO_FATAL_FAILURE(close(mEffect));
443 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000444}
445
Shunkai Yao812d5b42022-11-16 18:08:50 +0000446// Verify parameters set and get in IDLE state.
447TEST_P(AudioEffectTest, SetAndGetParameterInIdle) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000448 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
449 ASSERT_NO_FATAL_FAILURE(open(mEffect));
450 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
451 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
452 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
453 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000454
455 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 Yao812d5b42022-11-16 18:08:50 +0000459
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000460 ASSERT_NO_FATAL_FAILURE(close(mEffect));
461 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000462}
463
Shunkai Yao812d5b42022-11-16 18:08:50 +0000464// Verify Parameters kept after stop.
465TEST_P(AudioEffectTest, SetAndGetParameterAfterStop) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000466 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
467 ASSERT_NO_FATAL_FAILURE(open(mEffect));
468 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
469 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000470
Shunkai Yao812d5b42022-11-16 18:08:50 +0000471 Parameter::Common common = EffectHelper::createParamCommon(
472 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */);
Shunkai Yao5df4e6c2023-01-10 03:20:00 +0000473 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::common);
474 ASSERT_NO_FATAL_FAILURE(setAndGetParameter(id, Parameter::make<Parameter::common>(common)));
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000475
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000476 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
477 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000478 ASSERT_NO_FATAL_FAILURE(close(mEffect));
479 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000480}
481
Shunkai Yao812d5b42022-11-16 18:08:50 +0000482// Verify Parameters kept after reset.
483TEST_P(AudioEffectTest, SetAndGetParameterAfterReset) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000484 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
485 ASSERT_NO_FATAL_FAILURE(open(mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000486
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000487 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
488 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000489
490 Parameter::Common common = EffectHelper::createParamCommon(
491 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */);
Shunkai Yao5df4e6c2023-01-10 03:20:00 +0000492 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::common);
493 ASSERT_NO_FATAL_FAILURE(setAndGetParameter(id, Parameter::make<Parameter::common>(common)));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000494
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000495 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::RESET));
496 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000497
Shunkai Yao5df4e6c2023-01-10 03:20:00 +0000498 ASSERT_NO_FATAL_FAILURE(setAndGetParameter(id, Parameter::make<Parameter::common>(common)));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000499
Shunkai Yao5df4e6c2023-01-10 03:20:00 +0000500 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
501 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000502 ASSERT_NO_FATAL_FAILURE(close(mEffect));
503 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000504}
Shunkai Yao5df4e6c2023-01-10 03:20:00 +0000505
506// Set and get AudioDeviceDescription in Parameter
507TEST_P(AudioEffectTest, SetAndGetParameterDeviceDescription) {
Shunkai Yao92cd7482023-09-18 17:37:45 +0000508 if (!mDescriptor.common.flags.deviceIndication) {
509 GTEST_SKIP() << "Skipping test as effect does not support deviceIndication"
510 << mDescriptor.common.flags.toString();
511 }
512
Shunkai Yao5df4e6c2023-01-10 03:20:00 +0000513 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
514 ASSERT_NO_FATAL_FAILURE(open(mEffect));
515
516 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
517 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
518
519 std::vector<AudioDeviceDescription> deviceDescs = {
520 {.type = AudioDeviceType::IN_DEFAULT,
521 .connection = AudioDeviceDescription::CONNECTION_ANALOG},
522 {.type = AudioDeviceType::IN_DEVICE,
523 .connection = AudioDeviceDescription::CONNECTION_BT_A2DP}};
524 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::deviceDescription);
525 ASSERT_NO_FATAL_FAILURE(
526 setAndGetParameter(id, Parameter::make<Parameter::deviceDescription>(deviceDescs)));
527
528 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
529 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
530 ASSERT_NO_FATAL_FAILURE(close(mEffect));
531 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
532}
533
534// Set and get AudioMode in Parameter
535TEST_P(AudioEffectTest, SetAndGetParameterAudioMode) {
Shunkai Yao92cd7482023-09-18 17:37:45 +0000536 if (!mDescriptor.common.flags.audioModeIndication) {
537 GTEST_SKIP() << "Skipping test as effect does not support audioModeIndication"
538 << mDescriptor.common.flags.toString();
539 }
540
Shunkai Yao5df4e6c2023-01-10 03:20:00 +0000541 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
542 ASSERT_NO_FATAL_FAILURE(open(mEffect));
543
544 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
545 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
546
547 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::mode);
548 ASSERT_NO_FATAL_FAILURE(
549 setAndGetParameter(id, Parameter::make<Parameter::mode>(AudioMode::NORMAL)));
550 ASSERT_NO_FATAL_FAILURE(
551 setAndGetParameter(id, Parameter::make<Parameter::mode>(AudioMode::IN_COMMUNICATION)));
552
553 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
554 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
555 ASSERT_NO_FATAL_FAILURE(close(mEffect));
556 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
557}
558
559// Set and get AudioSource in Parameter
560TEST_P(AudioEffectTest, SetAndGetParameterAudioSource) {
Shunkai Yao92cd7482023-09-18 17:37:45 +0000561 if (!mDescriptor.common.flags.audioSourceIndication) {
562 GTEST_SKIP() << "Skipping test as effect does not support audioSourceIndication"
563 << mDescriptor.common.flags.toString();
564 }
565
Shunkai Yao5df4e6c2023-01-10 03:20:00 +0000566 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
567 ASSERT_NO_FATAL_FAILURE(open(mEffect));
568
569 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
570 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
571
572 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::source);
573 ASSERT_NO_FATAL_FAILURE(
574 setAndGetParameter(id, Parameter::make<Parameter::source>(AudioSource::DEFAULT)));
575 ASSERT_NO_FATAL_FAILURE(setAndGetParameter(
576 id, Parameter::make<Parameter::source>(AudioSource::VOICE_RECOGNITION)));
577
578 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
579 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
580 ASSERT_NO_FATAL_FAILURE(close(mEffect));
581 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
582}
583
584// Set and get VolumeStereo in Parameter
585TEST_P(AudioEffectTest, SetAndGetParameterVolume) {
Shunkai Yao92cd7482023-09-18 17:37:45 +0000586 if (mDescriptor.common.flags.volume == Flags::Volume::NONE) {
587 GTEST_SKIP() << "Skipping test as effect does not support volume"
588 << mDescriptor.common.flags.toString();
589 }
590
Shunkai Yao5df4e6c2023-01-10 03:20:00 +0000591 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
592 ASSERT_NO_FATAL_FAILURE(open(mEffect));
593
594 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
595 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
596
597 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::volumeStereo);
598 Parameter::VolumeStereo volume = {.left = 10.0, .right = 10.0};
599 ASSERT_NO_FATAL_FAILURE(
600 setAndGetParameter(id, Parameter::make<Parameter::volumeStereo>(volume)));
601
602 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
603 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
604 ASSERT_NO_FATAL_FAILURE(close(mEffect));
605 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
606}
607
Shunkai Yao812d5b42022-11-16 18:08:50 +0000608/// Data processing test
609// Send data to effects and expect it to be consumed by checking statusMQ.
Jaideep Sharmacba42862023-06-23 10:27:39 +0530610// Effects exposing bypass flags or operating in offload mode will be skipped.
611TEST_P(AudioEffectDataPathTest, ConsumeDataInProcessingState) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000612 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000613
614 Parameter::Common common = EffectHelper::createParamCommon(
615 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
616 kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
617 IEffect::OpenEffectReturn ret;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000618 ASSERT_NO_FATAL_FAILURE(open(mEffect, common, std::nullopt /* specific */, &ret, EX_NONE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000619 auto statusMQ = std::make_unique<EffectHelper::StatusMQ>(ret.statusMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000620 ASSERT_TRUE(statusMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000621 auto inputMQ = std::make_unique<EffectHelper::DataMQ>(ret.inputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000622 ASSERT_TRUE(inputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000623 auto outputMQ = std::make_unique<EffectHelper::DataMQ>(ret.outputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000624 ASSERT_TRUE(outputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000625
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000626 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
627 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000628
629 std::vector<float> buffer;
Shunkai Yaob49631f2023-02-03 01:44:32 +0000630 EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common, inputMQ, buffer));
Shunkai Yao41888a22023-04-10 17:13:30 +0000631 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(statusMQ, inputMQ, buffer));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000632 EXPECT_NO_FATAL_FAILURE(
633 EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000634
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000635 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
636 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000637 EXPECT_NO_FATAL_FAILURE(EffectHelper::readFromFmq(statusMQ, 0, outputMQ, 0, buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000638
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000639 ASSERT_NO_FATAL_FAILURE(close(mEffect));
640 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000641}
642
643// Send data to effects and expect it to be consumed after effect restart.
Jaideep Sharmacba42862023-06-23 10:27:39 +0530644// Effects exposing bypass flags or operating in offload mode will be skipped.
645TEST_P(AudioEffectDataPathTest, ConsumeDataAfterRestart) {
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
Shunkai Yao812d5b42022-11-16 18:08:50 +0000660 std::vector<float> buffer;
Shunkai Yaob49631f2023-02-03 01:44:32 +0000661 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
662 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
663 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
664 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
665 EXPECT_NO_FATAL_FAILURE(
666 EffectHelper::readFromFmq(statusMQ, 0, outputMQ, buffer.size(), buffer));
667 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
668 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
669
670 EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common, inputMQ, buffer));
Shunkai Yao41888a22023-04-10 17:13:30 +0000671 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(statusMQ, inputMQ, buffer));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000672 EXPECT_NO_FATAL_FAILURE(
673 EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000674
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000675 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
676 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000677 EXPECT_NO_FATAL_FAILURE(EffectHelper::readFromFmq(statusMQ, 0, outputMQ, 0, buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000678
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000679 ASSERT_NO_FATAL_FAILURE(close(mEffect));
680 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000681}
682
683// Send data to IDLE effects and expect it to be consumed after effect start.
Jaideep Sharmacba42862023-06-23 10:27:39 +0530684// Effects exposing bypass flags or operating in offload mode will be skipped.
685TEST_P(AudioEffectDataPathTest, SendDataAtIdleAndConsumeDataInProcessing) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000686 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000687
688 Parameter::Common common = EffectHelper::createParamCommon(
689 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
690 kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
691 IEffect::OpenEffectReturn ret;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000692 ASSERT_NO_FATAL_FAILURE(open(mEffect, common, std::nullopt /* specific */, &ret, EX_NONE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000693 auto statusMQ = std::make_unique<EffectHelper::StatusMQ>(ret.statusMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000694 ASSERT_TRUE(statusMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000695 auto inputMQ = std::make_unique<EffectHelper::DataMQ>(ret.inputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000696 ASSERT_TRUE(inputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000697 auto outputMQ = std::make_unique<EffectHelper::DataMQ>(ret.outputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000698 ASSERT_TRUE(outputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000699
700 std::vector<float> buffer;
Shunkai Yaob49631f2023-02-03 01:44:32 +0000701 EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common, inputMQ, buffer));
Shunkai Yao41888a22023-04-10 17:13:30 +0000702 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(statusMQ, inputMQ, buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000703
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000704 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
705 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000706
Shunkai Yaob49631f2023-02-03 01:44:32 +0000707 EXPECT_NO_FATAL_FAILURE(
708 EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000709
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000710 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
711 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
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
717// Send data multiple times.
Jaideep Sharmacba42862023-06-23 10:27:39 +0530718// Effects exposing bypass flags or operating in offload mode will be skipped.
719TEST_P(AudioEffectDataPathTest, ProcessDataMultipleTimes) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000720 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000721
722 Parameter::Common common = EffectHelper::createParamCommon(
723 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
724 kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
725 IEffect::OpenEffectReturn ret;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000726 ASSERT_NO_FATAL_FAILURE(open(mEffect, common, std::nullopt /* specific */, &ret, EX_NONE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000727 auto statusMQ = std::make_unique<EffectHelper::StatusMQ>(ret.statusMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000728 ASSERT_TRUE(statusMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000729 auto inputMQ = std::make_unique<EffectHelper::DataMQ>(ret.inputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000730 ASSERT_TRUE(inputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000731 auto outputMQ = std::make_unique<EffectHelper::DataMQ>(ret.outputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000732 ASSERT_TRUE(outputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000733
734 std::vector<float> buffer;
Shunkai Yaob49631f2023-02-03 01:44:32 +0000735 EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common, inputMQ, buffer));
Shunkai Yao41888a22023-04-10 17:13:30 +0000736 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(statusMQ, inputMQ, buffer));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000737 EXPECT_NO_FATAL_FAILURE(EffectHelper::readFromFmq(statusMQ, 0, outputMQ, 0, buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000738
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000739 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
740 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000741
Shunkai Yaob49631f2023-02-03 01:44:32 +0000742 EXPECT_NO_FATAL_FAILURE(
743 EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000744
Shunkai Yao41888a22023-04-10 17:13:30 +0000745 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(statusMQ, inputMQ, buffer));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000746 EXPECT_NO_FATAL_FAILURE(
747 EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000748
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000749 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
750 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000751 EXPECT_NO_FATAL_FAILURE(EffectHelper::readFromFmq(statusMQ, 0, outputMQ, 0, buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000752
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000753 ASSERT_NO_FATAL_FAILURE(close(mEffect));
754 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000755}
756
Shunkai Yaob49631f2023-02-03 01:44:32 +0000757// Send data to processing state effects, stop, and restart.
Jaideep Sharmacba42862023-06-23 10:27:39 +0530758// Effects exposing bypass flags or operating in offload mode will be skipped.
759TEST_P(AudioEffectDataPathTest, ConsumeDataAndRestart) {
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));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000767 auto statusMQ = std::make_unique<EffectHelper::StatusMQ>(ret.statusMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000768 ASSERT_TRUE(statusMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000769 auto inputMQ = std::make_unique<EffectHelper::DataMQ>(ret.inputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000770 ASSERT_TRUE(inputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000771 auto outputMQ = std::make_unique<EffectHelper::DataMQ>(ret.outputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000772 ASSERT_TRUE(outputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000773
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000774 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
775 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000776 std::vector<float> buffer;
777 EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common, inputMQ, buffer));
Shunkai Yao41888a22023-04-10 17:13:30 +0000778 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(statusMQ, inputMQ, buffer));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000779 EXPECT_NO_FATAL_FAILURE(
780 EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
781
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000782 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
783 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yao41888a22023-04-10 17:13:30 +0000784 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(statusMQ, inputMQ, buffer));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000785 EXPECT_NO_FATAL_FAILURE(EffectHelper::readFromFmq(statusMQ, 0, outputMQ, 0, buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000786
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000787 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
788 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000789 EXPECT_NO_FATAL_FAILURE(
790 EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000791
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000792 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
793 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000794
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000795 ASSERT_NO_FATAL_FAILURE(close(mEffect));
796 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000797}
798
799// Send data to closed effects and expect it not be consumed.
Jaideep Sharmacba42862023-06-23 10:27:39 +0530800// Effects exposing bypass flags or operating in offload mode will be skipped.
801TEST_P(AudioEffectDataPathTest, NotConsumeDataByClosedEffect) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000802 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000803
804 Parameter::Common common = EffectHelper::createParamCommon(
805 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
806 kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
807 IEffect::OpenEffectReturn ret;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000808 ASSERT_NO_FATAL_FAILURE(open(mEffect, common, std::nullopt /* specific */, &ret, EX_NONE));
809 ASSERT_NO_FATAL_FAILURE(close(mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000810
811 auto statusMQ = std::make_unique<EffectHelper::StatusMQ>(ret.statusMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000812 ASSERT_TRUE(statusMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000813 auto inputMQ = std::make_unique<EffectHelper::DataMQ>(ret.inputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000814 ASSERT_TRUE(inputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000815 auto outputMQ = std::make_unique<EffectHelper::DataMQ>(ret.outputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000816 ASSERT_TRUE(outputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000817
818 std::vector<float> buffer;
Shunkai Yaob49631f2023-02-03 01:44:32 +0000819 EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common, inputMQ, buffer));
Shunkai Yao41888a22023-04-10 17:13:30 +0000820 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(statusMQ, inputMQ, buffer));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000821 EXPECT_NO_FATAL_FAILURE(EffectHelper::readFromFmq(statusMQ, 0, outputMQ, 0, buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000822
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000823 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000824}
825
826// Send data to multiple effects.
Jaideep Sharmacba42862023-06-23 10:27:39 +0530827// Effects exposing bypass flags or operating in offload mode will be skipped.
828TEST_P(AudioEffectDataPathTest, ConsumeDataMultipleEffects) {
Shunkai Yao812d5b42022-11-16 18:08:50 +0000829 std::shared_ptr<IEffect> effect1, effect2;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000830 ASSERT_NO_FATAL_FAILURE(create(mFactory, effect1, mDescriptor));
831 ASSERT_NO_FATAL_FAILURE(create(mFactory, effect2, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000832
833 Parameter::Common common1 = EffectHelper::createParamCommon(
834 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
835 kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
836 Parameter::Common common2 = EffectHelper::createParamCommon(
837 1 /* session */, 1 /* ioHandle */, 48000 /* iSampleRate */, 48000 /* oSampleRate */,
838 2 * kInputFrameCount /* iFrameCount */, 2 * kOutputFrameCount /* oFrameCount */);
839 IEffect::OpenEffectReturn ret1, ret2;
840 ASSERT_NO_FATAL_FAILURE(open(effect1, common1, std::nullopt /* specific */, &ret1, EX_NONE));
841 ASSERT_NO_FATAL_FAILURE(open(effect2, common2, std::nullopt /* specific */, &ret2, EX_NONE));
842 ASSERT_NO_FATAL_FAILURE(command(effect1, CommandId::START));
843 ASSERT_NO_FATAL_FAILURE(expectState(effect1, State::PROCESSING));
844 ASSERT_NO_FATAL_FAILURE(command(effect2, CommandId::START));
845 ASSERT_NO_FATAL_FAILURE(expectState(effect2, State::PROCESSING));
846
847 auto statusMQ1 = std::make_unique<EffectHelper::StatusMQ>(ret1.statusMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000848 ASSERT_TRUE(statusMQ1->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000849 auto inputMQ1 = std::make_unique<EffectHelper::DataMQ>(ret1.inputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000850 ASSERT_TRUE(inputMQ1->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000851 auto outputMQ1 = std::make_unique<EffectHelper::DataMQ>(ret1.outputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000852 ASSERT_TRUE(outputMQ1->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000853
854 std::vector<float> buffer1, buffer2;
Shunkai Yaob49631f2023-02-03 01:44:32 +0000855 EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common1, inputMQ1, buffer1));
Shunkai Yao41888a22023-04-10 17:13:30 +0000856 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(statusMQ1, inputMQ1, buffer1));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000857 EXPECT_NO_FATAL_FAILURE(
858 EffectHelper::readFromFmq(statusMQ1, 1, outputMQ1, buffer1.size(), buffer1));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000859
860 auto statusMQ2 = std::make_unique<EffectHelper::StatusMQ>(ret2.statusMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000861 ASSERT_TRUE(statusMQ2->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000862 auto inputMQ2 = std::make_unique<EffectHelper::DataMQ>(ret2.inputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000863 ASSERT_TRUE(inputMQ2->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000864 auto outputMQ2 = std::make_unique<EffectHelper::DataMQ>(ret2.outputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000865 ASSERT_TRUE(outputMQ2->isValid());
Shunkai Yaob49631f2023-02-03 01:44:32 +0000866 EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common2, inputMQ2, buffer2));
Shunkai Yao41888a22023-04-10 17:13:30 +0000867 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(statusMQ2, inputMQ2, buffer2));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000868 EXPECT_NO_FATAL_FAILURE(
869 EffectHelper::readFromFmq(statusMQ2, 1, outputMQ2, buffer2.size(), buffer2));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000870
871 ASSERT_NO_FATAL_FAILURE(command(effect1, CommandId::STOP));
872 ASSERT_NO_FATAL_FAILURE(expectState(effect1, State::IDLE));
873 ASSERT_NO_FATAL_FAILURE(close(effect1));
874 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, effect1));
875
876 ASSERT_NO_FATAL_FAILURE(command(effect2, CommandId::STOP));
877 ASSERT_NO_FATAL_FAILURE(expectState(effect2, State::IDLE));
878 ASSERT_NO_FATAL_FAILURE(close(effect2));
879 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, effect2));
880}
881
882INSTANTIATE_TEST_SUITE_P(
883 SingleEffectInstanceTest, AudioEffectTest,
884 ::testing::Combine(testing::ValuesIn(
885 EffectFactoryHelper::getAllEffectDescriptors(IFactory::descriptor))),
886 [](const testing::TestParamInfo<AudioEffectTest::ParamType>& info) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000887 auto descriptor = std::get<PARAM_INSTANCE_NAME>(info.param).second;
Jaideep Sharmae4c7a962023-06-14 19:14:44 +0530888 std::string name = getPrefix(descriptor);
Shunkai Yao812d5b42022-11-16 18:08:50 +0000889 std::replace_if(
890 name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
891 return name;
892 });
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000893GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(AudioEffectTest);
Shunkai Yao67b1be62022-07-13 05:01:42 +0000894
Jaideep Sharmacba42862023-06-23 10:27:39 +0530895INSTANTIATE_TEST_SUITE_P(
896 SingleEffectInstanceTest, AudioEffectDataPathTest,
897 ::testing::Combine(testing::ValuesIn(
898 EffectFactoryHelper::getAllEffectDescriptors(IFactory::descriptor))),
899 [](const testing::TestParamInfo<AudioEffectDataPathTest::ParamType>& info) {
900 auto descriptor = std::get<PARAM_INSTANCE_NAME>(info.param).second;
901 std::string name = getPrefix(descriptor);
902 std::replace_if(
903 name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
904 return name;
905 });
906
907GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(AudioEffectDataPathTest);
908
Shunkai Yao67b1be62022-07-13 05:01:42 +0000909int main(int argc, char** argv) {
910 ::testing::InitGoogleTest(&argc, argv);
Jaideep Sharma74498412023-09-13 15:25:25 +0530911 ::testing::UnitTest::GetInstance()->listeners().Append(new TestExecutionTracer());
Shunkai Yao67b1be62022-07-13 05:01:42 +0000912 ABinderProcess_setThreadPoolMaxThreadCount(1);
913 ABinderProcess_startThreadPool();
914 return RUN_ALL_TESTS();
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000915}