?? 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 + -