• 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[] = "//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 }