青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

牽著老婆滿街逛

嚴(yán)以律己,寬以待人. 三思而后行.
GMail/GTalk: yanglinbo#google.com;
MSN/Email: tx7do#yahoo.com.cn;
QQ: 3 0 3 3 9 6 9 2 0 .

directsound抓取麥克風(fēng)PCM數(shù)據(jù)封裝類

轉(zhuǎn)載自:http://blog.chinaunix.net/uid-8272118-id-2033248.html

網(wǎng)上有很多方法從麥克風(fēng)讀取PCM數(shù)據(jù),不想一一舉例。只是在這里發(fā)布一個(gè)我自己寫的directsound的麥克風(fēng)PCM數(shù)據(jù)采集類,通過它,可以很方便的利用directsound技術(shù)把麥克風(fēng)的數(shù)據(jù)采集到,而且本身,開發(fā)者不必太在意自己會(huì)不會(huì)directsound編程,可以很方便的讓開發(fā)者的主要精力集中于程序本身,而不是細(xì)節(jié)。
這個(gè)是頭文件:
#pragma once
#ifndef _CAPTURE_SOUND_H_
#define _CAPTURE_SOUND_H_
#include 
<mmsystem.h>
#include 
<dsound.h>
#define NUM_REC_NOTIFICATIONS  16
class CAdoFrameHandler {
public:
 
virtual void AdoFrameData(BYTE* pBuffer, long lBufferSize) = 0 ; 
}
;
class CCaptureAudio
{
public:
 BOOL        m_bRecording ;  
//recording now ? also used by event recv thread
protected:
 LPDIRECTSOUNDCAPTURE8    m_pCapDev ;   
//capture device ptr
 LPDIRECTSOUNDCAPTUREBUFFER m_pCapBuf ;   //capture loop buffer ptr
 LPDIRECTSOUNDNOTIFY8    m_pNotify ;   //capture auto-notify event callback handler ptr
 GUID        m_guidCapDevId ;  //capture device id
 WAVEFORMATEX      m_wfxInput;   //input wave format description struct
 DSBPOSITIONNOTIFY     m_aPosNotify[NUM_REC_NOTIFICATIONS + 1]; //notify flag array 
 HANDLE        m_hNotifyEvent;   //notify event 
 BOOL        m_abInputFmtSupported[20];
 DWORD        m_dwCapBufSize;  
//capture loop buffer size 
 DWORD        m_dwNextCapOffset;//offset in loop buffer 
 DWORD        m_dwNotifySize;  //notify pos when loop buffer need to emit the event
 CAdoFrameHandler*     m_frame_handler ; // outer frame data dealer ptr 
public// callback func to add enum devices string name 
 static BOOL CALLBACK enum_dev_proc(LPGUID lpGUID, LPCTSTR lpszDesc, 
            LPCTSTR lpszDrvName, LPVOID lpContext ) ;
 
static UINT notify_capture_thd(LPVOID data) ;
protected:
 HRESULT InitDirectSound(GUID dev_id 
= GUID_NULL) ; 
 HRESULT FreeDirectSound() ; 
 HRESULT InitNotifications() ; 
 HRESULT CreateCaptureBuffer(WAVEFORMATEX 
* wfx) ; 
 HRESULT StartOrStopRecord(BOOL bStartRec) ;
 HRESULT RecordCapturedData() ; 
 
void    SetWavFormat(WAVEFORMATEX * wfx) ;
public:
 CCaptureAudio(
void);
 
~CCaptureAudio(void);
 BOOL EnumDevices(HWND hList) ;
 BOOL Open(
void) ; 
 BOOL Close() ; 
 
void GrabAudioFrames(BOOL bGrabAudioFrames, CAdoFrameHandler* frame_handler) ; 
}
;
#endif
 
下面這個(gè)是cpp文件:
#include "StdAfx.h"
#include 
".\captureaudio.h"
#include 
<mmsystem.h>
#include 
<dsound.h>
#ifndef SAFE_DELETE
#define SAFE_DELETE(p)  { if(p) { delete (p);     (p)=NULL; } }
#endif
#ifndef SAFE_RELEASE
#define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } }
#endif
#ifndef MAX
#define MAX(a,b)        ( (a) > (b) ? (a) : (b) )
#endif
CCaptureAudio::CCaptureAudio(
void)
{
 
if(FAILED(CoInitialize(NULL))) /*, COINIT_APARTMENTTHREADED)))*/
 
{
  AfxMessageBox(
"CCaptureAudio CoInitialize Failed!\r\n"); 
  
return;
 }

 m_pCapDev 
= NULL ;
 m_pCapBuf 
= NULL ;
 m_pNotify 
= NULL ;
 
// set default wave format PCM
 ZeroMemory( &m_wfxInput, sizeof(m_wfxInput));
 m_wfxInput.wFormatTag 
= WAVE_FORMAT_PCM;
 m_guidCapDevId 
= GUID_NULL ; 
 m_bRecording 
= FALSE ; 
 m_hNotifyEvent 
= NULL ; 
}

CCaptureAudio::
~CCaptureAudio(void)
{
 CoUninitialize() ; 
}

BOOL CALLBACK CCaptureAudio::enum_dev_proc(LPGUID lpGUID, LPCTSTR lpszDesc, 
             LPCTSTR lpszDrvName, LPVOID lpContext) 
{
 HWND hList 
= (HWND)lpContext;
 
if(!hList) return FALSE ; 
 LPGUID lpTemp 
= NULL;
 
if (lpGUID != NULL) {
  
// NULL only for "Primary Sound Driver".
  if ((lpTemp = (LPGUID)malloc(sizeof(GUID))) == NULL) return(TRUE);
  memcpy(lpTemp, lpGUID, 
sizeof(GUID));
 }

 ::SendMessage(hList, CB_ADDSTRING, 
0,(LPARAM)lpszDesc);
 ::SendMessage(hList, LB_SETITEMDATA, 
0, (LPARAM)lpTemp) ; 
 free(lpTemp);
 
return(TRUE);
}

UINT CCaptureAudio::notify_capture_thd(LPVOID data)
{
 CCaptureAudio 
* pado = static_cast<CCaptureAudio *>(data) ; 
 MSG   msg;
 HRESULT hr ; 
 DWORD dwResult ; 
 
while(pado->m_bRecording) {
  dwResult 
= MsgWaitForMultipleObjects( 1&(pado->m_hNotifyEvent), FALSE, INFINITE, QS_ALLEVENTS );
  
switch( dwResult ) {
  
case WAIT_OBJECT_0 + 0:
   
// g_hNotificationEvents[0] is signaled
   
// This means that DirectSound just finished playing 
   
// a piece of the buffer, so we need to fill the circular 
   
// buffer with new sound from the wav file
   if( FAILED( hr = pado->RecordCapturedData() ) ) {
    AfxMessageBox(
"Error handling DirectSound notifications.") ; 
    pado
->m_bRecording = FALSE ; 
   }

   
break;
  
case WAIT_OBJECT_0 + 1:
   
// Windows messages are available
   while( PeekMessage( &msg, NULL, 00, PM_REMOVE ) ) 
     TranslateMessage( 
&msg ); 
     DispatchMessage( 
&msg ); 
    
if( msg.message == WM_QUIT ) pado->m_bRecording = FALSE ; 
   }

   
break;
  }

 }

 AfxEndThread(
0, TRUE) ; 
 
return 0 ; 
}

BOOL CCaptureAudio::EnumDevices(HWND hList) 
{
 
if (FAILED(DirectSoundCaptureEnumerate (
   (LPDSENUMCALLBACK)(CCaptureAudio::enum_dev_proc),
   (VOID
*)&hList)))
 
{
  
return(FALSE);
 }

 
return (TRUE) ; 
}

BOOL CCaptureAudio::Open(
void)
{
 HRESULT hr ; 
 
if(!m_bRecording) {
  hr 
= InitDirectSound() ; 
 }

 
return (FAILED(hr)) ? FALSE : TRUE ; 
}

BOOL CCaptureAudio::Close() 
{
 HRESULT hr ; 
 hr 
= FreeDirectSound() ; 
 CloseHandle(m_hNotifyEvent) ; 
 
return (FAILED(hr)) ? FALSE : TRUE ; 
}

HRESULT CCaptureAudio::InitDirectSound(GUID dev_id)
{
 HRESULT hr ; 
 m_guidCapDevId 
= dev_id ;
 ZeroMemory( 
&m_aPosNotify, sizeof(DSBPOSITIONNOTIFY) * (NUM_REC_NOTIFICATIONS + 1) ) ;
 m_dwCapBufSize 
= 0 ;
 m_dwNotifySize 
= 0 ;
 
// Create IDirectSoundCapture using the preferred capture device
 hr = DirectSoundCaptureCreate(&m_guidCapDevId, &m_pCapDev, NULL ) ;
 
// init wave format 
 SetWavFormat(&m_wfxInput) ;
 
return (FAILED(hr)) ? S_FALSE : S_OK ; 
}

HRESULT CCaptureAudio::FreeDirectSound()
{
 
// Release DirectSound interfaces
 SAFE_RELEASE( m_pNotify ) ;
 SAFE_RELEASE( m_pCapBuf ) ;
 SAFE_RELEASE( m_pCapDev ) ; 
 
return S_OK;
}

HRESULT CCaptureAudio::CreateCaptureBuffer(WAVEFORMATEX 
* wfx) 
{
 HRESULT hr;
 DSCBUFFERDESC dscbd;
 SAFE_RELEASE( m_pNotify );
 SAFE_RELEASE( m_pCapBuf );
 
// Set the notification size
 m_dwNotifySize = MAX( 1024, wfx->nAvgBytesPerSec / 8 ) ; 
 m_dwNotifySize 
-= m_dwNotifySize % wfx->nBlockAlign ;
 
// Set the buffer sizes 
 m_dwCapBufSize = m_dwNotifySize * NUM_REC_NOTIFICATIONS;
 SAFE_RELEASE( m_pNotify );
 SAFE_RELEASE( m_pCapBuf );
 
// Create the capture buffer
 ZeroMemory( &dscbd, sizeof(dscbd) );
 dscbd.dwSize        
= sizeof(dscbd);
 dscbd.dwBufferBytes 
= m_dwCapBufSize;
 dscbd.lpwfxFormat   
= wfx ; // Set the format during creatation
 if( FAILED( hr = m_pCapDev->CreateCaptureBuffer( &dscbd, &m_pCapBuf, NULL ) ) )
  
return S_FALSE ;
 m_dwNextCapOffset 
= 0;
 
if( FAILED( hr = InitNotifications() ) )
  
return S_FALSE ;
 
return S_OK;
}

HRESULT CCaptureAudio::InitNotifications() 
{
 HRESULT hr; 
 
int i ; 
 
if( NULL == m_pCapBuf )
  
return S_FALSE;
 
// create auto notify event 
 m_hNotifyEvent = CreateEvent( NULL, FALSE, FALSE, NULL );
 
// Create a notification event, for when the sound stops playing
 if( FAILED( hr = m_pCapBuf->QueryInterface( IID_IDirectSoundNotify, (VOID**)&m_pNotify ) ) )
  
return S_FALSE ;
 
// Setup the notification positions
 for( i = 0; i < NUM_REC_NOTIFICATIONS; i++ ) {
  m_aPosNotify[i].dwOffset 
= (m_dwNotifySize * i) + m_dwNotifySize - 1;
  m_aPosNotify[i].hEventNotify 
= m_hNotifyEvent;             
 }

 
// Tell DirectSound when to notify us. the notification will come in the from 
 
// of signaled events that are handled in WinMain()
 if( FAILED( hr = m_pNotify->SetNotificationPositions( NUM_REC_NOTIFICATIONS, m_aPosNotify ) ) )
  
return S_FALSE ;
 
return S_OK;
}

HRESULT CCaptureAudio::StartOrStopRecord(BOOL bStartRec)
{
 HRESULT hr;
 
if( bStartRec ) {
  
// Create a capture buffer, and tell the capture 
  
// buffer to start recording   
  if( FAILED( hr = CreateCaptureBuffer( &m_wfxInput ) ) )
   
return S_FALSE ;
  
if( FAILED( hr = m_pCapBuf->Start( DSCBSTART_LOOPING ) ) )
   
return S_FALSE ;
  
// create notify event recv thread 
  AfxBeginThread(CCaptureAudio::notify_capture_thd, (LPVOID)(this)) ;
 }
 else 
  
// Stop the capture and read any data that 
  
// was not caught by a notification
  if( NULL == m_pCapBuf )
   
return S_OK;
  
// wait until the notify_event_thd thread exit and release the resources.
  Sleep(500) ;
  
// Stop the buffer, and read any data that was not 
  
// caught by a notification
  if( FAILED( hr = m_pCapBuf->Stop() ) )
   
return S_OK ;
  
if( FAILED( hr = RecordCapturedData() ) )
   
return S_FALSE ; 
 }

 
return S_OK;
}

HRESULT CCaptureAudio::RecordCapturedData() 
{
 HRESULT hr;
 VOID
*   pbCaptureData    = NULL;
 DWORD   dwCaptureLength;
 VOID
*   pbCaptureData2   = NULL;
 DWORD   dwCaptureLength2;
 DWORD   dwReadPos;
 DWORD   dwCapturePos;
 LONG lLockSize;
 
if( NULL == m_pCapBuf )
  
return S_FALSE; 
 
 
if( FAILED( hr = m_pCapBuf->GetCurrentPosition( &dwCapturePos, &dwReadPos ) ) )
  
return S_FALSE;
 lLockSize 
= dwReadPos - m_dwNextCapOffset;
 
if( lLockSize < 0 )
  lLockSize 
+= m_dwCapBufSize;
 
// Block align lock size so that we are always write on a boundary
 lLockSize -= (lLockSize % m_dwNotifySize);
 
if( lLockSize == 0 )
  
return S_FALSE;
 
// Lock the capture buffer down
 if( FAILED( hr = m_pCapBuf->Lock( m_dwNextCapOffset, lLockSize,
           
&pbCaptureData, &dwCaptureLength, 
           
&pbCaptureData2, &dwCaptureLength2, 0L ) ) )
  
return S_FALSE ;
 
// call the outer data handler
 if(m_frame_handler) {
  m_frame_handler
->AdoFrameData((BYTE*)pbCaptureData, dwCaptureLength) ; 
 }

 
 
// Move the capture offset along
 m_dwNextCapOffset += dwCaptureLength; 
 m_dwNextCapOffset 
%= m_dwCapBufSize; // Circular buffer
 if( pbCaptureData2 != NULL ) {
  
// call the outer data handler 
  if(m_frame_handler) {
   m_frame_handler
->AdoFrameData((BYTE*)pbCaptureData, dwCaptureLength) ; 
  }

  
// Move the capture offset along
  m_dwNextCapOffset += dwCaptureLength2; 
  m_dwNextCapOffset 
%= m_dwCapBufSize; // Circular buffer
 }

 
// Unlock the capture buffer
 m_pCapBuf->Unlock( pbCaptureData,  dwCaptureLength, pbCaptureData2, dwCaptureLength2 );
 
return S_OK;
}

void CCaptureAudio::SetWavFormat(WAVEFORMATEX * wfx)
{
 
// get the default capture wave formate 
 ZeroMemory(wfx, sizeof(WAVEFORMATEX)) ; 
 wfx
->wFormatTag = WAVE_FORMAT_PCM;
 
// 8KHz, 16 bits PCM, Mono
 wfx->nSamplesPerSec = 8000 ; 
 wfx
->wBitsPerSample = 16 ; 
 wfx
->nChannels  = 1 ;
 wfx
->nBlockAlign = wfx->nChannels * ( wfx->wBitsPerSample / 8 ) ; 
 wfx
->nAvgBytesPerSec = wfx->nBlockAlign * wfx->nSamplesPerSec;
}

void CCaptureAudio::GrabAudioFrames(BOOL bGrabAudioFrames, CAdoFrameHandler* frame_handler) 
{
 m_frame_handler 
= frame_handler ; 
 m_bRecording 
= bGrabAudioFrames ; 
 StartOrStopRecord(m_bRecording) ; 
}
 
使用的時(shí)候,也很簡(jiǎn)單,我這里聲明了一個(gè)純虛類CAdoFrameHandler,這個(gè)類專門是用來讓使用者重載它的純虛函數(shù)的,只要重載了以后,設(shè)置正確,就可以自動(dòng)開始采集音頻數(shù)據(jù)了。注意,在這個(gè)類里面,我用的是8KHz,16Bits,Mono單聲道的PCM數(shù)據(jù)采集。
使用的時(shí)候,首先:
#include "CaptureAudio.h"
然后:
class CMyClass : public CAdoFrameHandler {

public// override the CAdoFrameHandler
 void AdoFrameData(BYTE* pBuffer, long lBufferSize) ;  // 這個(gè)類重載一下,就可以采集了
 
protected:
  CCaptureAudio   m_cap_ado ; 
// 這個(gè)對(duì)象就是用來采集音頻數(shù)據(jù)的
}
 ;
 
在OnInitDialog類中,我們可以使用如下初始化方法:
 
打開mic,同時(shí)初始化directsound:
m_cap_ado.Open() ;
 
開始采集聲音就是:
m_cap_ado.GrabAudioFrames(TRUE, this) ;
調(diào)用它以后,只要你重載了上面的那個(gè)函數(shù),directsound就會(huì)周期性的從麥克采集數(shù)據(jù),然后調(diào)用該函數(shù)。
 
停止聲音采集是:
m_cap_ado.GrabAudioFrames(FALSE, NULL) ;
 
關(guān)閉mic,同時(shí)釋放directsound:
m_cap_ado.Close() ;
 
就這么簡(jiǎn)單的幾步,就可以完成麥克風(fēng)的音頻數(shù)據(jù)采集。
有問題歡迎大家多多交流。

posted on 2012-11-23 00:11 楊粼波 閱讀(2485) 評(píng)論(1)  編輯 收藏 引用 所屬分類: 文章收藏C++

評(píng)論

# re: directsound抓取麥克風(fēng)PCM數(shù)據(jù)封裝類 2016-06-15 18:59 hello

鏈接庫
strmiids.lib Quartz.lib winmm.lib dsound.lib dxguid.lib  回復(fù)  更多評(píng)論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲片在线观看| 亚洲影音一区| 欧美在线国产精品| 欧美一进一出视频| 香蕉成人伊视频在线观看| 亚洲一区在线播放| 午夜日韩在线| 玖玖玖国产精品| 亚洲电影自拍| 亚洲国产小视频| 99精品国产一区二区青青牛奶| 91久久精品一区二区别| 亚洲精品一区在线观看香蕉| 一区二区日韩精品| 久久久高清一区二区三区| 久久青草久久| 欧美另类一区| 国产亚洲精品一区二555| 亚洲第一在线综合网站| 一区二区三区福利| 久久久噜噜噜久久中文字免| 欧美成人日韩| 99视频一区二区三区| 欧美一区二区免费视频| 欧美精品一区二区三区蜜臀| 国产精品色网| 亚洲国产成人精品女人久久久| 一本色道久久综合狠狠躁篇怎么玩| 亚洲一区3d动漫同人无遮挡| 欧美成人嫩草网站| 欧美在线观看网址综合| 欧美日韩一区视频| 亚洲人精品午夜| 久久国产66| 在线亚洲高清视频| 欧美国产日本在线| 在线观看中文字幕不卡| 欧美亚洲一区| 中文av一区二区| 欧美日本免费一区二区三区| 亚洲大胆av| 久久人人爽人人爽| 亚洲欧美国产77777| 欧美午夜激情在线| 最近中文字幕日韩精品| 久久久久久9999| 国产精品区一区| 欧美刺激性大交免费视频| 国产欧美日韩一级| 欧美黄色影院| 亚洲女性裸体视频| 欧美日精品一区视频| 亚洲精品久久久久久一区二区| 久久久精品网| 欧美在线视频在线播放完整版免费观看 | 一区二区三区欧美在线| 巨胸喷奶水www久久久免费动漫| 亚洲手机视频| 国产精品午夜国产小视频| 亚洲视频在线观看| av不卡在线| 欧美四级在线观看| 亚洲天堂男人| 亚洲五月六月| 国产精自产拍久久久久久| 亚洲一区二区在线观看视频| 日韩视频免费观看| 国产精品久久久久久久久借妻| 亚洲淫性视频| 香蕉久久夜色| 影音先锋亚洲一区| 欧美成人免费视频| 欧美激情日韩| 亚洲影视九九影院在线观看| 夜夜躁日日躁狠狠久久88av| 欧美色精品在线视频| 午夜综合激情| 久久精品国产第一区二区三区最新章节| 国产欧美欧美| 女人香蕉久久**毛片精品| 嫩草成人www欧美| 亚洲一级二级| 午夜一区二区三区在线观看| 在线观看国产日韩| 亚洲精选一区二区| 国产手机视频一区二区| 欧美成人有码| 国产精品久久久久aaaa九色| 久久蜜桃av一区精品变态类天堂| 免费久久99精品国产自| 亚洲一区在线免费| 久久久成人精品| 一区二区av在线| 性色av一区二区三区| 最新国产乱人伦偷精品免费网站| 一区二区激情视频| 精品999久久久| 亚洲午夜精品久久久久久浪潮| 国产日韩在线亚洲字幕中文| 亚洲黄色av一区| 国产一区二区中文| 亚洲国产你懂的| 欧美亚洲日本国产| 久久视频国产精品免费视频在线 | 欧美一区激情| 亚洲美女啪啪| 久久国产99| 亚洲欧美日韩另类精品一区二区三区| 久久精品国产96久久久香蕉| 日韩网站免费观看| 久久久久国产精品厨房| 亚洲制服丝袜在线| 欧美大片专区| 久久久精品国产免费观看同学| 欧美另类亚洲| 亚洲国产成人久久| 尤物精品在线| 午夜精品国产精品大乳美女| 91久久综合亚洲鲁鲁五月天| 午夜久久影院| 亚洲欧美中文日韩在线| 欧美日本一区二区高清播放视频| 久久夜色精品亚洲噜噜国产mv| 欧美性猛交99久久久久99按摩 | 欧美一区二区性| 欧美日韩在线三区| 亚洲人成网站在线播| 黄色av一区| 欧美一级大片在线免费观看| 亚洲一区制服诱惑| 欧美日韩免费网站| 亚洲精品美女久久7777777| 亚洲国产精品成人综合色在线婷婷| 欧美在线地址| 久久综合电影一区| 激情综合电影网| 久久久午夜视频| 欧美国产大片| 亚洲日本欧美日韩高观看| 久久人体大胆视频| 欧美高清视频www夜色资源网| 韩日欧美一区| 开元免费观看欧美电视剧网站| 免费在线欧美黄色| 亚洲日本中文字幕区 | 国产一区二区按摩在线观看| 一区二区三区视频在线看| 亚洲系列中文字幕| 国产精品美女久久久久av超清| 亚洲香蕉网站| 欧美一级淫片aaaaaaa视频| 国产乱码精品一区二区三区忘忧草 | 老司机久久99久久精品播放免费 | 亚洲欧美韩国| 亚洲性视频h| 欧美一区二区三区免费大片| 国产美女精品视频| 欧美一级大片在线观看| 久久久97精品| 亚洲人体1000| 欧美日产国产成人免费图片| 夜夜嗨av一区二区三区网站四季av | 久久久久久久久综合| 在线日韩av片| 欧美日韩大陆在线| 欧美一乱一性一交一视频| 欧美成人精品h版在线观看| 日韩视频在线永久播放| 欧美性开放视频| 久久久青草青青国产亚洲免观| 欧美电影在线观看| 亚洲午夜羞羞片| 在线观看视频免费一区二区三区 | 欧美视频在线观看一区| 久久精品成人| 99视频日韩| 麻豆精品91| 亚洲综合视频网| 亚洲国产高潮在线观看| 国产精品igao视频网网址不卡日韩| 亚洲欧美日韩国产中文| 亚洲国产综合91精品麻豆| 翔田千里一区二区| 日韩午夜剧场| 精品动漫3d一区二区三区免费| 欧美人与禽猛交乱配视频| 久久精品一区蜜桃臀影院| 一本大道久久精品懂色aⅴ| 久久综合五月| 久久国产精品亚洲77777| 中文国产成人精品久久一| 亚洲黄网站在线观看| 国产网站欧美日韩免费精品在线观看| 欧美精品少妇一区二区三区| 久久精品夜色噜噜亚洲a∨| 亚洲一级高清| 一本色道久久综合亚洲二区三区| 亚洲第一网站| 免费成人在线观看视频| 久久久久国内|