firmware/general/package/xiongmai-osdrv-xm530/files/sample/audio/audio.c

326 lines
8.2 KiB
C
Raw Blame History

/******************************************************************************
A simple program of xm510 audio input/output/encoder/decoder implementation.
******************************************************************************/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <pthread.h>
#include <errno.h>
#include <signal.h>
#include "audio.h"
#ifdef __cplusplus
#if __cplusplus
extern "C"{
#endif
#endif /* End of #ifdef __cplusplus */
/******************************************************************************
* create aenc chn
******************************************************************************/
XM_S32 SAMPLE_COMM_AUDIO_CreatAencCh(AENC_CHN AeChn,PAYLOAD_TYPE_E enType)
{
XM_S32 s32Ret;
AENC_CHN_ATTR_S stAencAttr;
AENC_ATTR_G711_S stG711;
stAencAttr.enType = enType;
stAencAttr.u32BufSize = 30;
stAencAttr.pValue = &stG711;
stG711.resv = 0;
/* create aenc chn*/
s32Ret = XM_MPI_AENC_CreateChn(AeChn, &stAencAttr);
if (s32Ret)
{
SAMPLE_PRT("create aenc err:0x%x\n",s32Ret);
return XM_FAILURE;
}
return XM_SUCCESS;
}
/******************************************************************************
* function : get stream from file, and send it to Adec
******************************************************************************/
XM_S32 SAMPLE_COMM_AUDIO_StartAenc(AENC_CHN AeChn)
{
XM_S32 s32Ret= XM_SUCCESS;
AIO_ATTR_S stAioAttr;
AI_VQE_CONFIG_S aiVqeConfig;
AUDIO_DEV AiDevId = 0;
AI_CHN AiChn = 0;
AUDIO_DEV AoDevId = 0;
AO_CHN AoChn = 0;
stAioAttr.enSamplerate = AUDIO_SAMPLE_RATE_8000;
stAioAttr.enBitwidth = AUDIO_BIT_WIDTH_16;
stAioAttr.enWorkmode = AIO_MODE_I2S_MASTER;
stAioAttr.enSoundmode = AUDIO_SOUND_MODE_MONO;
stAioAttr.u32EXFlag = 1;
stAioAttr.u32FrmNum = 30;
stAioAttr.u32PtNumPerFrm = 160;
stAioAttr.u32ChnCnt = 2;
stAioAttr.u32ClkSel = 1;
s32Ret = XM_MPI_AI_SetPubAttr(AeChn, &stAioAttr);
if (s32Ret)
{
SAMPLE_PRT("XM_MPI_AI_SetPubAttr(%d) failed with %d\n",AeChn, s32Ret);
return XM_FAILURE;
}
memset(&aiVqeConfig, 0, sizeof(AI_VQE_CONFIG_S));
aiVqeConfig.bAecOpen = 0;
aiVqeConfig.bAgcOpen = 0;
aiVqeConfig.bAnrOpen = 1;
s32Ret = XM_MPI_AI_SetVqeAttr(AiDevId, AiChn, AoDevId, AoChn, &aiVqeConfig);
if (s32Ret)
{
SAMPLE_PRT("XM_MPI_AI_SetVqeAttr(%d) failed with %#x\n", AiDevId, s32Ret);
return XM_FAILURE;
}
s32Ret = XM_MPI_AI_Enable(AeChn);
if (s32Ret)
{
SAMPLE_PRT("XM_MPI_AI_Enable(%d) failed with %d\n", AeChn, s32Ret);
return XM_FAILURE;
}
return XM_SUCCESS;
}
XM_S32 AudioSaveAenc(FILE* fpAencFile, AUDIO_STREAM_S *pstStream)
{
fwrite(pstStream->pStream, pstStream->u32Len, 1, fpAencFile);
fflush(fpAencFile);
return XM_SUCCESS;
}
XM_VOID* SAMPLE_COMM_AENC_GetVencStreamProc(XM_VOID *p)
{
XM_S32 s32Ret;
AENC_CHN AiChn = 0;
AUDIO_STREAM_S stStream;
FILE *pFile;
XM_CHAR AencFileName[64];;
SAMPLE_AENC_GETSTREAM_PARA_S *pstPara;
pstPara = (SAMPLE_AENC_GETSTREAM_PARA_S*)p;
sprintf(AencFileName, "Aencstream_chn%d",AiChn);
pFile = fopen(AencFileName, "wb");
if (!pFile)
{
SAMPLE_PRT("open file[%s] failed!\n", AencFileName);
return NULL;
}
while(pstPara->bThreadStart)
{
s32Ret = XM_MPI_AENC_GetStream(AiChn, &stStream,XM_TRUE);
if (XM_SUCCESS != s32Ret )
{
usleep(10);
break;
}
AudioSaveAenc(pFile,&stStream);
s32Ret = XM_MPI_AENC_ReleaseStream(AiChn, &stStream);
if(XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("XM_MPI_AENC_ReleaseStream failed!\n");
break;
}
usleep(10);
}
fclose(pFile);
return NULL;
}
/******************************************************************************
* function : file -> ADec -> Ao
******************************************************************************/
XM_S32 SAMPLE_AUDIO_AdecAo(void)
{
XM_S32 s32Ret;
AIO_ATTR_S stAioAttr;
AUDIO_DEV AoDev = 0;
ADEC_CHN AdChn = 0;
ADEC_CHN_ATTR_S Adec_Chn;
AENC_ATTR_G711_S stG711;
AUDIO_STREAM_S stStream;
XM_U8 *pAudioStream = NULL;
FILE *fp = NULL;
s32Ret = XM_MPI_SYS_Init(); //<2F><><EFBFBD><EFBFBD>XM_MPI_SYS_Init<69><74><EFBFBD><EFBFBD>Ҫ<EFBFBD>ٵ<EFBFBD><D9B5><EFBFBD>XM_MPI_AUDIO_Init
if(s32Ret != XM_SUCCESS)
{
SAMPLE_PRT("XM_MPI_SYS_Init err:%d\n",s32Ret);
return s32Ret;
}
/********************************************
step1: set ao public attr
********************************************/
stAioAttr.enSamplerate = AUDIO_SAMPLE_RATE_8000;
stAioAttr.enBitwidth = AUDIO_BIT_WIDTH_16;
stAioAttr.enWorkmode = AIO_MODE_I2S_MASTER;
stAioAttr.enSoundmode = AUDIO_SOUND_MODE_MONO;
stAioAttr.u32EXFlag = 1;
stAioAttr.u32FrmNum = 30;
stAioAttr.u32PtNumPerFrm = 160;
stAioAttr.u32ChnCnt = 2;
stAioAttr.u32ClkSel = 1;
s32Ret = XM_MPI_AO_SetPubAttr(AoDev,&stAioAttr);
if(XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("set ao %d attr err:0x%x\n", AoDev,s32Ret);
return XM_FAILURE;
}
/********************************************
step2: create adec chn and enable it
********************************************/
Adec_Chn.enType = PT_G711A;
Adec_Chn.u32BufSize = 8;
Adec_Chn.enMode = ADEC_MODE_PACK ;
Adec_Chn.pValue = &stG711;
stG711.resv = 0;
s32Ret = XM_MPI_ADEC_CreateChn( AdChn ,&Adec_Chn);
if(XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("creat adec %d channel err:0x%x\n", AdChn,s32Ret);
return XM_FAILURE;
}
s32Ret = XM_MPI_AO_Enable( AoDev);
if(XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("creat adec %d channel err:0x%x\n", AoDev,s32Ret);
return XM_FAILURE;
}
/********************************************
step3: Adec Send Stream
********************************************/
fp = fopen(QQ_FILE,"r");
if(fp==NULL)
{
perror("fopen");
return -2;
}
pAudioStream = (XM_U8*)malloc(sizeof(XM_U8)*320);
while(1)
{
s32Ret = fread(pAudioStream, 1, 320, fp);
if(s32Ret == 0)
{
SAMPLE_PRT("file end.\n");
usleep(200*1000);
break;
}
stStream.u32Seq = 1;
stStream.u64TimeStamp = 1;
stStream.u32Len = s32Ret;
stStream.pStream = pAudioStream;
s32Ret = XM_MPI_ADEC_SendStream(AdChn, &stStream,XM_TRUE);
if (XM_SUCCESS != s32Ret)
{
printf("XM_MPI_ADEC_SendStream(%d) failed with %#x!\n", AdChn, s32Ret);
break;
}
}
free(pAudioStream);
fclose(fp);
s32Ret = XM_MPI_AO_Disable(AoDev);
if(s32Ret != XM_SUCCESS)
{
SAMPLE_PRT("XM_MPI_AO_DisEnable dev 0 error\n");
}
s32Ret = XM_MPI_ADEC_DestroyChn( AdChn );
if(XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("creat adec %d channel err:0x%x\n", AdChn,s32Ret);
}
return XM_SUCCESS;
}
/******************************************************************************
* function : Ai -> Aenc -> file
******************************************************************************/
XM_S32 SAMPLE_AUDIO_AiAenc(void)
{
XM_S32 AeChn = 0;
AUDIO_DEV AiDev = 0;
XM_S32 s32Ret;
pthread_t gs_AencPid;
SAMPLE_AENC_GETSTREAM_PARA_S gs_stPara;
s32Ret = XM_MPI_SYS_Init(); //<2F><><EFBFBD><EFBFBD>XM_MPI_SYS_Init<69><74><EFBFBD><EFBFBD>Ҫ<EFBFBD>ٵ<EFBFBD><D9B5><EFBFBD>XM_MPI_AUDIO_Init
if(s32Ret != XM_SUCCESS)
{
SAMPLE_PRT("XM_MPI_SYS_Init err:%d\n",s32Ret);
return s32Ret;
}
s32Ret = SAMPLE_COMM_AUDIO_CreatAencCh(AeChn,PT_G711A);
if(s32Ret != XM_SUCCESS)
{
SAMPLE_PRT("SAMPLE_COMM_AUDIO_CreatAencCh failed!\n");
goto END_AUDIO_DESTORY;
}
s32Ret = SAMPLE_COMM_AUDIO_StartAenc(AeChn);
if(s32Ret != XM_SUCCESS)
{
SAMPLE_PRT("SAMPLE_COMM_AUDIO_StartAenc failed!\n");
goto END_AUDIO_STOPAEENC;
}
gs_stPara.bThreadStart = XM_TRUE;
s32Ret = pthread_create(&gs_AencPid, 0, SAMPLE_COMM_AENC_GetVencStreamProc, (XM_VOID*)&gs_stPara);
if (XM_SUCCESS != s32Ret)
{
SAMPLE_PRT("SAMPLE_COMM_AENC_StartGetStream failed!\n");
goto END_AUDIO_STOPAEENC;
}
sleep(10);
gs_stPara.bThreadStart = XM_FALSE;
pthread_join(gs_AencPid, 0);
END_AUDIO_STOPAEENC:
s32Ret = XM_MPI_AI_Disable(AiDev);
if (s32Ret)
{
SAMPLE_PRT("XM_MPI_AI_Disable [%d] failed\n",AiDev);
return XM_FAILURE;
}
END_AUDIO_DESTORY:
s32Ret = XM_MPI_AENC_DestroyChn(AeChn);
if(XM_SUCCESS!=s32Ret)
{
SAMPLE_PRT(" XM_MPI_AENC_DestroyChn :%d err:0x%x\n", AeChn, s32Ret);
}
return s32Ret;
}
#ifdef __cplusplus
#if __cplusplus
}
#endif
#endif /* End of #ifdef __cplusplus */