📄 m803xxvoip.c
字号:
if( ++InCmd >= MAX_LEN_OF_CMD_FIFO) InCmd = 0;
PortPtr->tx_cmd_fifo[InCmd] = 0x6261;
if( ++InCmd >= MAX_LEN_OF_CMD_FIFO) InCmd = 0;
PortPtr->tx_cmd_fifo[InCmd] = 0x0800;/*Codec_Type[0];*/
if( ++InCmd >= MAX_LEN_OF_CMD_FIFO) InCmd = 0;
PortPtr->tx_cmd_fifo[InCmd] = 0x0f04;/*Codec_Type[1];*/
if( ++InCmd >= MAX_LEN_OF_CMD_FIFO) InCmd = 0;
PortPtr->tx_cmd_fifo[InCmd] = 0xff12;/*Codec_Type[2];*/
if( ++InCmd >= MAX_LEN_OF_CMD_FIFO) InCmd = 0;
PortPtr->tx_cmd_fifo[InCmd] = 0xffff;
if( ++InCmd >= MAX_LEN_OF_CMD_FIFO) InCmd = 0;
PortPtr->InCmd = InCmd;
RemainedTxCmdNum[PortNo] += 6;
send_ok_flag = SendMsgToOpenChannelQueue(CMD_CMDDAT, 0xfd0c, 0x0200, FUN_PTMNG, PortNo);
}
semGive(M803xxQueueSem[PortNo/8]);
}
void Set_PTSET_Cmd(UINT8 PortNo, UINT16 Flag)
{
UINT16 InCmd;
M803xx_PORT_STATE *PortPtr;
UINT16 Codec_Type;
UINT8 name, send_ok_flag = 0;
PortPtr = (M803xx_PORT_STATE *)&m_port[PortNo];
name = (UINT8)(Parameter[PortNo].bearerInformation);
switch(name)
{
case CODER_TYPE_G711Alaw:
Codec_Type = 0x0508; /* G711Alaw */
break;
case CODER_TYPE_G711Ulaw:
Codec_Type = 0x0400; /* G711Ulaw */
break;
case 6:
case CODER_TYPE_G723:
Codec_Type = 0x0604; /* G723 */
break;
#if 0
case CODER_TYPE_G728:
Codec_Type = 0x070f; /* G728 */
break;
#endif
case CODER_TYPE_G729: /* G729 */
case CODER_TYPE_G729a: /* G729a */
case CODER_TYPE_G729wb: /* G729wb */
case CODER_TYPE_G729awb: /* G729awb */
Codec_Type = 0x0812; /* G729 */
break;
case CODER_TYPE_T38:
Codec_Type = 0x0362; /* IFP */
break;
default:
Codec_Type = 0x0812; /* G729 */
break;
}
semTake(M803xxQueueSem[PortNo/8], WAIT_FOREVER);
if (OK == M80320_checkOpenChanQueue(PortNo, 0x02, FUN_PTSET))
{
if(Flag != 0)
Codec_Type = Flag;
InCmd = PortPtr->InCmd;
PortPtr->tx_cmd_fifo[InCmd] = Codec_Type;
if( ++InCmd >= MAX_LEN_OF_CMD_FIFO) InCmd = 0;
PortPtr->InCmd = InCmd;
RemainedTxCmdNum[PortNo] += 1;
send_ok_flag = SendMsgToOpenChannelQueue(CMD_CMDDAT, 0xfd02, 0x0200, FUN_PTSET, PortNo);
}
semGive(M803xxQueueSem[PortNo/8]);
}
void Set_PTSETRXOVR_Cmd(UINT8 PortNo, UINT16 Flag)
{
UINT16 InCmd;
M803xx_PORT_STATE *PortPtr;
UINT16 Codec_Type;
UINT8 name, send_ok_flag = 0;
PortPtr = (M803xx_PORT_STATE *)&m_port[PortNo];
name = (UINT8)(Parameter[PortNo].bearerInformation);
switch(name)
{
case CODER_TYPE_G711Alaw:
Codec_Type = 0x0508; /* G711Alaw */
break;
case CODER_TYPE_G711Ulaw:
Codec_Type = 0x0400; /* G711Ulaw */
break;
case 6:
case CODER_TYPE_G723:
Codec_Type = 0x0604; /* G723 */
break;
#if 0
case 10:
Codec_Type = 0x070f; /* G728 */
break;
#endif
case CODER_TYPE_G729: /* G729 */
case CODER_TYPE_G729a: /* G729a */
case CODER_TYPE_G729wb: /* G729wb */
case CODER_TYPE_G729awb: /* G729awb */
Codec_Type = 0x0812; /* G729 */
break;
case CODER_TYPE_T38:
Codec_Type = 0x0362; /* IFP */
break;
default:
Codec_Type = 0x0812; /* G729 */
break;
}
semTake(M803xxQueueSem[PortNo/8], WAIT_FOREVER);
if (OK == M80320_checkOpenChanQueue(PortNo, 0x02, FUN_PTSETRXOVR))
{
if(Flag != 0)
Codec_Type = Flag;
InCmd = PortPtr->InCmd;
PortPtr->tx_cmd_fifo[InCmd] = Codec_Type;
if( ++InCmd >= MAX_LEN_OF_CMD_FIFO) InCmd = 0;
PortPtr->InCmd = InCmd;
RemainedTxCmdNum[PortNo] += 1;
send_ok_flag = SendMsgToOpenChannelQueue(CMD_CMDDAT, 0xfd02, 0x0200, FUN_PTSETRXOVR, PortNo);
}
semGive(M803xxQueueSem[PortNo/8]);
}
/*-----------------------------
* Set_EXTENC_Cmd - VOIP数据包的封装,不包括RTP的封装
*
* Description:
*
* Argument:
* UINT8 PortNo - portNo = (slot - 1) * 8 (每一个槽位最多8个端口) + port - 1
*
* Return:
*
* Modified history
*------------------------------
* 2006-3-18 09:13 注解.
*
**/
void Set_EXTENC_Cmd(UINT8 PortNo)
{
UINT16 InCmd,Port[2];
M803xx_PORT_STATE *PortPtr;
ipaddr_t Ipaddr[2];
UINT8 i, send_ok_flag = 0;
PortPtr = (M803xx_PORT_STATE *)&m_port[PortNo];
for(i=0; i<MAX_IP_ADDR_LEN; i++)
{
Ipaddr[0].addr[i] = Parameter[PortNo].localRtpAddress.ipAddr.addr[i];
Ipaddr[1].addr[i] = Parameter[PortNo].remoteRtpAddress.ipAddr.addr[i];
}
Port[0] = Parameter[PortNo].localRtpAddress.port;
Port[1] = Parameter[PortNo].remoteRtpAddress.port;
semTake(M803xxQueueSem[PortNo/8], WAIT_FOREVER);
if (OK == M80320_checkOpenChanQueue(PortNo, 0x1e, FUN_EXTENC))
{
InCmd = PortPtr->InCmd;
PortPtr->tx_cmd_fifo[InCmd] = 0x0000;
if( ++InCmd >= MAX_LEN_OF_CMD_FIFO) InCmd = 0;
PortPtr->tx_cmd_fifo[InCmd] = Swap_Byte(0xFC45);
if( ++InCmd >= MAX_LEN_OF_CMD_FIFO) InCmd = 0;
PortPtr->tx_cmd_fifo[InCmd] = 0x0000;
if( ++InCmd >= MAX_LEN_OF_CMD_FIFO) InCmd = 0;
PortPtr->tx_cmd_fifo[InCmd] = 0x0000;
if( ++InCmd >= MAX_LEN_OF_CMD_FIFO) InCmd = 0;
PortPtr->tx_cmd_fifo[InCmd] = 0x0000;
if( ++InCmd >= MAX_LEN_OF_CMD_FIFO) InCmd = 0;
PortPtr->tx_cmd_fifo[InCmd] = Swap_Byte(0x117E);
if( ++InCmd >= MAX_LEN_OF_CMD_FIFO) InCmd = 0;
PortPtr->tx_cmd_fifo[InCmd] = 0x0000;
if( ++InCmd >= MAX_LEN_OF_CMD_FIFO) InCmd = 0;
PortPtr->tx_cmd_fifo[InCmd] = Swap_Byte((UINT16)((Ipaddr[0].addr[1])<<8)+(Ipaddr[0].addr[0]));
if( ++InCmd >= MAX_LEN_OF_CMD_FIFO) InCmd = 0;
PortPtr->tx_cmd_fifo[InCmd] = Swap_Byte((UINT16)((Ipaddr[0].addr[3])<<8)+(Ipaddr[0].addr[2]));
if( ++InCmd >= MAX_LEN_OF_CMD_FIFO) InCmd = 0;
PortPtr->tx_cmd_fifo[InCmd] = Swap_Byte((UINT16)((Ipaddr[1].addr[1])<<8)+(Ipaddr[1].addr[0]));
if( ++InCmd >= MAX_LEN_OF_CMD_FIFO) InCmd = 0;
PortPtr->tx_cmd_fifo[InCmd] = Swap_Byte((UINT16)((Ipaddr[1].addr[3])<<8)+(Ipaddr[1].addr[2]));
if( ++InCmd >= MAX_LEN_OF_CMD_FIFO) InCmd = 0;
PortPtr->tx_cmd_fifo[InCmd] = Swap_Byte((((Port[0])&0xff00)>>8)|(((Port[0])&0x00ff)<<8));
if( ++InCmd >= MAX_LEN_OF_CMD_FIFO) InCmd = 0;
PortPtr->tx_cmd_fifo[InCmd] = Swap_Byte((((Port[1])&0xff00)>>8)|(((Port[1])&0x00ff)<<8));
if( ++InCmd >= MAX_LEN_OF_CMD_FIFO) InCmd = 0;
PortPtr->tx_cmd_fifo[InCmd] = 0x0000;
if( ++InCmd >= MAX_LEN_OF_CMD_FIFO) InCmd = 0;
PortPtr->tx_cmd_fifo[InCmd] = 0x0000;
if( ++InCmd >= MAX_LEN_OF_CMD_FIFO) InCmd = 0;
PortPtr->InCmd = InCmd;
RemainedTxCmdNum[PortNo] += 15;
send_ok_flag = SendMsgToOpenChannelQueue(CMD_CMDDAT, 0xfd1e, 0x0200, FUN_EXTENC, PortNo);
}
semGive(M803xxQueueSem[PortNo/8]);
}
void Set_DTMFDPAR_Cmd(UINT8 PortNo)
{
UINT16 InCmd;
M803xx_PORT_STATE *PortPtr;
UINT8 send_ok_flag = 0;
PortPtr = (M803xx_PORT_STATE *)&m_port[PortNo];
semTake(M803xxQueueSem[PortNo/8], WAIT_FOREVER);
if (OK == M80320_checkOpenChanQueue(PortNo, 0x06, FUN_DTMFDPAR))
{
InCmd = PortPtr->InCmd;
PortPtr->tx_cmd_fifo[InCmd] = 0x001c;
if( ++InCmd >= MAX_LEN_OF_CMD_FIFO) InCmd = 0;
PortPtr->tx_cmd_fifo[InCmd] = 0x001c;
if( ++InCmd >= MAX_LEN_OF_CMD_FIFO) InCmd = 0;
PortPtr->tx_cmd_fifo[InCmd] = 0x0014;
if( ++InCmd >= MAX_LEN_OF_CMD_FIFO) InCmd = 0;
RemainedTxCmdNum[PortNo] += 3;
send_ok_flag = SendMsgToOpenChannelQueue(CMD_CMDDAT, 0xfd06, 0x0200, FUN_DTMFDPAR, PortNo);
}
semGive(M803xxQueueSem[PortNo/8]);
}
/*************************************************************************/
/* Function name: OpenChannel */
/* Description : Enable The Channel */
/* Return type : void */
/* Argument : PortNo -- No. Of Port Num */
/* Flag -- 0:Change para; 1:First Open; */
/* 2:Change Codec; 3:Change SSRC */
/* Author/Date : Cao WanMing/2003-1-26 */
/* Note: */
/* */
/*************************************************************************/
void OpenChannel(UINT8 PortNo, UINT8 Flag)
{
M803xx_PORT_STATE* PortPtr;
int bearertemp = 11;/*默认--G729a*/
VoIP_CALL_PRINTF("M80320 OpenChannel PortNo = %d, Flag = %d\n", PortNo, Flag);
PortPtr = (M803xx_PORT_STATE *)&m_port[PortNo];
if(Flag == 2)
{
/*故障单号IP00056777,添加变量bearertemp来存储传下来的编解码方式*/
bearertemp = Parameter[PortNo].bearerInformation;
Parameter[PortNo].bearerInformation = CODER_TYPE_G711Alaw;
}
PortPtr->pt_value = SelectVocoderType(PortNo);
/*获取不同编码方式下的最小发送包长的限制*/
PortPtr->PackLen = SelectPackLen(PortNo);
if(Flag == 0)
{
Send_ECHOCAN_Cmd(PortNo);
Send_DGAIN_Cmd(PortNo, 0, 2);
Set_PTMNG_Cmd(PortNo);
Parameter[PortNo].DTMFSendMode = (UINT8)(Select_Dtmf_Detect_Mode(PortNo));
Send_DTMF_Cmd(PortNo, Parameter[PortNo].DTMFSendMode);
}
else
{
#if 0
if(PortPtr->ReOpenNum == 1)
{
Disable_Channel_Processing(PortNo);
}
#endif
if(PortPtr->pt_value == 0x6280)
setT38FaxOperation(PortNo);
Send_ECHOCAN_Cmd(PortNo);
SelectRPPHParameter(PortNo);
Send_RPPH_Cmd(PortNo);
Send_DGAIN_Cmd(PortNo, 0, 2);
Set_PTMNG_Cmd(PortNo);
Parameter[PortNo].DTMFSendMode = (UINT8)(Select_Dtmf_Detect_Mode(PortNo));
Send_DTMF_Cmd(PortNo, Parameter[PortNo].DTMFSendMode);
Send_VCEOPT_Cmd(PortNo, SelectVoiceOptionValue(PortNo), 0x40);
/* Set_DTMFDPAR_Cmd(PortNo);*/
/* Set_EXTENC_Cmd(PortNo);*/
/* Send_VINFOTMR_Cmd(PortNo); */
/* Send_FINFOTMR_Cmd(PortNo);*/
if(PortPtr->pt_value == 0x6280)
{
/*构造 T38 FAX的 IP + UDP的包头*/
constructIpUdpHeader(PortNo, Fax);
/* enable fax channel processing */
printf("Enable UDPTL encapsulation!\n");
Enable_UDPTL_Encapsulation(PortNo);
}
else
{
/*构造 Voice的 IP + UDP的包头*/
constructIpUdpHeader(PortNo, Voice);
/* enable voice processing channel */
Enable_RTP_Encapsulation(PortNo);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -