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

📄 m803xxvoip.c

📁 m80320 VoIP DSP驱动源码
💻 C
📖 第 1 页 / 共 5 页
字号:
/**************************************************************************
* Module Name: M803xx               File Name: M803xxVoip.C
* Create Date: 2003/01/23           Author:    Cao Wanming
* Version:     1.0
* History:
*  Date    Version  Modifier        Activies
* =========================================================================
**************************************************************************/
#include "m803xx.h"
/*#include "ctype.h"*/
#include "string.h"
#include "sysLib.h"
/*#include "bootLib.h"
#include "fioLib.h"*/
#include "private/vmLibP.h"
#include "t38fax.h"
#include "rtpmib.h"
#include "globalVarDef.h"
#include "Protocol\Attache\Transport\Include\port_numbers.h"
#include "voip/include/voip_ex.h"

/*#include <ip_ex.h>*/
#if INSTALL_ON_IXP1200
#define LN_BUFFER_CACHE_INVALIDATE(address, len) \
        CACHE_DRV_INVALIDATE (&cacheUserFuncs, (address), (len))
#define LN_BUFFER_CACHE_FLUSH(address, len) \
        CACHE_DRV_FLUSH (&cacheUserFuncs, (address), (len))
#else
#define LN_BUFFER_CACHE_INVALIDATE(address, len)
#define LN_BUFFER_CACHE_FLUSH(address, len)
#endif

RPPH   RPPH_value[MAX_PIN_NUM];
UINT32 M803xxReceiveRTPPacketCount[M803XX_MAX_PORT_NUM * MAX_PIN_NUM];
UINT32 M803xxReceiveRTCPPacketCount[M803XX_MAX_PORT_NUM * MAX_PIN_NUM];
UINT32 M803xxSendRTPPacketCount[M803XX_MAX_PORT_NUM * MAX_PIN_NUM];
UINT32 M803xxSendRTCPPacketCount[M803XX_MAX_PORT_NUM * MAX_PIN_NUM];
UINT32 M803xxReceiveUDPTLPacketCount[M803XX_MAX_PORT_NUM * MAX_PIN_NUM];
UINT32 M803xxSendUDPTLPacketCount[M803XX_MAX_PORT_NUM * MAX_PIN_NUM];

UINT16 RtpPortNumber[MAX_CID_NUM], RtcpPortNumber[MAX_CID_NUM];

RtpSessionValue  RtpValue[MAX_CID_NUM];
FaxSessionValue  FaxValue[MAX_CID_NUM];

UINT8  First_Flag[MAX_CID_NUM] = {0};
UINT16 Tone_Parameter[MAX_TONE_NUM * 30] =
                                      {0xff00, 0,0,0,0,0,0,0, 450, 100, 0,0, 1000, 0, 0,0,
                                       0xff00, 0,0,0,0,0,0,0, 450, 100, 0,0, 1000, 4000, 0,0,
                                       0xff00, 0,0,0,0,0,0,0, 450, 100, 0,0, 700, 700, 0,0,
                                       0xff00, 0,0,0,0,0,0,0, 450, 100, 0,0, 350, 350, 0,0,
                                       0xff00, 0,0,0,0,0,0,0, 450, 100, 0,0, 100, 100,0,0,
                                                              450, 100, 0,0, 100, 100,0,0,
                                                              450, 100, 0,0, 100, 100,0,0,
                                                              450, 100, 0,0, 400, 400,0,0,
                                       0xff00, 0,0,0,0,0,0,0, 950, 100, 0,0, 1000, 0,0,0,
                                      };
UINT16 Tone_Parameter_Len[MAX_TONE_NUM] = {16, 16, 16, 16, 40, 16};
UINT16 Tone_Parameter_Start[MAX_TONE_NUM] = {0, 16, 32, 48, 64, 104};

UINT16 RemainedTxCmdNum[M803XX_MAX_PORT_NUM * MAX_PIN_NUM];
UINT16 TxCmdFifoOverflowFlag[M803XX_MAX_PORT_NUM * MAX_PIN_NUM];
UINT32 ReceivePacketCount[M803XX_MAX_PORT_NUM * MAX_PIN_NUM] = {0};

LOCAL UINT8 SendPktToQueue(UINT8 * buf, int nLen, int PortNo, packet * p);

UINT8 senddtmf[64]={0};
int VoIP_CID_Printf = 0;
extern int VoIP_Call_Printf;


/*extern void endPktFree(char* buff );*/


unsigned long Swap_DwordM( unsigned long in )
{
#if INSTALL_ON_IXP1200
    return  (((in&0xff000000)>>24)|((in&0x00ff0000)>>8)|
            ((in&0x0000ff00)<<8 )|((in&0x000000ff)<<24));
#else
    return (in);
#endif
}

UINT16 Swap_WordM(UINT16 in )
{
#if INSTALL_ON_IXP1200
    return  (((in&0xff00)>>8)|((in&0x00ff)<<8));

#else       /*PPC 8240*/
    return (in);
#endif
}

/*************************************************************************/
/* Function name: InitRtpSessionValue                                    */
/* Description  : Init rtp session value                                 */
/* Return type  : void                                                   */
/* Argument     :                                                        */
/* Author/Date  :                                                        */
/* Note:  This function is provided for MIB interface                    */
/*************************************************************************/
void InitRtpSessionValue(UINT8 PortNo)
{
    memset(&RtpValue[PortNo], 0, sizeof(RtpSessionValue));
}

/*************************************************************************/
/* Function name: InitFaxSessionValue                                    */
/* Description  : Init fax session value                                 */
/* Return type  : void                                                   */
/* Argument     :                                                        */
/* Author/Date  :                                                        */
/* Note:                                                                 */
/*                                                                       */
/*************************************************************************/
void InitFaxSessionValue(UINT8 PortNo)
{
    memset(&FaxValue[PortNo], 0, sizeof(FaxSessionValue));
}

/*************************************************************************/
/* Function name: SelectRPPHParameter                                    */
/* Description  : Select RPPH Parameter                                  */
/* Return type  : void                                                   */
/* Argument     : PortNo -- No. of Port Num                              */
/* Author/Date  :                                                        */
/* Note:                                                                 */
/*                                                                       */
/*************************************************************************/
void SelectRPPHParameter(UINT8 PortNo)
{
    UINT8    name,lpwinitial,PinNo;

    PinNo = CON_TO_DP[m_port[PortNo].Channel].chip;
    name = (UINT8)(Parameter[PortNo].bearerInformation);

    lpwinitial=(UINT8)(Parameter[PortNo].JitterValue);

    if((lpwinitial<20)||(lpwinitial>200))
        lpwinitial=20;

    switch(name)
    {
        case  CODER_TYPE_G711Alaw: /* g711Alaw64k */
        case  CODER_TYPE_G711Ulaw: /* g711Ulaw64k */
            RPPH_value[PinNo].LPWmin = 20;
            RPPH_value[PinNo].LPWmax = 200;
            RPPH_value[PinNo].LPWinitial = lpwinitial;
            RPPH_value[PinNo].LPR = 0;
            RPPH_value[PinNo].MAT = 250;
            RPPH_value[PinNo].DT = 280;
            RPPH_value[PinNo].HardSoftmode = 1;

            break;

        case  6:
        case  CODER_TYPE_G723:/* g7231 */
            RPPH_value[PinNo].LPWmin = 20;
            RPPH_value[PinNo].LPWmax = 200;
            RPPH_value[PinNo].LPWinitial = lpwinitial;
            RPPH_value[PinNo].LPR = 0;
            RPPH_value[PinNo].MAT = 265;
            RPPH_value[PinNo].DT = 510;
            RPPH_value[PinNo].HardSoftmode = 0;

            break;

        #if 0
        case CODER_TYPE_G728:  /* G728 */
            RPPH_value[PinNo].LPWmin = 20;
            RPPH_value[PinNo].LPWmax = 200;
            RPPH_value[PinNo].LPWinitial = lpwinitial;
            RPPH_value[PinNo].LPR = 0;
            RPPH_value[PinNo].MAT = 230;
            RPPH_value[PinNo].DT = 500;
            RPPH_value[PinNo].HardSoftmode = 0;

            break;
        #endif
        case  CODER_TYPE_G729:  /* G729 */
        case  CODER_TYPE_G729a:
        case  CODER_TYPE_G729wb:  
        case  CODER_TYPE_G729awb:
            RPPH_value[PinNo].LPWmin = 20;
            RPPH_value[PinNo].LPWmax = 200;
            RPPH_value[PinNo].LPWinitial = lpwinitial;
            RPPH_value[PinNo].LPR = 0;
            RPPH_value[PinNo].MAT = 235;
            RPPH_value[PinNo].DT = 500;
            RPPH_value[PinNo].HardSoftmode = 0;

            break;

        case  CODER_TYPE_T38:  /* T38 fax */
            break;

        default:
            RPPH_value[PinNo].LPWmin = 20;
            RPPH_value[PinNo].LPWmax = 200;
            RPPH_value[PinNo].LPWinitial = lpwinitial;
            RPPH_value[PinNo].LPR = 0;
            RPPH_value[PinNo].MAT = 235;
            RPPH_value[PinNo].DT = 500;
            RPPH_value[PinNo].HardSoftmode = 0;
            break;
    }
}

/*************************************************************************/
/* Function name: SelectVocoderType                                      */
/* Description  : Select Vocoder Type                                    */
/* Return type  : UINT16                                                 */
/* Argument     : PortNo -- No. of Port Num                              */
/* Author/Date  :                                                        */
/* Note:                                                                 */
/*                                                                       */
/*************************************************************************/
UINT16 SelectVocoderType(UINT8 PortNo)
{
    UINT8    name;
    UINT16  Type;

    /*2006-3-28 Added by ZhengQishan, 传真和语音的参数不一样*/
    if (m_port[PortNo].ExpectServiceType == Fax)
        name = (UINT8)(gpT38FaxParameter[PortNo]->bearerInformation);
    else
        name = (UINT8)(Parameter[PortNo].bearerInformation);

    switch(name)
    {
        case  CODER_TYPE_G711Alaw:
            Type = 0x0880;  /* G711Alaw */
            break;

        case  CODER_TYPE_G711Ulaw:
            Type = 0x80;  /* G711Ulaw */
            break;

        case  CODER_TYPE_G723:
            Type = 0x0480;  /* G723 */
            break;

        #if 0
        case CODER_TYPE_G728:
            Type = 0x0F80; /* G728 */
            break;
        #endif
        case  CODER_TYPE_G729:           /* G729 */
        case  CODER_TYPE_G729a:          /* G729a */ 
        case  CODER_TYPE_G729wb:         /* G729wb */
        case  CODER_TYPE_G729awb:        /* G729awb */
            Type = 0x1280;  
            break;

        case  CODER_TYPE_T30:           /* T30 */
        case  CODER_TYPE_T38:           /* T38 */
            Type = 0x6280; 
            break;

        default:
            Type = 0x1280;  /* G729 */
            break;
    }

    return Type;
}

UINT16 SelectPackLen(UINT8 PortNo)
{
    UINT8    name;
    UINT16   Len;

    /*2006-3-28 Added by ZhengQishan, 传真和语音的参数不一样*/
    if (m_port[PortNo].ExpectServiceType == Fax)
        name = (UINT8)(gpT38FaxParameter[PortNo]->bearerInformation);
    else
        name = (UINT8)(Parameter[PortNo].bearerInformation);

    switch(name)
    {
        case  CODER_TYPE_G711Alaw:
        case  CODER_TYPE_G711Ulaw:
            Len = 40;  /* G711Alaw/G711ulaw */
            break;

        case  6:
        case  CODER_TYPE_G723:
            Len = 24;  /* G7231 */
            break;

        #if 0
        case CODER_TYPE_G728:
            Len = ; /* G728 */
            break;

        case  CODER_TYPE_T38:
            Len = ; /* T38 fax */
            break;
        #endif
        case  CODER_TYPE_G729:           /* G729 */
        case  CODER_TYPE_G729a:          /* G729a */ 
        case  CODER_TYPE_G729wb:         /* G729wb */
        case  CODER_TYPE_G729awb:        /* G729awb */
            Len = 10;  /* G729 */
            break;

        default:
            Len = 10;  /* G729 */
            break;
    }

    return Len;
}

/************************************************************
*    0 G.711 u-law PCM audio 5 ms
*    4 G.723.1 audio 30 ms
*    8 G.711 A-law PCM audio 5 ms
*    15 G.728 audio 5 ms
*    18 G.729A audio 10 ms
*    N/A G.726 audio 5 ms
*    N/A G.727 audio 5 ms
*    N/A GSM-FR audio 20 ms
************************************************************/
UINT16 SelectVoiceOptionValue(UINT8 PortNo)
{
    M803xx_PORT_STATE   *PortPtr;
    #if 0
    UINT8   FrameNumInOneRTPPacket;
    #endif
    UINT16 opt_value;
    UINT8   VADOption; /* voice activity detection options */

    PortPtr = (M803xx_PORT_STATE *)&m_port[PortNo];

    #if 0
    FrameNumInOneRTPPacket = Parameter[PortNo].frameNum;
    FrameNumInOneRTPPacket = 0;
    #endif
    /* 0x30:no Vad; 0x70:vad send silence packet; 0xb0:vad */
    if( Parameter[PortNo].VAD )
    {
        VADOption = 0xb0;/* 0xb0 */
    }
    else
    {
        VADOption = 0x30;/* modify 0x70 -> 0x30 by caowm 2003/06/25 */
        if( !(Parameter[PortNo].CNG) )
            VADOption = VADOption | 0x02;
    }

⌨️ 快捷键说明

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