線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2073
推到 Plurk!
推到 Facebook!

使用APRO组件如何在对方拿起听筒时给对方播放声音?

尚未結案
Alcohol
一般會員


發表:7
回覆:10
積分:8
註冊:2002-10-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-05-29 16:43:01 IP:218.65.xxx.xxx 未訂閱
使用APRO组件如何在对方拿起听筒时给对方播放声音? 在使用turbopower的APRO组件发送传真时,如何判断对方是否拿起听筒并给对方播放一段声音(*.wav).
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-05-29 19:23:13 IP:219.133.xxx.xxx 未訂閱
引言: 使用APRO组件如何在对方拿起听筒时给对方播放声音? 在使用turbopower的APRO组件发送传真时,如何判断对方是否拿起听筒并给对方播放一段声音(*.wav).
你可以看看它提供的DEMO。有相关DEMO的。
Alcohol
一般會員


發表:7
回覆:10
積分:8
註冊:2002-10-11

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-05-30 11:06:23 IP:218.65.xxx.xxx 未訂閱
引言:
引言: 使用APRO组件如何在对方拿起听筒时给对方播放声音? 在使用turbopower的APRO组件发送传真时,如何判断对方是否拿起听筒并给对方播放一段声音(*.wav).
你可以看看它提供的DEMO。有相关DEMO的。 谢谢您的回复! 可是我实在无法知道对方是何时拿起听筒的. ApdTapiDevice的onTAPIConnect事件发生时刚刚要Dial.不知道在什么事件中判断对方何时拿起听筒!!!
Alcohol
一般會員


發表:7
回覆:10
積分:8
註冊:2002-10-11

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-06-06 16:29:12 IP:218.65.xxx.xxx 未訂閱
引言: 使用APRO组件如何在对方拿起听筒时给对方播放声音? 在使用turbopower的APRO组件发送传真时,如何判断对方是否拿起听筒并给对方播放一段声音(*.wav).
怎么还是没有回复我? 斑竹大人来救命啊!!!!!!!!
deity
尊榮會員


發表:90
回覆:876
積分:678
註冊:2003-05-09

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-06-06 22:34:47 IP:219.129.xxx.xxx 未訂閱
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-06-13 22:31:27 IP:218.65.xxx.xxx 未訂閱
谢谢您的回复! 其实你说的是接电话时的情况,而不是打给对方的情况!不过还是非常感谢您!
mine
中階會員


發表:28
回覆:129
積分:56
註冊:2004-03-31

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-11-15 15:11:01 IP:61.221.xxx.xxx 未訂閱
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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-11-15 17:46:38 IP:59.104.xxx.xxx 未訂閱
可以跟你說實話嗎? 答案是。它在接話時可以做到你說的要求。 在撥出時。。。。。。做不到。 這也是為什麼語音卡有生存空間的理由了。 當年做這個撥出動作,最後只能買語音卡。用語音卡的API去做它。 我想。現在的MODEM也沒有更強。尤其是寬頻之後。它似乎沒有更強的理由。 所以。。。。。。你可以放棄了。 去找個可以用的卡吧。APRO我手上也有,當年也放棄了。 如果,你可以做出來。恭喜你。記得跟我說一下怎麼做的。^_^
mine
中階會員


發表:28
回覆:129
積分:56
註冊:2004-03-31

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-11-15 19:25:47 IP:61.221.xxx.xxx 未訂閱
自動撥出時由於遠端電壓及訊號無法正確偵測,所以語音卡也是借由Tone音偵測(BusyTone Voice Tone)所以小的改變了小小的作法,(我承認有點蠢)就是不斷去撥要使用者按任意鍵的語音,借由偵測
power2010
一般會員


發表:10
回覆:11
積分:4
註冊:2004-11-11

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-11-18 21:17:35 IP:221.14.xxx.xxx 未訂閱
我也想知道 对这个有兴趣 我想如果弄个整人程式,在半夜的时候呼叫别人电话,然后传来鬼哭,哈哈哈,暴笑
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-11-19 09:21:32 IP:221.169.xxx.xxx 未訂閱
害我又花了兩天看文件。。。。。。 確定MODEM不能做到。 GSM MODEM 可以做到。因為 GSM MODEM 有指令可以去測試。就算音樂也沒差。 而MODEM就。。。。。沒法度了。 ------------------ 我討厭英文。~>_<~
mine
中階會員


發表:28
回覆:129
積分:56
註冊:2004-03-31

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-11-19 13:55:53 IP:61.221.xxx.xxx 未訂閱
暗黑大大真是辛苦您了...由於不是我開的問題 ...不過精神上給大大一百分^^ 我還在想法子跟一個以前ADI的工程師拗東西,如果真的能有一點點機會我一定第一個告訴大大。謝謝大大~~!! 搞不懂!搞不懂!永遠都搞不懂!!
ry_lee
高階會員


發表:368
回覆:251
積分:123
註冊:2002-03-19

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-11-21 01:45:36 IP:211.76.xxx.xxx 未訂閱
要知道對方何時舉起話筒,我是用回鈴聲做判斷,我的程式搭配voice modem,我測試過沒問題,非常準確(不管無人接聽電話,或早以接聽別人電話,或正要接聽你正撥出之電話),但如果你撥出之電話無回鈴聲,我想我應該也沒辦法.
orson
中階會員


發表:5
回覆:135
積分:58
註冊:2002-07-11

發送簡訊給我
#14 引用回覆 回覆 發表時間:2004-11-22 10:34:21 IP:211.74.xxx.xxx 未訂閱
引言: 暗黑大大真是辛苦您了...由於不是我開的問題 ...不過精神上給大大一百分^^ 我還在想法子跟一個以前ADI的工程師拗東西,如果真的能有一點點機會我一定第一個告訴大大。謝謝大大~~!! 搞不懂!搞不懂!永遠都搞不懂!!
ADI... 程X公司 我記得該公司有人在看深度論壇,這裡應該也有吧。 Orson
Outbreak
一般會員


發表:1
回覆:2
積分:0
註冊:2002-08-25

發送簡訊給我
#15 引用回覆 回覆 發表時間:2004-12-20 11:19:20 IP:210.67.xxx.xxx 未訂閱
喔~ 那看來用語音數據機是無解了...><" 殘念... 真的只有選擇語音卡一途了嗎?
系統時間:2024-07-01 8:49:40
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!