www.pudn.com > RecDemo.rar > RecDemoDlg.cpp


// RecDemoDlg.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "RecDemo.h" 
#include "RecDemoDlg.h" 
#include "SingleDialog.h" 
#include "MultiPlay.h" 
#include "ConfigDlg.h" 
#include "AdjustVoiceDlg.h" 
 
#include "d.h" 
#include "..\\..\\..\\..\\inc\\Tc08a32.h" 
#include "..\\..\\..\\..\\inc\\Conf95.h" 
#include "mydefines.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CAboutDlg dialog used for App About 
 
int			TotalLine; 
LINESTRUCT	*Lines = NULL; 
 
bool	bHaveLoadDriver; 
int		OurPackRate; 
long	lBytesPerSecond; 
int		Compress,AGC; 
HWND	hGWnd; 
int		iGchn; 
 
extern CRecDemoApp	theApp; 
CRecDemoDlg			*pdlg; 
 
bool	BeforeRealWork (void) 
{ 
	 
	return true; 
} 
 
void	SetWorkStatus ( int Chnl, enum CHANNEL_STATE State ) 
{ 
	Lines[Chnl].State = State; 
 
	switch ( State ) 
	{ 
	case CH_INIT: 
		pdlg->m_MainList.SetItemText ( Chnl, 2, "Init" ); 
		break; 
	case DRec_CH_FREE: 
		pdlg->m_MainList.SetItemText ( Chnl, 2, "FREE" ); 
		break; 
	case CH_RINGING: 
		pdlg->m_MainList.SetItemText ( Chnl, 2,  "Ringing" ); 
		break; 
	case CH_START_RECORD: 
		pdlg->m_MainList.SetItemText ( Chnl, 2,  "Start Rec" ); 
		break; 
	case CH_RECORDING: 
		pdlg->m_MainList.SetItemText ( Chnl, 2,  "Recording" ); 
		break; 
	case CH_LINEERROR: 
		pdlg->m_MainList.SetItemText ( Chnl, 2,  "Line Error" ); 
		break; 
	case CH_START_PLAY: 
		pdlg->m_MainList.SetItemText ( Chnl, 2,  "Start Play" ); 
		break; 
	case CH_PLAYING: 
		pdlg->m_MainList.SetItemText ( Chnl, 2,  "Playing" ); 
		break; 
	} 
 
} 
 
void	InitListCtrl(void) 
{ 
	LV_COLUMN lvc; 
	char *dig =new char[20]; 
	CString stringtmp; 
 
	stringtmp.LoadString(IDS_CHANNELNO) ;  
	lvc.mask =  LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; 
	lvc.iSubItem = 0; 
	lvc.pszText =stringtmp.GetBuffer(40) ; 
	lvc.cx = 50; 
	pdlg->m_MainList.InsertColumn(0,&lvc); 
	stringtmp.ReleaseBuffer();  
 
	stringtmp.LoadString(IDS_RECORD_MODE) ;  
	sprintf(lvc.pszText,stringtmp); 
	lvc.mask =  LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; 
	lvc.iSubItem = 1; 
	lvc.pszText =stringtmp.GetBuffer(40) ; 
	lvc.cx = 60; 
	pdlg->m_MainList.InsertColumn(1,&lvc); 
	stringtmp.ReleaseBuffer();  
 
	stringtmp.LoadString(IDS_STATE) ;  
	lvc.mask =  LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; 
	lvc.iSubItem = 2; 
	lvc.pszText =stringtmp.GetBuffer(40) ; 
	lvc.cx = 80; 
	pdlg->m_MainList.InsertColumn(2,&lvc); 
	stringtmp.ReleaseBuffer();  
 
	stringtmp.LoadString(IDS_CALLERID) ;  
	lvc.mask =  LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; 
	lvc.iSubItem = 3; 
	lvc.pszText =stringtmp.GetBuffer(40) ; 
	lvc.cx = 150; 
	pdlg->m_MainList.InsertColumn(3,&lvc); 
	stringtmp.ReleaseBuffer();  
 
	lvc.mask =  LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; 
	lvc.iSubItem = 4; 
	lvc.pszText = "DTMF" ; 
	lvc.cx = 150; 
	pdlg->m_MainList.InsertColumn(4,&lvc); 
	stringtmp.ReleaseBuffer();  
 
	stringtmp.LoadString(IDS_STATE_OFFHOOK_OR_ONHOOK) ;  
	lvc.mask =  LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; 
	lvc.iSubItem = 5; 
	lvc.pszText =stringtmp.GetBuffer(40) ; 
	lvc.cx = 80; 
	pdlg->m_MainList.InsertColumn(5,&lvc); 
	stringtmp.ReleaseBuffer();  
 
	stringtmp.LoadString(IDS_RINGING_TIMES) ;  
	lvc.mask =  LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; 
	lvc.iSubItem = 6; 
	lvc.pszText =stringtmp.GetBuffer(40) ; 
	lvc.cx = 80; 
	pdlg->m_MainList.InsertColumn(6,&lvc); 
	stringtmp.ReleaseBuffer();  
 
	stringtmp.LoadString(IDS_THRESHOLD_LEVEL) ;  
	lvc.mask =  LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; 
	lvc.iSubItem = 7; 
	lvc.pszText =stringtmp.GetBuffer(40) ; 
	lvc.cx = 80; 
	pdlg->m_MainList.InsertColumn(7,&lvc); 
	stringtmp.ReleaseBuffer();  
 
	// ---------------------------- 
	LV_ITEM lvi; 
	for( int i = 0; i < TotalLine; i++) 
	{ 
		lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE; 
		lvi.iItem = i; 
		lvi.iSubItem = 0; 
		dig = itoa( i, dig, 10 ) ;  
		lvi.pszText = dig; 
		pdlg->m_MainList.InsertItem(i,dig); 
	} 
 
	for ( i = 0; i < TotalLine; i++ ) 
	{ 
		if(Lines[i].nType==YA_KONG) 
		{ 
			stringtmp.LoadString(IDS_VOLTAGE_CONTROL) ;  
			pdlg->m_MainList.SetItemText ( i, 1, stringtmp.GetBuffer(40)); 
			stringtmp.ReleaseBuffer();  
		} 
		else if(Lines[i].nType==SHENG_KONG) 
		{ 
			stringtmp.LoadString(IDS_RECORD_VOLUME_CONTROL) ;  
			pdlg->m_MainList.SetItemText ( i, 1, stringtmp.GetBuffer(40)); 
			stringtmp.ReleaseBuffer();  
		} 
		else if(Lines[i].nType==CHTYPE_USER) 
		{ 
			stringtmp.LoadString(IDS_USER) ;  
			pdlg->m_MainList.SetItemText ( i, 1, stringtmp.GetBuffer(40)); 
			stringtmp.ReleaseBuffer();  
		} 
		else if(Lines[i].nType==CHTYPE_TRUNK) 
		{ 
			stringtmp.LoadString(IDS_TRUNK) ;  
			pdlg->m_MainList.SetItemText ( i, 1, stringtmp.GetBuffer(40)); 
			stringtmp.ReleaseBuffer();  
		} 
		else if(Lines[i].nType==CHTYPE_EMPTY) 
 		{ 
			stringtmp.LoadString(IDS_EMPTY) ;  
			pdlg->m_MainList.SetItemText ( i, 1, stringtmp.GetBuffer(40)); 
			stringtmp.ReleaseBuffer();  
		} 
 
		SetWorkStatus ( i, CH_INIT ); 
	} 
	delete dig; 
} 
 
bool	InitSystem(void)  
{ 
	long DriverOpenFlag; 
	int	 r; 
 
	pdlg = (CRecDemoDlg *)theApp.m_pMainWnd; 
	hGWnd=pdlg->m_hWnd; 
 
	GetVoicePath(); 
	DriverOpenFlag = LoadDRV ( ); 
	if ( DriverOpenFlag ) 
	{ 
		AfxMessageBox ( "Load driver FAIL!" ); 
		return FALSE; 
	} 
     
	TotalLine = CheckValidCh(); 
 
	if ( EnableCard(TotalLine,1024*32) != (long)0) 
	{ 
		FreeDRV(); 
		AfxMessageBox ( "Enable Card FAIL!" ); 
		return FALSE; 
	} 
 
	// now set Pack Rate 
	switch(Compress) 
	{ 
	case 0: 
		OurPackRate=PACK_64KBPS; 
		break; 
	case 1: 
		OurPackRate=PACK_32KBPS; 
		break; 
	default: 
		OurPackRate=PACK_64KBPS; 
	} 
	SetPackRate (OurPackRate);		// G723, 6.3KBPS 
	switch ( OurPackRate ) 
	{ 
	case PACK_64KBPS: 
		lBytesPerSecond = 8000L; 
		break; 
	case PACK_32KBPS: 
		lBytesPerSecond = 4000L; 
		break; 
	default:		// other pack value not support, driver will treat as PACK_64KBPS 
		lBytesPerSecond = 8000L; 
		break; 
	} 
 
	r = DConf_EnableConfCard(); 
	if ( r != 0 ) 
	{ 
		DisableCard(); 
		FreeDRV(); 
		AfxMessageBox ( "Enable conference card Fail!" ); 
		return FALSE; 
	} 
 
	// Init LineStruct 
	Lines=new LINESTRUCT[TotalLine]; 
	if ( Lines == NULL ) 
	{ 
		DisableCard(); 
		FreeDRV(); 
		AfxMessageBox ( "Malloc LINESTRUCT FAIL!" ); 
		return FALSE; 
	} 
    SetBusyPara(350); 
	int RecordType_ya=0;    //press control channels 
	int RecordType_sheng=0; //volume control channels 
	for( int i = 0; i < TotalLine; i++ ) 
	{ 
		int ChanelType=CheckChTypeNew(i); 
 
		if(ChanelType==CHTYPE_USER) 
		{ 
			Lines[i].nType=CHTYPE_USER; 
		} 
		else if(ChanelType==CHTYPE_TRUNK) 
		{ 
			Lines[i].nType=CHTYPE_TRUNK; 
		} 
		else if(ChanelType==CHTYPE_EMPTY) 
		{ 
			Lines[i].nType=CHTYPE_EMPTY; 
		} 
		else if(ChanelType==CHTYPE_RECORD) 
		{   
			//press control channels/volume control channels = 1:1 
			SetSigParaOneChnl ( i, FREQWIDTH_ALL,  12 ); 
 
			if(AGC==0) 
				D_SetWorkMode ( i, WORK_MODE_REC_AGC, REC_AGC_MODE_VAL_ENABLE );		// enable AGC 
			else 
				D_SetWorkMode ( i, WORK_MODE_REC_AGC, REC_AGC_MODE_VAL_DISABLE );		// disnable AGC 
			 
			// Set AGC's Parameter, now set system default value 
			// Enlarge times : 8 
			D_SetWorkMode ( i, WORK_MODE_AGC_PARAM_INCREASE, 8 ); 
			// reduce times : 0.5 (16/32) 
			D_SetWorkMode ( i, WORK_MODE_AGC_PARAM_DECREASE, 16 ); 
 
			if(RecordType_ya==RecordType_sheng) 
			{ 
				Lines[i].nType=YA_KONG; 
				RecordType_ya++; 
			} 
			else  
			{ 
				Lines[i].nType=SHENG_KONG; 
				RecordType_sheng++; 
			} 
			 
			strcpy(Lines[i].CallerID,""); 
			strcpy(Lines[i].Dtmf,""); 
			Lines[i].State = CH_INIT; 
		} 
 
        strcpy(Lines[i].CallerID,""); 
		strcpy(Lines[i].Dtmf,""); 
		Lines[i].State = CH_FREE; 
 
		 
	} 
 
    Sig_Init(0); 
	 
	// Init display ListCtrl 
	InitListCtrl(); 
 
	return true; 
} 
 
class CAboutDlg : public CDialog 
{ 
public: 
	CAboutDlg(); 
 
// Dialog Data 
	//{{AFX_DATA(CAboutDlg) 
	enum { IDD = IDD_ABOUTBOX }; 
	//}}AFX_DATA 
 
	// ClassWizard generated virtual function overrides 
	//{{AFX_VIRTUAL(CAboutDlg) 
	protected: 
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support 
	//}}AFX_VIRTUAL 
 
// Implementation 
protected: 
	//{{AFX_MSG(CAboutDlg) 
	//}}AFX_MSG 
	DECLARE_MESSAGE_MAP() 
}; 
 
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) 
{ 
	//{{AFX_DATA_INIT(CAboutDlg) 
	//}}AFX_DATA_INIT 
} 
 
void CAboutDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CAboutDlg) 
	//}}AFX_DATA_MAP 
} 
 
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) 
	//{{AFX_MSG_MAP(CAboutDlg) 
		// No message handlers 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CRecDemoDlg dialog 
 
CRecDemoDlg::CRecDemoDlg(CWnd* pParent /*=NULL*/) 
	: CDialog(CRecDemoDlg::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CRecDemoDlg) 
	m_fChl_RecVoc = FALSE; 
	m_fChl_PlayVoc = FALSE; 
	m_fChl_Num0 = FALSE; 
	m_fChl_Num11 = FALSE; 
	m_fChl_Num1 = FALSE; 
	m_fChl_Num10 = FALSE; 
	m_fChl_Num12 = FALSE; 
	m_fChl_Num13 = FALSE; 
	m_fChl_Num14 = FALSE; 
	m_fChl_Num15 = FALSE; 
	m_fChl_Num2 = FALSE; 
	m_fChl_Num3 = FALSE; 
	m_fChl_Num4 = FALSE; 
	m_fChl_Num5 = FALSE; 
	m_fChl_Num6 = FALSE; 
	m_fChl_Num7 = FALSE; 
	m_fChl_Num8 = FALSE; 
	m_fChl_Num9 = FALSE; 
	//}}AFX_DATA_INIT 
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 
} 
 
void CRecDemoDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CRecDemoDlg) 
	DDX_Control(pDX, IDC_BUTTON_MULTIPLAY, m_btnMultPlay); 
	DDX_Control(pDX, IDC_SLIDER1, m_Slider); 
	DDX_Control(pDX, IDC_EDIT1, m_TextListenChnl); 
	DDX_Control(pDX, IDC_EDIT2, m_TextAllListen); 
	DDX_Control(pDX, IDC_LIST1, m_MainList); 
	DDX_Check(pDX, IDC_CHECK17, m_fChl_RecVoc); 
	DDX_Check(pDX, IDC_CHECK18, m_fChl_PlayVoc); 
	DDX_Check(pDX, IDC_CHECK0, m_fChl_Num0); 
	DDX_Check(pDX, IDC_CHECK11, m_fChl_Num11); 
	DDX_Check(pDX, IDC_CHECK1, m_fChl_Num1); 
	DDX_Check(pDX, IDC_CHECK10, m_fChl_Num10); 
	DDX_Check(pDX, IDC_CHECK12, m_fChl_Num12); 
	DDX_Check(pDX, IDC_CHECK13, m_fChl_Num13); 
	DDX_Check(pDX, IDC_CHECK14, m_fChl_Num14); 
	DDX_Check(pDX, IDC_CHECK15, m_fChl_Num15); 
	DDX_Check(pDX, IDC_CHECK2, m_fChl_Num2); 
	DDX_Check(pDX, IDC_CHECK3, m_fChl_Num3); 
	DDX_Check(pDX, IDC_CHECK4, m_fChl_Num4); 
	DDX_Check(pDX, IDC_CHECK5, m_fChl_Num5); 
	DDX_Check(pDX, IDC_CHECK6, m_fChl_Num6); 
	DDX_Check(pDX, IDC_CHECK7, m_fChl_Num7); 
	DDX_Check(pDX, IDC_CHECK8, m_fChl_Num8); 
	DDX_Check(pDX, IDC_CHECK9, m_fChl_Num9); 
	//}}AFX_DATA_MAP 
} 
 
BEGIN_MESSAGE_MAP(CRecDemoDlg, CDialog) 
	//{{AFX_MSG_MAP(CRecDemoDlg) 
	ON_WM_SYSCOMMAND() 
	ON_WM_PAINT() 
	ON_WM_QUERYDRAGICON() 
	ON_WM_DESTROY() 
	ON_WM_TIMER() 
	ON_BN_CLICKED(IDC_BUTTON_SPLAY, OnButtonSplay) 
	ON_BN_CLICKED(IDC_BUTTON_MULTIPLAY, OnButtonMultiplay) 
	ON_BN_CLICKED(IDC_BUTTON2, OnButton2) 
	ON_BN_CLICKED(IDC_BUTTON_REMOVELISTEN, OnButtonRemovelisten) 
	ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDER1, OnCustomdrawSlider1) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CRecDemoDlg message handlers 
 
BOOL CRecDemoDlg::OnInitDialog() 
{ 
	CDialog::OnInitDialog(); 
 
	// Add "About..." menu item to system menu. 
 
	// IDM_ABOUTBOX must be in the system command range. 
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); 
	ASSERT(IDM_ABOUTBOX < 0xF000); 
 
	CMenu* pSysMenu = GetSystemMenu(FALSE); 
	if (pSysMenu != NULL) 
	{ 
		CString strAboutMenu; 
		strAboutMenu.LoadString(IDS_ABOUTBOX); 
		if (!strAboutMenu.IsEmpty()) 
		{ 
			pSysMenu->AppendMenu(MF_SEPARATOR); 
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); 
		} 
	} 
 
	// 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 
	 
	// TODO: Add extra initialization here 
	CConfigDlg dlg; 
	if(dlg.DoModal()==IDOK) 
	{ 
		Compress=dlg.m_Compress; 
		AGC=dlg.m_AGC; 
	} 
 
	bHaveLoadDriver=InitSystem() ; 
	if(!bHaveLoadDriver) PostQuitMessage(0); 
	SetTimer( 1000, 30, NULL ) ; 
	m_Slider.SetRange(0,40); 
	m_Slider.SetPos(20); 
	OnButtonMultiplay(); 
	return TRUE;  // return TRUE  unless you set the focus to a control 
} 
 
void CRecDemoDlg::OnSysCommand(UINT nID, LPARAM lParam) 
{ 
	if ((nID & 0xFFF0) == IDM_ABOUTBOX) 
	{ 
		CAboutDlg dlgAbout; 
		dlgAbout.DoModal(); 
	} 
	else 
	{ 
		CDialog::OnSysCommand(nID, lParam); 
	} 
} 
 
// 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 CRecDemoDlg::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(); 
	} 
} 
 
// The system calls this to obtain the cursor to display while the user drags 
//  the minimized window. 
HCURSOR CRecDemoDlg::OnQueryDragIcon() 
{ 
	return (HCURSOR) m_hIcon; 
} 
 
void	ExitSystem(void) 
{ 
	ClearOneFromAnother (0,iGchn); 
 
	for( int i = 0; i < TotalLine; i++ ) 
	{ 
		StopRecordFile ( i ); 
	} 
 
	DConf_DisableConfCard(); 
	DisableCard(); 
	FreeDRV(); 
 
	if ( Lines != NULL ) 
	{ 
		delete Lines; 
		Lines = NULL; 
	} 
} 
 
void CRecDemoDlg::OnDestroy()  
{ 
	CDialog::OnDestroy(); 
	 
	// TODO: Add your message handler code here 
	KillTimer( 1000 ); 
	if(bHaveLoadDriver) ExitSystem(); 
} 
 
bool	StartMemFlag = false; 
void DispSomething ( int chnl ) 
{ 
	char	TmpS[20]; 
	char    old_TmpS[20]; 
	CString  stringtmp; 
 
    if(Lines[chnl].nType ==YA_KONG)  
	{ 
		sprintf ( TmpS, "%s",Lines[chnl].CallerID ); 
		pdlg->m_MainList.GetItemText(chnl, 3,old_TmpS,20); 
		if(strcmp(TmpS,old_TmpS)!=0) 
			pdlg->m_MainList.SetItemText ( chnl, 3, TmpS); 
		 
		sprintf ( TmpS, "%s",Lines[chnl].Dtmf); 
		pdlg->m_MainList.GetItemText(chnl, 4,old_TmpS,20); 
		if(strcmp(TmpS,old_TmpS)!=0) 
			pdlg->m_MainList.SetItemText ( chnl, 4, TmpS); 
		 
		if(RingDetect(chnl)) 
		{ 
			stringtmp.LoadString(IDS_STATE_RING) ;  
			pdlg->m_MainList.GetItemText(chnl, 5,old_TmpS,20); 
			if(strcmp(stringtmp,old_TmpS)!=0) 
				pdlg->m_MainList.SetItemText ( chnl, 5, stringtmp); 
		} 
		else 
		{ 
			stringtmp.LoadString(IDS_STATE_FREE) ;  
			pdlg->m_MainList.GetItemText(chnl, 5,old_TmpS,20); 
			if(strcmp(stringtmp,old_TmpS)!=0) 
				pdlg->m_MainList.SetItemText ( chnl, 5, stringtmp); 
		} 
		 
		 
		if(DRec_OffHookDetect(chnl)) 
		{ 
			stringtmp.LoadString(IDS_STATE_OFFHOOK) ;  
			pdlg->m_MainList.GetItemText(chnl, 7,old_TmpS,20); 
			if(strcmp(stringtmp,old_TmpS)!=0) 
				pdlg->m_MainList.SetItemText ( chnl, 7, stringtmp); 
		} 
		else 
		{ 
			stringtmp.LoadString(IDS_STATE_ONHOOK) ;  
			pdlg->m_MainList.GetItemText(chnl, 7,old_TmpS,20); 
			if(strcmp(stringtmp,old_TmpS)!=0) 
				pdlg->m_MainList.SetItemText ( chnl, 7, stringtmp); 
		} 
	} 
	else if(Lines[chnl].nType ==SHENG_KONG) 
	{ 
       	sprintf ( TmpS, "%s",Lines[chnl].CallerID ); 
		pdlg->m_MainList.GetItemText(chnl, 3,old_TmpS,20); 
		if(strcmp(TmpS,old_TmpS)!=0) 
			pdlg->m_MainList.SetItemText ( chnl, 3, TmpS); 
		 
		sprintf ( TmpS, "%s",Lines[chnl].Dtmf); 
		pdlg->m_MainList.GetItemText(chnl, 4,old_TmpS,20); 
		if(strcmp(TmpS,old_TmpS)!=0) 
			pdlg->m_MainList.SetItemText ( chnl, 4, TmpS); 
		 
		if(DRec_OffHookDetect(chnl)) 
		{ 
			stringtmp.LoadString(IDS_STATE_OFFHOOK) ;  
			pdlg->m_MainList.GetItemText(chnl, 5,old_TmpS,20); 
			if(strcmp(stringtmp,old_TmpS)!=0) 
				pdlg->m_MainList.SetItemText ( chnl, 5, stringtmp); 
		} 
		else 
		{ 
			stringtmp.LoadString(IDS_STATE_ONHOOK) ;  
			pdlg->m_MainList.GetItemText(chnl, 5,old_TmpS,20); 
			if(strcmp(stringtmp,old_TmpS)!=0) 
				pdlg->m_MainList.SetItemText ( chnl, 5, stringtmp); 
		} 
		 
		if(DRec_OffHookDetect(chnl)) 
		{ 
			stringtmp.LoadString(IDS_STATE_OFFHOOK) ;  
			pdlg->m_MainList.GetItemText(chnl, 7,old_TmpS,20); 
			if(strcmp(stringtmp,old_TmpS)!=0) 
				pdlg->m_MainList.SetItemText ( chnl, 7, stringtmp); 
		} 
		else 
		{ 
			stringtmp.LoadString(IDS_STATE_ONHOOK) ;  
			pdlg->m_MainList.GetItemText(chnl, 7,old_TmpS,20); 
			if(strcmp(stringtmp,old_TmpS)!=0) 
				pdlg->m_MainList.SetItemText ( chnl, 7, stringtmp); 
		} 
	} 
} 
 
void	GenFileName ( int chnl, char *FileName ) 
{ 
	char tmps[40]; 
 
	SYSTEMTIME	SysTime; 
	GetSystemTime ( &SysTime ); 
	sprintf ( tmps, "%02d%02d%02d%02d.%d.pcm",  
		SysTime.wDay, SysTime.wHour, SysTime.wMinute, SysTime.wSecond, chnl ); 
	strcpy(FileName,tmps); 
} 
 
int		MayBeDeleteFile ( char *FileName, long lCutMilSecond ) 
{ 
	HANDLE	hd; 
	DWORD	dwFileSize; 
	DWORD	dwSilenceSize; 
	DWORD	dwLeastBytes; 
 
	hd = CreateFile ( FileName, 
		GENERIC_READ, 
		FILE_SHARE_READ|FILE_SHARE_WRITE, 
		NULL, 
		OPEN_EXISTING, 
		FILE_ATTRIBUTE_NORMAL, 
		NULL 
		); 
 
	if ( hd == INVALID_HANDLE_VALUE )  
		return -1; 
 
	dwFileSize = GetFileSize ( hd, NULL); 
	if ( dwFileSize < 0 ) 
		return -2; 
 
	dwSilenceSize = lBytesPerSecond * lCutMilSecond / 1000; 
 
	CloseHandle ( hd ); 
 
	dwLeastBytes = lBytesPerSecond * 300 / 1000;		// if record time less than 300 ms, record file would delete 
	if ( (dwFileSize > dwSilenceSize) && ((dwFileSize-dwSilenceSize) > dwLeastBytes) ) { 
		return 0;		// OK, no need to delete this file 
	} 
 
	if ( DeleteFile ( FileName ) == 0 ) 
		return -3; 
 
	return 0;			// OK 
} 
 
char	DtmfTable[17] = "D1234567890*#ABC"; 
void	HandleDtmf ( int chnl ) 
{ 
	short		shDtmf; 
	char		c[2]; 
 
	if(strlen(Lines[chnl].Dtmf)>=(MAXDTMF-1)) //if numbers more than 63 ,DTMF wouldn't received 
		return; 
	shDtmf = GetDtmfCode ( chnl ); 
	if ( shDtmf == -1 ) 
		return; 
 
	shDtmf &= 0x0F; 
	c[0] = DtmfTable[shDtmf]; 
	c[1] = 0; 
 
	strcat ( Lines[chnl].Dtmf, c );  
	pdlg->m_MainList.SetItemText ( chnl, 4, Lines[chnl].Dtmf ); 
} 
 
void	Handle_Ya ( int chnl ) 
{ 
	int		r; 
	char	TmpIDStr[128]; 
	char	TmpFileName[80]; 
	int		CheckSilenceLength; 
 
	DispSomething ( chnl ); 
 
	switch ( Lines[chnl].State ) 
	{ 
	case CH_INIT: 
		ResetCallerIDBuffer(chnl); 
		InitDtmfBuf (chnl); 
		strcpy(Lines[chnl].Dtmf,""); 
		SetWorkStatus ( chnl, DRec_CH_FREE ); 
		break; 
 
	case DRec_CH_FREE: 
		r = RingDetect(chnl); 
		if ( r == 0 ) 
		{	//whether call out  
			if(DRec_OffHookDetect(chnl)) 
			  SetWorkStatus ( chnl, CH_START_RECORD ); 
		} 
		else if ( (r == 1) /*|| (r==3)*/ )  
		{	// offhook 
			SetWorkStatus ( chnl, CH_RINGING ); 
			pdlg->m_MainList.SetItemText ( chnl, 3, "" ); 
		} 
		break; 
 
	case CH_RINGING: 
		r = DRec_OffHookDetect(chnl); 
		if ( r == 1 ) 
		{	// OffHook 
			// display caller-id 
			r = GetCallerIDStr ( chnl, TmpIDStr ); 
			if ( r == 3 ) 
			{		// get Caller ID OK 
				pdlg->m_MainList.SetItemText ( chnl, 3, TmpIDStr ); 
			} 
 
			// start record 
			// this is inhale 
			SetWorkStatus ( chnl, CH_START_RECORD ); 
		} 
	 
		else if ( r == 0)  
		{	// OnHook 
			SetWorkStatus ( chnl, CH_INIT ); 
 
			// display caller-id 
			r = GetCallerIDStr ( chnl, TmpIDStr ); 
			if ( r == 3 ) {		// get Caller ID OK 
				pdlg->m_MainList.SetItemText ( chnl, 3, TmpIDStr ); 
			} 
		} 
	 
		break; 
 
	case CH_START_RECORD: 
		GenFileName ( chnl, TmpFileName ); 
		StartRecordFile ( chnl, TmpFileName, lBytesPerSecond*3600L );		// 3600 second 
		strcpy ( Lines[chnl].NowRecordFileName, TmpFileName ); 
 
		SetWorkStatus ( chnl, CH_RECORDING ); 
		StartSigCheck ( chnl ); 
		break; 
 
	case CH_RECORDING: 
		r = DRec_OffHookDetect(chnl); 
		if ( r == 0 ) 
		{	// OnHook 
			// Stop Record 
			StopRecordFile ( chnl ); 
			// back 
			SetWorkStatus ( chnl, CH_INIT ); 
		} 
 
		// check up connection cut  
		CheckSilenceLength = 500;				// 500 * 32 = 1600 ms = 16 second 
		r = CheckSilence ( chnl, CheckSilenceLength ); 
		if ( r >= 0 ) 
		{ 
			if ( r < 5 ) 
			{ 
				// stop record 
				StopRecordFile ( chnl ); 
				MayBeDeleteFile ( Lines[chnl].NowRecordFileName, CheckSilenceLength*32 ); 
 
				SetWorkStatus ( chnl, CH_LINEERROR ); 
				StartSigCheck ( chnl ); 
			} 
		} 
 
		HandleDtmf ( chnl ); 
		break; 
 
	case CH_LINEERROR: 
		r = DRec_OffHookDetect(chnl); 
		if ( r == 0) 
		{		// OnHook 
			SetWorkStatus ( chnl, CH_INIT ); 
			break; 
		} 
 
		r = CheckSilence ( chnl, 10 );		// 10 * 32 = 320 ms 
		if ( r >= 0 ) { 
			if ( r > 2 ) { 
				SetWorkStatus ( chnl, CH_START_RECORD ); 
			} 
		} 
		break; 
	} 
} 
 
void	Handle_Sheng ( int chnl ) 
{ 
	long	r; 
	char	TmpFileName[80]; 
 
    DispSomething ( chnl ); 
	switch ( Lines[chnl].State ) 
	{ 
	case CH_INIT: 
		StartSigCheck ( chnl ); 
		SetWorkStatus ( chnl, DRec_CH_FREE ); 
		InitDtmfBuf (chnl); 
		strcpy(Lines[chnl].Dtmf,""); 
		break; 
 
	case DRec_CH_FREE: 
		r = CheckSilence ( chnl, 10 );		// 10 * 32 = 320 ms 
		if ( r >= 0 ) 
		{ 
			if ( r > 2 ) 
			{ 
				SetWorkStatus ( chnl, CH_START_RECORD ); 
			} 
		} 
		break; 
 
	case CH_START_RECORD: 
		GenFileName ( chnl, TmpFileName ); 
		// 3600 second, and fetch pre 1 second's record voice 
		StartRecordFile ( chnl, TmpFileName, lBytesPerSecond*3600L);		 
 
		SetWorkStatus ( chnl, CH_RECORDING ); 
		StartSigCheck ( chnl ); 
		break; 
 
	case CH_RECORDING: 
		r = CheckSilence ( chnl, 160 );		// 312 * 32 = 9984 ms = 10 second 
		if ( r >= 0 )  
		{ 
			if ( r < 5 ) 
			{ 
				// stop record 
				StopRecordFile ( chnl ); 
				SetWorkStatus ( chnl, CH_INIT ); 
			} 
		} 
 
		HandleDtmf ( chnl ); 
		break; 
	} 
} 
 
bool	CheckBusySignal ( int chnl )  
{ 
	WORD wSigCheckResult; 
 
	SetBusyPara ( 320 ); 
 
	wSigCheckResult = ReadCheckResult(chnl,PLAY_CHECK); 
	if( (wSigCheckResult==R_BUSY) && (ReadBusyCount()>=2) ) 
	{ 
		return	true; 
	} 
	return false; 
} 
void ShowChanelType(int chnl) 
{ 
 
} 
void	Handle_User_Trunk ( int chnl ) 
{ 
 
	 ShowChanelType(chnl); 
	 yzDoWork(chnl); 
} 
 
void	DoTimerWork(void) 
{ 
	int		i; 
 
	PUSH_PLAY(); 
	FeedSigFunc(); 
	for ( i = 0; i < TotalLine; i ++ ) 
	{ 
		if ( Lines[i].nType == YA_KONG )  
			Handle_Ya(i); 
		else if ( Lines[i].nType == SHENG_KONG )  
			Handle_Sheng(i); 
		else if((Lines[i].nType==CHTYPE_USER) ||(Lines[i].nType==CHTYPE_TRUNK) ) 
			Handle_User_Trunk(i);  //Phone bank 
	} 
} 
 
void CRecDemoDlg::OnTimer(UINT nIDEvent)  
{ 
	// TODO: Add your message handler code here and/or call default 
	DoTimerWork(); 
 
	CDialog::OnTimer(nIDEvent); 
} 
 
void CRecDemoDlg::OnButtonSplay()  
{ 
	// TODO: Add your control notification handler code here 
	SingleDialog	MyPlay; 
 
	MyPlay.DoModal (); 
} 
 
static	int	NowListenCount = 0; 
static	int	ListenTable[/*D080D_MAX_CONF_CHNL*/4]; 
 
int		NowListenAGCFlag = 0; 
#define D080D_CONF_GROUP_ID 1 
void   New_ListenChnl(int chnl) 
{ 
 
	LinkOneToAnother(0,chnl); 
	iGchn = chnl ; 
 
} 
void New_ClearListen(int chnl) 
{ 
	ClearOneFromAnother (0,chnl); 
} 
void	HandleListenChnl ( int chnl ) 
{ 
	int		i, j; 
	int		r; 
	char	TmpStr[40], sss[10]; 
 
	for ( i = 0; i < NowListenCount; i ++ ) 
	{ 
		if ( chnl == ListenTable[i] ) 
		{ 
			// clear listen  
			r = SubChnl ( D080D_CONF_GROUP_ID, chnl ); 
 
			//  
			for ( j = i; j < NowListenCount-1; j ++ ) 
				ListenTable[j] = ListenTable[j+1]; 
			NowListenCount --; 
 
			if ( NowListenCount == 0 ) 
				r = SubListenChnl ( D080D_CONF_GROUP_ID, 0 );		// chnl 0 clear listen 
 
			goto	RefreshDisp; 
			return; 
		} 
	} 
 
	// set listen 
	if ( NowListenCount >= 4/*D080D_MAX_CONF_CHNL*/ ) 
		return; 
 
	if ( NowListenAGCFlag == 0 ) 
		r = AddChnl ( D080D_CONF_GROUP_ID, chnl, -6, 0 );		// Listen Original Voice -6 DB 
	else 
		r = AddChnl ( D080D_CONF_GROUP_ID, chnl, -6, 0xFFFF );	// Listen AGC Voice, and -6 DB 
 
	ListenTable[NowListenCount] = chnl; 
	NowListenCount ++; 
 
	if ( NowListenCount == 1 ) 
		r = AddListenChnl ( D080D_CONF_GROUP_ID, 0 );		// chnl 0 listen 
 
RefreshDisp: 
	// refresh display text 
	strcpy ( TmpStr, "" ); 
	for ( i = 0; i < NowListenCount; i ++ ) 
	{ 
		sprintf ( sss, "%d ", ListenTable[i] ); 
		strcat ( TmpStr, sss ); 
	} 
	pdlg->m_TextAllListen.SetWindowText ( TmpStr ); 
 
	// LinkOneToAnother ( 0, chnl ); 
} 
 
void	ClearAllListenChnl ( void ) 
{ 
	int		chnl; 
 
	while ( NowListenCount > 0 ) 
	{ 
		chnl = ListenTable[0]; 
		HandleListenChnl ( chnl ); 
	} 
} 
 
void CRecDemoDlg::OnButtonMultiplay()  
{ 
	// TODO: Add your control notification handler code here 
	 
    //showwindow or hide window 
 
	CString stringtmp; 
    static BOOL bFlag=FALSE; 
    CRect rect; 
	const CRect rect1(0,0,0,220); 
	this->GetWindowRect(&rect); 
 
	if(bFlag) 
	{ 
      rect+=&rect1; 
	  this->MoveWindow(&rect); 
	  bFlag=!bFlag; 
	  stringtmp.LoadString(IDS_VOLUME1) ;  
	  m_btnMultPlay.SetWindowText(stringtmp); 
	} 
	else 
	{ 
      rect-=&rect1; 
	  this->MoveWindow(&rect); 
	  bFlag=!bFlag; 
	  stringtmp.LoadString(IDS_VOLUME2) ;  
	  m_btnMultPlay.SetWindowText(stringtmp); 
	} 
} 
 
void CRecDemoDlg::OnButton2()  
{ 
	// TODO: Add your control notification handler code here 
	int		chnl; 
	char	TmpStr[20]; 
 
	m_TextListenChnl.GetWindowText ( TmpStr, 10 ); 
	chnl = atoi(TmpStr); 
 
	NowListenAGCFlag = ((CButton *)GetDlgItem(IDC_CHECKAGC))->GetCheck(); 
 
//	HandleListenChnl ( chnl );  channels monitor by conference  
	m_TextAllListen.SetWindowText(TmpStr); 
	New_ListenChnl(chnl); 
} 
 
void CRecDemoDlg::OnButtonRemovelisten()  
{ 
	// TODO: Add your control notification handler code here 
	//ClearAllListenChnl ( );  //conference 
	char TmpStr[20]; 
	int chnl; 
    m_TextAllListen.GetWindowText(TmpStr,10); 
    chnl = atoi(TmpStr); 
	New_ClearListen(chnl); 
	m_TextAllListen.SetWindowText(""); 
} 
 
 
void CRecDemoDlg::OnCustomdrawSlider1(NMHDR* pNMHDR, LRESULT* pResult)  
{ 
	// TODO: Add your control notification handler code here 
    UpdateData(TRUE); 
	if((!m_fChl_RecVoc) && (!m_fChl_PlayVoc)) 
		return ; 
     
	int ch_Count; 
	int voc_newvolume=m_Slider.GetPos(); 
    voc_newvolume=20-voc_newvolume; 
 
	if(TotalLine>16) 
		ch_Count=16; 
	else 
        ch_Count= TotalLine; 
 
	WORD i; 
	 
	if(m_fChl_RecVoc) 
	{ 
	     i=0; 
         if(m_fChl_Num0 && (i