📄 toneapp.~c
字号:
/* 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 + -