blob: c77a228beff98e1728762f4c7c33d7e52bf15997 [file] [log] [blame]
Sham Rathod94aae5e2022-11-23 12:22:32 +05301/*
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 Yaoe39cd362022-12-22 00:23:34 +000017#include <unordered_set>
18
Mikhail Naganov872d4a62023-03-09 18:19:01 -080019#define LOG_TAG "VtsHalVisualizerTest"
20#include <android-base/logging.h>
21#include <android/binder_enums.h>
22
Sham Rathod94aae5e2022-11-23 12:22:32 +053023#include "EffectHelper.h"
24
25using namespace android;
26
Aayush Sonibb001fb2024-09-11 13:51:14 +000027using aidl::android::hardware::audio::common::getChannelCount;
Sham Rathod94aae5e2022-11-23 12:22:32 +053028using aidl::android::hardware::audio::effect::Descriptor;
Shunkai Yaof8be1ac2023-03-06 18:41:27 +000029using aidl::android::hardware::audio::effect::getEffectTypeUuidVisualizer;
Sham Rathod94aae5e2022-11-23 12:22:32 +053030using aidl::android::hardware::audio::effect::IEffect;
31using aidl::android::hardware::audio::effect::IFactory;
Sham Rathod94aae5e2022-11-23 12:22:32 +053032using aidl::android::hardware::audio::effect::Parameter;
33using aidl::android::hardware::audio::effect::Visualizer;
Jaideep Sharma74498412023-09-13 15:25:25 +053034using android::hardware::audio::common::testing::detail::TestExecutionTracer;
Sham Rathod94aae5e2022-11-23 12:22:32 +053035
36/**
37 * Here we focus on specific parameter checking, general IEffect interfaces testing performed in
38 * VtsAudioEffectTargetTest.
39 */
40enum ParamName {
41 PARAM_INSTANCE_NAME,
42 PARAM_CAPTURE_SIZE,
43 PARAM_SCALING_MODE,
44 PARAM_MEASUREMENT_MODE,
45 PARAM_LATENCY,
46};
47using VisualizerParamTestParam =
48 std::tuple<std::pair<std::shared_ptr<IFactory>, Descriptor>, int, Visualizer::ScalingMode,
49 Visualizer::MeasurementMode, int>;
50
Sham Rathod94aae5e2022-11-23 12:22:32 +053051class VisualizerParamTest : public ::testing::TestWithParam<VisualizerParamTestParam>,
52 public EffectHelper {
53 public:
54 VisualizerParamTest()
55 : mCaptureSize(std::get<PARAM_CAPTURE_SIZE>(GetParam())),
56 mScalingMode(std::get<PARAM_SCALING_MODE>(GetParam())),
57 mMeasurementMode(std::get<PARAM_MEASUREMENT_MODE>(GetParam())),
58 mLatency(std::get<PARAM_LATENCY>(GetParam())) {
59 std::tie(mFactory, mDescriptor) = std::get<PARAM_INSTANCE_NAME>(GetParam());
Aayush Sonibb001fb2024-09-11 13:51:14 +000060
61 size_t channelCount =
62 getChannelCount(AudioChannelLayout::make<AudioChannelLayout::layoutMask>(
63 AudioChannelLayout::LAYOUT_STEREO));
64 mBufferSizeInFrames = kInputFrameCount * channelCount;
65 mInputBuffer.resize(mBufferSizeInFrames);
66 generateInputBuffer(mInputBuffer, 0, true, channelCount, kMaxAudioSampleValue);
67
68 mOutputBuffer.resize(mBufferSizeInFrames);
Sham Rathod94aae5e2022-11-23 12:22:32 +053069 }
70
71 void SetUp() override {
72 ASSERT_NE(nullptr, mFactory);
73 ASSERT_NO_FATAL_FAILURE(create(mFactory, mEffect, mDescriptor));
74
Shunkai Yao61f9dd22024-05-08 22:34:36 +000075 Parameter::Common common = createParamCommon(
Sham Rathod94aae5e2022-11-23 12:22:32 +053076 0 /* session */, 1 /* ioHandle */, 44100 /* iSampleRate */, 44100 /* oSampleRate */,
77 kInputFrameCount /* iFrameCount */, kOutputFrameCount /* oFrameCount */);
Aayush Sonibb001fb2024-09-11 13:51:14 +000078 ASSERT_NO_FATAL_FAILURE(open(mEffect, common, std::nullopt, &mOpenEffectReturn, EX_NONE));
Sham Rathod94aae5e2022-11-23 12:22:32 +053079 ASSERT_NE(nullptr, mEffect);
Aayush Sonibb001fb2024-09-11 13:51:14 +000080 mVersion = EffectFactoryHelper::getHalVersion(mFactory);
Sham Rathod94aae5e2022-11-23 12:22:32 +053081 }
82
83 void TearDown() override {
84 ASSERT_NO_FATAL_FAILURE(close(mEffect));
85 ASSERT_NO_FATAL_FAILURE(destroy(mFactory, mEffect));
Aayush Sonibb001fb2024-09-11 13:51:14 +000086 mOpenEffectReturn = IEffect::OpenEffectReturn{};
Sham Rathod94aae5e2022-11-23 12:22:32 +053087 }
Sham Rathod94aae5e2022-11-23 12:22:32 +053088
89 static const long kInputFrameCount = 0x100, kOutputFrameCount = 0x100;
90 std::shared_ptr<IFactory> mFactory;
91 std::shared_ptr<IEffect> mEffect;
92 Descriptor mDescriptor;
Shunkai Yaoe39cd362022-12-22 00:23:34 +000093 int mCaptureSize;
Sham Rathod94aae5e2022-11-23 12:22:32 +053094 Visualizer::ScalingMode mScalingMode = Visualizer::ScalingMode::NORMALIZED;
95 Visualizer::MeasurementMode mMeasurementMode = Visualizer::MeasurementMode::NONE;
96 int mLatency = 0;
Aayush Sonibb001fb2024-09-11 13:51:14 +000097 int mVersion = 0;
98 std::vector<float> mInputBuffer;
99 std::vector<float> mOutputBuffer;
100 size_t mBufferSizeInFrames;
101 IEffect::OpenEffectReturn mOpenEffectReturn;
102 bool mAllParamsValid = true;
Sham Rathod94aae5e2022-11-23 12:22:32 +0530103
Shunkai Yao0a0c45e2023-02-13 17:41:11 +0000104 void SetAndGetParameters() {
Sham Rathod94aae5e2022-11-23 12:22:32 +0530105 for (auto& it : mCommonTags) {
106 auto& tag = it.first;
107 auto& vs = it.second;
108
109 // validate parameter
110 Descriptor desc;
111 ASSERT_STATUS(EX_NONE, mEffect->getDescriptor(&desc));
Shunkai Yao0a0c45e2023-02-13 17:41:11 +0000112 const bool valid = isParameterValid<Visualizer, Range::visualizer>(vs, desc);
Sham Rathod94aae5e2022-11-23 12:22:32 +0530113 const binder_exception_t expected = valid ? EX_NONE : EX_ILLEGAL_ARGUMENT;
Aayush Sonibb001fb2024-09-11 13:51:14 +0000114 if (expected == EX_ILLEGAL_ARGUMENT) mAllParamsValid = false;
Sham Rathod94aae5e2022-11-23 12:22:32 +0530115
116 // set parameter
117 Parameter expectParam;
118 Parameter::Specific specific;
119 specific.set<Parameter::Specific::visualizer>(vs);
120 expectParam.set<Parameter::specific>(specific);
121 EXPECT_STATUS(expected, mEffect->setParameter(expectParam)) << expectParam.toString();
122
123 // only get if parameter in range and set success
124 if (expected == EX_NONE) {
125 Parameter getParam;
126 Parameter::Id id;
127 Visualizer::Id vsId;
128 vsId.set<Visualizer::Id::commonTag>(tag);
129 id.set<Parameter::Id::visualizerTag>(vsId);
Shunkai Yao0a0c45e2023-02-13 17:41:11 +0000130 EXPECT_STATUS(EX_NONE, mEffect->getParameter(id, &getParam))
131 << " with: " << id.toString();
Sham Rathod94aae5e2022-11-23 12:22:32 +0530132 EXPECT_EQ(expectParam, getParam) << "\nexpect:" << expectParam.toString()
133 << "\ngetParam:" << getParam.toString();
134 }
135 }
136 }
137
Sham Rathod94aae5e2022-11-23 12:22:32 +0530138 void addCaptureSizeParam(int captureSize) {
Shunkai Yao0a0c45e2023-02-13 17:41:11 +0000139 mCommonTags.push_back({Visualizer::captureSamples,
140 Visualizer::make<Visualizer::captureSamples>(captureSize)});
Sham Rathod94aae5e2022-11-23 12:22:32 +0530141 }
142
143 void addScalingModeParam(Visualizer::ScalingMode scalingMode) {
Shunkai Yao0a0c45e2023-02-13 17:41:11 +0000144 mCommonTags.push_back(
145 {Visualizer::scalingMode, Visualizer::make<Visualizer::scalingMode>(scalingMode)});
Sham Rathod94aae5e2022-11-23 12:22:32 +0530146 }
147
148 void addMeasurementModeParam(Visualizer::MeasurementMode measurementMode) {
Shunkai Yao0a0c45e2023-02-13 17:41:11 +0000149 mCommonTags.push_back({Visualizer::measurementMode,
150 Visualizer::make<Visualizer::measurementMode>(measurementMode)});
Sham Rathod94aae5e2022-11-23 12:22:32 +0530151 }
152
153 void addLatencyParam(int latency) {
Shunkai Yao0a0c45e2023-02-13 17:41:11 +0000154 mCommonTags.push_back(
155 {Visualizer::latencyMs, Visualizer::make<Visualizer::latencyMs>(latency)});
Sham Rathod94aae5e2022-11-23 12:22:32 +0530156 }
157
Shunkai Yao883d75b2022-12-24 05:15:15 +0000158 static std::unordered_set<Visualizer::MeasurementMode> getMeasurementModeValues() {
159 return {ndk::enum_range<Visualizer::MeasurementMode>().begin(),
160 ndk::enum_range<Visualizer::MeasurementMode>().end()};
161 }
Shunkai Yao0a0c45e2023-02-13 17:41:11 +0000162
Shunkai Yao883d75b2022-12-24 05:15:15 +0000163 static std::unordered_set<Visualizer::ScalingMode> getScalingModeValues() {
164 return {ndk::enum_range<Visualizer::ScalingMode>().begin(),
165 ndk::enum_range<Visualizer::ScalingMode>().end()};
166 }
Shunkai Yaoe39cd362022-12-22 00:23:34 +0000167
Sham Rathod94aae5e2022-11-23 12:22:32 +0530168 private:
169 std::vector<std::pair<Visualizer::Tag, Visualizer>> mCommonTags;
Shunkai Yao0a0c45e2023-02-13 17:41:11 +0000170 void CleanUp() { mCommonTags.clear(); }
Sham Rathod94aae5e2022-11-23 12:22:32 +0530171};
172
173TEST_P(VisualizerParamTest, SetAndGetCaptureSize) {
Aayush Sonibb001fb2024-09-11 13:51:14 +0000174 ASSERT_NO_FATAL_FAILURE(addCaptureSizeParam(mCaptureSize));
175 ASSERT_NO_FATAL_FAILURE(SetAndGetParameters());
Sham Rathod94aae5e2022-11-23 12:22:32 +0530176}
177
178TEST_P(VisualizerParamTest, SetAndGetScalingMode) {
Aayush Sonibb001fb2024-09-11 13:51:14 +0000179 ASSERT_NO_FATAL_FAILURE(addScalingModeParam(mScalingMode));
180 ASSERT_NO_FATAL_FAILURE(SetAndGetParameters());
Sham Rathod94aae5e2022-11-23 12:22:32 +0530181}
182
183TEST_P(VisualizerParamTest, SetAndGetMeasurementMode) {
Aayush Sonibb001fb2024-09-11 13:51:14 +0000184 ASSERT_NO_FATAL_FAILURE(addMeasurementModeParam(mMeasurementMode));
185 ASSERT_NO_FATAL_FAILURE(SetAndGetParameters());
Sham Rathod94aae5e2022-11-23 12:22:32 +0530186}
187
188TEST_P(VisualizerParamTest, SetAndGetLatency) {
Aayush Sonibb001fb2024-09-11 13:51:14 +0000189 ASSERT_NO_FATAL_FAILURE(addLatencyParam(mLatency));
190 ASSERT_NO_FATAL_FAILURE(SetAndGetParameters());
191}
192
193TEST_P(VisualizerParamTest, testCaptureSampleBufferSizeAndOutput) {
194 ASSERT_NO_FATAL_FAILURE(addCaptureSizeParam(mCaptureSize));
195 ASSERT_NO_FATAL_FAILURE(addScalingModeParam(mScalingMode));
196 ASSERT_NO_FATAL_FAILURE(addMeasurementModeParam(mMeasurementMode));
197 ASSERT_NO_FATAL_FAILURE(addLatencyParam(mLatency));
198 ASSERT_NO_FATAL_FAILURE(SetAndGetParameters());
199
200 Parameter getParam;
201 Parameter::Id id;
202 Visualizer::Id vsId;
203 vsId.set<Visualizer::Id::commonTag>(Visualizer::captureSampleBuffer);
204 id.set<Parameter::Id::visualizerTag>(vsId);
205 EXPECT_STATUS(EX_NONE, mEffect->getParameter(id, &getParam)) << " with: " << id.toString();
206
207 ASSERT_NO_FATAL_FAILURE(processAndWriteToOutput(mInputBuffer, mOutputBuffer, mEffect,
208 &mOpenEffectReturn, mVersion));
209 ASSERT_EQ(mInputBuffer, mOutputBuffer);
210
211 if (mAllParamsValid) {
212 std::vector<uint8_t> captureBuffer = getParam.get<Parameter::specific>()
213 .get<Parameter::Specific::visualizer>()
214 .get<Visualizer::captureSampleBuffer>();
215 ASSERT_EQ((size_t)mCaptureSize, captureBuffer.size());
216 }
Sham Rathod94aae5e2022-11-23 12:22:32 +0530217}
218
Shunkai Yao0a0c45e2023-02-13 17:41:11 +0000219std::vector<std::pair<std::shared_ptr<IFactory>, Descriptor>> kDescPair;
Sham Rathod94aae5e2022-11-23 12:22:32 +0530220INSTANTIATE_TEST_SUITE_P(
Shunkai Yaoe39cd362022-12-22 00:23:34 +0000221 VisualizerParamTest, VisualizerParamTest,
Shunkai Yao0a0c45e2023-02-13 17:41:11 +0000222 ::testing::Combine(
223 testing::ValuesIn(kDescPair = EffectFactoryHelper::getAllEffectDescriptors(
Shunkai Yaof8be1ac2023-03-06 18:41:27 +0000224 IFactory::descriptor, getEffectTypeUuidVisualizer())),
Shunkai Yao0a0c45e2023-02-13 17:41:11 +0000225 testing::ValuesIn(EffectHelper::getTestValueSet<Visualizer, int, Range::visualizer,
226 Visualizer::captureSamples>(
227 kDescPair, EffectHelper::expandTestValueBasic<int>)),
228 testing::ValuesIn(VisualizerParamTest::getScalingModeValues()),
229 testing::ValuesIn(VisualizerParamTest::getMeasurementModeValues()),
230 testing::ValuesIn(EffectHelper::getTestValueSet<Visualizer, int, Range::visualizer,
231 Visualizer::latencyMs>(
232 kDescPair, EffectHelper::expandTestValueBasic<int>))),
Sham Rathod94aae5e2022-11-23 12:22:32 +0530233 [](const testing::TestParamInfo<VisualizerParamTest::ParamType>& info) {
234 auto descriptor = std::get<PARAM_INSTANCE_NAME>(info.param).second;
235 std::string captureSize = std::to_string(std::get<PARAM_CAPTURE_SIZE>(info.param));
Shunkai Yao883d75b2022-12-24 05:15:15 +0000236 std::string scalingMode = aidl::android::hardware::audio::effect::toString(
237 std::get<PARAM_SCALING_MODE>(info.param));
238 std::string measurementMode = aidl::android::hardware::audio::effect::toString(
239 std::get<PARAM_MEASUREMENT_MODE>(info.param));
Sham Rathod94aae5e2022-11-23 12:22:32 +0530240 std::string latency = std::to_string(std::get<PARAM_LATENCY>(info.param));
241
Jaideep Sharmae4c7a962023-06-14 19:14:44 +0530242 std::string name = getPrefix(descriptor) + "_captureSize" + captureSize +
Sham Rathod94aae5e2022-11-23 12:22:32 +0530243 "_scalingMode" + scalingMode + "_measurementMode" + measurementMode +
244 "_latency" + latency;
245 std::replace_if(
246 name.begin(), name.end(), [](const char c) { return !std::isalnum(c); }, '_');
247 return name;
248 });
249
250GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(VisualizerParamTest);
251
252int main(int argc, char** argv) {
253 ::testing::InitGoogleTest(&argc, argv);
Jaideep Sharma74498412023-09-13 15:25:25 +0530254 ::testing::UnitTest::GetInstance()->listeners().Append(new TestExecutionTracer());
Sham Rathod94aae5e2022-11-23 12:22:32 +0530255 ABinderProcess_setThreadPoolMaxThreadCount(1);
256 ABinderProcess_startThreadPool();
257 return RUN_ALL_TESTS();
Mikhail Naganov872d4a62023-03-09 18:19:01 -0800258}