?? toneapp.~c
字號(hào):
/* tone_App.c - 音頻服務(wù) 應(yīng)用層 外部消息函數(shù) */
/* Copyright 1994-2001 Wuhan Jinglun Electronic Co., Ltd. */
/*
modification history
--------------------
*/
/*
DESCRIPTION 根據(jù)外部消息提供相應(yīng)的服務(wù)。
*/
#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;
//數(shù)據(jù)緩存
/* BEGIN, 2002-05-20, Yancj */
/* PURPOSE: 只讀取一個(gè)文件*/
#if 1
// pBuf_HFC iPeriod_Tone iLoop_Series
//pDesc iDevice pBuf_ARM iBuf iPeriod_Send iLoop_Period
//內(nèi)容播放 ARM HFC 數(shù)據(jù) 發(fā)聲 聲音 周期 連續(xù)
//描述設(shè)備 緩存 緩存 長(zhǎng)度 周期 周期 次數(shù) 次數(shù)
// 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: 增加呼臺(tái)提示音控制表*/
"CALL", TONE_DEVICE_CODEC_ARM, 0, 0, 800, 10, 20, 2, 1 // 9
/* END */
};
#endif
/* END */
/* 程序運(yùn)行后返回的值
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 , 宏控制雙頻音長(zhǎng)度
//內(nèi)容 ARM HFC ARM HFC 文件 發(fā)聲 聲音 周期 連續(xù)
//描述 文件 文件 緩存 緩存 長(zhǎng)度 周期 周期 次數(shù) 次數(shù)
//
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數(shù)
//內(nèi)容 ARM HFC ARM HFC 文件 發(fā)聲聲音周期 連續(xù)
//描述 文件 文件 緩存緩存長(zhǎng)度 周期周期次數(shù) 次數(shù)
//
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: 需要定制參數(shù)*/
int gTONE_Interval_KEYS; //兩個(gè)按鍵音之間間隔時(shí)間
int gTONE_Interval_DTMF; //兩個(gè)雙頻音之間間隔時(shí)間
/* END */
//2個(gè)設(shè)備
//TONE_APP_DEVICE_INFO_t gTONE_App_Device_Info_HFC;
TONE_APP_DEVICE_INFO_t gTONE_App_Device_Info_ARM;
//6個(gè)定時(shí)器
//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;
//過(guò)去的與設(shè)備相關(guān)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" 音頻服務(wù).應(yīng)用層服務(wù)入口
*
***********************************************************************/
void tone_App(UNSIGNED argc, VOID *argv)
{
STATUS status;
PRINTFLOW("Begin: tone_App");
status = tone_App_Start(); //音頻服務(wù).啟動(dòng)函數(shù) //分配數(shù)據(jù)空間
status = tone_App_Process(); //音頻服務(wù).處理函數(shù)
status = tone_App_Stop(); //音頻服務(wù).停止函數(shù) //釋放數(shù)據(jù)空間
PRINTFLOW("Enddd: tone_App ");
return;
}
/**********************************************************************
*
* FUNCTION "tone_App_Start" 音頻服務(wù).啟動(dòng)
*
***********************************************************************/
int tone_App_Start(void)
{
//UINT2 num;
//int i;
STATUS status;
//音頻服務(wù).成為文件系統(tǒng)的客戶
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;
}
//數(shù)據(jù)緩存.初始化
//num = sizeof(gTONE_Data_Buf_Main)/sizeof(TONE_APP_DATA_BUF_t);
//status = tone_App_Data_Buf_Init(gTONE_Data_Buf_Main, num); //初始音頻數(shù)據(jù)
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;
//定時(shí)器.創(chuàng)建
//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" 音頻服務(wù).停止
*
***********************************************************************/
int tone_App_Stop(void)
{
UINT2 num;
RtnMSG s_msg;
STATUS status;
PRINTFLOW("Begin: tone_App_Stop");
NU_Release_File_User();
//數(shù)據(jù)緩存.釋放
num = sizeof(gTONE_Data_Buf_Main)/sizeof(TONE_APP_DATA_BUF_t);
status = tone_App_Data_Buf_Deinit(gTONE_Data_Buf_Main, num); //釋放音頻地址
//定時(shí)器.釋放
// 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);
//發(fā)出退出消息
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" 音頻服務(wù).處理
*
***********************************************************************/
int tone_App_Process(void)
{
RtnMSG r_msg;
RtnMSG s_msg;
UNSIGNED size;
int pass;
int valid; //局部處理是否有效 0:無(wú)效 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;
}
//
//便于調(diào)試中屏蔽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;
//維護(hù)消息
case MSG_TONE_QUERY_MONT: // 10011
//發(fā)出存活消息
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:
//
//維護(hù)操作
//
status = tone_Mntn_Test(r_msg);
break;
//播放消息
case MSG_TONE_KEYS_UIMM: //按鍵音
//
//按鍵消息預(yù)處理
//
status = tone_App_Pre_Msg_Keys(r_msg);
switch(status)
{
case TONE_FIFO_ADDED: //已經(jīng)加入隊(duì)列
PRINTINFO("tone_App_Pre_Msg_Keys: rtn: TONE_FIFO_ADDED");
continue;
break;
case TONE_FIFO_NOT_NEED: //無(wú)需加入隊(duì)列
PRINTINFO("tone_App_Pre_Msg_Keys: rtn: TONE_FIFO_NOT_NEED");
break;
default: //處理過(guò)程中有錯(cuò)誤
PRINTERRR("tone_App_Pre_Msg_Keys err");
LogError("Error %s L %d\n",__FILE__,__LINE__);
continue;
}
goto tone; //暫時(shí),消息定義不合理的原因
break;
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -