• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 HiSilicon (Shanghai) Technologies CO., LIMITED.
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 #include <stdlib.h>
17 #include <stdio.h>
18 #include <string.h>
19 #include <unistd.h>
20 #include <sys/types.h>
21 #include <sys/stat.h>
22 #include <sys/ioctl.h>
23 #include <fcntl.h>
24 #include <pthread.h>
25 #include <errno.h>
26 #include <signal.h>
27 #include <sys/eventfd.h>
28 
29 #include "hi_resampler_api.h"
30 #include "sample_comm.h"
31 #include "acodec.h"
32 #include "audio_aac_adp.h"
33 #include "audio_dl_adp.h"
34 #include "audio_mp3_adp.h"
35 #include "sample_comm_ive.h"
36 #include "sample_media_ai.h"
37 
38 static PAYLOAD_TYPE_E gs_enPayloadType = PT_AAC;
39 static HI_BOOL gs_bAioReSample = HI_FALSE;
40 static HI_BOOL gs_bUserGetMode = HI_FALSE;
41 static HI_BOOL gs_bAoVolumeCtrl = HI_FALSE;
42 static AUDIO_SAMPLE_RATE_E g_in_sample_rate = AUDIO_SAMPLE_RATE_BUTT;
43 static AUDIO_SAMPLE_RATE_E g_out_sample_rate = AUDIO_SAMPLE_RATE_BUTT;
44 /*
45  * 0:关闭,1:录音,2:保留,3:talkv2
46  * 0: close, 1: record, 2:reserved, 3:talkv2
47  */
48 static HI_U32 g_ai_vqe_type = 1;
49 static HI_BOOL g_sample_audio_exit = HI_FALSE;
50 
51 static AI_RECORDVQE_CONFIG_S g_ai_record_vqe_attr;
52 static AI_TALKVQEV2_CONFIG_S g_ai_talkv2_vqe_attr;
53 
audio_wait_quit(int quitFd)54 static int audio_wait_quit(int quitFd)
55 {
56     eventfd_t eval;
57     int ret = eventfd_read(quitFd, &eval);
58     assert(ret == 0);
59 
60     return 0;
61 }
62 
63 /*
64  * 函数:PT Number到字符串转换
65  * function : PT Number to String
66  */
SAMPLE_AUDIO_Pt2Str(PAYLOAD_TYPE_E enType)67 static char *SAMPLE_AUDIO_Pt2Str(PAYLOAD_TYPE_E enType)
68 {
69     if (enType == PT_G711A) {
70         return "g711a";
71     } else if (enType == PT_G711U) {
72         return "g711u";
73     } else if (enType == PT_ADPCMA) {
74         return "adpcm";
75     } else if (enType == PT_G726) {
76         return "g726";
77     } else if (enType == PT_LPCM) {
78         return "pcm";
79     } else if (enType == PT_AAC) {
80         return "aac";
81     } else if (enType == PT_MP3) {
82         return "mp3";
83     } else {
84         return "data";
85     }
86 }
87 
88 /*
89  * 函数:添加动态加载路径
90  * function : Add dynamic load path
91  */
92 #ifndef HI_VQE_USE_STATIC_MODULE_REGISTER
SAMPLE_AUDIO_AddLibPath(HI_VOID)93 static HI_VOID SAMPLE_AUDIO_AddLibPath(HI_VOID)
94 {
95     HI_S32 s32Ret;
96     HI_CHAR aszLibPath[FILE_NAME_LEN] = {0};
97 #if defined(__HuaweiLite__) && (!defined(__OHOS__))
98     s32Ret = snprintf_s(aszLibPath, FILE_NAME_LEN, FILE_NAME_LEN - 1, "/sharefs/");
99     if (s32Ret <= EOK) {
100         SAMPLE_PRT("\n snprintf_s fail! ret = 0x%x", s32Ret);
101         return;
102     }
103 #else
104 #endif
105     s32Ret = Audio_Dlpath(aszLibPath);
106     if (s32Ret != HI_SUCCESS) {
107         SAMPLE_PRT("%s: add lib path %s failed\n", __FUNCTION__, aszLibPath);
108     }
109     return;
110 }
111 #endif
112 
113 /*
114  * 函数:打开Adec文件
115  * function : Open Adec File
116  */
SAMPLE_AUDIO_OpenAdecFile_AAC(int num,ADEC_CHN AdChn,PAYLOAD_TYPE_E enType)117 static FILE* SAMPLE_AUDIO_OpenAdecFile_AAC(int num, ADEC_CHN AdChn, PAYLOAD_TYPE_E enType)
118 {
119     FILE* pfd;
120     HI_CHAR aszFileName[FILE_NAME_LEN] = {0};
121 
122     /*
123      * 创建文件为了保存流
124      * Create file for save stream
125      */
126 #ifdef __HuaweiLite__
127     if (snprintf_s(aszFileName, FILE_NAME_LEN, FILE_NAME_LEN - 1, "/sharefs/audio_chn%d.%s",
128         AdChn, SAMPLE_AUDIO_Pt2Str(enType)) < 0) {
129         HI_ASSERT(0);
130     }
131 #else
132     if (num == -1) {
133         if (snprintf_s(aszFileName, FILE_NAME_LEN, FILE_NAME_LEN - 1,
134             "audio_chn%d.%s", AdChn, SAMPLE_AUDIO_Pt2Str(enType)) < 0) {
135             HI_ASSERT(0);
136         }
137     } else {
138         SAMPLE_PRT("SAMPLE_AUDIO_OpenAdecFile_AAC\n");
139         SAMPLE_PRT("filename:%d.%s\n", num, SAMPLE_AUDIO_Pt2Str(enType));
140         if (snprintf_s(aszFileName, FILE_NAME_LEN, FILE_NAME_LEN - 1,
141             "/userdata/aac_file/%d.%s", num, SAMPLE_AUDIO_Pt2Str(enType)) < 0) {
142             HI_ASSERT(0);
143         }
144     }
145 #endif
146 
147     pfd = fopen(aszFileName, "rb");
148     if (pfd == NULL) {
149         SAMPLE_PRT("%s: open file %s failed\n", __FUNCTION__, aszFileName);
150         return NULL;
151     }
152     SAMPLE_PRT("open stream file:\"%s\" for adec ok\n", aszFileName);
153     return pfd;
154 }
155 
sample_audio_adec_ao_init_param(AIO_ATTR_S * attr)156 static hi_void sample_audio_adec_ao_init_param(AIO_ATTR_S *attr)
157 {
158     attr->enSamplerate = AUDIO_SAMPLE_RATE_48000;
159     attr->u32FrmNum = FPS_30;
160     attr->enBitwidth = AUDIO_BIT_WIDTH_16;
161     attr->enWorkmode = AIO_MODE_I2S_MASTER;
162     attr->enSoundmode = AUDIO_SOUND_MODE_STEREO;
163     attr->u32ChnCnt = 2; /* 2: chn num */
164     attr->u32ClkSel = 1;
165     attr->enI2sType = AIO_I2STYPE_INNERCODEC;
166     attr->u32PtNumPerFrm = AACLC_SAMPLES_PER_FRAME;
167     attr->u32EXFlag = 0;
168 
169     gs_bAioReSample = HI_FALSE;
170     g_in_sample_rate = AUDIO_SAMPLE_RATE_BUTT;
171     g_out_sample_rate = AUDIO_SAMPLE_RATE_BUTT;
172 }
173 
SAMPLE_AUDIO_AdecAoInner(HI_S32 num,HI_S32 fd,AUDIO_DEV AoDev,AO_CHN AoChn,ADEC_CHN AdChn)174 static HI_VOID SAMPLE_AUDIO_AdecAoInner(HI_S32 num, HI_S32 fd, AUDIO_DEV AoDev, AO_CHN AoChn, ADEC_CHN AdChn)
175 {
176     HI_S32 s32Ret;
177     FILE *pfd = NULL;
178 
179     s32Ret = SAMPLE_COMM_AUDIO_AoBindAdec(AoDev, AoChn, AdChn);
180     if (s32Ret != HI_SUCCESS) {
181         SAMPLE_PRT(s32Ret);
182         return;
183     }
184 
185     pfd = SAMPLE_AUDIO_OpenAdecFile_AAC(num, AdChn, gs_enPayloadType);
186     if (pfd == NULL) {
187         SAMPLE_PRT(HI_FAILURE);
188         SAMPLE_CHECK_EXPR_GOTO(pfd == NULL, ADECAO_ERR0,
189             "SAMPLE_AUDIO_OpenAdecFile_AAC FAIL, ret=%#x\n", s32Ret);
190     }
191 
192     s32Ret = SAMPLE_COMM_AUDIO_CreateTrdFileAdec(AdChn, pfd);
193     if (s32Ret != HI_SUCCESS) {
194         fclose(pfd);
195         pfd = HI_NULL;
196         SAMPLE_PRT(s32Ret);
197         SAMPLE_CHECK_EXPR_GOTO(s32Ret != HI_SUCCESS, ADECAO_ERR0,
198             "SAMPLE_COMM_AUDIO_CreateTrdFileAdec FAIL, ret=%#x\n", s32Ret);
199     }
200 
201     printf("bind adec:%d to ao(%d,%d) ok \n", AdChn, AoDev, AoChn);
202 
203     if (num == -1) {
204         audio_wait_quit(fd);
205     } else {
206         sleep(3); // 3: sleep time
207     }
208 
209     s32Ret = SAMPLE_COMM_AUDIO_DestroyTrdFileAdec(AdChn);
210     if (s32Ret != HI_SUCCESS) {
211         SAMPLE_PRT(s32Ret);
212         return;
213     }
214 
215 ADECAO_ERR0:
216     s32Ret = SAMPLE_COMM_AUDIO_AoUnbindAdec(AoDev, AoChn, AdChn);
217     if (s32Ret != HI_SUCCESS) {
218         SAMPLE_PRT(s32Ret);
219     }
220 
221     return;
222 }
223 
224 /*
225  * 函数:文件 —> 音频解码 -> 音频输出
226  * function : file -> Adec -> Ao
227  */
SAMPLE_AUDIO_AdecAo(HI_S32 num,HI_S32 quitFd)228 static HI_S32 SAMPLE_AUDIO_AdecAo(HI_S32 num, HI_S32 quitFd)
229 {
230     HI_S32 s32Ret, s32AoChnCnt;
231     const AO_CHN AoChn = 0;
232     const ADEC_CHN AdChn = 0;
233     AIO_ATTR_S stAioAttr;
234     AUDIO_DEV AoDev = SAMPLE_AUDIO_INNER_AO_DEV;
235 
236     sample_audio_adec_ao_init_param(&stAioAttr);
237 
238     s32Ret = SAMPLE_COMM_AUDIO_StartAdec(AdChn, gs_enPayloadType);
239     SAMPLE_CHECK_EXPR_GOTO(s32Ret != HI_SUCCESS, ADECAO_ERR3,
240         "SAMPLE_COMM_AUDIO_StartAdec FAIL, ret=%#x\n", s32Ret);
241 
242     s32AoChnCnt = stAioAttr.u32ChnCnt;
243     s32Ret = SAMPLE_COMM_AUDIO_StartAo(AoDev, s32AoChnCnt, &stAioAttr, g_in_sample_rate, gs_bAioReSample);
244     SAMPLE_CHECK_EXPR_GOTO(s32Ret != HI_SUCCESS, ADECAO_ERR2,
245         "SAMPLE_COMM_AUDIO_StartAo FAIL, ret=%#x\n", s32Ret);
246 
247     s32Ret = SAMPLE_COMM_AUDIO_CfgAcodec(&stAioAttr);
248     SAMPLE_CHECK_EXPR_GOTO(s32Ret != HI_SUCCESS, ADECAO_ERR1,
249         "SAMPLE_COMM_AUDIO_CfgAcodec FAIL, ret=%#x\n", s32Ret);
250 
251     SAMPLE_AUDIO_AdecAoInner(num, quitFd, AoDev, AoChn, AdChn);
252 
253 ADECAO_ERR1:
254     s32Ret = SAMPLE_COMM_AUDIO_StopAo(AoDev, s32AoChnCnt, gs_bAioReSample);
255     if (s32Ret != HI_SUCCESS) {
256         SAMPLE_PRT(s32Ret);
257     }
258 ADECAO_ERR2:
259     s32Ret = SAMPLE_COMM_AUDIO_StopAdec(AdChn);
260     if (s32Ret != HI_SUCCESS) {
261         SAMPLE_PRT(s32Ret);
262     }
263 
264 ADECAO_ERR3:
265     return s32Ret;
266 }
267 
SAMPLE_AUDIO_StartAdecAo(HI_BOOL bSendAdec,AUDIO_DEV AoDev,AENC_CHN AeChn,AIO_ATTR_S * pstAioAttr)268 static HI_VOID SAMPLE_AUDIO_StartAdecAo(HI_BOOL bSendAdec, AUDIO_DEV AoDev, AENC_CHN AeChn, AIO_ATTR_S *pstAioAttr)
269 {
270     HI_S32 s32Ret, s32AoChnCnt;
271     const AO_CHN AoChn = 0;
272     const ADEC_CHN AdChn = 0;
273     FILE *pfd = NULL;
274 
275     if (bSendAdec == HI_TRUE) {
276         s32Ret = SAMPLE_COMM_AUDIO_StartAdec(AdChn, gs_enPayloadType);
277         if (s32Ret != HI_SUCCESS) {
278             return;
279         }
280 
281         s32AoChnCnt = pstAioAttr->u32ChnCnt;
282         s32Ret = SAMPLE_COMM_AUDIO_StartAo(AoDev, s32AoChnCnt, pstAioAttr, g_in_sample_rate, gs_bAioReSample);
283         SAMPLE_CHECK_EXPR_GOTO(s32Ret != HI_SUCCESS, STOP_ADEC,
284             "SAMPLE_COMM_AUDIO_StartAo FAIL. s32Ret: 0x%x\n", s32Ret);
285 
286         pfd = SAMPLE_AUDIO_OpenAencFile(AdChn, gs_enPayloadType);
287         SAMPLE_CHECK_EXPR_GOTO(pfd == NULL, STOP_AO, "SAMPLE_AUDIO_OpenAencFile FAIL. s32Ret: 0x%x\n", s32Ret);
288 
289         s32Ret = SAMPLE_COMM_AUDIO_CreateTrdAencAdec(AeChn, AdChn, pfd);
290         if (s32Ret != HI_SUCCESS) {
291             fclose(pfd);
292             pfd = HI_NULL;
293             SAMPLE_PRT(s32Ret);
294             SAMPLE_CHECK_EXPR_GOTO(s32Ret != HI_SUCCESS, STOP_AO,
295                 "SAMPLE_COMM_AUDIO_CreateTrdAencAdec FAIL. s32Ret: 0x%x\n", s32Ret);
296         }
297 
298         s32Ret = SAMPLE_COMM_AUDIO_AoBindAdec(AoDev, AoChn, AdChn);
299         if (s32Ret != HI_SUCCESS) {
300             SAMPLE_PRT(s32Ret);
301             SAMPLE_CHECK_EXPR_GOTO(s32Ret != HI_SUCCESS, DESTORY_AENC_THREAD,
302                 "SAMPLE_COMM_AUDIO_AoBindAdec FAIL. s32Ret: 0x%x\n", s32Ret);
303         }
304 
305         SAMPLE_PRT("bind adec:%d to ao(%d,%d) ok \n", AdChn, AoDev, AoChn);
306     }
307 
308     if (bSendAdec == HI_TRUE) {
309         s32Ret = SAMPLE_COMM_AUDIO_AoUnbindAdec(AoDev, AoChn, AdChn);
310         if (s32Ret != HI_SUCCESS) {
311             SAMPLE_PRT(s32Ret);
312         }
313 
314     DESTORY_AENC_THREAD:
315         (HI_VOID)SAMPLE_COMM_AUDIO_DestroyTrdAencAdec(AdChn);
316 
317     STOP_AO:
318         (HI_VOID)SAMPLE_COMM_AUDIO_StopAo(AoDev, s32AoChnCnt, gs_bAioReSample);
319 
320     STOP_ADEC:
321         (HI_VOID)SAMPLE_COMM_AUDIO_StopAdec(AdChn);
322     }
323 }
324 
sample_audio_ai_ao_init_param(AIO_ATTR_S * attr)325 static hi_void sample_audio_ai_ao_init_param(AIO_ATTR_S *attr)
326 {
327     attr->enSamplerate = AUDIO_SAMPLE_RATE_48000;
328     attr->enBitwidth = AUDIO_BIT_WIDTH_16;
329     attr->enWorkmode = AIO_MODE_I2S_MASTER;
330     attr->enSoundmode = AUDIO_SOUND_MODE_STEREO;
331     attr->u32EXFlag = 0;
332     attr->u32FrmNum = FPS_30;
333     attr->u32PtNumPerFrm = AACLC_SAMPLES_PER_FRAME;
334     attr->u32ChnCnt = 2; /* 2: chn num */
335     attr->u32ClkSel = 1;
336     attr->enI2sType = AIO_I2STYPE_INNERCODEC;
337 
338     gs_bAioReSample = HI_FALSE;
339     /*
340      * 如果需要,配置ao resample
341      * Config ao resample attr if needed
342      */
343     if (gs_bAioReSample == HI_TRUE) {
344         g_out_sample_rate = AUDIO_SAMPLE_RATE_32000; // ai 48k -> 32k
345         g_in_sample_rate = AUDIO_SAMPLE_RATE_32000; // ao 32k -> 48k
346     } else {
347         g_in_sample_rate = AUDIO_SAMPLE_RATE_BUTT;
348         g_out_sample_rate = AUDIO_SAMPLE_RATE_BUTT;
349     }
350 
351     gs_bUserGetMode = (gs_bAioReSample == HI_TRUE) ? HI_TRUE : HI_FALSE;
352 }
353 
SAMPLE_AUDIO_AiAoInner(AUDIO_DEV AiDev,AI_CHN AiChn,AUDIO_DEV AoDev,AO_CHN AoChn)354 static HI_VOID SAMPLE_AUDIO_AiAoInner(AUDIO_DEV AiDev, AI_CHN AiChn, AUDIO_DEV AoDev, AO_CHN AoChn)
355 {
356     HI_S32 s32Ret;
357 
358     /*
359      * 绑定AI到AO通道
360      * Bind AI to AO channel
361      */
362     if (gs_bUserGetMode == HI_TRUE) {
363         s32Ret = SAMPLE_COMM_AUDIO_CreateTrdAiAo(AiDev, AiChn, AoDev, AoChn);
364         if (s32Ret != HI_SUCCESS) {
365             SAMPLE_PRT(s32Ret);
366             return;
367         }
368     } else {
369         s32Ret = SAMPLE_COMM_AUDIO_AoBindAi(AiDev, AiChn, AoDev, AoChn);
370         if (s32Ret != HI_SUCCESS) {
371             SAMPLE_PRT(s32Ret);
372             return;
373         }
374     }
375     SAMPLE_PRT("ai(%d,%d) bind to ao(%d,%d) ok\n", AiDev, AiChn, AoDev, AoChn);
376 
377     if (gs_bAoVolumeCtrl == HI_TRUE) {
378         s32Ret = SAMPLE_COMM_AUDIO_CreateTrdAoVolCtrl(AoDev);
379         if (s32Ret != HI_SUCCESS) {
380             SAMPLE_PRT(s32Ret);
381             SAMPLE_CHECK_EXPR_GOTO(s32Ret != HI_SUCCESS, AIAO_ERR0,
382                 "SAMPLE_COMM_AUDIO_CreateTrdAoVolCtrl FAIL. s32Ret: 0x%x\n", s32Ret);
383         }
384     }
385 
386     if (gs_bAoVolumeCtrl == HI_TRUE) {
387         s32Ret = SAMPLE_COMM_AUDIO_DestroyTrdAoVolCtrl(AoDev);
388         if (s32Ret != HI_SUCCESS) {
389             SAMPLE_PRT(s32Ret);
390             return;
391         }
392     }
393 
394 AIAO_ERR0:
395     if (gs_bUserGetMode == HI_TRUE) {
396         s32Ret = SAMPLE_COMM_AUDIO_DestroyTrdAi(AiDev, AiChn);
397         if (s32Ret != HI_SUCCESS) {
398             SAMPLE_PRT(s32Ret);
399         }
400     } else {
401         s32Ret = SAMPLE_COMM_AUDIO_AoUnbindAi(AiDev, AiChn, AoDev, AoChn);
402         if (s32Ret != HI_SUCCESS) {
403             SAMPLE_PRT(s32Ret);
404         }
405     }
406 
407     return;
408 }
409 
410 /*
411  * 函数:音频输入到音频输出
412  * function : Ai -> Ao
413  */
SAMPLE_AUDIO_AiAo(HI_VOID)414 static HI_S32 SAMPLE_AUDIO_AiAo(HI_VOID)
415 {
416     HI_S32 s32Ret;
417     HI_S32 s32AiChnCnt;
418     HI_S32 s32AoChnCnt;
419     const AI_CHN AiChn = 0;
420     const AO_CHN AoChn = 0;
421     AIO_ATTR_S stAioAttr;
422     AUDIO_DEV AiDev = SAMPLE_AUDIO_INNER_AI_DEV;
423     AUDIO_DEV AoDev = SAMPLE_AUDIO_INNER_AO_DEV;
424 
425     sample_audio_ai_ao_init_param(&stAioAttr);
426 
427     /*
428      * 启用AI通道
429      * Enable AI channel
430      */
431     s32AiChnCnt = stAioAttr.u32ChnCnt;
432     s32Ret = SAMPLE_COMM_AUDIO_StartAi(AiDev, s32AiChnCnt, &stAioAttr, g_out_sample_rate, gs_bAioReSample, NULL, 0);
433     if (s32Ret != HI_SUCCESS) {
434         SAMPLE_PRT(s32Ret);
435         SAMPLE_CHECK_EXPR_GOTO(s32Ret != HI_SUCCESS, AIAO_ERR3,
436             "SAMPLE_COMM_AUDIO_StartAi FAIL. s32Ret: 0x%x\n", s32Ret);
437     }
438 
439     /*
440      * 启动AO通道
441      * Enable AO channel
442      */
443     s32AoChnCnt = stAioAttr.u32ChnCnt;
444     s32Ret = SAMPLE_COMM_AUDIO_StartAo(AoDev, s32AoChnCnt, &stAioAttr, g_in_sample_rate, gs_bAioReSample);
445     if (s32Ret != HI_SUCCESS) {
446         SAMPLE_PRT(s32Ret);
447         SAMPLE_CHECK_EXPR_GOTO(s32Ret != HI_SUCCESS, AIAO_ERR2,
448             "SAMPLE_COMM_AUDIO_StartAo FAIL. s32Ret: 0x%x\n", s32Ret);
449     }
450 
451     /*
452      * 配置内置的acodec
453      * Config internal audio codec
454      */
455     s32Ret = SAMPLE_COMM_AUDIO_CfgAcodec(&stAioAttr);
456     SAMPLE_CHECK_EXPR_GOTO(s32Ret != HI_SUCCESS, AIAO_ERR1,
457         "SAMPLE_COMM_AUDIO_CfgAcodec FAIL. s32Ret: 0x%x\n", s32Ret);
458 
459     SAMPLE_AUDIO_AiAoInner(AiDev, AiChn, AoDev, AoChn);
460 
461 AIAO_ERR1:
462     s32Ret = SAMPLE_COMM_AUDIO_StopAo(AoDev, s32AoChnCnt, gs_bAioReSample);
463     if (s32Ret != HI_SUCCESS) {
464         SAMPLE_PRT(s32Ret);
465     }
466 
467 AIAO_ERR2:
468     s32Ret = SAMPLE_COMM_AUDIO_StopAi(AiDev, s32AiChnCnt, gs_bAioReSample, HI_FALSE);
469     if (s32Ret != HI_SUCCESS) {
470         SAMPLE_PRT(s32Ret);
471     }
472 
473 AIAO_ERR3:
474     return s32Ret;
475 }
476 
477 /*
478  * 函数:主入口
479  * function : main()
480  */
AudioTest(HI_U32 num,HI_S32 quitFd)481 HI_S32 AudioTest(HI_U32 num, HI_S32 quitFd)
482 {
483     HI_S32 s32Ret = HI_SUCCESS;
484     SAMPLE_AUDIO_AddLibPath();
485 
486     HI_MPI_AENC_AacInit();
487     HI_MPI_ADEC_AacInit();
488     SAMPLE_AUDIO_AdecAo(num, quitFd);
489 
490     HI_MPI_AENC_AacDeInit();
491     HI_MPI_ADEC_AacDeInit();
492 
493     return s32Ret;
494 }