📄 mytw8vid.cpp
字号:
/*#####################################################################
程序:MyTw8vid.H
类名:CMyTw8vid
功能: 对 Tw8vid 中的 API 函数进行封装
类设计: 付恩宇
日期: 2006年12月08日星期五
#####################################################################*/
#include "stdafx.h"
#include "TelNetVod.h"
#include "MyTw8vid.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
// 构造函数
CMyTw8vid::CMyTw8vid()
{
}
// 析构函数
CMyTw8vid::~CMyTw8vid()
{
}
/***********************************************************
* 功能:初始化 TeleWind (TM) 系统并获取语音卡序列号函数
* 参数 1:通道号
* 参数 2: 存放语音卡的序列号
* 返回值:0 成功
* -1 没安装语音卡驱动
* 1 出现了异常
************************************************************/
int CMyTw8vid::InitializeSystem(int ch,char *VoiceCardSerial)
{
try
{
// 如果已安装 TeleWind 8v 驱动程序
if(TV_Installed()!=0)
{
// 初始化系统中所有的 TW8VID 电话卡
TV_Initialize();
// 设置语音卡接收主叫号码方式。
TV_SetAdapterParam(1,0);
// 获取语音卡序列号
TV_GetSerial(VoiceCardSerial);
// 外通道挂机
TV_HangUpCtrl(ch);
}
else // TeleWind 8V 驱动程序未安装
{
// 将信息写入系统日志
CReadOrWriteInfo::WriteInfoToiniFile("CMyTw8vid 类","未安装语音卡驱动",0);
return -1;
}
return 0;
}
catch (...)
{
// 将信息写入系统日志
CReadOrWriteInfo::WriteInfoToiniFile("CMyTw8vid 类","执行 InitializeSystem 函数时出现了异常",1);
return 1;
}
}
/***********************************************************
* 功能:监听外线电话入中继并获取主叫号码函数
* 参数 1:通道号
* 参数 2: 存放入中继主叫号码
* 返回值:0 成功检测到了主叫号码
* -1 没检测到主叫号码
* 1 出现了异常
************************************************************/
int CMyTw8vid::ListenTelPhone(int ch, char TelNumberArray[])
{
int nTelCodeNum = 0;
try
{
// 若震铃次数大于两次则取主叫号码
if( TV_RingDetect (ch)>2)
{
// 检测主叫电话号码
nTelCodeNum=TV_ReceiveCallingID(ch,TelNumberArray,MAX_CALLINGID_LEN);
// 主叫号码结尾补 '\0'
TelNumberArray[nTelCodeNum]='\0';
}
// 若检测到主叫号码则返回 0
if (nTelCodeNum != 0)
return 0;
else
return -1;
}
catch (...)
{
// 挂断电话
TV_HangUpCtrl(ch);
// 将信息写入系统日志
CReadOrWriteInfo::WriteInfoToiniFile("CMyTw8vid 类","执行 ListenTelPhone 函数时出现了异常",1);
return 1;
}
}
/***********************************************************
* 功能:根据语音卡序列号生成系统注册码函数
* 参数 1:语音卡序列号
* 返回值:!=1 系统注册码
* 1 出现了异常
************************************************************/
long CMyTw8vid::CheckSerial(char scSerial[])
{
int index = 0;
char sTemp[2];
CString sVal;
long lVal;
long lTotal=0;
try
{
sTemp[1]='\0';
// 将语音卡序列号的各位累加
while(true)
{
if(scSerial[index]=='\0')
break;
sTemp[0]=scSerial[index];
sVal=sTemp;
lVal=(long)atof(sVal);
lTotal+=lVal;
index++;
}
lTotal+=19810916;
sVal=scSerial;
lVal=(long)atof(sVal);
lTotal+=lVal;
return lTotal;
}
catch (...)
{
// 将信息写入系统日志
CReadOrWriteInfo::WriteInfoToiniFile("CMyTw8vid 类","执行根据语音 CheckSerial 函数时出现了异常",1);
return 1;
}
}
/***********************************************************
* 功能:单文件放音函数
* 文件格式: *.tw
* 参数 0 :通道号
* 参数 1 :语音文件路径
* 返回值:无
************************************************************/
int CMyTw8vid::PlayTelephoneVoice(int ch, CString VoiceFilePath)
{
// 播放录音
char sFilePath[100];
long PlayTotal,PlayRest;
CString sTemp;
try
{
strcpy(sFilePath,VoiceFilePath.GetBuffer(VoiceFilePath.GetLength()));
sFilePath[VoiceFilePath.GetLength()]='\0';
// 开始某一通道文件的放音
if (PlayTotal = TV_StartPlayFile (ch,sFilePath, 0L, LONG_MAX) > 0)
{
// 继续文件的放音
while ((PlayRest = TV_PlayFileRest (ch)) > 0)
::Sleep(100L);
}
else
{
// 获取错误号
PlayTotal = TV_GetLastError();
// 将错误信息写入系统日志
sTemp.Format("通道%2d : 播放 *.Tw 文件失败,错误号为:%2d",ch,PlayTotal);
CReadOrWriteInfo::WriteInfoToiniFile("CMyTw8vid 类",sTemp,0);
// 本方挂机, 控制中继拆线
TV_HangUpCtrl(ch);
}
return 0;
}
catch (...)
{
// 强制停止某一通道的文件放音
TV_StopPlayFile(ch);
// 本方挂机, 控制中继拆线
TV_HangUpCtrl(ch);
// 将异常信息写入异常日志
sTemp.Format("通道%2d : 播放 *.Tw 文件时出现了异常",ch);
CReadOrWriteInfo::WriteInfoToiniFile("CMyTw8vid 类",sTemp,1);
return -1;
}
}
/***********************************************************
* 功能:获取 DTMF 码函数
* 参数:通道号
* 返回值:若返回 0 获取 DTMF 码成功
* 1 在获取 DTMF 码时出现了异常
* -1 用户没有按键
************************************************************/
int CMyTw8vid::GetDTMFChar(int ch, char *Key)
{
try
{
// 该通道接收 DTMF 码
*Key = (char)TV_GetDTMFChar(ch);
// 清除该通道 DTMF 缓冲区
// TV_FlushDTMF(ch);
} // End_try
catch(...)
{
// 清除该通道 DTMF 缓冲区
TV_FlushDTMF(ch);
// 该通道挂机控制中继拆线
TV_HangUpCtrl(ch);
// 将异常信息写入异常日志
CReadOrWriteInfo::WriteInfoToiniFile("CMyTw8vid 类","执行 GetDTMFChar 函数时出现了异常!",1);
return 1;
}
return -1;
}
/***********************************************************
* 功能:获取 DTMF 码串函数
* 参数:通道号
* 返回值:若返回 0 获取 DTMF 码串成功
* 1 在获取 DTMF 码串时出现了异常
* 2 用户挂机
************************************************************/
int CMyTw8vid::GetDTMFstr(int ch, CString *sDTMFstr, char Key)
{
char DTMFstr[512] = {0};
char GetKey;
int Loop = 0,nReturnValue,*pSignalNum=NULL,*pSignalLength=NULL;
CString sTemp;
try
{
while(TRUE)
{
//查询某一通道的信号音结果
nReturnValue = TV_CheckSignal(ch,pSignalNum,pSignalLength);
if (nReturnValue == SIG_BUSY1||nReturnValue == SIG_BUSY2)
{
// 本方挂机, 控制中继拆线
TV_HangUpCtrl (ch);
return 2;
}
// 若获取一个 DTMF 码成功时将其填入数组
if(GetDTMFChar(ch,&GetKey) == 0)
{
DTMFstr[Loop] = GetKey;
Loop++;
}
// 直到用户按 '#' 键时退出
if(DTMFstr[Loop] == Key )
{
DTMFstr[++Loop] = '\0';
*sDTMFstr = DTMFstr;
return 0;
}
}
} // End_try
catch(...)
{
// 本方挂机, 控制中继拆线
TV_HangUpCtrl(ch);
// 组合异常信息
sTemp.Format("通道%2d : 获取 DTMF 码串时出现了异常",ch);
// 将异常信息写入异常日志
CReadOrWriteInfo::WriteInfoToiniFile("CMyTw8vid 类",sTemp,1);
return 1;
}
}
/***********************************************************
* 功能:播放单文件并获取 DTMF 码
* 文件格式: *.tw
* 参数 0 :通道号
* 参数 1 :语音文件路径
* 参数 2 :存放 DTMF 码
* 返回值:若返回 0 在放音过程中取得了 DTMF 码
* -1 放音失败
* 1 在放音获取按键时出现了异常
* 2 在放音过程中用户未按键就挂机
************************************************************/
int CMyTw8vid::PlaySingleFileAndGetDTMF(int ch, char FilePath[], char *Key)
{
int Value = 0,nReturnValue,*pSignalNum=NULL,*pSignalLength=NULL;
CString sTemp;
try
{
do
{
// 该通道进行文件放音
if ((Value = TV_StartPlayFile(ch, FilePath, 0, 0)) > 0)
{
// 继续文件放音, 并不断将语音文件中未放音的部分读入缓冲区
while(TV_PlayFileRest(ch) > 0)
{
//查询某一通道的信号音结果
nReturnValue = TV_CheckSignal(ch,pSignalNum,pSignalLength);
// 若用户挂机
if (nReturnValue == SIG_BUSY1||nReturnValue == SIG_BUSY2)
{
// 强制停止该通道的缓冲区放音
TV_StopPlayFile(ch);
// 本方挂机, 控制中继拆线
TV_HangUpCtrl (ch);
return 2;
}
// 获取 DTMF 码
if(GetDTMFChar(ch,Key) == 0)
{
// 强制停止该通道的缓冲区放音
TV_StopPlayFile(ch);
return 0;
}
::Sleep(100);
}
} else
{
// 获取错误号
Value = TV_GetLastError();
sTemp.Format("通道%2d : 播放 *.Tw 文件并获取 DTMF 码失败,错误号为:%2d",ch,Value);
CReadOrWriteInfo::WriteInfoToiniFile("CMyTw8vid 类",sTemp,0);
// 本方挂机, 控制中继拆线
TV_HangUpCtrl(ch);
return -1;
} // End_else
::Sleep(500);
} while(true);
} // End_try
catch(...)
{
// 强制停止某一通道的文件放音
TV_StopPlayFile(ch);
// 本方挂机, 控制中继拆线
TV_HangUpCtrl(ch);
// 组合异常信息
sTemp.Format("通道%2d : 播放 *.Tw 文件并获取 DTMF 码时出现了异常",ch);
// 将异常信息写入异常日志
CReadOrWriteInfo::WriteInfoToiniFile("CMyTw8vid 类",sTemp,1);
return 1;
}
}
/***********************************************************
* 功能:挂断外线电话
* 参数 0 :通道号
* 返回值:若返回 0 挂断电话成功
* 1 在挂断外线电话时出现了异常
************************************************************/
int CMyTw8vid::HangUpCtrlTel(int ch)
{
try
{
// 本方挂机, 控制中继拆线
TV_HangUpCtrl(ch);
return 0;
}
catch (...)
{
// 将异常信息写入异常日志
CReadOrWriteInfo::WriteInfoToiniFile("CMyTw8vid 类","执行 HangUpCtrlTel 函数时出现了异常",1);
return 1;
}
}
/***********************************************************
* 功能:本方提起电话
* 参数 0 :通道号
* 返回值:若返回 0 提起电话成功
* 1 提起电话时出现了异常
************************************************************/
int CMyTw8vid::OffHookCtrlTel(int ch)
{
try
{
// 本方提起电话
TV_OffHookCtrl(ch);
return 0;
}
catch(...)
{
// 将异常信息写入异常日志
CReadOrWriteInfo::WriteInfoToiniFile("CMyTw8vid 类","执行 OffHookCtrlTel 函数时出现了异常",1);
return 1;
}
}
/***********************************************************
* 功能:判断用户是否挂断电话函数
* 参数 0 :通道号
* 返回值:若返回 0 用户已经挂断电话
* 1 查询用户是否挂断电话时出现了异常
* 2 用户还没有挂断电话
************************************************************/
int CMyTw8vid::HangUpDetectTel(int ch)
{
int Value = 0,nReturnValue,*pSignalNum=NULL,*pSignalLength=NULL;
try
{
//查询某一通道的信号音结果
nReturnValue = TV_CheckSignal(ch,pSignalNum,pSignalLength);
// 若用户挂机
if (nReturnValue == SIG_BUSY1||nReturnValue == SIG_BUSY2)
{
return 0;
}
return 2;
}
catch (...)
{
// 将异常信息写入异常日志
CReadOrWriteInfo::WriteInfoToiniFile("CMyTw8vid 类","执行 HangUpDetectTel 时出现了异常",1);
return 1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -