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 loading drivers,
21 * accessing a driver adapter, and rendering 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 audio render adapter.
31 *
32 * @since 1.0
33 * @version 1.0
34 */
35
36 #include "audio_hdi_common.h"
37 #include "audio_hdirender_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_USB = "usb";
45 const string ADAPTER_NAME_INTERNAL = "internal";
46
47 class AudioHdiRenderTest : public testing::Test {
48 public:
49 static void SetUpTestCase(void);
50 static void TearDownTestCase(void);
51 void SetUp();
52 void TearDown();
53 static TestAudioManager *(*GetAudioManager)();
54 static void *handleSo;
55 #ifdef AUDIO_MPI_SO
56 static int32_t (*SdkInit)();
57 static void (*SdkExit)();
58 static void *sdkSo;
59 #endif
60 static int32_t GetLoadAdapterAudioPara(struct PrepareAudioPara& audiopara);
61 };
62
63 using THREAD_FUNC = void *(*)(void *);
64
65 TestAudioManager *(*AudioHdiRenderTest::GetAudioManager)() = nullptr;
66 void *AudioHdiRenderTest::handleSo = nullptr;
67 #ifdef AUDIO_MPI_SO
68 int32_t (*AudioHdiRenderTest::SdkInit)() = nullptr;
69 void (*AudioHdiRenderTest::SdkExit)() = nullptr;
70 void *AudioHdiRenderTest::sdkSo = nullptr;
71 #endif
SetUpTestCase(void)72 void AudioHdiRenderTest::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 AudioHdiRenderTest::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 }
127
SetUp(void)128 void AudioHdiRenderTest::SetUp(void) {}
129
TearDown(void)130 void AudioHdiRenderTest::TearDown(void) {}
131
GetLoadAdapterAudioPara(struct PrepareAudioPara & audiopara)132 int32_t AudioHdiRenderTest::GetLoadAdapterAudioPara(struct PrepareAudioPara& audiopara)
133 {
134 int32_t ret = -1;
135 int size = 0;
136 auto *inst = (AudioHdiRenderTest *)audiopara.self;
137 if (inst != nullptr && inst->GetAudioManager != nullptr) {
138 audiopara.manager = inst->GetAudioManager();
139 }
140 if (audiopara.manager == nullptr) {
141 return HDF_FAILURE;
142 }
143 ret = audiopara.manager->GetAllAdapters(audiopara.manager, &audiopara.descs, &size);
144 if (ret < 0) {
145 return ret;
146 }
147 if (audiopara.descs == nullptr || size == 0) {
148 return AUDIO_HAL_ERR_INTERNAL;
149 }
150 int index = SwitchAdapter(audiopara.descs, audiopara.adapterName,
151 audiopara.portType, audiopara.audioPort, size);
152 if (index < 0) {
153 return AUDIO_HAL_ERR_INTERNAL;
154 } else {
155 audiopara.desc = &audiopara.descs[index];
156 }
157 if (audiopara.desc == nullptr) {
158 return AUDIO_HAL_ERR_INVALID_PARAM;
159 } else {
160 ret = audiopara.manager->LoadAdapter(audiopara.manager, audiopara.desc, &audiopara.adapter);
161 }
162 if (ret < 0) {
163 return ret;
164 }
165 if (audiopara.adapter == nullptr) {
166 return AUDIO_HAL_ERR_INVALID_PARAM;
167 }
168 return HDF_SUCCESS;
169 }
170
171 /**
172 * @tc.name Test RenderGetLatency API via legal
173 * @tc.number SUB_Audio_HDI_RenderGetLatency_0001
174 * @tc.desc test RenderGetLatency interface, return 0 if GetLatency successful
175 */
176 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderGetLatency_0001, Function | MediumTest | Level1)
177 {
178 int32_t ret = -1;
179 uint32_t latencyTime = 0;
180 uint32_t expectLatency = 0;
181 struct AudioAdapter *adapter = nullptr;
182 struct AudioRender *render = nullptr;
183 ASSERT_NE(GetAudioManager, nullptr);
184 TestAudioManager* manager = GetAudioManager();
185 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME_USB);
186 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
187
188 ret = render->GetLatency(render, &latencyTime);
189 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
190 EXPECT_LT(expectLatency, latencyTime);
191
192 ret = render->control.Stop((AudioHandle)render);
193 adapter->DestroyRender(adapter, render);
194 manager->UnloadAdapter(manager, adapter);
195 }
196 /**
197 * @tc.name Test RenderGetLatency API via Setting parameters render is empty
198 * @tc.number SUB_Audio_HDI_AudioRenderGetLatency_0002
199 * @tc.desc test RenderGetLatency interface, return -1 if Setting parameters render is empty
200 */
201 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderGetLatency_0002, Function | MediumTest | Level1)
202 {
203 int32_t ret = -1;
204 uint32_t latencyTime = 0;
205 struct AudioAdapter *adapter = nullptr;
206 struct AudioRender *render = nullptr;
207 struct AudioRender *renderNull = nullptr;
208 ASSERT_NE(GetAudioManager, nullptr);
209 TestAudioManager* manager = GetAudioManager();
210 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME_USB);
211 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
212
213 ret = render->GetLatency(renderNull, &latencyTime);
214 EXPECT_EQ(AUDIO_HAL_ERR_INVALID_PARAM, ret);
215
216 ret = render->control.Stop((AudioHandle)render);
217 adapter->DestroyRender(adapter, render);
218 manager->UnloadAdapter(manager, adapter);
219 }
220 /**
221 * @tc.name Test RenderGetLatency API via Setting parameters ms is empty
222 * @tc.number SUB_Audio_HDI_AudioRenderGetLatency_0003
223 * @tc.desc test RenderGetLatency interface,return -1 if Setting parameters ms is empty
224 */
225 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderGetLatency_0003, Function | MediumTest | Level1)
226 {
227 int32_t ret = -1;
228 uint32_t *latencyTime = nullptr;
229 struct AudioRender *render = nullptr;
230 struct AudioAdapter *adapter = nullptr;
231 ASSERT_NE(GetAudioManager, nullptr);
232 TestAudioManager* manager = GetAudioManager();
233 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME_USB);
234 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
235
236 ret = render->GetLatency(render, latencyTime);
237 EXPECT_EQ(AUDIO_HAL_ERR_INVALID_PARAM, ret);
238
239 ret = render->control.Stop((AudioHandle)render);
240 adapter->DestroyRender(adapter, render);
241 manager->UnloadAdapter(manager, adapter);
242 }
243 /**
244 * @tc.name Test SetRenderSpeed API via legal
245 * @tc.number SUB_Audio_HDI_AudioRenderSetRenderSpeed_0001
246 * @tc.desc Test SetRenderSpeed interface,return -2 if setting RenderSpeed
247 */
248 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderSetRenderSpeed_0001, Function | MediumTest | Level1)
249 {
250 int32_t ret = -1;
251 float speed = 100;
252 TestAudioManager* manager = {};
253 struct AudioAdapter *adapter =nullptr;
254 struct AudioRender *render = nullptr;
255 ASSERT_NE(GetAudioManager, nullptr);
256 manager = GetAudioManager();
257 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME_USB);
258 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
259
260 ret = render->SetRenderSpeed(render, speed);
261 EXPECT_EQ(AUDIO_HAL_ERR_NOT_SUPPORT, ret);
262
263 render->control.Stop((AudioHandle)render);
264 adapter->DestroyRender(adapter, render);
265 manager->UnloadAdapter(manager, adapter);
266 }
267 /**
268 * @tc.name Test SetRenderSpeed API via setting the incoming parameter handle is nullptr
269 * @tc.number SUB_Audio_HDI_AudioRenderSetRenderSpeed_0002
270 * @tc.desc Test SetRenderSpeed interface,return -2 if the incoming parameter handle is nullptr
271 */
272 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderSetRenderSpeed_0002, Function | MediumTest | Level1)
273 {
274 int32_t ret = -1;
275 float speed = 0;
276 TestAudioManager* manager = {};
277 struct AudioAdapter *adapter =nullptr;
278 struct AudioRender *render = nullptr;
279 struct AudioRender *renderNull = nullptr;
280 ASSERT_NE(GetAudioManager, nullptr);
281 manager = GetAudioManager();
282 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME_USB);
283 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
284
285 ret = render->SetRenderSpeed(renderNull, speed);
286 EXPECT_EQ(AUDIO_HAL_ERR_INVALID_PARAM, ret);
287
288 render->control.Stop((AudioHandle)render);
289 adapter->DestroyRender(adapter, render);
290 manager->UnloadAdapter(manager, adapter);
291 }
292 /**
293 * @tc.name Test GetRenderSpeed API via legal
294 * @tc.number SUB_Audio_HDI_AudioRenderGetRenderSpeed_0001
295 * @tc.desc Test GetRenderSpeed interface,return -2 if getting RenderSpeed
296 */
297 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderGetRenderSpeed_0001, Function | MediumTest | Level1)
298 {
299 int32_t ret = -1;
300 float speed = 0;
301 TestAudioManager* manager = {};
302 struct AudioAdapter *adapter =nullptr;
303 struct AudioRender *render = nullptr;
304 ASSERT_NE(GetAudioManager, nullptr);
305 manager = GetAudioManager();
306 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME_USB);
307 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
308 ret = render->GetRenderSpeed(render, &speed);
309 EXPECT_EQ(AUDIO_HAL_ERR_NOT_SUPPORT, ret);
310
311 render->control.Stop((AudioHandle)render);
312 adapter->DestroyRender(adapter, render);
313 manager->UnloadAdapter(manager, adapter);
314 }
315 /**
316 * @tc.name Test GetRenderSpeed API via setting the incoming parameter handle is nullptr
317 * @tc.number SUB_Audio_HDI_AudioRenderGetRenderSpeed_0002
318 * @tc.desc Test GetRenderSpeed interface,return -2 if the incoming parameter handle is nullptr
319 */
320 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderGetRenderSpeed_0002, Function | MediumTest | Level1)
321 {
322 int32_t ret = -1;
323 TestAudioManager* manager = {};
324 struct AudioAdapter *adapter =nullptr;
325 struct AudioRender *render = nullptr;
326 struct AudioRender *renderNull = nullptr;
327 float speed = 0;
328 ASSERT_NE(GetAudioManager, nullptr);
329 manager = GetAudioManager();
330 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME_USB);
331 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
332
333 ret = render->GetRenderSpeed(renderNull, &speed);
334 EXPECT_EQ(AUDIO_HAL_ERR_INVALID_PARAM, ret);
335
336 render->control.Stop((AudioHandle)render);
337 adapter->DestroyRender(adapter, render);
338 manager->UnloadAdapter(manager, adapter);
339 }
340 /**
341 * @tc.name Test GetRenderSpeed API via setting the incoming parameter speed is nullptr
342 * @tc.number SUB_Audio_HDI_AudioRenderGetRenderSpeed_0002
343 * @tc.desc Test GetRenderSpeed interface,return -2 if the incoming parameter speed is nullptr
344 */
345 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderGetRenderSpeed_0003, Function | MediumTest | Level1)
346 {
347 int32_t ret = -1;
348 TestAudioManager* manager = {};
349 struct AudioAdapter *adapter =nullptr;
350 struct AudioRender *render = nullptr;
351 float *speedNull = nullptr;
352 ASSERT_NE(GetAudioManager, nullptr);
353 manager = GetAudioManager();
354 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME_USB);
355 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
356
357 ret = render->GetRenderSpeed(render, speedNull);
358 EXPECT_EQ(AUDIO_HAL_ERR_INVALID_PARAM, ret);
359
360 render->control.Stop((AudioHandle)render);
361 adapter->DestroyRender(adapter, render);
362 manager->UnloadAdapter(manager, adapter);
363 }
364 /**
365 * @tc.name Test AudioRenderFrame API via legal input
366 * @tc.number SUB_Audio_HDI_AudioRenderFrame_0001
367 * @tc.desc test AudioRenderFrame interface,Returns 0 if the data is written successfully
368 */
369 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderFrame_0001, Function | MediumTest | Level1)
370 {
371 int32_t ret = -1;
372 uint64_t requestBytes = 0;
373 uint64_t replyBytes = 0;
374 enum AudioPortPin pins = PIN_OUT_SPEAKER;
375 struct AudioAdapter *adapter = nullptr;
376 struct AudioRender *render = nullptr;
377 char *frame = nullptr;
378 ASSERT_NE(GetAudioManager, nullptr);
379 TestAudioManager* manager = GetAudioManager();
380 ret = AudioCreateRender(manager, pins, ADAPTER_NAME_USB, &adapter, &render);
381 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
382 ret = render->control.Start((AudioHandle)render);
383 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
384
385 ret = RenderFramePrepare(AUDIO_FILE, frame, requestBytes);
386 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
387 ret = render->RenderFrame(render, frame, requestBytes, &replyBytes);
388 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
389
390 render->control.Stop((AudioHandle)render);
391 adapter->DestroyRender(adapter, render);
392 manager->UnloadAdapter(manager, adapter);
393 if (frame != nullptr) {
394 free(frame);
395 frame = nullptr;
396 }
397 }
398 /**
399 * @tc.name Test AudioRenderFrame API via setting the incoming parameter render is nullptr
400 * @tc.number SUB_Audio_HDI_AudioRenderFrame_0002
401 * @tc.desc Test AudioRenderFrame interface,Returns -1 if the incoming parameter render is nullptr
402 */
403 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderFrame_0002, Function | MediumTest | Level1)
404 {
405 int32_t ret = -1;
406 uint64_t requestBytes = 0;
407 uint64_t replyBytes = 0;
408 struct AudioAdapter *adapter = nullptr;
409 struct AudioRender *render = nullptr;
410 struct AudioRender *renderNull = nullptr;
411 char *frame = nullptr;
412
413 ASSERT_NE(GetAudioManager, nullptr);
414 TestAudioManager* manager = GetAudioManager();
415 ret = AudioCreateRender(manager, PIN_OUT_SPEAKER, ADAPTER_NAME_USB, &adapter, &render);
416 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
417 ret = render->control.Start((AudioHandle)render);
418 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
419
420 ret = RenderFramePrepare(AUDIO_FILE, frame, requestBytes);
421 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
422 ret = render->RenderFrame(renderNull, frame, requestBytes, &replyBytes);
423 EXPECT_EQ(AUDIO_HAL_ERR_INVALID_PARAM, ret);
424
425 ret = render->control.Stop((AudioHandle)render);
426 adapter->DestroyRender(adapter, render);
427 manager->UnloadAdapter(manager, adapter);
428 if (frame != nullptr) {
429 free(frame);
430 frame = nullptr;
431 }
432 }
433 /**
434 * @tc.name Test AudioRenderFrame API via setting the incoming parameter frame is nullptr
435 * @tc.number SUB_Audio_HDI_AudioRenderFrame_0003
436 * @tc.desc Test AudioRenderFrame interface,Returns -1 if the incoming parameter frame is nullptr
437 */
438 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderFrame_0003, Function | MediumTest | Level1)
439 {
440 int32_t ret = -1;
441 uint64_t requestBytes = 0;
442 uint64_t replyBytes = 0;
443 struct AudioAdapter *adapter = nullptr;
444 struct AudioRender *render = nullptr;
445 char *frame = nullptr;
446
447 ASSERT_NE(GetAudioManager, nullptr);
448 TestAudioManager* manager = GetAudioManager();
449 ret = AudioCreateRender(manager, PIN_OUT_SPEAKER, ADAPTER_NAME_USB, &adapter, &render);
450 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
451 ret = render->control.Start((AudioHandle)render);
452 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
453
454 ret = render->RenderFrame(render, frame, requestBytes, &replyBytes);
455 EXPECT_EQ(AUDIO_HAL_ERR_INVALID_PARAM, ret);
456 ret = render->control.Stop((AudioHandle)render);
457 adapter->DestroyRender(adapter, render);
458 manager->UnloadAdapter(manager, adapter);
459 }
460 /**
461 * @tc.name Test AudioRenderFrame API via setting the incoming parameter replyBytes is nullptr
462 * @tc.number SUB_Audio_HDI_AudioRenderFrame_0004
463 * @tc.desc Test AudioRenderFrame interface,Returns -1 if the incoming parameter replyBytes is nullptr
464 */
465 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderFrame_0004, Function | MediumTest | Level1)
466 {
467 int32_t ret = -1;
468 uint64_t requestBytes = 0;
469 struct AudioAdapter *adapter = nullptr;
470 struct AudioRender *render = nullptr;
471 char *frame = nullptr;
472 uint64_t *replyBytes = nullptr;
473
474 ASSERT_NE(GetAudioManager, nullptr);
475 TestAudioManager* manager = GetAudioManager();
476 ret = AudioCreateRender(manager, PIN_OUT_SPEAKER, ADAPTER_NAME_USB, &adapter, &render);
477 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
478 ret = render->control.Start((AudioHandle)render);
479 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
480
481 ret = RenderFramePrepare(AUDIO_FILE, frame, requestBytes);
482 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
483 ret = render->RenderFrame(render, frame, requestBytes, replyBytes);
484 EXPECT_EQ(AUDIO_HAL_ERR_INVALID_PARAM, ret);
485
486 ret = render->control.Stop((AudioHandle)render);
487 adapter->DestroyRender(adapter, render);
488 manager->UnloadAdapter(manager, adapter);
489 if (frame != nullptr) {
490 free(frame);
491 frame = nullptr;
492 }
493 }
494 /**
495 * @tc.name Test AudioRenderFrame API without calling interface renderstart
496 * @tc.number SUB_Audio_HDI_AudioRenderFrame_0005
497 * @tc.desc Test AudioRenderFrame interface,Returns -1 if without calling interface renderstart
498 */
499 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderFrame_0005, Function | MediumTest | Level1)
500 {
501 int32_t ret = -1;
502 uint64_t replyBytes = 0;
503 uint64_t requestBytes = 0;
504 struct AudioAdapter *adapter = nullptr;
505 struct AudioRender *render = nullptr;
506 char *frame = nullptr;
507
508 ASSERT_NE(GetAudioManager, nullptr);
509 TestAudioManager* manager = GetAudioManager();
510 ret = AudioCreateRender(manager, PIN_OUT_SPEAKER, ADAPTER_NAME_USB, &adapter, &render);
511 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
512 ret = RenderFramePrepare(AUDIO_FILE, frame, requestBytes);
513 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
514 ret = render->RenderFrame(render, frame, requestBytes, &replyBytes);
515 EXPECT_EQ(AUDIO_HAL_ERR_INVALID_PARAM, ret);
516
517 adapter->DestroyRender(adapter, render);
518 manager->UnloadAdapter(manager, adapter);
519 if (frame != nullptr) {
520 free(frame);
521 frame = nullptr;
522 }
523 }
524 /**
525 * @tc.name Test SetChannelMode API via setting channel mode to different enumeration values
526 * @tc.number SUB_Audio_HDI_AudioRenderSetChannelMode_0001
527 * @tc.desc Test SetChannelMode interface,return 0 if set channel mode to different enumeration values
528 */
529 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderSetChannelMode_0001, Function | MediumTest | Level1)
530 {
531 int32_t ret = -1;
532 TestAudioManager* manager = {};
533 struct AudioAdapter *adapter =nullptr;
534 struct AudioRender *render = nullptr;
535 enum AudioChannelMode mode = AUDIO_CHANNEL_NORMAL;
536 enum AudioChannelMode modeOne = AUDIO_CHANNEL_BOTH_LEFT;
537 enum AudioChannelMode modeSec = AUDIO_CHANNEL_BOTH_RIGHT;
538 enum AudioChannelMode modeTrd = AUDIO_CHANNEL_EXCHANGE;
539 ASSERT_NE(GetAudioManager, nullptr);
540 manager = GetAudioManager();
541 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME_USB);
542 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
543 ret = render->SetChannelMode(render, mode);
544 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
545 ret = render->GetChannelMode(render, &mode);
546 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
547 EXPECT_EQ(AUDIO_CHANNEL_NORMAL, mode);
548 ret = render->SetChannelMode(render, modeOne);
549 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
550 ret = render->GetChannelMode(render, &modeOne);
551 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
552 EXPECT_EQ(AUDIO_CHANNEL_BOTH_LEFT, modeOne);
553 ret = render->SetChannelMode(render, modeSec);
554 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
555 ret = render->GetChannelMode(render, &modeSec);
556 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
557 EXPECT_EQ(AUDIO_CHANNEL_BOTH_RIGHT, modeSec);
558 ret = render->SetChannelMode(render, modeTrd);
559 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
560 ret = render->GetChannelMode(render, &modeTrd);
561 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
562 EXPECT_EQ(AUDIO_CHANNEL_EXCHANGE, modeTrd);
563 render->control.Stop((AudioHandle)render);
564 adapter->DestroyRender(adapter, render);
565 manager->UnloadAdapter(manager, adapter);
566 }
567 /**
568 * @tc.name Test SetChannelMode API via setting channel mode to different values
569 * @tc.number SUB_Audio_HDI_AudioRenderSetChannelMode_0002
570 * @tc.desc Test SetChannelMode interface,return 0 if set channel mode to different values
571 */
572 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderSetChannelMode_0002, Function | MediumTest | Level1)
573 {
574 int32_t ret = -1;
575 TestAudioManager* manager = {};
576 struct AudioAdapter *adapter =nullptr;
577 struct AudioRender *render = nullptr;
578 enum AudioChannelMode mode = AUDIO_CHANNEL_MIX;
579 enum AudioChannelMode modeOne = AUDIO_CHANNEL_LEFT_MUTE;
580 enum AudioChannelMode modeSec = AUDIO_CHANNEL_RIGHT_MUTE;
581 enum AudioChannelMode modeTrd = AUDIO_CHANNEL_BOTH_MUTE;
582 ASSERT_NE(GetAudioManager, nullptr);
583 manager = GetAudioManager();
584 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME_USB);
585 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
586 ret = render->SetChannelMode(render, mode);
587 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
588 ret = render->GetChannelMode(render, &mode);
589 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
590 EXPECT_EQ(AUDIO_CHANNEL_MIX, mode);
591 ret = render->SetChannelMode(render, modeOne);
592 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
593 ret = render->GetChannelMode(render, &modeOne);
594 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
595 EXPECT_EQ(AUDIO_CHANNEL_LEFT_MUTE, modeOne);
596 ret = render->SetChannelMode(render, modeSec);
597 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
598 ret = render->GetChannelMode(render, &modeSec);
599 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
600 EXPECT_EQ(AUDIO_CHANNEL_RIGHT_MUTE, modeSec);
601 ret = render->SetChannelMode(render, modeTrd);
602 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
603 ret = render->GetChannelMode(render, &modeTrd);
604 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
605 EXPECT_EQ(AUDIO_CHANNEL_BOTH_MUTE, modeTrd);
606 render->control.Stop((AudioHandle)render);
607 adapter->DestroyRender(adapter, render);
608 manager->UnloadAdapter(manager, adapter);
609 }
610 /**
611 * @tc.name Test SetChannelMode API via setting channel mode after render object is created
612 * @tc.number SUB_Audio_HDI_AudioRenderSetChannelMode_0003
613 * @tc.desc Test SetChannelMode interface,return 0 if set channel mode after render object is created
614 */
615 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderSetChannelMode_0003, Function | MediumTest | Level1)
616 {
617 int32_t ret = -1;
618 TestAudioManager* manager = {};
619 struct AudioAdapter *adapter =nullptr;
620 struct AudioRender *render = nullptr;
621 enum AudioChannelMode mode = AUDIO_CHANNEL_NORMAL;
622 enum AudioPortPin pins = PIN_OUT_SPEAKER;
623 ASSERT_NE(GetAudioManager, nullptr);
624 manager = GetAudioManager();
625 ret = AudioCreateRender(manager, pins, ADAPTER_NAME_USB, &adapter, &render);
626 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
627 ret = render->SetChannelMode(render, mode);
628 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
629 ret = render->GetChannelMode(render, &mode);
630 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
631 EXPECT_EQ(AUDIO_CHANNEL_NORMAL, mode);
632
633 adapter->DestroyRender(adapter, render);
634 manager->UnloadAdapter(manager, adapter);
635 }
636 /**
637 * @tc.name Test SetChannelMode API via setting the parameter render is nullptr
638 * @tc.number SUB_Audio_HDI_AudioRenderSetChannelMode_0004
639 * @tc.desc Test SetChannelMode interface,return -1 if set the parameter render is nullptr
640 */
641 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderSetChannelMode_0004, Function | MediumTest | Level1)
642 {
643 int32_t ret = -1;
644 TestAudioManager* manager = {};
645 struct AudioRender *render = nullptr;
646 struct AudioAdapter *adapter =nullptr;
647 struct AudioRender *renderNull = nullptr;
648 enum AudioChannelMode mode = AUDIO_CHANNEL_NORMAL;
649 enum AudioPortPin pins = PIN_OUT_SPEAKER;
650 ASSERT_NE(GetAudioManager, nullptr);
651 manager = GetAudioManager();
652 ret = AudioCreateRender(manager, pins, ADAPTER_NAME_USB, &adapter, &render);
653 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
654
655 ret = render->SetChannelMode(renderNull, mode);
656 EXPECT_EQ(AUDIO_HAL_ERR_INVALID_PARAM, ret);
657
658 adapter->DestroyRender(adapter, render);
659 manager->UnloadAdapter(manager, adapter);
660 }
661 /**
662 * @tc.name Test GetChannelMode API via getting the channel mode after setting
663 * @tc.number SUB_Audio_HDI_AudioRenderGetChannelMode_0001
664 * @tc.desc Test GetChannelMode interface,return 0 if getting the channel mode after setting
665 */
666 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderGetChannelMode_0001, Function | MediumTest | Level1)
667 {
668 int32_t ret = -1;
669 TestAudioManager* manager = {};
670 struct AudioAdapter *adapter =nullptr;
671 struct AudioRender *render = nullptr;
672 enum AudioChannelMode mode = AUDIO_CHANNEL_NORMAL;
673 ASSERT_NE(GetAudioManager, nullptr);
674 manager = GetAudioManager();
675 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME_USB);
676 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
677
678 ret = render->GetChannelMode(render, &mode);
679 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
680 ret = render->SetChannelMode(render, mode);
681 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
682 ret = render->GetChannelMode(render, &mode);
683 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
684 EXPECT_EQ(AUDIO_CHANNEL_NORMAL, mode);
685
686 render->control.Stop((AudioHandle)render);
687 adapter->DestroyRender(adapter, render);
688 manager->UnloadAdapter(manager, adapter);
689 }
690 /**
691 * @tc.name Test GetChannelMode API via getting the parameter render is nullptr
692 * @tc.number SUB_Audio_HDI_AudioRenderGetChannelMode_0002
693 * @tc.desc Test GetChannelMode interface,return -1 if getting the parameter render is nullptr
694 */
695 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderGetChannelMode_0002, Function | MediumTest | Level1)
696 {
697 int32_t ret = -1;
698 TestAudioManager* manager = {};
699 struct AudioAdapter *adapter =nullptr;
700 struct AudioRender *renderNull = nullptr;
701 struct AudioRender *render = nullptr;
702 enum AudioChannelMode mode = AUDIO_CHANNEL_NORMAL;
703
704 ASSERT_NE(GetAudioManager, nullptr);
705 manager = GetAudioManager();
706 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME_USB);
707 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
708
709 ret = render->GetChannelMode(renderNull, &mode);
710 EXPECT_EQ(AUDIO_HAL_ERR_INVALID_PARAM, ret);
711
712 render->control.Stop((AudioHandle)render);
713 adapter->DestroyRender(adapter, render);
714 manager->UnloadAdapter(manager, adapter);
715 }
716 /**
717 * @tc.name Test GetChannelMode API via getting the channel mode after the render object is created
718 * @tc.number SUB_Audio_HDI_AudioRenderGetChannelMode_0003
719 * @tc.desc Test GetChannelMode interface,return 0 if getting the channel mode after the object is created
720 */
721 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderGetChannelMode_0003, Function | MediumTest | Level1)
722 {
723 int32_t ret = -1;
724 struct AudioAdapter *adapter = nullptr;
725 struct AudioRender *render = nullptr;
726 TestAudioManager* manager = {};
727 enum AudioPortPin pins = PIN_OUT_SPEAKER;
728 enum AudioChannelMode mode = AUDIO_CHANNEL_NORMAL;
729 ASSERT_NE(GetAudioManager, nullptr);
730 manager = GetAudioManager();
731 ret = AudioCreateRender(manager, pins, ADAPTER_NAME_USB, &adapter, &render);
732 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
733 ret = render->GetChannelMode(render, &mode);
734 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
735 EXPECT_EQ(AUDIO_CHANNEL_NORMAL, mode);
736
737 adapter->DestroyRender(adapter, render);
738 manager->UnloadAdapter(manager, adapter);
739 }
740 /**
741 * @tc.name Test GetRenderPosition API via legal input
742 * @tc.number SUB_Audio_HDI_AudioRenderGetRenderPosition_0001
743 * @tc.desc Test GetRenderPosition interface,Returns 0 if get RenderPosition during playing.
744 */
745 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderGetRenderPosition_0001, Function | MediumTest | Level1)
746 {
747 int32_t ret = -1;
748 uint64_t frames = 0;
749 int64_t timeExp = 0;
750 struct AudioTimeStamp time = {.tvSec = 0, .tvNSec = 0};
751 struct PrepareAudioPara audiopara = {
752 .portType = PORT_OUT, .adapterName = ADAPTER_NAME_USB.c_str(), .self = this, .pins = PIN_OUT_SPEAKER,
753 .path = AUDIO_FILE.c_str()
754 };
755 ASSERT_NE(GetAudioManager, nullptr);
756 audiopara.manager = GetAudioManager();
757 ASSERT_NE(audiopara.manager, nullptr);
758
759 ret = pthread_create(&audiopara.tids, NULL, (THREAD_FUNC)PlayAudioFile, &audiopara);
760 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
761 sleep(1);
762 if (audiopara.render != nullptr) {
763 ret = audiopara.render->GetRenderPosition(audiopara.render, &frames, &time);
764 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
765 EXPECT_GT((time.tvSec) * SECTONSEC + (time.tvNSec), timeExp);
766 EXPECT_GT(frames, INITIAL_VALUE);
767 }
768
769 ret = ThreadRelease(audiopara);
770 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
771 }
772 /**
773 * @tc.name Test AudioRenderGetRenderPosition API via get RenderPosition after the audio file is Paused and resumed
774 * @tc.number SUB_Audio_HDI_AudioRenderGetRenderPosition_0002
775 * @tc.desc Test GetRenderPosition interface,Returns 0 if get RenderPosition after Pause and resume during playing
776 */
777 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderGetRenderPosition_0002, Function | MediumTest | Level1)
778 {
779 int32_t ret = -1;
780 int64_t timeExp = 0;
781 uint64_t frames = 0;
782 struct AudioTimeStamp time = {.tvSec = 0, .tvNSec = 0};
783 struct PrepareAudioPara audiopara = {
784 .portType = PORT_OUT, .adapterName = ADAPTER_NAME_USB.c_str(), .self = this, .pins = PIN_OUT_SPEAKER,
785 .path = AUDIO_FILE.c_str()
786 };
787 ASSERT_NE(GetAudioManager, nullptr);
788 audiopara.manager = GetAudioManager();
789 ASSERT_NE(audiopara.manager, nullptr);
790
791 ret = pthread_create(&audiopara.tids, NULL, (THREAD_FUNC)PlayAudioFile, &audiopara);
792 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
793 sleep(1);
794 if (audiopara.render != nullptr) {
795 FrameStatus(0);
796 usleep(1000);
797 ret = audiopara.render->control.Pause((AudioHandle)(audiopara.render));
798 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
799 ret = audiopara.render->GetRenderPosition(audiopara.render, &frames, &time);
800 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
801 EXPECT_GT((time.tvSec) * SECTONSEC + (time.tvNSec), timeExp);
802 EXPECT_GT(frames, INITIAL_VALUE);
803 usleep(1000);
804 ret = audiopara.render->control.Resume((AudioHandle)(audiopara.render));
805 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
806 FrameStatus(1);
807 ret = audiopara.render->GetRenderPosition(audiopara.render, &frames, &time);
808 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
809 EXPECT_GT((time.tvSec) * SECTONSEC + (time.tvNSec), timeExp);
810 EXPECT_GT(frames, INITIAL_VALUE);
811 }
812
813 ret = ThreadRelease(audiopara);
814 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
815 }
816 /**
817 * @tc.name Test GetRenderPosition API via get RenderPosition after the audio file is stopped
818 * @tc.number SUB_Audio_HDI_AudioRenderGetRenderPosition_0003
819 * @tc.desc Test GetRenderPosition interface,Returns 0 if get RenderPosition after stop
820 */
821 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderGetRenderPosition_0003, Function | MediumTest | Level1)
822 {
823 int32_t ret = -1;
824 int64_t timeExp = 0;
825 uint64_t frames = 0;
826 struct AudioAdapter *adapter =nullptr;
827 struct AudioRender *render = nullptr;
828 struct AudioTimeStamp time = {.tvSec = 0, .tvNSec = 0};
829 ASSERT_NE(GetAudioManager, nullptr);
830 TestAudioManager* manager = GetAudioManager();
831 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME_USB);
832 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
833 ret = render->control.Stop((AudioHandle)render);
834 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
835
836 ret = render->GetRenderPosition(render, &frames, &time);
837 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
838 EXPECT_GT((time.tvSec) * SECTONSEC + (time.tvNSec), timeExp);
839 EXPECT_GT(frames, INITIAL_VALUE);
840
841 adapter->DestroyRender(adapter, render);
842 manager->UnloadAdapter(manager, adapter);
843 }
844 /**
845 * @tc.name Test AudioRenderGetRenderPosition API via setting the parameter render is nullptr
846 * @tc.number SUB_Audio_HDI_AudioRenderGetRenderPosition_0004
847 * @tc.desc Test AudioRenderGetRenderPosition interface, return -1 if setting the parameter render is nullptr
848 */
849 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderGetRenderPosition_0004, Function | MediumTest | Level1)
850 {
851 int32_t ret = -1;
852 uint64_t frames = 0;
853 int64_t timeExp = 0;
854 struct AudioRender *render = nullptr;
855 struct AudioAdapter *adapter =nullptr;
856 struct AudioTimeStamp time = {.tvSec = 0, .tvNSec = 0};
857
858 ASSERT_NE(GetAudioManager, nullptr);
859 TestAudioManager* manager = GetAudioManager();
860 ret = AudioCreateRender(manager, PIN_OUT_SPEAKER, ADAPTER_NAME_USB, &adapter, &render);
861 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
862 ret = render->GetRenderPosition(render, &frames, &time);
863 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
864 EXPECT_EQ((time.tvSec) * SECTONSEC + (time.tvNSec), timeExp);
865
866 adapter->DestroyRender(adapter, render);
867 manager->UnloadAdapter(manager, adapter);
868 }
869 /**
870 * @tc.name Test AudioRenderGetRenderPosition API via setting the parameter render is nullptr
871 * @tc.number SUB_Audio_HDI_AudioRenderGetRenderPosition_0005
872 * @tc.desc Test AudioRenderGetRenderPosition interface, return -1 if setting the parameter render is nullptr
873 */
874 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderGetRenderPosition_0005, Function | MediumTest | Level1)
875 {
876 int32_t ret = -1;
877 uint64_t frames = 0;
878 struct AudioTimeStamp time = {};
879 struct AudioAdapter *adapter =nullptr;
880 struct AudioRender *render = nullptr;
881 struct AudioRender *renderNull = nullptr;
882
883 ASSERT_NE(GetAudioManager, nullptr);
884 TestAudioManager* manager = GetAudioManager();
885 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME_USB);
886 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
887 ret = render->GetRenderPosition(renderNull, &frames, &time);
888 EXPECT_EQ(AUDIO_HAL_ERR_INVALID_PARAM, ret);
889
890 render->control.Stop((AudioHandle)render);
891 adapter->DestroyRender(adapter, render);
892 manager->UnloadAdapter(manager, adapter);
893 }
894 /**
895 * @tc.name Test AudioRenderGetRenderPosition API via setting the parameter frames is nullptr
896 * @tc.number SUB_Audio_HDI_AudioRenderGetRenderPosition_0006
897 * @tc.desc Test AudioRenderGetRenderPosition interface, return -1 if setting the parameter frames is nullptr
898 */
899 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderGetRenderPosition_0006, Function | MediumTest | Level1)
900 {
901 int32_t ret = -1;
902 uint64_t *framesNull = nullptr;
903 TestAudioManager* manager = {};
904 struct AudioAdapter *adapter =nullptr;
905 struct AudioRender *render = nullptr;
906 struct AudioTimeStamp time = {.tvSec = 0, .tvNSec = 0};
907
908 ASSERT_NE(GetAudioManager, nullptr);
909 manager = GetAudioManager();
910 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME_USB);
911 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
912 ret = render->GetRenderPosition(render, framesNull, &time);
913 EXPECT_EQ(AUDIO_HAL_ERR_INVALID_PARAM, ret);
914
915 render->control.Stop((AudioHandle)render);
916 adapter->DestroyRender(adapter, render);
917 manager->UnloadAdapter(manager, adapter);
918 }
919 /**
920 * @tc.name Test AudioRenderGetRenderPosition API via setting the parameter time is nullptr
921 * @tc.number SUB_Audio_HDI_AudioRenderGetRenderPosition_0007
922 * @tc.desc Test AudioRenderGetRenderPosition interface, return -1 if setting the parameter time is nullptr
923 */
924 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderGetRenderPosition_0007, Function | MediumTest | Level1)
925 {
926 int32_t ret = -1;
927 uint64_t frames = 0;
928 TestAudioManager* manager = {};
929 struct AudioAdapter *adapter =nullptr;
930 struct AudioRender *render = nullptr;
931 struct AudioTimeStamp *timeNull = nullptr;
932
933 ASSERT_NE(GetAudioManager, nullptr);
934 manager = GetAudioManager();
935 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME_USB);
936 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
937
938 ret = render->GetRenderPosition(render, &frames, timeNull);
939 EXPECT_EQ(AUDIO_HAL_ERR_INVALID_PARAM, ret);
940
941 render->control.Stop((AudioHandle)render);
942 adapter->DestroyRender(adapter, render);
943 manager->UnloadAdapter(manager, adapter);
944 }
945 /**
946 * @tc.name Test AudioRenderGetRenderPosition API via get RenderPosition continuously
947 * @tc.number SUB_Audio_HDI_AudioRenderGetRenderPosition_0008
948 * @tc.desc Test AudioRenderGetRenderPosition interface, return 0 if the GetRenderPosition was called twice
949 */
950 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderGetRenderPosition_0008, Function | MediumTest | Level1)
951 {
952 int32_t ret = -1;
953 int64_t timeExp = 0;
954 uint64_t frames = 0;
955 TestAudioManager* manager = {};
956 struct AudioAdapter *adapter =nullptr;
957 struct AudioRender *render = nullptr;
958 struct AudioTimeStamp time = {.tvSec = 0, .tvNSec = 0};
959 ASSERT_NE(GetAudioManager, nullptr);
960 manager = GetAudioManager();
961 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME_USB);
962 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
963
964 ret = render->GetRenderPosition(render, &frames, &time);
965 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
966 ret = render->GetRenderPosition(render, &frames, &time);
967 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
968 EXPECT_GT((time.tvSec) * SECTONSEC + (time.tvNSec), timeExp);
969 EXPECT_GT(frames, INITIAL_VALUE);
970
971 render->control.Stop((AudioHandle)render);
972 adapter->DestroyRender(adapter, render);
973 manager->UnloadAdapter(manager, adapter);
974 }
975 /**
976 * @tc.name Test GetRenderPosition API via define format to AUDIO_FORMAT_PCM_16_BIT
977 * @tc.number SUB_Audio_HDI_AudioRenderGetRenderPosition_0009
978 * @tc.desc Test GetRenderPosition interface,return 0 if get framesize define format to AUDIO_FORMAT_PCM_16_BIT
979 */
980 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderGetRenderPosition_0009, Function | MediumTest | Level1)
981 {
982 int32_t ret = -1;
983 struct AudioAdapter *adapter = nullptr;
984 struct AudioRender *render = nullptr;
985 enum AudioPortPin pins = PIN_OUT_SPEAKER;
986 struct AudioSampleAttributes attrs = {};
987 struct AudioSampleAttributes attrsValue = {};
988 uint64_t channelCountExp = 2;
989 uint32_t sampleRateExp = 48000;
990 uint64_t frames = 0;
991 int64_t timeExp = 0;
992 struct AudioTimeStamp time = {.tvSec = 0, .tvNSec = 0};
993 TestAudioManager* manager = GetAudioManager();
994 ASSERT_NE(GetAudioManager, nullptr);
995 ret = AudioCreateRender(manager, pins, ADAPTER_NAME_USB, &adapter, &render);
996 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
997 InitAttrs(attrs);
998 attrs.type = AUDIO_IN_MEDIA;
999 attrs.interleaved = false;
1000 attrs.format = AUDIO_FORMAT_PCM_16_BIT;
1001 attrs.sampleRate = 48000;
1002 attrs.channelCount = 2;
1003 ret = render->attr.SetSampleAttributes(render, &attrs);
1004 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
1005 ret = render->attr.GetSampleAttributes(render, &attrsValue);
1006 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
1007 EXPECT_EQ(AUDIO_FORMAT_PCM_16_BIT, attrsValue.format);
1008 EXPECT_EQ(sampleRateExp, attrsValue.sampleRate);
1009 EXPECT_EQ(channelCountExp, attrsValue.channelCount);
1010 ret = AudioRenderStartAndOneFrame(render);
1011 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
1012 ret = render->GetRenderPosition(render, &frames, &time);
1013 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
1014 EXPECT_GT((time.tvSec) * SECTONSEC + (time.tvNSec), timeExp);
1015 EXPECT_GT(frames, INITIAL_VALUE);
1016 render->control.Stop((AudioHandle)render);
1017 adapter->DestroyRender(adapter, render);
1018 manager->UnloadAdapter(manager, adapter);
1019 }
1020 /**
1021 * @tc.name Test GetRenderPosition API via define format to AUDIO_FORMAT_PCM_24_BIT
1022 * @tc.number SUB_Audio_HDI_AudioRenderGetRenderPosition_0010
1023 * @tc.desc Test GetRenderPosition interface,return 0 if get framesize define format to AUDIO_FORMAT_PCM_24_BIT
1024 */
1025 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderGetRenderPosition_0010, Function | MediumTest | Level1)
1026 {
1027 int32_t ret = -1;
1028 uint64_t frames = 0;
1029 int64_t timeExp = 0;
1030 uint64_t channelCountExp = 2;
1031 uint32_t sampleRateExp = 48000;
1032 struct AudioAdapter *adapter = nullptr;
1033 struct AudioRender *render = nullptr;
1034 struct AudioSampleAttributes attrs = {};
1035 struct AudioSampleAttributes attrsValue = {};
1036 struct AudioTimeStamp time = {.tvSec = 0, .tvNSec = 0};
1037 ASSERT_NE(GetAudioManager, nullptr);
1038 TestAudioManager* manager = GetAudioManager();
1039 ret = AudioCreateRender(manager, PIN_OUT_SPEAKER, ADAPTER_NAME_USB, &adapter, &render);
1040 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
1041 InitAttrs(attrs);
1042 attrs.type = AUDIO_IN_MEDIA;
1043 attrs.interleaved = false;
1044 attrs.format = AUDIO_FORMAT_PCM_24_BIT;
1045 attrs.sampleRate = 48000;
1046 attrs.channelCount = 2;
1047 ret = render->attr.SetSampleAttributes(render, &attrs);
1048 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
1049 ret = render->attr.GetSampleAttributes(render, &attrsValue);
1050 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
1051 EXPECT_EQ(AUDIO_FORMAT_PCM_24_BIT, attrsValue.format);
1052 EXPECT_EQ(sampleRateExp, attrsValue.sampleRate);
1053 EXPECT_EQ(channelCountExp, attrsValue.channelCount);
1054 ret = AudioRenderStartAndOneFrame(render);
1055 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
1056 ret = render->GetRenderPosition(render, &frames, &time);
1057 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
1058 EXPECT_GT((time.tvSec) * SECTONSEC + (time.tvNSec), timeExp);
1059 EXPECT_GT(frames, INITIAL_VALUE);
1060 render->control.Stop((AudioHandle)render);
1061 adapter->DestroyRender(adapter, render);
1062 manager->UnloadAdapter(manager, adapter);
1063 }
1064 /**
1065 * @tc.name Test GetRenderPosition API via define sampleRate and channelCount to different value
1066 * @tc.number SUB_Audio_HDI_AudioRenderGetRenderPosition_0011
1067 * @tc.desc Test GetRenderPosition interface,return 0 if get framesize define channelCount as different values
1068 */
1069 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderGetRenderPosition_0011, Function | MediumTest | Level1)
1070 {
1071 int32_t ret = -1;
1072 uint64_t frames = 0;
1073 int64_t timeExp = 0;
1074 uint32_t sampleRateExp = 48000;
1075 uint64_t channelCountExp = 1;
1076 struct AudioAdapter *adapter = nullptr;
1077 struct AudioRender *render = nullptr;
1078 struct AudioSampleAttributes attrs = {};
1079 struct AudioSampleAttributes attrsValue = {};
1080 struct AudioTimeStamp time = {.tvSec = 0, .tvNSec = 0};
1081 ASSERT_NE(GetAudioManager, nullptr);
1082 TestAudioManager* manager = GetAudioManager();
1083 ret = AudioCreateRender(manager, PIN_OUT_SPEAKER, ADAPTER_NAME_USB, &adapter, &render);
1084 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
1085 InitAttrs(attrs);
1086 attrs.type = AUDIO_IN_MEDIA;
1087 attrs.interleaved = false;
1088 attrs.format = AUDIO_FORMAT_PCM_16_BIT;
1089 attrs.sampleRate = 48000;
1090 attrs.channelCount = 1;
1091 ret = render->attr.SetSampleAttributes(render, &attrs);
1092 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
1093 ret = render->attr.GetSampleAttributes(render, &attrsValue);
1094 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
1095 EXPECT_EQ(sampleRateExp, attrsValue.sampleRate);
1096 EXPECT_EQ(AUDIO_FORMAT_PCM_16_BIT, attrsValue.format);
1097 EXPECT_EQ(channelCountExp, attrsValue.channelCount);
1098 ret = AudioRenderStartAndOneFrame(render);
1099 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
1100 ret = render->GetRenderPosition(render, &frames, &time);
1101 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
1102 EXPECT_GT((time.tvSec) * SECTONSEC + (time.tvNSec), timeExp);
1103 EXPECT_GT(frames, INITIAL_VALUE);
1104 render->control.Stop((AudioHandle)render);
1105 adapter->DestroyRender(adapter, render);
1106 manager->UnloadAdapter(manager, adapter);
1107 }
1108 /**
1109 * @tc.name Test GetRenderPosition API via define sampleRate and channelCount to 1
1110 * @tc.number SUB_Audio_HDI_AudioRenderGetRenderPosition_0012
1111 * @tc.desc Test GetRenderPosition interface,return 0 if get framesize define channelCount to 1
1112 */
1113 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderGetRenderPosition_0012, Function | MediumTest | Level1)
1114 {
1115 int32_t ret = -1;
1116 uint64_t frames = 0;
1117 int64_t timeExp = 0;
1118 struct AudioRender *render = nullptr;
1119 struct AudioAdapter *adapter = nullptr;
1120 struct AudioSampleAttributes attrs = {};
1121 struct AudioSampleAttributes attrsValue = {};
1122 struct AudioTimeStamp time = {.tvSec = 0, .tvNSec = 0};
1123 uint64_t channelCountExp = 1;
1124 uint32_t sampleRateExp = 48000;
1125 ASSERT_NE(GetAudioManager, nullptr);
1126 TestAudioManager* manager = GetAudioManager();
1127 ret = AudioCreateRender(manager, PIN_OUT_SPEAKER, ADAPTER_NAME_USB, &adapter, &render);
1128 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
1129 InitAttrs(attrs);
1130 attrs.type = AUDIO_IN_MEDIA;
1131 attrs.interleaved = false;
1132 attrs.format = AUDIO_FORMAT_PCM_24_BIT;
1133 attrs.sampleRate = 48000;
1134 attrs.channelCount = 1;
1135 ret = render->attr.SetSampleAttributes(render, &attrs);
1136 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
1137 ret = render->attr.GetSampleAttributes(render, &attrsValue);
1138 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
1139 EXPECT_EQ(AUDIO_FORMAT_PCM_24_BIT, attrsValue.format);
1140 EXPECT_EQ(sampleRateExp, attrsValue.sampleRate);
1141 EXPECT_EQ(channelCountExp, attrsValue.channelCount);
1142 ret = AudioRenderStartAndOneFrame(render);
1143 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
1144 ret = render->GetRenderPosition(render, &frames, &time);
1145 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
1146 EXPECT_GT((time.tvSec) * SECTONSEC + (time.tvNSec), timeExp);
1147 EXPECT_GT(frames, INITIAL_VALUE);
1148 render->control.Stop((AudioHandle)render);
1149 adapter->DestroyRender(adapter, render);
1150 manager->UnloadAdapter(manager, adapter);
1151 }
1152 /**
1153 * @tc.name Test ReqMmapBuffer API via legal input
1154 * @tc.number SUB_Audio_HDI_RenderReqMmapBuffer_0001
1155 * @tc.desc Test ReqMmapBuffer interface,return 0 if call ReqMmapBuffer interface sucessfully
1156 */
1157 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_RenderReqMmapBuffer_0001, Function | MediumTest | Level1)
1158 {
1159 int32_t ret = -1;
1160 bool isRender = true;
1161 int32_t reqSize = 0;
1162 struct AudioMmapBufferDescripter desc = {};
1163 struct AudioRender *render = nullptr;
1164 struct AudioAdapter *adapter = nullptr;
1165 struct AudioSampleAttributes attrs = {};
1166 ASSERT_NE(GetAudioManager, nullptr);
1167 FILE *fp = fopen(LOW_LATENCY_AUDIO_FILE.c_str(), "rb+");
1168 ASSERT_NE(fp, nullptr);
1169 TestAudioManager* manager = GetAudioManager();
1170 ret = AudioCreateRender(manager, PIN_OUT_SPEAKER, ADAPTER_NAME_USB, &adapter, &render);
1171 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
1172 if (ret < 0 || render == nullptr) {
1173 fclose(fp);
1174 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
1175 ASSERT_EQ(nullptr, render);
1176 }
1177 InitAttrs(attrs);
1178 attrs.startThreshold = 0;
1179 ret = render->attr.SetSampleAttributes(render, &attrs);
1180 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
1181 ret = InitMmapDesc(fp, desc, reqSize, isRender);
1182 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
1183 ret = render->control.Start((AudioHandle)render);
1184 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
1185 ret = render->attr.ReqMmapBuffer((AudioHandle)render, reqSize, &desc);
1186 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
1187 fclose(fp);
1188 if (ret == 0) {
1189 munmap(desc.memoryAddress, reqSize);
1190 }
1191 render->control.Stop((AudioHandle)render);
1192 adapter->DestroyRender(adapter, render);
1193 manager->UnloadAdapter(manager, adapter);
1194 }
1195 /**
1196 * @tc.name Test ReqMmapBuffer API via setting the incoming parameter reqSize is bigger than
1197 the size of actual audio file
1198 * @tc.number SUB_Audio_HDI_RenderReqMmapBuffer_0002
1199 * @tc.desc Test ReqMmapBuffer interface,return -3 if call ReqMmapBuffer interface unsucessfully when setting the
1200 incoming parameter reqSize is bigger than the size of actual audio file
1201 */
1202 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_RenderReqMmapBuffer_0002, Function | MediumTest | Level1)
1203 {
1204 int32_t ret = -1;
1205 bool isRender = true;
1206 int32_t reqSize = 0;
1207 struct AudioMmapBufferDescripter desc = {};
1208 struct AudioRender *render = nullptr;
1209 struct AudioAdapter *adapter = nullptr;
1210 ASSERT_NE(GetAudioManager, nullptr);
1211 TestAudioManager *manager = GetAudioManager();
1212 FILE *fp = fopen(LOW_LATENCY_AUDIO_FILE.c_str(), "rb+");
1213 ASSERT_NE(fp, nullptr);
1214 ret = AudioCreateRender(manager, PIN_OUT_SPEAKER, ADAPTER_NAME_USB, &adapter, &render);
1215 if (ret < 0 || render == nullptr) {
1216 fclose(fp);
1217 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
1218 ASSERT_EQ(nullptr, render);
1219 }
1220 ret = InitMmapDesc(fp, desc, reqSize, isRender);
1221 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
1222 reqSize = reqSize + BUFFER_LENTH;
1223 ret = render->control.Start((AudioHandle)render);
1224 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
1225 ret = render->attr.ReqMmapBuffer((AudioHandle)render, reqSize, &desc);
1226 EXPECT_EQ(AUDIO_HAL_ERR_INVALID_PARAM, ret);
1227 fclose(fp);
1228 render->control.Stop((AudioHandle)render);
1229 adapter->DestroyRender(adapter, render);
1230 manager->UnloadAdapter(manager, adapter);
1231 }
1232 /**
1233 * @tc.name Test ReqMmapBuffer API via setting the incoming parameter reqSize is smaller than
1234 the size of actual audio file
1235 * @tc.number SUB_Audio_HDI_RenderReqMmapBuffer_0003
1236 * @tc.desc Test ReqMmapBuffer interface,return 0 if call ReqMmapBuffer interface sucessfully when setting the
1237 incoming parameter reqSize is smaller than the size of actual audio file
1238 */
1239 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_RenderReqMmapBuffer_0003, Function | MediumTest | Level1)
1240 {
1241 int32_t ret = -1;
1242 bool isRender = true;
1243 int32_t reqSize = 0;
1244 struct AudioMmapBufferDescripter desc = {};
1245 struct AudioRender *render = nullptr;
1246 struct AudioAdapter *adapter = nullptr;
1247 ASSERT_NE(GetAudioManager, nullptr);
1248 TestAudioManager *manager = GetAudioManager();
1249 FILE *fp = fopen(LOW_LATENCY_AUDIO_FILE.c_str(), "rb+");
1250 ASSERT_NE(fp, nullptr);
1251 ret = AudioCreateRender(manager, PIN_OUT_SPEAKER, ADAPTER_NAME_USB, &adapter, &render);
1252 if (ret < 0 || render == nullptr) {
1253 fclose(fp);
1254 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
1255 ASSERT_EQ(nullptr, render);
1256 }
1257 ret = InitMmapDesc(fp, desc, reqSize, isRender);
1258 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
1259 reqSize = reqSize / 2;
1260 ret = render->control.Start((AudioHandle)render);
1261 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
1262 ret = render->attr.ReqMmapBuffer((AudioHandle)render, reqSize, &desc);
1263 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
1264 fclose(fp);
1265 if (ret == 0) {
1266 munmap(desc.memoryAddress, reqSize);
1267 }
1268 render->control.Stop((AudioHandle)render);
1269 adapter->DestroyRender(adapter, render);
1270 manager->UnloadAdapter(manager, adapter);
1271 }
1272 /**
1273 * @tc.name Test ReqMmapBuffer API via setting the incoming parameter reqSize is zero
1274 * @tc.number SUB_Audio_HDI_RenderReqMmapBuffer_0003
1275 * @tc.desc Test ReqMmapBuffer interface,return -1 if call ReqMmapBuffer interface unsucessfully when setting the
1276 incoming parameter reqSize is zero
1277 */
1278 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_RenderReqMmapBuffer_0004, Function | MediumTest | Level1)
1279 {
1280 int32_t ret = -1;
1281 bool isRender = true;
1282 int32_t reqSize = 0;
1283 struct AudioMmapBufferDescripter desc = {};
1284 struct AudioRender *render = nullptr;
1285 struct AudioAdapter *adapter = nullptr;
1286 ASSERT_NE(GetAudioManager, nullptr);
1287 TestAudioManager *manager = GetAudioManager();
1288 FILE *fp = fopen(LOW_LATENCY_AUDIO_FILE.c_str(), "rb+");
1289 ASSERT_NE(fp, nullptr);
1290 ret = AudioCreateRender(manager, PIN_OUT_SPEAKER, ADAPTER_NAME_USB, &adapter, &render);
1291 if (ret < 0 || render == nullptr) {
1292 fclose(fp);
1293 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
1294 ASSERT_EQ(nullptr, render);
1295 }
1296 ret = InitMmapDesc(fp, desc, reqSize, isRender);
1297 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
1298 reqSize = 0;
1299 ret = render->control.Start((AudioHandle)render);
1300 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
1301 ret = render->attr.ReqMmapBuffer((AudioHandle)render, reqSize, &desc);
1302 EXPECT_EQ(AUDIO_HAL_ERR_INTERNAL, ret);
1303 fclose(fp);
1304 render->control.Stop((AudioHandle)render);
1305 adapter->DestroyRender(adapter, render);
1306 manager->UnloadAdapter(manager, adapter);
1307 }
1308 /**
1309 * @tc.name Test ReqMmapBuffer API via setting the incoming parameter memoryFd of desc is illegal
1310 * @tc.number SUB_Audio_HDI_RenderReqMmapBuffer_0003
1311 * @tc.desc Test ReqMmapBuffer interface,return -3 if call ReqMmapBuffer interface unsucessfully when setting the
1312 incoming parameter memoryFd of desc is illegal
1313 */
1314 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_RenderReqMmapBuffer_0005, Function | MediumTest | Level1)
1315 {
1316 int32_t ret = -1;
1317 bool isRender = true;
1318 int32_t reqSize = 0;
1319 struct AudioMmapBufferDescripter desc = {};
1320 struct AudioRender *render = nullptr;
1321 struct AudioAdapter *adapter = nullptr;
1322 ASSERT_NE(GetAudioManager, nullptr);
1323 FILE *fp = fopen(LOW_LATENCY_AUDIO_FILE.c_str(), "rb+");
1324 ASSERT_NE(fp, nullptr);
1325 TestAudioManager *manager = GetAudioManager();
1326 ret = AudioCreateRender(manager, PIN_OUT_SPEAKER, ADAPTER_NAME_USB, &adapter, &render);
1327 if (ret < 0 || render == nullptr) {
1328 fclose(fp);
1329 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
1330 ASSERT_EQ(nullptr, render);
1331 }
1332 ret = InitMmapDesc(fp, desc, reqSize, isRender);
1333 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
1334 desc.memoryFd = 1;
1335 ret = render->control.Start((AudioHandle)render);
1336 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
1337 ret = render->attr.ReqMmapBuffer((AudioHandle)render, reqSize, &desc);
1338 EXPECT_EQ(AUDIO_HAL_ERR_INVALID_PARAM, ret);
1339 fclose(fp);
1340 render->control.Stop((AudioHandle)render);
1341 adapter->DestroyRender(adapter, render);
1342 manager->UnloadAdapter(manager, adapter);
1343 }
1344 /**
1345 * @tc.name Test ReqMmapBuffer API via the incoming parameter handle is nullptr
1346 * @tc.number SUB_Audio_HDI_RenderReqMmapBuffer_0005
1347 * @tc.desc Test ReqMmapBuffer interface,return -3 if call ReqMmapBuffer interface unsucessfully when setting the
1348 incoming parameter handle is nullptr
1349 */
1350 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_RenderReqMmapBuffer_0006, Function | MediumTest | Level1)
1351 {
1352 int32_t ret = -1;
1353 bool isRender = true;
1354 int32_t reqSize = 0;
1355 struct AudioMmapBufferDescripter desc = {};
1356 struct AudioRender *render = nullptr;
1357 struct AudioRender *renderNull = nullptr;
1358 struct AudioAdapter *adapter = nullptr;
1359 ASSERT_NE(GetAudioManager, nullptr);
1360 TestAudioManager* manager = GetAudioManager();
1361 FILE *fp = fopen(LOW_LATENCY_AUDIO_FILE.c_str(), "rb+");
1362 ASSERT_NE(fp, nullptr);
1363 ret = AudioCreateRender(manager, PIN_OUT_SPEAKER, ADAPTER_NAME_USB, &adapter, &render);
1364 if (ret < 0 || render == nullptr) {
1365 fclose(fp);
1366 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
1367 ASSERT_EQ(nullptr, render);
1368 }
1369 ret = InitMmapDesc(fp, desc, reqSize, isRender);
1370 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
1371 ret = render->control.Start((AudioHandle)render);
1372 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
1373 ret = render->attr.ReqMmapBuffer((AudioHandle)renderNull, reqSize, &desc);
1374 EXPECT_EQ(AUDIO_HAL_ERR_INVALID_PARAM, ret);
1375 fclose(fp);
1376 render->control.Stop((AudioHandle)render);
1377 adapter->DestroyRender(adapter, render);
1378 manager->UnloadAdapter(manager, adapter);
1379 }
1380 /**
1381 * @tc.name Test ReqMmapBuffer API via the incoming parameter desc is nullptr
1382 * @tc.number SUB_Audio_HDI_RenderReqMmapBuffer_0006
1383 * @tc.desc Test ReqMmapBuffer interface,return -3 if call ReqMmapBuffer interface unsucessfully when setting the
1384 incoming parameter desc is nullptr
1385 */
1386 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_RenderReqMmapBuffer_0007, Function | MediumTest | Level1)
1387 {
1388 int32_t ret = -1;
1389 bool isRender = true;
1390 int32_t reqSize = 0;
1391 struct AudioMmapBufferDescripter desc = {};
1392 struct AudioMmapBufferDescripter *descNull = nullptr;
1393 struct AudioRender *render = nullptr;
1394 struct AudioAdapter *adapter = nullptr;
1395 ASSERT_NE(GetAudioManager, nullptr);
1396 TestAudioManager* manager = GetAudioManager();
1397 FILE *fp = fopen(LOW_LATENCY_AUDIO_FILE.c_str(), "rb+");
1398 ASSERT_NE(fp, nullptr);
1399 ret = AudioCreateRender(manager, PIN_OUT_SPEAKER, ADAPTER_NAME_USB, &adapter, &render);
1400 if (ret < 0 || render == nullptr) {
1401 fclose(fp);
1402 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
1403 ASSERT_EQ(nullptr, render);
1404 }
1405 ret = InitMmapDesc(fp, desc, reqSize, isRender);
1406 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
1407 ret = render->control.Start((AudioHandle)render);
1408 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
1409 ret = render->attr.ReqMmapBuffer((AudioHandle)render, reqSize, descNull);
1410 EXPECT_EQ(AUDIO_HAL_ERR_INVALID_PARAM, ret);
1411 fclose(fp);
1412 render->control.Stop((AudioHandle)render);
1413 adapter->DestroyRender(adapter, render);
1414 manager->UnloadAdapter(manager, adapter);
1415 }
1416 /**
1417 * @tc.name Test GetMmapPosition API via Getting position is normal in Before playing and Playing.
1418 * @tc.number SUB_Audio_HDI_RenderGetMmapPosition_0001
1419 * @tc.desc Test GetMmapPosition interface,return 0 if Getting position successfully.
1420 */
1421 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_RenderGetMmapPosition_0001, Function | MediumTest | Level1)
1422 {
1423 uint64_t frames = 0;
1424 uint64_t framesRendering = 0;
1425 uint64_t framesexpRender = 0;
1426 int64_t timeExp = 0;
1427 struct PrepareAudioPara audiopara = {
1428 .portType = PORT_OUT, .adapterName = ADAPTER_NAME_USB.c_str(), .pins = PIN_OUT_SPEAKER,
1429 .path = LOW_LATENCY_AUDIO_FILE.c_str()
1430 };
1431 ASSERT_NE(GetAudioManager, nullptr);
1432 audiopara.manager = GetAudioManager();
1433 ASSERT_NE(audiopara.manager, nullptr);
1434 int32_t ret = AudioCreateRender(audiopara.manager, audiopara.pins, audiopara.adapterName, &audiopara.adapter,
1435 &audiopara.render);
1436 if (ret < 0 || audiopara.render == nullptr) {
1437 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
1438 ASSERT_EQ(nullptr, audiopara.render);
1439 }
1440 InitAttrs(audiopara.attrs);
1441 audiopara.attrs.startThreshold = 0;
1442 ret = audiopara.render->attr.SetSampleAttributes(audiopara.render, &(audiopara.attrs));
1443 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
1444 ret = audiopara.render->attr.GetMmapPosition(audiopara.render, &frames, &(audiopara.time));
1445 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
1446 EXPECT_EQ((audiopara.time.tvSec) * SECTONSEC + (audiopara.time.tvNSec), timeExp);
1447 EXPECT_EQ(frames, INITIAL_VALUE);
1448
1449 ret = pthread_create(&audiopara.tids, NULL, (THREAD_FUNC)PlayMapAudioFile, &audiopara);
1450 if (ret != 0) {
1451 audiopara.adapter->DestroyRender(audiopara.adapter, audiopara.render);
1452 audiopara.manager->UnloadAdapter(audiopara.manager, audiopara.adapter);
1453 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
1454 }
1455 sleep(1);
1456 ret = audiopara.render->attr.GetMmapPosition(audiopara.render, &framesRendering, &(audiopara.time));
1457 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
1458 EXPECT_GT((audiopara.time.tvSec) * SECTONSEC + (audiopara.time.tvNSec), timeExp);
1459 EXPECT_GT(framesRendering, INITIAL_VALUE);
1460 int64_t timeExprendering = (audiopara.time.tvSec) * SECTONSEC + (audiopara.time.tvNSec);
1461 void *result = nullptr;
1462 pthread_join(audiopara.tids, &result);
1463 EXPECT_EQ(AUDIO_HAL_SUCCESS, (intptr_t)result);
1464 ret = audiopara.render->attr.GetMmapPosition(audiopara.render, &framesexpRender, &(audiopara.time));
1465 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
1466 EXPECT_GE((audiopara.time.tvSec) * SECTONSEC + (audiopara.time.tvNSec), timeExprendering);
1467 EXPECT_GE(framesexpRender, framesRendering);
1468 audiopara.render->control.Stop((AudioHandle)audiopara.render);
1469 audiopara.adapter->DestroyRender(audiopara.adapter, audiopara.render);
1470 audiopara.manager->UnloadAdapter(audiopara.manager, audiopara.adapter);
1471 }
1472 /**
1473 * @tc.name Test GetMmapPosition API via SetSampleAttributes and Getting position is normal.
1474 * @tc.number SUB_Audio_HDI_RenderGetMmapPosition_0002
1475 * @tc.desc Test GetMmapPosition interface,return 0 if Getting position successfully.
1476 */
1477 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_RenderGetMmapPosition_0002, Function | MediumTest | Level1)
1478 {
1479 int32_t ret = -1;
1480 uint64_t frames = 0;
1481 int64_t timeExp = 0;
1482 struct PrepareAudioPara audiopara = {
1483 .portType = PORT_OUT, .adapterName = ADAPTER_NAME_USB.c_str(), .self = this, .pins = PIN_OUT_SPEAKER,
1484 .path = LOW_LATENCY_AUDIO_FILE.c_str()
1485 };
1486 ASSERT_NE(GetAudioManager, nullptr);
1487 audiopara.manager = GetAudioManager();
1488 ASSERT_NE(audiopara.manager, nullptr);
1489 ret = AudioCreateRender(audiopara.manager, audiopara.pins, audiopara.adapterName, &audiopara.adapter,
1490 &audiopara.render);
1491 if (ret < 0 || audiopara.render == nullptr) {
1492 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
1493 ASSERT_EQ(nullptr, audiopara.render);
1494 }
1495 InitAttrs(audiopara.attrs);
1496 audiopara.attrs.format = AUDIO_FORMAT_PCM_24_BIT;
1497 audiopara.attrs.channelCount = 1;
1498 ret = audiopara.render->attr.SetSampleAttributes(audiopara.render, &(audiopara.attrs));
1499 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
1500
1501 ret = pthread_create(&audiopara.tids, NULL, (THREAD_FUNC)PlayMapAudioFile, &audiopara);
1502 if (ret != 0) {
1503 audiopara.adapter->DestroyRender(audiopara.adapter, audiopara.render);
1504 audiopara.manager->UnloadAdapter(audiopara.manager, audiopara.adapter);
1505 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
1506 }
1507
1508 void *result = nullptr;
1509 pthread_join(audiopara.tids, &result);
1510 EXPECT_EQ(AUDIO_HAL_SUCCESS, (intptr_t)result);
1511 ret = audiopara.render->attr.GetMmapPosition(audiopara.render, &frames, &(audiopara.time));
1512 EXPECT_EQ(AUDIO_HAL_SUCCESS, ret);
1513 EXPECT_GT((audiopara.time.tvSec) * SECTONSEC + (audiopara.time.tvNSec), timeExp);
1514 EXPECT_GT(frames, INITIAL_VALUE);
1515 audiopara.render->control.Stop((AudioHandle)audiopara.render);
1516 audiopara.adapter->DestroyRender(audiopara.adapter, audiopara.render);
1517 audiopara.manager->UnloadAdapter(audiopara.manager, audiopara.adapter);
1518 }
1519 /**
1520 * @tc.name Test ReqMmapBuffer API via inputtint frame is nullptr.
1521 * @tc.number SUB_Audio_HDI_RenderGetMmapPosition_0003
1522 * @tc.desc Test GetMmapPosition interface,return -3 if Error in incoming parameter.
1523 */
1524 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_RenderGetMmapPosition_0003, Function | MediumTest | Level1)
1525 {
1526 int32_t ret = -1;
1527 uint64_t *frames = nullptr;
1528 struct PrepareAudioPara audiopara = {
1529 .portType = PORT_OUT, .adapterName = ADAPTER_NAME_USB.c_str(), .self = this, .pins = PIN_OUT_SPEAKER,
1530 .path = LOW_LATENCY_AUDIO_FILE.c_str()
1531 };
1532 ASSERT_NE(GetAudioManager, nullptr);
1533 audiopara.manager = GetAudioManager();
1534 ASSERT_NE(audiopara.manager, nullptr);
1535 ret = AudioCreateRender(audiopara.manager, audiopara.pins, audiopara.adapterName, &audiopara.adapter,
1536 &audiopara.render);
1537 if (ret < 0 || audiopara.render == nullptr) {
1538 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
1539 ASSERT_EQ(nullptr, audiopara.render);
1540 }
1541
1542 ret = audiopara.render->attr.GetMmapPosition(audiopara.render, frames, &(audiopara.time));
1543 EXPECT_EQ(AUDIO_HAL_ERR_INVALID_PARAM, ret);
1544
1545 audiopara.adapter->DestroyRender(audiopara.adapter, audiopara.render);
1546 audiopara.manager->UnloadAdapter(audiopara.manager, audiopara.adapter);
1547 }
1548 /**
1549 * @tc.name Test ReqMmapBuffer API via inputtint time is nullptr.
1550 * @tc.number SUB_Audio_HDI_RenderGetMmapPosition_0004
1551 * @tc.desc Test GetMmapPosition interface,return -3 if Error in incoming parameter.
1552 */
1553 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_RenderGetMmapPosition_0004, Function | MediumTest | Level1)
1554 {
1555 int32_t ret = -1;
1556 uint64_t frames = 0;
1557 struct AudioTimeStamp *time = nullptr;
1558 struct PrepareAudioPara audiopara = {
1559 .portType = PORT_OUT, .adapterName = ADAPTER_NAME_USB.c_str(), .self = this, .pins = PIN_OUT_SPEAKER,
1560 .path = LOW_LATENCY_AUDIO_FILE.c_str()
1561 };
1562 ASSERT_NE(GetAudioManager, nullptr);
1563 audiopara.manager = GetAudioManager();
1564 ASSERT_NE(audiopara.manager, nullptr);
1565 ret = AudioCreateRender(audiopara.manager, audiopara.pins, audiopara.adapterName, &audiopara.adapter,
1566 &audiopara.render);
1567 if (ret < 0 || audiopara.render == nullptr) {
1568 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
1569 ASSERT_EQ(nullptr, audiopara.render);
1570 }
1571
1572 ret = audiopara.render->attr.GetMmapPosition(audiopara.render, &frames, time);
1573 EXPECT_EQ(AUDIO_HAL_ERR_INVALID_PARAM, ret);
1574
1575 audiopara.adapter->DestroyRender(audiopara.adapter, audiopara.render);
1576 audiopara.manager->UnloadAdapter(audiopara.manager, audiopara.adapter);
1577 }
1578 /**
1579 * @tc.name Test ReqMmapBuffer API via inputtint render is nullptr.
1580 * @tc.number SUB_Audio_HDI_RenderGetMmapPosition_0005
1581 * @tc.desc Test GetMmapPosition interface,return -3 if Error in incoming parameter.
1582 */
1583 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_RenderGetMmapPosition_0005, Function | MediumTest | Level1)
1584 {
1585 int32_t ret = -1;
1586 uint64_t frames = 0;
1587 struct AudioRender *renderNull = nullptr;
1588 struct PrepareAudioPara audiopara = {
1589 .portType = PORT_OUT, .adapterName = ADAPTER_NAME_USB.c_str(), .self = this, .pins = PIN_OUT_SPEAKER,
1590 .path = LOW_LATENCY_AUDIO_FILE.c_str()
1591 };
1592 ASSERT_NE(GetAudioManager, nullptr);
1593 audiopara.manager = GetAudioManager();
1594 ASSERT_NE(audiopara.manager, nullptr);
1595 ret = AudioCreateRender(audiopara.manager, audiopara.pins, audiopara.adapterName, &audiopara.adapter,
1596 &audiopara.render);
1597 if (ret < 0 || audiopara.render == nullptr) {
1598 ASSERT_EQ(AUDIO_HAL_SUCCESS, ret);
1599 ASSERT_EQ(nullptr, audiopara.render);
1600 }
1601
1602 ret = audiopara.render->attr.GetMmapPosition(renderNull, &frames, &(audiopara.time));
1603 EXPECT_EQ(AUDIO_HAL_ERR_INVALID_PARAM, ret);
1604
1605 audiopara.adapter->DestroyRender(audiopara.adapter, audiopara.render);
1606 audiopara.manager->UnloadAdapter(audiopara.manager, audiopara.adapter);
1607 }
1608 }