亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? soundbase.cpp

?? 一個在PXA-270下的WinCE錄音程序
?? CPP
字號:
// SoundBase.cpp: implementation of the CSoundBase class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "SoundBase.h"



//------------------------------------------------------------------------------
//Macro define
#define  INP_BUFFER_SIZE		16*1024 //The input buffer size

#define RIFF_FILE       mmioFOURCC('R','I','F','F')
#define RIFF_WAVE       mmioFOURCC('W','A','V','E')
#define RIFF_FORMAT     mmioFOURCC('f','m','t',' ')
#define RIFF_CHANNEL    mmioFOURCC('d','a','t','a')

//Default values
#define DEFAULT_CHANNEL		CHANNEL_SINGLE
#define DEFAULT_SAMPLES		SAMPLES_11025
#define DEFAULT_BITS		BITS_8

//------------------------------------------------------------------------------
//The struct

//FileHeader
typedef struct
{
   DWORD   dwRiff;     // Type of file header.
   DWORD   dwSize;     // Size of file header.
   DWORD   dwWave;     // Type of wave.
} RIFF_FILEHEADER, *PRIFF_FILEHEADER;



//ChunkHeader
typedef struct
{
   DWORD   dwCKID;        // Type Identification for current chunk header.
   DWORD   dwSize;        // Size of current chunk header.
} RIFF_CHUNKHEADER, *PRIFF_CHUNKHEADER;
//---------------------------------------------------------------------------------

//-------------------------------------------------------------------
//Static member initialize
CSoundBase *CSoundBase::m_pInstance = NULL; //If you don't initialize,the GetInstance() will link erro.


//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CSoundBase::CSoundBase()
{
	memset(m_szSavePath,0,sizeof(m_szSavePath));
	memset(&m_WaveFormatEx,0,sizeof(m_WaveFormatEx));
	m_pBuffer1 = NULL;
	m_pBuffer2 = NULL;
	m_pWaveHdr1 = NULL;
	m_pWaveHdr2 = NULL;
	m_hWaveIn = NULL;
	m_hSaveFile = NULL;
	m_bRecording = FALSE;
	m_dwDataLength = 0;


}

CSoundBase::~CSoundBase()
{

	if(m_pWaveHdr1 != NULL)
	{
		free(m_pWaveHdr1);
		m_pWaveHdr1 = NULL;
	}
	
	if(m_pWaveHdr2 != NULL)
	{
		free(m_pWaveHdr2);
		m_pWaveHdr2 = NULL;
	}
	
	if(m_pBuffer1 != NULL)
	{
		free(m_pBuffer1);
		m_pBuffer1 = NULL;
	}
	
	if(m_pBuffer2 != NULL)
	{
		free(m_pBuffer2);
		m_pBuffer2 = NULL;
	}

}

//----------------------------------------------------------------------
//Decription:
//	Start to record.
//
//Parameter:
//	pszPath: [in] The record path
//
//Retrun Values:
//	TRUE: Succeed.
//	FALSE: Failed.
//----------------------------------------------------------------------
BOOL CSoundBase::Record(TCHAR *pszPath,const PWAVEFORMAT_SETTING pWaveFormat)
{
	BOOL bResult = FALSE;
	_tcscpy(m_szSavePath,pszPath);

	SetRecordWaveFormat(pWaveFormat);
	
	if (waveInOpen(&m_hWaveIn,WAVE_MAPPER,&m_WaveFormatEx,(DWORD)WaveInProc,NULL,CALLBACK_FUNCTION) != MMSYSERR_NOERROR )
	{
		goto END;
	}

	m_pBuffer1=(PBYTE)malloc(INP_BUFFER_SIZE);
	m_pBuffer2=(PBYTE)malloc(INP_BUFFER_SIZE);
	if(m_pBuffer1 == NULL || m_pBuffer2 == NULL)
	{
		goto END;
	}


	//allocate memory for wave header
	m_pWaveHdr1=reinterpret_cast<PWAVEHDR>(malloc(sizeof(WAVEHDR)));
	m_pWaveHdr2=reinterpret_cast<PWAVEHDR>(malloc(sizeof(WAVEHDR)));	

	if(m_pWaveHdr1 == NULL || m_pWaveHdr2 == NULL )
	{
		goto END;
	}
	
	m_pWaveHdr1->lpData = (LPSTR)m_pBuffer1;
	m_pWaveHdr1->dwBufferLength = INP_BUFFER_SIZE;
	m_pWaveHdr1->dwBytesRecorded = 0;
	m_pWaveHdr1->dwUser = 0;
	m_pWaveHdr1->dwFlags = 0;
	m_pWaveHdr1->dwLoops = 1;
	m_pWaveHdr1->lpNext = NULL;
	m_pWaveHdr1->reserved = 0;	
	waveInPrepareHeader(m_hWaveIn,m_pWaveHdr1,sizeof(WAVEHDR));
	
	m_pWaveHdr2->lpData = (LPSTR)m_pBuffer2;
	m_pWaveHdr2->dwBufferLength = INP_BUFFER_SIZE;
	m_pWaveHdr2->dwBytesRecorded = 0;
	m_pWaveHdr2->dwUser = 0;
	m_pWaveHdr2->dwFlags = 0;
	m_pWaveHdr2->dwLoops = 1;
	m_pWaveHdr2->lpNext = NULL;
	m_pWaveHdr2->reserved = 0;	
	waveInPrepareHeader(m_hWaveIn,m_pWaveHdr2,sizeof(WAVEHDR));

	// Add the buffers	
	waveInAddBuffer (m_hWaveIn, m_pWaveHdr1, sizeof (WAVEHDR)) ;
	waveInAddBuffer (m_hWaveIn, m_pWaveHdr2, sizeof (WAVEHDR)) ;


	if (WriteWaveFileHeader(m_szSavePath,&m_WaveFormatEx,0,TRUE) == FALSE)
	{

		goto END;
	}

	// Open the existing wave file incording to add wave data
	m_hSaveFile = CreateFile(m_szSavePath, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
	if( m_hSaveFile == INVALID_HANDLE_VALUE ) 
	{
		goto END;
    }
	//Set the file pointer to the end.
	SetFilePointer(m_hSaveFile,0,NULL,FILE_END);

	//Begin recording
	waveInStart (m_hWaveIn) ;

	bResult = TRUE;
END:
	if(bResult == FALSE)
	{
		if(m_pWaveHdr1 != NULL)
		{
			free(m_pWaveHdr1);
			m_pWaveHdr1 = NULL;
		}

		if(m_pWaveHdr2 != NULL)
		{
			free(m_pWaveHdr2);
			m_pWaveHdr2 = NULL;
		}

		if(m_pBuffer1 != NULL)
		{
			free(m_pBuffer1);
			m_pBuffer1 = NULL;
		}

		
		if(m_pBuffer2 != NULL)
		{
			free(m_pBuffer2);
			m_pBuffer2 = NULL;
		}

		if(m_hWaveIn != NULL)
		{
			//Stop recording, close the device
			waveInReset(m_hWaveIn);
			waveInClose(m_hWaveIn);
			m_hWaveIn = NULL;
		}
	}
	return bResult;
}

//----------------------------------------------------------------------
//Decription:
//	Stop recording and playing
//
//Parameter:
//	NULL
//
//Retrun Values:
//	NULL
//----------------------------------------------------------------------
void CSoundBase::StopAll()
{
	StopRecording();
	StopPlaying();
}

//----------------------------------------------------------------------
//Decription:
//	Stop playing
//
//Parameter:
//	NULL
//
//Retrun Values:
//	NULL
//----------------------------------------------------------------------
void CSoundBase::StopPlaying()
{
	sndPlaySound(NULL,SND_ASYNC);
}

//----------------------------------------------------------------------
//Decription:
//	Stop recording
//
//Parameter:
//	NULL
//
//Retrun Values:
//	NULL
//----------------------------------------------------------------------
void CSoundBase::StopRecording()
{
	if(m_bRecording == FALSE)
	{
		return;
	}

	m_bRecording = FALSE;
	waveInReset(m_hWaveIn);
	waveInClose(m_hWaveIn);

	//Please don't call waveInUnprepareHeader() in the WIM_CLOSE,
	//or it will work badly !
	waveInUnprepareHeader (m_hWaveIn, m_pWaveHdr1, sizeof (WAVEHDR)) ;
	waveInUnprepareHeader (m_hWaveIn, m_pWaveHdr2, sizeof (WAVEHDR)) ;
		
	if(m_pWaveHdr1 != NULL)
	{
		free(m_pWaveHdr1);
		m_pWaveHdr1 = NULL;
	}

	if(m_pWaveHdr2 != NULL)
	{
		free(m_pWaveHdr2);
		m_pWaveHdr2 = NULL;
	}

	if(m_pBuffer1 != NULL)
	{
		free(m_pBuffer1);
		m_pBuffer1 = NULL;
	}
		
	if(m_pBuffer2 != NULL)
	{
		free(m_pBuffer2);
		m_pBuffer2 = NULL;
	}

	
}

//----------------------------------------------------------------------
//Decription:
//	Start to play.
//
//Parameter:
//	pszPath: [in] The playing path
//
//Retrun Values:
//	TRUE: Succeed.
//	FALSE: Failed.
//----------------------------------------------------------------------
BOOL CSoundBase::Play(const TCHAR *pszPath)
{	
	TCHAR szPath[MAX_SAVEPATH_LENGTH] = {0};
	if(pszPath != NULL)
	{
		_tcscpy(szPath,pszPath);
	}
	else
	{
		_tcscpy(szPath,m_szSavePath);
	}

	if(sndPlaySound(szPath,SND_ASYNC) == FALSE)
	{
		return FALSE;
	}
	return TRUE;	

}


//----------------------------------------------------------------------
//Decription:
//	Set the wave format for recording.
//
//Parameter:
//	pWaveFormat: [in] The wave format to set.
//
//Retrun Values:
//	TRUE: Succeed.
//	FALSE: Failed.
//----------------------------------------------------------------------
void CSoundBase::SetRecordWaveFormat(const PWAVEFORMAT_SETTING pWaveFormat)
{
	WAVEFORMAT_SETTING waveFormatSetting;
	if(pWaveFormat == NULL)
	{
		waveFormatSetting.channel = DEFAULT_CHANNEL;
		waveFormatSetting.samples = DEFAULT_SAMPLES;
		waveFormatSetting.bits =  DEFAULT_BITS;
	}
	else
	{
		waveFormatSetting = *pWaveFormat;
	}

	m_WaveFormatEx.wFormatTag=WAVE_FORMAT_PCM;
	m_WaveFormatEx.cbSize=0;	//When the wFormatTag is PCM, the parameter is abort.

	switch(waveFormatSetting.channel)
	{
		case CHANNEL_SINGLE:
			m_WaveFormatEx.nChannels = 1;
			break;
		case CHANNEL_DOUBLE:
			m_WaveFormatEx.nChannels = 2;
			break;
	}

	switch(waveFormatSetting.samples)
	{
		case SAMPLES_11025:
			m_WaveFormatEx.nSamplesPerSec = 11025;
			break;
		case SAMPLES_22050:
			m_WaveFormatEx.nSamplesPerSec = 22050;
			break;
		case SAMPLES_44100:
			m_WaveFormatEx.nSamplesPerSec = 44100;
			break;
	}


	switch(waveFormatSetting.bits)
	{
		case BITS_8:
			m_WaveFormatEx.wBitsPerSample = 8;
			break;
		case BITS_16:
			m_WaveFormatEx.wBitsPerSample = 16;
			break;
	}
	
	m_WaveFormatEx.nBlockAlign=m_WaveFormatEx.nChannels * m_WaveFormatEx.wBitsPerSample / 8;	
	m_WaveFormatEx.nAvgBytesPerSec=m_WaveFormatEx.nBlockAlign * m_WaveFormatEx.nSamplesPerSec;

}


//----------------------------------------------------------------------
//Decription:
//	Get instance
//
//Parameter:
//	Null
//
//Retrun Values:
//	The pointer to object
//----------------------------------------------------------------------
CSoundBase* CSoundBase::GetInstance()
{
	if(m_pInstance == NULL)
	{
		m_pInstance = new CSoundBase;
	}
	return m_pInstance;
}


//----------------------------------------------------------------------
//Decription:
//	WaveIn Process
//
//Parameter:
//	hwi: [in] Handle to the waveform-audio device associated with the callback function
//	uMsg: [in] Waveform-audio input message. It can be one of the messages shown :WIM_CLOSE,WIM_DATA,WIM_OPEN
//	dwInstance: [in] User instance data specified with waveInOpen. 
//	dwParam1: [in] Message parameter. 
//	dwParam2: [in] Message parameter. 
//
//Retrun Values:
//	DWORD type.
//----------------------------------------------------------------------
void CALLBACK CSoundBase::WaveInProc(HWAVEIN hWi, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2)
{
	switch(uMsg)
	{
		case WIM_CLOSE:
			m_pInstance->OnWIM_CLOSE(dwParam1,dwParam2);
			break;
		case WIM_DATA:
			m_pInstance->OnWIM_DATA(dwParam1,dwParam2);
			break;
		case WIM_OPEN:
			m_pInstance->OnWIM_OPEN(dwParam1,dwParam2);
			break;
	}

}



//----------------------------------------------------------------------
//Decription:
//	Write the wave file header.
//
//Parameter:
//	pszFilename: [in] The path to save
//	pWFX: [in] The information to write
//	dwBufferSize: [in] The size of wave buffer
//	bCover: [in] Cover writing or not 
//
//Retrun Values:
//	TRUE: Succeed.
//	FASLE: Failed.
//----------------------------------------------------------------------
BOOL CSoundBase::WriteWaveFileHeader(TCHAR *pszFilename, const PWAVEFORMATEX pWFX, DWORD dwBufferSize, BOOL bCover)
{

	RIFF_FILEHEADER FileHeader;
	RIFF_CHUNKHEADER WaveHeader;
	RIFF_CHUNKHEADER DataHeader;
	DWORD dwBytesWritten;
	HANDLE fh;
	BOOL bResult = FALSE;
    
	// Fill in the file, wave and data headers
	WaveHeader.dwCKID = RIFF_FORMAT;
	WaveHeader.dwSize = sizeof(WAVEFORMATEX) + pWFX->cbSize;

	// the DataHeader chunk contains the audio data
	DataHeader.dwCKID = RIFF_CHANNEL;
	DataHeader.dwSize = dwBufferSize;

	// The FileHeader
	FileHeader.dwRiff = RIFF_FILE;
	FileHeader.dwSize = sizeof(WaveHeader) + WaveHeader.dwSize + sizeof(DataHeader) + DataHeader.dwSize;
	FileHeader.dwWave = RIFF_WAVE;

    // Open wave file
	if(bCover==TRUE)
	{
		//If the file existed , cover writng
		fh = CreateFile(pszFilename, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, 0, NULL);
    }
	else
	{
		//Open the file existed
		fh = CreateFile(pszFilename, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
		//Move the pointer to the begin
		SetFilePointer(fh,0,NULL,FILE_BEGIN);
	}
	if( fh == INVALID_HANDLE_VALUE ) {
        DEBUGMSG(1, (TEXT("Error opening %s. Error code = 0x%08x\n"), pszFilename, GetLastError()));
  		goto ERROR_EXIT;
    }

    // write the riff file
    if (! WriteFile(fh, &FileHeader, sizeof(FileHeader), &dwBytesWritten, NULL)) {
        DEBUGMSG(1, (TEXT("Error writing file header\r\n")));
		goto ERROR_EXIT;
    }

    // write the wave header
    if (! WriteFile(fh, &WaveHeader, sizeof(WaveHeader), &dwBytesWritten, NULL)) {
        DEBUGMSG(1, (TEXT("Error writing wave header\r\n")));
		goto ERROR_EXIT;
    }

    // write the wave format
    if (! WriteFile(fh, pWFX, WaveHeader.dwSize, &dwBytesWritten, NULL)) {
        DEBUGMSG(1, (TEXT("Error writing wave format\r\n")));
		goto ERROR_EXIT;
    }

    // write the data header
    if (! WriteFile(fh, &DataHeader, sizeof(DataHeader), &dwBytesWritten, NULL)) {
        DEBUGMSG(1, (TEXT("Error writing PCM data header\r\n")));
		goto ERROR_EXIT;
    }
    // Success
    bResult = TRUE;

ERROR_EXIT:
	if(fh != INVALID_HANDLE_VALUE)
	{
		CloseHandle(fh);
    }
	return bResult;
}


//----------------------------------------------------------------------
//Decription:
//	On WIM_CLOSE
//------------------------------------------------------------------------
void CSoundBase::OnWIM_CLOSE(WPARAM wParam, LPARAM lParam)
{
	
	if(m_hSaveFile != NULL)
	{
		CloseHandle(m_hSaveFile);
		m_hSaveFile = NULL;
	}
	if (0 != m_dwDataLength)
	{
		//Write the data length to the file.
		WriteWaveFileHeader(m_szSavePath,&m_WaveFormatEx,m_dwDataLength,FALSE);
	}

}

//----------------------------------------------------------------------
//Decription:
//	On WIM_DATA
//------------------------------------------------------------------------
void CSoundBase::OnWIM_DATA(WPARAM wParam, LPARAM lParam)
{

	DWORD dwBytesRecorded = ((PWAVEHDR)wParam)->dwBytesRecorded;

	PBYTE pSaveBuffer;
	//allocate memory for save buffer
	pSaveBuffer = reinterpret_cast<PBYTE>(malloc(dwBytesRecorded));	
	if(pSaveBuffer == NULL)
	{
		waveInClose (m_hWaveIn) ;
		return;
	}

	//Copy the data to the save buffer.
	CopyMemory (pSaveBuffer, ((PWAVEHDR)wParam)->lpData, dwBytesRecorded) ;

	//Write the memory data to the file
	DWORD dwBytesWritten;
	if(WriteFile(m_hSaveFile, pSaveBuffer, dwBytesRecorded, &dwBytesWritten, NULL) != TRUE)
	{
		if(m_bRecording == TRUE)
		{
			waveInClose (m_hWaveIn) ;
		}
	}

	m_dwDataLength += dwBytesWritten ;

	free(pSaveBuffer);	

	//If m_bRecording is FALSE, it may call the function waveInReset().So don't add buffer.
	if(m_bRecording == TRUE)
	{
		// Send out a new buffer.The new buffer is the original full buffer, used again.
		waveInAddBuffer (m_hWaveIn, (PWAVEHDR) wParam, sizeof (WAVEHDR)) ;
	}
}

//----------------------------------------------------------------------
//Decription:
//	On WIM_OPEN
//------------------------------------------------------------------------
void CSoundBase::OnWIM_OPEN(WPARAM wParam, LPARAM lParam)
{
	m_bRecording = TRUE;
	m_dwDataLength = 0;
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产传媒一区在线| 天堂久久久久va久久久久| 欧美视频日韩视频在线观看| 男人的j进女人的j一区| 亚洲人一二三区| 日韩免费成人网| 欧美午夜不卡在线观看免费| 免费人成精品欧美精品| 国产欧美精品一区二区色综合| 日韩一区二区视频| 欧美精选一区二区| 91网页版在线| 99re热这里只有精品视频| 懂色av一区二区三区蜜臀| 91美女片黄在线观看| 日韩极品在线观看| 日韩免费视频一区二区| 欧美日韩一区二区电影| 欧洲生活片亚洲生活在线观看| 国产乱码精品一区二区三区av| 国产在线日韩欧美| 久久精品视频在线免费观看| 色狠狠色狠狠综合| 92国产精品观看| 99在线精品免费| 成人深夜福利app| 中文一区一区三区高中清不卡| 日韩美女一区二区三区| 在线视频欧美区| 美国十次了思思久久精品导航| 久久综合九色欧美综合狠狠| 国产一区二区三区黄视频 | 国产在线视频精品一区| 久久久久久久久久久黄色 | 99视频在线观看一区三区| 国产精品网站在线播放| 成人黄页毛片网站| 亚洲v中文字幕| 精品福利一区二区三区| 91免费国产视频网站| 九九热在线视频观看这里只有精品| 一区二区三区日本| 亚洲精品第一国产综合野| 亚洲精品欧美激情| 亚洲视频一区二区免费在线观看| 国产精品福利一区二区三区| 欧美日韩免费高清一区色橹橹 | 亚洲理论在线观看| 亚洲日本在线天堂| 亚洲免费观看高清完整| 午夜在线电影亚洲一区| 2023国产精品| 欧美夫妻性生活| 91亚洲精华国产精华精华液| 日韩免费视频一区二区| 亚洲欧美日韩在线播放| 国产福利一区二区三区视频| 欧美日韩国产成人在线免费| 91精品欧美久久久久久动漫| 日韩免费高清av| 久久亚洲一区二区三区四区| 欧美日韩一区在线观看| 精品成人a区在线观看| 欧美国产精品v| 久久精品国产精品亚洲红杏 | 91精品国产综合久久久久久久 | 日本美女一区二区三区| 91精品国产综合久久久蜜臀图片 | 国产精品国产三级国产三级人妇| 欧美高清视频www夜色资源网| 波多野结衣91| 7777精品伊人久久久大香线蕉最新版 | 成人手机在线视频| 91精品国产入口| 亚洲免费观看高清完整版在线| 青青草国产精品亚洲专区无| 国产精品亚洲一区二区三区在线 | 色视频成人在线观看免| 日韩三级视频中文字幕| 欧美一级夜夜爽| 亚洲风情在线资源站| 色偷偷久久一区二区三区| 欧美大片一区二区| 欧美一级视频精品观看| 精品精品国产高清一毛片一天堂| 欧美综合视频在线观看| 日韩一区二区三免费高清| 日韩欧美电影一区| 久久久精品免费免费| 精品国产91久久久久久久妲己| 国产精品三级电影| 国产成人午夜电影网| 日韩视频免费观看高清完整版| 日本欧美一区二区在线观看| 午夜久久久久久久久| 久久久久久免费网| 一区二区三区四区中文字幕| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 国产精品对白交换视频| 久久精品视频在线免费观看| 另类专区欧美蜜桃臀第一页| 国产传媒一区在线| 欧美高清一级片在线观看| 国产精品自在在线| 国产精品视频一二三区| 国产成+人+日韩+欧美+亚洲| 国产精品美女久久久久aⅴ | 欧美系列亚洲系列| 天天操天天综合网| 91捆绑美女网站| 亚洲一区二区三区自拍| 欧美日韩精品一区视频| 午夜亚洲福利老司机| 日韩三级免费观看| 不卡电影一区二区三区| 亚洲高清视频在线| 国产色91在线| 欧美日韩精品高清| 国产美女一区二区| 亚洲午夜羞羞片| 久久精品一区二区三区不卡| 色婷婷综合久久久中文一区二区| 日本欧美一区二区三区| 国产免费成人在线视频| 欧美日韩国产免费一区二区 | 国产精品久久夜| 成人午夜在线播放| 激情综合亚洲精品| 国内精品写真在线观看| 国产精品久久久久三级| 91精品中文字幕一区二区三区 | 国产精品嫩草影院com| 欧美一卡二卡三卡四卡| 在线观看国产日韩| 99热国产精品| 麻豆精品一区二区综合av| 国产精品狼人久久影院观看方式| 91精品一区二区三区久久久久久 | 欧美一区二区三区思思人| 色综合激情五月| 99精品视频中文字幕| 国产精品一区二区在线看| 一本色道亚洲精品aⅴ| 毛片av一区二区| 国产人久久人人人人爽| 91精品国产乱码| 日韩一区国产二区欧美三区| 欧美日韩视频在线一区二区| 91在线视频网址| 国产电影精品久久禁18| 成人黄色a**站在线观看| 成人一区二区三区在线观看| 婷婷国产在线综合| 91免费看片在线观看| 欧美成人免费网站| 一区二区三区四区av| 处破女av一区二区| 日韩三级视频在线看| 亚洲激情第一区| 风流少妇一区二区| 欧美一区二区精品在线| 夜夜精品视频一区二区| 成人午夜免费视频| 精品国产乱码久久久久久牛牛| 亚洲伊人伊色伊影伊综合网| 99精品桃花视频在线观看| 久久九九国产精品| 国产电影一区二区三区| 337p日本欧洲亚洲大胆精品| 午夜精品在线看| 69堂精品视频| 亚洲国产精品一区二区www在线| 91丨九色丨国产丨porny| 中文字幕制服丝袜成人av| 高清国产午夜精品久久久久久| 久久久三级国产网站| 精品一区二区三区免费| 精品久久久久久无| 精品一区二区三区不卡| 久久久99久久| 国产露脸91国语对白| 国产亚洲一二三区| 国产激情一区二区三区桃花岛亚洲| 337p日本欧洲亚洲大胆色噜噜| 国模少妇一区二区三区| 国产欧美一二三区| 色婷婷精品久久二区二区蜜臀av| 亚洲欧美日韩久久精品| 欧美美女视频在线观看| 国产一区二区调教| 国产精品美女久久久久久| 欧美偷拍一区二区| 久久99精品久久久久| 国产欧美一区视频| 欧美性三三影院| 国产不卡高清在线观看视频| 亚洲六月丁香色婷婷综合久久| 日韩欧美国产综合一区| 99久久99久久精品国产片果冻 | 国产欧美精品一区|