• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 /**
17  * @addtogroup Audio
18  * @{
19  *
20  * @brief Defines audio-related APIs, including custom data types and functions for 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 }