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

📄 tvshow.c

📁 采用五岳鑫公司的板卡开发的,电话可以接入和打出,方便易懂
💻 C
字号:

/*****************************************************************************


	注意: 凡是随 TeleWind 电话卡提供的 C 库函数, 都以 TV 开头,
	如 TV_Installed(), TV_Initialize(), TV_Disable() 等.

	本程序中用到的 TeleWind 电话卡 C 语言库函数:

        TV_Installed()          判断 TW8VID 驱动程序是否已经安装
        TV_Initialize()         初始化系统中所有的 TW8VID 电话卡
        TV_Disable()            禁止 TW8VID 工作
	TV_CompressRatio()      设置录放音的压缩比
        TV_GetSerial()          取出 TW8VID 的序列号
	TV_StartPlayFile()      对某一通道进行文件放音
	TV_PlayFileRest()       继续文件放音, 并不断将语音文件中未放音的部分读入缓冲区
	TV_OffHookDetect()      判断某一内线通道是否已摘机
	TV_StopPlayFile()       强制停止某一通道的文件放音
	TV_GetDTMFChar()        获取某一通道接收到的一个 DTMF 字符
	TV_ChannelType()        查询某一通道的类型
	TV_RingDetect()         判断某一外线通道是否在振铃
	TV_OffHookCtrl()        控制某一外线通道摘机
	TV_FlushDTMF()          清除某一通道的 DTMF 接收缓冲区
	TV_StartTimer()         开始某一通道的计时器
	TV_MonitorBusy()        根据忙音监视挂机状态
	TV_CheckSignal()        查询某一通道的信号音结果 (一般来说只查询外线通道)
	TV_HangUpCtrl()         控制某一外线通道挂机
	TV_TimerElapsed()       查询某一通道的计时器开始后已走过的时间 (单位: 秒)
	TV_GenerateSignal()     在某一通道产生信号音

*****************************************************************************/
#include <windows.h>
#define far

#include <stdio.h>
#include <limits.h>
#include <conio.h>
#include "TW8VID.H"

#define VOICE_FILE      "VOICE\\TVCALL.TW"
#define WAIT_TIMER      15              /* 15 秒 */

typedef enum {
	WS_HANGUP,      /* 挂机 */
	WS_PLAYING,     /* 放音 */
	WS_TIMER,       /* 计时 */
	WS_BUSY         /* 忙音 (仅对内线通道) */
} WORKING_STATUS;

WORKING_STATUS  CS[MAX_CHANNELS];      /* 存放各通道状态 */

int     iChannels;
char    sSerial[10];


void CheckDtmf (int i) {
	int     d;

	while ((d = TV_GetDTMFChar (i)) != -1)
		printf ("\n 通道%2d (%c) : 接收到 DTMF 码: '%c'", i, TV_ChannelType (i) == CT_INTERNAL ? '+' : '*', d);
}

void ExternalChannels (int i) {
	int     Sig, SigCount, SigLen;

	switch (CS[i]) {

		case WS_HANGUP :
			if (TV_RingDetect (i) > 1) {
				printf ("\n 通道%2d (*) : 振铃", i);
				TV_OffHookCtrl (i);
				TV_FlushDTMF (i);
				if (TV_StartPlayFile (i, VOICE_FILE, 0, LONG_MAX) == -1) {
					printf ("\n 通道%2d (*) : 放音失败", i);
					TV_StartTimer (i, WAIT_TIMER);
					CS[i] = WS_TIMER;
				} else {
					printf ("\n 通道%2d (*) : 放音", i);
					CS[i] = WS_PLAYING;
				}
			}
			break;

		case WS_PLAYING :
			CheckDtmf (i);
			Sig = TV_CheckSignal (i, &SigCount, &SigLen);
			if ((Sig == SIG_BUSY1 || Sig == SIG_BUSY2) && SigCount >= 3) {
				printf ("\n 通道%2d (*) : 外线挂机", i);
				TV_HangUpCtrl (i);
				CS[i] = WS_HANGUP;
			}
			else if (TV_PlayFileRest (i) <= 0) {
				printf ("\n 通道%2d (*) : 放音完毕", i);
				TV_StartTimer (i, WAIT_TIMER);
				CS[i] = WS_TIMER;
			}
			break;

		case WS_TIMER :
			CheckDtmf (i);
			Sig = TV_CheckSignal (i, &SigCount, &SigLen);
			if ((Sig == SIG_BUSY1 || Sig == SIG_BUSY2) && SigCount >= 3) {
				printf ("\n 通道%2d (*) : 外线挂机", i);
				TV_HangUpCtrl (i);
				CS[i] = WS_HANGUP;
			}
			else if (TV_TimerElapsed (i) < 0) {
				printf ("\n 通道%2d (*) : 超时", i);
				TV_HangUpCtrl (i);
				CS[i] = WS_HANGUP;
			}
			break;
	}
}

void InternalChannels (int i) {
	switch (CS[i]) {

		case WS_HANGUP :
			if (TV_OffHookDetect (i)) {
				printf ("\n 通道%2d (+) : 摘机", i);
				TV_FlushDTMF (i);
				if (TV_StartPlayFile (i, VOICE_FILE, 0, LONG_MAX) == -1) {
					printf ("\n 通道%2d (+) : 放音失败", i);
					TV_StartTimer (i, WAIT_TIMER);
					CS[i] = WS_TIMER;
				} else {
					printf ("\n 通道%2d (+) : 放音", i);
					CS[i] = WS_PLAYING;
				}
			}
			break;

		case WS_PLAYING :
			CheckDtmf (i);
			if (!TV_OffHookDetect (i)) {
				printf ("\n 通道%2d (+) : 放音时内线挂机", i);
				TV_StopPlayFile (i);
				CS[i] = WS_HANGUP;
			}
			else if (TV_PlayFileRest (i) <= 0) {
				printf ("\n 通道%2d (+) : 放音完毕", i);
				TV_StartTimer (i, WAIT_TIMER);
				CS[i] = WS_TIMER;
			}
			break;

		case WS_TIMER :
			CheckDtmf (i);
			if (!TV_OffHookDetect (i)) {
				printf ("\n 通道%2d (+) : 内线挂机", i);
				CS[i] = WS_HANGUP;
			}
			else if (TV_TimerElapsed (i) < 0) {
				printf ("\n 通道%2d (+) : 超时", i);
				TV_GenerateSignal (i, SIG_BUSY1);
				CS[i] = WS_BUSY;
			}
			break;

		case WS_BUSY :
			if (!TV_OffHookDetect (i)) {
				printf ("\n 通道%2d (+) : 忙音通道挂机", i);
				TV_GenerateSignal (i, SIG_SILENCE);
				CS[i] = WS_HANGUP;
			}
			break;
	}
}

void Demo (void) {
	int     i;

	printf ("\n现在开始工作, 按 Esc 键退出 ...\n");
	for (i = 0; i < iChannels; ++i)
		CS[i] = WS_HANGUP;
	while (1) {
		if ((kbhit() && getch() == 0x1b)) {     /* ESC ? */
			for (i = 0; i < iChannels; ++i)
				TV_StopPlayFile(i);
			break;
		}
		for (i = 0; i < iChannels; ++i) {
			switch (TV_ChannelType (i)) {

				case CT_EXTERNAL :
					ExternalChannels (i);
					break;

				case CT_INTERNAL :
					InternalChannels (i);
					break;
			}
		}
	}
}

int main (void) {
	if ((iChannels = TV_Installed()) == 0) {
                printf ("\n错误: TeleWind 8VID 驱动程序未安装 !\n\007");
		return 1;
	}
	TV_Initialize();
	TV_CompressRatio (RATE_64K);
	TV_GetSerial (sSerial);
	printf ("\n TeleWind Demonstration Ver 1.0"
		"\n\n    序列号 = [%s]    通道总数 = [%1d]\n", sSerial, iChannels);
	printf ("\n\n本程序演示电话卡多路同时工作:"
		"\n处理内外线; 多路放音; 接收 DTMF 码"
		"\n对于内线通道, 请直接摘机;"
		"\n对于外线通道, 请拨该通道所接电话线的号码\n");
	Demo();
	TV_Disable();
	return 0;
}

/*****************************************************************************
	End Of File     - TVSHOW.C
*****************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -