mirror of https://github.com/OpenIPC/firmware.git
				
				
				
			
		
			
				
	
	
		
			326 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			C
		
	
	
			
		
		
	
	
			326 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			C
		
	
	
| /******************************************************************************
 | ||
|   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 */
 | ||
| 
 |