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

📄 tvcdemodlg.cpp

📁 上海维卡语言卡开发CTI的示例
💻 CPP
📖 第 1 页 / 共 2 页
字号:
					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 + -