aud_app.c


#include "aud_app.h"
#include "crc_8.h"
#include "aud_media.h"
#include "aud_timer.h"




/*存放media数据的音频文件*/
 struct t_pcm_file g_pcm_file;
/*音频当前状态*/
 E_AUD_STATUS g_audio_status = STOP_STATUS;
/*录音当前状态*/
 E_RECORD_STATUS g_recocder_status = RECORDER_STOP_STATUS;
/*记录当前帧指针*/
 struct t_aud_frame* ptr_cur_aud_frame = NULL;
/*记录当前协议字段*/
 E_PROTOCOL_TYPE* g_protocol_type = NULL;


struct t_cmd_hander cmd_handler_mapping[] =
{
	/*录音*/
	{ START_RECORDER_REQ,start_recorder_req },           //启动录音请求
	{ STOP_RECORDER_REQ,stop_recorder_req },             //停止录音请求

													 /*音频*/
	{ START_PLAY_AUDIO_REQ,start_play_audio_req },  //音频play请求
	{ STOP_PLAY_AUDIO_REQ,stop_play_audio_req },    //音频stop请求
	{ AUDIO_DATA_IND,start_audio_media_rev }        //音频media传输
};

void aud_amp_poweron(void)
{
	//拉高gpio4
#if _AUD_DEBUG
	printf("aud_amp_poweron \r\n");
#endif
	pfv_OutputHigh(base_IO_GPIO4);
}


void aud_amp_poweroff(void)
{
#if _AUD_DEBUG
	printf("aud_amp_poweroff \r\n");
#endif
	pfv_OutputLow(base_IO_GPIO4);
}


int start_audio_app(sci_ESequence sciSeq, const void * ptr, u32 ulen)
{

		sci_timer_flash();
		return aud_protocol_parse(ptr, ulen);

}

int close_audio_app(sci_ESequence sciSeq, const void * ptr, u32 ulen)
{
	aud_amp_poweroff();
	return 0;
}




static BOOL protocol_receive_frame(E_PROTOCOL_TYPE* pp_type, struct t_aud_frame* pp_aud_frame, u8 vp_c)
{
	BOOL ret = FALSE;
	static BOOL fl_comple = TRUE;
	static u16 readcnt = 0;



	switch (*pp_type)
	{
	case PROTOCOL_HEAD:
#if _AUD_DEBUG
		printf("====================PROTOCOL_HEAD==============\r\n");
#endif
		fl_comple = TRUE; readcnt = 0;
		if (vp_c == PROTOCOL_HEAD_CODE)      //获取起始码
		{
			pp_aud_frame->m_Head = PROTOCOL_HEAD_CODE;
			(*pp_type) = PROTOCOL_CRC;
			timeout_tim(TRUE); //开启超时检测
		}
		
		break;
	case PROTOCOL_CRC:
		pp_aud_frame->m_Crc = vp_c;          //获取CRC校验码
		(*pp_type) = PROTOCOL_ID;
		break;
	case PROTOCOL_ID:
		pp_aud_frame->m_CmdId = vp_c;        //获取命令ID
		(*pp_type) = PROTOCOL_DLEN;
		break;

	case PROTOCOL_DLEN:                     //获取数据长度   LSB - MSB
		if (fl_comple == TRUE)
		{
			pp_aud_frame->m_DataLen = (vp_c & 0xff);
			fl_comple = FALSE;
		}else
		{
			pp_aud_frame->m_DataLen |= (vp_c << 8);
			fl_comple = TRUE;
			(*pp_type) = (pp_aud_frame->m_DataLen == 0) ? PROTOCOL_HEAD : PROTOCOL_DATA;
			ret = ((*pp_type) == PROTOCOL_HEAD) ? TRUE : FALSE;
		}
		break;
	case PROTOCOL_DATA:              //获取数据
		if (pp_aud_frame->m_Data == NULL) /*动态分配数据缓冲区,请务必释放 */
		{
#if _AUD_DEBUG
			printf("malloc mem size: %d Byte \r\n", pp_aud_frame->m_DataLen);
#endif
			pp_aud_frame->m_Data = (u8*)malloc(pp_aud_frame->m_DataLen * sizeof(u8));
		}	
		pp_aud_frame->m_Data[readcnt++] = vp_c;
		(*pp_type) = (readcnt == pp_aud_frame->m_DataLen) ? PROTOCOL_HEAD : PROTOCOL_DATA;
		readcnt = ((*pp_type) == PROTOCOL_HEAD) ? 0 : readcnt;
		ret = ((*pp_type) == PROTOCOL_HEAD) ? TRUE : FALSE;
		if (ret)                             //关闭超时检测
		{
			timeout_tim(FALSE);
		}

		break;
	default:
		break;
	}
	return ret;
}


u8 aud_get_crc8(struct t_aud_frame* pp_aud_frame)
{
	/*校验buf数据*/

	u8* p_data = (u8*)malloc(pp_aud_frame->m_DataLen + 3);
	memset(p_data, 0, pp_aud_frame->m_DataLen + 3);
	p_data[0] = pp_aud_frame->m_CmdId;
	memcpy((u8*)&p_data[1], (u8*)&(pp_aud_frame->m_DataLen), sizeof(u16));
	memcpy((u8*)&p_data[3], pp_aud_frame->m_Data, pp_aud_frame->m_DataLen);

	/*计算校验*/
	u8 crc = get_crc8(p_data, pp_aud_frame->m_DataLen + 3);
	free(p_data);
	return crc;
}

int aud_protocol_parse(const void* pp_ptr, u32 vp_ulen)
{
	u32 i = 0; 

	BOOL ret = FALSE;
	/*遍历buf 合成音频app协议帧*/
	static struct t_aud_frame aud_frame;
	/*保存当前接收帧指针*/
	if (ptr_cur_aud_frame == NULL)
		ptr_cur_aud_frame = &aud_frame;

	/*当前接收数据类型*/
	static E_PROTOCOL_TYPE _protocol_type = PROTOCOL_HEAD;
	/*保存当前协议字段指针*/
	if (g_protocol_type == NULL)
		g_protocol_type = &_protocol_type;

	for (i = 0; i < vp_ulen; i++)
	{
		
		ret = protocol_receive_frame(&_protocol_type, &aud_frame, ((u8*)pp_ptr)[i]);  //读取一帧
		if (ret == TRUE)   //成功读取一帧,判断CRC校验
		{	
	#if _AUD_DEBUG
			printf("audio_frame: \r\n");
			printf("         head: 0x%x\r\n", aud_frame.m_Head);
			printf("         crc: 0x%x\r\n", aud_frame.m_Crc);
			printf("         cmd: %d\r\n", aud_frame.m_CmdId);
			printf("         d_len: %d\r\n", aud_frame.m_DataLen);
			printf("         data: ");
			/*
			for (j = 0; j < aud_frame.m_DataLen; j++)
			{
				printf(" 0x%x ", aud_frame.m_Data[j]);
				if( (j +1) % 32 == 0) printf("\r\n");
			}
			*/
			printf("\r\n");
			printf("\r\n");
			printf("\r\n");
			printf("\r\n");
	#endif

			if (aud_get_crc8(&aud_frame) == aud_frame.m_Crc)
			{
	#if _AUD_DEBUG
				printf("crc match success.\r\n");
	#endif
				aud_frame.m_Valid = TRUE;
			}
			else
			{
	#if _AUD_DEBUG
				printf("crc match failed: getcrc = 0x%x, calcrc = 0x%x .\r\n", aud_frame.m_Crc, aud_get_crc8(&aud_frame));
	#endif
				aud_frame.m_Valid = FALSE;
				/*校验失败,返回无效数据应答。由于每个请求帧的应答格式都不一致,故需区别应答*/
				struct t_rsp_code rsp_code;
				switch (aud_frame.m_CmdId)
				{
				case START_RECORDER_REQ:
					rsp_code.m_ContextId = 0;
					rsp_code.m_PlayResult = ERR_INVAILD_DATA;
					protocol_send_frame(START_RECORDER_RSP, &rsp_code, RECORDER_TYPE_RSP);
					break;
				case STOP_RECORDER_REQ:
					rsp_code.m_ContextId = 0;
					rsp_code.m_PlayResult = ERR_INVAILD_DATA;
					protocol_send_frame(STOP_RECORDER_RSP, &rsp_code, STOP_REC_TYPE_RSP);
					break;
				case START_PLAY_AUDIO_REQ:
					rsp_code.m_ContextId = (aud_frame.m_Data[7]) | (aud_frame.m_Data[8] << 8) | (aud_frame.m_Data[9] << 16) | (aud_frame.m_Data[10] << 24);
					rsp_code.m_PlayResult = ERR_INVAILD_DATA;
					protocol_send_frame(START_PLAY_AUDIO_RSP, &rsp_code, AUD_TYPE_RSP);
					break;
				case STOP_PLAY_AUDIO_REQ: 
					rsp_code.m_ContextId = (aud_frame.m_Data[7]) | (aud_frame.m_Data[8] << 8) | (aud_frame.m_Data[9] << 16) | (aud_frame.m_Data[10] << 24);
					rsp_code.m_PlayResult = ERR_INVAILD_DATA;
					protocol_send_frame(STOP_PLAY_AUDIO_RSP, &rsp_code, AUD_TYPE_RSP);
					break;
				default:
					break;

				}

			}
			/*判断是否跳过该命令*/
			if (check_skip_cmd(aud_frame.m_CmdId) == FALSE)
			{
				ret = aud_protocol_excute(&aud_frame);   //执行帧
			}
			
			if (aud_frame.m_Data) // 执行完成后,释放内存
			{
				free(aud_frame.m_Data);
				aud_frame.m_Data = NULL;
	#if _AUD_DEBUG
				printf("free mem size: %d Byte \r\n", aud_frame.m_DataLen);
	#endif
			}
		}
	}

	return ret;
}

int aud_protocol_excute(struct t_aud_frame* pp_aud_frame)
{
	int index = 0;
	int ret = 0;
	/*判断帧有效性*/
	if (pp_aud_frame->m_Valid == FALSE)return 0;

	/*执行命令*/
	for (index; index < sizeof(cmd_handler_mapping) / sizeof(cmd_handler_mapping[0]); index++)
	{
		if (pp_aud_frame->m_CmdId == cmd_handler_mapping[index].m_CmdId)
		{
			ret = (cmd_handler_mapping[index].m_handler)(pp_aud_frame);
			break;
		}

	}
	return ret;
}

/*音频play请求*/
int  start_play_audio_req(struct t_aud_frame* pp_aud_frame)
{
	struct t_play_media_format play_media;
	u8* p_data = pp_aud_frame->m_Data;

	/*解析请求帧-获取请求media格式*/
	play_media.m_Format = (E_PCM_FORMAT)p_data[0];
	play_media.m_Volume = p_data[1];
	play_media.m_FileSize = (p_data[2]) | (p_data[3] << 8) | (p_data[4] << 16) | (p_data[5] << 24);
	play_media.m_Crc = p_data[6];
	play_media.m_ContextId = (p_data[7]) | (p_data[8] << 8) | (p_data[9] << 16) | (p_data[10] << 24);


#if _AUD_DEBUG
	printf("play_media: \r\n");
	printf("         m_Format: %d\r\n", play_media.m_Format);
	printf("         m_Volume: %d\r\n", play_media.m_Volume);
	printf("         m_FileSize: 0x%.8x\r\n", play_media.m_FileSize);
	printf("         m_Crc: %d\r\n", play_media.m_Crc);
	printf("         m_ContextId: 0x%.8x \r\n",play_media.m_ContextId);
#endif

	/*创建音频文件*/
	struct t_pcm_file pcm_file = {0};
	pcm_file.m_filename = "audio_media";
	pcm_file.m_FileTotalSize = play_media.m_FileSize;
	pcm_file.m_Crc = play_media.m_Crc;
	pcm_file.m_MediaId = play_media.m_ContextId;
	pcm_file.m_Format = (E_PCM_FORMAT)play_media.m_Format;


	/*保存文件属性*/
	int pcm_ret = pcmfile_create(&pcm_file, (E_PCM_FORMAT)play_media.m_Format);
	if (pcm_ret >= 0)
	{
		memset(&g_pcm_file,0,sizeof(struct t_pcm_file));
		memcpy(&g_pcm_file, &pcm_file, sizeof(struct t_pcm_file));
	}

#if _AUD_DEBUG
	printf("pcm_file: \r\n");
	printf("         filename: %s\r\n", pcm_file.m_filename);
	printf("         fp: %p\r\n", pcm_file.m_fp);
	printf("         m_Format: %d \r\n", pcm_file.m_Format);
	printf("         m_FileSize: %u Byte\r\n", pcm_file.m_FileSize);
	printf("         mFileTotalSize: %u Byte\r\n", pcm_file.m_FileTotalSize);
	printf("         m_Crc: %d\r\n", pcm_file.m_Crc);
	printf("         mMediaId: 0x%.8x\r\n", pcm_file.m_MediaId);

#endif

	/*应答请求帧*/
	struct t_rsp_code     play_rsp_code;
	if (g_audio_status == STOP_STATUS)
	{
		if (pcm_ret < 0)
		{
			play_rsp_code.m_PlayResult = ERR_RES_OVER;
#if _AUD_DEBUG
			printf("creat the media file is failed..........\r\n");
#endif
		}
		else
		{
			play_rsp_code.m_PlayResult = RET_OK;
			g_audio_status = TRANS_STATUS;
#if _AUD_DEBUG
			printf("enter media data trans..........\r\n");
#endif
		}

	}

	else
	{
		play_rsp_code.m_PlayResult = ERR_BUSY;
		/*释放资源*/
		g_audio_status = STOP_STATUS;
		if (g_pcm_file.m_fp)
			fclose(g_pcm_file.m_fp);
		if (g_pcm_file.m_filename)
			remove(g_pcm_file.m_filename);
		memset(&g_pcm_file, 0, sizeof(struct t_pcm_file));
	}

	play_rsp_code.m_ContextId = play_media.m_ContextId;

	return protocol_send_frame(START_PLAY_AUDIO_RSP, &play_rsp_code, AUD_TYPE_RSP);
}

/*回馈应答*/
int protocol_send_frame(u8 vp_CmdId, struct t_rsp_code* pp_rspcode,E_TYPE_RSP vp_type_rsp)
{
	/*应答请求*/
	struct t_aud_frame    rsp_aud_frame;
	u8 rsq_buf[64] = { 0 };
	u8 rsq_size = 0;
	rsp_aud_frame.m_Head = PROTOCOL_HEAD_CODE;
	rsp_aud_frame.m_CmdId = vp_CmdId;
	rsp_aud_frame.m_DataLen = (vp_type_rsp == AUD_TYPE_RSP) ? sizeof(struct t_rsp_code) :(sizeof(pp_rspcode->m_PlayResult));
	rsp_aud_frame.m_Data = (u8*)pp_rspcode;
	rsp_aud_frame.m_Crc = aud_get_crc8(&rsp_aud_frame);

	memcpy(rsq_buf, (u8*)&rsp_aud_frame, (u32)&(((struct t_aud_frame*)0)->m_DataLen));     //拷贝应答头

	switch (vp_type_rsp)
	{
	case AUD_TYPE_RSP:
		//拷贝数据长度   LSb-MSB
		rsq_buf[3] = (rsp_aud_frame.m_DataLen) & 0xff;         rsq_buf[4] = (rsp_aud_frame.m_DataLen >> 8) & 0xff;
		//拷贝应答码
		rsq_buf[5] = pp_rspcode->m_PlayResult & 0xff;             rsq_buf[6] = (pp_rspcode->m_PlayResult >> 8) & 0xff;
		rsq_buf[7] = (pp_rspcode->m_PlayResult >> 16) & 0xff;     rsq_buf[8] = (pp_rspcode->m_PlayResult >> 24) & 0xff;
		//拷贝上下文ID
		rsq_buf[9] = pp_rspcode->m_ContextId & 0xff;              rsq_buf[10] = (pp_rspcode->m_ContextId >> 8) & 0xff;
		rsq_buf[11] = (pp_rspcode->m_ContextId >> 16) & 0xff;     rsq_buf[12] = (pp_rspcode->m_ContextId >> 24) & 0xff;
		rsq_size = 13;
		break;

	case RECORDER_TYPE_RSP:
		//拷贝数据长度   LSb-MSB
		rsq_buf[3] = (rsp_aud_frame.m_DataLen) & 0xff;         rsq_buf[4] = (rsp_aud_frame.m_DataLen >> 8) & 0xff;
		//拷贝应答码
		rsq_buf[5] = pp_rspcode->m_PlayResult & 0xff;             rsq_buf[6] = (pp_rspcode->m_PlayResult >> 8) & 0xff;
		rsq_buf[7] = (pp_rspcode->m_PlayResult >> 16) & 0xff;     rsq_buf[8] = (pp_rspcode->m_PlayResult >> 24) & 0xff;
		rsq_size = 9;
		break;

	case STOP_REC_TYPE_RSP:
		rsq_buf[3] = 0;  rsq_buf[4] = 0;
		rsq_size = 5;
		break;
	default:
		break;
	}

#if _AUD_DEBUG
	printf("rsp_frame: \r\n");
	printf("         head: 0x%x\r\n", rsp_aud_frame.m_Head);
	printf("         crc: %d\r\n", rsp_aud_frame.m_Crc);
	printf("         cmd: %d\r\n", rsp_aud_frame.m_CmdId);
	printf("         d_len: %d\r\n", rsp_aud_frame.m_DataLen);
	printf("         data:  \r\n");
	printf("             result:%d\r\n", *((int*)rsp_aud_frame.m_Data));
	printf("             contextid:0x%.8x\r\n", *((int*)(rsp_aud_frame.m_Data+4)));
	printf("\r\n");
	printf("\r\n");
	printf("send rsq: \r\n");
	printf("         data:  \r\n");
	for (int i = 0; i < rsq_size; i++)
	{
		printf(" 0x%x ", rsq_buf[i]);
	}
	printf("\r\n");
	printf("\r\n");
#endif
	return pfv_sci_SendData(USE_AUDIO_SCI,&rsq_buf, rsq_size);

}


/*音频media接收*/
int start_audio_media_rev(struct t_aud_frame* pp_aud_frame)
{
	struct t_rsp_code     rev_rsp_code;


	if (g_audio_status != TRANS_STATUS) return 0;

	int retsize = fwrite(pp_aud_frame->m_Data, 1, pp_aud_frame->m_DataLen, g_pcm_file.m_fp);
	g_pcm_file.m_FileSize += retsize;

#if _AUD_DEBUG
	printf("write media file  WriteSize = %dByte, FileSize = %dByte\r\n", retsize, g_pcm_file.m_FileSize);
#endif

	/*数据接收完成*/
	if (g_pcm_file.m_FileSize >= g_pcm_file.m_FileTotalSize)
	{
#if _AUD_DEBUG
		printf("tran the media data is comolete. TotalSize = %dByte, RevSize = %dByte\r\n", g_pcm_file.m_FileTotalSize, g_pcm_file.m_FileSize);
#endif



		/*进行音频数据校验*/
		int _crc_offset = 0;
		switch (g_pcm_file.m_Format)
		{
		case AMR_FMT:
			_crc_offset = sizeof(struct amr_header);
			break;
		case PCM_FMT:
			_crc_offset = sizeof(struct wav_header) - sizeof(2 * sizeof(u32));
			break;
		default:
			_crc_offset = -1;
			break;
		}

		if(_crc_offset >= 0)
		{
			u8 file_crc = file_crc8(g_pcm_file.m_fp, _crc_offset);
			if (g_pcm_file.m_Crc == file_crc && _crc_offset)
			{
#if _AUD_DEBUG
				printf("media file crc match is success.\r\n");
#endif
				/*应答接收数据成功*/
				rev_rsp_code.m_PlayResult = RET_OK;
				rev_rsp_code.m_ContextId = g_pcm_file.m_MediaId;
				protocol_send_frame(AUDIO_DATA_OVER_RSP, &rev_rsp_code, AUD_TYPE_RSP);


				start_play_media(&g_pcm_file);
				return 0;
			}
		}

#if _AUD_DEBUG
		printf("media file crc match is failed. getfileCrc = 0x%x. CalfileCrc = 0x%x.\r\n", g_pcm_file.m_Crc, file_crc8(g_pcm_file.m_fp, _crc_offset));
#endif
		/*应答接收数据错误*/
		rev_rsp_code.m_PlayResult = ERR_INVAILD_DATA;
		rev_rsp_code.m_ContextId = g_pcm_file.m_MediaId;
		protocol_send_frame(AUDIO_DATA_OVER_RSP, &rev_rsp_code, AUD_TYPE_RSP);

		/*释放资源*/
		g_audio_status = STOP_STATUS;
		if (g_pcm_file.m_fp)
			fclose(g_pcm_file.m_fp);
		if (g_pcm_file.m_filename)
			remove(g_pcm_file.m_filename);
		memset(&g_pcm_file, 0, sizeof(struct t_pcm_file));

	}
	return 0;
}

/*音频media播放*/
int start_play_media(struct t_pcm_file* pp_pcm_file)
{
	BOOL playret = TRUE;

	 skip_cmd_addItem(TRUE,15, STOP_PLAY_AUDIO_REQ);             //阻塞停止请求 1.5s
	//skip_cmd_addItem(TRUE, AUD_PLAYBLOCK, STOP_PLAY_AUDIO_REQ); //阻塞式播放

	/*开功放*/
	aud_amp_poweron();
	switch (pp_pcm_file->m_Format)
	{
	case AMR_FMT:
		playret = pfv_PlayAmrFile(pp_pcm_file->m_filename);
#if _AUD_DEBUG
		printf("play the amr media[%s]. ret = %d \r\n", pp_pcm_file->m_filename, playret);
#endif
		break;
	case PCM_FMT:
		playret = pfv_PlayPcmFile(pp_pcm_file->m_filename, 1, 8000, 16);
#if _AUD_DEBUG
		printf("play the pcm media[%s]. ret = %d \r\n", pp_pcm_file->m_filename, playret);
#endif
		break;
	default:
		playret = FALSE;
		break;
	}
	/*开启播放失败,直接返回播放结果应答*/
	if (playret == FALSE)
	{
		struct t_rsp_code     play_rsp_code;
		play_rsp_code.m_PlayResult = (g_audio_status == PLAY_STATUS) ? RET_OK : ERR_INVAILD_OPERATE;
		play_rsp_code.m_ContextId = g_pcm_file.m_MediaId;
		protocol_send_frame(AUDIO_PLAY_RSP, &play_rsp_code, AUD_TYPE_RSP);

		/*释放资源*/
		g_audio_status = STOP_STATUS;
		if (g_pcm_file.m_fp)            fclose(g_pcm_file.m_fp);
		if (g_pcm_file.m_filename)       remove(g_pcm_file.m_filename);
		memset(&g_pcm_file, 0, sizeof(struct t_pcm_file));

		/*关功放*/
		aud_amp_poweroff();
	}
	/*开启播放成功,播放结果回调函数处理*/
	else
	{
		g_audio_status = PLAY_STATUS;

	}
	return 0;
}

/*音频media停止*/
int  stop_play_audio_req(struct t_aud_frame* pp_aud_frame)
{
	
#if 0
/*阻塞当前方式*/
	if (g_audio_status == TRANS_STATUS || g_audio_status == PLAY_STATUS)
	{
		/*返回忙*/
		struct t_rsp_code     stop_rsp_code;
		stop_rsp_code.m_PlayResult = ERR_BUSY;
		stop_rsp_code.m_ContextId = g_pcm_file.m_MediaId;
		protocol_send_frame(STOP_PLAY_AUDIO_RSP, &stop_rsp_code, AUD_TYPE_RSP);
	}
	return 0;
#else
	/*直接抢占方式*/
	BOOL ret = 0;
	ret = pfv_StopAudioPlay();
	/*应答*/
	struct t_rsp_code     stop_rsp_code;
	stop_rsp_code.m_PlayResult = (ret == TRUE) ? RET_OK : ERR_INVAILD_DATA;
	stop_rsp_code.m_ContextId = g_pcm_file.m_MediaId;
	protocol_send_frame(STOP_PLAY_AUDIO_RSP, &stop_rsp_code, AUD_TYPE_RSP);

	/*释放资源*/
	if (g_audio_status == TRANS_STATUS || g_audio_status == PLAY_STATUS)
	{
		g_audio_status = STOP_STATUS;
		if(g_pcm_file.m_fp)
			fclose(g_pcm_file.m_fp);
		if (g_pcm_file.m_filename)
			remove(g_pcm_file.m_filename);
		memset(&g_pcm_file, 0, sizeof(struct t_pcm_file));
	}

	/*关功放*/
	aud_amp_poweroff();
	return 0;
#endif

}

/*音频播放结果回调*/
base_EEventResult pfv_aud_cb(base_EAudioKind vp_AudioKind, base_EAudioState vp_State)
{
	struct t_rsp_code     play_rsp_code;
	switch (vp_State)
	{
	case base_AUDIO_STATE_FINISH:
	case base_AUDIO_STATE_FAILED:

#if _AUD_DEBUG
		printf("audio play callback  vp_State = %d\r\n", vp_State);
#endif
		/*播放结果应答*/
	
		play_rsp_code.m_PlayResult = (g_audio_status == PLAY_STATUS) ? RET_OK : ERR_INVAILD_OPERATE;
		play_rsp_code.m_ContextId = g_pcm_file.m_MediaId;
		protocol_send_frame(AUDIO_PLAY_RSP, &play_rsp_code, AUD_TYPE_RSP);

		/*释放资源*/
		g_audio_status = STOP_STATUS;
		if (g_pcm_file.m_fp)            
			fclose(g_pcm_file.m_fp);
		if (g_pcm_file.m_filename)       
			remove(g_pcm_file.m_filename);
		memset(&g_pcm_file, 0, sizeof(struct t_pcm_file));
		aud_amp_poweroff();
		break;
	default:
		break;
	}
	/*关功放*/
	aud_amp_poweroff();
	return base_cbrOk;
}


/*开始录音请求*/
int start_recorder_req(struct t_aud_frame* pp_aud_frame)
{
	BOOL ret = FALSE;
	struct t_rsp_code     recorder_rsp_code;
	if (g_recocder_status != RECORDER_STOP_STATUS)
		recorder_rsp_code.m_PlayResult = ERR_BUSY;
	else
	{
		ret = pfv_StartRec(1, 8000, 16, "D9A");
#if _AUD_DEBUG
		printf("********************recorder  start.. ret = %d ********************\r\n", ret);
#endif
		recorder_rsp_code.m_PlayResult = (ret) ? RET_OK : ERR_INVAILD_OPERATE;
		/*启动录音失败,直接返回*/
		if(ret == FALSE)  
			g_recocder_status = RECORDER_STOP_STATUS;
		/*启动录音成功,进入录音模式,回调函数处理*/
		else              
			g_recocder_status = RECORDER_START_STATUS;
	}
		
	recorder_rsp_code.m_ContextId = 0;
	protocol_send_frame(START_RECORDER_RSP, &recorder_rsp_code, RECORDER_TYPE_RSP);
	return 0;
}
/*停止录音请求*/
int stop_recorder_req(struct t_aud_frame* pp_aud_frame)
{

	struct t_rsp_code recorder_rsp_code;
	/*已经处于停止录音模式,直接退出*/
	if (g_recocder_status != RECORDER_START_STATUS)
		return 0;

	/*停止录音*/
	recorder_rsp_code.m_PlayResult = (pfv_StopRec()) ? RET_OK : ERR_INVAILD_OPERATE;
	recorder_rsp_code.m_ContextId = 0;
	protocol_send_frame(STOP_RECORDER_RSP, &recorder_rsp_code, STOP_REC_TYPE_RSP);
	g_recocder_status = RECORDER_STOP_STATUS;


	return 0;
}

/*录音结果回调*/
base_EEventResult pfv_record_cb(const u8 *pp_Pcm_Data, u32 vp_DataLen, t_ywCbContext vp_Ctx)
{
	base_EEventResult ret = base_cbrOk;
	

	if (pp_Pcm_Data == NULL && vp_DataLen != 0)
	{
		return base_cbrError;
	}
	if (strcmp((char*)vp_Ctx, "D9A") == 0 && g_recocder_status == RECORDER_START_STATUS)
	{
		struct t_aud_frame rec_data_frame;
		rec_data_frame.m_Head = PROTOCOL_HEAD_CODE;
		rec_data_frame.m_CmdId = DATA_RECORDER_IND;
		rec_data_frame.m_DataLen = vp_DataLen;
		rec_data_frame.m_Data = (u8*)pp_Pcm_Data;
		rec_data_frame.m_Crc = aud_get_crc8(&rec_data_frame);

		/*申请发送buf*/
		u8* sendbuf = (u8*)malloc(rec_data_frame.m_DataLen + 5);
		sendbuf[0] = rec_data_frame.m_Head;
		sendbuf[1] = rec_data_frame.m_Crc;
		sendbuf[2] = rec_data_frame.m_CmdId;
		sendbuf[3] = rec_data_frame.m_DataLen & 0xff;
		sendbuf[4] = (rec_data_frame.m_DataLen >> 8) & 0xff;

		memcpy((u8*)&sendbuf[5], rec_data_frame.m_Data, rec_data_frame.m_DataLen);
		ret = (pfv_sci_SendData(USE_AUDIO_SCI,sendbuf, rec_data_frame.m_DataLen + 5) == 0) ? base_cbrOk : base_cbrError;

		/*释放发送buf*/
		free(sendbuf);
	}
	return ret;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值