⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 toneapp.~c

📁 DTMF收发芯片88L89完美驱动(Arm,SDT251环境)
💻 ~C
📖 第 1 页 / 共 4 页
字号:
/* tone_App.c - 音频服务 应用层 外部消息函数 */

/* Copyright 1994-2001 Wuhan Jinglun Electronic Co., Ltd. */

/* 
modification history
--------------------

*/

/* 
DESCRIPTION 根据外部消息提供相应的服务。
*/

#include	"pcdisk.h"

#include	"codec.h"
#include	"intfTone.h"
#include	"intfUimm.h"
#include	"intfMont.h"
#include	"..\inc\toneType.h"

#include	"..\inc\rtn_tone.h"
#include "..\inc\MT88L89V2.h"

//extern temp;

//数据缓存
/* BEGIN, 2002-05-20, Yancj */
/* PURPOSE: 只读取一个文件*/

#if 1	
	//									pBuf_HFC 				iPeriod_Tone		iLoop_Series
	//pDesc	iDevice				pBuf_ARM 		iBuf		iPeriod_Send 		iLoop_Period					
	//内容播放				ARM	    	HFC	 	数据	发声	声音	周期	连续  
	//描述设备				缓存	缓存	长度	周期	周期	次数	次数                                    
	//		int                                       	*    *    	1bytes 	1Tick	1Tick	1Cycle	1Cycle								                                          					
TONE_APP_DATA_BUF_t gTONE_Data_Buf_Main[] = {								
	"NULL",	TONE_DEVICE_CODEC_NUL, 	0,   0, 	0, 		0,	  		0,	  	0,		0,	//	0		
	"KEYS",	TONE_DEVICE_CODEC_ARM, 	0,   0,	0, 		0/*need*/,	0,	  	1,		1,	//	1		
	"REMV",	TONE_DEVICE_CODEC_ARM, 	0,   0,	0, 		50,			100,		3,		1,	//	2	
	"CHGE",	TONE_DEVICE_CODEC_ARM, 	0,   0,	0, 		100,			300,		10,		1,	//	3	
	"RING",	TONE_DEVICE_CODEC_ARM, 	0,   0,	0, 		90,			500,		60,		1,	//	4	
	"PUBL",	TONE_DEVICE_CODEC_ARM, 	0,   0,	0, 		60,			260,		3,		1,	//	5
	"DIAL",	TONE_DEVICE_CODEC_ARM, 	0,   0, 	0, 		5400,		0,	  	1,   		60,	//	6

	"BUSY",	TONE_DEVICE_CODEC_ARM, 	0, 	0, 	0, 		35,	 		70,		100,		1,	//	7
	"DTMF",	TONE_DEVICE_CODEC_ARM, 	0,	0, 	0, 		0/*need*/,	0,	  	1,		1,	//	8	
	
	/* BEGIN, 2002-05-27, YanCJ */
	/* PURPOSE: 增加呼台提示音控制表*/	
	"CALL",	TONE_DEVICE_CODEC_ARM, 	0,	0, 	800, 	10,			20,	  	2,		1	//	9	
	/* END */
	
	};

#endif
/* END */

/* 程序运行后返回的值
pDesc   iDevice   iBuf   iPeriod_Send   iPeriod_Tone   iLoop_Period   iLoop_Series 
NULL	 0	 0	 	0	 	0	 0	 0
KEYS	 2	 12800	 10	 	0	 1	 1
REMV	 2	 8000	 50	 	100	 3	 1
CHGE	 2	 8000	 100	 	300	 10	 1
RING	 2	 8000	 90	 	500	 60	 1
PUBL	 1	 4800	 60	 	260	 3	 1
DIAL	 2	 7202	 5400	 0	 1	 60
BUSY	 2	 2800	 35	 	70	 100	 1
DTMF	 1	 10240	 8	 	0	 1	 1
*/

#if 0	//2002-04-08 modified ready, Yancj ,		宏控制双频音长度
	//内容 ARM					HFC				ARM	    HFC	 文件					发声			声音	周期	连续  
	//描述 文件				文件			缓存	缓存	长度					周期			周期	次数	次数                                    
	//														                                          					
TONE_APP_DATA_BUF_t gTONE_Data_Buf_Main[] = {								
	"NULL",	"",         		"",					0,   0, 0,	  					0,	  				0,	  	0,		0,	//	0		
	"KEYS",	TONE_FILE_ARM_KEYS, TONE_FILE_HFC_KEYS,	0,   0,	(16*TONE_KEYS_SIZES),	(TONE_KEYS_TICKS),	0,	  	1,		1,	//	1		
	"REMV",	TONE_FILE_ARM_REMV, TONE_FILE_HFC_REMV,	0,   0,	4000,					50,					100,	3,		1,	//	2	
	"CHGE",	TONE_FILE_ARM_CHGE, TONE_FILE_HFC_CHGE,	0,   0,	8000,					100,				300,	10,		1,	//	3	
	"RING",	TONE_FILE_ARM_RING, TONE_FILE_HFC_RING,	0,   0,	7200,					90,					500,	60,		1,	//	4	
	"PUBL",	TONE_FILE_ARM_PUBL, TONE_FILE_HFC_PUBL,	0,   0,	4800,					60,					260,	3,		1,	//	5
	"DIAL",	TONE_FILE_ARM_DIAL, TONE_FILE_HFC_DIAL,	0,   0, 8000,					6000,				0,	  	1,   	60,	//	6

	"BUSY",	TONE_FILE_ARM_BUSY, TONE_FILE_HFC_BUSY,	0, 	0, 	2800,					35,	 				70,		100,	1,	//	7
	"DTMF",	TONE_FILE_ARM_DTMF, TONE_FILE_HFC_DTMF,	0,	0, 	(16*TONE_DTMF_SIZES),	 (TONE_DTMF_TICKS),	0,	  	1,		1	//	8	
	};

#endif

#if 0	//2002-03-28 modified ready, Yancj 
		//
	//tick数
	//内容 ARM				HFC				ARM	    HFC	 文件	发声声音周期	连续  
	//描述 文件				文件			缓存缓存长度	周期周期次数	次数                                    
	//														                                          					
TONE_APP_DATA_BUF_t gTONE_Data_Buf_Main[] = {								
	"NULL",	TONE_FILE_NULL,         	TONE_FILE_NULL,		0,   0,   	800,	  	10,	  	0,	  	1,		1,	//	0		
	"KEYS",	TONE_FILE_ARM_KEYS, 	TONE_FILE_HFC_KEYS,	0,   0,	16*800,	10,	  	0,	  	1,		1,	//	1		
	"REMV",	TONE_FILE_ARM_REMV, TONE_FILE_HFC_REMV,	0,   0,	4000,	50,		100,	  	3,		1,	//	2	
	"CHGE",	TONE_FILE_ARM_CHGE, TONE_FILE_HFC_CHGE,	0,   0,	8000,	100,		300,	 	10,		1,	//	3	
	"RING",	TONE_FILE_ARM_RING, 	TONE_FILE_HFC_RING,	0,   0,	7200,	90,		500,	 	60,		1,	//	4	
	"PUBL",	TONE_FILE_ARM_PUBL, 	TONE_FILE_HFC_PUBL,	0,   0,	4800,	60,		260,	  	3,		1,	//	5
	"DIAL",	TONE_FILE_ARM_DIAL, 	TONE_FILE_HFC_DIAL,	0,   0,  	8000,	6000,	0,	  	1,   		60,	//	6

	"BUSY",	TONE_FILE_ARM_BUSY, TONE_FILE_HFC_BUSY,	0, 	0, 	2800,	 35,	 	70,		100,		1,	//	7
	"DTMF",	TONE_FILE_ARM_DTMF, TONE_FILE_HFC_DTMF,	0,	0, 	16*800,	 10,	  	0,	  	1,		1	//	8	
	};

#endif

/* BEGIN, 2002-05-15, Yancj */
/* PURPOSE: 需要定制参数*/
int gTONE_Interval_KEYS;			//两个按键音之间间隔时间	
int gTONE_Interval_DTMF;		//两个双频音之间间隔时间	
/* END */

//2个设备
//TONE_APP_DEVICE_INFO_t gTONE_App_Device_Info_HFC;	
TONE_APP_DEVICE_INFO_t gTONE_App_Device_Info_ARM;	

//6个定时器

//NU_TIMER TONE_Timer_HFC_Start;
//NU_TIMER TONE_Timer_HFC_Stop;
NU_TIMER TONE_Timer_HFC_Delay;

NU_TIMER TONE_Timer_ARM_Start;
NU_TIMER TONE_Timer_ARM_Stop;
NU_TIMER TONE_Timer_ARM_Delay;


//过去的与设备相关2条消息
TONEMSGRSV_t	TONE_ARM_Msg_Rsv;		//按键保留的消息
TONEMSGRSV_t	TONE_HFC_Msg_Rsv;		//双频保留的消息

int 	gTONE_Fifo_Keys_Is_Null;		
int 	gTONE_Fifo_Dtmf_Is_Null;		

/* begin 2003-10-22, huangm */
/* resume the bug of TONE lose number */
/*
	DTMF_Flag
	value
		true:		tone task have received message from tone_HISR_Timer_HFC_Delay()
		
		false:		tone task have not received message, so tone_HISR_Timer_HFC_Delay()
					do not send another message
*/
bool	DTMF_Flag = true;

/* end */

extern bool g_wait_dtmf_send;

extern int IsSoundPlayAvailable (void);

/**********************************************************************
*                                                                      
*  FUNCTION		"tone_App"          音频服务.应用层服务入口	        
*
***********************************************************************/
void tone_App(UNSIGNED argc, VOID *argv)	
{
	STATUS		status; 
	PRINTFLOW("Begin: tone_App");

	status = tone_App_Start();		//音频服务.启动函数		//分配数据空间
	status = tone_App_Process();	//音频服务.处理函数
	status = tone_App_Stop();		//音频服务.停止函数		//释放数据空间

	PRINTFLOW("Enddd: tone_App ");
	return;
}	



/**********************************************************************
*                                                                      
*  FUNCTION		"tone_App_Start"          音频服务.启动	        
*
***********************************************************************/
int tone_App_Start(void)
{
	//UINT2 num;
	//int i;
	STATUS	status; 

	//音频服务.成为文件系统的客户
	status = NU_Become_File_User();
	if (status != 1) 
	{
		PRINTERRR("tone_App_Start: %8d\t NU_Become_File_User", status);  
		LogError("Error %s L %d\n",__FILE__,__LINE__);
		return -1;
	}

	//数据缓存.初始化
	//num = sizeof(gTONE_Data_Buf_Main)/sizeof(TONE_APP_DATA_BUF_t);
	//status = tone_App_Data_Buf_Init(gTONE_Data_Buf_Main, num);	//初始音频数据
	
	 status = tone_App_Data_Init(gTONE_Data_Buf_Main);

#if 0
	printf("pDesc   iDevice   iBuf   iPeriod_Send   iPeriod_Tone   iLoop_Period   iLoop_Series \n" );
	for(i=0; i<=8;i++)
	{
		printf("%s\t %d\t %d\t %d\t %d\t %d\t %d\n", gTONE_Data_Buf_Main[i].pDesc,
											gTONE_Data_Buf_Main[i].iDevice,
											gTONE_Data_Buf_Main[i].iBuf,
											gTONE_Data_Buf_Main[i].iPeriod_Send,
											gTONE_Data_Buf_Main[i].iPeriod_Tone,
											gTONE_Data_Buf_Main[i].iLoop_Period,
											gTONE_Data_Buf_Main[i].iLoop_Series);
	}
#endif
 
	TONE_HFC_Msg_Rsv.current =0;
	TONE_HFC_Msg_Rsv.size = 50;
	
	TONE_ARM_Msg_Rsv.current =0;
	TONE_ARM_Msg_Rsv.size = 50;
	//定时器.创建
							//timer					name	expiration_routine		id  init resc	enable	
//	status = NU_Create_Timer(&TONE_Timer_HFC_Start,  "TT_01",  tone_HISR_Timer_HFC_Start, 1, 	20,	20,	NU_DISABLE_TIMER); 
//	status = NU_Create_Timer(&TONE_Timer_HFC_Stop,   "TT_02",  tone_HISR_Timer_HFC_Stop,  1, 	20,	20,	NU_DISABLE_TIMER);
	status = NU_Create_Timer(&TONE_Timer_HFC_Delay,  "TT_03", tone_HISR_Timer_HFC_Delay, 1, 	gTONE_Interval_DTMF, gTONE_Interval_DTMF,	NU_DISABLE_TIMER);

	status = NU_Create_Timer(&TONE_Timer_ARM_Start,  "TT_11",  tone_HISR_Timer_ARM_Start, 1, 	20,	20,	NU_DISABLE_TIMER);
	status = NU_Create_Timer(&TONE_Timer_ARM_Stop,   "TT_12",  tone_HISR_Timer_ARM_Stop,  1, 	20,	20,	NU_DISABLE_TIMER);
	status = NU_Create_Timer(&TONE_Timer_ARM_Delay,  "TT_13", tone_HISR_Timer_ARM_Delay, 1, 	gTONE_Interval_KEYS, gTONE_Interval_KEYS,	NU_DISABLE_TIMER);

	return NU_SUCCESS;
}	

/**********************************************************************
*                                                                      
*  FUNCTION		"tone_App_Stop"          音频服务.停止	        
*
***********************************************************************/
int tone_App_Stop(void)
{
	UINT2 num;

	RtnMSG	s_msg;

	STATUS		status; 
	PRINTFLOW("Begin: tone_App_Stop");

	NU_Release_File_User(); 

	//数据缓存.释放
	num = sizeof(gTONE_Data_Buf_Main)/sizeof(TONE_APP_DATA_BUF_t);
	status = tone_App_Data_Buf_Deinit(gTONE_Data_Buf_Main, num);	//释放音频地址

	//定时器.释放
//	status = NU_Control_Timer(&TONE_Timer_HFC_Start, NU_DISABLE_TIMER);
//	status = NU_Control_Timer(&TONE_Timer_HFC_Stop,  NU_DISABLE_TIMER);
	status = NU_Control_Timer(&TONE_Timer_HFC_Delay, NU_DISABLE_TIMER);	
	
	status = NU_Control_Timer(&TONE_Timer_ARM_Start, NU_DISABLE_TIMER);
	status = NU_Control_Timer(&TONE_Timer_ARM_Stop,  NU_DISABLE_TIMER);
	status = NU_Control_Timer(&TONE_Timer_ARM_Delay,  NU_DISABLE_TIMER);	


//	status = NU_Delete_Timer(&TONE_Timer_HFC_Start);
//	status = NU_Delete_Timer(&TONE_Timer_HFC_Stop);
	status = NU_Delete_Timer(&TONE_Timer_HFC_Delay);
	
	status = NU_Delete_Timer(&TONE_Timer_ARM_Start);
	status = NU_Delete_Timer(&TONE_Timer_ARM_Stop);
	status = NU_Delete_Timer(&TONE_Timer_ARM_Delay);


	//发出退出消息
	s_msg.msg_len = 0;
	s_msg.msg_code = MSG_MONT_EXIT_TONE;	
	status = NU_Send_To_Pipe(&rtn_pipe[MONT], &s_msg, s_msg.msg_len + 4, NU_NO_SUSPEND);  
	if (status < NU_SUCCESS) 
	{
		PRINTERRR("ERRR: NU_Send_To_Pipe: %d. ", status);  
		LogError("Error %s L %d\n",__FILE__,__LINE__);
	}

	PRINTFLOW("Enddd: tone_App_Stop");
	return NU_SUCCESS;
}	

/**********************************************************************
*                                                                      
*  FUNCTION		"tone_App_Process"          音频服务.处理	        
*
***********************************************************************/
int tone_App_Process(void)
{

	RtnMSG	r_msg;
	RtnMSG	s_msg;
	UNSIGNED 	size;
	int pass;
	int valid;				//局部处理是否有效 0:无效 1: 有效	
	int processing;		//

	STATUS		status;
	PRINTFLOW("Begin: tone_App_Process");

	processing  = 1;
	valid = 0;
	
	//FIFO缓存.初始化
//	status = tone_App_Device_Buf_Init(&gTONE_App_Device_Info_HFC);
	status = tone_App_Device_Buf_Init(&gTONE_App_Device_Info_ARM);

	while(processing) 
	{
		//等待外部消息
		status =   NU_Receive_From_Pipe(&rtn_pipe[TONE] , &r_msg, MAX_MSG_BYTES, &size, NU_SUSPEND);  
		if (status != NU_SUCCESS) 
		{   
			PRINTERRR("TONE --- ERR: NU_Receive_From_Pipe: %8d\n", status);
			continue;
		}

		//
		//便于调试中屏蔽TONE模块		2002-05-08
		//
		if (MSG_TONE_QUERY_MONT!=r_msg.msg_code)
		{
			//continue;
		}		

		//return;
		
		switch(r_msg.msg_code)
		{
//ISDN消息
/*
			case MSG_TONE_PHONE_CTRL_UIMM:
				switch(r_msg.msg_data[0])
				{
					case PHONE_CTRL_OFF:		//HFC2GCI	HFC2ST	ST2HFC
						PhDr_Iocntl(0, CNTLID_CONNECT_B1_HFC2GCI, 0);
						PhDr_Iocntl(0, CNTLID_CONNECT_B1_HFC2ST, 0);
						//PhDr_Iocntl(0, CNTLID_CONNECT_B1_ST2HFC, 0);						
						break;

					case PHONE_CTRL_ON:	//ST2GCI	GCI2ST	GCI2HFC
						PhDr_Iocntl(0, CNTLID_CONNECT_B1_ST2GCI, 0);
						PhDr_Iocntl(0, CNTLID_CONNECT_B1_GCI2ST, 0);
						//PhDr_Iocntl(0, CNTLID_CONNECT_B1_GCI2HFC, 0);						
						break;

					default:
						PRINTERRR("err MSG_TONE_ISDN_UIMM msg_data[0]");
						LogError("Error %s L %d\n",__FILE__,__LINE__);
						break;
				
				}

				break;
*/

//退出消息
			case MSG_TONE_EXIT_MONT:
				processing = 0;
				break;
				
//维护消息
			case MSG_TONE_QUERY_MONT:	//	10011
				//发出存活消息
				s_msg.msg_len = 1;
				s_msg.msg_code = MSG_MONT_QUERY_RSP_TONE;
				s_msg.msg_data[0] = 1;
				status = NU_Send_To_Pipe(&rtn_pipe[MONT], &s_msg, s_msg.msg_len + 4, NU_NO_SUSPEND);  
				if (status < NU_SUCCESS) 
				{
					PRINTERRR("ERRR: NU_Send_To_Pipe: %d. ", status);  
					LogError("Error %s L %d\n",__FILE__,__LINE__);
				}

				break;

			case MSG_TONE_DTMFSEND_FINISH:
				s_msg.msg_len = 0;
				s_msg.msg_code = MSG_UIMM_NUMBER_SENT_UIMM;
				status = NU_Send_To_Pipe(&rtn_pipe[UIMM], &s_msg, s_msg.msg_len + 4, NU_NO_SUSPEND);  
				if (status < NU_SUCCESS) 
				{
					PRINTERRR("ERRR: NU_Send_To_Pipe: %d. ", status);  
					LogError("Error %s L %d\n",__FILE__,__LINE__);
				}
				
				break;

			case MSG_TONE_TEST_MNTN:
				//
				//维护操作
				//
				status = tone_Mntn_Test(r_msg);
				break;
//播放消息
			case MSG_TONE_KEYS_UIMM:	//按键音
				//			
				//按键消息预处理
				//
				status = tone_App_Pre_Msg_Keys(r_msg); 
									
				switch(status)
				{
					case TONE_FIFO_ADDED:		//已经加入队列
					
						PRINTINFO("tone_App_Pre_Msg_Keys: rtn: TONE_FIFO_ADDED");
						
						continue;						
						break;

					case TONE_FIFO_NOT_NEED:	//无需加入队列
					
						PRINTINFO("tone_App_Pre_Msg_Keys: rtn: TONE_FIFO_NOT_NEED");
						
						break;
	
					default:			//处理过程中有错误
					
						PRINTERRR("tone_App_Pre_Msg_Keys err");
						LogError("Error %s L %d\n",__FILE__,__LINE__);
						continue;
				}
				goto tone;		//暂时,消息定义不合理的原因
				break;		
				

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -