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

📄 m803xxvoip.c

📁 m80320 VoIP DSP驱动源码
💻 C
📖 第 1 页 / 共 5 页
字号:
        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 + -