Alcohol
一般會員
![](./myimg/board/mystar_empty.gif)
![](images/icon_photo_none.gif) 發表:7 回覆:10 積分:8 註冊:2002-10-11
發送簡訊給我
|
使用APRO组件如何在对方拿起听筒时给对方播放声音?
在使用turbopower的APRO组件发送传真时,如何判断对方是否拿起听筒并给对方播放一段声音(*.wav).
|
pcplayer99
尊榮會員
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](images/icon_photo_none.gif) 發表:146 回覆:790 積分:632 註冊:2003-01-21
發送簡訊給我
|
引言:
使用APRO组件如何在对方拿起听筒时给对方播放声音?
在使用turbopower的APRO组件发送传真时,如何判断对方是否拿起听筒并给对方播放一段声音(*.wav).
你可以看看它提供的DEMO。有相关DEMO的。
|
Alcohol
一般會員
![](./myimg/board/mystar_empty.gif)
![](images/icon_photo_none.gif) 發表:7 回覆:10 積分:8 註冊:2002-10-11
發送簡訊給我
|
引言:
引言:
使用APRO组件如何在对方拿起听筒时给对方播放声音?
在使用turbopower的APRO组件发送传真时,如何判断对方是否拿起听筒并给对方播放一段声音(*.wav).
你可以看看它提供的DEMO。有相关DEMO的。 谢谢您的回复!
可是我实在无法知道对方是何时拿起听筒的.
ApdTapiDevice的onTAPIConnect事件发生时刚刚要Dial.不知道在什么事件中判断对方何时拿起听筒!!!
|
Alcohol
一般會員
![](./myimg/board/mystar_empty.gif)
![](images/icon_photo_none.gif) 發表:7 回覆:10 積分:8 註冊:2002-10-11
發送簡訊給我
|
引言:
使用APRO组件如何在对方拿起听筒时给对方播放声音?
在使用turbopower的APRO组件发送传真时,如何判断对方是否拿起听筒并给对方播放一段声音(*.wav).
怎么还是没有回复我?
斑竹大人来救命啊!!!!!!!!
|
deity
尊榮會員
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](images/icon_photo_none.gif) 發表: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
一般會員
![](./myimg/board/mystar_empty.gif)
![](images/icon_photo_none.gif) 發表:7 回覆:10 積分:8 註冊:2002-10-11
發送簡訊給我
|
谢谢您的回复!
其实你说的是接电话时的情况,而不是打给对方的情况!不过还是非常感谢您!
|
mine
中階會員
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](images/icon_photo_none.gif) 發表: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
|
暗黑破壞神
版主
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](http://nfu.coca.com.tw/photo.png) 發表:9 回覆:2301 積分:1627 註冊:2004-10-04
發送簡訊給我
|
可以跟你說實話嗎?
答案是。它在接話時可以做到你說的要求。
在撥出時。。。。。。做不到。
這也是為什麼語音卡有生存空間的理由了。
當年做這個撥出動作,最後只能買語音卡。用語音卡的API去做它。
我想。現在的MODEM也沒有更強。尤其是寬頻之後。它似乎沒有更強的理由。
所以。。。。。。你可以放棄了。
去找個可以用的卡吧。APRO我手上也有,當年也放棄了。
如果,你可以做出來。恭喜你。記得跟我說一下怎麼做的。^_^
|
mine
中階會員
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](images/icon_photo_none.gif) 發表:28 回覆:129 積分:56 註冊:2004-03-31
發送簡訊給我
|
自動撥出時由於遠端電壓及訊號無法正確偵測,所以語音卡也是借由Tone音偵測(BusyTone Voice Tone)所以小的改變了小小的作法,(我承認有點蠢 ![]() )就是不斷去撥要使用者按任意鍵的語音,借由偵測
|
power2010
一般會員
![](./myimg/board/mystar_empty.gif)
![](images/icon_photo_none.gif) 發表:10 回覆:11 積分:4 註冊:2004-11-11
發送簡訊給我
|
我也想知道
对这个有兴趣
我想如果弄个整人程式,在半夜的时候呼叫别人电话,然后传来鬼哭,哈哈哈,暴笑
|
暗黑破壞神
版主
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](http://nfu.coca.com.tw/photo.png) 發表:9 回覆:2301 積分:1627 註冊:2004-10-04
發送簡訊給我
|
害我又花了兩天看文件。。。。。。
確定MODEM不能做到。
GSM MODEM 可以做到。因為 GSM MODEM 有指令可以去測試。就算音樂也沒差。
而MODEM就。。。。。沒法度了。 ------------------
我討厭英文。~>_<~
|
mine
中階會員
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](images/icon_photo_none.gif) 發表:28 回覆:129 積分:56 註冊:2004-03-31
發送簡訊給我
|
暗黑大大真是辛苦您了...由於不是我開的問題 ...不過精神上給大大一百分^^
我還在想法子跟一個以前ADI的工程師拗東西,如果真的能有一點點機會我一定第一個告訴大大。謝謝大大~~!! 搞不懂!搞不懂!永遠都搞不懂!!
|
ry_lee
高階會員
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](images/icon_photo_none.gif) 發表:368 回覆:251 積分:123 註冊:2002-03-19
發送簡訊給我
|
要知道對方何時舉起話筒,我是用回鈴聲做判斷,我的程式搭配voice modem,我測試過沒問題,非常準確(不管無人接聽電話,或早以接聽別人電話,或正要接聽你正撥出之電話),但如果你撥出之電話無回鈴聲,我想我應該也沒辦法.
|
orson
中階會員
![](./myimg/board/mystar.gif) ![](./myimg/board/mystar.gif)
![](images/icon_photo_none.gif) 發表:5 回覆:135 積分:58 註冊:2002-07-11
發送簡訊給我
|
引言:
暗黑大大真是辛苦您了...由於不是我開的問題 ...不過精神上給大大一百分^^
我還在想法子跟一個以前ADI的工程師拗東西,如果真的能有一點點機會我一定第一個告訴大大。謝謝大大~~!! 搞不懂!搞不懂!永遠都搞不懂!!
ADI...
程X公司 我記得該公司有人在看深度論壇,這裡應該也有吧。 Orson
|
Outbreak
一般會員
![](./myimg/board/mystar_empty.gif)
![](images/icon_photo_none.gif) 發表:1 回覆:2 積分:0 註冊:2002-08-25
發送簡訊給我
|
喔~
那看來用語音數據機是無解了...><"
殘念...
真的只有選擇語音卡一途了嗎?
|