有人用Delphi开发过TTS吗???急!~ (顶者有分~)(300分)

  • 主题发起人 主题发起人 sermon
  • 开始时间 开始时间
S

sermon

Unregistered / Unconfirmed
GUEST, unregistred user!
用的是DJ的TTS语音卡,可是DJ 只提供VC的示例程序

哪位DFW帮帮我,分不够可以在加~

只需要Delphi开发TTS的一般示例的原代码就可以了,谢谢先
 
没有人做过吗?用Delphi
 
我以前在這個論壇里看過,你找找
 
Speech API可以作为类型库引用到Delphi中,方法是:打开Project选单下的Import
> Type Litrary,点击“Add”加入Windows/Speech目录下的Vtxauto.tlb文件,在
> Delphi的Import目录中就会生成VTxtAuto—TLB.pas文件,其中定义了VTxtAuto—TLB
> 单元,把它加到Uses成员中来。定义全局变量:
>
> var VoTxt:IVTxtAuto;
>
> 然后在Form的OnCreate事件中加入:
>
> VoTxt:=CoVTxtAuto_.Create;
>
> VoTxt.Register(′′,′Speech Test′);{注册}
>
> “Read”按钮代码为:
>
> VoTxt.Speak(Memo1.Lines.Text,10);{朗读}
>
> “Stop”按钮代码为:
>
> VoTxt.StopSpeaking; {停止朗读}
>
> 至此,应用程序已具有朗读功能,10表示使用普通语气。借住VoTxt的属性和方法,
> 我们还可以控制阅读速度和语气,实现暂停、跳句等功能
 
把VC的示例程序翻译成Delphi程序试试看。
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=644855
 
金山词霸发声使用的是微软TTS引擎。
当金山词霸安好后会在windows下产生speech目录, 里面存放的就是TTS文件.
从delphi中选择工程菜单中的导入类型库菜单,选择windows/
speech目录下的vtxtauto.tlb文件,单击确定后delphi会自动生成vtxauto_TLB.pas文件,它包含了TTS的com接口。
应用如下:
uses vtxauto_TLB;

var TTS: ivtxtauto;

用前:
TTS:=covtxtauto_.Create ;
TTS.Register('project1','project1');
用后:
TTS:=nil;

TTs.speak('要读的字符串',vtxtst_reading);
TTs.stopspeaking; // 停止
TTs.set_speed(1); // 速度

我试过同金山词霸的发音一样的。

unit word1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
VTxtAuto_TLB, StdCtrls, ComCtrls, Mask, FileCtrl;

type
TForm1 = class(TForm)
speedtext: TStaticText;
speed: TTrackBar;
Button1: TButton;
Edit1: TEdit;
Button2: TButton;
gettext: TLabel;
procedure FormCreate(Sender: TObject);
procedure stopbtnClick(Sender: TObject);
procedure speedChange(Sender: TObject);
procedure prebtnClick(Sender: TObject);
procedure nextbtnClick(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);

private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
TTS:IVTxtAuto;
implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
TTS:=CoVtxtAuto_.Create;
TTS.Register('superwords','superwords');
speed.Position:=TTS.Get_Speed;
speedtext.caption:='速度:'+inttostr(speed.position);
speed.SelEnd:=speed.Position;
//filelistbox1.Mask:= '所有文件(*.*)|*.*| 文本文件(*.txt)|*.txt';
end;



procedure TForm1.stopbtnClick(Sender: TObject);
begin
TTS.StopSpeaking;
end;


procedure TForm1.speedChange(Sender: TObject);
begin
TTS.Set_Speed(speed.position);
speedtext.caption:='速度:'+inttostr(speed.position);
speed.SelEnd:=speed.Position;
end;

procedure TForm1.prebtnClick(Sender: TObject);
begin
TTS.AudioRewind;
end;

procedure TForm1.nextbtnClick(Sender: TObject);
begin
TTS.AudioFastForward;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
TTS:=nil;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
close;
end;




procedure TForm1.Button2Click(Sender: TObject);
begin
TTS.Speak(Edit1.text,vtxtst_READING);
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if (length(trim(edit1.text))>0) and (key=chr(32))
then begin if trim(edit1.text)=gettext.Caption
then begin
TTS.Speak(edit1.Text,vtxtst_COMMAND);
edit1.Clear;
end
else TTS.Speak('YOU ARE WRONG',vtxtst_STATEMENT);
end;
end;


end.


uses
VTxtAuto_TLB;

var
FISpeech: IVTxtAuto;

procedure TForm1.FormCreate(Sender: TObject);
begin
FISpeech := CoVTxtAuto_.Create;
FISpeech.Register('DreamCapital', 'MailAlert');
end;

使用:
SpeechString := 'Now test the function of speech!';
FISpeech.Speak(SpeechString, vtxtst_READING);

但是中文是没法发音的。这不是由SPeech SDK5决定的,而是因为
缺少一个语音库。



这是大富翁上的一些文章!
 
现在有些软件尤其是翻译类软件多提供有语音输出的功能,比较有名的有《金山词霸2000》、《不知不觉背单词》等,他们所提供的英文朗读功能是通过直接使用了Microsoft的TTS(Text-to-Speech)全程化语音技术来实现的。其实我们也可以在自己的程序中通过对MS Speech API的调用来增加语音输出功能,尤其是对于翻译类软件,如果没有语音功能可以说这个软件是不完备的。
一、准备工作
为实现TTS技术,一个必要的前提条件是系统中要有MS TTS引擎,可以通过查看Windows目录下是否有speech的目录来判断是否安装过该引擎。如果没有,可以从《金山词霸2000》光盘上的ciba子目录下的mstts.exe来安装MS TTS引擎和spchapi(MS Speech API)或是直接从互连网上下载:可以从http://bcbsrc.home.chinaren.com/ttsapi.exe下载语音接口程序TTSapi.exe; 可以从http://bcbsrc.home.chinaren.com/ttssetup.exe下载男声语音引擎程序TTSSetup.exe;可以从http://bcbsrc.home.chinaren.com/ttssetup2.exe下载女声语音引擎程序TTSSetup2.exe。
?
二、引言
在整个设计过程中,主要是围绕着Vtxtauto.tlb这个类型库展开的,由于在VC下实现类型库比较烦琐,我们选择使用TLB类型库比较方便的Delphi来同Vtxtauto.tlb进行交互,并将几个主要的功能如"朗读"、"暂停"、"恢复"、"停止"等用几个相应的功能函数来实现,最终通过DLL(动态链接库)将其封装在内,对外则仅提供几个简单接口,可以很方便的为Delphi或其他语言调用。在此我们通过采用VC++6.0来调用这个由Delphi开发的拥有TTS技术的动态链接库来实现英文文本的语音输出。
?
三、Delphi动态链接库的实现
1、选"File"、"New…",在"New Items"对话框中选择"DLL",新建一动态连接库工程Project1。
2、选"File"、"New…",在"New Items"中选择"Unit",新建一单元TTSDLL。
3、选"Project"、"Import Type Library…",点击"Add"按钮,选择C:/windows/speech/目录下的Vtxtauto.tlb类型库,便将其添加到工程中来了。
4、编辑TTSDll单元如下:
unit TTSDLL;
interface
uses VtxtAuto_TLB;
procedure Create;export; {待导出的过程和函数}
procedure Read(text:PChar);export;
procedure Pause;export;
procedure Resume;export;
procedure Stop;export;
function IsSpeaking:Boolean;export;
procedure Destory;export;
?
var
TTS: IVTxtauto;
?
implementation
procedure Create;
begin
TTS:=CoVTxtAuto.Create; {创建对象}
TTS.Register('Project1','Project1'); {注册 }
end;
?
procedure Read(text:PChar);
begin
TTS.Speak(text,vtxtst_READING);
{朗读函数。第一参数是待朗读的文本。第二参数用于控制朗读的语气和优先级,主要有以下几种,可以根据需要灵活选择,如需多种选择将其进行或运算即可:
vtxtst_STATEMENT = 1;平时说话时语气,默认。
vtxtst_QUESTION = 2; 提问的语气。
vtxtst_COMMAND = 4; 命令的语气。
vtxtst_WARNING = 8; 警告的语气。
vtxtst_READING = 16; 阅读文档时的语气。
vtxtst_NUMBERS = 32; 阅读数字时的语气。
vtxtst_SPREADSHEET = 64; 阅读电子表格中元素时的语气。
vtxtsp_VERYHIGH = 128; 立即读出,可以打断当前正读的内容。
vtxtsp_HIGH = 256; 尽快读出,加入播放队列开始。
vtxtsp_NORMAL = 512; 默认,加入播放队列末尾。}
end;
?
procedure Pause;
begin
TTS.AudioPause; {暂停朗读}
end;
?
procedure Stop;
begin
TTS.StopSpeaking;{终止朗读}
end;
?
procedure Resume;
begin
TTS.AudioResume;{恢复朗读}
end;
?
function IsSpeaking:Boolean;
var
Check:Boolean;
begin
if TTS.IsSpeaking then {判断当前状态}
begin
Check:=TRUE;{当前正在朗读}
end
else
begin
Check:=FALSE;{当前没有朗读}
end;
Result:=Check;{返回状态值}
end;
?
procedure Destory;
begin
TTS:=nil;{释放对象}
end;
end.
5、在Project1.dpr的begin前面添加如下待导出过程函数列表:
exports
Create index 1,
Read index 2,
Pause index 3,
Resume index 4,
Stop index 5,
IsSpeaking index 6,
Destory index 7;
编译通过后即可得到封装有TTS语音接口的动态链接库: Project1.dll。
?
四、在VC 中调用TTS动态链接库
1、选"File","New…"新建一MFC AppWizard(exe)工程TTSCall。最后一步选择基类为CformView。其余可取缺省设置。
2、在Form上添加四个按钮,分别为:IDC_BUTTON1"朗读";IDC_BUTTON2"暂停";IDC_BUTTON4"恢复";IDC_BUTTON3"停止",以及一编辑框IDC_EDIT1。并添加四个按钮的处理函数:OnRead、OnPause、OnResume、OnStop和编辑框EN_CHANGE事件的响应函数:OnChangeEdit。通过ClassWizard为编辑框同一变量m_Text绑定。
3、为CTTSCallView类添加两个变量: BOOL m_bCreated; HINSTANCE m_DLL;并在构造函数中初始化之。
CTTSCallView::CTTSCallView() : CFormView(CTTSCallView::IDD)
{
//{{AFX_DATA_INIT(CTTSCallView)
m_Text = _T("Hello! Welcome to use this software developed by LangRui.");
//}}AFX_DATA_INIT
m_DLL = NULL;
m_bCreated=FALSE;
}
4、在视类中的初始化函数中添加代码:
void CTTSCallView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();
GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE);
GetDlgItem(IDC_BUTTON2)->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON4)->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON3)->EnableWindow(FALSE);
}
5、实现朗读功能:
void CTTSCallView::OnRead()
{
m_DLL=LoadLibrary("Project1.dll"); //动态加载动态连接库
void (*Create)(void);
//取得DLL中的Create函数
Create=(void(*)(void))::GetProcAddress(m_DLL,"Create");
Create();
m_bCreated=TRUE;
void (*Read)(char*);
//取得DLL 中的Read函数
Read=(void(*)(char*))::GetProcAddress(m_DLL,"Read");
//获取编辑框内容
UpdateData(TRUE);
char buf[10000];
::strcpy(buf,m_Text);
Read(buf);//朗读编辑框的内容。
GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE);//"朗读"按钮不可用
GetDlgItem(IDC_BUTTON2)->EnableWindow(TRUE); //"暂停"按钮可用
GetDlgItem(IDC_BUTTON4)->EnableWindow(FALSE);//"恢复"按钮不可用
GetDlgItem(IDC_BUTTON3)->EnableWindow(TRUE); //"停止"按钮可用
}
6、实现暂停功能:
void CTTSCallView::OnPause()
{
m_DLL=LoadLibrary("Project1.dll");
void (*Pause)();
Pause=(void(*)())::GetProcAddress(m_DLL,"Pause");
BOOL (*IsSpeaking)();
//判断是否正在朗读
IsSpeaking=(BOOL(*)())::GetProcAddress(m_DLL,"IsSpeaking");
if(IsSpeaking())
{
Pause();
GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON2)->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON4)->EnableWindow(TRUE);
GetDlgItem(IDC_BUTTON3)->EnableWindow(TRUE);
}
}
7、实现恢复功能:
void CTTSCallView::OnResume()
{
m_DLL=LoadLibrary("Project1.dll");
void (*Resume)();
Resume=(void(*)())::GetProcAddress(m_DLL,"Resume");
BOOL (*IsSpeaking)();
IsSpeaking=(BOOL(*)())::GetProcAddress(m_DLL,"IsSpeaking");
if(!IsSpeaking())
{
Resume();
GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON2)->EnableWindow(TRUE);
GetDlgItem(IDC_BUTTON4)->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON3)->EnableWindow(TRUE);
}
}
8、实现停止功能:
void CTTSCallView::OnStop()
{
m_DLL=LoadLibrary("Project1.dll");
void (*Stop)();
Stop=(void(*)())::GetProcAddress(m_DLL,"Stop");
Stop();//停止朗读
GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE);
GetDlgItem(IDC_BUTTON2)->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON4)->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON3)->EnableWindow(FALSE);
}
9、当编辑框内容发生改变,而又没有进行朗读时,应当处于准备朗读状态:
void CTTSCallView::OnChangeEdit()
{
if(m_bCreated)
{
m_DLL=LoadLibrary("Project1.dll");
BOOL (*IsSpeaking)();
IsSpeaking=(BOOL(*)())::GetProcAddress(m_DLL,"IsSpeaking");
if(!IsSpeaking())
{
GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE);
GetDlgItem(IDC_BUTTON2)->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON4)->EnableWindow(FALSE);
GetDlgItem(IDC_BUTTON3)->EnableWindow(FALSE);
}
}
}
10、当程序退出时应释放加载的动态链接库,添加虚函数DestoryWindow()
BOOL CTTSCallView::DestroyWindow()
{
AfxFreeLibrary(m_DLL);
return CFormView::DestroyWindow();
}
五、运行测试
将由Delphi编制的动态链接库Project1.dll复制到VC的TTSCall 工程的Debug 目录下。编译并运行TTSCall工程,在编辑框上写一端英文,按下"朗读"按钮,就可以听到利用TTS全程化语音技术所发出的抑扬顿挫的声音。
小结:TTS是全程化语音技术,它可以实现英文单词以及短语的准确发音,甚至可以独立完成整篇英文文章的流畅朗读。而且TTS技术是建立在英文阅读规则基础上的语音合成技术,并非将单词一个一个拆开机械得进行朗读,因此在语气的转折和单词的衔接上都非常自然,问句和祈使句的升降调也能很好的表现出来。
 
谢谢楼上的各位朋友~

可是有人用“东进”的语音卡开发的吗?
只需要一个示例程序的代码,以供参考
 
PS:需要Delphi的源码,其他的我学的不够深入,谢谢
 
你找东进的人要Delphi的例子吗?东进不是说有Delphi的例子吗?
 
DJ没有Delphi的例子,才来这里找dfw啊

可是。。。。。。
真的没有人做过么?还是高手们都不来这里了?
 
把VC的代码贴出来啊!
 
// DJTTS2_DemoDlg.cpp : implementation file
//

#include "stdafx.h"
#include "DJTTS2_Demo.h"
#include "DJTTS2_DemoDlg.h"

#include "DJTTS2.h"
#include "Tc08a32.h"
#include "Mydefines.h"
#include "NewSig.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CDJTTS2_DemoDlg dialog
bool bHaveLoadDriver;
WORD TotalLine;
extern CDJTTS2_DemoApp theApp;
CDJTTS2_DemoDlg *pdlg;
long DriverOpenFlag;
LINESTRUCT *Lines;
FILE *hTextFile;
int PlayTextFlg[100];
char VoicePath[100];
char TestStr[] = "深圳市东进通讯技术股份有限公司,是国内电脑语音产品最早、也是最重要的研发及产品供应商。";//其产品将计算机技术与通讯技术紧密结合在一起,创造出许多全新的通讯方式,使信息的获得与交流更加便利快捷。";
//char TestStr[] = "深圳市东进通讯技术股份有限公司,是国内电脑语音产品最早、也是最重要的研发及产品供应商。其产品将计算机技术与通讯技术紧密结合在一起,创造出许多全新的通讯方式,使信息的获得与交流更加便利快捷。证券、电话委托交易服务系统使得证券投资者能够使用任何一部普通双音频电话,根据语音菜单提示得到即时股票行情、进行股票交易、查询成交回报等。任何会使用电话的人都可通过该系统完成股票交易,深受广大中小投资者的欢迎,充分展示了CTI技术优点。现在,电话委托交易服务已经成为各证券公司不可缺少的标准交易手段之一。1993年,东进公司开发出中国第一片商用的电话语音处理卡,命名为TC-08A 1型卡。其先进的模块化结构、标准电信接口及高可靠性使其在电话委托系统中得到了普遍应用和一致好评。市场占有率高达80%,对于推广电话委托交易系统、确立其为一种标准的交易手段起到了重要作用。1994年,东进公司的TC-08A系列电话语音产品第一个申请邮电部电信产品入网检测并获得了电话语音产品的第一个入网许可证。";
char TestText[100];

void GetVoicePath()
{
char FileName[100];
GetWindowsDirectory(FileName,100);
strcat(FileName,"//tc08a-v.ini");
GetPrivateProfileString("SYSTEM","InstallDir",NULL,VoicePath,100,FileName);
strcat(VoicePath,"voc//");
}

bool WINAPI TTS2InitSystem()
{
int i;
//int SupportTTS;
pdlg = (CDJTTS2_DemoDlg *)theApp.m_pMainWnd;
GetVoicePath();
DriverOpenFlag = LoadDRV ( );
if ( DriverOpenFlag )
{
AfxMessageBox ( "Load driver FAIL!" );
return FALSE;
}
/*
SupportTTS=IsNowSupportTTS();
if (SupportTTS=0)
{
FreeDRV();
AfxMessageBox ( "Not TTS Card!" );
return FALSE;
}
*/
TotalLine = CheckValidCh();
if ( EnableCard(TotalLine,1024*8) != (long)0)
{
FreeDRV();
AfxMessageBox ( "Load driver FAIL!" );
return FALSE;
}

for (i=0;i<TotalLine;i++)
{
PlayTextFlg=1;
}
i = DJTTS2_Init();
if ( i != 0 )
{
DisableCard();
FreeDRV();

char TmpStr[80];
sprintf ( TmpStr, "DJTTS2 init fail, r = %d", i );
AfxMessageBox ( "Load driver FAIL!" );
return FALSE;
}
// i = DJTTS2_CvtTextToVocFile ("test.txt" , 2, "Test1.voc"/*在调用此函数前该文件需要必须已经存在*/ );

Lines=new LINESTRUCT[TotalLine];
if ( Lines == NULL )
{
DJTTS2_Release();
DisableCard();
FreeDRV();
AfxMessageBox ( "CREATE LINESTRUCT FAIL!" );
return FALSE;
}
SetBusyPara(350);
for(i=0;i<TotalLine;i++)
{
Lines.nType=CheckChType(i);
strcpy(Lines.CallerID,"");
strcpy(Lines.Dtmf,"");
Lines.State = CH_FREE;
Lines.count = 0;
}

int RR=Sig_Init(0);

LV_COLUMN lvc;
char dig[10];

lvc.mask = LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
lvc.iSubItem = 0;
lvc.pszText = "通道号" ;
lvc.cx = 50;
pdlg->m_list.InsertColumn(0,&amp;lvc);

lvc.mask = LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
lvc.iSubItem = 1;
lvc.pszText = "线路状态";
lvc.cx = 60;
pdlg->m_list.InsertColumn(1,&amp;lvc);

lvc.mask = LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
lvc.iSubItem = 2;
lvc.pszText = "流程状态";
lvc.cx = 200;
pdlg->m_list.InsertColumn(2,&amp;lvc);

lvc.mask = LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
lvc.iSubItem = 3;
lvc.pszText = "播放次数" ;
lvc.cx = 100;
pdlg->m_list.InsertColumn(3,&amp;lvc);

LV_ITEM lvi;
for(i = 0; i < TotalLine; i++)
{
lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE;
lvi.iItem = i;
lvi.iSubItem = 0;
itoa( i, dig, 10 ) ;
lvi.pszText = dig;
pdlg->m_list.InsertItem(i,dig);
}
for(i=0;i<TotalLine;i++)
{
if(Lines.nType==CHTYPE_TRUNK)
{
pdlg->m_list.SetItemText ( i, 1, "外线");
}
else if(Lines.nType==CHTYPE_USER)
{
pdlg->m_list.SetItemText ( i, 1, "内线");
}
else if(Lines.nType==CHTYPE_EMPTY)
{
pdlg->m_list.SetItemText ( i, 1, "空");
}
}
return TRUE;
}

void TTS2DrawState ( int Chnl)
{
char TmpTextStr[100];
char NowState[20];
int TmpStrLen=20;
switch ( Lines[Chnl].State )
{
case CH_FREE:
strcpy(NowState,"空闲");
break;
case CH_PLAYTEXT:
strcpy(NowState,"播放文本文件TTS");
break;
case CH_PLAYSTR:
strcpy(NowState,"播放内存TTS");
break;
case CH_PLAYSTREND:
strcpy(NowState,"播放内存TTS结束");
break;
case CH_PLAYTEXTEND:
strcpy(NowState,"播放文本文件TTS结束");
break;
case CH_WAITUSERONHOOK:
strcpy(NowState,"等待内线挂机");
break;
}
pdlg->m_list.GetItemText(Chnl,2,TmpTextStr,TmpStrLen);
if ( strcmp(NowState,TmpTextStr )!=0)
pdlg->m_list.SetItemText ( Chnl, 2, NowState );

sprintf ( NowState, "%d", Lines[Chnl].count ) ;
pdlg->m_list.GetItemText(Chnl,3,TmpTextStr,TmpStrLen);
if ( strcmp(NowState,TmpTextStr )!=0)
pdlg->m_list.SetItemText ( Chnl, 3, NowState );

strcpy(NowState, Lines[Chnl].Dtmf) ;
pdlg->m_list.GetItemText(Chnl,4,TmpTextStr,TmpStrLen);
if ( strcmp(NowState,TmpTextStr )!=0)
pdlg->m_list.SetItemText ( Chnl, 4, NowState );
}

void TTS2ResetChannel(int channelID)
{
if(Lines[channelID].nType==CHTYPE_TRUNK)
{
HangUp(channelID);
StopSigCheck(channelID);
}
Lines[channelID].Dtmf[0]=0;
Lines[channelID].CallerID[0]=0;
Lines[channelID].State = CH_FREE;
}

//#define TEST_ALL_CHNL

int TTS2CheckHangUp(int Chnl)
{
#ifdef TEST_ALL_CHNL
return false;
#endif
if(Lines[Chnl].nType==CHTYPE_TRUNK )
{
if (Sig_CheckBusy(Chnl))
{
return 1;
}
return 0;
}
else
{
return !RingDetect(Chnl);
}
}

void WINAPI TTS2DoTimerWork()
{
int r;
PUSH_PLAY();
FeedSigFunc();
for(int i=0;i<TotalLine;i++)
{
TTS2DrawState(i);
if ( (Lines.State!=CH_FREE) &amp;&amp; (TTS2CheckHangUp(i)==1) )
{
DJTTS2_StopPlayText (i);
Lines.State = CH_WAITUSERONHOOK;
}
switch(Lines.State)
{
case CH_FREE:
#ifdef TEST_ALL_CHNL
if ( RingDetect(0) )
#else
if(RingDetect(i))
#endif
{
Lines.count ++;
if(Lines.nType!=CHTYPE_USER)
{
OffHook(i);
StartSigCheck(i);
}
InitDtmfBuf(i);
r = DJTTS2_StartPlayText ( i, TestStr, strlen(TestStr), (Lines.count%3+2),70);
if (r)
{
AfxMessageBox ( "Play TTS2Str Fail!" );
}
Lines.State=CH_PLAYSTR;
}
break;
case CH_PLAYSTR:
if ( DJTTS2_CheckPlayTextEnd ( i ) )
{
DJTTS2_StopPlayText (i);
Lines.State=CH_PLAYSTREND;
break;
}
break;
case CH_PLAYSTREND:

#ifdef TEST_ALL_CHNL
Lines.State=CH_FREE;
#else
if(Lines.nType==CHTYPE_TRUNK)
{
//DJTTS2_StopPlayText (i);
//TTS2ResetChannel(i);
Lines.State=CH_WAITUSERONHOOK;
}
else
{
StartPlaySignal(i,SIG_BUSY1);
Lines.State=CH_WAITUSERONHOOK;
}
#endif
break;
case CH_WAITUSERONHOOK:
if(!RingDetect(i))
{
//DJTTS2_StopPlayText (i);
StartPlaySignal(i,SIG_STOP);
TTS2ResetChannel(i);
}
break;
}
}

}



CDJTTS2_DemoDlg::CDJTTS2_DemoDlg(CWnd* pParent /*=NULL*/)
: CDialog(CDJTTS2_DemoDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CDJTTS2_DemoDlg)
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CDJTTS2_DemoDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDJTTS2_DemoDlg)
DDX_Control(pDX, IDC_LIST1, m_list);
//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CDJTTS2_DemoDlg, CDialog)
//{{AFX_MSG_MAP(CDJTTS2_DemoDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_DESTROY()
ON_WM_TIMER()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDJTTS2_DemoDlg message handlers

BOOL CDJTTS2_DemoDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon

// TODO: Add extra initialization here
bHaveLoadDriver=TTS2InitSystem() ;
if(!bHaveLoadDriver) PostQuitMessage(0);
SetTimer( 1000, 30, NULL ) ;
return TRUE; // return TRUE unless you set the focus to a control
}

// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.

void CDJTTS2_DemoDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting

SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&amp;rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;

// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}

// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CDJTTS2_DemoDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}

void TTS2ExitSystem()
{
//int i ;
//DJTTS2_StopPlayText (i);
DJTTS2_Release();
DisableCard();
FreeDRV();
delete Lines;
}


void CDJTTS2_DemoDlg::OnDestroy()
{
CDialog::OnDestroy();
// TODO: Add your message handler code here
KillTimer( 1000 );
if(bHaveLoadDriver) TTS2ExitSystem();
}


void CDJTTS2_DemoDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
TTS2DoTimerWork();
CDialog::OnTimer(nIDEvent);
}
 
请教~

上面那个应该是主要的代码
 
dfw~dfw~
你在哪里,help~~
 
这个我不会,不过也顶一下啦!!
 
绝望中~~
 
给我,你的信箱,我发一个给你
 
多人接受答案了。
 
后退
顶部