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

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

?? dmabuf.c

?? LINUX1.0源代碼,代碼條理清晰
?? C
?? 第 1 頁 / 共 2 頁
字號:
      return IOCTL_OUT (arg, dev_buffsize[dev]);
      break;

    case SNDCTL_DSP_SUBDIVIDE:
      {
      	int fact = IOCTL_IN(arg);

      	if (fact == 0)
      	{
      	  fact = dev_subdivision[dev];
      	  if (fact == 0) fact = 1;
	  return IOCTL_OUT(arg, fact);
      	}

      	if (dev_subdivision[dev] != 0) /* Too late to change */
      	   return RET_ERROR(EINVAL);

      	if (fact > MAX_REALTIME_FACTOR) return RET_ERROR(EINVAL);

      	if (fact != 1 && fact != 2 && fact != 4 && fact != 8 && fact !=16)
      	   return RET_ERROR(EINVAL);

      	dev_subdivision[dev] = fact;
      	return IOCTL_OUT(arg, fact);
      }
      break;

    default:
      return dsp_devs[dev]->ioctl (dev, cmd, arg, local);
    }

  return RET_ERROR (EIO);
}

int
DMAbuf_getwrbuffer (int dev, char **buf, int *size)
{
  unsigned long   flags;
  int             err = EIO;

  if (dma_mode[dev] == DMODE_INPUT)	/* Was input -> Direction change */
    {
	dma_reset(dev);
	dma_mode[dev] = DMODE_NONE;
    }
  else
   if (dev_needs_restart[dev])	/* Restart buffering */
    {
	dma_sync(dev);
	dma_reset(dev);
    }
  
  dev_needs_restart[dev] = 0;

  if (!bufferalloc_done[dev])
    reorganize_buffers (dev);

  if (!dma_mode[dev])
    {
      int             err;

      dma_mode[dev] = DMODE_OUTPUT;
      if ((err = dsp_devs[dev]->prepare_for_output (dev,
				    dev_buffsize[dev], dev_nbufs[dev])) < 0)
	return err;
    }


  DISABLE_INTR (flags);

  RESET_WAIT_QUEUE (dev_sleeper[dev], dev_sleep_flag[dev]);

  if (dev_qlen[dev] == dev_nbufs[dev])
    {
      if (!dev_active[dev])
	{
	  printk ("Soundcard warning: DMA not activated %d/%d\n",
		  dev_qlen[dev], dev_nbufs[dev]);
	  return RET_ERROR (EIO);
	}

      /* Wait for free space */
      DO_SLEEP (dev_sleeper[dev], dev_sleep_flag[dev], 2 * HZ);
      if (TIMED_OUT (dev_sleeper[dev], dev_sleep_flag[dev]))
	{
	  printk ("Sound: DMA timed out - IRQ/DRQ config error?\n");
	  err = EIO;
	  SET_ABORT_FLAG (dev_sleeper[dev], dev_sleep_flag[dev]);
	}
      else if (PROCESS_ABORTING (dev_sleeper[dev], dev_sleep_flag[dev]))
	err = EINTR;
    }
  RESTORE_INTR (flags);

  if (dev_qlen[dev] == dev_nbufs[dev])
    return RET_ERROR (err);	/* We have got signal (?) */

  *buf = dev_buf[dev][dev_qtail[dev]];
  *size = dev_buffsize[dev];
  dev_counts[dev][dev_qtail[dev]] = 0;

  return dev_qtail[dev];
}

int
DMAbuf_start_output (int dev, int buff_no, int l)
{
  if (buff_no != dev_qtail[dev])
    printk ("Soundcard warning: DMA buffers out of sync %d != %d\n", buff_no, dev_qtail[dev]);

  dev_qlen[dev]++;

  dev_counts[dev][dev_qtail[dev]] = l;

  dev_needs_restart[dev] = (l != dev_buffsize[dev]);

  dev_qtail[dev] = (dev_qtail[dev] + 1) % dev_nbufs[dev];

  if (!dev_active[dev])
    {
      dev_active[dev] = 1;
      dsp_devs[dev]->output_block (dev, dev_buf_phys[dev][dev_qhead[dev]], 
	dev_counts[dev][dev_qhead[dev]], 0, 
	!sound_dma_automode[dev] || !dev_started[dev]);  
      dev_started[dev] = 1; 
    }

  return 0;
}

int
DMAbuf_start_dma (int dev, unsigned long physaddr, int count, int dma_mode)
{
  int             chan = sound_dsp_dmachan[dev];
  unsigned long   flags;

  /*
   * This function is not as portable as it should be.
   */

  /*
   * The count must be one less than the actual size. This is handled by
   * set_dma_addr()
   */

  if (sound_dma_automode[dev])
    {				/* Auto restart mode. Transfer the whole
				 * buffer */
#ifdef linux
      DISABLE_INTR (flags);
      disable_dma (chan);
      clear_dma_ff (chan);
      set_dma_mode (chan, dma_mode | DMA_AUTOINIT);
      set_dma_addr (chan, snd_raw_buf_phys[dev][0]);
      set_dma_count (chan, sound_buffsizes[dev]);
      enable_dma (chan);
      RESTORE_INTR (flags);
#else

#ifdef __386BSD__
      printk ("sound: Invalid DMA mode for device %d\n", dev);

      isa_dmastart ((dma_mode == DMA_MODE_READ) ? B_READ : B_WRITE,
		    snd_raw_buf_phys[dev][0],
		    sound_buffsizes[dev],
		    chan);
#else
#if defined(ISC) || defined(SCO)
#ifndef DMAMODE_AUTO
      printk ("sound: Invalid DMA mode for device %d\n", dev);
#endif
      dma_param (chan, ((dma_mode == DMA_MODE_READ) ? DMA_Rdmode : DMA_Wrmode)
#ifdef DMAMODE_AUTO
		 | DMAMODE_AUTO
#endif
		 ,
		 snd_raw_buf_phys[dev][0], count);
      dma_enable (chan);
#else
#  error This routine is not valid for this OS.
#endif
#endif

#endif
    }
  else
    {
#ifdef linux
      DISABLE_INTR (flags);
      disable_dma (chan);
      clear_dma_ff (chan);
      set_dma_mode (chan, dma_mode);
      set_dma_addr (chan, physaddr);
      set_dma_count (chan, count);
      enable_dma (chan);
      RESTORE_INTR (flags);
#else
#ifdef __386BSD__
      isa_dmastart ((dma_mode == DMA_MODE_READ) ? B_READ : B_WRITE,
		    physaddr,
		    count,
		    chan);
#else

#if defined(ISC) || defined(SCO)
      dma_param (chan, ((dma_mode == DMA_MODE_READ) ? DMA_Rdmode : DMA_Wrmode),
		 physaddr, count);
      dma_enable (chan);
#else
#  error This routine is not valid for this OS.
#endif /* !ISC */
#endif

#endif
    }

  return count;
}

long
DMAbuf_init (long mem_start)
{
  int             i;

  /*
   * In this version the DMA buffer allocation is done by sound_mem_init()
   * which is called by init/main.c
   */

  for (i = 0; i < MAX_DSP_DEV; i++)
    {
      dev_qlen[i] = 0;
      dev_qhead[i] = 0;
      dev_qtail[i] = 0;
      dev_active[i] = 0;
      dev_busy[i] = 0;
      bufferalloc_done[i] = 0;
    }

  return mem_start;
}

void
DMAbuf_outputintr (int dev, int underrun_flag)
{
  unsigned long   flags;

  dev_qlen[dev]--;
  dev_qhead[dev] = (dev_qhead[dev] + 1) % dev_nbufs[dev];
  dev_active[dev] = 0;

  if (dev_qlen[dev])
    {
      dsp_devs[dev]->output_block (dev, dev_buf_phys[dev][dev_qhead[dev]], 
	  dev_counts[dev][dev_qhead[dev]], 1, 
	  !sound_dma_automode[dev]);
      dev_active[dev] = 1;
    }
  else
    if (underrun_flag)
    {
      dev_underrun[dev]++;
      dsp_devs[dev]->halt_xfer (dev);
      dev_needs_restart[dev] = 1;
    }

  DISABLE_INTR (flags);
  if (SOMEONE_WAITING (dev_sleeper[dev], dev_sleep_flag[dev]))
    {
      WAKE_UP (dev_sleeper[dev], dev_sleep_flag[dev]);
    }
  RESTORE_INTR (flags);
}

void
DMAbuf_inputintr (int dev)
{
  unsigned long   flags;

  if (!dev_busy[dev])
    {
      dsp_devs[dev]->close (dev);
    }
  else if (dev_qlen[dev] == (dev_nbufs[dev] - 1))
    {
      printk("Sound: Recording overrun\n");
      dev_underrun[dev]++;
      dsp_devs[dev]->halt_xfer (dev);
      dev_active[dev] = 0;
      dev_needs_restart[dev] = 1;
    }
  else
    {
      dev_qlen[dev]++;
      dev_qtail[dev] = (dev_qtail[dev] + 1) % dev_nbufs[dev];

      dsp_devs[dev]->start_input (dev, dev_buf_phys[dev][dev_qtail[dev]], 
				  dev_buffsize[dev], 1,
	  			  !sound_dma_automode[dev]);
      dev_active[dev] = 1;
    }

  DISABLE_INTR (flags);
  if (SOMEONE_WAITING (dev_sleeper[dev], dev_sleep_flag[dev]))
    {
      WAKE_UP (dev_sleeper[dev], dev_sleep_flag[dev]);
    }
  RESTORE_INTR (flags);
}

int
DMAbuf_open_dma (int dev)
{
  unsigned long   flags;
  int             chan = sound_dsp_dmachan[dev];

  if (ALLOC_DMA_CHN (chan))
    {
      printk ("Unable to grab DMA%d for the audio driver\n", chan);
      return 0;
    }

  DISABLE_INTR (flags);
#ifdef linux
  disable_dma (chan);
  clear_dma_ff (chan);
#endif
  RESTORE_INTR (flags);

  return 1;
}

void
DMAbuf_close_dma (int dev)
{
  int             chan = sound_dsp_dmachan[dev];

  DMAbuf_reset_dma (chan);
  RELEASE_DMA_CHN (chan);
}

void
DMAbuf_reset_dma (int chan)
{
}

/*
 * The sound_mem_init() is called by mem_init() immediately after mem_map is
 * initialized and before free_page_list is created.
 * 
 * This routine allocates DMA buffers at the end of available physical memory (
 * <16M) and marks pages reserved at mem_map.
 */

#else
/* Stub versions if audio services not included	 */

int
DMAbuf_open (int dev, int mode)
{
  return RET_ERROR (ENXIO);
}

int
DMAbuf_release (int dev, int mode)
{
  return 0;
}

int
DMAbuf_read (int dev, snd_rw_buf * user_buf, int count)
{
  return RET_ERROR (EIO);
}

int
DMAbuf_getwrbuffer (int dev, char **buf, int *size)
{
  return RET_ERROR (EIO);
}

int
DMAbuf_getrdbuffer (int dev, char **buf, int *len)
{
  return RET_ERROR (EIO);
}

int
DMAbuf_rmchars (int dev, int buff_no, int c)
{
  return RET_ERROR (EIO);
}

int
DMAbuf_start_output (int dev, int buff_no, int l)
{
  return RET_ERROR (EIO);
}

int
DMAbuf_ioctl (int dev, unsigned int cmd, unsigned int arg, int local)
{
  return RET_ERROR (EIO);
}

long
DMAbuf_init (long mem_start)
{
  return mem_start;
}

int
DMAbuf_start_dma (int dev, unsigned long physaddr, int count, int dma_mode)
{
  return RET_ERROR (EIO);
}

int
DMAbuf_open_dma (int chan)
{
  return RET_ERROR (ENXIO);
}

void
DMAbuf_close_dma (int chan)
{
  return;
}

void
DMAbuf_reset_dma (int chan)
{
  return;
}

void
DMAbuf_inputintr (int dev)
{
  return;
}

void
DMAbuf_outputintr (int dev, int underrun_flag)
{
  return;
}

#endif

#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
卡一卡二国产精品 | 久久视频一区二区| 成人午夜视频免费看| 日本美女视频一区二区| 国产精品激情偷乱一区二区∴| 欧美一区欧美二区| 色成年激情久久综合| 国产99久久久精品| 玖玖九九国产精品| 日日夜夜免费精品| 亚洲自拍偷拍欧美| 亚洲欧美一区二区久久| 国产三级一区二区| 精品动漫一区二区三区在线观看| 在线观看亚洲一区| 99久久er热在这里只有精品66| 国产一区二区视频在线播放| 日韩不卡一区二区| 国产精品中文有码| 天涯成人国产亚洲精品一区av| 亚洲日本va午夜在线影院| 久久蜜桃av一区精品变态类天堂 | 欧美亚洲免费在线一区| kk眼镜猥琐国模调教系列一区二区 | 日本成人在线不卡视频| 亚洲最大的成人av| 亚洲精品久久久蜜桃| 亚洲女同女同女同女同女同69| 国产亚洲综合性久久久影院| 亚洲精品一区二区三区99| 91精品国产一区二区| 8x福利精品第一导航| 欧美日韩三级一区| 8v天堂国产在线一区二区| 在线播放视频一区| 91精品国产综合久久久蜜臀粉嫩 | 男男gaygay亚洲| 男女男精品视频网| 久久精品噜噜噜成人av农村| 日本亚洲电影天堂| 久久精品99国产精品日本| 九色porny丨国产精品| 久久精品99国产精品| 精品在线免费视频| 国产成人免费在线观看不卡| 国产成人av在线影院| 粉嫩av一区二区三区| 99精品视频在线免费观看| 色综合av在线| 这里只有精品视频在线观看| 欧美大片一区二区| 国产天堂亚洲国产碰碰| 国产精品久久久久精k8| 依依成人综合视频| 日韩经典中文字幕一区| 国产一区二区0| 99久久er热在这里只有精品15 | 亚洲尤物在线视频观看| 日本一不卡视频| 国产伦精品一区二区三区在线观看| 国产精品一品二品| 日韩亚洲电影在线| 2024国产精品| 国产精品成人在线观看| 亚洲一区二区三区视频在线播放| 日韩中文欧美在线| 国产一区不卡在线| 色综合色综合色综合色综合色综合 | 一区二区日韩电影| 日韩一区精品视频| 成人a区在线观看| 欧美性三三影院| 日韩欧美国产成人一区二区| 国产亚洲一区二区三区四区| 中文字幕中文字幕在线一区| 午夜精品久久久久久久久久久| 老司机免费视频一区二区三区| 成人18精品视频| 3atv在线一区二区三区| 中文字幕的久久| 亚洲国产精品人人做人人爽| 国产乱一区二区| 色老综合老女人久久久| 26uuu精品一区二区| 亚洲精品美腿丝袜| 韩国成人精品a∨在线观看| 91女厕偷拍女厕偷拍高清| 日韩欧美色综合| 亚洲美女少妇撒尿| 国产精品资源在线| 欧美福利视频一区| 国产精品视频你懂的| 婷婷久久综合九色国产成人| av资源网一区| 久久女同互慰一区二区三区| 一区二区三区四区亚洲| 国产精品911| 欧美一级国产精品| 一区二区免费在线| 国产精品1024| 亚洲欧美一区二区三区极速播放| 免费成人美女在线观看.| 色综合久久综合| 精品理论电影在线观看| 天天色天天爱天天射综合| 色综合久久久久综合体桃花网| 精品国产一区二区三区不卡| 亚洲成人免费电影| 91麻豆精品秘密| 国产精品青草久久| 国产一区二区三区国产| 欧美va亚洲va| 日韩中文字幕区一区有砖一区 | 欧美绝品在线观看成人午夜影视| 亚洲欧洲性图库| 国产69精品久久99不卡| 久久影院午夜片一区| 男人的j进女人的j一区| 欧美日韩免费一区二区三区视频 | 精品无人码麻豆乱码1区2区| 欧美老人xxxx18| 亚洲综合在线五月| 在线观看亚洲专区| 一区二区三区国产豹纹内裤在线| av电影在线观看一区| 国产精品初高中害羞小美女文| 国产成人aaa| 久久久久久**毛片大全| 狠狠色丁香婷婷综合| 久久综合狠狠综合| 国产原创一区二区三区| 久久久777精品电影网影网 | 久久精品夜色噜噜亚洲a∨| 九九热在线视频观看这里只有精品| 欧美高清视频不卡网| 日韩国产欧美三级| 欧美一级xxx| 国内精品写真在线观看| 亚洲一区二区视频在线观看| 日本韩国欧美一区二区三区| 亚洲一区二区在线免费观看视频| 在线精品观看国产| 日韩在线a电影| 欧美成va人片在线观看| 国产激情一区二区三区四区| 中文字幕av资源一区| 色偷偷成人一区二区三区91| 亚洲一区在线观看网站| 91精品久久久久久蜜臀| 久久99久国产精品黄毛片色诱| 精品国产91久久久久久久妲己| 国产麻豆一精品一av一免费| 国产欧美视频一区二区| 99久久精品免费看| 婷婷久久综合九色综合绿巨人| 91精品国产高清一区二区三区蜜臀 | 国精产品一区一区三区mba桃花| 2023国产精华国产精品| 国产v综合v亚洲欧| 亚洲色图欧洲色图婷婷| 欧美日韩成人高清| 国产一区二区在线电影| 亚洲天堂福利av| 欧美一区二区三区在线观看视频 | 一区二区中文字幕在线| 色丁香久综合在线久综合在线观看| 亚洲高清免费在线| 久久亚洲二区三区| 91色视频在线| 蜜桃视频在线观看一区| 国产精品久久久久久亚洲毛片 | 欧美一区二区三区系列电影| 国产成人免费av在线| 亚洲精品国产第一综合99久久 | 久久精品夜色噜噜亚洲a∨| 色婷婷亚洲精品| 精品一区二区三区久久| 亚洲免费av网站| 精品国免费一区二区三区| 91美女视频网站| 麻豆国产精品777777在线| 亚洲日本va午夜在线影院| 欧美videossexotv100| 日本韩国一区二区| 国产成人精品www牛牛影视| 午夜精品福利一区二区蜜股av | 亚洲欧美日韩一区二区| 日韩欧美在线不卡| 色婷婷av一区二区三区gif| 精品一区二区在线播放| 亚洲中国最大av网站| 国产欧美日韩激情| 日韩欧美一区二区免费| 国产午夜亚洲精品午夜鲁丝片 | 欧美高清在线精品一区| 337p亚洲精品色噜噜| 91在线视频免费观看| 国产一区二区三区香蕉| 五月天亚洲婷婷| 一区二区不卡在线视频 午夜欧美不卡在|