📄 h323f.cpp
字号:
digit_set[num_digits] = msg->digit+'0';
if (digit_set[num_digits] == '0' + 10)
digit_set[num_digits] = '*';
else if (digit_set[num_digits] == '0' + 11)
digit_set[num_digits] = '#';
digit_set[num_digits+1] = '\0';
/* LcdShowDigit(digit_set[num_digits], FALSE);*/
/* 设置等待后续拨号的计时器 */
DeleteTimer(&h323_timer);
h323_timer = CreateTimer(FIFTEEN_SEC);
num_digits++;
if (!gkEnabled &&num_digits == digitCollectAmount/* || (msg->digit == 11)*/)
{
return AppCalloutDirect();
}
return null_event;
}
/**
* 提供速拨功能:
* 若已输入的号码在电话本的号码编号范围以内,
* 则拨出对应编号的电话号码
*/
int h323_collect_digits_state_long_digit_event(s_event* psEvent, s_task* psTask)
{
return null_event;
}
/**
* 返回忙或进行呼叫转移
*/
int h323_collect_digits_state_receive_query_availability_event(s_event* psEvent,
s_task* psTask)
{
/* H323TRACE("action: h323_collect_digits_state_receive_query_availability_event\n");
wp_msg = (WrapperMsg *) psEvent->pMsg;
AppReplyNotAvailOrFwd(wp_msg);
return null_event;*/
AppSendWrapper( WP_SEND_AVA, callIndex );
return null_event;
}
/**
* 终结terminate所指通道的通话
*/
int h323_collect_digits_state_receive_terminate_event(s_event* psEvent, s_task*
psTask)
{
/* H323TRACE("action: h323_collect_digits_state_receive_terminate_event\n");*/
return null_event;
}
/**
* 发送当前的号码(WP_SEND_QUERY_AVA),记录拨出电话;
* 若出错产生to_dead_end_state事件
*/
int h323_collect_digits_state_callout_key_event(s_event* psEvent, s_task*
psTask)
{
/* H323TRACE("action: h323_collect_digits_state_callout_key_event\n");*/
return callout(null_event);
}
/**
* 发送当前的号码(WP_SEND_QUERY_AVA),记录拨出电话;
* 产生to_query_availability_state事件;
* 若出错产生to_dead_end_state事件
*/
int h323_collect_digits_state_timeout_event(s_event* psEvent, s_task* psTask)
{
return null_event;
}
/**
* 终结,回到初始状态
*/
int h323_collect_digits_state_local_on_hook_event(s_event* psEvent, s_task*
psTask)
{
AppTerminateAction( ST_H323_COLLECT_DIGITS_STATE );
return null_event;
}
/**
* 已输入的号码向前清除一位
*/
int h323_collect_digits_state_cancel_key_event(s_event* psEvent, s_task* psTask)
{
digit_set[--num_digits] = '\0';
/* if (num_digits > LCD_WIDTH)
{
ClearLcd();
WriteLcd(digit_set, 0, 0);
LcdDShowCursor(TRUE);
return null_event;
}*/
/* LcdShowMessage(H323_TRANSFER_NUMBER);
WriteLcd(digit_set, 1, 0);
LcdDShowCursor(TRUE);
*/
if (num_digits == 0)
{
return to_wait_first_digit_state;
}
return null_event;
}
/**
* 清空所有输入的内容,
* 回到wait_first_digit_state状态
*/
int h323_collect_digits_state_long_cancel_key_event(s_event* psEvent, s_task*
psTask)
{
return null_event;
}
int h323_collect_digits_state_to_dead_end_state(s_event* psEvent, s_task*
psTask)
{
/* H323TRACE("action: h323_collect_digits_state_to_dead_end_state\n");*/
return null_event;
}
int h323_collect_digits_state_to_bidir_voice_state(s_event* psEvent, s_task*
psTask)
{
/* H323TRACE("action: h323_collect_digits_state_to_bidir_voice_state\n");*/
/* PreserveLcdMessage = FALSE;*/
return null_event;
}
int h323_collect_digits_state_to_wait_first_digit_state(s_event* psEvent,
s_task* psTask)
{
/* H323TRACE("action: h323_collect_digits_state_to_wait_first_digit_state\n");*/
return null_event;
}
int h323_collect_digits_state_to_query_availability_state(s_event* psEvent,
s_task* psTask)
{
/* H323TRACE("action: h323_collect_digits_state_to_query_availability_state\n");*/
return null_event;
}
int h323_query_availability_state_to_bidir_voice_state(s_event* psEvent, s_task*
psTask)
{
/* H323TRACE("action: h323_query_availability_state_to_bidir_voice_state\n");
PreserveLcdMessage = FALSE;*/
return null_event;
}
int h323_query_availability_state_to_on_hook_state(s_event* psEvent, s_task*
psTask)
{
/* H323TRACE("action: h323_query_availability_state_to_on_hook_state\n");*/
return null_event;
}
int h323_query_availability_state_to_dead_end_state(s_event* psEvent, s_task*
psTask)
{
/* H323TRACE("action: h323_query_availability_state_to_dead_end_state\n");*/
return null_event;
}
/* 封装返回忙或呼叫转移的处理流程 */
void AppReplyNotAvailOrFwd(WrapperMsg *wp_msg)
{
char callNID[LENGTH_LOCAL_ID+1]; /* Caller Terminal's numeric (E.164) ID */
unsigned char callIPAddr[5]; /* Caller's IP address */
char number[MAX_PHONE_NUMBER_LEN+1];
char temp[MAX_PHONE_NUMBER_LEN+1];
callIPAddr[3] = wp_msg->baseInfo.remoteIpAddr>> 24;
callIPAddr[2] = (wp_msg->baseInfo.remoteIpAddr >> 16) & 0xFF;
callIPAddr[1] = (wp_msg->baseInfo.remoteIpAddr >> 8) & 0xFF;
callIPAddr[0] = wp_msg->baseInfo.remoteIpAddr & 0xFF;
sprintf(number, "*%03u%03u%03u%03u", callIPAddr[0], callIPAddr[1],
callIPAddr[2], callIPAddr[3]);
callNID[0] = 0;
/* changed peer number to be passed in unused TransferringNumber field */
if(gkEnabled)
{
strncpy(callNID, wp_msg->baseInfo.remoteE164Num,LENGTH_LOCAL_ID);
callNID[LENGTH_LOCAL_ID]='\0';
strncpy(number, callNID,MAX_PHONE_NUMBER_LEN);
number[MAX_PHONE_NUMBER_LEN]='\0';
}
sprintf(temp, "*%03d%03d%03d%03d", localIPNumber[0], localIPNumber[1],
localIPNumber[2], localIPNumber[3]);
/* 拨打号码若为本机则返回忙 */
if ((!gkEnabled && (strcmp(temp, number) == 0))
||(gkEnabled && (strcmp(localE164Num, callNID) == 0)))
{
WpSendMessage( WP_SEND_NOTAVA, wp_msg->baseInfo.callIndex, 0, "", "", "");
return;
}
#if 0
AppGetForwardConfig();
if (ForwardUncond)
{
/* 前转号码若为本机则不做处理 */
if ((!gkEnabled && (strcmp(temp, ForwardNumberUncond) == 0))
||(gkEnabled && (strcmp(localE164Num, ForwardNumberUncond) == 0)))
{
H323TRACE("forward to number == local number\n");
WpSendMessage( WP_SEND_NOTAVA, wp_msg->baseInfo.callIndex, 0, "", "", "");
return;
}
else
{
AppSendCallForward(wp_msg->baseInfo.callIndex,
ForwardNumberUncond, ForwardNumberUncondType);
}
}
else if (ForwardBusy)
{
/* 记录未接来电 */
AppRecordNoAnswerCall(number);
noAnswerCall = 1;
/* 前转号码若为本机则不做处理 */
if ((!gkEnabled && (strcmp(temp, ForwardNumberBusy) == 0))
||(gkEnabled && (strcmp(localE164Num, ForwardNumberBusy) == 0)))
{
H323TRACE("forward to number == local number\n");
WpSendMessage( WP_SEND_NOTAVA, wp_msg->baseInfo.callIndex, 0, "", "", "");
return;
}
else
{
AppSendCallForward(wp_msg->baseInfo.callIndex,
ForwardNumberBusy, ForwardNumberBusyType);
}
}
else /* normal case, just send "not available" */
#endif
{
/* 记录未接来电 */
/* AppRecordNoAnswerCall(number);
noAnswerCall = 1;
*/
WpSendMessage( WP_SEND_NOTAVA, wp_msg->baseInfo.callIndex, 0, "", "", "");
}
}
/**
* 返回忙或进行呼叫转移
*/
int h323_query_availability_state_receive_query_availability_event(s_event*
psEvent, s_task* psTask)
{
wp_msg = (WrapperMsg *) psEvent->pMsg;
AppReplyNotAvailOrFwd(wp_msg);
return null_event;
}
/**
* 停止播放等待铃声;
* 发送WP_SEND_CONN_ACK,接通voice开始通话;
* 若出错则产生to_dead_end_state事件
*/
int h323_query_availability_state_receive_connect_event(s_event* psEvent,
s_task* psTask)
{
return null_event;
}
/**
* 终结terminate所指通道的通话
*/
int h323_query_availability_state_receive_terminate_event(s_event* psEvent,
s_task* psTask)
{
AppTerminateAction( ST_H323_QUERY_AVAILABILITY_STATE );
return to_dead_end_state;
}
/**
* 播放忙音,产生to_dead_end_state
*/
int h323_query_availability_state_receive_not_available_event(s_event* psEvent,
s_task* psTask)
{
AppTerminateAction(ST_H323_QUERY_AVAILABILITY_STATE);
return to_dead_end_state;
}
/**
* 收到CFU、CFB重定向消息;
* 向“B”发送CallRerouting.ReturnResult、terminate消息;
* 向"C"发送divertingLegInfo2消息;
* 出错则产生to_dead_end_state事件
*/
int h323_query_availability_state_call_forward_rcvd(s_event* psEvent, s_task*
psTask)
{
return null_event;
}
/**
* 对方无应答,终结呼叫;
* 产生to_dead_end_state事件
*/
int h323_query_availability_state_timeout_event(s_event* psEvent, s_task*
psTask)
{
AppTerminateAction( ST_H323_QUERY_AVAILABILITY_STATE );
return to_dead_end_state;
}
/**
* 终结,回到初始状态
*/
int h323_query_availability_state_local_on_hook_event(s_event* psEvent, s_task*
psTask)
{
AppTerminateAction( ST_H323_QUERY_AVAILABILITY_STATE );
return null_event;
}
/**
* 播放回铃音;
* 设置计时器
*/
int h323_query_availability_state_receive_available_event(s_event* psEvent,
s_task* psTask)
{
wp_msg = (WrapperMsg *) psEvent->pMsg;
callIndex = wp_msg->baseInfo.callIndex;
DeleteTimer(&h323_timer);
h323_timer = CreateTimer(CONNECT_TIME);
return null_event;
}
/**
* 返回忙或进行呼叫转移
*/
int h323_dead_end_state_receive_query_availability_event(s_event* psEvent,
s_task* psTask)
{
wp_msg = (WrapperMsg *) psEvent->pMsg;
AppReplyNotAvailOrFwd(wp_msg);
return null_event;
}
/**
* 终结terminate所指通道的通话
*/
int h323_dead_end_state_receive_terminate_event(s_event* psEvent, s_task*
psTask)
{
return null_event;
}
/**
* 播放催挂音
*/
int h323_dead_end_state_timeout_event(s_event* psEvent, s_task* psTask)
{
msg = (NonWrapperMsg *)psEvent->pMsg;
if ((msg->digit != h323_timer) && (msg->digit != call_forward_timer))
return null_event;
/* 计时器清零 */
h323_timer = -1;
return null_event;
}
/**
* 终结,回到初始状态
*/
int h323_dead_end_state_local_on_hook_event(s_event* psEvent, s_task* psTask)
{
AppTerminateAction( ST_H323_DEAD_END_STATE );
return null_event;
}
/**
* 终结一路通话后,回到另一路通话状态
*/
int h323_dead_end_state_to_bidir_voice_state(s_event* psEvent, s_task* psTask)
{
return null_event;
}
/**
* 返回忙或进行呼叫转移
*/
int h323_wait_for_connect_state_receive_query_availability_event(s_event*
psEvent, s_task* psTask)
{
wp_msg = (WrapperMsg *) psEvent->pMsg;
AppReplyNotAvailOrFwd(wp_msg);
return null_event;
}
/**
* (收到CFU、CFB重定向消息);
* 向“B”发送CallRerouting.ReturnResult、terminate消息;
* 向"C"发送divertingLegInfo2消息,产生to_query_availability_state事件;
* 出错则产生to_dead_end_state事件
*/
int h323_wait_for_connect_state_call_forward_rcvd(s_event* psEvent, s_task*
psTask)
{
char forwardToNumber[40];
wp_msg = (WrapperMsg *)psEvent->pMsg;
/* PreserveLcdMessage = TRUE;
LcdShowMessage(H323_FORWARDING_TO); */
strncpy(forwardToNumber, wp_msg->d.CallForwardInfo.ForwardToNumber, 39);
forwardToNumber[39] = '\0';
/* WriteLcd(forwardToNumber, 1, 0);*/
/* Forward has a cycle, do nothing, goto dead_end_state */
if (wp_msg->d.CallForwardInfo.hasCycle)
{
Sleep(TASKDELAY_ONE_SEC);
AppTerminateAction( ST_H323_WAIT_FOR_CONNECT_STATE);
/* PreserveLcdMessage = TRUE;
LcdShowMessage(H323_CIRCULAR_TOO_MANY_FORWARD);
PlayBusyTone(FIFTEEN_SEC);*/
return to_dead_end_state;
}
/* 通知菜单复位 */
/* menu_event = reset_event;*/
/*H323TRACE("Going to query_availability_state\n");*/
/* 设置等待响应计时器 */
DeleteTimer(&h323_timer);
h323_timer = CreateTimer(TEN_SEC);
return to_query_availability_state;
}
/**
* 终结terminate所指通道的通话
*/
int h323_wait_for_connect_state_receive_terminate_event(s_event* psEvent,
s_task* psTask)
{
wp_msg = (WrapperMsg *) psEvent->pMsg;
if (callIndex != wp_msg->baseInfo.callIndex)
{
return null_event;
}
AppTerminateAction( ST_H323_WAIT_FOR_CONNECT_STATE );
return to_dead_end_state;
}
/**
* 终结当前通话,产生to_dead_end_state事件
*/
int h323_wait_for_connect_state_timeout_event(s_event* psEvent, s_task* psTask)
{
msg = (NonWrapperMsg *)psEvent->pMsg;
if ((msg->digit != h323_timer) && (msg->digit != call_forward_timer))
return null_event;
h323_timer = -1;
AppTerminateAction( ST_H323_WAIT_FOR_CONNECT_STATE );
return to_dead_end_state;
}
/**
* 收到错误消息,取消等待连接
*/
int h323_wait_for_connect_state_receive_error_event(s_event* psEvent, s_task*
psTask)
{
DeleteTimer(&h323_timer);
AppTerminateAction( ST_H323_WAIT_FOR_CONNECT_STATE );
return to_dead_end_state;
}
/**
* 终结,回到初始状态
*/
int h323_wait_for_connect_state_local_on_hook_event(s_event* psEvent, s_task*
psTask)
{
AppTerminateAction( ST_H323_WAIT_FOR_CONNECT_STATE );
return null_event;
}
int h323_wait_for_connect_state_to_dead_end_state(s_event* psEvent, s_task*
psTask)
{
return null_event;
}
int h323_wait_for_connect_state_to_bidir_voice_state(s_event* psEvent, s_task*
psTask)
{
return null_event;
}
#include "mmsystem.h"
#include <afxmt.h>
/*extern RvSemaphore *rtpSem;*/
WAVEFORMATEX pFormat;
WAVEFORMATEX InFormat;
unsigned char lpData[400];
HWAVEOUT hWaveOut;
HWAVEIN hWaveIn;
DWORD DataSize;
WAVEHDR WaveHead;
PBYTE pSaveBuffer,pNewBuffer;
WAVEHDR* WaveInHdr;
CCriticalSection m_soLock;
RvUint32 rtp_last_time = 0;
int closeWav()
{
if(hWaveOut)
{
waveOutReset(hWaveOut);
waveOutClose(hWaveOut);
waveOutUnprepareHeader(hWaveOut,&WaveHead, sizeof(WAVEHDR));
}
return 0;
}
#define QUANT_MASK (0xf) /* Quantization field mask. */
#define SEG_SHIFT (4) /* Left shift for segment number. */
#define SEG_MASK (0x70) /* Segment field mask. */
#define SIGN_BIT (0x80) /* Sign bit for a A-law byte. */
#define BIAS (0x84) /* Bias for linear code. */
#define SIZE_AUDIO_FRAME (960)
int
ulaw2linear(
unsigned char u_val)
{
int t;
/* Complement to obtain normal u-law value. */
u_val = ~u_val;
/*
* Extract and bias the quantization bits. Then
* shift up by the segment number and subtract out the bias.
*/
t = ((u_val & QUANT_MASK) << 3) + BIAS;
t <<= ((unsigned)u_val & SEG_MASK) >> SEG_SHIFT;
return ((u_val & SIGN_BIT) ? (BIAS - t) : (t - BIAS));
}
static short seg_end[8] = {0xFF, 0x1FF, 0x3FF, 0x7FF,
0xFFF, 0x1FFF, 0x3FFF, 0x7FFF};
static int
search(
int val,
short *table,
int size)
{
int i;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -