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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? recorder.c

?? Linux下控制聲卡錄音的類。Linux平臺下使用
?? C
字號:
/*File Name: Recorder.c*/
#include <fcntl.h>
#include <linux/soundcard.h>
#include <sys/ioctl.h>
#include <pthread.h>

#include "Ldb.h"
#include "Recorder.h"
#include "Adpcm.h"
#include "Utility.h"
#include "LocoSystem.h"
#include "SoundDesc.h"
#include "ComMonitor.h"
#include "LocoLog.h"

#define ADPCM_COMPRESSION 1

/********************************************/
#define SAMPLE_BIT			16
#define SAMPLE_CHANNEL		1

int SAMPLE_RATE;
int SAMPLE_PER_BLOCK;
int BLOCK_ALIGN;
int SAMPLE_BUFFER_SIZE;
int CODE_BUFFER_SIZE;

/********************************************
				讀寫的文件及buffer
********************************************/
/*設備fd*/
int f_audiofd;

/*當前正在錄音的文件*/
FILE *f_pCurrFile; 
char f_prevFileName[SYS_PATH_MAX_LEN];
char f_currFileName[SYS_PATH_MAX_LEN];
/*當前錄音文件得長度*/
int f_rcdSize;

/*讀寫文件buffer*/
unsigned char* f_bufSample;
unsigned char* f_bufCode;

/********************************************
				錄音線程
********************************************/
/*錄音線程*/
pthread_t f_rcdThrd;
/*錄音停止標志*/
volatile char f_rcdStop;

pthread_mutex_t f_pauseMutex = PTHREAD_MUTEX_INITIALIZER;
#define pause_Lock {pthread_mutex_lock(&f_pauseMutex);}
#define pause_Unlock {pthread_mutex_unlock(&f_pauseMutex);}
/*錄音暫停標志*/
volatile char f_rcdPause;
volatile char f_forceStop;

/*錄音線程函數*/
void *loco_recorder(void *arg);
void loco_rcdPlayFile(FILE *pfile);
void loco_rcdStop();
int loco_rcdStart();

/*******************************************
			讀寫方式打開聲音設備
mode: O_WRONLY, O_RDONLY, O_RDWR
*******************************************/
int loco_openAudioDev(int mode)
{
	int status, arg;
	
	f_audiofd = open(LOCO_SOUND_DEV, mode);
	
	if(f_audiofd < 0)
	{
		LDB_ERR_MSGF("open audio device failed!");
		return -1;
	}
 
	arg = AFMT_U16_BE;
	status= ioctl(f_audiofd, SNDCTL_DSP_SETFMT, &arg);
	if(status == -1)
	{
		LDB_ERR_MSGF("AFMT_U16_BE error!");
		return -1;
	}
	else if(arg != AFMT_U16_BE)
	{
		LDB_ERR_MSGF("Failed to set sample format %d! arg = %d", AFMT_U16_BE, arg);
		return -1;
	}
	else
	{
		//printf("Set sample bits sucessfully\r\n");
	}

	arg = SAMPLE_BIT;
	status= ioctl(f_audiofd, SNDCTL_DSP_SAMPLESIZE, &arg);
	if(status == -1)
	{
		LDB_ERR_MSGF("SNDCTL_DSP_SAMPLESIZE error!");
		return -1;
	}
	else if(arg != SAMPLE_BIT)
	{
		LDB_ERR_MSGF("Failed to set sample bits!arg = %d", arg);
		return -1;
	}
	else
	{
		//printf("Set sample bits sucessfully\r\n");
	}

	arg = SAMPLE_CHANNEL;
	status= ioctl(f_audiofd, SNDCTL_DSP_CHANNELS, &arg);
	if(status == -1)
	{
		LDB_ERR_MSGF("SNDCTL_DSP_CHANNELS error!");
		return -1;	
	}
	else if(arg != SAMPLE_CHANNEL)
	{
		LDB_ERR_MSGF("unable to set numble of channels!arg = %d",arg);
		return -1;
	}
	else
	{
		//printf("Set channels sucessfully\r\n");
	}
	
	arg = SAMPLE_RATE;
	status= ioctl(f_audiofd, SNDCTL_DSP_SPEED, &arg);
	if(status == -1)
	{
		LDB_ERR_MSGF("SNDCTL_DSP_SPEED error!");
		return -1;	
	}
	else if(arg != SAMPLE_RATE)
	{
		LDB_ERR_MSGF("unable to set rate:%d! arg = %d",SAMPLE_RATE,arg);
		return -1;
	}
	else
	{
		//printf("Set sample rate sucessfully\r\n");
	}

	return f_audiofd;
}

int loco_dspRead(unsigned char *buffer, int size)
{
	int nread;
	if (f_audiofd == -1)
	{
		return -1;
	}

	nread = read(f_audiofd, buffer, size);

	return nread; 
}

int loco_dspWrite(unsigned char *buffer, int size)
{
	int nwrite;
	if (f_audiofd == -1)
	{
		return -1;
	}

	nwrite = write(f_audiofd, buffer, size);

	return nwrite; 
}

void loco_dspClose()
{
	if (f_audiofd != -1)
	{
		close(f_audiofd);
		f_audiofd = -1;
	}
	printf("dsp closed \n");
}
/*******************************************/
int  loco_rcdInit()
{
	if (g_sysSampleRate == 8)
	{
		SAMPLE_RATE = 8000;
		SAMPLE_PER_BLOCK = 505;
		BLOCK_ALIGN = 256;
		SAMPLE_BUFFER_SIZE = 2020;
		CODE_BUFFER_SIZE = 512;
	}
	else
	{
		SAMPLE_RATE = 16000;
		SAMPLE_PER_BLOCK = 1017;
		BLOCK_ALIGN = 512;
		SAMPLE_BUFFER_SIZE = 4068;
		CODE_BUFFER_SIZE = 1024;
	}
	
	f_forceStop = 0;
	/*分配工作buffer*/
	f_bufSample = (unsigned char*)malloc(SAMPLE_BUFFER_SIZE);
	f_bufCode = (unsigned char*)malloc(CODE_BUFFER_SIZE);
	if (NULL == f_bufSample || NULL == f_bufCode)
		return -1;

	return loco_rcdStart();
}

void loco_rcdFree()
{
	loco_rcdStop();

	free(f_bufSample);
	f_bufSample = NULL;

	free(f_bufCode);
	f_bufCode = NULL;

	f_forceStop = 0;
}

int loco_rcdStart()
{
	f_pCurrFile = NULL;
	
	if (g_rcdAuto == 1)
		f_rcdPause = 0;
	else
		f_rcdPause = 1;
	
	f_audiofd = -1;

	/*創建語音保存文件夾*/
	if (ldb_fileCreateDir(SYS_SOUND_SAVE_DIR) == -1)
	{
		LDB_ERR_MSGF("can not create recorder directory");
		return -1;
	}

	/*打開聲音設備*/
	if (-1 == loco_openAudioDev(O_RDONLY))//O_RDWR
	{
		LDB_ERR_MSGF("unable to open audio device: %s!", LOCO_SOUND_DEV);
		loco_rcdFree();
		return -1;
	}

	/*創建錄音工作線程*/
	f_rcdStop = 0;

	if( pthread_create(&f_rcdThrd, NULL, loco_recorder, NULL) != 0)
	{
		LDB_ERR_MSGF("can not create recorder thread");
		return -1;
	} 
	
	return 0;
}

//在開始播放的時候將錄音設備關閉,然后以Writer only方式打開
void loco_rcdStop()
{
	/*停止線程*/
	f_rcdStop = 1;
	f_rcdPause = 0;

	if (f_rcdThrd != -1)
	{
		if ( pthread_join(f_rcdThrd, NULL) != 0)
		{
			LDB_DEBUG_MSGF("recorder thread exits abnormally");
		}

		f_rcdThrd = -1;
	}

	/*關閉設備*/
	loco_dspClose();

	/*關閉錄音文件*/
	if (NULL != f_pCurrFile)
		fclose(f_pCurrFile);
	f_pCurrFile = NULL;
}

void loco_rcdPause()
{
	pause_Lock
		LDB_DEBUG_MSGF("Pause recording...");
		f_rcdPause++;
	pause_Unlock
}

void loco_rcdResume()
{
	//如果已經停止,啟動之
	if(f_rcdStop == 1)
	{
		loco_rcdFree();
		loco_rcdInit();
	}

	if (f_rcdPause == 0)
		return;

	loco_adpcmResetEncoder();

	pause_Lock
		f_rcdPause--;
		LDB_DEBUG_MSGF("Resume recording...");
	pause_Unlock
}

int loco_rcdEnsureSoundDir(S_SndDesc *pdesc, char *pdir)
{
	char dir[SYS_PATH_MAX_LEN];
	char date[9], train[6];

	memset(date, 0, sizeof(date));
	strncpy(date, pdesc->date_start, 8);
	memset(train, 0, sizeof(train));
	snd_descGetTrain(pdesc->train_id, train, sizeof(train));
	memset(dir, 0, SYS_PATH_MAX_LEN);
	sprintf(dir, "%s/%s.%05d.%s", SYS_SOUND_SAVE_DIR, train, pdesc->driver, date);
	if ( strcmp(dir, pdir) == 0)
		return 0;

	memset(pdir, 0, SYS_PATH_MAX_LEN);
	strcpy(pdir, dir);
	if (-1 == ldb_fileCreateDir(pdir) )
		return -1;
	
	memset(dir, 0, SYS_PATH_MAX_LEN);
	sprintf(dir, "save sound file to %s", pdir);
	log_info(dir);

	return 0;
}
//最小檢查個數
#define CHECK_NUM_MIN 1024

int loco_rcdGetValue(int checknum)
{
	int i, count, value;
	short sample;
	
	value = 0;
	count = checknum/2;
	for (i=0; i<count; )
	{
		sample = f_bufSample[i++] & 0xff;
		sample |= (f_bufSample[i++] << 8) & 0xff00;

		value += abs(sample);
	}

	value = value*2 / count;

	return value;
}

void *loco_recorder(void *arg)
{
	char b_pause, silence_count;
	char dir[SYS_PATH_MAX_LEN];
	char log[SYS_PATH_MAX_LEN];
	int test_counter;

	int nread, nblock, check_value;
	S_SndDesc *pdesc;
	int sample_size, sample_min_size;
	
	sample_min_size = g_voiceMinLen*SAMPLE_RATE*2;

	while(-1 != f_audiofd && f_rcdStop == 0)
	{
		loco_adpcmResetEncoder();
		
		f_pCurrFile = NULL;

		b_pause = 1;
		test_counter = 0;
		//語音檢測暫停
		while(b_pause == 1)
		{
			if (f_rcdStop == 1)
			{
				goto RECORDER_END;
			}

			nread = loco_dspRead(f_bufSample, SAMPLE_BUFFER_SIZE);
			if (nread <= 0)
				goto RECORDER_END;

			if (nread < CHECK_NUM_MIN)
				continue;
				
			check_value = loco_rcdGetValue(nread);
#if 0
//#if _TEST
			if (test_counter++ == 5)
			{
				printf("Before Recording: v=%d\n", check_value);
				test_counter = 0;
			}
//#endif
#endif
			if (check_value > g_voiceMin)
			{
				memset(log, 0, sizeof(log));
				sprintf(log, "Recording start for voice %d", check_value);
				log_info(log);
				printf(log);
				printf("\n");

				b_pause = 0;
			}
		}
		sample_size = nread;

		//通知串口單元開始錄音了
		loco_commReply(COMM_MSG_RESUME);

		//得到當前的列車信息
		pdesc = snd_descGet();

		//確保錄音目錄存在
		if (-1 == loco_rcdEnsureSoundDir(pdesc, dir) )
		{
			g_stopRequest = 1;
			goto RECORDER_END;
		}

		//確保磁盤空間足夠
		if ( 0 != loco_ensureDiskSpace(dir))
		{
			g_stopRequest = 1;
			goto RECORDER_END;
		}
		
		//創建一個新文件
		memset(f_currFileName, 0, SYS_PATH_MAX_LEN);
		f_pCurrFile = ldb_fileCreate(dir, pdesc->date_start, f_currFileName);
		if (NULL == f_pCurrFile)
			continue;
		
		LDB_DEBUG_MSGF("Record a new file %s", f_currFileName);
		//在文件頭寫入描述信息
		fwrite(pdesc, 1, sizeof(S_SndDesc), f_pCurrFile);
		
		//壓縮
		nblock = loco_adpcmEncode(f_bufSample, nread, SAMPLE_PER_BLOCK, BLOCK_ALIGN, f_bufCode, CODE_BUFFER_SIZE);
		//寫入文件
		if (nblock > 0)
			ldb_fileWrite(f_pCurrFile, f_bufCode, nblock*BLOCK_ALIGN);
		
		//開始錄音
		silence_count = 0;
		while(b_pause == 0 && f_rcdStop == 0)// && f_rcdPause == 0
		{
			memset(f_bufSample, 0, SAMPLE_BUFFER_SIZE);
			memset(f_bufCode, 0, CODE_BUFFER_SIZE);

			//讀數據
			nread = loco_dspRead(f_bufSample, SAMPLE_BUFFER_SIZE);

			if (nread <= 0)
				goto RECORDER_END;
#if 0
//#if _TEST
			check_value = loco_rcdGetValue(nread);
			memset(log, 0, sizeof(log));
			sprintf(log, "In Recording: v=%d", check_value);
			log_info(log);
			printf(log);
			printf("\n");
//#endif
#endif
			//壓縮
			nblock = loco_adpcmEncode(f_bufSample, nread, SAMPLE_PER_BLOCK, BLOCK_ALIGN, f_bufCode, CODE_BUFFER_SIZE);

			//寫入文件
			if (0 != ldb_fileWrite(f_pCurrFile, f_bufCode, nblock*BLOCK_ALIGN))
				break;
			
			sample_size += nread;

			if (nread < CHECK_NUM_MIN)
				continue;

			//檢查是否應該暫停
			if (sample_size > sample_min_size || silence_count > 0)
			{
				check_value = loco_rcdGetValue(CHECK_NUM_MIN);
				if (check_value <= g_voiceMin )
					silence_count++;
				else
				{
					sample_size = 0;
					silence_count = 0;
				}
				
				if (silence_count > 5)
				{
					memset(log, 0, sizeof(log));
					sprintf(log, "Recording stop for voice %d", check_value);
					log_info(log);
					printf(log);
					printf("\n");

					b_pause = 1;
				}
			}
		}

		//通知串口單元暫停錄音了
		loco_commReply(COMM_MSG_PAUSE);

		fclose(f_pCurrFile);
		f_pCurrFile = NULL;

		memset(f_prevFileName, 0, SYS_PATH_MAX_LEN);
		strcpy(f_prevFileName, f_currFileName);

		LDB_DEBUG_MSGF("Close file %s", f_currFileName);
	}

RECORDER_END:
	LDB_DEBUG_MSGF("Exiting recorder thread...");

	/*清理工作*/
	loco_dspClose();

	if (NULL != f_pCurrFile)
	{
		fclose(f_pCurrFile);
		f_pCurrFile = NULL;
	}

	memset(f_prevFileName, 0, SYS_PATH_MAX_LEN);
	strcpy(f_prevFileName, f_currFileName);
	
	f_rcdStop = 1;

	f_rcdThrd = -1;

	return NULL;
}

int  loco_rcdIsStop()
{
	return f_rcdStop;
}

int loco_rcdIsForceStop()
{
	return f_forceStop;
}

void loco_rcdSetForceStop()
{
	f_forceStop = 1;
}

void loco_rcdClearForceStop()
{
	f_forceStop = 0;
}
/*************************************************/
/*************************************************/
void loco_rcdPlayFile(FILE *pfile)
{
	int nblock, ncode;
	
	loco_adpcmResetDecoder();
	
	/*打開聲音設備*/
	if (-1 == loco_openAudioDev(O_WRONLY) )
	{
		log_error("failed to open audio device!");
		return;
	}

	do
	{
		memset(f_bufSample, 0, SAMPLE_BUFFER_SIZE);
		memset(f_bufCode, 0, CODE_BUFFER_SIZE);

		//讀數據
		ncode = fread(f_bufCode, 1, CODE_BUFFER_SIZE, pfile);
		if (ncode == EOF || ncode <= 0)
			break;
#if ADPCM_COMPRESSION
		//解壓縮
		nblock = loco_adpcmDecode(f_bufCode, ncode, BLOCK_ALIGN, f_bufSample, SAMPLE_BUFFER_SIZE, SAMPLE_PER_BLOCK);
		//寫到設備
		
		if (0 > loco_dspWrite(f_bufSample, nblock*2*SAMPLE_PER_BLOCK))
			break;
#else
		if (0 > write(f_audiofd, f_bufCode, ncode))
			break;
#endif

	}while(1);

	loco_dspClose();
}

void loco_audioPrompt(const char *apid)
{
	FILE *pfile;
	char path[SYS_PATH_MAX_LEN];
	memset(path, 0, sizeof(path));
	
	if (f_forceStop == 1)
	{
		return;
	}

	loco_rcdSetForceStop();
	
	//播放的時候,暫停錄音
	loco_rcdStop();
	sleep(1);
	
	if (g_sysSampleRate == 16)
	{
		sprintf(path, "%s%d", apid, g_sysSampleRate);
		if (ldb_fileExists(path) == 0)
			goto AUDIO_PROMPT_END;

	
		pfile = fopen(path, "rb");
	}
	else
	{
		if (ldb_fileExists(apid) == 0)
			goto AUDIO_PROMPT_END;

	
		pfile = fopen(apid, "rb");
	}
	
	if (pfile != NULL)
	{
		loco_rcdPlayFile(pfile);
		fclose(pfile);
		pfile = NULL;
	}

AUDIO_PROMPT_END:

	loco_rcdStart();
	
	loco_rcdClearForceStop();
}

int  loco_testerStart()
{
	FILE *pfile;
	S_SndDesc tmpDesc;
	
	if (f_forceStop == 1)
	{
		return 0;
	}

	loco_rcdSetForceStop();
	//停止錄音
	loco_rcdStop();

	sleep(1);

	if (ldb_fileExists(f_prevFileName) == 0)
	{
		//繼續錄音
		loco_rcdStart();
		loco_rcdClearForceStop();
		return -1;
	}
	
	pfile = fopen(f_prevFileName, "rb");
	if (pfile == NULL)
	{
		//繼續錄音
		loco_rcdStart();
		loco_rcdClearForceStop();
		return -1;
	}
	
	fread(&tmpDesc, 1, sizeof(tmpDesc), pfile);
	loco_rcdPlayFile(pfile);
	fclose(pfile);
	pfile = NULL;
	
	sleep(1);
	loco_rcdStart();

	loco_rcdClearForceStop();
	return 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲一区二区三区中文字幕| 精品国产露脸精彩对白| 亚洲激情图片小说视频| 色综合天天狠狠| 97久久精品人人澡人人爽| 国产精品欧美久久久久一区二区 | 欧美一区二区在线免费播放| 日本午夜一本久久久综合| 欧美mv和日韩mv的网站| 国产成人精品三级| 亚洲欧洲精品一区二区三区 | 欧美专区在线观看一区| 亚洲国产成人精品视频| 欧美一区二区福利在线| 黄页视频在线91| 国产精品热久久久久夜色精品三区| 99riav一区二区三区| 亚洲一二三区视频在线观看| 日韩欧美电影一二三| 在线不卡免费av| 韩国一区二区在线观看| 亚洲欧美经典视频| 在线不卡中文字幕播放| 国产传媒久久文化传媒| 亚洲一区二区在线免费观看视频| 91精品国产91久久综合桃花 | 91精品国产乱| 成人精品视频网站| 天堂一区二区在线| 国产精品三级电影| 在线播放国产精品二区一二区四区 | 色女孩综合影院| 日韩电影在线观看电影| 欧美国产日本韩| 制服丝袜亚洲播放| 91在线视频免费91| 久久99精品国产麻豆不卡| 亚洲欧美日韩电影| 欧美zozozo| 欧美在线免费观看亚洲| 国产精品夜夜嗨| 三级在线观看一区二区| 中文字幕亚洲欧美在线不卡| 日韩欧美激情一区| 欧美伊人精品成人久久综合97| 国产精品66部| 日韩成人伦理电影在线观看| 亚洲精品高清视频在线观看| 国产无遮挡一区二区三区毛片日本| 欧美日韩一区小说| www.欧美亚洲| 国产盗摄视频一区二区三区| 青娱乐精品视频| 亚洲自拍偷拍图区| 亚洲欧美一区二区三区孕妇| 国产精品网曝门| 精品美女一区二区三区| 欧美日韩精品免费| 一本久道久久综合中文字幕| 成人性生交大片| 国产麻豆9l精品三级站| 精品一区二区三区久久久| 日韩电影网1区2区| 亚洲综合免费观看高清完整版| 国产精品久久久久一区| 国产精品你懂的在线欣赏| 久久蜜臀精品av| 精品国产第一区二区三区观看体验| 欧美美女视频在线观看| 欧美日韩一区二区三区在线| 欧美亚洲动漫制服丝袜| 色综合夜色一区| 同产精品九九九| 亚洲综合在线免费观看| 亚洲卡通动漫在线| 一区二区三区四区蜜桃| 一区二区高清免费观看影视大全| 亚洲色图.com| 一区二区三区中文免费| 国产不卡高清在线观看视频| 韩国午夜理伦三级不卡影院| 久88久久88久久久| 国产一区二区三区在线观看免费| 麻豆成人在线观看| 国产真实精品久久二三区| 韩日精品视频一区| 国产成人免费在线观看| 成人aaaa免费全部观看| 色综合久久天天综合网| 在线观看91视频| 欧美巨大另类极品videosbest | 精品粉嫩aⅴ一区二区三区四区| 日韩女优毛片在线| 久久久亚洲高清| 亚洲欧美日韩成人高清在线一区| 欧美一区二区三区的| 欧美福利电影网| 亚洲视频精选在线| 极品少妇xxxx精品少妇偷拍| 成人av在线电影| 日本三级亚洲精品| 国产一区二区伦理| 不卡在线视频中文字幕| 欧美亚洲一区二区在线观看| 日韩一区二区在线观看视频播放| 2023国产精品| 亚洲天堂a在线| 日本伊人精品一区二区三区观看方式| 国产综合色精品一区二区三区| 成人自拍视频在线| 欧美日高清视频| 久久先锋资源网| 一区二区三区色| 久久精品国产一区二区| 成人免费视频视频| 欧美裸体一区二区三区| 久久久久久影视| 亚洲午夜日本在线观看| 极品少妇xxxx精品少妇偷拍| 色噜噜偷拍精品综合在线| 欧美一区二区三区视频在线| 中文字幕av一区二区三区高| 亚洲国产综合在线| 欧美久久久久久久久中文字幕| 欧美天堂亚洲电影院在线播放 | 不卡视频在线看| 欧美日韩性生活| 国产日本欧美一区二区| 天使萌一区二区三区免费观看| 大陆成人av片| 91精品国产色综合久久不卡电影 | 精品国产乱码久久久久久久| 亚洲欧美欧美一区二区三区| 老司机精品视频导航| 欧美性一二三区| 国产精品欧美久久久久一区二区| 丝袜亚洲精品中文字幕一区| 99国产精品一区| 久久免费电影网| 青青草伊人久久| 欧美在线你懂得| 国产真实精品久久二三区| 欧美日韩在线播| 亚洲人成在线播放网站岛国| 国产精品66部| 337p日本欧洲亚洲大胆色噜噜| 午夜精品在线看| 91视频免费看| 中文字幕电影一区| 国产成人亚洲综合a∨婷婷 | 麻豆久久久久久| 欧美久久久久久久久中文字幕| 一区二区在线观看免费视频播放| 国产成人自拍高清视频在线免费播放| 3d动漫精品啪啪一区二区竹菊| 亚洲一区二区三区精品在线| 一本色道久久加勒比精品| 中文字幕一区二区不卡| 岛国一区二区在线观看| 欧美韩日一区二区三区| 国产91丝袜在线播放| 久久影音资源网| 国产精品乡下勾搭老头1| 337p日本欧洲亚洲大胆色噜噜| 麻豆91精品91久久久的内涵| 制服丝袜av成人在线看| 天堂蜜桃91精品| 91精品一区二区三区久久久久久| 亚洲国产中文字幕在线视频综合| 欧美少妇一区二区| 亚洲成人午夜电影| 欧美一卡2卡三卡4卡5免费| 日本系列欧美系列| 欧美电影精品一区二区| 韩日精品视频一区| 国产欧美日韩精品一区| 高清在线不卡av| 一区免费观看视频| 成人av午夜影院| 一区二区三区四区av| 777久久久精品| 激情欧美一区二区| 国产女人水真多18毛片18精品视频| 国产成人av电影在线播放| 中文字幕中文字幕一区| 在线免费不卡电影| 美国一区二区三区在线播放| 久久久久综合网| 91麻豆精品在线观看| 亚洲国产成人av好男人在线观看| 欧美日高清视频| 91国产免费观看| 视频在线在亚洲| 久久久国产午夜精品| 97久久精品人人做人人爽50路| 亚洲国产视频直播| 久久伊人中文字幕| 在线观看视频一区| 精品亚洲国产成人av制服丝袜| 国产精品国产三级国产有无不卡|