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[] = "//system/lib/libhdi_audio_interface_lib_render.z.so";
76 sdkSo = dlopen(sdkResolvedPath, RTLD_LAZY);
77 if (sdkSo == nullptr) {
78 return;
79 }
80 SdkInit = (int32_t (*)())(dlsym(sdkSo, "MpiSdkInit"));
81 if (SdkInit == nullptr) {
82 return;
83 }
84 SdkExit = (void (*)())(dlsym(sdkSo, "MpiSdkExit"));
85 if (SdkExit == nullptr) {
86 return;
87 }
88 SdkInit();
89 #endif
90 handleSo = dlopen(RESOLVED_PATH.c_str(), RTLD_LAZY);
91 if (handleSo == nullptr) {
92 return;
93 }
94 GetAudioManager = (TestAudioManager *(*)())(dlsym(handleSo, FUNCTION_NAME.c_str()));
95 if (GetAudioManager == nullptr) {
96 return;
97 }
98 }
99
TearDownTestCase(void)100 void AudioHdiRenderTest::TearDownTestCase(void)
101 {
102 #ifdef AUDIO_MPI_SO
103 SdkExit();
104 if (sdkSo != nullptr) {
105 dlclose(sdkSo);
106 sdkSo = nullptr;
107 }
108 if (SdkInit != nullptr) {
109 SdkInit = nullptr;
110 }
111 if (SdkExit != nullptr) {
112 SdkExit = nullptr;
113 }
114 #endif
115 if (GetAudioManager != nullptr) {
116 GetAudioManager = nullptr;
117 }
118 }
119
SetUp(void)120 void AudioHdiRenderTest::SetUp(void) {}
121
TearDown(void)122 void AudioHdiRenderTest::TearDown(void) {}
123
GetLoadAdapterAudioPara(struct PrepareAudioPara & audiopara)124 int32_t AudioHdiRenderTest::GetLoadAdapterAudioPara(struct PrepareAudioPara& audiopara)
125 {
126 int32_t ret = -1;
127 int size = 0;
128 auto *inst = (AudioHdiRenderTest *)audiopara.self;
129 if (inst != nullptr && inst->GetAudioManager != nullptr) {
130 audiopara.manager = inst->GetAudioManager();
131 }
132 if (audiopara.manager == nullptr) {
133 return HDF_FAILURE;
134 }
135 ret = audiopara.manager->GetAllAdapters(audiopara.manager, &audiopara.descs, &size);
136 if (ret < 0 || audiopara.descs == nullptr || size == 0) {
137 return HDF_FAILURE;
138 } else {
139 int index = SwitchAdapter(audiopara.descs, audiopara.adapterName,
140 audiopara.portType, audiopara.audioPort, size);
141 if (index < 0) {
142 return HDF_FAILURE;
143 } else {
144 audiopara.desc = &audiopara.descs[index];
145 }
146 }
147 if (audiopara.desc == nullptr) {
148 return HDF_FAILURE;
149 } else {
150 ret = audiopara.manager->LoadAdapter(audiopara.manager, audiopara.desc, &audiopara.adapter);
151 }
152 if (ret < 0 || audiopara.adapter == nullptr) {
153 return HDF_FAILURE;
154 }
155 return HDF_SUCCESS;
156 }
157
158 /**
159 * @tc.name Test RenderGetLatency API via legal
160 * @tc.number SUB_Audio_HDI_RenderGetLatency_0001
161 * @tc.desc test RenderGetLatency interface, return 0 if GetLatency successful
162 * @tc.author: wangkang
163 */
164 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderGetLatency_0001, TestSize.Level1)
165 {
166 int32_t ret = -1;
167 uint32_t latencyTime = 0;
168 uint32_t expectLatency = 0;
169 struct AudioAdapter *adapter = nullptr;
170 struct AudioRender *render = nullptr;
171 ASSERT_NE(nullptr, GetAudioManager);
172 TestAudioManager manager = *GetAudioManager();
173 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME_USB);
174 ASSERT_EQ(HDF_SUCCESS, ret);
175
176 ret = render->GetLatency(render, &latencyTime);
177 EXPECT_EQ(HDF_SUCCESS, ret);
178 EXPECT_LT(expectLatency, latencyTime);
179
180 ret = render->control.Stop((AudioHandle)render);
181 adapter->DestroyRender(adapter, render);
182 manager.UnloadAdapter(&manager, adapter);
183 }
184 /**
185 * @tc.name Test RenderGetLatency API via Setting parameters render is empty
186 * @tc.number SUB_Audio_HDI_AudioRenderGetLatency_0002
187 * @tc.desc test RenderGetLatency interface, return -1 if Setting parameters render is empty
188 * @tc.author: wangkang
189 */
190 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderGetLatency_0002, TestSize.Level1)
191 {
192 int32_t ret = -1;
193 uint32_t latencyTime = 0;
194 struct AudioAdapter *adapter = nullptr;
195 struct AudioRender *render = nullptr;
196 struct AudioRender *renderNull = nullptr;
197 ASSERT_NE(nullptr, GetAudioManager);
198 TestAudioManager manager = *GetAudioManager();
199 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME_USB);
200 ASSERT_EQ(HDF_SUCCESS, ret);
201
202 ret = render->GetLatency(renderNull, &latencyTime);
203 EXPECT_EQ(HDF_FAILURE, ret);
204
205 ret = render->control.Stop((AudioHandle)render);
206 adapter->DestroyRender(adapter, render);
207 manager.UnloadAdapter(&manager, adapter);
208 }
209 /**
210 * @tc.name Test RenderGetLatency API via Setting parameters ms is empty
211 * @tc.number SUB_Audio_HDI_AudioRenderGetLatency_0003
212 * @tc.desc test RenderGetLatency interface,return -1 if Setting parameters ms is empty
213 * @tc.author: wangkang
214 */
215 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderGetLatency_0003, TestSize.Level1)
216 {
217 int32_t ret = -1;
218 uint32_t *latencyTime = nullptr;
219 struct AudioRender *render = nullptr;
220 struct AudioAdapter *adapter = nullptr;
221 ASSERT_NE(nullptr, GetAudioManager);
222 TestAudioManager manager = *GetAudioManager();
223 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME_USB);
224 ASSERT_EQ(HDF_SUCCESS, ret);
225
226 ret = render->GetLatency(render, latencyTime);
227 EXPECT_EQ(HDF_FAILURE, ret);
228
229 ret = render->control.Stop((AudioHandle)render);
230 adapter->DestroyRender(adapter, render);
231 manager.UnloadAdapter(&manager, adapter);
232 }
233 /**
234 * @tc.name Test SetRenderSpeed API via legal
235 * @tc.number SUB_Audio_HDI_AudioRenderSetRenderSpeed_0001
236 * @tc.desc Test SetRenderSpeed interface,return -2 if setting RenderSpeed
237 * @tc.author: tiansuli
238 */
239 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderSetRenderSpeed_0001, TestSize.Level1)
240 {
241 int32_t ret = -1;
242 float speed = 100;
243 TestAudioManager manager = {};
244 struct AudioAdapter *adapter =nullptr;
245 struct AudioRender *render = nullptr;
246 ASSERT_NE(nullptr, GetAudioManager);
247 manager = *GetAudioManager();
248 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME_USB);
249 ASSERT_EQ(HDF_SUCCESS, ret);
250
251 ret = render->SetRenderSpeed(render, speed);
252 EXPECT_EQ(HDF_ERR_NOT_SUPPORT, ret);
253
254 render->control.Stop((AudioHandle)render);
255 adapter->DestroyRender(adapter, render);
256 manager.UnloadAdapter(&manager, adapter);
257 }
258 /**
259 * @tc.name Test SetRenderSpeed API via setting the incoming parameter handle is nullptr
260 * @tc.number SUB_Audio_HDI_AudioRenderSetRenderSpeed_0002
261 * @tc.desc Test SetRenderSpeed interface,return -2 if the incoming parameter handle is nullptr
262 * @tc.author: tiansuli
263 */
264 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderSetRenderSpeed_0002, TestSize.Level1)
265 {
266 int32_t ret = -1;
267 float speed = 0;
268 TestAudioManager manager = {};
269 struct AudioAdapter *adapter =nullptr;
270 struct AudioRender *render = nullptr;
271 struct AudioRender *renderNull = nullptr;
272 ASSERT_NE(nullptr, GetAudioManager);
273 manager = *GetAudioManager();
274 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME_USB);
275 ASSERT_EQ(HDF_SUCCESS, ret);
276
277 ret = render->SetRenderSpeed(renderNull, speed);
278 EXPECT_EQ(HDF_FAILURE, ret);
279
280 render->control.Stop((AudioHandle)render);
281 adapter->DestroyRender(adapter, render);
282 manager.UnloadAdapter(&manager, adapter);
283 }
284 /**
285 * @tc.name Test GetRenderSpeed API via legal
286 * @tc.number SUB_Audio_HDI_AudioRenderGetRenderSpeed_0001
287 * @tc.desc Test GetRenderSpeed interface,return -2 if getting RenderSpeed
288 * @tc.author: tiansuli
289 */
290 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderGetRenderSpeed_0001, TestSize.Level1)
291 {
292 int32_t ret = -1;
293 float speed = 0;
294 TestAudioManager manager = {};
295 struct AudioAdapter *adapter =nullptr;
296 struct AudioRender *render = nullptr;
297 ASSERT_NE(nullptr, GetAudioManager);
298 manager = *GetAudioManager();
299 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME_USB);
300 ASSERT_EQ(HDF_SUCCESS, ret);
301 ret = render->GetRenderSpeed(render, &speed);
302 EXPECT_EQ(HDF_ERR_NOT_SUPPORT, ret);
303
304 render->control.Stop((AudioHandle)render);
305 adapter->DestroyRender(adapter, render);
306 manager.UnloadAdapter(&manager, adapter);
307 }
308 /**
309 * @tc.name Test GetRenderSpeed API via setting the incoming parameter handle is nullptr
310 * @tc.number SUB_Audio_HDI_AudioRenderGetRenderSpeed_0002
311 * @tc.desc Test GetRenderSpeed interface,return -2 if the incoming parameter handle is nullptr
312 * @tc.author: tiansuli
313 */
314 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderGetRenderSpeed_0002, TestSize.Level1)
315 {
316 int32_t ret = -1;
317 TestAudioManager manager = {};
318 struct AudioAdapter *adapter =nullptr;
319 struct AudioRender *render = nullptr;
320 struct AudioRender *renderNull = nullptr;
321 float speed = 0;
322 ASSERT_NE(nullptr, GetAudioManager);
323 manager = *GetAudioManager();
324 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME_USB);
325 ASSERT_EQ(HDF_SUCCESS, ret);
326
327 ret = render->GetRenderSpeed(renderNull, &speed);
328 EXPECT_EQ(HDF_FAILURE, ret);
329
330 render->control.Stop((AudioHandle)render);
331 adapter->DestroyRender(adapter, render);
332 manager.UnloadAdapter(&manager, adapter);
333 }
334 /**
335 * @tc.name Test GetRenderSpeed API via setting the incoming parameter speed is nullptr
336 * @tc.number SUB_Audio_HDI_AudioRenderGetRenderSpeed_0002
337 * @tc.desc Test GetRenderSpeed interface,return -2 if the incoming parameter speed is nullptr
338 * @tc.author: tiansuli
339 */
340 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderGetRenderSpeed_0003, TestSize.Level1)
341 {
342 int32_t ret = -1;
343 TestAudioManager manager = {};
344 struct AudioAdapter *adapter =nullptr;
345 struct AudioRender *render = nullptr;
346 float *speedNull = nullptr;
347 ASSERT_NE(nullptr, GetAudioManager);
348 manager = *GetAudioManager();
349 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME_USB);
350 ASSERT_EQ(HDF_SUCCESS, ret);
351
352 ret = render->GetRenderSpeed(render, speedNull);
353 EXPECT_EQ(HDF_FAILURE, ret);
354
355 render->control.Stop((AudioHandle)render);
356 adapter->DestroyRender(adapter, render);
357 manager.UnloadAdapter(&manager, adapter);
358 }
359 /**
360 * @tc.name Test AudioRenderFrame API via legal input
361 * @tc.number SUB_Audio_HDI_AudioRenderFrame_0001
362 * @tc.desc test AudioRenderFrame interface,Returns 0 if the data is written successfully
363 * @tc.author: liweiming
364 */
365 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderFrame_0001, TestSize.Level1)
366 {
367 int32_t ret = -1;
368 uint64_t requestBytes = 0;
369 uint64_t replyBytes = 0;
370 enum AudioPortPin pins = PIN_OUT_SPEAKER;
371 struct AudioAdapter *adapter = nullptr;
372 struct AudioRender *render = nullptr;
373 char *frame = nullptr;
374 ASSERT_NE(nullptr, GetAudioManager);
375 TestAudioManager manager = *GetAudioManager();
376 ret = AudioCreateRender(manager, pins, ADAPTER_NAME_USB, &adapter, &render);
377 ASSERT_EQ(HDF_SUCCESS, ret);
378 ret = render->control.Start((AudioHandle)render);
379 EXPECT_EQ(HDF_SUCCESS, ret);
380
381 ret = RenderFramePrepare(AUDIO_FILE, frame, requestBytes);
382 EXPECT_EQ(HDF_SUCCESS, ret);
383 ret = render->RenderFrame(render, frame, requestBytes, &replyBytes);
384 EXPECT_EQ(HDF_SUCCESS, ret);
385
386 render->control.Stop((AudioHandle)render);
387 adapter->DestroyRender(adapter, render);
388 manager.UnloadAdapter(&manager, adapter);
389 if (frame != nullptr) {
390 free(frame);
391 frame = nullptr;
392 }
393 }
394 /**
395 * @tc.name Test AudioRenderFrame API via setting the incoming parameter render is nullptr
396 * @tc.number SUB_Audio_HDI_AudioRenderFrame_0002
397 * @tc.desc Test AudioRenderFrame interface,Returns -1 if the incoming parameter render is nullptr
398 * @tc.author: liweiming
399 */
400 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderFrame_0002, TestSize.Level1)
401 {
402 int32_t ret = -1;
403 uint64_t requestBytes = 0;
404 uint64_t replyBytes = 0;
405 struct AudioAdapter *adapter = nullptr;
406 struct AudioRender *render = nullptr;
407 struct AudioRender *renderNull = nullptr;
408 char *frame = nullptr;
409
410 ASSERT_NE(nullptr, GetAudioManager);
411 TestAudioManager manager = *GetAudioManager();
412 ret = AudioCreateRender(manager, PIN_OUT_SPEAKER, ADAPTER_NAME_USB, &adapter, &render);
413 ASSERT_EQ(HDF_SUCCESS, ret);
414 ret = render->control.Start((AudioHandle)render);
415 EXPECT_EQ(HDF_SUCCESS, ret);
416
417 ret = RenderFramePrepare(AUDIO_FILE, frame, requestBytes);
418 EXPECT_EQ(HDF_SUCCESS, ret);
419 ret = render->RenderFrame(renderNull, frame, requestBytes, &replyBytes);
420 EXPECT_EQ(HDF_FAILURE, ret);
421
422 ret = render->control.Stop((AudioHandle)render);
423 adapter->DestroyRender(adapter, render);
424 manager.UnloadAdapter(&manager, adapter);
425 if (frame != nullptr) {
426 free(frame);
427 frame = nullptr;
428 }
429 }
430 /**
431 * @tc.name Test AudioRenderFrame API via setting the incoming parameter frame is nullptr
432 * @tc.number SUB_Audio_HDI_AudioRenderFrame_0003
433 * @tc.desc Test AudioRenderFrame interface,Returns -1 if the incoming parameter frame is nullptr
434 * @tc.author: liweiming
435 */
436 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderFrame_0003, TestSize.Level1)
437 {
438 int32_t ret = -1;
439 uint64_t requestBytes = 0;
440 uint64_t replyBytes = 0;
441 struct AudioAdapter *adapter = nullptr;
442 struct AudioRender *render = nullptr;
443 char *frame = nullptr;
444
445 ASSERT_NE(nullptr, GetAudioManager);
446 TestAudioManager manager = *GetAudioManager();
447 ret = AudioCreateRender(manager, PIN_OUT_SPEAKER, ADAPTER_NAME_USB, &adapter, &render);
448 ASSERT_EQ(HDF_SUCCESS, ret);
449 ret = render->control.Start((AudioHandle)render);
450 EXPECT_EQ(HDF_SUCCESS, ret);
451
452 ret = render->RenderFrame(render, frame, requestBytes, &replyBytes);
453 EXPECT_EQ(HDF_FAILURE, ret);
454 ret = render->control.Stop((AudioHandle)render);
455 adapter->DestroyRender(adapter, render);
456 manager.UnloadAdapter(&manager, adapter);
457 }
458 /**
459 * @tc.name Test AudioRenderFrame API via setting the incoming parameter replyBytes is nullptr
460 * @tc.number SUB_Audio_HDI_AudioRenderFrame_0004
461 * @tc.desc Test AudioRenderFrame interface,Returns -1 if the incoming parameter replyBytes is nullptr
462 * @tc.author: liweiming
463 */
464 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderFrame_0004, TestSize.Level1)
465 {
466 int32_t ret = -1;
467 uint64_t requestBytes = 0;
468 struct AudioAdapter *adapter = nullptr;
469 struct AudioRender *render = nullptr;
470 char *frame = nullptr;
471 uint64_t *replyBytes = nullptr;
472
473 ASSERT_NE(nullptr, GetAudioManager);
474 TestAudioManager manager = *GetAudioManager();
475 ret = AudioCreateRender(manager, PIN_OUT_SPEAKER, ADAPTER_NAME_USB, &adapter, &render);
476 ASSERT_EQ(HDF_SUCCESS, ret);
477 ret = render->control.Start((AudioHandle)render);
478 EXPECT_EQ(HDF_SUCCESS, ret);
479
480 ret = RenderFramePrepare(AUDIO_FILE, frame, requestBytes);
481 EXPECT_EQ(HDF_SUCCESS, ret);
482 ret = render->RenderFrame(render, frame, requestBytes, replyBytes);
483 EXPECT_EQ(HDF_FAILURE, ret);
484
485 ret = render->control.Stop((AudioHandle)render);
486 adapter->DestroyRender(adapter, render);
487 manager.UnloadAdapter(&manager, adapter);
488 if (frame != nullptr) {
489 free(frame);
490 frame = nullptr;
491 }
492 }
493 /**
494 * @tc.name Test AudioRenderFrame API without calling interface renderstart
495 * @tc.number SUB_Audio_HDI_AudioRenderFrame_0005
496 * @tc.desc Test AudioRenderFrame interface,Returns -1 if without calling interface renderstart
497 * @tc.author: liweiming
498 */
499 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderFrame_0005, TestSize.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(nullptr, GetAudioManager);
509 TestAudioManager manager = *GetAudioManager();
510 ret = AudioCreateRender(manager, PIN_OUT_SPEAKER, ADAPTER_NAME_USB, &adapter, &render);
511 ASSERT_EQ(HDF_SUCCESS, ret);
512 ret = RenderFramePrepare(AUDIO_FILE, frame, requestBytes);
513 EXPECT_EQ(HDF_SUCCESS, ret);
514 ret = render->RenderFrame(render, frame, requestBytes, &replyBytes);
515 EXPECT_EQ(HDF_FAILURE, 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 * @tc.author: tiansuli
529 */
530 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderSetChannelMode_0001, TestSize.Level1)
531 {
532 int32_t ret = -1;
533 TestAudioManager manager = {};
534 struct AudioAdapter *adapter =nullptr;
535 struct AudioRender *render = nullptr;
536 enum AudioChannelMode mode = AUDIO_CHANNEL_NORMAL;
537 enum AudioChannelMode modeOne = AUDIO_CHANNEL_BOTH_LEFT;
538 enum AudioChannelMode modeSec = AUDIO_CHANNEL_BOTH_RIGHT;
539 enum AudioChannelMode modeTrd = AUDIO_CHANNEL_EXCHANGE;
540 ASSERT_NE(nullptr, GetAudioManager);
541 manager = *GetAudioManager();
542 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME_USB);
543 ASSERT_EQ(HDF_SUCCESS, ret);
544 ret = render->SetChannelMode(render, mode);
545 EXPECT_EQ(HDF_SUCCESS, ret);
546 ret = render->GetChannelMode(render, &mode);
547 EXPECT_EQ(HDF_SUCCESS, ret);
548 EXPECT_EQ(AUDIO_CHANNEL_NORMAL, mode);
549 ret = render->SetChannelMode(render, modeOne);
550 EXPECT_EQ(HDF_SUCCESS, ret);
551 ret = render->GetChannelMode(render, &modeOne);
552 EXPECT_EQ(HDF_SUCCESS, ret);
553 EXPECT_EQ(AUDIO_CHANNEL_BOTH_LEFT, modeOne);
554 ret = render->SetChannelMode(render, modeSec);
555 EXPECT_EQ(HDF_SUCCESS, ret);
556 ret = render->GetChannelMode(render, &modeSec);
557 EXPECT_EQ(HDF_SUCCESS, ret);
558 EXPECT_EQ(AUDIO_CHANNEL_BOTH_RIGHT, modeSec);
559 ret = render->SetChannelMode(render, modeTrd);
560 EXPECT_EQ(HDF_SUCCESS, ret);
561 ret = render->GetChannelMode(render, &modeTrd);
562 EXPECT_EQ(HDF_SUCCESS, ret);
563 EXPECT_EQ(AUDIO_CHANNEL_EXCHANGE, modeTrd);
564 render->control.Stop((AudioHandle)render);
565 adapter->DestroyRender(adapter, render);
566 manager.UnloadAdapter(&manager, adapter);
567 }
568 /**
569 * @tc.name Test SetChannelMode API via setting channel mode to different values
570 * @tc.number SUB_Audio_HDI_AudioRenderSetChannelMode_0002
571 * @tc.desc Test SetChannelMode interface,return 0 if set channel mode to different values
572 * @tc.author: tiansuli
573 */
574 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderSetChannelMode_0002, TestSize.Level1)
575 {
576 int32_t ret = -1;
577 TestAudioManager manager = {};
578 struct AudioAdapter *adapter =nullptr;
579 struct AudioRender *render = nullptr;
580 enum AudioChannelMode mode = AUDIO_CHANNEL_MIX;
581 enum AudioChannelMode modeOne = AUDIO_CHANNEL_LEFT_MUTE;
582 enum AudioChannelMode modeSec = AUDIO_CHANNEL_RIGHT_MUTE;
583 enum AudioChannelMode modeTrd = AUDIO_CHANNEL_BOTH_MUTE;
584 ASSERT_NE(nullptr, GetAudioManager);
585 manager = *GetAudioManager();
586 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME_USB);
587 ASSERT_EQ(HDF_SUCCESS, ret);
588 ret = render->SetChannelMode(render, mode);
589 EXPECT_EQ(HDF_SUCCESS, ret);
590 ret = render->GetChannelMode(render, &mode);
591 EXPECT_EQ(HDF_SUCCESS, ret);
592 EXPECT_EQ(AUDIO_CHANNEL_MIX, mode);
593 ret = render->SetChannelMode(render, modeOne);
594 EXPECT_EQ(HDF_SUCCESS, ret);
595 ret = render->GetChannelMode(render, &modeOne);
596 EXPECT_EQ(HDF_SUCCESS, ret);
597 EXPECT_EQ(AUDIO_CHANNEL_LEFT_MUTE, modeOne);
598 ret = render->SetChannelMode(render, modeSec);
599 EXPECT_EQ(HDF_SUCCESS, ret);
600 ret = render->GetChannelMode(render, &modeSec);
601 EXPECT_EQ(HDF_SUCCESS, ret);
602 EXPECT_EQ(AUDIO_CHANNEL_RIGHT_MUTE, modeSec);
603 ret = render->SetChannelMode(render, modeTrd);
604 EXPECT_EQ(HDF_SUCCESS, ret);
605 ret = render->GetChannelMode(render, &modeTrd);
606 EXPECT_EQ(HDF_SUCCESS, ret);
607 EXPECT_EQ(AUDIO_CHANNEL_BOTH_MUTE, modeTrd);
608 render->control.Stop((AudioHandle)render);
609 adapter->DestroyRender(adapter, render);
610 manager.UnloadAdapter(&manager, adapter);
611 }
612 /**
613 * @tc.name Test SetChannelMode API via setting channel mode after render object is created
614 * @tc.number SUB_Audio_HDI_AudioRenderSetChannelMode_0003
615 * @tc.desc Test SetChannelMode interface,return 0 if set channel mode after render object is created
616 * @tc.author: tiansuli
617 */
618 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderSetChannelMode_0003, TestSize.Level1)
619 {
620 int32_t ret = -1;
621 TestAudioManager manager = {};
622 struct AudioAdapter *adapter =nullptr;
623 struct AudioRender *render = nullptr;
624 enum AudioChannelMode mode = AUDIO_CHANNEL_NORMAL;
625 enum AudioPortPin pins = PIN_OUT_SPEAKER;
626 ASSERT_NE(nullptr, GetAudioManager);
627 manager = *GetAudioManager();
628 ret = AudioCreateRender(manager, pins, ADAPTER_NAME_USB, &adapter, &render);
629 ASSERT_EQ(HDF_SUCCESS, ret);
630 ret = render->SetChannelMode(render, mode);
631 EXPECT_EQ(HDF_SUCCESS, ret);
632 ret = render->GetChannelMode(render, &mode);
633 EXPECT_EQ(HDF_SUCCESS, ret);
634 EXPECT_EQ(AUDIO_CHANNEL_NORMAL, mode);
635
636 adapter->DestroyRender(adapter, render);
637 manager.UnloadAdapter(&manager, adapter);
638 }
639 /**
640 * @tc.name Test SetChannelMode API via setting the parameter render is nullptr
641 * @tc.number SUB_Audio_HDI_AudioRenderSetChannelMode_0004
642 * @tc.desc Test SetChannelMode interface,return -1 if set the parameter render is nullptr
643 * @tc.author: tiansuli
644 */
645 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderSetChannelMode_0004, TestSize.Level1)
646 {
647 int32_t ret = -1;
648 TestAudioManager manager = {};
649 struct AudioRender *render = nullptr;
650 struct AudioAdapter *adapter =nullptr;
651 struct AudioRender *renderNull = nullptr;
652 enum AudioChannelMode mode = AUDIO_CHANNEL_NORMAL;
653 enum AudioPortPin pins = PIN_OUT_SPEAKER;
654 ASSERT_NE(nullptr, GetAudioManager);
655 manager = *GetAudioManager();
656 ret = AudioCreateRender(manager, pins, ADAPTER_NAME_USB, &adapter, &render);
657 ASSERT_EQ(HDF_SUCCESS, ret);
658
659 ret = render->SetChannelMode(renderNull, mode);
660 EXPECT_EQ(HDF_FAILURE, ret);
661
662 adapter->DestroyRender(adapter, render);
663 manager.UnloadAdapter(&manager, adapter);
664 }
665 /**
666 * @tc.name Test GetChannelMode API via getting the channel mode after setting
667 * @tc.number SUB_Audio_HDI_AudioRenderGetChannelMode_0001
668 * @tc.desc Test GetChannelMode interface,return 0 if getting the channel mode after setting
669 * @tc.author: tiansuli
670 */
671 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderGetChannelMode_0001, TestSize.Level1)
672 {
673 int32_t ret = -1;
674 TestAudioManager manager = {};
675 struct AudioAdapter *adapter =nullptr;
676 struct AudioRender *render = nullptr;
677 enum AudioChannelMode mode = AUDIO_CHANNEL_NORMAL;
678 ASSERT_NE(nullptr, GetAudioManager);
679 manager = *GetAudioManager();
680 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME_USB);
681 ASSERT_EQ(HDF_SUCCESS, ret);
682
683 ret = render->GetChannelMode(render, &mode);
684 EXPECT_EQ(HDF_SUCCESS, ret);
685 ret = render->SetChannelMode(render, mode);
686 EXPECT_EQ(HDF_SUCCESS, ret);
687 ret = render->GetChannelMode(render, &mode);
688 EXPECT_EQ(HDF_SUCCESS, ret);
689 EXPECT_EQ(AUDIO_CHANNEL_NORMAL, mode);
690
691 render->control.Stop((AudioHandle)render);
692 adapter->DestroyRender(adapter, render);
693 manager.UnloadAdapter(&manager, adapter);
694 }
695 /**
696 * @tc.name Test GetChannelMode API via getting the parameter render is nullptr
697 * @tc.number SUB_Audio_HDI_AudioRenderGetChannelMode_0002
698 * @tc.desc Test GetChannelMode interface,return -1 if getting the parameter render is nullptr
699 * @tc.author: tiansuli
700 */
701 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderGetChannelMode_0002, TestSize.Level1)
702 {
703 int32_t ret = -1;
704 TestAudioManager manager = {};
705 struct AudioAdapter *adapter =nullptr;
706 struct AudioRender *renderNull = nullptr;
707 struct AudioRender *render = nullptr;
708 enum AudioChannelMode mode = AUDIO_CHANNEL_NORMAL;
709
710 ASSERT_NE(nullptr, GetAudioManager);
711 manager = *GetAudioManager();
712 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME_USB);
713 ASSERT_EQ(HDF_SUCCESS, ret);
714
715 ret = render->GetChannelMode(renderNull, &mode);
716 EXPECT_EQ(HDF_FAILURE, ret);
717
718 render->control.Stop((AudioHandle)render);
719 adapter->DestroyRender(adapter, render);
720 manager.UnloadAdapter(&manager, adapter);
721 }
722 /**
723 * @tc.name Test GetChannelMode API via getting the channel mode after the render object is created
724 * @tc.number SUB_Audio_HDI_AudioRenderGetChannelMode_0003
725 * @tc.desc Test GetChannelMode interface,return 0 if getting the channel mode after the object is created
726 * @tc.author: tiansuli
727 */
728 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderGetChannelMode_0003, TestSize.Level1)
729 {
730 int32_t ret = -1;
731 struct AudioAdapter *adapter = nullptr;
732 struct AudioRender *render = nullptr;
733 TestAudioManager manager = {};
734 enum AudioPortPin pins = PIN_OUT_SPEAKER;
735 enum AudioChannelMode mode = AUDIO_CHANNEL_NORMAL;
736 ASSERT_NE(nullptr, GetAudioManager);
737 manager = *GetAudioManager();
738 ret = AudioCreateRender(manager, pins, ADAPTER_NAME_USB, &adapter, &render);
739 ASSERT_EQ(HDF_SUCCESS, ret);
740 ret = render->GetChannelMode(render, &mode);
741 EXPECT_EQ(HDF_SUCCESS, ret);
742 EXPECT_EQ(AUDIO_CHANNEL_NORMAL, mode);
743
744 adapter->DestroyRender(adapter, render);
745 manager.UnloadAdapter(&manager, adapter);
746 }
747 /**
748 * @tc.name Test GetRenderPosition API via legal input
749 * @tc.number SUB_Audio_HDI_AudioRenderGetRenderPosition_0001
750 * @tc.desc Test GetRenderPosition interface,Returns 0 if get RenderPosition during playing.
751 * @tc.author: tiansuli
752 */
753 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderGetRenderPosition_0001, TestSize.Level1)
754 {
755 int32_t ret = -1;
756 uint64_t frames = 0;
757 int64_t timeExp = 0;
758 struct AudioTimeStamp time = {.tvSec = 0, .tvNSec = 0};
759 struct PrepareAudioPara audiopara = {
760 .portType = PORT_OUT, .adapterName = ADAPTER_NAME_USB.c_str(), .self = this, .pins = PIN_OUT_SPEAKER,
761 .path = AUDIO_FILE.c_str()
762 };
763 ASSERT_NE(nullptr, GetAudioManager);
764 audiopara.manager = GetAudioManager();
765 ASSERT_NE(nullptr, audiopara.manager);
766
767 ret = pthread_create(&audiopara.tids, NULL, (THREAD_FUNC)PlayAudioFile, &audiopara);
768 ASSERT_EQ(HDF_SUCCESS, ret);
769 sleep(1);
770 if (audiopara.render != nullptr) {
771 ret = audiopara.render->GetRenderPosition(audiopara.render, &frames, &time);
772 EXPECT_EQ(HDF_SUCCESS, ret);
773 EXPECT_GT((time.tvSec) * SECTONSEC + (time.tvNSec), timeExp);
774 EXPECT_GT(frames, INITIAL_VALUE);
775 }
776
777 ret = ThreadRelease(audiopara);
778 EXPECT_EQ(HDF_SUCCESS, ret);
779 }
780 /**
781 * @tc.name Test AudioRenderGetRenderPosition API via get RenderPosition after the audio file is Paused and resumed
782 * @tc.number SUB_Audio_HDI_AudioRenderGetRenderPosition_0002
783 * @tc.desc Test GetRenderPosition interface,Returns 0 if get RenderPosition after Pause and resume during playing
784 * @tc.author: tiansuli
785 */
786 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderGetRenderPosition_0002, TestSize.Level1)
787 {
788 int32_t ret = -1;
789 int64_t timeExp = 0;
790 uint64_t frames = 0;
791 struct AudioTimeStamp time = {.tvSec = 0, .tvNSec = 0};
792 struct PrepareAudioPara audiopara = {
793 .portType = PORT_OUT, .adapterName = ADAPTER_NAME_USB.c_str(), .self = this, .pins = PIN_OUT_SPEAKER,
794 .path = AUDIO_FILE.c_str()
795 };
796 ASSERT_NE(nullptr, GetAudioManager);
797 audiopara.manager = GetAudioManager();
798 ASSERT_NE(nullptr, audiopara.manager);
799
800 ret = pthread_create(&audiopara.tids, NULL, (THREAD_FUNC)PlayAudioFile, &audiopara);
801 ASSERT_EQ(HDF_SUCCESS, ret);
802 sleep(1);
803 if (audiopara.render != nullptr) {
804 ret = audiopara.render->control.Pause((AudioHandle)(audiopara.render));
805 EXPECT_EQ(HDF_SUCCESS, ret);
806 ret = audiopara.render->GetRenderPosition(audiopara.render, &frames, &time);
807 EXPECT_EQ(HDF_SUCCESS, ret);
808 EXPECT_GT((time.tvSec) * SECTONSEC + (time.tvNSec), timeExp);
809 EXPECT_GT(frames, INITIAL_VALUE);
810 usleep(1000);
811 ret = audiopara.render->control.Resume((AudioHandle)(audiopara.render));
812 EXPECT_EQ(HDF_SUCCESS, ret);
813 ret = audiopara.render->GetRenderPosition(audiopara.render, &frames, &time);
814 EXPECT_EQ(HDF_SUCCESS, ret);
815 EXPECT_GT((time.tvSec) * SECTONSEC + (time.tvNSec), timeExp);
816 EXPECT_GT(frames, INITIAL_VALUE);
817 }
818
819 ret = ThreadRelease(audiopara);
820 EXPECT_EQ(HDF_SUCCESS, ret);
821 }
822 /**
823 * @tc.name Test GetRenderPosition API via get RenderPosition after the audio file is stopped
824 * @tc.number SUB_Audio_HDI_AudioRenderGetRenderPosition_0003
825 * @tc.desc Test GetRenderPosition interface,Returns 0 if get RenderPosition after stop
826 * @tc.author: tiansuli
827 */
828 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderGetRenderPosition_0003, TestSize.Level1)
829 {
830 int32_t ret = -1;
831 int64_t timeExp = 0;
832 uint64_t frames = 0;
833 struct AudioAdapter *adapter =nullptr;
834 struct AudioRender *render = nullptr;
835 struct AudioTimeStamp time = {.tvSec = 0, .tvNSec = 0};
836 ASSERT_NE(nullptr, GetAudioManager);
837 TestAudioManager manager = *GetAudioManager();
838 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME_USB);
839 ASSERT_EQ(HDF_SUCCESS, ret);
840 ret = render->control.Stop((AudioHandle)render);
841 EXPECT_EQ(HDF_SUCCESS, ret);
842
843 ret = render->GetRenderPosition(render, &frames, &time);
844 EXPECT_EQ(HDF_SUCCESS, ret);
845 EXPECT_GT((time.tvSec) * SECTONSEC + (time.tvNSec), timeExp);
846 EXPECT_GT(frames, INITIAL_VALUE);
847
848 adapter->DestroyRender(adapter, render);
849 manager.UnloadAdapter(&manager, adapter);
850 }
851 /**
852 * @tc.name Test AudioRenderGetRenderPosition API via setting the parameter render is nullptr
853 * @tc.number SUB_Audio_HDI_AudioRenderGetRenderPosition_0004
854 * @tc.desc Test AudioRenderGetRenderPosition interface, return -1 if setting the parameter render is nullptr
855 * @tc.author: tiansuli
856 */
857 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderGetRenderPosition_0004, TestSize.Level1)
858 {
859 int32_t ret = -1;
860 uint64_t frames = 0;
861 int64_t timeExp = 0;
862 struct AudioRender *render = nullptr;
863 struct AudioAdapter *adapter =nullptr;
864 struct AudioTimeStamp time = {.tvSec = 0, .tvNSec = 0};
865
866 ASSERT_NE(nullptr, GetAudioManager);
867 TestAudioManager manager = *GetAudioManager();
868 ret = AudioCreateRender(manager, PIN_OUT_SPEAKER, ADAPTER_NAME_USB, &adapter, &render);
869 ASSERT_EQ(HDF_SUCCESS, ret);
870 ret = render->GetRenderPosition(render, &frames, &time);
871 EXPECT_EQ(HDF_SUCCESS, ret);
872 EXPECT_EQ((time.tvSec) * SECTONSEC + (time.tvNSec), timeExp);
873
874 adapter->DestroyRender(adapter, render);
875 manager.UnloadAdapter(&manager, adapter);
876 }
877 /**
878 * @tc.name Test AudioRenderGetRenderPosition API via setting the parameter render is nullptr
879 * @tc.number SUB_Audio_HDI_AudioRenderGetRenderPosition_0005
880 * @tc.desc Test AudioRenderGetRenderPosition interface, return -1 if setting the parameter render is nullptr
881 * @tc.author: tiansuli
882 */
883 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderGetRenderPosition_0005, TestSize.Level1)
884 {
885 int32_t ret = -1;
886 uint64_t frames = 0;
887 struct AudioTimeStamp time = {};
888 struct AudioAdapter *adapter =nullptr;
889 struct AudioRender *render = nullptr;
890 struct AudioRender *renderNull = nullptr;
891
892 ASSERT_NE(nullptr, GetAudioManager);
893 TestAudioManager manager = *GetAudioManager();
894 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME_USB);
895 ASSERT_EQ(HDF_SUCCESS, ret);
896 ret = render->GetRenderPosition(renderNull, &frames, &time);
897 EXPECT_EQ(HDF_FAILURE, ret);
898
899 render->control.Stop((AudioHandle)render);
900 adapter->DestroyRender(adapter, render);
901 manager.UnloadAdapter(&manager, adapter);
902 }
903 /**
904 * @tc.name Test AudioRenderGetRenderPosition API via setting the parameter frames is nullptr
905 * @tc.number SUB_Audio_HDI_AudioRenderGetRenderPosition_0006
906 * @tc.desc Test AudioRenderGetRenderPosition interface, return -1 if setting the parameter frames is nullptr
907 * @tc.author: tiansuli
908 */
909 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderGetRenderPosition_0006, TestSize.Level1)
910 {
911 int32_t ret = -1;
912 uint64_t *framesNull = nullptr;
913 TestAudioManager manager = {};
914 struct AudioAdapter *adapter =nullptr;
915 struct AudioRender *render = nullptr;
916 struct AudioTimeStamp time = {.tvSec = 0, .tvNSec = 0};
917
918 ASSERT_NE(nullptr, GetAudioManager);
919 manager = *GetAudioManager();
920 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME_USB);
921 ASSERT_EQ(HDF_SUCCESS, ret);
922 ret = render->GetRenderPosition(render, framesNull, &time);
923 EXPECT_EQ(HDF_FAILURE, ret);
924
925 render->control.Stop((AudioHandle)render);
926 adapter->DestroyRender(adapter, render);
927 manager.UnloadAdapter(&manager, adapter);
928 }
929 /**
930 * @tc.name Test AudioRenderGetRenderPosition API via setting the parameter time is nullptr
931 * @tc.number SUB_Audio_HDI_AudioRenderGetRenderPosition_0007
932 * @tc.desc Test AudioRenderGetRenderPosition interface, return -1 if setting the parameter time is nullptr
933 * @tc.author: tiansuli
934 */
935 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderGetRenderPosition_0007, TestSize.Level1)
936 {
937 int32_t ret = -1;
938 uint64_t frames = 0;
939 TestAudioManager manager = {};
940 struct AudioAdapter *adapter =nullptr;
941 struct AudioRender *render = nullptr;
942 struct AudioTimeStamp *timeNull = nullptr;
943
944 ASSERT_NE(nullptr, GetAudioManager);
945 manager = *GetAudioManager();
946 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME_USB);
947 ASSERT_EQ(HDF_SUCCESS, ret);
948
949 ret = render->GetRenderPosition(render, &frames, timeNull);
950 EXPECT_EQ(HDF_FAILURE, ret);
951
952 render->control.Stop((AudioHandle)render);
953 adapter->DestroyRender(adapter, render);
954 manager.UnloadAdapter(&manager, adapter);
955 }
956 /**
957 * @tc.name Test AudioRenderGetRenderPosition API via get RenderPosition continuously
958 * @tc.number SUB_Audio_HDI_AudioRenderGetRenderPosition_0008
959 * @tc.desc Test AudioRenderGetRenderPosition interface, return 0 if the GetRenderPosition was called twice
960 * @tc.author: tiansuli
961 */
962 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderGetRenderPosition_0008, TestSize.Level1)
963 {
964 int32_t ret = -1;
965 int64_t timeExp = 0;
966 uint64_t frames = 0;
967 TestAudioManager manager = {};
968 struct AudioAdapter *adapter =nullptr;
969 struct AudioRender *render = nullptr;
970 struct AudioTimeStamp time = {.tvSec = 0, .tvNSec = 0};
971 ASSERT_NE(nullptr, GetAudioManager);
972 manager = *GetAudioManager();
973 ret = AudioCreateStartRender(manager, &render, &adapter, ADAPTER_NAME_USB);
974 ASSERT_EQ(HDF_SUCCESS, ret);
975
976 ret = render->GetRenderPosition(render, &frames, &time);
977 EXPECT_EQ(HDF_SUCCESS, ret);
978 ret = render->GetRenderPosition(render, &frames, &time);
979 EXPECT_EQ(HDF_SUCCESS, ret);
980 EXPECT_GT((time.tvSec) * SECTONSEC + (time.tvNSec), timeExp);
981 EXPECT_GT(frames, INITIAL_VALUE);
982
983 render->control.Stop((AudioHandle)render);
984 adapter->DestroyRender(adapter, render);
985 manager.UnloadAdapter(&manager, adapter);
986 }
987 /**
988 * @tc.name Test GetRenderPosition API via define format to AUDIO_FORMAT_PCM_16_BIT
989 * @tc.number SUB_Audio_HDI_AudioRenderGetRenderPosition_0009
990 * @tc.desc Test GetRenderPosition interface,return 0 if get framesize define format to AUDIO_FORMAT_PCM_16_BIT
991 * @tc.author: tiansuli
992 */
993 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderGetRenderPosition_0009, TestSize.Level1)
994 {
995 int32_t ret = -1;
996 struct AudioAdapter *adapter = nullptr;
997 struct AudioRender *render = nullptr;
998 enum AudioPortPin pins = PIN_OUT_SPEAKER;
999 struct AudioSampleAttributes attrs = {};
1000 struct AudioSampleAttributes attrsValue = {};
1001 uint64_t channelCountExp = 2;
1002 uint32_t sampleRateExp = 48000;
1003 uint64_t frames = 0;
1004 int64_t timeExp = 0;
1005 struct AudioTimeStamp time = {.tvSec = 0, .tvNSec = 0};
1006 TestAudioManager manager = *GetAudioManager();
1007 ASSERT_NE(nullptr, GetAudioManager);
1008 ret = AudioCreateRender(manager, pins, ADAPTER_NAME_USB, &adapter, &render);
1009 ASSERT_EQ(HDF_SUCCESS, ret);
1010 InitAttrs(attrs);
1011 attrs.type = AUDIO_IN_MEDIA;
1012 attrs.interleaved = false;
1013 attrs.format = AUDIO_FORMAT_PCM_16_BIT;
1014 attrs.sampleRate = 48000;
1015 attrs.channelCount = 2;
1016 ret = render->attr.SetSampleAttributes(render, &attrs);
1017 EXPECT_EQ(HDF_SUCCESS, ret);
1018 ret = render->attr.GetSampleAttributes(render, &attrsValue);
1019 EXPECT_EQ(HDF_SUCCESS, ret);
1020 EXPECT_EQ(AUDIO_FORMAT_PCM_16_BIT, attrsValue.format);
1021 EXPECT_EQ(sampleRateExp, attrsValue.sampleRate);
1022 EXPECT_EQ(channelCountExp, attrsValue.channelCount);
1023 ret = AudioRenderStartAndOneFrame(render);
1024 EXPECT_EQ(HDF_SUCCESS, ret);
1025 ret = render->GetRenderPosition(render, &frames, &time);
1026 EXPECT_EQ(HDF_SUCCESS, ret);
1027 EXPECT_GT((time.tvSec) * SECTONSEC + (time.tvNSec), timeExp);
1028 EXPECT_GT(frames, INITIAL_VALUE);
1029 render->control.Stop((AudioHandle)render);
1030 adapter->DestroyRender(adapter, render);
1031 manager.UnloadAdapter(&manager, adapter);
1032 }
1033 /**
1034 * @tc.name Test GetRenderPosition API via define format to AUDIO_FORMAT_PCM_24_BIT
1035 * @tc.number SUB_Audio_HDI_AudioRenderGetRenderPosition_0010
1036 * @tc.desc Test GetRenderPosition interface,return 0 if get framesize define format to AUDIO_FORMAT_PCM_24_BIT
1037 * @tc.author: tiansuli
1038 */
1039 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderGetRenderPosition_0010, TestSize.Level1)
1040 {
1041 int32_t ret = -1;
1042 uint64_t frames = 0;
1043 int64_t timeExp = 0;
1044 uint64_t channelCountExp = 2;
1045 uint32_t sampleRateExp = 48000;
1046 struct AudioAdapter *adapter = nullptr;
1047 struct AudioRender *render = nullptr;
1048 struct AudioSampleAttributes attrs = {};
1049 struct AudioSampleAttributes attrsValue = {};
1050 struct AudioTimeStamp time = {.tvSec = 0, .tvNSec = 0};
1051 ASSERT_NE(nullptr, GetAudioManager);
1052 TestAudioManager manager = *GetAudioManager();
1053 ret = AudioCreateRender(manager, PIN_OUT_SPEAKER, ADAPTER_NAME_USB, &adapter, &render);
1054 ASSERT_EQ(HDF_SUCCESS, ret);
1055 InitAttrs(attrs);
1056 attrs.type = AUDIO_IN_MEDIA;
1057 attrs.interleaved = false;
1058 attrs.format = AUDIO_FORMAT_PCM_24_BIT;
1059 attrs.sampleRate = 48000;
1060 attrs.channelCount = 2;
1061 ret = render->attr.SetSampleAttributes(render, &attrs);
1062 EXPECT_EQ(HDF_SUCCESS, ret);
1063 ret = render->attr.GetSampleAttributes(render, &attrsValue);
1064 EXPECT_EQ(HDF_SUCCESS, ret);
1065 EXPECT_EQ(AUDIO_FORMAT_PCM_24_BIT, attrsValue.format);
1066 EXPECT_EQ(sampleRateExp, attrsValue.sampleRate);
1067 EXPECT_EQ(channelCountExp, attrsValue.channelCount);
1068 ret = AudioRenderStartAndOneFrame(render);
1069 EXPECT_EQ(HDF_SUCCESS, ret);
1070 ret = render->GetRenderPosition(render, &frames, &time);
1071 EXPECT_EQ(HDF_SUCCESS, ret);
1072 EXPECT_GT((time.tvSec) * SECTONSEC + (time.tvNSec), timeExp);
1073 EXPECT_GT(frames, INITIAL_VALUE);
1074 render->control.Stop((AudioHandle)render);
1075 adapter->DestroyRender(adapter, render);
1076 manager.UnloadAdapter(&manager, adapter);
1077 }
1078 /**
1079 * @tc.name Test GetRenderPosition API via define sampleRate and channelCount to different value
1080 * @tc.number SUB_Audio_HDI_AudioRenderGetRenderPosition_0011
1081 * @tc.desc Test GetRenderPosition interface,return 0 if get framesize define channelCount as different values
1082 * @tc.author: tiansuli
1083 */
1084 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderGetRenderPosition_0011, TestSize.Level1)
1085 {
1086 int32_t ret = -1;
1087 uint64_t frames = 0;
1088 int64_t timeExp = 0;
1089 uint32_t sampleRateExp = 48000;
1090 uint64_t channelCountExp = 1;
1091 struct AudioAdapter *adapter = nullptr;
1092 struct AudioRender *render = nullptr;
1093 struct AudioSampleAttributes attrs = {};
1094 struct AudioSampleAttributes attrsValue = {};
1095 struct AudioTimeStamp time = {.tvSec = 0, .tvNSec = 0};
1096 ASSERT_NE(nullptr, GetAudioManager);
1097 TestAudioManager manager = *GetAudioManager();
1098 ret = AudioCreateRender(manager, PIN_OUT_SPEAKER, ADAPTER_NAME_USB, &adapter, &render);
1099 ASSERT_EQ(HDF_SUCCESS, ret);
1100 InitAttrs(attrs);
1101 attrs.type = AUDIO_IN_MEDIA;
1102 attrs.interleaved = false;
1103 attrs.format = AUDIO_FORMAT_PCM_16_BIT;
1104 attrs.sampleRate = 48000;
1105 attrs.channelCount = 1;
1106 ret = render->attr.SetSampleAttributes(render, &attrs);
1107 EXPECT_EQ(HDF_SUCCESS, ret);
1108 ret = render->attr.GetSampleAttributes(render, &attrsValue);
1109 EXPECT_EQ(HDF_SUCCESS, ret);
1110 EXPECT_EQ(sampleRateExp, attrsValue.sampleRate);
1111 EXPECT_EQ(AUDIO_FORMAT_PCM_16_BIT, attrsValue.format);
1112 EXPECT_EQ(channelCountExp, attrsValue.channelCount);
1113 ret = AudioRenderStartAndOneFrame(render);
1114 EXPECT_EQ(HDF_SUCCESS, ret);
1115 ret = render->GetRenderPosition(render, &frames, &time);
1116 EXPECT_EQ(HDF_SUCCESS, ret);
1117 EXPECT_GT((time.tvSec) * SECTONSEC + (time.tvNSec), timeExp);
1118 EXPECT_GT(frames, INITIAL_VALUE);
1119 render->control.Stop((AudioHandle)render);
1120 adapter->DestroyRender(adapter, render);
1121 manager.UnloadAdapter(&manager, adapter);
1122 }
1123 /**
1124 * @tc.name Test GetRenderPosition API via define sampleRate and channelCount to 1
1125 * @tc.number SUB_Audio_HDI_AudioRenderGetRenderPosition_0012
1126 * @tc.desc Test GetRenderPosition interface,return 0 if get framesize define channelCount to 1
1127 * @tc.author: tiansuli
1128 */
1129 HWTEST_F(AudioHdiRenderTest, SUB_Audio_HDI_AudioRenderGetRenderPosition_0012, TestSize.Level1)
1130 {
1131 int32_t ret = -1;
1132 uint64_t frames = 0;
1133 int64_t timeExp = 0;
1134 struct AudioRender *render = nullptr;
1135 struct AudioAdapter *adapter = nullptr;
1136 struct AudioSampleAttributes attrs = {};
1137 struct AudioSampleAttributes attrsValue = {};
1138 struct AudioTimeStamp time = {.tvSec = 0, .tvNSec = 0};
1139 uint64_t channelCountExp = 1;
1140 uint32_t sampleRateExp = 48000;
1141 ASSERT_NE(nullptr, GetAudioManager);
1142 TestAudioManager manager = *GetAudioManager();
1143 ret = AudioCreateRender(manager, PIN_OUT_SPEAKER, ADAPTER_NAME_USB, &adapter, &render);
1144 ASSERT_EQ(HDF_SUCCESS, ret);
1145 InitAttrs(attrs);
1146 attrs.type = AUDIO_IN_MEDIA;
1147 attrs.interleaved = false;
1148 attrs.format = AUDIO_FORMAT_PCM_24_BIT;
1149 attrs.sampleRate = 48000;
1150 attrs.channelCount = 1;
1151 ret = render->attr.SetSampleAttributes(render, &attrs);
1152 EXPECT_EQ(HDF_SUCCESS, ret);
1153 ret = render->attr.GetSampleAttributes(render, &attrsValue);
1154 EXPECT_EQ(HDF_SUCCESS, ret);
1155 EXPECT_EQ(AUDIO_FORMAT_PCM_24_BIT, attrsValue.format);
1156 EXPECT_EQ(sampleRateExp, attrsValue.sampleRate);
1157 EXPECT_EQ(channelCountExp, attrsValue.channelCount);
1158 ret = AudioRenderStartAndOneFrame(render);
1159 EXPECT_EQ(HDF_SUCCESS, ret);
1160 ret = render->GetRenderPosition(render, &frames, &time);
1161 EXPECT_EQ(HDF_SUCCESS, ret);
1162 EXPECT_GT((time.tvSec) * SECTONSEC + (time.tvNSec), timeExp);
1163 EXPECT_GT(frames, INITIAL_VALUE);
1164 render->control.Stop((AudioHandle)render);
1165 adapter->DestroyRender(adapter, render);
1166 manager.UnloadAdapter(&manager, adapter);
1167 }
1168 }