📄 tlphevent.c
字号:
/******************************************************************** * * File: tlphevent.c * * Description: * Functions needed to implement to support RFC2833 (Nuera) * * Revisions: * 04-may-01 J.H and S.J.M initial version. * * Copyright 2003 Netergy Microelectronics, Inc. All rights reserved. * ********************************************************************/#include "h248app.h"/* OOB Telephone Events */BOOL g_bOOBTelephoneEvents = FALSE;BOOL g_bDropVoiceDuringEvents = FALSE;BOOL g_bSquelchDTMF = FALSE;DWORD g_dwTeleventPayload = DEFAULT_TELEPHONE_EVENT_PAYLOAD;/************************************************************************** * _ProcessMismatchingRTPPacket * Process any RTP packets that do not belong to the audio codec * pConn - connection on which mismatching packet arrived * pxPacketRx - the packet **************************************************************************/void _ProcessMismatchingRTPPacket(CONNECTION *pConn, RTP_CBKDATA_PACKETRX *pxPacketRx){#if 0 if (pxPacketRx->oPayload == g_dwTeleventPayload) { /* Possibly a telephone event */ // DWORD dwEvent = htonl(*(DWORD *)(pxPacketRx->poData)); DWORD dwEvent = htonl(*(DWORD *)(pxPacketRx->poData)); printf("Possible Telephone Event=%ld, e=%ld, volume=%ld, duration=%ld\n", dwEvent >> 24, (dwEvent >> 23) & 1, (dwEvent >> 16) & 0x3f, dwEvent & 0xffff); /* We are only interested in the ABCD signalling events to * control the handset ringer (for now) */ switch(dwEvent >> 24) { case TELEPHONE_EVENT_ABCD_RING_ON: /* Turn the handset ringer on */ HandsetGenerateTone( pConn->pEndPoint->wChannel, AUDIO_RINGTONE,ON); break; case TELEPHONE_EVENT_ABCD_RING_OFF: /* Turn the handset ringer on */ HandsetGenerateTone( pConn->pEndPoint->wChannel, AUDIO_RINGTONE,OFF); break; } }#endif }/************************************************************************** * _SendRTPTelephoneEvent * Sends a telephone event over RTP using RFC2833 * dwEventType - the MGCP event code * bStatus - 1=start sending, 0=stop sending **************************************************************************/void _SendRTPTelephoneEvent(END_POINT *pEndPoint, E_H248_EVENTTYPE eEvent, BOOL bStatus){#if 0 /* Send out RTP DTMF info on all active connections */ /* USE DYNAMIC RTP PAYLOAD TYPE */ if(!g_bOOBTelephoneEvents) return; pthread_mutex_lock(&(pEndPoint->mMutex)); { CONNECTION *pConn = ConnFindEndpoint(pEndPoint); if (pConn != NULL) { TELEPHONE_EVENT_CODE eRTPEvent = 0; /* Get the RFC2833 event code from the event type */ switch(eEvent) { case H248_EVENT_L_DTMF_0: eRTPEvent = TELEPHONE_EVENT_DTMF_0; break; case H248_EVENT_L_DTMF_1: eRTPEvent = TELEPHONE_EVENT_DTMF_1; break; case H248_EVENT_L_DTMF_2: eRTPEvent = TELEPHONE_EVENT_DTMF_2; break; case H248_EVENT_L_DTMF_3: eRTPEvent = TELEPHONE_EVENT_DTMF_3; break; case H248_EVENT_L_DTMF_4: eRTPEvent = TELEPHONE_EVENT_DTMF_4; break; case H248_EVENT_L_DTMF_5: eRTPEvent = TELEPHONE_EVENT_DTMF_5; break; case H248_EVENT_L_DTMF_6: eRTPEvent = TELEPHONE_EVENT_DTMF_6; break; case H248_EVENT_L_DTMF_7: eRTPEvent = TELEPHONE_EVENT_DTMF_7; break; case H248_EVENT_L_DTMF_8: eRTPEvent = TELEPHONE_EVENT_DTMF_8; break; case H248_EVENT_L_DTMF_9: eRTPEvent = TELEPHONE_EVENT_DTMF_9; break; case H248_EVENT_L_DTMF_STAR: eRTPEvent = TELEPHONE_EVENT_DTMF_star; break; case H248_EVENT_L_DTMF_POUND: eRTPEvent = TELEPHONE_EVENT_DTMF_hash; break; case H248_EVENT_L_DTMF_A: eRTPEvent = TELEPHONE_EVENT_DTMF_a; break; case H248_EVENT_L_DTMF_B: eRTPEvent = TELEPHONE_EVENT_DTMF_b; break; case H248_EVENT_L_DTMF_C: eRTPEvent = TELEPHONE_EVENT_DTMF_c; break; case H248_EVENT_L_DTMF_D: eRTPEvent = TELEPHONE_EVENT_DTMF_d; break; case H248_EVENT_L_HF: eRTPEvent = TELEPHONE_EVENT_DTMF_flash; break; case H248_EVENT_L_HD: eRTPEvent = TELEPHONE_EVENT_ABCD_OFF_HOOK; break; case H248_EVENT_L_HU: eRTPEvent = TELEPHONE_EVENT_ABCD_ON_HOOK; break; default: /* RTP event code not known ? */ pthread_mutex_unlock(&(pEndPoint->mMutex)); return; } if (bStatus) { LONG lEventDuration; if ((eRTPEvent <= TELEPHONE_EVENT_ABCD_OFF_HOOK && eRTPEvent >= TELEPHONE_EVENT_ABCD_ON_HOOK) || (eRTPEvent == TELEPHONE_EVENT_DTMF_flash)) { lEventDuration = ONE_TIME_TRIPLE_REDUNDANCY; } else { lEventDuration = 100; /* 100ms */ } RTPInstanceStartTelephoneEvent(pConn->hRtpTxInstance, g_dwTeleventPayload, eRTPEvent, lEventDuration, g_bDropVoiceDuringEvents, TRUE); /* synchronise with voice */ } else { RTPInstanceStopTelephoneEvent(pConn->hRtpTxInstance, g_dwTeleventPayload, eRTPEvent); } } } pthread_mutex_unlock(&(pEndPoint->mMutex));#endif}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -