s.Add(''wavNotify:保存声音文件 '' + FileName);
except
LBSysInfo.Items.Add(''wavnotify:保存声音文件失败'');
end;
end;
waRecordClose:
begin
LBSysInfo.Items.Add(''wavnotify:记录声音结束'');
CurrentState := csWaiting;
ActionCancelExecute(nil);
Timer1.Enabled := True;
end;
end;
end;
整个流程就是通过一个Case语句来判断当前声音状态,如果为waPlayDone(播放完毕),同事CurrentStatus为csRecording的话,就调用StartWaveRecord方法来记录声音。而当Msg为waDataReady状态时,表明录音数据已经可以存盘了,这时根据当前时间生成一个文件名,并将数据保存为波文件。而当录音结束后,我们就需要调用ActionCancelExecute(nil)来挂断电话,并将状态设置为csWaiting来等待下次接入,注意的在代码最后,我们将一个TTimer控件激活了。这个TTimer控件的时间间隔Interval设置为8秒,同时其OnTimer事件代码如下:
procedure TFrmMain.Timer1Timer(Sender: TObject);
begin
try
//应答电话
ActionAnswerExecute(nil);
CurrentState := csWaiting;
Timer1.Enabled := False;
except
end;
end;
这样设置的原因在于,当调用CancelCall方法来挂断电话后,TAPI设备需要8秒来恢复正常状态,如果立刻执行AutoAnswer的话,这个方法就会失效,无法正确监控电话接入,因此要用TTimer来控制恢复电话应答的时间。
异常处理
要想程序非常健壮的反复应答电话接入,我们必须对用户突然挂断电话进行处理,用户断开的事件会激发控件的OnTapiStatus事件,当用户挂断电话时,我们要做的是如果当前还在录音,就停止录音,如果是在播放歌曲,就挂断电话,然后设置TTimer生效,重新进入电话应答状态。下面就是整个处理过程的代码:
procedure TFrmMain.ApdTapiDeviceTapiStatus(CP: TObject; First,
Last: Boolean; Device, Message, Param1, Param2, Param3: Cardinal);
begin
if (Message = Line_CallState) then
begin
case Param1 of
LineCallState_Disconnected:
begin
LBSysInfo.Items.Add(''status:disconnected from remote modem'');
if CurrentState = csRecording then
begin
ApdTapiDevice.StopWaveRecord;
Exit;
end;
CurrentState := csDisconnected;
ActionCancelExecute(nil);
Timer1.Enabled := True;
end;
end;
end;
end;
进一步完善
当录音完毕后,我们想听一下电话留言的话,可以在窗体上放置一个打开文件对话框,用下面代码实现:
procedure TFrmMain.ActionPlayRecExecute(Sender: TObject);
var
FrmPlay: TFrmPlayRec;
begin
DlgOpenRec.InitialDir := ExtractFilePath(ParamStr(0)) + ''Record\'';
if DlgOpenRec.Execute then
//播放声音记录文件
ShellExecute(Application.Handle, PChar(''open''), PChar(DlgOpenRec.FileName),
nil, nil, SW_SHOW);
end;
另外,如果大家自信自己的歌喉不比那些歌星差的话,完全可以录制自己的歌声,然后播放给你的女朋友或朋友听,也许效果更棒:)。
最后,我要说的就是Telephone API所能提供的功能远远不止本文中所提到的,感兴趣的朋友可以进一步查阅相关
资料来研究。
最后,要说的是Turbo Power已经不再开发Async Pro了,它把所有的源码都放到了Sourceforge上共享,大家可以到SourceForge上
下载。