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[] = HDF_LIBRARY_FULL_PATH("libhdi_audio_interface_lib_render");
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 char absPath[PATH_MAX] = {0};
91 if (realpath(RESOLVED_PATH.c_str(), absPath) == nullptr) {
92 return;
93 }
94 handleSo = dlopen(absPath, RTLD_LAZY);
95 if (handleSo == nullptr) {
96 return;
97 }
98 GetAudioManager = (TestAudioManager *(*)())(dlsym(handleSo, FUNCTION_NAME.c_str()));
99 if (GetAudioManager == nullptr) {
100 return;
101 }
102 }
103
TearDownTestCase(void)104 void AudioHdiCaptureSceneTest::TearDownTestCase(void)
105 {
106 #ifdef AUDIO_MPI_SO
107 SdkExit();
108 if (sdkSo != nullptr) {
109 dlclose(sdkSo);
110 sdkSo = nullptr;
111 }
112 if (SdkInit != nullptr) {
113 SdkInit = nullptr;
114 }
115 if (SdkExit != nullptr) {
116 SdkExit = nullptr;
117 }
118 #endif
119 if (handleSo != nullptr) {
120 dlclose(handleSo);
121 handleSo = nullptr;
122 }
123 if (GetAudioManager != nullptr) {
124 GetAudioManager = nullptr;
125 }
126 }
AudioCaptureStart(const string path,struct AudioCapture * capture) const127 int32_t AudioHdiCaptureSceneTest::AudioCaptureStart(const string path, struct AudioCapture *capture) const
128 {
129 int32_t ret = -1;
130 struct AudioSampleAttributes attrs = {};
131
132 ret = InitAttrs(attrs);
133 if (ret < 0) {
134 return ret;
135 }
136 FILE *file = fopen(path.c_str(), "wb+");
137 if (file == nullptr) {
138 return HDF_FAILURE;
139 }
140 ret = FrameStartCapture(capture, file, attrs);
141 fclose(file);
142 return ret;
143 }
SetUp(void)144 void AudioHdiCaptureSceneTest::SetUp(void) {}
TearDown(void)145 void AudioHdiCaptureSceneTest::TearDown(void) {}
146
147 /**
148 * @tc.name Test AudioCaptureCheckSceneCapability API and check scene's capability
149 * @tc.number SUB_Audio_HDI_CaptureCheckSceneCapability_0001
150 * @tc.desc Test AudioCaptureCheckSceneCapability interface,return 0 if check scene's capability successful.
151 * @tc.author: ZHANGHAILIN
152 */
153 HWTEST_F(AudioHdiCaptureSceneTest, SUB_Audio_HDI_CaptureCheckSceneCapability_0001, TestSize.Level1)
154 {
155 int32_t ret = -1;
156 bool supported = false;
157 struct AudioSceneDescriptor scenes = {};
158 struct AudioAdapter *adapter = nullptr;
159 struct AudioCapture *capture = nullptr;
160 ASSERT_NE(nullptr, GetAudioManager);
161 TestAudioManager* manager = GetAudioManager();
162 ret = AudioCreateCapture(manager, PIN_IN_MIC, ADAPTER_NAME_INTERNAL, &adapter, &capture);
163 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
164 scenes.scene.id = 0;
165 scenes.desc.pins = PIN_IN_MIC;
166 ret = capture->scene.CheckSceneCapability(capture, &scenes, &supported);
167 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
168 EXPECT_TRUE(supported);
169
170 adapter->DestroyCapture(adapter, capture);
171 manager->UnloadAdapter(manager, adapter);
172 }
173 /**
174 * @tc.name Test checking scene's capability where the scene is not configured in the json.
175 * @tc.number SUB_Audio_HDI_CaptureCheckSceneCapability_0002
176 * @tc.desc Test AudioCreateCapture interface,return -1 if the scene is not configured in the json.
177 * @tc.author: ZHANGHAILIN
178 */
179 HWTEST_F(AudioHdiCaptureSceneTest, SUB_Audio_HDI_CaptureCheckSceneCapability_0002, TestSize.Level1)
180 {
181 int32_t ret = -1;
182 bool supported = true;
183 struct AudioSceneDescriptor scenes = {};
184 struct AudioAdapter *adapter = nullptr;
185 struct AudioCapture *capture = nullptr;
186 ASSERT_NE(nullptr, GetAudioManager);
187 TestAudioManager* manager = GetAudioManager();
188 ret = AudioCreateCapture(manager, PIN_IN_MIC, ADAPTER_NAME_INTERNAL, &adapter, &capture);
189 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
190 scenes.scene.id = 5;
191 scenes.desc.pins = PIN_IN_MIC;
192 ret = capture->scene.CheckSceneCapability(capture, &scenes, &supported);
193 EXPECT_EQ(AUDIO_HAL_ERR_INTERNAL, ret);
194
195 adapter->DestroyCapture(adapter, capture);
196 manager->UnloadAdapter(manager, adapter);
197 }
198 /**
199 * @tc.name Test checking scene's capability where the capture is empty
200 * @tc.number SUB_Audio_HDI_CaptureCheckSceneCapability_0003
201 * @tc.desc Test AudioCreateCapture interface,return -1 if the capture is empty.
202 * @tc.author: ZHANGHAILIN
203 */
204 HWTEST_F(AudioHdiCaptureSceneTest, SUB_Audio_HDI_CaptureCheckSceneCapability_0003, TestSize.Level1)
205 {
206 int32_t ret = -1;
207 bool supported = true;
208 struct AudioSceneDescriptor scenes = {};
209 struct AudioAdapter *adapter = nullptr;
210 struct AudioCapture *capture = nullptr;
211 struct AudioCapture *captureNull = nullptr;
212 ASSERT_NE(nullptr, GetAudioManager);
213 TestAudioManager* manager = GetAudioManager();
214 ret = AudioCreateCapture(manager, PIN_IN_MIC, ADAPTER_NAME_INTERNAL, &adapter, &capture);
215 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
216 scenes.scene.id = 0;
217 scenes.desc.pins = PIN_IN_MIC;
218 ret = capture->scene.CheckSceneCapability(captureNull, &scenes, &supported);
219 EXPECT_EQ(AUDIO_HAL_ERR_INVALID_PARAM, ret);
220
221 ret = AudioCaptureStart(AUDIO_CAPTURE_FILE, capture);
222 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
223
224 capture->control.Stop((AudioHandle)capture);
225 adapter->DestroyCapture(adapter, capture);
226 manager->UnloadAdapter(manager, adapter);
227 }
228 /**
229 * @tc.name Test checking scene's capability where the scene is empty
230 * @tc.number SUB_Audio_HDI_CaptureCheckSceneCapability_0004
231 * @tc.desc Test AudioCreateCapture interface,return -1 if the scene is empty.
232 * @tc.author: ZHANGHAILIN
233 */
234 HWTEST_F(AudioHdiCaptureSceneTest, SUB_Audio_HDI_CaptureCheckSceneCapability_0004, TestSize.Level1)
235 {
236 int32_t ret = -1;
237 bool supported = true;
238 struct AudioSceneDescriptor *scenes = nullptr;
239 struct AudioAdapter *adapter = nullptr;
240 struct AudioCapture *capture = nullptr;
241 ASSERT_NE(nullptr, GetAudioManager);
242 TestAudioManager* manager = GetAudioManager();
243 ret = AudioCreateCapture(manager, PIN_IN_MIC, ADAPTER_NAME_INTERNAL, &adapter, &capture);
244 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
245
246 ret = capture->scene.CheckSceneCapability(capture, scenes, &supported);
247 EXPECT_EQ(AUDIO_HAL_ERR_INVALID_PARAM, ret);
248
249 ret = AudioCaptureStart(AUDIO_CAPTURE_FILE, capture);
250 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
251
252 capture->control.Stop((AudioHandle)capture);
253 adapter->DestroyCapture(adapter, capture);
254 manager->UnloadAdapter(manager, adapter);
255 }
256 /**
257 * @tc.name Test checking scene's capability where the parameter supported is empty.
258 * @tc.number SUB_Audio_HDI_CaptureCheckSceneCapability_0005
259 * @tc.desc Test AudioCreateCapture interface,return -1 if the parameter supported is empty.
260 * @tc.author: ZHANGHAILIN
261 */
262 HWTEST_F(AudioHdiCaptureSceneTest, SUB_Audio_HDI_CaptureCheckSceneCapability_0005, TestSize.Level1)
263 {
264 int32_t ret = -1;
265 struct AudioSceneDescriptor scenes = {};
266 struct AudioAdapter *adapter = nullptr;
267 struct AudioCapture *capture = nullptr;
268 ASSERT_NE(nullptr, GetAudioManager);
269 TestAudioManager* manager = GetAudioManager();
270 ret = AudioCreateCapture(manager, PIN_IN_MIC, ADAPTER_NAME_INTERNAL, &adapter, &capture);
271 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
272
273 scenes.scene.id = 0;
274 scenes.desc.pins = PIN_IN_MIC;
275 ret = capture->scene.CheckSceneCapability(capture, &scenes, nullptr);
276 EXPECT_EQ(AUDIO_HAL_ERR_INVALID_PARAM, ret);
277
278 adapter->DestroyCapture(adapter, capture);
279 manager->UnloadAdapter(manager, adapter);
280 }
281 /**
282 * @tc.name Test AudioCaptureSelectScene API via legal input
283 * @tc.number SUB_Audio_HDI_AudioCaptureSelectScene_0001
284 * @tc.desc Test AudioCaptureSelectScene interface,return 0 if select capture's scene successful.
285 * @tc.author: ZHANGHAILIN
286 */
287 HWTEST_F(AudioHdiCaptureSceneTest, SUB_Audio_HDI_AudioCaptureSelectScene_0001, TestSize.Level1)
288 {
289 int32_t ret = -1;
290 struct AudioSceneDescriptor scenes = {};
291 struct AudioAdapter *adapter = nullptr;
292 struct AudioCapture *capture = nullptr;
293 ASSERT_NE(nullptr, GetAudioManager);
294 TestAudioManager* manager = GetAudioManager();
295 ret = AudioCreateCapture(manager, PIN_IN_MIC, ADAPTER_NAME_INTERNAL, &adapter, &capture);
296 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
297 scenes.scene.id = 0;
298 scenes.desc.pins = PIN_IN_MIC;
299 ret = capture->scene.SelectScene(capture, &scenes);
300 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
301
302 adapter->DestroyCapture(adapter, capture);
303 manager->UnloadAdapter(manager, adapter);
304 }
305 /**
306 * @tc.name Test AudioCaptureSelectScene API after capture start.
307 * @tc.number SUB_Audio_HDI_AudioCaptureSelectScene_0002
308 * @tc.desc Test AudioCaptureSelectScene, return 0 if select capture's scene successful after capture start.
309 * @tc.author: ZHANGHAILIN
310 */
311 HWTEST_F(AudioHdiCaptureSceneTest, SUB_Audio_HDI_AudioCaptureSelectScene_0002, TestSize.Level1)
312 {
313 int32_t ret = -1;
314 struct AudioSceneDescriptor scenes = {};
315 struct AudioAdapter *adapter = nullptr;
316 struct AudioCapture *capture = nullptr;
317 ASSERT_NE(nullptr, GetAudioManager);
318 TestAudioManager* manager = GetAudioManager();
319 ret = AudioCreateCapture(manager, PIN_IN_MIC, ADAPTER_NAME_INTERNAL, &adapter, &capture);
320 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
321
322 ret = AudioCaptureStart(AUDIO_CAPTURE_FILE, capture);
323 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
324
325 scenes.scene.id = 0;
326 scenes.desc.pins = PIN_IN_MIC;
327 ret = capture->scene.SelectScene(capture, &scenes);
328 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
329
330 capture->control.Stop((AudioHandle)capture);
331 adapter->DestroyCapture(adapter, capture);
332 manager->UnloadAdapter(manager, adapter);
333 }
334 /**
335 * @tc.name Test AudioCaptureSelectScene API where the parameter handle is empty.
336 * @tc.number SUB_Audio_HDI_AudioCaptureSelectScene_0003
337 * @tc.desc Test AudioCaptureSelectScene, return -1 if the parameter handle is empty.
338 * @tc.author: ZHANGHAILIN
339 */
340 HWTEST_F(AudioHdiCaptureSceneTest, SUB_Audio_HDI_AudioCaptureSelectScene_0003, TestSize.Level1)
341 {
342 int32_t ret = -1;
343 struct AudioSceneDescriptor scenes = {};
344 struct AudioAdapter *adapter = nullptr;
345 struct AudioCapture *capture = nullptr;
346 struct AudioCapture *captureNull = nullptr;
347 ASSERT_NE(nullptr, GetAudioManager);
348 TestAudioManager* manager = GetAudioManager();
349 ret = AudioCreateCapture(manager, PIN_IN_MIC, ADAPTER_NAME_INTERNAL, &adapter, &capture);
350 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
351
352 scenes.scene.id = 0;
353 scenes.desc.pins = PIN_IN_MIC;
354 ret = capture->scene.SelectScene(captureNull, &scenes);
355 EXPECT_EQ(AUDIO_HAL_ERR_INVALID_PARAM, ret);
356
357 adapter->DestroyCapture(adapter, capture);
358 manager->UnloadAdapter(manager, adapter);
359 }
360 /**
361 * @tc.name Test AudioCaptureSelectScene API where the parameter scene is empty.
362 * @tc.number SUB_Audio_HDI_AudioCaptureSelectScene_0004
363 * @tc.desc Test AudioCaptureSelectScene, return -1 if the parameter scene is empty.
364 * @tc.author: ZHANGHAILIN
365 */
366 HWTEST_F(AudioHdiCaptureSceneTest, SUB_Audio_HDI_AudioCaptureSelectScene_0004, TestSize.Level1)
367 {
368 int32_t ret = -1;
369 struct AudioSceneDescriptor *scenes = nullptr;
370 struct AudioAdapter *adapter = nullptr;
371 struct AudioCapture *capture = nullptr;
372 ASSERT_NE(nullptr, GetAudioManager);
373 TestAudioManager* manager = GetAudioManager();
374 ret = AudioCreateCapture(manager, PIN_IN_MIC, ADAPTER_NAME_INTERNAL, &adapter, &capture);
375 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
376
377 ret = capture->scene.SelectScene(capture, scenes);
378 EXPECT_EQ(AUDIO_HAL_ERR_INVALID_PARAM, ret);
379
380 adapter->DestroyCapture(adapter, capture);
381 manager->UnloadAdapter(manager, adapter);
382 }
383 /**
384 * @tc.name Test AudioCaptureSelectScene API where the scene is not configured in the json.
385 * @tc.number SUB_Audio_HDI_AudioCaptureSelectScene_0005
386 * @tc.desc Test AudioCaptureSelectScene, return -1 if the scene is not configured in the json.
387 * @tc.author: ZHANGHAILIN
388 */
389 HWTEST_F(AudioHdiCaptureSceneTest, SUB_Audio_HDI_AudioCaptureSelectScene_0005, TestSize.Level1)
390 {
391 int32_t ret = -1;
392 struct AudioSceneDescriptor scenes = {};
393 struct AudioAdapter *adapter = nullptr;
394 struct AudioCapture *capture = nullptr;
395 ASSERT_NE(nullptr, GetAudioManager);
396 TestAudioManager* manager = GetAudioManager();
397 ret = AudioCreateCapture(manager, PIN_IN_MIC, ADAPTER_NAME_INTERNAL, &adapter, &capture);
398 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
399
400 scenes.scene.id = 5;
401 scenes.desc.pins = PIN_OUT_HDMI;
402 ret = capture->scene.SelectScene(capture, &scenes);
403 EXPECT_EQ(AUDIO_HAL_ERR_INTERNAL, ret);
404
405 adapter->DestroyCapture(adapter, capture);
406 manager->UnloadAdapter(manager, adapter);
407 }
408 }