使用APRO组件如何在对方拿起听筒时给对方播放声音? |
尚未結案
|
Alcohol
一般會員 發表:7 回覆:10 積分:8 註冊:2002-10-11 發送簡訊給我 |
|
pcplayer99
尊榮會員 發表:146 回覆:790 積分:632 註冊:2003-01-21 發送簡訊給我 |
|
Alcohol
一般會員 發表:7 回覆:10 積分:8 註冊:2002-10-11 發送簡訊給我 |
|
Alcohol
一般會員 發表:7 回覆:10 積分:8 註冊:2002-10-11 發送簡訊給我 |
|
deity
尊榮會員 發表:90 回覆:876 積分:678 註冊:2003-05-09 發送簡訊給我 |
Alcohol你好:
转贴一篇文章,看对你有无帮助,试试看,具体没实践过,所以…… [转贴]
作者:陈省
网友Digit = ''Digit = ' ' Digit = '#' CurrentCommand = '*#'> '' then
begin
ApdTapiDevice.PlayWaveFile(CommandList.values[CurrentCommand]);
LBSysInfo.Items.Add(Format('%s %s 正在播放 %s',
[ApdTapiDevice.calleridname, apdtapidevice.callerid,
CommandList.values[CurrentCommand]]));
end
else
begin
//播放错误提示语音,并要求用户重新输入命令
ApdTapiDevice.PlayWaveFile('errorno.wav');
LBSysInfo.Items.Add(Format('%s %s 输入了错误的号码',
[ApdTapiDevice.calleridname, apdtapidevice.callerid]));
end;
//重置命令为空
CurrentCommand := '';
end;
end; 程序对按键进行判断(按键对应于digit参数),如果输入的为’*#’键,就进入录音功能,在录音前先播放提示语音,可以告诉用户留言长度为30秒,然后设置当前状态为csRecording,有人可能要问,没看到用来录音的代码呀,这部分其实是实现在另外的事件中的,我们稍后就会讲到。再来看点歌部分,同样的根据按键的组合在先前加载进CommandList的字符串列表中查找相匹配的歌曲,如果有相应的歌曲就播放,否则播放错误提示语音,提示用户重新输入命令,然后将按键清空等待重新输入。另外注意在事件的日志记录中我记录了ApdTapiDevice.calleridname和CallerID的属性,它们对应的是打入电话的号码,不过这项功能只对开通了来电显示功能的电话号码才有效,通过对打入电话号码信息的处理,我们可以提供一些额外的功能,不过这是题外话了。
前面提到了在按键处理事件中我们并没有进行留言的录制功能,这主要是因为我们要保证留言提示语音不被按键中断(设定Interruptwave:=false),因此把留言录制功能放到了TApdTapiDevice的OnWaveNotify事件中了,这个事件可以提示波文件播放的状态,比如播放结束和录音所需声音数据准备状态等,在本程序中我们需要在提示语音播放结束后,开始记录留言,并在留言声音数据准备好后,将其保存到磁盘文件中。下面是处理过程的流程: procedure TFrmMain.ApdTapiDeviceTapiWaveNotify(CP: TObject;
Msg: TWaveMessage);
var
TimeStr: string;
FileName: string;
begin
//决不能在case外做耗时的操作
case Msg of
waPlayOpen: LBSysInfo.Items.Add('wavnotify:播放开始');
waPlayDone:
begin
LBSysInfo.Items.Add('wavnotify:播放结束');
if CurrentState = csRecording then
begin
try
//等待波设备状态为wsIdle再开始录音
while ApdTapiDevice.WaveState <> wsIdle do
Application.ProcessMessages;
ApdTapiDevice.InterruptWave := True;
ApdTapiDevice.StartWaveRecord;
LBSysInfo.Items.Add('dtmf:录音成功');
except
LBSysInfo.Items.Add('dtmf:录音失败');
end;
end;
end;
waPlayClose: LBSysInfo.Items.Add('wavnotify:播放关闭');
waRecordOpen: LBSysInfo.Items.Add('wavnotify:录音开始');
waDataReady:
begin
LBSysInfo.Items.Add('wavnotify:数据准备');
TimeSeparator := '-';
FileName := DateTimeToStr(Now) '.wav';
try
ApdTapiDevice.SaveWaveFile(ExtractFilePath(ParamStr(0)) 'record\'
FileName, True);
LBSysInfo.Items.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 ——行径窄处,留一步与人行——
——Never give up, never surrender—— 發表人 - deity 於 2004/06/06 22:38:14
|
Alcohol
一般會員 發表:7 回覆:10 積分:8 註冊:2002-10-11 發送簡訊給我 |
|
mine
中階會員 發表:28 回覆:129 積分:56 註冊:2004-03-31 發送簡訊給我 |
procedure TForm1.ApdTapiDevice1TapiConnect(Sender: TObject); begin ApdTapiDevice1.PlayWaveFile('111.wav'); end;在tapi動作裡加入以上,經測試發現手機有時會無法得知正確的連線狀況(例如音樂回鈴),且會造成apdTapi元件後來動作都不正常,使用於一般手機上有時也會有無法偵測到connect的情形發生。 如果有錯還望指正 搞不懂!搞不懂!永遠都搞不懂!! 發表人 - mine 於 2004/11/15 15:19:24 |
暗黑破壞神
版主 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
|
mine
中階會員 發表:28 回覆:129 積分:56 註冊:2004-03-31 發送簡訊給我 |
|
power2010
一般會員 發表:10 回覆:11 積分:4 註冊:2004-11-11 發送簡訊給我 |
|
暗黑破壞神
版主 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
|
mine
中階會員 發表:28 回覆:129 積分:56 註冊:2004-03-31 發送簡訊給我 |
|
ry_lee
高階會員 發表:368 回覆:251 積分:123 註冊:2002-03-19 發送簡訊給我 |
|
orson
中階會員 發表:5 回覆:135 積分:58 註冊:2002-07-11 發送簡訊給我 |
|
Outbreak
一般會員 發表:1 回覆:2 積分:0 註冊:2002-08-25 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |