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

📄 mh_endpoint.c

📁 h323源代码的另一部分
💻 C
字号:
/////////////////////////////////////////////////////////////////////// mh_endpoint.c//// handset/endpoint related event handling module for MH2 app//// Copyright Netergy Microelectronics  2000, 2001//////////////////////////////////////////////////////////////////////#include "NNstyle.h"#include <string.h>#include <stdlib.h>#include "digitmap.h"#include "endpoint.h"#include "common.h"////////////////////////////////////////////////////////////////////// EndPointProcessRedialEvent////  Process redial event: generaqte DTMF tone and dial////////////////////////////////////////////////////////////////////ENDPOINT_EVENT EndPointProcessRedialEvent(END_POINT* pEndPoint,                                          CALL* pCall,                                          ENDPOINT_EVENT eEvent){  /* nothing to do */  return eEvent;}////////////////////////////////////////////////////////////////////// EndPointEncodeDtmf////  Start/stop encoding inband DTMF signalling for keypad input////////////////////////////////////////////////////////////////////void EndPointEncodeDtmf(END_POINT *pEndPoint,                        CALL* pCall,                        char chKey,                        BOOL bStart){  /* nothing to do */}////////////////////////////////////////////////////////////////////// EndPointDisplayCallerID////  control DFSK to send caller ID info to handset////////////////////////////////////////////////////////////////////void EndPointDisplayCallerID(END_POINT *pEndPoint,                             char *pchCallerName, char *pchCallerNumber){  CALLER_ID_INFO xCID;  memset(&xCID, 0, sizeof(CALLER_ID_INFO));  if (pchCallerName) {    strncpy(xCID.pcCallerName, pchCallerName,CALLERNAME_MAX_LENGTH);  }   if (pchCallerNumber) {    char chString[20];    sprintf(chString,"Incoming %s",pchCallerNumber);    strncpy(xCID.pcCallerNumber, pchCallerNumber,CALLERNUMBER_MAX_LENGTH);    EndPointDisplayString(pEndPoint, chString);  }  EndPointsDisplayCallerID(pEndPoint->wChannel, &xCID);}////////////////////////////////////////////////////////////////////// EndPointUpdateHoldIndicator////  correctly represents the existence of held call by examinig call//  states////////////////////////////////////////////////////////////////////void EndPointUpdateHoldIndicator(END_POINT *pEndPoint){  /* nothing to do */}#if 0static void _ProcVoipEnable(END_POINT *pEndPoint);#ifdef FXO_SUPPORTstatic void _ProcVoipDisable(END_POINT *pEndPoint);BOOL g_bVoipDisable = FALSE;#endifstatic ENDPOINT_EVENT _FxsDialPlanMatch(END_POINT *pEndPoint){  dfe  char *pchDialString = pEndPoint->szEventString;  if (pEndPoint->szEventString[0] == '#' && strlen(pchDialString) == 1) {    char chParamName[10];    char chParamValue[CONFIG_MAXPARAMLENGTH+1];        sprintf(chParamName, "USER%c", chKey);    if (ConfigGetParam(chParamName,chParamValue,CONFIG_MAXPARAMLENGTH)!=CONFIG_OK) {      return EVENT_NONE;    } else {      StrCpy(pEndPoint->szDialString, chParamValue, sizeof(pEndPoint->szDialString));      sprintf(chParamName, "HOST%c", chKey);      if (ConfigGetParam(chParamName,chParamValue,CONFIG_MAXPARAMLENGTH)==CONFIG_OK) {        StrCpy(pEndPoint->szSipUrlHost, chParamValue, sizeof(pEndPoint->szSipUrlHost));      }      sprintf(chParamName, "PORT%c", chKey);      if (ConfigGetParam(chParamName,chParamValue,CONFIG_MAXPARAMLENGTH)!=CONFIG_OK ||          (pEndPoint->wSipUrlPort = strtoul(chParamValue,NULL,0)) == 0) {        pEndPoint->wSipUrlPort = 5060; /* Default SIP port */      }      pEndPoint->oDialout = DIALOUT_VOIP_DIRECTCALL;      return EVENT_DIAL_MATCH;    }  }  if (*pchDialString == '9') {    /* Prefix 9: PSTN call */    pEndPoint->oDialout = DIALOUT_PSTN;    strcpy(pEndPoint->szDialString, pchDialString+1); /* strip of digit 9 */      } else {    pEndPoint->oDialout = DIALOUT_VOIP;    strcpy(pEndPoint->szDialString, pchDialString); /* strip of digit 9 */  }  pEndPoint->szEventString[0] = '\0';  return EVENT_DIAL_MATCH;}////////////////////////////////////////////////////////////////////// EndPointProcess////  process endpoint event including keypad, hook and function key input////////////////////////////////////////////////////////////////////void EndPointProcess(END_POINT *pEndPoint){  pthread_mutex_lock(&(pEndPoint->mMutex));#ifndef FXO_SUPPORT  _ProcVoipEnable(pEndPoint);#else  if (g_bVoipDisable) {    _ProcVoipDisable(pEndPoint);  } else {    _ProcVoipEnable(pEndPoint);  }#endif  pthread_mutex_unlock(&(pEndPoint->mMutex));}#ifdef FXO_SUPPORTstatic void _ProcVoipDisable(END_POINT *pEndPoint){  unsigned char chKey[20];  E_HANDSET_RETURN_VALUES eReturn;  E_FXO_RETURN_VALUES eFxoRet;  //H_MEDIA_STREAM hStream;  eReturn = HandsetProcess(pEndPoint->wChannel, chKey);  if (eReturn != HANDSET_NO_EVENT) {    printf("HandsetProcess() %d, chKey %d\n", eReturn, chKey[0]);  }  switch(eReturn) {  case HANDSET_ON_HOOK_EVENT:    FxoOnHook(pEndPoint->hInstFxo);    //    FxoDestroyStream(pEndPoint->hInstFxo);    break;  case HANDSET_OFF_HOOK_EVENT:    FxoOffHook(pEndPoint->hInstFxo);    //hStream = FxoCreateStream(pEndPoint->hInstFxo);    //MediaStreamStatus(hStream, PROTOCOL_TXRX_RX);    break;  case HANDSET_KEY_DOWN_EVENT:    FxoPlaceDigit(pEndPoint->hInstFxo, chKey[0]);    break;  default:    break;  }  eFxoRet = FxoProcess(pEndPoint->hInstFxo);  switch (eFxoRet) {    case FXO_RING_ON:      EndPointTone(pEndPoint, HANDSET_RING_CADENCE_0, ON);      break;    case FXO_RING_OFF:      EndPointTone(pEndPoint, HANDSET_RING_CADENCE_0, OFF);      break;    default:      break;  }}#endifstatic void _ProcVoipEnable(END_POINT *pEndPoint){  E_HANDSET_RETURN_VALUES eReturn;  ENDPOINT_EVENT eEvent = EVENT_NONE;  CALL *pCall=NULL;  CALL *pCallComp=NULL;  unsigned char chKey[20];#ifdef FXO_SUPPORT  {    E_FXO_RETURN_VALUES eFxoRet = FxoProcess(pEndPoint->hInstFxo);    PROTOCOL_CBKDATA xData;        eEvent = EVENT_NONE;    memset(&xData, 0, sizeof(PROTOCOL_CBKDATA));    switch (eFxoRet) {    case FXO_RING_ON:      eEvent = EVENT_CBK_INCOMING;      break;    case FXO_RING_OFF:    case FXO_DISCONNECT:      pCall = EndPointFindCallHandle(pEndPoint, 0);      if (pCall) {	eEvent = EVENT_CBK_DISCONNECTED;      }      break;    default:      break;    }    if (eEvent != EVENT_NONE) {      pEndPoint->fpHandler(eEvent, pEndPoint, 0, &xData);    }        eEvent = EVENT_NONE;  }#endif  pCall = EndPointFindCallState(pEndPoint,CALL_ALERT|CALL_CONNECT);  pCallComp = EndPointFindCallState(pEndPoint,CALL_CONNECT);  eReturn = HandsetProcess(pEndPoint->wChannel, chKey);  if (g_bH323InitOK) {    switch(eReturn) {    case HANDSET_ON_HOOK_EVENT:      eEvent = EVENT_ON_HOOK;      break;    case HANDSET_OFF_HOOK_EVENT:      eEvent = EVENT_OFF_HOOK;      break;    case HANDSET_FLASH_HOOK_EVENT:      eEvent = EndPointEvent(pEndPoint, 'F');      break;    case HANDSET_T38_START:      DEBUG(EPLOG(LOG_INFO,pEndPoint,"\nT38_START\n"));      eEvent = EVENT_T38_START;      break;    case HANDSET_T38_STOP:      DEBUG(EPLOG(LOG_INFO,pEndPoint,"\nT38_STOP\n"));      eEvent = EVENT_T38_STOP;      break;    case HANDSET_FAX_TONE_EVENT:    case HANDSET_ANSWER_TONE_EVENT:      eEvent = EVENT_FAX_DETECTED;      break;    case HANDSET_KEY_DOWN_EVENT:    case HANDSET_PULSE_DIAL_EVENT:      eEvent = EndPointEvent(pEndPoint, chKey[0]);      break;        case HANDSET_KEY_UP_EVENT:      /* reset timer */      pEndPoint->dwTimer=0;    default:      break;    }    // process OOB DTMF, RFC2833 events    EndPointTelephoneEvent(pEndPoint, eReturn, chKey[0]);    if (eEvent == EVENT_NONE &&         strlen(pEndPoint->szEventString) &&        pEndPoint->dwTimer > DIAL_TIMEOUT) {      /* check dial plan when dial timer expired */      eEvent = _FxsDialPlanMatch(pEndPoint);      pEndPoint->dwTimer = 0;    }    if (pEndPoint->hInstance) {      pEndPoint->fpHandler(eEvent, pEndPoint, 0, NULL);    }    pEndPoint->dwTimer++;    if (g_eKeypadType == KEYPADTYPE_H245_SIGNAL &&         pEndPoint->wDtmfUpdate &&        (pEndPoint->dwTimer-pEndPoint->dwDtmfTimer)>(pEndPoint->wDtmfUpdate-10)) { /* 100 ms margin */      pEndPoint->wDtmfUpdate += 50;      /* Send out H245 Signal update with the full duration */      H323CallSendDTMF(pEndPoint->hInstance,                       pCall->hCall, NULL,                       H323INFO_H245SIGNALUPDATE,                       pEndPoint->wDtmfUpdate * 10);      if (pEndPoint->wDtmfUpdate > 1000) {        /* To prevent error, stop DTMF signal after 10 seconds */        pEndPoint->wDtmfUpdate = 0;      }    }    if (pEndPoint->wDtmfPlayTimeout &&        (pEndPoint->dwTimer-pEndPoint->dwDtmfPlayTime)>(pEndPoint->wDtmfPlayTimeout)) {      EndPointTone(pEndPoint, AUDIO_TONE_ALL, OFF);      pEndPoint->wDtmfPlayTimeout = 0;    }  }}#endif

⌨️ 快捷键说明

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