📄 tvshow.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 + -