📄 frmmain.cs
字号:
D160A.StartIndexPlayFile(i);
Lines[i].State = CHANNEL_STATE.CH_PLAYRESULT;
break;
case "2":
D160A.StopPlayFile(i);
D160A.RsetIndexPlayFile(i);
FileName = GetFilePath("bank.006");
D160A.AddIndexPlayFile(i, FileName);
FileName = GetFilePath("bank.008");
D160A.AddIndexPlayFile(i, FileName);
D160A.StartIndexPlayFile(i);
Lines[i].State = CHANNEL_STATE.CH_PLAYRESULT;
break;
case "3":
D160A.StopPlayFile(i);
D160A.RsetIndexPlayFile(i);
FileName = GetFilePath("bank.007");
D160A.AddIndexPlayFile(i, FileName);
FileName = GetFilePath("d3");
D160A.AddIndexPlayFile(i, FileName);
D160A.StartIndexPlayFile(i);
Lines[i].State = CHANNEL_STATE.CH_PLAYRESULT;
break;
case "4"://转人工
Lines[i].State = CHANNEL_STATE.CH_WELCOME1;
break;
}
}
else if (Lines[i].intTimeCount == 3)//判断重复播音次数
{ Lines[i].State = CHANNEL_STATE.CH_PLAYRESULT; }
else if (Lines[i].nTimeElapse != 1000)
{ Lines[i].nTimeElapse += 20; }
else if (Lines[i].nTimeElapse == 1000)
{
Lines[i].State = CHANNEL_STATE.CH_WELCOME;
Lines[i].nTimeElapse = 0;
Lines[i].intTimeCount++;
}
break;
case CHANNEL_STATE.CH_PLAYRESULT: //ch_playresult;
if (D160A.CheckIndexPlayFile(i))
{
D160A.StopIndexPlayFile(i);
if (Lines[i].nType == CHANNEL_TYPE.Trunk)
{ ResetChnl(i); }
else if (Lines[i].nType == CHANNEL_TYPE.User)
{//控制信号音的播放。本函数实质上使用内存循环放音来实现的。其中:
//拨号音的时间长度为响0.75秒,停止3秒;
//忙音一的时间长度为响0.35秒,停止0.35秒;
//忙音二的时间长度为响0.7秒,停止0.7秒;
D160A.StartPlaySignal(i, (int)(SigType.SIG_BUSY1));
Lines[i].State = CHANNEL_STATE.CH_WAITUSERONHOOK;
}
}
break;
case CHANNEL_STATE.CH_WAITUSERONHOOK: //H_WAITUSERONHOOK
if (!D160A.RingDetect(i))
{
D160A.StartPlaySignal(i, (int)(SigType.SIG_STOP));
ResetChnl(i);
}
break;
//转人工模块
case CHANNEL_STATE.CH_WELCOME1:
D160A.InitDtmfBuf(sWitCh[i]);//清空摘机的线路通道
StartPlayFileEx(sWitCh[i], "Bank.001");//播放音乐等待接通
Lines[i].State = CHANNEL_STATE.CH_WELCOME0;
break;
case CHANNEL_STATE.CH_WELCOME0:
if (D160A.CheckPlayEnd(sWitCh[i]))//检查摘机的线路通道播放音乐是否完成
{
D160A.StopPlayFile(sWitCh[i]);//停止摘机的线路通道播音
Lines[i].State = CHANNEL_STATE.CH_PASSWORD;//选择通道号
}
break;
case CHANNEL_STATE.CH_PASSWORD://选择通道号
Code = D160A.GetDtmfCode(sWitCh[i]);//在摘机的线路通道中输入要连接的内绩通道
if (Code != -1)
{
Dtmf[i] = Code;//将选择联接的通道号赋值给数组
if (Dtmf[i] > 0 && Dtmf[i] < 8 || Dtmf[i] == 10)
{
D160A.StartPlaySignal(sWitCh[i], (int)SigType.SIG_STOP);//控制主叫通道的语音
Lines[i].State = CHANNEL_STATE.CH_SELECT1;//判断选择通道的状态
}
}
break;
case CHANNEL_STATE.CH_SELECT1://判断选择通道的状态
if (Lines[Dtmf[i]].State == CHANNEL_STATE.CH_FREE)//判断被叫通道是否空闲
{
D160A.FeedRealRing(Dtmf[i]);//对被叫通道馈断续的铃流.选择的人工作席
D160A.StartPlaySignal(sWitCh[i], (int)SigType.SIG_RINGBACK);//控制信号音的播放,SIG_RINGBACK 回铃音
Lines[Dtmf[i]].State = CHANNEL_STATE.CH_RECEIVEID;//显示被叫通道的状态
Lines[i].State = CHANNEL_STATE.CH_ACCOUNT1;
}
else//
{
D160A.StartPlaySignal(sWitCh[i], (int)SigType.SIG_BUSY2);//控制主叫通道信号音的播放
Lines[Dtmf[i]].State = CHANNEL_STATE.CH_ConBusy0;//显示被叫通道的状态
Lines[i].State = CHANNEL_STATE.CH_ConBusy;
}
break;
case CHANNEL_STATE.CH_ConBusy://此功能显示通道忙
if (Lines[sWitCh[i]].nType == CHANNEL_TYPE.Trunk)
{ }
else if (Lines[sWitCh[i]].nType == CHANNEL_TYPE.User)
{
bUser[Dtmf[i]] = false;
Lines[i].State = CHANNEL_STATE.CH_ACCOUNT1;//下步操作
}
break;
case CHANNEL_STATE.CH_ACCOUNT1:
//检测被叫通道是否摘机
if (D160A.OffHookDetect(Dtmf[i]) == 1 && bUser[Dtmf[i]] == true)//检测录音模块的摘挂机状态,只对录音模块有效。
{
D160A.StartPlaySignal(sWitCh[i], (int)SigType.SIG_STOP);//控制信号音的播放,停止
D160A.StopPlay(sWitCh[i]);//控制文件的播放/////////////////////
Lines[sWitCh[i]].State = CHANNEL_STATE.CH_Over;//请挂机
Lines[i].State = CHANNEL_STATE.CH_ACCOUNT2;//已挂机
break;
}//检测二次拍叉簧动作
else if (D160A.HangUpDetect(Dtmf[i]) == (int)HangUp.HANG_UP_FLAG_PRESS_R && sWitCh[i] != i)
{//检测某一通道的挂机状态,拍了一下叉簧
D160A.FeedPower(Dtmf[i]);//对被叫线通道馈电,同时停止馈铃流,同时停止溃电
ResetChnl(Dtmf[i]);//调用方法
D160A.StartPlaySignal(i, (int)SigType.SIG_STOP);//调用方法
D160A.StopPlay(sWitCh[i]);
Dtmf[i] = sWitCh[i];//将主叫号码赋值给被叫号码
Lines[Dtmf[i]].State = CHANNEL_STATE.CH_Connect;//正在转接
Lines[sWitCh[i]].State = CHANNEL_STATE.CH_PASSWORD1;//正在转接
Lines[i].State = CHANNEL_STATE.CH_ACCOUNT;
bUser[Dtmf[i]] = true;
break;
} //在对方正在振铃时挂机处理
else if (Lines[i].nType == CHANNEL_TYPE.User)//内线
{
if (D160A.HangUpDetect(sWitCh[i]) == (int)HangUp.HANG_UP_FLAG_TRUE)//已经挂机
{
ResetPower(i); //调用自定义方法
ResetChnl(Dtmf[i]); //调用自定义方法
bUser[i] = true;
break;
}
}//在对方正在振铃时挂机处理
break;
case CHANNEL_STATE.CH_ACCOUNT2://已挂
D160A.FeedPower(Dtmf[i]);//对某一路内线通道馈电,同时停止馈铃流
Lines[i].State = CHANNEL_STATE.CH_ACCOUNT;//停止文件
Lines[Dtmf[i]].State = CHANNEL_STATE.CH_PASSWORD1;//已接通
break;
case CHANNEL_STATE.CH_ACCOUNT://停止播放文件
D160A.StopPlay(i);//停止放音
sWitCh[i] = (short)-1;
if (D160A.SetLink(i, Dtmf[i]) == 1) //两路连通。
{
Lines[i].State = CHANNEL_STATE.CH_ACCOUNT3;
}
break;
case CHANNEL_STATE.CH_ACCOUNT3:
D160A.StartHangUpDetect(Dtmf[i]);//某一通道开始挂机检测;当某通道摘机后,可以调用本函数。该函数只对内线通道有效。
Lines[i].State = CHANNEL_STATE.CH_ACCOUNT4;
break;
case CHANNEL_STATE.CH_ACCOUNT4:
// '检测转机用户拍叉簧
if (D160A.HangUpDetect(Dtmf[i]) == (int)HangUp.HANG_UP_FLAG_PRESS_R)//检测某一通道的挂机状态,拍了一下叉簧
{
sWitCh[i] = Dtmf[i];
Lines[Dtmf[i]].State = CHANNEL_STATE.CH_Connect;//正在转接
D160A.ClearLink(i, Dtmf[i]);//两路拆除连通。
D160A.StopPlay(Dtmf[i]);
Dtmf[i] = -1;
Lines[i].State = CHANNEL_STATE.CH_WELCOME;
StartPlayFileEx(sWitCh[i], "Dial.001");//播放音乐等待接
}
// '检测被叫用户挂机
if (D160A.HangUpDetect(Dtmf[i]) == (int)HangUp.HANG_UP_FLAG_TRUE)
{
SigCheck[Dtmf[i]] = (short)D160A.ClearLink(i, Dtmf[i]);//两路拆除连通。
if (SigCheck[Dtmf[i]] == 0)
{
D160A.StartPlaySignal(i, (int)SigType.SIG_BUSY1);//调用方法
}
ResetPower(i);//自定义方法调用
ResetChnl(Dtmf[i]);//自定义方法2
Lines[i].State = CHANNEL_STATE.CH_IsOver;
}
//'检测为内线的主叫用户挂机
if (Lines[i].nType == CHANNEL_TYPE.User)
{
if (D160A.HangUpDetect(i) == (int)HangUp.HANG_UP_FLAG_TRUE)
{
SigCheck[Dtmf[i]] = (short)D160A.ClearLink(i, Dtmf[i]);//两路拆除连通。
if (D160A.ClearLink(i, Dtmf[i]) == 0)
{
D160A.StartPlaySignal(i, (int)SigType.SIG_BUSY1);//调用方法
}
ResetChnl(i);//调用函数
}
}
break;
} //473对应251行
//判断外线if (Lines[i].nType == CHANNEL_TYPE.Trunk && Lines[i].State != CHANNEL_STATE.CH_FREE)
if (Lines[i].nType == CHANNEL_TYPE.Trunk && Lines[i].State != CHANNEL_STATE.CH_FREE && Lines[i].State != CHANNEL_STATE.CH_RECEIVEID)
{
if (D160A.Sig_CheckBusy(i) == 1)//进行挂机忙音检测,1 检测到忙音
{
SigCheck[i] = (short)D160A.ClearLink(i, Dtmf[i]); // 两路拆除连通。
if (SigCheck[i] == 0)
{
D160A.StartPlaySignal(i, (int)SigType.SIG_BUSY1);//调用方法
Lines[Dtmf[i]].State = CHANNEL_STATE.CH_Over;
}
ResetChnl(i);//调用方法ResetChnl(i)
}
}//判断内线条件
else if (Lines[i].nType == CHANNEL_TYPE.User && Lines[i].State != CHANNEL_STATE.CH_FREE && Lines[i].State != CHANNEL_STATE.CH_RECEIVEID)
{
if (D160A.RingDetect(i))
{
if (SigCheck[i] == 0)
{
Lines[i].State = CHANNEL_STATE.CH_Over;
}
}
else if (D160A.HangUpDetect(i) == (int)HangUp.HANG_UP_FLAG_TRUE)
{
ResetChnl(i);
}
}
}
}
#endregion
#region 此方法播放音频文件
private void StartPlayFileEx(short wChnlNo, string FileName)
{
byte[] FName = GetFilePath(FileName);//原代码
D160A.StartPlayFile(wChnlNo, FName, 0); //public static extern bool StartPlayFile(short wChnlNo, byte[] FileName, int StartPos);
}
#endregion
#region 此方法处理音频文件的路径
private byte[] GetFilePath(string FileName)
{
//获取文件路径//说明,声音文件的路径中不能含有中文
string strPath = Application.StartupPath.Substring(0, Application.StartupPath.Substring(0, Application.StartupPath.LastIndexOf("\\")).LastIndexOf("\\"));
strPath = strPath.Substring(0, strPath.LastIndexOf("\\"));
strPath += @"\Voice\" + FileName;
char[] TmpFName = new char[128];
byte[] FName = new byte[128];
for (int i = 0; i < strPath.Length; i++)
{
TmpFName[i] = Convert.ToChar(strPath.Substring(i, 1));
}
for (int i = 0; i < TmpFName.Length; i++)
{
FName[i] = (byte)TmpFName[i];
}
return FName;
}
#endregion
#region 此方法动态处理界面的显示
private void ListViewState(short wChnlNo)
{ //519对应552行
string strTmp = ""; //初始化strTmp;
switch (Lines[wChnlNo].State)
{
case CHANNEL_STATE.CH_FREE: //空闲 //若ch_free;
strTmp = "空闲";
break;
case CHANNEL_STATE.CH_WELCOME: //若ch_welcome;
strTmp = "企业电话客服演示系统";
break;
case CHANNEL_STATE.CH_SELECT: //若ch_select;
strTmp = "按1公司介绍,按2产品介绍,按3优惠政策,按4人工服务";
break;
case CHANNEL_STATE.CH_WAITUSERONHOOK:// "等待内线挂机";
strTmp = "等待内线挂机";
break;
case CHANNEL_STATE.CH_ConBusy:
strTmp = "对方正忙";
break;
case CHANNEL_STATE.CH_ConBusy0:
strTmp = "对方正忙";
break;
case CHANNEL_STATE.CH_Connect:
strTmp = "正在转接";
break;
case CHANNEL_STATE.CH_Over:
strTmp = "请挂机";
break;
case CHANNEL_STATE.CH_IsOver:
strTmp = "对方已挂机";
break;
case CHANNEL_STATE.CH_PASSWORD0:
case CHANNEL_STATE.CH_PASSWORD:
strTmp = "请拨号";
break;
case CHANNEL_STATE.CH_PASSWORD1:
case CHANNEL_STATE.CH_ACCOUNT4:
case CHANNEL_STATE.CH_ACCOUNT:
strTmp = "已接通";
break;
case CHANNEL_STATE.CH_RECEIVEID:
strTmp = "有来电呼入。。。";
break;
case CHANNEL_STATE.CH_ACCOUNT1:
strTmp = "请稍候。。。。";
break;
case CHANNEL_STATE.CH_ACCOUNT2:
strTmp = "正在连接。。。";
break;
}
if (ChnlState_LV.Items[wChnlNo].SubItems[2].Text != Lines[wChnlNo].State.ToString())
ChnlState_LV.Items[wChnlNo].SubItems[2].Text = Lines[wChnlNo].State.ToString();
if (ChnlState_LV.Items[wChnlNo].SubItems[3].Text != Lines[wChnlNo].CallerID)
ChnlState_LV.Items[wChnlNo].SubItems[3].Text = Lines[wChnlNo].CallerID;
if (ChnlState_LV.Items[wChnlNo].SubItems[4].Text != Lines[wChnlNo].Dtmf)
ChnlState_LV.Items[wChnlNo].SubItems[4].Text = Lines[wChnlNo].Dtmf;
if (ChnlState_LV.Items[wChnlNo].SubItems[5].Text != strTmp)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -