?? vcsampledlg.cpp
字號:
// VCSampleDlg.cpp : implementation file
//
#include "stdafx.h"
#include "VCSample.h"
#include "VCSampleDlg.h"
#include "VaxVoIP.h"
#include "HelpDlg.h"
#include "Mmsystem.h"
#pragma comment(lib, "Winmm.lib")
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define GENERAL_TIMER_ID 0
#define VOL_LEVEL_TIMER_ID 1
/////////////////////////////////////////////////////////////////////////////
// CVCSampleDlg dialog
CVCSampleDlg::CVCSampleDlg(CWnd* pParent /*=NULL*/)
: CDialog(CVCSampleDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CVCSampleDlg)
m_sProxyLoginId = _T("");
m_sProxyLoginPwd = _T("");
m_sProxyURI = _T("");
m_sOutboundProxy = _T("");
m_sPhoneNumber = _T("");
m_bMicMute = FALSE;
m_bSpkMute = FALSE;
m_sWavFile = _T("");
m_bStartRecording = FALSE;
m_bEnableEchoNoiseCancel = TRUE;
m_bEnableMicBoost = FALSE;
m_bDonotDisturb = FALSE;
m_bGSM610 = TRUE;
m_biLBC = TRUE;
m_bG711ALaw = TRUE;
m_bG711ULaw = TRUE;
m_bEnableAGC = FALSE;
m_bEnableSoundDevices = TRUE;
m_nTotalLines = 8;
m_sPlayWaveFileName = _T("");
m_bPlayListen = FALSE;
m_sTransferPhoneNo = _T("");
m_bPlayRingTone = TRUE;
m_sProxyDisplayName = _T("");
m_bCheckRegisterToProxy = TRUE;
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_pVaxVoIP = new CVaxVoIP;
m_pVaxVoIP->m_pVCSampleDlg = this;
}
void CVCSampleDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CVCSampleDlg)
DDX_Control(pDX, IDC_LIST_AUDIO_IN, m_ctrlStatusAudioInListBox);
DDX_Control(pDX, IDC_LIST_AUDIO_OUT, m_ctrlStatusAudioOutListBox);
DDX_Control(pDX, IDC_PROGRESS_MIC, m_ctrlMicProg);
DDX_Control(pDX, IDC_PROGRESS_SPK, m_ctrlSpkProg);
DDX_Control(pDX, IDC_LIST_LINE_STATUS, m_ctrlLineStatusList);
DDX_Control(pDX, IDC_LOG_LIST_BOX, m_ctrlStatusLogListBox);
DDX_Control(pDX, IDC_LIST_INCOMING_CALLS, m_ctrlIncomingCallListBox);
DDX_Control(pDX, IDC_LIST_INCOMING_CALLIDS, m_ctrlIncomingCalIIdListBox);
DDX_Control(pDX, IDC_BUTTON_INIT, m_ctrlInitButton);
DDX_Control(pDX, IDC_COMBO_TRANSFER_SELECT_LINE, m_ctrlTransferSelectLine);
DDX_Control(pDX, IDC_COMBO_INCOMING_CALL_SELECT_LINE, m_ctrlIncomingCallSelectLine);
DDX_Control(pDX, IDC_COMBO_PLAY_WAVE_SELECT_LINE, m_ctrlPlayWaveSelectLine);
DDX_Control(pDX, IDC_COMBO_RECORD_SELECT_LINE, m_ctrlRecordSelectLine);
DDX_Control(pDX, IDC_COMBO_DIAL_SELECT_LINE, m_ctrlDialSelectLine);
DDX_Control(pDX, IDC_SLIDER_MIC, m_MicSlider);
DDX_Control(pDX, IDC_SLIDER_SPEAKER, m_SpkSlider);
DDX_Text(pDX, IDC_EDIT_PROXY_LOGIN_ID, m_sProxyLoginId);
DDX_Text(pDX, IDC_EDIT_PROXY_LOGIN_PWD, m_sProxyLoginPwd);
DDX_Text(pDX, IDC_EDIT_PROXY_URI, m_sProxyURI);
DDX_Text(pDX, IDC_EDIT_OUTBOUND_PROXY, m_sOutboundProxy);
DDX_Text(pDX, IDC_EDIT_PHONE_NUMBER, m_sPhoneNumber);
DDX_Check(pDX, IDC_CHECK_MIC_MUTE, m_bMicMute);
DDX_Check(pDX, IDC_CHECK_SPK_MUTE, m_bSpkMute);
DDX_Text(pDX, IDC_EDIT_FILE_NAME, m_sWavFile);
DDX_Check(pDX, IDC_CHECK_START_RECORDING, m_bStartRecording);
DDX_Check(pDX, IDC_CHECK_ECHO, m_bEnableEchoNoiseCancel);
DDX_Check(pDX, IDC_CHECK_MIC_BOOST, m_bEnableMicBoost);
DDX_Check(pDX, IDC_CHECK_DONOT_DISTURB, m_bDonotDisturb);
DDX_Check(pDX, IDC_CHECK_GSM610, m_bGSM610);
DDX_Check(pDX, IDC_CHECK_ILBC, m_biLBC);
DDX_Check(pDX, IDC_CHECK_G711ALAW, m_bG711ALaw);
DDX_Check(pDX, IDC_CHECK_G711ULAW, m_bG711ULaw);
DDX_Check(pDX, IDC_CHECK_AGC, m_bEnableAGC);
DDX_Check(pDX, IDC_CHECK_SOUND_DEVICE, m_bEnableSoundDevices);
DDX_Text(pDX, IDC_EDIT_TOTAL_LINES, m_nTotalLines);
DDX_Text(pDX, IDC_EDIT_PLAY_WAVE_FILE, m_sPlayWaveFileName);
DDX_Check(pDX, IDC_CHECK_PLAY_WAVE_LISTEN, m_bPlayListen);
DDX_Text(pDX, IDC_EDIT_TRANSFER_PHONE_NO, m_sTransferPhoneNo);
DDX_Check(pDX, IDC_CHECK_PLAY_RING_TONE, m_bPlayRingTone);
DDX_Text(pDX, IDC_EDIT_PROXY_DISPLAY_NAME, m_sProxyDisplayName);
DDX_Check(pDX, IDC_CHECK_REGISTER_TO_SIP, m_bCheckRegisterToProxy);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CVCSampleDlg, CDialog)
//{{AFX_MSG_MAP(CVCSampleDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON_INIT, OnButtonInit)
ON_WM_DESTROY()
ON_BN_CLICKED(IDC_BUTTON_CLEAR, OnButtonClear)
ON_BN_CLICKED(IDC_BUTTON_DIAL, OnButtonDial)
ON_BN_CLICKED(IDC_BUTTON_ACCEPT, OnButtonAccept)
ON_BN_CLICKED(IDC_BUTTON_REJECT, OnButtonReject)
ON_BN_CLICKED(IDC_BUTTON_HANGUP, OnButtonHangup)
ON_BN_CLICKED(IDC_BUTTON_1, OnButton1)
ON_BN_CLICKED(IDC_BUTTON_2, OnButton2)
ON_BN_CLICKED(IDC_BUTTON_3, OnButton3)
ON_BN_CLICKED(IDC_BUTTON_4, OnButton4)
ON_BN_CLICKED(IDC_BUTTON_5, OnButton5)
ON_BN_CLICKED(IDC_BUTTON_6, OnButton6)
ON_BN_CLICKED(IDC_BUTTON_7, OnButton7)
ON_BN_CLICKED(IDC_BUTTON_8, OnButton8)
ON_BN_CLICKED(IDC_BUTTON_9, OnButton9)
ON_BN_CLICKED(IDC_BUTTON_10, OnButton10)
ON_BN_CLICKED(IDC_BUTTON_11, OnButton11)
ON_BN_CLICKED(IDC_BUTTON_12, OnButton12)
ON_WM_HSCROLL()
ON_BN_CLICKED(IDC_CHECK_SPK_MUTE, OnCheckSpkMute)
ON_BN_CLICKED(IDC_CHECK_MIC_MUTE, OnCheckMicMute)
ON_BN_CLICKED(IDC_BUTTON_RESET_RECORDING, OnButtonResetRecording)
ON_BN_CLICKED(IDC_BUTTON_SAVE_TO_WAVE_FILE, OnButtonSaveToWaveFile)
ON_BN_CLICKED(IDC_CHECK_START_RECORDING, OnCheckStartRecording)
ON_BN_CLICKED(IDC_CHECK_ECHO, OnCheckEcho)
ON_BN_CLICKED(IDC_CHECK_MIC_BOOST, OnCheckMicBoost)
ON_BN_CLICKED(IDC_CHECK_DONOT_DISTURB, OnCheckDonotDisturb)
ON_BN_CLICKED(IDC_CHECK_GSM610, OnCheckGsm610)
ON_BN_CLICKED(IDC_CHECK_ILBC, OnCheckiLBC)
ON_BN_CLICKED(IDC_CHECK_G711ALAW, OnCheckG711ALaw)
ON_BN_CLICKED(IDC_CHECK_G711ULAW, OnCheckG711ULaw)
ON_BN_CLICKED(IDC_BUTTON_HELP, OnButtonHelp)
ON_BN_CLICKED(IDC_BUTTON_TRANSFER_CALL, OnButtonTransferCall)
ON_BN_CLICKED(IDC_CHECK_AGC, OnCheckAgc)
ON_BN_CLICKED(IDC_BUTTON_HOLD, OnButtonHold)
ON_BN_CLICKED(IDC_BUTTON_UNHOLD, OnButtonUnhold)
ON_BN_CLICKED(IDC_BUTTON_OPEN_WAVE, OnButtonOpenWave)
ON_BN_CLICKED(IDC_BUTTON_WAVE_PLAY, OnButtonWavePlay)
ON_BN_CLICKED(IDC_BUTTON_WAVE_REWIND, OnButtonWaveRewind)
ON_BN_CLICKED(IDC_BUTTON_WAVE_FORWARD, OnButtonWaveForward)
ON_BN_CLICKED(IDC_BUTTON_WAVE_PAUSE, OnButtonWavePause)
ON_BN_CLICKED(IDC_BUTTON_WAVE_STOP, OnButtonWaveStop)
ON_WM_TIMER()
ON_CBN_SELCHANGE(IDC_COMBO_RECORD_SELECT_LINE, OnSelchangeComboRecordSelectLine)
ON_BN_CLICKED(IDC_CHECK_PLAY_RING_TONE, OnCheckPlayRingTone)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CVCSampleDlg message handlers
BOOL CVCSampleDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
m_ctrlLineStatusList.InsertColumn(0, "#", LVCFMT_LEFT, 21);
m_ctrlLineStatusList.InsertColumn(1, "Status", LVCFMT_LEFT, 53);
m_ctrlLineStatusList.InsertColumn(2, "Outbound", LVCFMT_LEFT, 68);
m_ctrlLineStatusList.InsertColumn(3, "Inbound", LVCFMT_LEFT, 64);
m_SpkSlider.SetRange(0,10);
m_MicSlider.SetRange(0,10);
m_ctrlSpkProg.SetRange(0, 100);
m_ctrlMicProg.SetRange(0, 100);
SetTimer(VOL_LEVEL_TIMER_ID, 20, NULL);
return TRUE; // return TRUE unless you set the focus to a control
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CVCSampleDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
void CVCSampleDlg::OnOK()
{
// TODO: Add extra validation here
//CDialog::OnOK();
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CVCSampleDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CVCSampleDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
if((CSliderCtrl*)pScrollBar == &m_SpkSlider)
{
if(TB_THUMBTRACK)
{
/***************************************************************
SetSpkVolume method requires Volume value from 0 to 255 range
but the slider range is 0 to 10, so we multiply the slider value
to 25 to get the required value to pass to SetSpkVolume method
For more detail, please see the method details document
*****************************************************************/
m_pVaxVoIP->SetSpkVolume(m_SpkSlider.GetPos() * 25);
}
}
if((CSliderCtrl*)pScrollBar == &m_MicSlider)
{
if(TB_THUMBTRACK)
{
/***************************************************************
SetMicVolume method requires Volume value from 0 to 255 range
but the slider range is 0 to 10, so we multiply the slider value
to 25 to get the required value to pass to SetMicVolume method
For more detail, please see the method details document
*****************************************************************/
m_pVaxVoIP->SetMicVolume(m_MicSlider.GetPos() * 25);
}
}
CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}
void CVCSampleDlg::OnButtonInit()
{
CString sInitBtnText = "";
m_ctrlInitButton.GetWindowText(sInitBtnText);
if(sInitBtnText == "Offline")
{
m_ctrlInitButton.SetWindowText("Online");
m_pVaxVoIP->UnInitialize();
m_ctrlStatusAudioInListBox.ResetContent();
m_ctrlStatusAudioOutListBox.ResetContent();
return;
}
UpdateData();
if(m_sProxyLoginId.IsEmpty())
{
MessageBox("Please enter the SIP proxy Login Id.", "SIP Proxy settings", MB_OK|MB_ICONEXCLAMATION);
return;
}
if(m_sProxyURI.IsEmpty())
{
MessageBox("Please enter the SIP proxy address or URI.", "SIP Proxy settings", MB_OK|MB_ICONEXCLAMATION);
return;
}
m_pVaxVoIP->SetLicenceKey("TRIAL-LICENSE-KEY");
/***** Constructing SIP From URI for IP Telephony ***********/
CString sFromURI = "";
if(m_sProxyDisplayName.IsEmpty())
sFromURI.Format("%s <sip:%s@%s>", m_sProxyLoginId, m_sProxyLoginId, m_sProxyURI);
else
sFromURI.Format("%s <sip:%s@%s>", m_sProxyDisplayName, m_sProxyLoginId, m_sProxyURI);
/********************************************************************
SIP Proxy: SIP Proxy IP or FQDN provided by your service provider.
OutboundProxy: SIP outbound/NAT proxy IP or FQDN provided by your
service provider to use SIP phone behind the NAT.
*********************************************************************/
CString sMyIP = m_pVaxVoIP->GetMyIP();
BOOL bResult = FALSE;
int nListenPortSIP = 0;
for(nListenPortSIP = 5060; nListenPortSIP < 7000; nListenPortSIP++)
{
bResult = m_pVaxVoIP->Initialize(FALSE, sMyIP, nListenPortSIP, sFromURI, m_sOutboundProxy, m_sProxyURI, m_sProxyLoginId, m_sProxyLoginPwd, m_bEnableSoundDevices, m_nTotalLines);
if(!bResult)
{
if(m_pVaxVoIP->GetVaxObjectError() != 11)
{
m_pVaxVoIP->ErrorMessage();
break;
}
}
else
{
break;
}
}
if(nListenPortSIP >= 7000)
{
MessageBox("Cann't open SIP communication port.");
return;
}
if(bResult == TRUE)
{
int nListenPortRTP = 7000;
int nErrorCount = 0;
for(int nLineNo = 0; nLineNo < m_nTotalLines; nLineNo++)
{
if(!m_pVaxVoIP->OpenLine(nLineNo, FALSE, sMyIP, nListenPortRTP))
{
if(m_pVaxVoIP->GetVaxObjectError() == 11)
{
nErrorCount++;
nLineNo--;
}
else
{
m_pVaxVoIP->ErrorMessage();
bResult = FALSE;
break;
}
}
nListenPortRTP += 2; // It is importent to increament RTP Listen Port by 2
if(nErrorCount >= (m_nTotalLines + 1000)) // If unable to open more than 1000 ports.
{
MessageBox("Unable to open RTP communication port.");
return;
}
}
}
if(bResult == TRUE)
{
if(m_bCheckRegisterToProxy)
{
if(!m_pVaxVoIP->RegisterToProxy(3600))
{
m_pVaxVoIP->ErrorMessage();
return;
}
AddToStatusList("Registering to SIP Proxy.");
}
m_pVaxVoIP->EnableKeepAlive(10);
if(m_bEnableEchoNoiseCancel)
m_pVaxVoIP->EnableEchoNoiseCancellation();
else
m_pVaxVoIP->DisableEchoNoiseCancellation();
m_pVaxVoIP->DeselectAllVoiceCodec();
if(m_bGSM610)
m_pVaxVoIP->SelectVoiceCodec(0);
if(m_biLBC)
m_pVaxVoIP->SelectVoiceCodec(1);
if(m_bG711ALaw)
m_pVaxVoIP->SelectVoiceCodec(2);
if(m_bG711ULaw)
m_pVaxVoIP->SelectVoiceCodec(3);
m_ctrlInitButton.SetWindowText("Offline");
FillComboBoxes();
m_ctrlLineStatusList.DeleteAllItems();
UpdateAudioInListBox();
UpdateAudioOutListBox();
SetTimer(GENERAL_TIMER_ID, 1000, 0);
}
}
void CVCSampleDlg::FillComboBoxes()
{
m_ctrlDialSelectLine.ResetContent();
m_ctrlRecordSelectLine.ResetContent();
m_ctrlPlayWaveSelectLine.ResetContent();
m_ctrlIncomingCallSelectLine.ResetContent();
m_ctrlTransferSelectLine.ResetContent();
for(int nLineNo = 1; nLineNo <= m_nTotalLines; nLineNo++)
{
CString sString = "";
sString.Format("Line-%d", nLineNo);
m_ctrlDialSelectLine.AddString(sString);
m_ctrlRecordSelectLine.AddString(sString);
m_ctrlPlayWaveSelectLine.AddString(sString);
m_ctrlIncomingCallSelectLine.AddString(sString);
m_ctrlTransferSelectLine.AddString(sString);
}
m_ctrlDialSelectLine.SetCurSel(0);
m_ctrlRecordSelectLine.SetCurSel(0);
m_ctrlPlayWaveSelectLine.SetCurSel(0);
m_ctrlIncomingCallSelectLine.SetCurSel(0);
m_ctrlTransferSelectLine.SetCurSel(0);
}
void CVCSampleDlg::OnDestroy()
{
CDialog::OnDestroy();
delete m_pVaxVoIP;
}
void CVCSampleDlg::OnButtonClear()
{
m_ctrlStatusLogListBox.ResetContent();
}
void CVCSampleDlg::OnButtonDial()
{
UpdateData();
if(m_sPhoneNumber.IsEmpty())
{
MessageBox("Please enter a phone number.", "Invalid phone number", MB_OK|MB_ICONEXCLAMATION);
return;
}
/*******************************************************
Constructing SIP To URI for IP Telephony:
sip:PhoneNumber@SIP Proxy
********************************************************/
CString sToURI = "sip:" + m_sPhoneNumber + "@" + m_sProxyURI;
int nLineNo = m_ctrlDialSelectLine.GetCurSel();
m_ctrlStatusAudioInListBox.GetCurSel();
if(!m_pVaxVoIP->Connect(nLineNo, sToURI, GetSelectedAudioInDeviceId(), GetSelectedAudioOutDeviceId()))
{
m_pVaxVoIP->ErrorMessage();
}
else
{
CString sText = "";
sText.Format("Line-%d: Dialing.", nLineNo + 1);
AddToStatusList(sText);
}
}
void CVCSampleDlg::OnButtonHangup()
{
int nLineNo = m_ctrlDialSelectLine.GetCurSel();
if(!m_pVaxVoIP->Disconnect(nLineNo))
m_pVaxVoIP->ErrorMessage();
}
void CVCSampleDlg::OnButtonHold()
{
int nLineNo = m_ctrlDialSelectLine.GetCurSel();
if(!m_pVaxVoIP->HoldLine(nLineNo))
m_pVaxVoIP->ErrorMessage();
}
void CVCSampleDlg::OnButtonUnhold()
{
int nLineNo = m_ctrlDialSelectLine.GetCurSel();
if(!m_pVaxVoIP->UnHoldLine(nLineNo))
m_pVaxVoIP->ErrorMessage();
}
void CVCSampleDlg::OnButtonAccept()
{
CString sCallId = GetSelectedItemCallId();
if(sCallId.IsEmpty()) return;
int nLineNo = m_ctrlIncomingCallSelectLine.GetCurSel();
if(!m_pVaxVoIP->AcceptCall(nLineNo, sCallId, GetSelectedAudioInDeviceId(), GetSelectedAudioOutDeviceId()))
{
m_pVaxVoIP->ErrorMessage();
}
else
{
::PlaySound(NULL, NULL, SND_FILENAME|SND_ASYNC|SND_LOOP|SND_NODEFAULT);
int nIndex = m_ctrlIncomingCalIIdListBox.FindString(-1, sCallId);
if(nIndex != -1)
{
m_ctrlIncomingCallListBox.DeleteString(nIndex);
m_ctrlIncomingCalIIdListBox.DeleteString(nIndex);
}
if(m_ctrlIncomingCallListBox.GetCurSel() == -1)
m_ctrlIncomingCallListBox.SetCurSel(0);
}
}
void CVCSampleDlg::OnButtonReject()
{
CString sCallId = GetSelectedItemCallId();
if(sCallId.IsEmpty()) return;
if(!m_pVaxVoIP->RejectCall(sCallId))
{
m_pVaxVoIP->ErrorMessage();
}
else
{
::PlaySound(NULL, NULL, SND_FILENAME|SND_ASYNC|SND_LOOP|SND_NODEFAULT);
int nIndex = m_ctrlIncomingCalIIdListBox.FindString(-1, sCallId);
if(nIndex != -1)
{
m_ctrlIncomingCallListBox.DeleteString(nIndex);
m_ctrlIncomingCalIIdListBox.DeleteString(nIndex);
}
if(m_ctrlIncomingCallListBox.GetCurSel() == -1)
m_ctrlIncomingCallListBox.SetCurSel(0);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -