无码中文字幕色专区_91av俱乐部_无码人妻h动漫_26uuu成人_91九色丨porny丨国产jk_青青视频在线播放_国内自拍第二页_国产又粗又长又爽又黄的视频_色哟哟免费网站_久久出品必属精品_a级黄色一级片_99日在线视频

您現在所在的是:

串口通信

回帖:15個,閱讀:21340 [上一頁] [1] [2] [下一頁]
29778
思南 管理員
文章數:14043
年度積分:50
歷史總積分:29778
注冊時間:2001/3/12
發站內信
發表于:2003/8/17 22:44:00
#0樓
轉貼
利用語音Modem實現電話點播和留言功能
作者:陳省


有一段時間沒有更新網站了,最近挺忙的,所以寫書的進度慢了一些,兩周只寫了10多頁設計模式相關的內容。希望在接下來的幾周能加快進度,趕緊弄完。另外前兩天,我被評為了Borland Delphi產品專家,加上這兩天北京的非典形勢也緩和多了,很高興。為此公開很久以前寫的一篇文章,與大家分享一下我的快樂。

偶然的起因
記得還是在去年情人節的時候,當時一直在為給女朋友送什么禮物而發愁,覺得送花實在沒有什么創意,可又不知道什么樣的禮物即能給她一個驚喜同事又不昂貴。這時,我的一個好朋友出了一個主意,說不如電話點歌吧,還比較特別。可是如果是通過電臺點歌后,再告訴她收聽的話就起不到意外的效果了。
就在沒有什么好辦法的時候,我在Delphi論壇上瞎逛的時候,一個人提出的問題突然啟發了我,問題是關于如果編程實現語音留言和電話按鍵的記錄功能的。我突然想為什么我不能寫一個程序來控制電話,然后再給女友打一個傳呼,讓她回電話,當電話接通后,我的程序先播放一段事先錄制好的話,提示她通過電話按鍵來選歌,并能提供留言的功能呢。主意一定,我就趕忙查閱這方面的資料了,一開始朋友們告訴可以通過語音卡來實現這些功能,可是語音卡比較貴,而且我買了后,除了用一次以外以后也不會經常用到,實在是有點浪費,后來網友cced提到他聽人說TurboPower公司出的Async Professional控件提供了一組基于Telephone Api的控件可以通過語音Modem來實現類似的功能。這個看來成本就低多了,我的Modem正好是語音Modem,于是我就下載了Async Professional(官方網址為www.turbopower.com)試驗了一下,果然不同反響,便宜且簡單。

開始設計
下面我們就來看看如何利用這組控件實現語音功能,對于我們程序的應用來說,只需要使用兩個TAPI控件TApdComPort和TApdTapiDevice即可,其中TApdComPort控件是一個串口通訊控件,因為Modem是同串口相連接的,因此需要串口通訊控件來進行控制。而TapdTapiDevice則是提供語音功能的核心控件。
首先,新建一個程序項目,在窗體上放置一個TApdComport控件,設置其屬性為AutoOpen:=False;TapiMode=tmOn;這里TapiMode 設定為tmOn 表明TApdComPort 將由同其關聯的TApdTapiDevice.控件來控制,而將AutoOpen設定為False 是因為串口的打開和關閉現在可以完全由TAPI來控制了。
然后,在窗體上放置一個TApdTapiDevice控件,設定其Comport屬性為前面的TApdComPort控件。設定AnswerOnRing屬性為1,表明第一次振鈴后就開始由程序控制電話的應答。設定ShowTapiDevices為True表明當調用控件的SelectDevice方法時,會顯示一個選擇TAPI設備的對話框。ShowPorts屬性為false,表明調用SelectDevice方法不會顯示串行口列表。
接下來,本程序主要是采用有限狀態機來控制流程的,下面我們來定義枚舉狀態

Type
TCurrentState = (csIdle, csWaiting, csConnected, csPlaying, csRecording, sDisconnected);

其中csIdle狀態表示電話處于空閑狀態,正等待接入。csWaiting則表示電話處于程序控制下,等待接入,如果有電話打入,程序會自動應答。csConnected則表示有電話打入,處于連接狀態,csRecording則用來表示當前處于記錄電話留言狀態。csDisconnected則表示當前連接掛斷了。

程序初始化
下面就是程序的OnCreate的事件處理函數,非常簡單,就是先設置當前狀態為csIdle,并設置ApdTapiDevice控件的TrimSeconds屬性為5,表示當錄音時如果有5秒的沉默時間就掛斷。
procedure TFrmMain.FormCreate(Sender: TObject);
var
TeleIni: TIniFile;
begin
CurrentState := csIdle;
ApdTapiDevice.TrimSeconds := 5; //錄音時有5秒靜音就掛斷

CommandList := TStringList.Create;

TeleIni := TIniFile.Create(ExtractFilePath(ParamStr(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: Integer);
begin
if (Digit = '') or (Digit = ' ') then
Exit;
LBSysInfo.Items.Add('dtmf:按鍵=' + Digit);

CurrentCommand := CurrentCommand + Digit;
{簡單狀態機}
if Digit = '#' then
begin
if CurrentCommand = '*#' then
begin
CurrentCommand := '';
ApdTapiDevice.MaxMessageLength := 30; //最長記錄時間30秒
ApdTapiDevice.InterruptWave := False; //按鍵不能中斷提示語音的播放
ApdTapiDevice.PlayWaveFile('recordhint.wav');//播放錄音提示語音
CurrentState := csRecording;
Exit;
end;

if CommandList.Values[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;

另外,如果大家自信自己的歌喉不比那些歌星差的話,完全可以錄制自己的歌聲,然后播放給你的女朋友或朋友聽,也許效果更棒:)。
最后,我要說的就是Telephone API所能提供的功能遠遠不止本文中所提到的,感興趣的朋友可以進一步查閱相關資料來研究。

最后,要說的是Turbo Power已經不再開發Async Pro了,它把所有的源碼都放到了Sourceforge上共享,大家可以到SourceForge上下載。

圖
如您對論壇有好的建議或創想,請加大版主微信號:gkong2015
大版主推薦【工控百家談】微信公眾號,業界大拿原創內容分享
29778
思南 管理員
文章數:14043
年度積分:50
歷史總積分:29778
注冊時間:2001/3/12
發站內信
發表于:2003/8/17 23:10:00
#1樓
此樓內容不符合板塊規定,不予顯示! 查看原帖內容>>
29778
思南 管理員
文章數:14043
年度積分:50
歷史總積分:29778
注冊時間:2001/3/12
發站內信
發表于:2003/8/17 23:12:00
#2樓
此樓內容不符合板塊規定,不予顯示! 查看原帖內容>>
29778
思南 管理員
文章數:14043
年度積分:50
歷史總積分:29778
注冊時間:2001/3/12
發站內信
發表于:2003/8/17 23:13:00
#3樓
為了大家方便下載,現在上傳到本地下載,希望喜歡串口通信TAPI電腦MODEM錄音的朋友測試一下,如果有心得不妨分享一下!

官方網站:
http://sourceforge.net/project/showfiles.php?group_id=71007
本地下載:
程序以及代碼:
http://www.moduwu.com/download/download_view.asp?id=156
說明以及幫助:
http://www.moduwu.com/download/download_view.asp?id=155
圖
如您對論壇有好的建議或創想,請加大版主微信號:gkong2015
大版主推薦【工控百家談】微信公眾號,業界大拿原創內容分享
942
leefine
文章數:14
年度積分:50
歷史總積分:942
注冊時間:2002/10/30
發站內信
發表于:2003/9/20 23:12:00
#4樓
Thanks! You are welcome!
1007
bobbie
文章數:1
年度積分:50
歷史總積分:1007
注冊時間:2003/9/9
發站內信
發表于:2003/11/5 10:55:00
#5樓
思南,我沒有TApdComPort和TApdTapiDevice這兩個TAPI控件文件,可否麻煩你傳給我一份

bobbie.y@163.com,謝謝
1002
sc_xy
文章數:1
年度積分:50
歷史總積分:1002
注冊時間:2003/12/13
發站內信
發表于:2003/12/13 13:28:00
#6樓
謝謝
1059
karswell
文章數:14
年度積分:50
歷史總積分:1059
注冊時間:2004/7/13
發站內信
發表于:2004/7/13 21:04:00
#7樓
非常詳細,真的要感謝你。但是我有一個問題。你的程序可以向外撥號嗎?如果要向外撥號,那么在建立了連接之后,也就是在接收到modem的結果碼connect之后,如何判斷對方是摘機了,還是沒摘機,仍然處于回鈴音狀態。如能指教非常感謝!!!因為我也在編譯個modem撥號的程序。
1059
karswell
文章數:14
年度積分:50
歷史總積分:1059
注冊時間:2004/7/13
發站內信
發表于:2004/7/18 20:50:00
#8樓
思南,你所做的語音撥號的程序我也在做,但是遇到一個問題,想與你交流。是否每一次用modem進行AT指令處理時,應該都返回一個結果碼吧?為什么我編的程序檢測不到他的返回碼呢?我是用delphi編的,程序很簡單,但就是不能得到返回的結果!
1002
qwe456
文章數:1
年度積分:50
歷史總積分:1002
注冊時間:2004/11/24
發站內信
發表于:2004/11/24 15:36:00
#9樓
不能下啊,FTP也不行哦

關于我們 | 聯系我們 | 廣告服務 | 本站動態 | 友情鏈接 | 法律聲明 | 非法和不良信息舉報

工控網客服熱線:0755-86369299
版權所有 工控網 Copyright©2026 Gkong.com, All Rights Reserved

109.2007
无码中文字幕色专区_91av俱乐部_无码人妻h动漫_26uuu成人_91九色丨porny丨国产jk_青青视频在线播放_国内自拍第二页_国产又粗又长又爽又黄的视频_色哟哟免费网站_久久出品必属精品_a级黄色一级片_99日在线视频
欧美日本精品| 精品国产一区二区三区噜噜噜| 国产综合色区在线观看| 99精品综合| 欧美日本三区| 久久国产66| 婷婷综合六月| 麻豆精品蜜桃视频网站| 中文字幕亚洲在线观看| 久久久国产精品一区二区中文| 久久精品99国产精品日本| 日韩视频二区| 中文字幕在线免费观看视频| 久久国产日本精品| 国产精品亚洲产品| 五月激激激综合网色播| 日韩午夜高潮| 欧美成a人免费观看久久| 美女高潮久久久| 国产精品亚洲人成在99www| 亚洲一区二区免费在线观看| 激情综合自拍| 日韩精品91| 青青青免费在线视频| 精品久久一区| 日本精品国产| 日本一区免费网站| 99日韩精品| 日韩av三区| 不卡视频在线| 久久久久91| 日韩精品第二页| 日韩精品一二三| 国产亚洲毛片在线| 亚洲涩涩在线| 久久中文亚洲字幕| 三级在线看中文字幕完整版| 国产福利亚洲| 国产精品极品在线观看| 中文久久精品| 综合国产精品| 免费久久精品视频| 青青草国产精品亚洲专区无| 精品三级久久| 欧美另类专区| 免费成人网www| 中文久久精品| 在线综合欧美| 日韩精品导航| 免费在线小视频| 国产欧美自拍| 精品久久久亚洲| 麻豆国产精品一区二区三区| 亚洲免费专区| 国产日韩欧美在线播放不卡| 亚洲免费婷婷| 欧美亚洲免费| 亚洲专区一区| 99精品网站| 免费精品视频在线| 免费成人网www| 国产精品中文字幕亚洲欧美| 久久精品亚洲欧美日韩精品中文字幕| 日韩国产激情| 成人精品亚洲| 日本午夜精品久久久| 日韩av一级片| 国产视频一区免费看| 日韩国产欧美在线播放| 亚洲小说春色综合另类电影| 清纯唯美亚洲综合一区| 国产午夜久久av| caoporn视频在线| 国产精品日本一区二区三区在线 | 欧美xxxx性| 国产精品伊人| 免费观看不卡av| 日韩视频在线一区二区三区 | 欧美一区二区三区高清视频| 亚洲专区在线| 日韩av网站在线观看| 日韩成人免费| 91精品国产调教在线观看| 91精品99| 亚洲午夜免费| 国产一二在线播放| 香蕉久久精品| 国产精品.xx视频.xxtv| 日韩欧美一区二区三区免费看| 欧美中文字幕一区二区| 国产精品第一| 成人久久一区| 国产成人久久精品一区二区三区| 99久久亚洲精品蜜臀| 卡一精品卡二卡三网站乱码| 蜜桃成人精品| 你懂的亚洲视频| 国产国产精品| 天堂中文在线播放| 免费久久精品视频| 免费欧美一区| 欧美xxxx性| 久久精品 人人爱| 久久蜜桃av| 欧美国产另类| 香蕉久久国产| 欧美粗暴jizz性欧美20| 国产日产一区| 日本综合精品一区| 久久中文视频| 亚洲午夜久久久久久尤物 | 欧美日韩夜夜| 免费国产自线拍一欧美视频| 久久伊人久久| 国产欧美自拍| 视频一区欧美精品| 国产高清久久| аⅴ资源天堂资源库在线| 国产一精品一av一免费爽爽| 99久久精品网站| 色婷婷狠狠五月综合天色拍| 亚洲字幕久久| 久久午夜影视| 久久亚洲成人| 欧美偷窥清纯综合图区| 五月国产精品| 日韩精品视频在线看| 在线精品小视频| 欧美在线亚洲| 久久久久久久久久久9不雅视频| 国产自产自拍视频在线观看| 欧美亚洲国产日韩| 国产精品对白| 国产欧美日本| 蜜桃久久久久| 国产日产高清欧美一区二区三区 | 99视频精品免费观看| 五月精品视频| 国产aa精品| 99久久激情| 亚洲调教视频在线观看| 黄色av日韩| 免费观看不卡av| 亚洲人成网站在线在线观看| 国产精品毛片| 日韩区欧美区| 欧美综合精品| 日韩.com| 日韩视频网站在线观看| 欧美精品一卡| 免费看日韩精品| 成人国产综合| av中文资源在线资源免费观看| 婷婷成人综合| 激情亚洲影院在线观看| 国产精品美女久久久浪潮软件| 欧美日韩国产一区精品一区| 亚洲三级毛片| 国产欧美大片| 99精品在线| 亚洲一区二区免费看| 国产亚洲高清在线观看| 国产精品任我爽爆在线播放| 亚洲v在线看| 中文字幕高清在线播放| 亚洲一区区二区| 福利在线免费视频| 香蕉久久久久久久av网站| 久久精品国产99| 视频二区不卡| 青青青国产精品| 激情中国色综合| 伊人久久大香线蕉av超碰演员| 中文一区在线| 国产精品不卡| 欧美日韩国产高清| 国产精品永久| 国产精品成久久久久| 日韩在线成人| 国产精品久久久久久久免费观看| 视频在线在亚洲| 精品国产乱码久久久久久樱花 | 一区二区国产在线观看| 精品精品99| 日韩精品一级中文字幕精品视频免费观看| 狠狠久久伊人中文字幕| 神马午夜在线视频| 91精品日本| 日韩av资源网| 九九久久婷婷| 综合欧美亚洲| 91精品一区二区三区综合在线爱| 国产日韩精品视频一区二区三区| 亚洲成人va| 日韩成人亚洲| 红杏一区二区三区| 国产精品毛片一区二区在线看| 日韩高清中文字幕一区| 午夜亚洲精品| 日韩一区二区在线免费|