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

📄 mytw8vid.cpp

📁 对模拟语音卡的二次封装
💻 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 + -