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

📄 h323f.cpp

📁 基于h323协议的软phone
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	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 + -