www.pudn.com > RecDemo6.0.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 "d080d32.h"
#include "Tc08a32.h"
#include "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;
extern CRecDemoApp theApp;
CRecDemoDlg *pdlg;
bool bHaveLoadDriver;
int OurPackRate;
long lBytesPerSecond;
char Compresspack[2],AGCpack[2];
int Compress,AGC;
//cstring AGCpack;
//cstring Compress,AGC;
HWND hGWnd;
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];
lvc.mask = LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
lvc.iSubItem = 0;
lvc.pszText = "通道号" ;
lvc.cx = 50;
pdlg->m_MainList.InsertColumn(0,&lvc);
lvc.mask = LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
lvc.iSubItem = 1;
lvc.pszText = "录音方式";
lvc.cx = 60;
pdlg->m_MainList.InsertColumn(1,&lvc);
lvc.mask = LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
lvc.iSubItem = 2;
lvc.pszText = "流程状态" ;
lvc.cx = 80;
pdlg->m_MainList.InsertColumn(2,&lvc);
lvc.mask = LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
lvc.iSubItem = 3;
lvc.pszText = "主叫" ;
lvc.cx = 150;
pdlg->m_MainList.InsertColumn(3,&lvc);
lvc.mask = LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
lvc.iSubItem = 4;
lvc.pszText = "DTMF" ;
lvc.cx = 150;
pdlg->m_MainList.InsertColumn(4,&lvc);
lvc.mask = LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
lvc.iSubItem = 5;
lvc.pszText = "摘挂机状态" ;
lvc.cx = 80;
pdlg->m_MainList.InsertColumn(5,&lvc);
lvc.mask = LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
lvc.iSubItem = 6;
lvc.pszText = "电压(振铃次数)" ;
lvc.cx = 80;
pdlg->m_MainList.InsertColumn(6,&lvc);
lvc.mask = LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
lvc.iSubItem = 7;
lvc.pszText = "门槛电压值" ;
lvc.cx = 80;
pdlg->m_MainList.InsertColumn(7,&lvc);
// ----------------------------
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)
pdlg->m_MainList.SetItemText ( i, 1, "录音(压控)");
else if(Lines[i].nType==SHENG_KONG)
pdlg->m_MainList.SetItemText ( i, 1, "录音(声控)");
else if(Lines[i].nType==CHTYPE_USER)
pdlg->m_MainList.SetItemText ( i, 1, "内线");
else if(Lines[i].nType==CHTYPE_TRUNK)
pdlg->m_MainList.SetItemText ( i, 1, "外线");
else if(Lines[i].nType==CHTYPE_EMPTY)
pdlg->m_MainList.SetItemText ( i, 1, "悬空");
//else
//pdlg->m_MainList.SetItemText ( i, 1, "呼入");
SetWorkStatus ( i, CH_INIT );
}
delete dig;
}
bool InitSystem(void)
{
// AfxMessageBox ( "开始!" );
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;
}
GetPrivateProfileString("SYSTEM","m_Compress",NULL,Compresspack,2,"C:\\WINNT\\Tc08a-v.ini");
Compress=atoi(Compresspack);
switch(Compress)
{
case 0:
OurPackRate=PACK_64KBPS;
break;
case 1:
OurPackRate=PACK_32KBPS;
break;
// case 2:
// OurPackRate=PACK_G723_53;
//break;
// case 3:
// OurPackRate=PACK_G723_63;
// break;
default:
OurPackRate=PACK_64KBPS;
break;
}
switch ( OurPackRate )
{
case PACK_64KBPS:
lBytesPerSecond = 8000L;
break;
case PACK_32KBPS:
lBytesPerSecond = 4000L;
break;
/*
case PACK_G723_63: // G.723(6.3K)
lBytesPerSecond = 800L;
break;
case PACK_G723_53: // G.723(5.3K)
lBytesPerSecond = 667L; // (666.666666)
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; //压控录音通道数
int RecordType_sheng=0; //声控录音通道数
for( int i = 0; i < TotalLine; i++ )
{
//
/*
if ( i < TotalLine/2 )
Lines[i].nType = YA_KONG;
else
Lines[i].nType = SHENG_KONG;
*/
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)
{
//压控\声控均分录音通道
//SetSigParaOneChnl ( i, FREQWIDTH_ALL, 0x0A );//?******
GetPrivateProfileString("SYSTEM","m_AGC",NULL,AGCpack,2,"C:\\WINNT\\Tc08a-v.ini");
AGC=atoi(AGCpack);
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, 系统的缺省值为:10倍和0.25倍
// 小声音的最大放大倍数为10倍
// D_SetWorkMode ( i, WORK_MODE_AGC_PARAM_INCREASE, 10 );
// 大声音的最大缩小倍数为0.25倍(8/32)
// D_SetWorkMode ( i, WORK_MODE_AGC_PARAM_DECREASE, 8 );
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;
}
//Lines[i].nType=SHENG_KONG;
//Lines[i].nType=YA_KONG;
///if ( i == 0 )
// Lines[i].nType =9;// CALL_IN;
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_MULTIPLAY, OnButtonMultiplay)
ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
ON_BN_CLICKED(IDC_BUTTON_REMOVELISTEN, OnButtonRemovelisten)
ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDER1, OnCustomdrawSlider1)
ON_BN_CLICKED(IDC_BUTTON_MYSET, OnButtonMyset)
//}}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
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)
{
for( int i = 0; i < TotalLine; i++ )
{
StopRecordFile ( i );
}
DConf_DisableConfCard();
DisableCard();
FreeDRV();
delete Lines;
}
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[64];
char old_TmpS[64];
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,64);
if(strcmp(TmpS,old_TmpS)!=0)
pdlg->m_MainList.SetItemText ( chnl, 4, TmpS);
/*
if(RingDetect(chnl))
{
sprintf ( TmpS, "振铃");
pdlg->m_MainList.GetItemText(chnl, 5,old_TmpS,20);
if(strcmp(TmpS,old_TmpS)!=0)
pdlg->m_MainList.SetItemText ( chnl, 5, TmpS);
}
else
{
sprintf ( TmpS, "空闲");
pdlg->m_MainList.GetItemText(chnl, 5,old_TmpS,20);
if(strcmp(TmpS,old_TmpS)!=0)
pdlg->m_MainList.SetItemText ( chnl, 5, TmpS);
}
*/
if(DRec_OffHookDetect(chnl))
{
sprintf ( TmpS, "摘机");
pdlg->m_MainList.GetItemText(chnl, 5,old_TmpS,20);
if(strcmp(TmpS,old_TmpS)!=0)
pdlg->m_MainList.SetItemText ( chnl, 5, TmpS);
// pdlg->m_MainList.SetItemText ( chnl, 7, TmpS);
}
else
{
sprintf ( TmpS, "挂机");
pdlg->m_MainList.GetItemText(chnl, 5,old_TmpS,20);
if(strcmp(TmpS,old_TmpS)!=0)
pdlg->m_MainList.SetItemText ( chnl, 5, TmpS);
// pdlg->m_MainList.SetItemText ( chnl, 7, TmpS);
}
}
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,64);
if(strcmp(TmpS,old_TmpS)!=0)
pdlg->m_MainList.SetItemText ( chnl, 4, TmpS);
if(DRec_OffHookDetect(chnl))
{
sprintf ( TmpS, "摘机");
pdlg->m_MainList.GetItemText(chnl, 5,old_TmpS,20);
if(strcmp(TmpS,old_TmpS)!=0)
pdlg->m_MainList.SetItemText ( chnl, 5, TmpS);
}
else
{
sprintf ( TmpS, "挂机");
pdlg->m_MainList.GetItemText(chnl, 5,old_TmpS,20);
if(strcmp(TmpS,old_TmpS)!=0)
pdlg->m_MainList.SetItemText ( chnl, 5, TmpS);
}
/*
if(DRec_OffHookDetect(chnl))
{
sprintf ( TmpS, "摘机");
pdlg->m_MainList.GetItemText(chnl, 7,old_TmpS,20);
if(strcmp(TmpS,old_TmpS)!=0)
pdlg->m_MainList.SetItemText ( chnl, 7, TmpS);
}
else
{
sprintf ( TmpS, "挂机");
pdlg->m_MainList.GetItemText(chnl, 7,old_TmpS,20);
if(strcmp(TmpS,old_TmpS)!=0)
pdlg->m_MainList.SetItemText ( chnl, 7, TmpS);
}
*/
}
}
void GenFileName ( int chnl, char *FileName )
{
char tmps[40];
char tmpsdr[40];
//char deltmpsdr[40];
int timehour;
CString dolly1;
SYSTEMTIME SysTime;
GetSystemTime ( &SysTime );
sprintf ( tmpsdr, "D:\\voice\\%04d%02d\\",
SysTime.wYear, SysTime.wMonth );
//sprintf ( deltmpsdr, "D:\\voice\\%04d%02d\\",
// SysTime.wYear-1, SysTime.wMonth );
if((SysTime.wHour<25)&&(SysTime.wHour>15))
timehour=SysTime.wHour-16;
else
timehour=8+SysTime.wHour;
sprintf ( tmps, "%02d%02d%02d%02d.%d.pcm",
SysTime.wDay, timehour, SysTime.wMinute, SysTime.wSecond, chnl );
DWORD dwFlag = GetFileAttributes("d:\\voice");
if ( 0xFFFFFFFF == dwFlag )
{//AfxMessageBox ( "目录不存在,请退出!" );
CreateDirectory("d:\\voice", NULL);
CreateDirectory(tmpsdr, NULL);
strcat(tmpsdr,tmps);
strcpy(FileName,tmpsdr);}
else
{
DWORD dwFlag2 = GetFileAttributes(tmpsdr);
if ( 0xFFFFFFFF == dwFlag2 )
{CreateDirectory(tmpsdr, NULL);
strcat(tmpsdr,tmps);
strcpy(FileName,tmpsdr);}
else
{ strcat(tmpsdr,tmps);
strcpy(FileName,tmpsdr);}
/////////////////
SYSTEMTIME SysTime;
GetSystemTime ( &SysTime );
dolly1.Format("d:\\voice\\%4d%2d\\", SysTime.wYear-1,SysTime.wMonth);
DWORD dwFlag3 = GetFileAttributes(dolly1);
if ( 0xFFFFFFFF != dwFlag3 ) //存在
{
CString dolly=dolly1+"*.pcm";
//strcat(deltmpsdr,"*.txt);
WIN32_FIND_DATA fd;
HANDLE hFind = FindFirstFile(dolly , &fd);
//dolly=sPath;
if (hFind != INVALID_HANDLE_VALUE)
{
do
{
DeleteFile(dolly1 + fd.cFileName);
}while (FindNextFile(hFind,&fd));
::FindClose(hFind);
}
RemoveDirectory(dolly1);
}
}
}
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; // 有效录音在300 ms以内的文件将被删除
if ( (dwFileSize > dwSilenceSize) && ((dwFileSize-dwSilenceSize) > dwLeastBytes) ) {
//
// 你也可以选择在这里对文件进行处理,将多余的dwSilenceSize字节截取掉
//
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)) //大于63个的DTMF码不接收,以免溢出
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)){
pdlg->m_MainList.SetItemText ( chnl, 3, "" );
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:
if(GetCallerIDStr (chnl, TmpIDStr) == ID_STEP_OK){
pdlg->m_MainList.SetItemText (chnl, 3, TmpIDStr);
}
r = DRec_OffHookDetect(chnl);
if ( r == 1 ){ // OffHook
// start record when inbound
pdlg->m_MainList.SetItemText ( chnl, 3, "" );
SetWorkStatus ( chnl, CH_START_RECORD );
}
else if ( r == 0){ // OnHook
SetWorkStatus(chnl, CH_INIT);
}
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 );
}
// 检查是否线路断开
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:
//开始预录音
// StartPreLoopRecord(chnl);
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/*, lBytesPerSecond*1 */);
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);
}
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);
}
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
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;
m_btnMultPlay.SetWindowText("音量调整<<");
}
else
{
rect-=&rect1;
this->MoveWindow(&rect);
bFlag=!bFlag;
m_btnMultPlay.SetWindowText("音量调整>>");
}
}
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 ); 会议实现多路监听
m_TextAllListen.SetWindowText(TmpStr);
New_ListenChnl(chnl);
}
void CRecDemoDlg::OnButtonRemovelisten()
{
// TODO: Add your control notification handler code here
//ClearAllListenChnl ( ); //会议
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