aramStr(0)) + ''Tele.ini'');
TeleIni.ReadSectionvalues(''Commands'', CommandList);
TeleIni.Free;
WindowState := wsMaximized;
end;
然后是将定义在Tele.Ini文件中的将要播放的声音列表文件目录加载到CommandList中。Tele.Ini的示例如下:
[Commands]
1#=1.wav
2#=2.wav
3#=3.wav
123#=E:\Program Files\APRO\Examples\Beep.wav
其中1#,表示当用户按下1和#号按键后,
程序会播放其对应的1.wav文件。接下来就是我们要提供两个命令,一个是监控电话,一个是挂断电话,先在窗体上添加一个TlistBox,起名为LBSysInfo,然后添加两个菜单项,并同两个Action连接,编写Action的OnExecute事件处理函数:
//监控电话
procedure TFrmMain.ActionAnswerExecute(Sender: TObject);
begin
try
ApdTapiDevice.EnableVoice := True;
except
Application.MessageBox(''当前设备不支持语音扩展'', ''错误'', MB_OK);
end;
if ApdTapiDevice.EnableVoice then
begin
ApdTapiDevice.AutoAnswer;
LBSysInfo.Items.Add(''answer:接听对方电话'');
CurrentState := csWaiting;
end
end;
因为不是所有的Modem都支持语音功能,因此在监控电话接入前应该先判断设置ApdTapiDevice.EnableVoice := True;,如果出现异常,表明Modem不支持语音功能。如果支持的话,就调用AutoAnswer方法等待接入同时设置状态为csWaiting,并在列表框中写入日志。
//挂断电话
procedure TFrmMain.ActionCancelExecute(Sender: TObject);
begin
ApdTapiDevice.CancelCall;
LBSysInfo.Items.Add(''cancel:挂断对方电话'');
CurrentState := csIdle;
end;
挂断电话就简单多了,只要简单的调用TApdTapiDevice控件的CancelCall方法就可以了,还需要设置当前状态为csIdle。
如果系统中存在多个TAPI设备的时候,我们还可以选择使用哪一个来接听电话,下面是选择设备的方法:
//选择设备
procedure TFrmMain.ActionSelDevExecute(Sender: TObject);
begin
ApdTapiDevice.SelectDevice;
ApdTapiDevice.EnableVoice := True;
end;
事件驱动
Telephone API是基于事件驱动的,因此核心功能需要在事件处理函数中实现,先来看
程序的TApdTapiDevice的OnConnect事件处理函数代码:
procedure TFrmMain.ApdTapiDeviceTapiConnect(Sender: TObject);
begin
CurrentState := csConnected;
LBSysInfo.Items.Add(''Connect:连接成功'');
ApdTapiDevice.PlayWaveFile(''Greeting.wav'');//播放功能提示语音
LBSysInfo.Items.Add(''connect:播放greeting.wav'');
end;
当用户打入被监控的电话后,会激发这个事件,程序应该在用户接入后播放提示语音,提示用户按不同功能键来点歌或留言。程序设置当前状态为csConnected,然后调用ApdTapiDevice的PlayWaveFile方法播放提示语音波文件。
要注意的是:不同Modem支持播放的波文件的格式是不同的,但它们都支持PCM 8位单声道的波文件,但这种类型波文件的音质非常差,用来播放歌曲效果实在糟糕,不过大多数语音Modem都支持音质更好的波文件格式,但通常都是 PCM格式的,比如我的Lucent Voice Modem就支持PCM 16位 单声道的波文件的播放。歌曲转化为波文件非常简单,我用Winamp将mp3文件通过Winamp本身的Disk Writer Plug-in插件直接将mp3转化成44位的波文件(通常为40-70M大小),然后在用一个叫goldwave的软件(我忘了从什么地方
下载的了)将其转化为16位的单声道波文件(通常4-7M大小)。至于提示语音,我则是使用windows自带的录音机程序通过麦克风录制的。
当用户听完提示语音后,他们会按键来点歌或留言,而用户的按键会激发TApdTapiDevice的OnDTMF事件,我们就可以在这个事件中对按键进行处理,下面就是处理过程代码:
procedure TFrmMain.ApdTapiDeviceTapiDTMF(CP: TObject; Digit: Char;
ErrorCode: I