1 /*
2 * Copyright (c) 2021 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 /**
17 * @addtogroup Audio
18 * @{
19 *
20 * @brief Defines audio-related APIs, including custom data types and functions for capture drivers function.
21 * accessing a driver adapter, and capturing audios.
22 *
23 * @since 1.0
24 * @version 1.0
25 */
26
27 /**
28 * @file audio_hdi_common.h
29 *
30 * @brief Declares APIs for operations related to the capturing audio adapter.
31 *
32 * @since 1.0
33 * @version 1.0
34 */
35
36 #include "audio_hdi_common.h"
37 #include "audio_hdicapture_scene_test.h"
38
39 using namespace std;
40 using namespace testing::ext;
41 using namespace HMOS::Audio;
42
43 namespace {
44 const string ADAPTER_NAME_HDMI = "hdmi";
45 const string ADAPTER_NAME_USB = "usb";
46 const string ADAPTER_NAME_INTERNAL = "internal";
47
48 class AudioHdiCaptureSceneTest : public testing::Test {
49 public:
50 static void SetUpTestCase(void);
51 static void TearDownTestCase(void);
52 void SetUp();
53 void TearDown();
54 static TestAudioManager *(*GetAudioManager)();
55 static void *handleSo;
56 #ifdef AUDIO_MPI_SO
57 static int32_t (*SdkInit)();
58 static void (*SdkExit)();
59 static void *sdkSo;
60 #endif
61 int32_t AudioCaptureStart(const string path, struct AudioCapture *capture) const;
62 };
63
64 TestAudioManager *(*AudioHdiCaptureSceneTest::GetAudioManager)() = nullptr;
65 void *AudioHdiCaptureSceneTest::handleSo = nullptr;
66 #ifdef AUDIO_MPI_SO
67 int32_t (*AudioHdiCaptureSceneTest::SdkInit)() = nullptr;
68 void (*AudioHdiCaptureSceneTest::SdkExit)() = nullptr;
69 void *AudioHdiCaptureSceneTest::sdkSo = nullptr;
70 #endif
71
SetUpTestCase(void)72 void AudioHdiCaptureSceneTest::SetUpTestCase(void)
73 {
74 #ifdef AUDIO_MPI_SO
75 char sdkResolvedPath[] = "//system/lib/libhdi_audio_interface_lib_render.z.so";
76 sdkSo = dlopen(sdkResolvedPath, RTLD_LAZY);
77 if (sdkSo == nullptr) {
78 return;
79 }
80 SdkInit = (int32_t (*)())(dlsym(sdkSo, "MpiSdkInit"));
81 if (SdkInit == nullptr) {
82 return;
83 }
84 SdkExit = (void (*)())(dlsym(sdkSo, "MpiSdkExit"));
85 if (SdkExit == nullptr) {
86 return;
87 }
88 SdkInit();
89 #endif
90 handleSo = dlopen(RESOLVED_PATH.c_str(), RTLD_LAZY);
91 if (handleSo == nullptr) {
92 return;
93 }
94 GetAudioManager = (TestAudioManager *(*)())(dlsym(handleSo, FUNCTION_NAME.c_str()));
95 if (GetAudioManager == nullptr) {
96 return;
97 }
98 }
99
TearDownTestCase(void)100 void AudioHdiCaptureSceneTest::TearDownTestCase(void)
101 {
102 #ifdef AUDIO_MPI_SO
103 SdkExit();
104 if (sdkSo != nullptr) {
105 dlclose(sdkSo);
106 sdkSo = nullptr;
107 }
108 if (SdkInit != nullptr) {
109 SdkInit = nullptr;
110 }
111 if (SdkExit != nullptr) {
112 SdkExit = nullptr;
113 }
114 #endif
115 if (GetAudioManager != nullptr) {
116 GetAudioManager = nullptr;
117 }
118 }
AudioCaptureStart(const string path,struct AudioCapture * capture) const119 int32_t AudioHdiCaptureSceneTest::AudioCaptureStart(const string path, struct AudioCapture *capture) const
120 {
121 int32_t ret = -1;
122 struct AudioSampleAttributes attrs = {};
123
124 ret = InitAttrs(attrs);
125 if (ret < 0) {
126 return HDF_FAILURE;
127 }
128 FILE *file = fopen(path.c_str(), "wb+");
129 if (file == nullptr) {
130 return HDF_FAILURE;
131 }
132 ret = FrameStartCapture(capture, file, attrs);
133 if (ret < 0) {
134 fclose(file);
135 return HDF_FAILURE;
136 }
137 fclose(file);
138 return HDF_SUCCESS;
139 }
SetUp(void)140 void AudioHdiCaptureSceneTest::SetUp(void) {}
TearDown(void)141 void AudioHdiCaptureSceneTest::TearDown(void) {}
142
143 /**
144 * @tc.name Test AudioCaptureCheckSceneCapability API and check scene's capability
145 * @tc.number SUB_Audio_HDI_CaptureCheckSceneCapability_0001
146 * @tc.desc Test AudioCaptureCheckSceneCapability interface,return 0 if check scene's capability successful.
147 * @tc.author: ZHANGHAILIN
148 */
149 HWTEST_F(AudioHdiCaptureSceneTest, SUB_Audio_HDI_CaptureCheckSceneCapability_0001, TestSize.Level1)
150 {
151 int32_t ret = -1;
152 bool supported = false;
153 struct AudioSceneDescriptor scenes = {};
154 struct AudioAdapter *adapter = nullptr;
155 struct AudioCapture *capture = nullptr;
156 ASSERT_NE(nullptr, GetAudioManager);
157 TestAudioManager manager = *GetAudioManager();
158 ret = AudioCreateCapture(manager, PIN_IN_MIC, ADAPTER_NAME_INTERNAL, &adapter, &capture);
159 ASSERT_EQ(HDF_SUCCESS, ret);
160 scenes.scene.id = 0;
161 scenes.desc.pins = PIN_IN_MIC;
162 ret = capture->scene.CheckSceneCapability(capture, &scenes, &supported);
163 EXPECT_EQ(HDF_SUCCESS, ret);
164 EXPECT_TRUE(supported);
165
166 adapter->DestroyCapture(adapter, capture);
167 manager.UnloadAdapter(&manager, adapter);
168 }
169 /**
170 * @tc.name Test checking scene's capability where the scene is not configured in the json.
171 * @tc.number SUB_Audio_HDI_CaptureCheckSceneCapability_0002
172 * @tc.desc Test AudioCreateCapture interface,return -1 if the scene is not configured in the json.
173 * @tc.author: ZHANGHAILIN
174 */
175 HWTEST_F(AudioHdiCaptureSceneTest, SUB_Audio_HDI_CaptureCheckSceneCapability_0002, TestSize.Level1)
176 {
177 int32_t ret = -1;
178 bool supported = true;
179 struct AudioSceneDescriptor scenes = {};
180 struct AudioAdapter *adapter = nullptr;
181 struct AudioCapture *capture = nullptr;
182 ASSERT_NE(nullptr, GetAudioManager);
183 TestAudioManager manager = *GetAudioManager();
184 ret = AudioCreateCapture(manager, PIN_IN_MIC, ADAPTER_NAME_INTERNAL, &adapter, &capture);
185 ASSERT_EQ(HDF_SUCCESS, ret);
186 scenes.scene.id = 5;
187 scenes.desc.pins = PIN_IN_MIC;
188 ret = capture->scene.CheckSceneCapability(capture, &scenes, &supported);
189 EXPECT_EQ(HDF_FAILURE, ret);
190
191 adapter->DestroyCapture(adapter, capture);
192 manager.UnloadAdapter(&manager, adapter);
193 }
194 /**
195 * @tc.name Test checking scene's capability where the capture is empty
196 * @tc.number SUB_Audio_HDI_CaptureCheckSceneCapability_0003
197 * @tc.desc Test AudioCreateCapture interface,return -1 if the capture is empty.
198 * @tc.author: ZHANGHAILIN
199 */
200 HWTEST_F(AudioHdiCaptureSceneTest, SUB_Audio_HDI_CaptureCheckSceneCapability_0003, TestSize.Level1)
201 {
202 int32_t ret = -1;
203 bool supported = true;
204 struct AudioSceneDescriptor scenes = {};
205 struct AudioAdapter *adapter = nullptr;
206 struct AudioCapture *capture = nullptr;
207 struct AudioCapture *captureNull = nullptr;
208 ASSERT_NE(nullptr, GetAudioManager);
209 TestAudioManager manager = *GetAudioManager();
210 ret = AudioCreateCapture(manager, PIN_IN_MIC, ADAPTER_NAME_INTERNAL, &adapter, &capture);
211 ASSERT_EQ(HDF_SUCCESS, ret);
212 scenes.scene.id = 0;
213 scenes.desc.pins = PIN_IN_MIC;
214 ret = capture->scene.CheckSceneCapability(captureNull, &scenes, &supported);
215 EXPECT_EQ(HDF_FAILURE, ret);
216
217 ret = AudioCaptureStart(AUDIO_CAPTURE_FILE, capture);
218 EXPECT_EQ(HDF_SUCCESS, ret);
219
220 capture->control.Stop((AudioHandle)capture);
221 adapter->DestroyCapture(adapter, capture);
222 manager.UnloadAdapter(&manager, adapter);
223 }
224 /**
225 * @tc.name Test checking scene's capability where the scene is empty
226 * @tc.number SUB_Audio_HDI_CaptureCheckSceneCapability_0004
227 * @tc.desc Test AudioCreateCapture interface,return -1 if the scene is empty.
228 * @tc.author: ZHANGHAILIN
229 */
230 HWTEST_F(AudioHdiCaptureSceneTest, SUB_Audio_HDI_CaptureCheckSceneCapability_0004, TestSize.Level1)
231 {
232 int32_t ret = -1;
233 bool supported = true;
234 struct AudioSceneDescriptor *scenes = nullptr;
235 struct AudioAdapter *adapter = nullptr;
236 struct AudioCapture *capture = nullptr;
237 ASSERT_NE(nullptr, GetAudioManager);
238 TestAudioManager manager = *GetAudioManager();
239 ret = AudioCreateCapture(manager, PIN_IN_MIC, ADAPTER_NAME_INTERNAL, &adapter, &capture);
240 ASSERT_EQ(HDF_SUCCESS, ret);
241
242 ret = capture->scene.CheckSceneCapability(capture, scenes, &supported);
243 EXPECT_EQ(HDF_FAILURE, ret);
244
245 ret = AudioCaptureStart(AUDIO_CAPTURE_FILE, capture);
246 EXPECT_EQ(HDF_SUCCESS, ret);
247
248 capture->control.Stop((AudioHandle)capture);
249 adapter->DestroyCapture(adapter, capture);
250 manager.UnloadAdapter(&manager, adapter);
251 }
252 /**
253 * @tc.name Test checking scene's capability where the parameter supported is empty.
254 * @tc.number SUB_Audio_HDI_CaptureCheckSceneCapability_0005
255 * @tc.desc Test AudioCreateCapture interface,return -1 if the parameter supported is empty.
256 * @tc.author: ZHANGHAILIN
257 */
258 HWTEST_F(AudioHdiCaptureSceneTest, SUB_Audio_HDI_CaptureCheckSceneCapability_0005, TestSize.Level1)
259 {
260 int32_t ret = -1;
261 struct AudioSceneDescriptor scenes = {};
262 struct AudioAdapter *adapter = nullptr;
263 struct AudioCapture *capture = nullptr;
264 ASSERT_NE(nullptr, GetAudioManager);
265 TestAudioManager manager = *GetAudioManager();
266 ret = AudioCreateCapture(manager, PIN_IN_MIC, ADAPTER_NAME_INTERNAL, &adapter, &capture);
267 ASSERT_EQ(HDF_SUCCESS, ret);
268
269 scenes.scene.id = 0;
270 scenes.desc.pins = PIN_IN_MIC;
271 ret = capture->scene.CheckSceneCapability(capture, &scenes, nullptr);
272 EXPECT_EQ(HDF_FAILURE, ret);
273
274 adapter->DestroyCapture(adapter, capture);
275 manager.UnloadAdapter(&manager, adapter);
276 }
277 /**
278 * @tc.name Test AudioCaptureSelectScene API via legal input
279 * @tc.number SUB_Audio_HDI_AudioCaptureSelectScene_0001
280 * @tc.desc Test AudioCaptureSelectScene interface,return 0 if select capture's scene successful.
281 * @tc.author: ZHANGHAILIN
282 */
283 HWTEST_F(AudioHdiCaptureSceneTest, SUB_Audio_HDI_AudioCaptureSelectScene_0001, TestSize.Level1)
284 {
285 int32_t ret = -1;
286 struct AudioSceneDescriptor scenes = {};
287 struct AudioAdapter *adapter = nullptr;
288 struct AudioCapture *capture = nullptr;
289 ASSERT_NE(nullptr, GetAudioManager);
290 TestAudioManager manager = *GetAudioManager();
291 ret = AudioCreateCapture(manager, PIN_IN_MIC, ADAPTER_NAME_INTERNAL, &adapter, &capture);
292 ASSERT_EQ(HDF_SUCCESS, ret);
293 scenes.scene.id = 0;
294 scenes.desc.pins = PIN_IN_MIC;
295 ret = capture->scene.SelectScene(capture, &scenes);
296 EXPECT_EQ(HDF_SUCCESS, ret);
297
298 adapter->DestroyCapture(adapter, capture);
299 manager.UnloadAdapter(&manager, adapter);
300 }
301 /**
302 * @tc.name Test AudioCaptureSelectScene API after capture start.
303 * @tc.number SUB_Audio_HDI_AudioCaptureSelectScene_0002
304 * @tc.desc Test AudioCaptureSelectScene, return 0 if select capture's scene successful after capture start.
305 * @tc.author: ZHANGHAILIN
306 */
307 HWTEST_F(AudioHdiCaptureSceneTest, SUB_Audio_HDI_AudioCaptureSelectScene_0002, TestSize.Level1)
308 {
309 int32_t ret = -1;
310 struct AudioSceneDescriptor scenes = {};
311 struct AudioAdapter *adapter = nullptr;
312 struct AudioCapture *capture = nullptr;
313 ASSERT_NE(nullptr, GetAudioManager);
314 TestAudioManager manager = *GetAudioManager();
315 ret = AudioCreateCapture(manager, PIN_IN_MIC, ADAPTER_NAME_INTERNAL, &adapter, &capture);
316 ASSERT_EQ(HDF_SUCCESS, ret);
317
318 ret = AudioCaptureStart(AUDIO_CAPTURE_FILE, capture);
319 EXPECT_EQ(HDF_SUCCESS, ret);
320
321 scenes.scene.id = 0;
322 scenes.desc.pins = PIN_IN_MIC;
323 ret = capture->scene.SelectScene(capture, &scenes);
324 EXPECT_EQ(HDF_SUCCESS, ret);
325
326 capture->control.Stop((AudioHandle)capture);
327 adapter->DestroyCapture(adapter, capture);
328 manager.UnloadAdapter(&manager, adapter);
329 }
330 /**
331 * @tc.name Test AudioCaptureSelectScene API where the parameter handle is empty.
332 * @tc.number SUB_Audio_HDI_AudioCaptureSelectScene_0003
333 * @tc.desc Test AudioCaptureSelectScene, return -1 if the parameter handle is empty.
334 * @tc.author: ZHANGHAILIN
335 */
336 HWTEST_F(AudioHdiCaptureSceneTest, SUB_Audio_HDI_AudioCaptureSelectScene_0003, TestSize.Level1)
337 {
338 int32_t ret = -1;
339 struct AudioSceneDescriptor scenes = {};
340 struct AudioAdapter *adapter = nullptr;
341 struct AudioCapture *capture = nullptr;
342 struct AudioCapture *captureNull = nullptr;
343 ASSERT_NE(nullptr, GetAudioManager);
344 TestAudioManager manager = *GetAudioManager();
345 ret = AudioCreateCapture(manager, PIN_IN_MIC, ADAPTER_NAME_INTERNAL, &adapter, &capture);
346 ASSERT_EQ(HDF_SUCCESS, ret);
347
348 scenes.scene.id = 0;
349 scenes.desc.pins = PIN_IN_MIC;
350 ret = capture->scene.SelectScene(captureNull, &scenes);
351 EXPECT_EQ(HDF_FAILURE, ret);
352
353 adapter->DestroyCapture(adapter, capture);
354 manager.UnloadAdapter(&manager, adapter);
355 }
356 /**
357 * @tc.name Test AudioCaptureSelectScene API where the parameter scene is empty.
358 * @tc.number SUB_Audio_HDI_AudioCaptureSelectScene_0004
359 * @tc.desc Test AudioCaptureSelectScene, return -1 if the parameter scene is empty.
360 * @tc.author: ZHANGHAILIN
361 */
362 HWTEST_F(AudioHdiCaptureSceneTest, SUB_Audio_HDI_AudioCaptureSelectScene_0004, TestSize.Level1)
363 {
364 int32_t ret = -1;
365 struct AudioSceneDescriptor *scenes = nullptr;
366 struct AudioAdapter *adapter = nullptr;
367 struct AudioCapture *capture = nullptr;
368 ASSERT_NE(nullptr, GetAudioManager);
369 TestAudioManager manager = *GetAudioManager();
370 ret = AudioCreateCapture(manager, PIN_IN_MIC, ADAPTER_NAME_INTERNAL, &adapter, &capture);
371 ASSERT_EQ(HDF_SUCCESS, ret);
372
373 ret = capture->scene.SelectScene(capture, scenes);
374 EXPECT_EQ(HDF_FAILURE, ret);
375
376 adapter->DestroyCapture(adapter, capture);
377 manager.UnloadAdapter(&manager, adapter);
378 }
379 /**
380 * @tc.name Test AudioCaptureSelectScene API where the scene is not configured in the json.
381 * @tc.number SUB_Audio_HDI_AudioCaptureSelectScene_0005
382 * @tc.desc Test AudioCaptureSelectScene, return -1 if the scene is not configured in the json.
383 * @tc.author: ZHANGHAILIN
384 */
385 HWTEST_F(AudioHdiCaptureSceneTest, SUB_Audio_HDI_AudioCaptureSelectScene_0005, TestSize.Level1)
386 {
387 int32_t ret = -1;
388 struct AudioSceneDescriptor scenes = {};
389 struct AudioAdapter *adapter = nullptr;
390 struct AudioCapture *capture = nullptr;
391 ASSERT_NE(nullptr, GetAudioManager);
392 TestAudioManager manager = *GetAudioManager();
393 ret = AudioCreateCapture(manager, PIN_IN_MIC, ADAPTER_NAME_INTERNAL, &adapter, &capture);
394 ASSERT_EQ(HDF_SUCCESS, ret);
395
396 scenes.scene.id = 5;
397 scenes.desc.pins = PIN_OUT_HDMI;
398 ret = capture->scene.SelectScene(capture, &scenes);
399 EXPECT_EQ(HDF_FAILURE, ret);
400
401 adapter->DestroyCapture(adapter, capture);
402 manager.UnloadAdapter(&manager, adapter);
403 }
404 }