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

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

?? sb16_dsp.c

?? LINUX1.0源代碼,代碼條理清晰
?? C
字號:
/*
 * sound/sb16_dsp.c
 * 
 * The low level driver for the SoundBlaster DSP chip.
 * 
 * (C) 1993 J. Schubert (jsb@sth.ruhr-uni-bochum.de)
 *
 * based on SB-driver by (C) Hannu Savolainen
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met: 1. Redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer. 2.
 * Redistributions in binary form must reproduce the above copyright notice,
 * this list of conditions and the following disclaimer in the documentation
 * and/or other materials provided with the distribution.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * 
 */

#define DEB(x)
#define DEB1(x)
/*
#define DEB_DMARES
*/
#include "sound_config.h"
#include "sb.h"
#include "sb_mixer.h"

#if defined(CONFIGURE_SOUNDCARD) && !defined(EXCLUDE_SB16) && !defined(EXCLUDE_SB) && !defined(EXCLUDE_AUDIO) && !defined(EXCLUDE_SBPRO)

extern int sbc_base;

static int sb16_dsp_ok = 0;	/* Set to 1 after successful initialization */
static int dsp_16bit = 0;
static int dsp_stereo = 0;
static int dsp_current_speed = 8000;/*DSP_DEFAULT_SPEED;*/
static int dsp_busy  = 0;
static int dma16, dma8;
static unsigned long dsp_count = 0;

static int irq_mode = IMODE_NONE;	/* IMODE_INPUT, IMODE_OUTPUT or
					   IMODE_NONE */
static int my_dev = 0;

static volatile int intr_active = 0;

static int sb16_dsp_open (int dev, int mode);
static void sb16_dsp_close (int dev);
static void sb16_dsp_output_block (int dev, unsigned long buf, int count,int intrflag, int dma_restart);
static void sb16_dsp_start_input (int dev, unsigned long buf, int count,int intrflag, int dma_restart);
static int sb16_dsp_ioctl (int dev, unsigned int cmd, unsigned int arg,int local);
static int sb16_dsp_prepare_for_input (int dev, int bsize, int bcount);
static int sb16_dsp_prepare_for_output (int dev, int bsize, int bcount);
static void sb16_dsp_reset (int dev);
static void sb16_dsp_halt (int dev);
static int dsp_set_speed (int);
static int dsp_set_stereo (int);
static void dsp_cleanup (void);
int sb_reset_dsp (void);

static struct audio_operations sb16_dsp_operations =
{
  "SoundBlaster 16",
  sb16_dsp_open,
  sb16_dsp_close,
  sb16_dsp_output_block,
  sb16_dsp_start_input,
  sb16_dsp_ioctl,
  sb16_dsp_prepare_for_input,
  sb16_dsp_prepare_for_output,
  sb16_dsp_reset,
  sb16_dsp_halt,
  NULL,
  NULL
};

static int sb_dsp_command01 (unsigned char val)
{
  int i=1<<16;

  while(--i & (!INB (DSP_STATUS) & 0x80));
  if(!i)
    printk("SB16 sb_dsp_command01 Timeout\n");
  return sb_dsp_command(val);
}

static int wait_data_avail(int t)
{
  int loopc=5000000;
  t+=GET_TIME();
  do {
    if(INB(DSP_DATA_AVAIL) & 0x80)
      return 1;
  } while(--loopc && GET_TIME()<t);
  printk("!data_avail l=%d\n",loopc);
  return 0;
}

static int read_dsp(int t)
{
  if(!wait_data_avail(t))
    return -1;
  else
    return INB(DSP_READ);
}									

static int dsp_ini2(void)
{
#if 0
  /* sb_setmixer(0x83, sb_getmixer(0x83) | 0x03);	*/
  sb_dsp_command(0xe2);
  sb_dsp_command(0x76);	/* E0 ??? */
  sb_dsp_command(0xe2);
  sb_dsp_command(0x30);	/* A0 ??? */
  sb_dsp_command(0xe4);
  sb_dsp_command(0xaa);
  sb_dsp_command(0xe8);
  if(read_dsp(100)!=0xaa)
    printk("Error dsp_ini2\n");
#endif
  return 0;
}
/*
static char *dsp_getmessage(unsigned char command,int maxn)
{
  static char buff[100];
  int n=0;

  sb_dsp_command(command);
  while(n<maxn && wait_data_avail(2)) {
    buff[++n]=INB(DSP_READ);
    if(!buff[n])
      break;
  }
  buff[0]=n;
  return buff;
}

static void dsp_showmessage(unsigned char command,int len)
{
  int n;
  unsigned char *c;
  c=dsp_getmessage(command,len);
  printk("DSP C=%x l=%d,lr=%d b=",command,len,c[0]);
  for(n=1;n<=c[0];n++)
    if(c[n]>=' ' & c[n]<='z')
      printk("%c",c[n]);
    else
      printk("|%x|",c[n]);
  printk("\n");
}
*/
static int dsp_set_speed(int mode)
{
DEB(printk("dsp_set_speed(%d)\n",mode));
  if (mode)
  {
    if (mode < 5000) mode = 5000;
    if (mode > 44100) mode = 44100;
    dsp_current_speed=mode;
  }
  return mode;
}

static int dsp_set_stereo(int mode)
{
DEB(printk("dsp_set_stereo(%d)\n",mode));

  dsp_stereo=mode;

  return mode;
}

static int dsp_set_bits(int arg) {
DEB(printk("dsp_set_bits(%d)\n",arg));

  if (arg)
  switch(arg) {
  case 8:
    dsp_16bit=0; break;
  case 16:
    dsp_16bit=1; break;
  default:
    return RET_ERROR(EINVAL);
  }
  return dsp_16bit? 16:8;
}

static int
sb16_dsp_ioctl (int dev, unsigned int cmd, unsigned int arg,int local)
{
  switch (cmd) {
  case SOUND_PCM_WRITE_RATE:
    if(local)
      return dsp_set_speed(arg);
    return IOCTL_OUT (arg, dsp_set_speed (IOCTL_IN (arg)));
    
  case SOUND_PCM_READ_RATE:
    if(local)
      return dsp_current_speed;
    return IOCTL_OUT (arg, dsp_current_speed);
    
  case SNDCTL_DSP_STEREO:
    if (local)
      return dsp_set_stereo(arg);
    return IOCTL_OUT (arg, dsp_set_stereo(IOCTL_IN(arg)));
    
  case SOUND_PCM_WRITE_CHANNELS:
    if (local)
      return dsp_set_stereo(arg-1)+1;
    return IOCTL_OUT (arg, dsp_set_stereo (IOCTL_IN (arg) - 1) + 1);
    
  case SOUND_PCM_READ_CHANNELS:
    if (local)
      return dsp_stereo+1;
    return IOCTL_OUT (arg, dsp_stereo+1);
    
  case SNDCTL_DSP_SAMPLESIZE:
    if (local)
      return dsp_set_bits (arg);
    return IOCTL_OUT (arg, dsp_set_bits (IOCTL_IN (arg)));
    
  case SOUND_PCM_READ_BITS:
    if (local)
      return dsp_16bit?16:8;
    return IOCTL_OUT (arg, dsp_16bit?16:8);
    
  case SOUND_PCM_WRITE_FILTER:	/* NOT YET IMPLEMENTED */
    if (IOCTL_IN (arg) > 1)
      return IOCTL_OUT (arg, RET_ERROR (EINVAL));
  default:
    return RET_ERROR (EINVAL);
  }
  
  return RET_ERROR (EINVAL);
}

static int
sb16_dsp_open (int dev, int mode)
{
  int retval;

DEB(printk("sb16_dsp_open()\n"));
  if (!sb16_dsp_ok)
    {
      printk ("SB16 Error: SoundBlaster board not installed\n");
      return RET_ERROR(ENXIO);
    }

  if (intr_active)
    return RET_ERROR(EBUSY);

  retval = sb_get_irq ();
  if (retval<0)
    return retval;

  if (ALLOC_DMA_CHN (dma8))
    {
      printk ("SB16: Unable to grab DMA%d\n", dma8);
      sb_free_irq();
      return RET_ERROR(EBUSY);
    }

  if (dma16 != dma8)
  if (ALLOC_DMA_CHN (dma16))
    {
      printk ("SB16: Unable to grab DMA%d\n", dma16);
      sb_free_irq();
      RELEASE_DMA_CHN (dma8);
      return RET_ERROR(EBUSY);
    }

  dsp_ini2();

  irq_mode = IMODE_NONE;
  dsp_busy = 1;

  return 0;
}

static void
sb16_dsp_close (int dev)
{
  unsigned long   flags;
DEB(printk("sb16_dsp_close()\n"));
  sb_dsp_command01(0xd9);
  sb_dsp_command01(0xd5);

  DISABLE_INTR (flags);
  RELEASE_DMA_CHN (dma8);

  if (dma16 != dma8)
     RELEASE_DMA_CHN (dma16);
  sb_free_irq ();
  dsp_cleanup ();
  dsp_busy = 0;
  RESTORE_INTR (flags);
}

static void
sb16_dsp_output_block (int dev, unsigned long buf, int count,int intrflag, int dma_restart)
{
  unsigned long   flags, cnt;

  cnt = count;
  if (dsp_16bit)
    cnt >>= 1;
  cnt--;

#ifdef DEB_DMARES
  printk("output_block: %x %d %d\n",buf,count,intrflag);
  if(intrflag) {
    int pos,chan=sound_dsp_dmachan[dev];
    DISABLE_INTR (flags);
    clear_dma_ff(chan);
    disable_dma(chan);
    pos=get_dma_residue(chan);
    enable_dma(chan);
    RESTORE_INTR (flags);
    printk("dmapos=%d %x\n",pos,pos);
  }
#endif
  if (sound_dma_automode[dev] &&
      intrflag &&
      cnt == dsp_count) {
    irq_mode = IMODE_OUTPUT;
    intr_active = 1;
    return;			/* Auto mode on. No need to react */
  }
  DISABLE_INTR (flags);
  
  if (dma_restart)
  {
     sb16_dsp_halt(dev);
     DMAbuf_start_dma (dev, buf, count, DMA_MODE_WRITE);
  }
  sb_dsp_command (0x41);
  sb_dsp_command ((unsigned char)((dsp_current_speed >> 8) & 0xff));
  sb_dsp_command ((unsigned char)(dsp_current_speed & 0xff));
  sb_dsp_command ((unsigned char)(dsp_16bit ? 0xb6 : 0xc6));
  sb_dsp_command ((unsigned char)((dsp_stereo ? 0x20 : 0) + 
				  (dsp_16bit ? 0x10:0)));
  sb_dsp_command01 ((unsigned char)(cnt&0xff));
  sb_dsp_command ((unsigned char)(cnt>>8));
  /* sb_dsp_command (0);
  sb_dsp_command (0); */
  
  RESTORE_INTR (flags);
  dsp_count=cnt;
  irq_mode = IMODE_OUTPUT;
  intr_active = 1;
}

static void
sb16_dsp_start_input (int dev, unsigned long buf, int count,int intrflag, int dma_restart)
{
  unsigned long   flags, cnt;

  cnt = count;
  if (dsp_16bit)
    cnt >>= 1;
  cnt--;

#ifdef DEB_DMARES
printk("start_input: %x %d %d\n",buf,count,intrflag);
  if(intrflag) {
    int pos,chan=sound_dsp_dmachan[dev];
    DISABLE_INTR (flags);
    clear_dma_ff(chan);
    disable_dma(chan);
    pos=get_dma_residue(chan);
    enable_dma(chan);
    RESTORE_INTR (flags);
    printk("dmapos=%d %x\n",pos,pos);
  }
#endif
  if (sound_dma_automode[dev] &&
      intrflag &&
      cnt == dsp_count) {
    irq_mode = IMODE_INPUT;
    intr_active = 1;
    return;			/* Auto mode on. No need to react */
  }
  DISABLE_INTR (flags);
  
  if (dma_restart) 
  {
      sb16_dsp_halt(dev);
      DMAbuf_start_dma (dev, buf, count, DMA_MODE_READ);
  }

  sb_dsp_command (0x42);
  sb_dsp_command ((unsigned char)((dsp_current_speed >> 8) & 0xff));
  sb_dsp_command ((unsigned char)(dsp_current_speed & 0xff));
  sb_dsp_command ((unsigned char)(dsp_16bit ? 0xbe : 0xce));
  sb_dsp_command ((unsigned char)((dsp_stereo ? 0x20 : 0) + 
			(dsp_16bit ? 0x10:0)));
  sb_dsp_command01 ((unsigned char)(cnt&0xff));
  sb_dsp_command ((unsigned char)(cnt>>8));
  
  /* sb_dsp_command (0);
  sb_dsp_command (0); */
  RESTORE_INTR (flags);
  dsp_count=cnt;
  irq_mode = IMODE_INPUT;
  intr_active = 1;
}

static int
sb16_dsp_prepare_for_input (int dev, int bsize, int bcount)
{
  sound_dsp_dmachan[my_dev] = dsp_16bit? dma16:dma8;
  dsp_count = 0;
  dsp_cleanup ();
  return 0;
}

static int
sb16_dsp_prepare_for_output (int dev, int bsize, int bcount)
{
  sound_dsp_dmachan[my_dev] = dsp_16bit? dma16:dma8;
  dsp_count = 0;
  dsp_cleanup ();
  return 0;
}

static void
dsp_cleanup (void)
{
  irq_mode = IMODE_NONE;
  intr_active = 0;
}

static void
sb16_dsp_reset (int dev)
{
  unsigned long flags;

  DISABLE_INTR (flags);

  sb_reset_dsp ();
  dsp_cleanup ();

  RESTORE_INTR (flags);
}

static void
sb16_dsp_halt (int dev)
{
  if (dsp_16bit)
   {
     sb_dsp_command01(0xd9);
     sb_dsp_command01(0xd5);
   }
  else
   {
     sb_dsp_command01(0xda);
     sb_dsp_command01(0xd0);
   }
}

static void
set_irq_hw(int level) {
  int ival;
  switch(level) {
  case 5:
    ival=2; break;
  case 7:
    ival=4; break;
  case 10:
    ival=8; break;
  default:
    printk("SB16_IRQ_LEVEL %d does not exist\n",level);
    return;
  }
  sb_setmixer(IRQ_NR,ival);
}

long
sb16_dsp_init (long mem_start, struct address_info *hw_config)
{
  int             i, major, minor;

  major = minor = 0;
  sb_dsp_command (0xe1);		/* Get version */
  
  for (i = 1000; i; i--) {
    if (INB (DSP_DATA_AVAIL) & 0x80)
      {			/* wait for Data Ready */
	if (major == 0)
	  major = INB (DSP_READ);
	else
	  {
	    minor = INB (DSP_READ);
	    break;
	  }
      }
  }

#ifndef SCO 
  sprintf (sb16_dsp_operations.name, "SoundBlaster 16 %d.%d", major, minor);
#endif
  
  printk (" <%s>", sb16_dsp_operations.name);
  
  if (num_dspdevs < MAX_DSP_DEV)
    {
      dsp_devs[my_dev = num_dspdevs++] = &sb16_dsp_operations;
      sound_dsp_dmachan[my_dev] = hw_config->dma;
      sound_buffcounts[my_dev] = 1;
      sound_buffsizes[my_dev] = DSP_BUFFSIZE;
      sound_dma_automode[my_dev] = 1;
    }
  else
    printk ("SB: Too many DSP devices available\n");
  sb16_dsp_ok = 1;
  return mem_start;
}

int
sb16_dsp_detect (struct address_info *hw_config)
{
  struct address_info *sb_config;

  if (sb16_dsp_ok)
    return 1;			/* Already initialized */

  if (!(sb_config=sound_getconf(SNDCARD_SB)))
  {
  	printk("SB16 Error: Plain SB not configured\n");
  	return 0;
  }

  if (sbc_base != hw_config->io_base)
     printk("Warning! SB16 I/O != SB I/O\n");

  /* sb_setmixer(OPSW,0xf);
  if(sb_getmixer(OPSW)!=0xf)
    return 0; */
  
  if (!sb_reset_dsp ())
    return 0;

  if (hw_config->irq != sb_config->irq)
  {
     printk("SB16 Error: Invalid IRQ number %d/%d\n",
     	     sb_config->irq, hw_config->irq);
     return 0;
  }

  if (hw_config->dma < 4)
     if (hw_config->dma != sb_config->dma)
     {
     	printk("SB16 Error: Invalid DMA channel %d/%d\n",
     		sb_config->dma, hw_config->dma);
     	return 0;
     }

  dma16 = hw_config->dma;
  dma8 = sb_config->dma;
  set_irq_hw(hw_config->irq);
  sb_setmixer(DMA_NR, (1<<hw_config->dma) | (1<<sb_config->dma));

  DEB(printk ("SoundBlaster 16: IRQ %d DMA %d OK\n",hw_config->irq,hw_config->dma));
  
/*
  dsp_showmessage(0xe3,99);
*/
  sb16_dsp_ok = 1;
  return 1;
}

void
sb16_dsp_interrupt (int unused)
{
    int data;
    data = INB (DSP_DATA_AVL16);	/* Interrupt acknowledge */

    if (intr_active)
      switch (irq_mode)
	{
	case IMODE_OUTPUT:
	  intr_active = 0;
	  DMAbuf_outputintr (my_dev, 1);
	  break;
	  
	case IMODE_INPUT:
	  intr_active = 0;
	  DMAbuf_inputintr (my_dev);
	  break;
	  
	default:
	  printk ("SoundBlaster: Unexpected interrupt\n");
	}
}
#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品久久久久aaaa| 日韩不卡在线观看日韩不卡视频| 亚洲精品五月天| 男人操女人的视频在线观看欧美 | 欧美xxx久久| 亚洲精品精品亚洲| 国产福利一区二区三区视频| 欧美三级蜜桃2在线观看| 国产精品美女久久久久久2018| 青青草91视频| 欧美综合欧美视频| 国产精品传媒视频| 国产麻豆精品在线| 日韩免费电影一区| 视频在线观看一区| 欧美性xxxxxxxx| 亚洲日本在线a| www.欧美日韩| 国产精品久久久久天堂| 国产成人综合在线观看| 精品久久久久久综合日本欧美| 亚洲va韩国va欧美va精品| 色综合久久66| 一区二区成人在线视频| 色综合天天综合色综合av | 一区二区三区在线不卡| 成人激情开心网| 日本一区二区三区四区| 国产成a人无v码亚洲福利| 久久久久久久网| 国产成人精品免费视频网站| 久久久蜜桃精品| 国产91高潮流白浆在线麻豆 | 久久综合一区二区| 国产呦萝稀缺另类资源| 久久青草欧美一区二区三区| 激情综合网激情| 久久一夜天堂av一区二区三区| 国内精品国产三级国产a久久| 精品久久久久久久久久久久久久久久久| 蜜桃免费网站一区二区三区| 日韩精品一区二区三区四区 | 一本到高清视频免费精品| 亚洲视频你懂的| 91美女精品福利| 亚洲综合区在线| 欧美一区三区四区| 国产美女在线观看一区| 国产片一区二区| 色综合久久中文字幕综合网| 亚欧色一区w666天堂| 欧美电影免费观看高清完整版在线 | 婷婷夜色潮精品综合在线| 3d动漫精品啪啪一区二区竹菊| 美腿丝袜在线亚洲一区 | 高清成人免费视频| 成人欧美一区二区三区白人| 色综合久久88色综合天天 | www一区二区| 成人午夜电影久久影院| 亚洲精品国产一区二区精华液| 欧美日韩一区小说| 国产乱子伦一区二区三区国色天香| 亚洲国产高清aⅴ视频| 在线一区二区视频| 国产一区二区三区免费| 亚洲免费观看高清完整版在线 | 中日韩av电影| 欧美日韩国产不卡| 国产一区二区看久久| 亚洲蜜臀av乱码久久精品蜜桃| 91精品一区二区三区在线观看| 岛国av在线一区| 日韩精品成人一区二区在线| 国产人久久人人人人爽| 欧美乱妇20p| 9人人澡人人爽人人精品| 日本亚洲欧美天堂免费| 亚洲男人的天堂网| 久久久久88色偷偷免费| 欧美色图一区二区三区| 粗大黑人巨茎大战欧美成人| 日韩制服丝袜av| 一区二区三区在线影院| 欧美国产丝袜视频| 精品久久人人做人人爰| 欧美日韩国产一二三| 一本久久a久久免费精品不卡| 国产综合久久久久久久久久久久| 亚洲精品视频观看| 国产精品免费丝袜| 日韩精品一区二区三区三区免费 | 337p日本欧洲亚洲大胆精品 | 日本韩国一区二区三区视频| 国产乱对白刺激视频不卡| 日韩成人一区二区三区在线观看| 亚洲视频综合在线| 中文子幕无线码一区tr| 久久综合久久综合久久综合| 欧美精品久久99久久在免费线| 91小视频免费看| 成人一区二区视频| 国产老女人精品毛片久久| 麻豆精品久久精品色综合| 五月婷婷另类国产| 视频一区中文字幕| 亚洲第一在线综合网站| 亚洲自拍偷拍图区| 一区二区三区四区av| 亚洲激情欧美激情| 亚洲精品欧美二区三区中文字幕| 国产精品美女一区二区三区| 国产精品视频一二三| 国产精品视频第一区| 中文字幕亚洲成人| 亚洲欧洲综合另类在线| 亚洲乱码精品一二三四区日韩在线| 亚洲欧美在线视频观看| 日韩一区中文字幕| 一区二区三区欧美激情| 亚洲一级二级在线| 日韩av电影一区| 麻豆成人免费电影| 国产精品一区在线观看乱码| 国产精品一色哟哟哟| 成人av在线观| 欧美亚洲一区二区在线| 欧美一区二区在线播放| 精品日韩成人av| 欧美国产欧美综合| 亚洲制服丝袜av| 久久精品国产亚洲高清剧情介绍 | 91国偷自产一区二区开放时间| 欧美性受xxxx黑人xyx性爽| 欧美精品xxxxbbbb| 久久亚洲一级片| 自拍偷拍国产精品| 丝袜亚洲另类欧美| 国产大陆a不卡| 欧美专区日韩专区| 欧美电影免费观看高清完整版在 | 欧美日韩一区在线| 久久久国产精华| 一区二区三区成人| 久久精品久久99精品久久| 成人a免费在线看| 欧美另类一区二区三区| 国产午夜精品一区二区三区嫩草| 亚洲天堂网中文字| 人人超碰91尤物精品国产| 大尺度一区二区| 在线播放亚洲一区| 国产精品美日韩| 奇米影视一区二区三区小说| www.欧美日韩国产在线| 欧美一级专区免费大片| 国产精品国产三级国产aⅴ无密码| 午夜精品爽啪视频| 白白色 亚洲乱淫| 日韩亚洲欧美在线| 一区二区在线观看av| 国产在线精品免费av| 欧美日韩中文字幕一区| 久久精品亚洲精品国产欧美 | 亚洲欧美日韩中文播放 | 欧美日韩色一区| 国产日韩欧美电影| 日韩av在线播放中文字幕| 91麻豆高清视频| 国产欧美日韩综合| 久久国产夜色精品鲁鲁99| 色999日韩国产欧美一区二区| 久久综合999| 美女www一区二区| 欧美综合亚洲图片综合区| 国产精品国产自产拍高清av| 久久精品国产精品亚洲红杏| 欧美日韩一区二区在线观看| 1区2区3区精品视频| 风间由美一区二区av101| 日韩精品一区二区三区老鸭窝 | 欧美一级免费观看| 亚洲一区二区精品久久av| 国产欧美一区二区在线观看| 亚洲日本丝袜连裤袜办公室| 精东粉嫩av免费一区二区三区| 欧美性生活影院| 日韩伦理电影网| 99视频国产精品| 欧美极品另类videosde| 国产精品中文有码| 国产亚洲va综合人人澡精品| 国内精品久久久久影院色| 精品国产伦一区二区三区免费| 亚洲国产欧美日韩另类综合 | 国产黄色91视频| 国产午夜精品福利| 成人免费看视频| 亚洲国产电影在线观看| 成人av影视在线观看|