blob: 3011a5ed2cac582470259fa9b065b06d372e87fc [file] [log] [blame]
Shunkai Yao67b1be62022-07-13 05:01:42 +00001/*
2 * Copyright (C) 2022 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +000017#define LOG_TAG "VtsHalAudioEffectTargetTest"
18
Shunkai Yao812d5b42022-11-16 18:08:50 +000019#include <chrono>
Shunkai Yao45905172022-08-24 18:14:02 +000020#include <memory>
Shunkai Yao67b1be62022-07-13 05:01:42 +000021#include <string>
Shunkai Yao45905172022-08-24 18:14:02 +000022#include <vector>
Shunkai Yao67b1be62022-07-13 05:01:42 +000023
Shunkai Yao67b1be62022-07-13 05:01:42 +000024#include <aidl/Gtest.h>
25#include <aidl/Vintf.h>
Shunkai Yao812d5b42022-11-16 18:08:50 +000026#include <aidl/android/hardware/audio/effect/IEffect.h>
27#include <aidl/android/hardware/audio/effect/IFactory.h>
Shunkai Yao67b1be62022-07-13 05:01:42 +000028#include <android-base/logging.h>
Shunkai Yao67b1be62022-07-13 05:01:42 +000029#include <android/binder_interface_utils.h>
30#include <android/binder_manager.h>
31#include <android/binder_process.h>
Shunkai Yao812d5b42022-11-16 18:08:50 +000032#include <fmq/AidlMessageQueue.h>
Shunkai Yao67b1be62022-07-13 05:01:42 +000033
34#include "AudioHalBinderServiceUtil.h"
Shunkai Yao812d5b42022-11-16 18:08:50 +000035#include "EffectFactoryHelper.h"
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +000036#include "EffectHelper.h"
Shunkai Yao121c6dd2022-09-21 23:42:08 +000037#include "TestUtils.h"
Shunkai Yao67b1be62022-07-13 05:01:42 +000038
39using namespace android;
40
41using ndk::ScopedAStatus;
42
Shunkai Yaoea24c1a2022-09-28 17:39:23 +000043using aidl::android::hardware::audio::effect::CommandId;
Shunkai Yao67b1be62022-07-13 05:01:42 +000044using aidl::android::hardware::audio::effect::Descriptor;
Shunkai Yao45905172022-08-24 18:14:02 +000045using aidl::android::hardware::audio::effect::IEffect;
Shunkai Yao67b1be62022-07-13 05:01:42 +000046using aidl::android::hardware::audio::effect::IFactory;
Shunkai Yaoea24c1a2022-09-28 17:39:23 +000047using aidl::android::hardware::audio::effect::Parameter;
48using aidl::android::hardware::audio::effect::State;
Jaideep Sharmacba42862023-06-23 10:27:39 +053049using aidl::android::hardware::audio::effect::Flags;
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
Jaideep Sharmacba42862023-06-23 10:27:39 +053089class AudioEffectDataPathTest : public AudioEffectTest {
90 public:
91 void SetUp() override {
92 AudioEffectTest::SetUp();
93 SKIP_TEST_IF_DATA_UNSUPPORTED(mDescriptor.common.flags);
94 }
95};
96
Shunkai Yao812d5b42022-11-16 18:08:50 +000097TEST_P(AudioEffectTest, SetupAndTearDown) {
98 // Intentionally empty test body.
Shunkai Yao45905172022-08-24 18:14:02 +000099}
100
Shunkai Yao812d5b42022-11-16 18:08:50 +0000101TEST_P(AudioEffectTest, CreateAndDestroy) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000102 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
103 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao45905172022-08-24 18:14:02 +0000104}
105
Shunkai Yao812d5b42022-11-16 18:08:50 +0000106TEST_P(AudioEffectTest, OpenAndClose) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000107 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
108 ASSERT_NO_FATAL_FAILURE(open(mEffect));
109 ASSERT_NO_FATAL_FAILURE(close(mEffect));
110 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao45905172022-08-24 18:14:02 +0000111}
112
Shunkai Yao812d5b42022-11-16 18:08:50 +0000113TEST_P(AudioEffectTest, CloseUnopenedEffect) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000114 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
115 ASSERT_NO_FATAL_FAILURE(close(mEffect));
116 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao45905172022-08-24 18:14:02 +0000117}
118
Shunkai Yao812d5b42022-11-16 18:08:50 +0000119TEST_P(AudioEffectTest, DoubleOpenAndClose) {
120 std::shared_ptr<IEffect> effect1, effect2;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000121 ASSERT_NO_FATAL_FAILURE(create(mFactory, effect1, mDescriptor));
122 ASSERT_NO_FATAL_FAILURE(create(mFactory, effect2, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000123 ASSERT_NO_FATAL_FAILURE(open(effect1));
124 ASSERT_NO_FATAL_FAILURE(open(effect2, 1 /* session */));
125 ASSERT_NO_FATAL_FAILURE(close(effect1));
126 ASSERT_NO_FATAL_FAILURE(close(effect2));
127 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, effect1));
128 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, effect2));
Shunkai Yao45905172022-08-24 18:14:02 +0000129}
130
Shunkai Yao812d5b42022-11-16 18:08:50 +0000131TEST_P(AudioEffectTest, TripleOpenAndClose) {
132 std::shared_ptr<IEffect> effect1, effect2, effect3;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000133 ASSERT_NO_FATAL_FAILURE(create(mFactory, effect1, mDescriptor));
134 ASSERT_NO_FATAL_FAILURE(create(mFactory, effect2, mDescriptor));
135 ASSERT_NO_FATAL_FAILURE(create(mFactory, effect3, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000136 ASSERT_NO_FATAL_FAILURE(open(effect1));
137 ASSERT_NO_FATAL_FAILURE(open(effect2, 1 /* session */));
138 ASSERT_NO_FATAL_FAILURE(open(effect3, 2 /* session */));
139 ASSERT_NO_FATAL_FAILURE(close(effect1));
140 ASSERT_NO_FATAL_FAILURE(close(effect2));
141 ASSERT_NO_FATAL_FAILURE(close(effect3));
142 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, effect1));
143 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, effect2));
144 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, effect3));
145}
Shunkai Yao45905172022-08-24 18:14:02 +0000146
Shunkai Yao812d5b42022-11-16 18:08:50 +0000147TEST_P(AudioEffectTest, GetDescritorBeforeOpen) {
Shunkai Yao812d5b42022-11-16 18:08:50 +0000148 Descriptor desc;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000149 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
150 ASSERT_NO_FATAL_FAILURE(getDescriptor(mEffect, desc));
Shunkai Yao4c4f3cd2023-02-28 01:50:40 +0000151 EXPECT_EQ(mDescriptor.common.id.type, desc.common.id.type);
152 EXPECT_EQ(mDescriptor.common.id.uuid, desc.common.id.uuid);
153 EXPECT_EQ(mDescriptor.common.name, desc.common.name);
154 EXPECT_EQ(mDescriptor.common.implementor, desc.common.implementor);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000155 // Effect implementation Must fill in implementor and name
Shunkai Yao812d5b42022-11-16 18:08:50 +0000156 EXPECT_NE("", desc.common.name);
157 EXPECT_NE("", desc.common.implementor);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000158 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000159}
160
161TEST_P(AudioEffectTest, GetDescritorAfterOpen) {
Shunkai Yao812d5b42022-11-16 18:08:50 +0000162 Descriptor beforeOpen, afterOpen, afterClose;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000163 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
164 ASSERT_NO_FATAL_FAILURE(getDescriptor(mEffect, beforeOpen));
165 ASSERT_NO_FATAL_FAILURE(open(mEffect));
166 ASSERT_NO_FATAL_FAILURE(getDescriptor(mEffect, afterOpen));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000167 EXPECT_EQ(beforeOpen.toString(), afterOpen.toString()) << "\n"
168 << beforeOpen.toString() << "\n"
169 << afterOpen.toString();
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000170 ASSERT_NO_FATAL_FAILURE(close(mEffect));
171 ASSERT_NO_FATAL_FAILURE(getDescriptor(mEffect, afterClose));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000172 EXPECT_EQ(beforeOpen.toString(), afterClose.toString()) << "\n"
173 << beforeOpen.toString() << "\n"
174 << afterClose.toString();
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000175 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000176}
177
178TEST_P(AudioEffectTest, DescriptorExistAndUnique) {
Shunkai Yao812d5b42022-11-16 18:08:50 +0000179 Descriptor desc;
180
181 auto descList = EffectFactoryHelper::getAllEffectDescriptors(IFactory::descriptor);
182 std::set<Descriptor::Identity> idSet;
183 for (const auto& it : descList) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000184 auto& id = it.second.common.id;
Shunkai Yao812d5b42022-11-16 18:08:50 +0000185 EXPECT_EQ(0ul, idSet.count(id));
186 idSet.insert(id);
Shunkai Yao45905172022-08-24 18:14:02 +0000187 }
Shunkai Yao812d5b42022-11-16 18:08:50 +0000188
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000189 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
190 ASSERT_NO_FATAL_FAILURE(getDescriptor(mEffect, desc));
Shunkai Yao4c4f3cd2023-02-28 01:50:40 +0000191 int uuidCount = std::count_if(idSet.begin(), idSet.end(), [&](const auto& id) {
192 return id.uuid == desc.common.id.uuid && id.type == desc.common.id.type;
193 });
194
195 EXPECT_EQ(1, uuidCount);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000196 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao45905172022-08-24 18:14:02 +0000197}
198
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000199/// State testing.
200// An effect instance is in INIT state by default after it was created.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000201TEST_P(AudioEffectTest, InitStateAfterCreation) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000202 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
203 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::INIT));
204 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000205}
206
Shunkai Yao812d5b42022-11-16 18:08:50 +0000207// An effect instance transfer to IDLE state after IEffect.ASSERT_NO_FATAL_FAILURE(open().
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000208TEST_P(AudioEffectTest, IdleStateAfterOpen) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000209 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
210 ASSERT_NO_FATAL_FAILURE(open(mEffect));
211 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
212 ASSERT_NO_FATAL_FAILURE(close(mEffect));
213 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000214}
215
216// An effect instance is in PROCESSING state after it receive an START command.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000217TEST_P(AudioEffectTest, ProcessingStateAfterStart) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000218 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
219 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::INIT));
220 ASSERT_NO_FATAL_FAILURE(open(mEffect));
221 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
222 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
223 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
224 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
225 ASSERT_NO_FATAL_FAILURE(close(mEffect));
226 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000227}
228
229// An effect instance transfer to IDLE state after Command.Id.STOP in PROCESSING state.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000230TEST_P(AudioEffectTest, IdleStateAfterStop) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000231 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
232 ASSERT_NO_FATAL_FAILURE(open(mEffect));
233 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
234 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
235 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
236 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
237 ASSERT_NO_FATAL_FAILURE(close(mEffect));
238 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000239}
240
241// An effect instance transfer to IDLE state after Command.Id.RESET in PROCESSING state.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000242TEST_P(AudioEffectTest, IdleStateAfterReset) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000243 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
244 ASSERT_NO_FATAL_FAILURE(open(mEffect));
245 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
246 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
247 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::RESET));
248 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
249 ASSERT_NO_FATAL_FAILURE(close(mEffect));
250 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000251}
252
Shunkai Yao812d5b42022-11-16 18:08:50 +0000253// An effect instance transfer to INIT after IEffect.ASSERT_NO_FATAL_FAILURE(close().
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000254TEST_P(AudioEffectTest, InitStateAfterClose) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000255 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
256 ASSERT_NO_FATAL_FAILURE(open(mEffect));
257 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
258 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
259 ASSERT_NO_FATAL_FAILURE(close(mEffect));
260 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::INIT));
261 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000262}
263
264// An effect instance shouldn't accept any command before open.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000265TEST_P(AudioEffectTest, NoCommandAcceptedBeforeOpen) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000266 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
267 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START, EX_ILLEGAL_STATE));
268 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP, EX_ILLEGAL_STATE));
269 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::RESET, EX_ILLEGAL_STATE));
270 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000271}
272
273// No-op when receive STOP command in IDLE state.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000274TEST_P(AudioEffectTest, StopCommandInIdleStateNoOp) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000275 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
276 ASSERT_NO_FATAL_FAILURE(open(mEffect));
277 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
278 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
279 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
280 ASSERT_NO_FATAL_FAILURE(close(mEffect));
281 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000282}
283
Shunkai Yao812d5b42022-11-16 18:08:50 +0000284// No-op when receive RESET command in IDLE state.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000285TEST_P(AudioEffectTest, ResetCommandInIdleStateNoOp) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000286 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
287 ASSERT_NO_FATAL_FAILURE(open(mEffect));
288 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
289 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::RESET));
290 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
291 ASSERT_NO_FATAL_FAILURE(close(mEffect));
292 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000293}
294
295// Repeat START and STOP command.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000296TEST_P(AudioEffectTest, RepeatStartAndStop) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000297 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
298 ASSERT_NO_FATAL_FAILURE(open(mEffect));
299 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
300 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
301 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
302 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
303 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000304
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000305 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
306 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
307 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
308 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
309 ASSERT_NO_FATAL_FAILURE(close(mEffect));
310 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000311}
312
313// Repeat START and RESET command.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000314TEST_P(AudioEffectTest, RepeatStartAndReset) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000315 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
316 ASSERT_NO_FATAL_FAILURE(open(mEffect));
317 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
318 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
319 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
320 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::RESET));
321 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000322
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000323 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
324 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
325 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::RESET));
326 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
327 ASSERT_NO_FATAL_FAILURE(close(mEffect));
328 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000329}
330
Shunkai Yao812d5b42022-11-16 18:08:50 +0000331// Try to close an effect instance at PROCESSING state.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000332TEST_P(AudioEffectTest, CloseProcessingStateEffects) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000333 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
334 ASSERT_NO_FATAL_FAILURE(open(mEffect));
335 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
336 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
337 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000338
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000339 ASSERT_NO_FATAL_FAILURE(close(mEffect, EX_ILLEGAL_STATE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000340
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000341 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
342 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
343 ASSERT_NO_FATAL_FAILURE(close(mEffect));
344 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000345}
346
347// Expect EX_ILLEGAL_STATE if the effect instance is not in a proper state to be destroyed.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000348TEST_P(AudioEffectTest, DestroyOpenEffects) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000349 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
350 ASSERT_NO_FATAL_FAILURE(open(mEffect));
351 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +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(close(mEffect));
357 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000358}
359
360// Expect EX_ILLEGAL_STATE if the effect instance is not in a proper state to be destroyed.
361TEST_P(AudioEffectTest, DestroyProcessingEffects) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000362 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
363 ASSERT_NO_FATAL_FAILURE(open(mEffect));
364 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
365 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
366 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000367
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000368 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect, EX_ILLEGAL_STATE));
369
370 // cleanup
371 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
372 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
373 ASSERT_NO_FATAL_FAILURE(close(mEffect));
374 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000375}
376
377TEST_P(AudioEffectTest, NormalSequenceStates) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000378 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
379 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::INIT));
380 ASSERT_NO_FATAL_FAILURE(open(mEffect));
381 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
382 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
383 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
384 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
385 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
386 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
387 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
388 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::RESET));
389 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
390 ASSERT_NO_FATAL_FAILURE(close(mEffect));
391 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000392}
393
394/// Parameter testing.
395// Verify parameters pass in open can be successfully get.
Shunkai Yao812d5b42022-11-16 18:08:50 +0000396TEST_P(AudioEffectTest, VerifyCommonParametersAfterOpen) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000397 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000398
399 Parameter::Common common = EffectHelper::createParamCommon();
400 IEffect::OpenEffectReturn ret;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000401 ASSERT_NO_FATAL_FAILURE(open(mEffect, common, std::nullopt /* specific */, &ret, EX_NONE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000402
403 Parameter get = Parameter(), expect = Parameter();
404 expect.set<Parameter::common>(common);
405 Parameter::Id id;
406 id.set<Parameter::Id::commonTag>(Parameter::common);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000407 EXPECT_IS_OK(mEffect->getParameter(id, &get));
Shunkai Yaoeea19942023-02-16 02:31:24 +0000408 EXPECT_EQ(expect, get) << expect.toString() << "\n vs \n" << get.toString();
Shunkai Yao812d5b42022-11-16 18:08:50 +0000409
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000410 ASSERT_NO_FATAL_FAILURE(close(mEffect));
411 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000412}
413
414// Verify parameters pass in set can be successfully get.
Shunkai Yao812d5b42022-11-16 18:08:50 +0000415TEST_P(AudioEffectTest, SetAndGetCommonParameter) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000416 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
417 ASSERT_NO_FATAL_FAILURE(open(mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000418
419 Parameter::Common common = EffectHelper::createParamCommon(
420 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */);
Shunkai Yao5df4e6c2023-01-10 03:20:00 +0000421 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::common);
422 ASSERT_NO_FATAL_FAILURE(setAndGetParameter(id, Parameter::make<Parameter::common>(common)));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000423
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000424 ASSERT_NO_FATAL_FAILURE(close(mEffect));
425 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000426}
427
Shunkai Yao812d5b42022-11-16 18:08:50 +0000428// Verify parameters set and get in PROCESSING state.
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000429TEST_P(AudioEffectTest, SetAndGetParameterInProcessing) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000430 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
431 ASSERT_NO_FATAL_FAILURE(open(mEffect));
432 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
433 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000434
435 Parameter::Common common = EffectHelper::createParamCommon(
436 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */);
Shunkai Yao5df4e6c2023-01-10 03:20:00 +0000437 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::common);
438 ASSERT_NO_FATAL_FAILURE(setAndGetParameter(id, Parameter::make<Parameter::common>(common)));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000439
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000440 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
441 ASSERT_NO_FATAL_FAILURE(close(mEffect));
442 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000443}
444
Shunkai Yao812d5b42022-11-16 18:08:50 +0000445// Verify parameters set and get in IDLE state.
446TEST_P(AudioEffectTest, SetAndGetParameterInIdle) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000447 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
448 ASSERT_NO_FATAL_FAILURE(open(mEffect));
449 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
450 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
451 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
452 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000453
454 Parameter::Common common = EffectHelper::createParamCommon(
455 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */);
Shunkai Yao5df4e6c2023-01-10 03:20:00 +0000456 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::common);
457 ASSERT_NO_FATAL_FAILURE(setAndGetParameter(id, Parameter::make<Parameter::common>(common)));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000458
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000459 ASSERT_NO_FATAL_FAILURE(close(mEffect));
460 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000461}
462
Shunkai Yao812d5b42022-11-16 18:08:50 +0000463// Verify Parameters kept after stop.
464TEST_P(AudioEffectTest, SetAndGetParameterAfterStop) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000465 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
466 ASSERT_NO_FATAL_FAILURE(open(mEffect));
467 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
468 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yaoea24c1a2022-09-28 17:39:23 +0000469
Shunkai Yao812d5b42022-11-16 18:08:50 +0000470 Parameter::Common common = EffectHelper::createParamCommon(
471 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */);
Shunkai Yao5df4e6c2023-01-10 03:20:00 +0000472 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::common);
473 ASSERT_NO_FATAL_FAILURE(setAndGetParameter(id, Parameter::make<Parameter::common>(common)));
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000474
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000475 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
476 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000477 ASSERT_NO_FATAL_FAILURE(close(mEffect));
478 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000479}
480
Shunkai Yao812d5b42022-11-16 18:08:50 +0000481// Verify Parameters kept after reset.
482TEST_P(AudioEffectTest, SetAndGetParameterAfterReset) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000483 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
484 ASSERT_NO_FATAL_FAILURE(open(mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000485
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000486 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
487 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000488
489 Parameter::Common common = EffectHelper::createParamCommon(
490 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */);
Shunkai Yao5df4e6c2023-01-10 03:20:00 +0000491 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::common);
492 ASSERT_NO_FATAL_FAILURE(setAndGetParameter(id, Parameter::make<Parameter::common>(common)));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000493
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000494 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::RESET));
495 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000496
Shunkai Yao5df4e6c2023-01-10 03:20:00 +0000497 ASSERT_NO_FATAL_FAILURE(setAndGetParameter(id, Parameter::make<Parameter::common>(common)));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000498
Shunkai Yao5df4e6c2023-01-10 03:20:00 +0000499 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
500 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000501 ASSERT_NO_FATAL_FAILURE(close(mEffect));
502 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000503}
Shunkai Yao5df4e6c2023-01-10 03:20:00 +0000504
505// Set and get AudioDeviceDescription in Parameter
506TEST_P(AudioEffectTest, SetAndGetParameterDeviceDescription) {
507 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
508 ASSERT_NO_FATAL_FAILURE(open(mEffect));
509
510 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
511 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
512
513 std::vector<AudioDeviceDescription> deviceDescs = {
514 {.type = AudioDeviceType::IN_DEFAULT,
515 .connection = AudioDeviceDescription::CONNECTION_ANALOG},
516 {.type = AudioDeviceType::IN_DEVICE,
517 .connection = AudioDeviceDescription::CONNECTION_BT_A2DP}};
518 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::deviceDescription);
519 ASSERT_NO_FATAL_FAILURE(
520 setAndGetParameter(id, Parameter::make<Parameter::deviceDescription>(deviceDescs)));
521
522 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
523 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
524 ASSERT_NO_FATAL_FAILURE(close(mEffect));
525 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
526}
527
528// Set and get AudioMode in Parameter
529TEST_P(AudioEffectTest, SetAndGetParameterAudioMode) {
530 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
531 ASSERT_NO_FATAL_FAILURE(open(mEffect));
532
533 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
534 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
535
536 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::mode);
537 ASSERT_NO_FATAL_FAILURE(
538 setAndGetParameter(id, Parameter::make<Parameter::mode>(AudioMode::NORMAL)));
539 ASSERT_NO_FATAL_FAILURE(
540 setAndGetParameter(id, Parameter::make<Parameter::mode>(AudioMode::IN_COMMUNICATION)));
541
542 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
543 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
544 ASSERT_NO_FATAL_FAILURE(close(mEffect));
545 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
546}
547
548// Set and get AudioSource in Parameter
549TEST_P(AudioEffectTest, SetAndGetParameterAudioSource) {
550 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
551 ASSERT_NO_FATAL_FAILURE(open(mEffect));
552
553 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
554 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
555
556 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::source);
557 ASSERT_NO_FATAL_FAILURE(
558 setAndGetParameter(id, Parameter::make<Parameter::source>(AudioSource::DEFAULT)));
559 ASSERT_NO_FATAL_FAILURE(setAndGetParameter(
560 id, Parameter::make<Parameter::source>(AudioSource::VOICE_RECOGNITION)));
561
562 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
563 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
564 ASSERT_NO_FATAL_FAILURE(close(mEffect));
565 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
566}
567
568// Set and get VolumeStereo in Parameter
569TEST_P(AudioEffectTest, SetAndGetParameterVolume) {
570 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
571 ASSERT_NO_FATAL_FAILURE(open(mEffect));
572
573 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
574 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
575
576 Parameter::Id id = Parameter::Id::make<Parameter::Id::commonTag>(Parameter::volumeStereo);
577 Parameter::VolumeStereo volume = {.left = 10.0, .right = 10.0};
578 ASSERT_NO_FATAL_FAILURE(
579 setAndGetParameter(id, Parameter::make<Parameter::volumeStereo>(volume)));
580
581 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
582 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
583 ASSERT_NO_FATAL_FAILURE(close(mEffect));
584 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
585}
586
Shunkai Yao812d5b42022-11-16 18:08:50 +0000587/// Data processing test
588// Send data to effects and expect it to be consumed by checking statusMQ.
Jaideep Sharmacba42862023-06-23 10:27:39 +0530589// Effects exposing bypass flags or operating in offload mode will be skipped.
590TEST_P(AudioEffectDataPathTest, ConsumeDataInProcessingState) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000591 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000592
593 Parameter::Common common = EffectHelper::createParamCommon(
594 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
595 kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
596 IEffect::OpenEffectReturn ret;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000597 ASSERT_NO_FATAL_FAILURE(open(mEffect, common, std::nullopt /* specific */, &ret, EX_NONE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000598 auto statusMQ = std::make_unique<EffectHelper::StatusMQ>(ret.statusMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000599 ASSERT_TRUE(statusMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000600 auto inputMQ = std::make_unique<EffectHelper::DataMQ>(ret.inputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000601 ASSERT_TRUE(inputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000602 auto outputMQ = std::make_unique<EffectHelper::DataMQ>(ret.outputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000603 ASSERT_TRUE(outputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000604
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000605 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
606 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000607
608 std::vector<float> buffer;
Shunkai Yaob49631f2023-02-03 01:44:32 +0000609 EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common, inputMQ, buffer));
Shunkai Yao41888a22023-04-10 17:13:30 +0000610 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(statusMQ, inputMQ, buffer));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000611 EXPECT_NO_FATAL_FAILURE(
612 EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000613
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000614 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
615 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000616 EXPECT_NO_FATAL_FAILURE(EffectHelper::readFromFmq(statusMQ, 0, outputMQ, 0, buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000617
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000618 ASSERT_NO_FATAL_FAILURE(close(mEffect));
619 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000620}
621
622// Send data to effects and expect it to be consumed after effect restart.
Jaideep Sharmacba42862023-06-23 10:27:39 +0530623// Effects exposing bypass flags or operating in offload mode will be skipped.
624TEST_P(AudioEffectDataPathTest, ConsumeDataAfterRestart) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000625 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000626
627 Parameter::Common common = EffectHelper::createParamCommon(
628 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
629 kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
630 IEffect::OpenEffectReturn ret;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000631 ASSERT_NO_FATAL_FAILURE(open(mEffect, common, std::nullopt /* specific */, &ret, EX_NONE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000632 auto statusMQ = std::make_unique<EffectHelper::StatusMQ>(ret.statusMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000633 ASSERT_TRUE(statusMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000634 auto inputMQ = std::make_unique<EffectHelper::DataMQ>(ret.inputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000635 ASSERT_TRUE(inputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000636 auto outputMQ = std::make_unique<EffectHelper::DataMQ>(ret.outputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000637 ASSERT_TRUE(outputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000638
Shunkai Yao812d5b42022-11-16 18:08:50 +0000639 std::vector<float> buffer;
Shunkai Yaob49631f2023-02-03 01:44:32 +0000640 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
641 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
642 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
643 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
644 EXPECT_NO_FATAL_FAILURE(
645 EffectHelper::readFromFmq(statusMQ, 0, outputMQ, buffer.size(), buffer));
646 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
647 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
648
649 EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common, inputMQ, buffer));
Shunkai Yao41888a22023-04-10 17:13:30 +0000650 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(statusMQ, inputMQ, buffer));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000651 EXPECT_NO_FATAL_FAILURE(
652 EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000653
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000654 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
655 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000656 EXPECT_NO_FATAL_FAILURE(EffectHelper::readFromFmq(statusMQ, 0, outputMQ, 0, buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000657
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000658 ASSERT_NO_FATAL_FAILURE(close(mEffect));
659 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000660}
661
662// Send data to IDLE effects and expect it to be consumed after effect start.
Jaideep Sharmacba42862023-06-23 10:27:39 +0530663// Effects exposing bypass flags or operating in offload mode will be skipped.
664TEST_P(AudioEffectDataPathTest, SendDataAtIdleAndConsumeDataInProcessing) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000665 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000666
667 Parameter::Common common = EffectHelper::createParamCommon(
668 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
669 kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
670 IEffect::OpenEffectReturn ret;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000671 ASSERT_NO_FATAL_FAILURE(open(mEffect, common, std::nullopt /* specific */, &ret, EX_NONE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000672 auto statusMQ = std::make_unique<EffectHelper::StatusMQ>(ret.statusMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000673 ASSERT_TRUE(statusMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000674 auto inputMQ = std::make_unique<EffectHelper::DataMQ>(ret.inputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000675 ASSERT_TRUE(inputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000676 auto outputMQ = std::make_unique<EffectHelper::DataMQ>(ret.outputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000677 ASSERT_TRUE(outputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000678
679 std::vector<float> buffer;
Shunkai Yaob49631f2023-02-03 01:44:32 +0000680 EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common, inputMQ, buffer));
Shunkai Yao41888a22023-04-10 17:13:30 +0000681 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(statusMQ, inputMQ, buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000682
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000683 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
684 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000685
Shunkai Yaob49631f2023-02-03 01:44:32 +0000686 EXPECT_NO_FATAL_FAILURE(
687 EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000688
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000689 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
690 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000691
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000692 ASSERT_NO_FATAL_FAILURE(close(mEffect));
693 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000694}
695
696// Send data multiple times.
Jaideep Sharmacba42862023-06-23 10:27:39 +0530697// Effects exposing bypass flags or operating in offload mode will be skipped.
698TEST_P(AudioEffectDataPathTest, ProcessDataMultipleTimes) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000699 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000700
701 Parameter::Common common = EffectHelper::createParamCommon(
702 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
703 kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
704 IEffect::OpenEffectReturn ret;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000705 ASSERT_NO_FATAL_FAILURE(open(mEffect, common, std::nullopt /* specific */, &ret, EX_NONE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000706 auto statusMQ = std::make_unique<EffectHelper::StatusMQ>(ret.statusMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000707 ASSERT_TRUE(statusMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000708 auto inputMQ = std::make_unique<EffectHelper::DataMQ>(ret.inputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000709 ASSERT_TRUE(inputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000710 auto outputMQ = std::make_unique<EffectHelper::DataMQ>(ret.outputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000711 ASSERT_TRUE(outputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000712
713 std::vector<float> buffer;
Shunkai Yaob49631f2023-02-03 01:44:32 +0000714 EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common, inputMQ, buffer));
Shunkai Yao41888a22023-04-10 17:13:30 +0000715 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(statusMQ, inputMQ, buffer));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000716 EXPECT_NO_FATAL_FAILURE(EffectHelper::readFromFmq(statusMQ, 0, outputMQ, 0, buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000717
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000718 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
719 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000720
Shunkai Yaob49631f2023-02-03 01:44:32 +0000721 EXPECT_NO_FATAL_FAILURE(
722 EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000723
Shunkai Yao41888a22023-04-10 17:13:30 +0000724 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(statusMQ, inputMQ, buffer));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000725 EXPECT_NO_FATAL_FAILURE(
726 EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000727
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000728 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
729 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000730 EXPECT_NO_FATAL_FAILURE(EffectHelper::readFromFmq(statusMQ, 0, outputMQ, 0, buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000731
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000732 ASSERT_NO_FATAL_FAILURE(close(mEffect));
733 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000734}
735
Shunkai Yaob49631f2023-02-03 01:44:32 +0000736// Send data to processing state effects, stop, and restart.
Jaideep Sharmacba42862023-06-23 10:27:39 +0530737// Effects exposing bypass flags or operating in offload mode will be skipped.
738TEST_P(AudioEffectDataPathTest, ConsumeDataAndRestart) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000739 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000740
741 Parameter::Common common = EffectHelper::createParamCommon(
742 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
743 kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
744 IEffect::OpenEffectReturn ret;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000745 ASSERT_NO_FATAL_FAILURE(open(mEffect, common, std::nullopt /* specific */, &ret, EX_NONE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000746 auto statusMQ = std::make_unique<EffectHelper::StatusMQ>(ret.statusMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000747 ASSERT_TRUE(statusMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000748 auto inputMQ = std::make_unique<EffectHelper::DataMQ>(ret.inputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000749 ASSERT_TRUE(inputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000750 auto outputMQ = std::make_unique<EffectHelper::DataMQ>(ret.outputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000751 ASSERT_TRUE(outputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000752
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000753 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
754 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000755 std::vector<float> buffer;
756 EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common, inputMQ, buffer));
Shunkai Yao41888a22023-04-10 17:13:30 +0000757 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(statusMQ, inputMQ, buffer));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000758 EXPECT_NO_FATAL_FAILURE(
759 EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
760
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000761 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
762 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yao41888a22023-04-10 17:13:30 +0000763 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(statusMQ, inputMQ, buffer));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000764 EXPECT_NO_FATAL_FAILURE(EffectHelper::readFromFmq(statusMQ, 0, outputMQ, 0, buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000765
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000766 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::START));
767 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::PROCESSING));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000768 EXPECT_NO_FATAL_FAILURE(
769 EffectHelper::readFromFmq(statusMQ, 1, outputMQ, buffer.size(), buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000770
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000771 ASSERT_NO_FATAL_FAILURE(command(mEffect, CommandId::STOP));
772 ASSERT_NO_FATAL_FAILURE(expectState(mEffect, State::IDLE));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000773
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000774 ASSERT_NO_FATAL_FAILURE(close(mEffect));
775 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000776}
777
778// Send data to closed effects and expect it not be consumed.
Jaideep Sharmacba42862023-06-23 10:27:39 +0530779// Effects exposing bypass flags or operating in offload mode will be skipped.
780TEST_P(AudioEffectDataPathTest, NotConsumeDataByClosedEffect) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000781 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000782
783 Parameter::Common common = EffectHelper::createParamCommon(
784 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
785 kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
786 IEffect::OpenEffectReturn ret;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000787 ASSERT_NO_FATAL_FAILURE(open(mEffect, common, std::nullopt /* specific */, &ret, EX_NONE));
788 ASSERT_NO_FATAL_FAILURE(close(mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000789
790 auto statusMQ = std::make_unique<EffectHelper::StatusMQ>(ret.statusMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000791 ASSERT_TRUE(statusMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000792 auto inputMQ = std::make_unique<EffectHelper::DataMQ>(ret.inputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000793 ASSERT_TRUE(inputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000794 auto outputMQ = std::make_unique<EffectHelper::DataMQ>(ret.outputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000795 ASSERT_TRUE(outputMQ->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000796
797 std::vector<float> buffer;
Shunkai Yaob49631f2023-02-03 01:44:32 +0000798 EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common, inputMQ, buffer));
Shunkai Yao41888a22023-04-10 17:13:30 +0000799 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(statusMQ, inputMQ, buffer));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000800 EXPECT_NO_FATAL_FAILURE(EffectHelper::readFromFmq(statusMQ, 0, outputMQ, 0, buffer));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000801
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000802 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000803}
804
805// Send data to multiple effects.
Jaideep Sharmacba42862023-06-23 10:27:39 +0530806// Effects exposing bypass flags or operating in offload mode will be skipped.
807TEST_P(AudioEffectDataPathTest, ConsumeDataMultipleEffects) {
Shunkai Yao812d5b42022-11-16 18:08:50 +0000808 std::shared_ptr<IEffect> effect1, effect2;
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000809 ASSERT_NO_FATAL_FAILURE(create(mFactory, effect1, mDescriptor));
810 ASSERT_NO_FATAL_FAILURE(create(mFactory, effect2, mDescriptor));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000811
812 Parameter::Common common1 = EffectHelper::createParamCommon(
813 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
814 kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
815 Parameter::Common common2 = EffectHelper::createParamCommon(
816 1 /* session */, 1 /* ioHandle */, 48000 /* iSampleRate */, 48000 /* oSampleRate */,
817 2 * kInputFrameCount /* iFrameCount */, 2 * kOutputFrameCount /* oFrameCount */);
818 IEffect::OpenEffectReturn ret1, ret2;
819 ASSERT_NO_FATAL_FAILURE(open(effect1, common1, std::nullopt /* specific */, &ret1, EX_NONE));
820 ASSERT_NO_FATAL_FAILURE(open(effect2, common2, std::nullopt /* specific */, &ret2, EX_NONE));
821 ASSERT_NO_FATAL_FAILURE(command(effect1, CommandId::START));
822 ASSERT_NO_FATAL_FAILURE(expectState(effect1, State::PROCESSING));
823 ASSERT_NO_FATAL_FAILURE(command(effect2, CommandId::START));
824 ASSERT_NO_FATAL_FAILURE(expectState(effect2, State::PROCESSING));
825
826 auto statusMQ1 = std::make_unique<EffectHelper::StatusMQ>(ret1.statusMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000827 ASSERT_TRUE(statusMQ1->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000828 auto inputMQ1 = std::make_unique<EffectHelper::DataMQ>(ret1.inputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000829 ASSERT_TRUE(inputMQ1->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000830 auto outputMQ1 = std::make_unique<EffectHelper::DataMQ>(ret1.outputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000831 ASSERT_TRUE(outputMQ1->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000832
833 std::vector<float> buffer1, buffer2;
Shunkai Yaob49631f2023-02-03 01:44:32 +0000834 EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common1, inputMQ1, buffer1));
Shunkai Yao41888a22023-04-10 17:13:30 +0000835 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(statusMQ1, inputMQ1, buffer1));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000836 EXPECT_NO_FATAL_FAILURE(
837 EffectHelper::readFromFmq(statusMQ1, 1, outputMQ1, buffer1.size(), buffer1));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000838
839 auto statusMQ2 = std::make_unique<EffectHelper::StatusMQ>(ret2.statusMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000840 ASSERT_TRUE(statusMQ2->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000841 auto inputMQ2 = std::make_unique<EffectHelper::DataMQ>(ret2.inputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000842 ASSERT_TRUE(inputMQ2->isValid());
Shunkai Yao812d5b42022-11-16 18:08:50 +0000843 auto outputMQ2 = std::make_unique<EffectHelper::DataMQ>(ret2.outputDataMQ);
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000844 ASSERT_TRUE(outputMQ2->isValid());
Shunkai Yaob49631f2023-02-03 01:44:32 +0000845 EXPECT_NO_FATAL_FAILURE(EffectHelper::allocateInputData(common2, inputMQ2, buffer2));
Shunkai Yao41888a22023-04-10 17:13:30 +0000846 EXPECT_NO_FATAL_FAILURE(EffectHelper::writeToFmq(statusMQ2, inputMQ2, buffer2));
Shunkai Yaob49631f2023-02-03 01:44:32 +0000847 EXPECT_NO_FATAL_FAILURE(
848 EffectHelper::readFromFmq(statusMQ2, 1, outputMQ2, buffer2.size(), buffer2));
Shunkai Yao812d5b42022-11-16 18:08:50 +0000849
850 ASSERT_NO_FATAL_FAILURE(command(effect1, CommandId::STOP));
851 ASSERT_NO_FATAL_FAILURE(expectState(effect1, State::IDLE));
852 ASSERT_NO_FATAL_FAILURE(close(effect1));
853 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, effect1));
854
855 ASSERT_NO_FATAL_FAILURE(command(effect2, CommandId::STOP));
856 ASSERT_NO_FATAL_FAILURE(expectState(effect2, State::IDLE));
857 ASSERT_NO_FATAL_FAILURE(close(effect2));
858 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, effect2));
859}
860
861INSTANTIATE_TEST_SUITE_P(
862 SingleEffectInstanceTest, AudioEffectTest,
863 ::testing::Combine(testing::ValuesIn(
864 EffectFactoryHelper::getAllEffectDescriptors(IFactory::descriptor))),
865 [](const testing::TestParamInfo<AudioEffectTest::ParamType>& info) {
Shunkai Yaocb0fc412022-12-15 20:34:32 +0000866 auto descriptor = std::get<PARAM_INSTANCE_NAME>(info.param).second;
Jaideep Sharmae4c7a962023-06-14 19:14:44 +0530867 std::string name = getPrefix(descriptor);
Shunkai Yao812d5b42022-11-16 18:08:50 +0000868 std::replace_if(
869 name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
870 return name;
871 });
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000872GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(AudioEffectTest);
Shunkai Yao67b1be62022-07-13 05:01:42 +0000873
Jaideep Sharmacba42862023-06-23 10:27:39 +0530874INSTANTIATE_TEST_SUITE_P(
875 SingleEffectInstanceTest, AudioEffectDataPathTest,
876 ::testing::Combine(testing::ValuesIn(
877 EffectFactoryHelper::getAllEffectDescriptors(IFactory::descriptor))),
878 [](const testing::TestParamInfo<AudioEffectDataPathTest::ParamType>& info) {
879 auto descriptor = std::get<PARAM_INSTANCE_NAME>(info.param).second;
880 std::string name = getPrefix(descriptor);
881 std::replace_if(
882 name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
883 return name;
884 });
885
886GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(AudioEffectDataPathTest);
887
Shunkai Yao67b1be62022-07-13 05:01:42 +0000888int main(int argc, char** argv) {
889 ::testing::InitGoogleTest(&argc, argv);
890 ABinderProcess_setThreadPoolMaxThreadCount(1);
891 ABinderProcess_startThreadPool();
892 return RUN_ALL_TESTS();
Shunkai Yaoa4ab38c2022-10-14 01:07:47 +0000893}