📄 tvcdemodlg.cpp
字号:
szStr=ChInfo[ch].szRxDtmf;
ChInfo[ch].szRxDtmf.Format("%s%s",szStr,szDtmf);
TvcStopRecord(ch);
ChInfo[ch].wStatus=TK_PLYSELECT;
}
DetectBusyHangUp(ch);
break ;
case TK_CHKPLYREC:
if(TvcGetDtmfStr(ch, szDtmf,1,true)>= 1||TvcGetPlayStat(ch)==0)
{
szStr=ChInfo[ch].szRxDtmf;
ChInfo[ch].szRxDtmf.Format("%s%s",szStr,szDtmf);
TvcStopPlay(ch);
ChInfo[ch].wStatus=TK_PLYSELECT;
}
DetectBusyHangUp(ch);
break;
case TK_SENDCODE:
ctSp=CTime::GetCurrentTime()-ChInfo[ch].ctPrev;
if(ctSp.GetTotalSeconds()>=15)
{
//操作超时退出
TvcStopPlay(ch);
TvcClearFileList(ch);
TvcAppendFileToList(ch,"..\\..\\demowav\\timeout.wav",-1,0);
TvcAppendFileToList(ch,"..\\..\\demowav\\Byebye.voc",-1,0);
TvcStartPlayFileList(ch);
ChInfo[ch].wStatus=TK_CHKPLYBYE;
ChInfo[ch].szSndDtmf="";
break;
}
if(TvcGetDtmfStr(ch,szDtmf,1,true))
{
szDtmf[1]=0;
ChInfo[ch].szSndDtmf+=szDtmf;
szStr=ChInfo[ch].szRxDtmf;
ChInfo[ch].szRxDtmf.Format("%s%s",szStr,szDtmf);
if(szDtmf[0]=='#')
{
char temstr[22]={0};
BOOL bFindUser=FALSE;
memcpy(temstr,ChInfo[ch].szSndDtmf,ChInfo[ch].szSndDtmf.GetLength()-1);
//寻找指定的内线分机
for(int i=0;i<m_nUserNum;i++)
{
if(ChInfo[m_nUserList[i]].wCallCode==atoi(temstr) &&
ChInfo[m_nUserList[i]].wStatus==US_IDLE)
{
//对空闲的内线分机振铃,若有主叫则送主叫
TvcStartRingEx(m_nUserList[i],(LPSTR)(LPCSTR)ChInfo[ch].szCallerID);
ChInfo[ch].szSndDtmf="";
ChInfo[ch].nLinkCh=m_nUserList[i];
ChInfo[ch].wStatus=TK_ECHOING;
//转接坐席,播放背景音乐
TvcStopPlay(ch);
TvcClearFileList(ch);
TvcAppendFileToList(ch,"..\\..\\demowav\\switchover.wav",-1,0);
TvcAppendFileToList(ch,"..\\..\\demowav\\background.wav",-1,0);
TvcStartPlayFileList(ch);
//记录与内线相连的外线通道号
ChInfo[m_nUserList[i]].nLinkCh=ch;
ChInfo[m_nUserList[i]].ctPrev=CTime::GetCurrentTime();
bFindUser=TRUE;
break;
}
else if(ChInfo[m_nUserList[i]].wCallCode==atoi(temstr) &&
ChInfo[m_nUserList[i]].wStatus!=US_IDLE)
{
//转接的内线忙
TvcStopPlay(ch);
TvcStartPlayFile(ch,"..\\..\\demowav\\busy.wav",-1,0,0);
ChInfo[ch].szSndDtmf="";
ChInfo[ch].wStatus=TK_PLYSELECT;
bFindUser=TRUE;
break;
}
}
if(!bFindUser)
{
//错误的分机号,请重播
TvcStopPlay(ch);
TvcStartPlayFile(ch,"..\\..\\demowav\\nouser.wav",-1,0,0);
ChInfo[ch].szSndDtmf="";
ChInfo[ch].ctPrev=CTime::GetCurrentTime();
}
}
}
DetectBusyHangUp(ch);
break;
case TK_ECHOING:
ZeroMemory(szDtmf,33);
if(TvcGetDtmfStr(ch,szDtmf,1,true))
{
szStr=ChInfo[ch].szRxDtmf;
ChInfo[ch].szRxDtmf.Format("%s%s",szStr,szDtmf);
}
if(ChInfo[ChInfo[ch].nLinkCh].wStatus==US_TALKING)
ChInfo[ch].wStatus=TK_LINKING;
DetectBusyHangUp(ch);
break;
case TK_LINKING:
ZeroMemory(szDtmf,33);
if(TvcGetDtmfStr(ch,szDtmf,1,true))
{
szStr=ChInfo[ch].szRxDtmf;
ChInfo[ch].szRxDtmf.Format("%s%s",szStr,szDtmf);
}
DetectBusyHangUp(ch);
break;
case TK_WAITANS://此状态在含有内线的demo程序中没有使用
ret=TvcGetToneAnalyzeResult(ch);
switch(ret)
{
case tone_stillanalyze:
break;
case tone_dial:
break;
case tone_buzy:
TvcStartTxDtmf(ch,"!");
TvcStartPlayFile(ch,"..\\..\\demowav\\busy.wav",-1,0,0);
TvcCloseToneAnalyze(ch);
ChInfo[ch].wStatus=TK_PLYSELECT;
break;
case tone_echo:
ctSp=CTime::GetCurrentTime()-ChInfo[ch].ctPrev;
if(ctSp.GetTotalSeconds()>=30)
{
TvcStartTxDtmf(ch,"!");
TvcStartPlayFile(ch,"..\\..\\demowav\\busy.wav",-1,0,0);
TvcCloseToneAnalyze(ch);
ChInfo[ch].wStatus=TK_PLYSELECT;
break;
}
break;
case tone_speaking:
TvcHangUp(ch);
TvcCloseToneAnalyze(ch);
ChInfo[ch].wStatus=TK_IDLE;
ChInfo[ch].nLinkCh=-1;
ChInfo[ch].szRxDtmf="";
ChInfo[ch].szSndDtmf="";
break;
default:
break ;
}
break;
case TK_CHKPLYBYE:
ZeroMemory(szDtmf,33);
if(TvcGetDtmfStr(ch,szDtmf,1,true))
{
szStr=ChInfo[ch].szRxDtmf;
ChInfo[ch].szRxDtmf.Format("%s%s",szStr,szDtmf);
}
if(TvcGetPlayStat(ch)==0)
{
TvcHangUp(ch);
ChInfo[ch].wStatus=TK_IDLE;
ChInfo[ch].nLinkCh=-1;
ChInfo[ch].szRxDtmf="";
ChInfo[ch].szSndDtmf="";
}
DetectBusyHangUp(ch);
break ;
case TK_EMPTY:
if(ChInfo[ch].wCallStep==ch_free)
{
ChInfo[ch].wStatus=TK_IDLE;
ChInfo[ch].nLinkCh=-1;
ChInfo[ch].szRxDtmf="";
ChInfo[ch].szSndDtmf="";
}
DetectBusyHangUp(ch);
break;
case US_IDLE:
if(TvcGetHookState(ch))
{
//内线摘机开始录音
sprintf((char*)tmpfile,".\\UserCh%d.wav",ChInfo[ch].wCallCode);
TvcStartFileRecordA(ch,(char*)tmpfile,"",voc_alaw,0,0,0);
ChInfo[ch].wStatus=US_DIALING;
ChInfo[ch].ctPrev=CTime::GetCurrentTime();
}
if(TvcGetRingCount(ch)>0)
{
ChInfo[ch].ctPrev=CTime::GetCurrentTime();
ChInfo[ch].wStatus=US_RINGING;
}
break;
case US_OUTDIAL:
ZeroMemory(szDtmf,33);
if(TvcGetDtmfStr(ch, szDtmf,1,true)>=1)
{
szStr=ChInfo[ch].szRxDtmf;
ChInfo[ch].szRxDtmf.Format("%s%s",szStr,szDtmf);
TvcClrRxDtmfBuf(ch);
switch(szDtmf[0])
{
case '#':
TvcDialOut(ChInfo[ch].nLinkCh,(LPSTR)(LPCTSTR)ChInfo[ch].szRxDtmf,"02163810053",0,0);
TvcSetLinkWith(ch,7,ChInfo[ch].nLinkCh,7);
ChInfo[ch].wStatus=US_TALKING;
bFindTrk=TRUE;
break;
}
}
break;
case US_DIALING:
ctSp=CTime::GetCurrentTime()-ChInfo[ch].ctPrev;
if(ctSp.GetTotalSeconds()>=30)
{
//操作超时对内线发送忙音
TvcStartSendTone(ch,BUSY_TONE,0,0);
ChInfo[ch].wStatus=US_PENDING;
break;
}
if(!TvcGetHookState(ch))
{
ChInfo[ch].wStatus=US_PENDING;
break;
}
ZeroMemory(szDtmf,33);
if(TvcGetDtmfStr(ch, szDtmf,1,true)>=1)
{
szStr=ChInfo[ch].szRxDtmf;
ChInfo[ch].szRxDtmf.Format("%s%s",szStr,szDtmf);
TvcClrRxDtmfBuf(ch);
int i=0;
ChInfo[ch].ctPrev=CTime::GetCurrentTime();
switch(szDtmf[0])
{ //拨0表示拨打外线
case '0':
bFindTrk=FALSE;
//寻找空闲的外线通道
for(i=0;i<m_nTruckNum;i++)
{
if(ChInfo[m_nTruckList[i]].wStatus==TK_IDLE)
{
//外线摘机
ChInfo[ch].szRxDtmf.Empty();
TvcPickUp(m_nTruckList[i]);
ChInfo[m_nTruckList[i]].wStatus=TK_LINKING;
ChInfo[ch].nLinkCh=m_nTruckList[i];
ChInfo[ch].wStatus=US_OUTDIAL;
bFindTrk=TRUE;
break;
}
}
if(!bFindTrk)
{
//外线全忙请稍后再拨
TvcStopPlay(ch);
TvcStartPlayFile(ch,"..\\..\\demowav\\dialoutbusy.wav",-1,0,0);
ChInfo[ch].wStatus=US_PENDING;
}
break;
//拨2表示拨打内线电话
case '2':
szDtmf[1]=0;
ChInfo[ch].szSndDtmf+=szDtmf;
ChInfo[ch].wStatus=US_INCALLING;
break;
default:
//按其他号码则送忙音,表示无法拨出
TvcStartSendTone(ch,BUSY_TONE,0,0);
ChInfo[ch].wStatus=US_PENDING;
break;
}
}
break;
case US_INCALLING:
ctSp=CTime::GetCurrentTime()-ChInfo[ch].ctPrev;
if(ctSp.GetTotalSeconds()>=30)
{
//操作超时对内线发送忙音
TvcStartSendTone(ch,BUSY_TONE,0,0);
ChInfo[ch].wStatus=US_PENDING;
break;
}
if(!TvcGetHookState(ch))
{
ChInfo[ch].wStatus=US_PENDING;
break;
}
if(TvcGetDtmfStr(ch,szDtmf,1,true))
{
ChInfo[ch].ctPrev=CTime::GetCurrentTime();
szDtmf[1]=0;
ChInfo[ch].szSndDtmf+=szDtmf;
szStr=ChInfo[ch].szRxDtmf;
ChInfo[ch].szRxDtmf.Format("%s%s",szStr,szDtmf);
char temstr[22]={0};
memcpy(temstr,ChInfo[ch].szSndDtmf,ChInfo[ch].szSndDtmf.GetLength());
//搜寻分机号
for(int i=0;i<m_nUserNum;i++)
{
//找到分机号,且状态空闲,则对其振铃
if(ChInfo[m_nUserList[i]].wCallCode==atoi(temstr) &&
ChInfo[m_nUserList[i]].wStatus==US_IDLE)
{
ZeroMemory(temstr,22);
sprintf(temstr,"%d",ChInfo[ch].wCallCode);
//对空闲的内线分机振铃,送主叫
TvcStartRingEx(m_nUserList[i],temstr);
//TvcSetLinkWith(ch,7,m_nUserList[i],7);
ChInfo[ch].szSndDtmf="";
ChInfo[ch].nLinkCh=m_nUserList[i];
ChInfo[ch].wStatus=US_ECHOING;
ChInfo[m_nUserList[i]].nLinkCh=ch;
break;
}
//找到分机号,状态不是空闲,则回送忙音
else if(ChInfo[m_nUserList[i]].wCallCode==atoi(temstr) &&
ChInfo[m_nUserList[i]].wStatus!=US_IDLE)
{
TvcStartSendTone(ch,BUSY_TONE,0,0);
ChInfo[ch].szSndDtmf="";
ChInfo[ch].wStatus=US_PENDING;
break;
}
}
if(ChInfo[ch].szSndDtmf.GetLength()>=4)
{
//错误的分机号,请重播
TvcStopPlay(ch);
TvcStartPlayFile(ch,"..\\..\\demowav\\nouser1.wav",-1,0,0);
ChInfo[ch].szSndDtmf="";
ChInfo[ch].wStatus=US_DIALING;
}
}
break;
case US_ECHOING:
ZeroMemory(szDtmf,33);
if(TvcGetDtmfStr(ch,szDtmf,1,true))
{
szStr=ChInfo[ch].szRxDtmf;
ChInfo[ch].szRxDtmf.Format("%s%s",szStr,szDtmf);
}
if(!TvcGetHookState(ch))
{
//此时挂机停止向对端振铃
TvcStopRing(ChInfo[ch].nLinkCh);
TvcClearRingCount(ChInfo[ch].nLinkCh);
ChInfo[ch].wStatus=US_PENDING;
}
if(ChInfo[ChInfo[ch].nLinkCh].wStatus==US_TALKING)
{
ChInfo[ch].wStatus=US_TALKING;
TvcSetLinkWith(ch,7,ChInfo[ch].nLinkCh,7);
}
break;
case US_PENDING:
if(TvcGetDtmfStr(ch,szDtmf,1,true))
{
szStr=ChInfo[ch].szRxDtmf;
ChInfo[ch].szRxDtmf.Format("%s%s",szStr,szDtmf);
}
if(!TvcGetHookState(ch))
{
//内线挂机就停止录音
if(TvcCheckRecord(ch)>0)
TvcStopRecord(ch);
if(TvcGetPlayStat(ch)>0)
TvcStopPlay(ch);
if(ChInfo[ch].nLinkCh!=-1)
{
ChInfo[ch].nLinkCh=-1;
//清除内外线连接
TvcClearLinkWith(ch);
}
TvcStopSendTone(ch);
ChInfo[ch].szSndDtmf="";
ChInfo[ch].szRxDtmf="";
ChInfo[ch].wStatus=US_IDLE;
}
break;
case US_RINGING:
ctSp=CTime::GetCurrentTime()-ChInfo[ch].ctPrev;
if(ctSp.GetTotalSeconds()>=15)
{
//操作超时退出
TvcStopRing(ch);
TvcClearRingCount(ch);
if(ChInfo[ChInfo[ch].nLinkCh].wModule!=ANALOG_USER)
{
TvcStopPlay(ChInfo[ch].nLinkCh);
TvcClearFileList(ChInfo[ch].nLinkCh);
TvcAppendFileToList(ChInfo[ch].nLinkCh,"..\\..\\demowav\\noan.wav",-1,0);
TvcAppendFileToList(ChInfo[ch].nLinkCh,"..\\..\\demowav\\reclvword.wav",-1,0);
TvcStartPlayFileList(ChInfo[ch].nLinkCh);
ChInfo[ChInfo[ch].nLinkCh].wStatus=TK_CHKRECSTART;
ChInfo[ChInfo[ch].nLinkCh].ctPrev=CTime::GetCurrentTime();
}
if(ChInfo[ch].nLinkCh!=-1)
{
ChInfo[ch].nLinkCh=-1;
TvcClearLinkWith(ch);
}
ChInfo[ch].wStatus=US_IDLE;
ChInfo[ch].szRxDtmf="";
break;
}
ZeroMemory(szDtmf,33);
if(TvcGetDtmfStr(ch,szDtmf,1,true))
{
szStr=ChInfo[ch].szRxDtmf;
ChInfo[ch].szRxDtmf.Format("%s%s",szStr,szDtmf);
}
//摘机
if(TvcGetHookState(ch))
{
//外线停止背景音乐
if(ChInfo[ChInfo[ch].nLinkCh].wModule!=ANALOG_USER)
TvcStopPlay(ChInfo[ch].nLinkCh);
//内线停止发送拨号音
TvcStopSendTone(ch);
//内线摘机开始录音
sprintf((char*)tmpfile,".\\UserCh%d.wav",ChInfo[ch].wCallCode);
TvcStartFileRecordA(ch,(char*)tmpfile,"",voc_alaw,-1,0,0);
//内外线通道相连,开始通话
if(ChInfo[ChInfo[ch].nLinkCh].wModule!=ANALOG_USER)
TvcSetLinkWith(ch,7,ChInfo[ch].nLinkCh,7);
ChInfo[ch].wStatus=US_TALKING;
}
//未摘机且振铃次数归零则认为对方停止振铃
if(!TvcGetHookState(ch) && TvcGetRingCount(ch)==0)
ChInfo[ch].wStatus=US_PENDING;
break;
case US_TALKING:
ZeroMemory(szDtmf,33);
if(TvcGetDtmfStr(ch,szDtmf,1,true))
{
szStr=ChInfo[ch].szRxDtmf;
ChInfo[ch].szRxDtmf.Format("%s%s",szStr,szDtmf);
}
//判断通话两端是否已经挂机,若已挂机则进入清除通道操作
//判断本端通话的内线是否已挂机,则进入清除通道操作
if(!TvcGetHookState(ch) ||
//判断通话的对端如果是内线模块,且进入挂起状态,则进入清除通道操作
ChInfo[ChInfo[ch].nLinkCh].wModule==ANALOG_USER && ChInfo[ChInfo[ch].nLinkCh].wStatus==US_PENDING ||
//判断通话的对端如果是外线线模块,且进入空闲状态,则进入清除通道操作
ChInfo[ChInfo[ch].nLinkCh].wModule!=ANALOG_USER && ChInfo[ChInfo[ch].nLinkCh].wStatus==TK_IDLE)
{
if(ChInfo[ch].nLinkCh!=-1)
{
if(ChInfo[ChInfo[ch].nLinkCh].wStatus!=TK_IDLE ||
ChInfo[ChInfo[ch].nLinkCh].wStatus!=US_PENDING)
{
if(ChInfo[ChInfo[ch].nLinkCh].wModule!=ANALOG_USER)
{
TvcHangUp(ChInfo[ch].nLinkCh);
ChInfo[ChInfo[ch].nLinkCh].nLinkCh=-1;
ChInfo[ChInfo[ch].nLinkCh].szSndDtmf="";
ChInfo[ChInfo[ch].nLinkCh].szRxDtmf="";
ChInfo[ChInfo[ch].nLinkCh].wStatus=TK_IDLE;
}
else
{
ChInfo[ChInfo[ch].nLinkCh].nLinkCh=-1;
TvcStopRing(ChInfo[ch].nLinkCh);
TvcClearRingCount(ch);
TvcClearLinkWith(ChInfo[ch].nLinkCh);
//对内线发送忙音
TvcStartSendTone(ChInfo[ch].nLinkCh,BUSY_TONE,0,0);
ChInfo[ChInfo[ch].nLinkCh].wStatus=US_PENDING;
}
}
ChInfo[ch].nLinkCh=-1;
TvcClearLinkWith(ch);
//对内线发送忙音
TvcStartSendTone(ch,BUSY_TONE,0,0);
ChInfo[ch].wStatus=US_PENDING;
}
}
break;
default:
break ;
}
}
}
void CTvcDemoDlg::OnClose()
{
// TODO: Add your message handler code here and/or call default
if(m_bOnLoad)
TvcFreeDrv();
KillTimer(1);
m_wndList.DeleteAllItems();
CDialog::OnClose();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -