• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 }