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

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

?? sb16_dsp.c

?? <Linux1.0核心游記>電子書+書后源碼+Linux1.0源碼
?? C
字號(hào):
/* * 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 intsb16_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 intsb16_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 voidsb16_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 voidsb16_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 voidsb16_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_DMARESprintk("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 intsb16_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 intsb16_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 voiddsp_cleanup (void){  irq_mode = IMODE_NONE;  intr_active = 0;}static voidsb16_dsp_reset (int dev){  unsigned long flags;  DISABLE_INTR (flags);  sb_reset_dsp ();  dsp_cleanup ();  RESTORE_INTR (flags);}static voidsb16_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 voidset_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);}longsb16_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;}intsb16_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;}voidsb16_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

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美区一区二区三区| 欧美一级生活片| 国产一区91精品张津瑜| 日韩精品高清不卡| 日韩中文字幕区一区有砖一区 | 久久久久久麻豆| 91麻豆精品国产91久久久 | 精品国产免费一区二区三区香蕉 | 亚洲综合色自拍一区| 亚洲一区欧美一区| 亚洲永久免费视频| 午夜精品久久久久久久久久| 亚洲成年人网站在线观看| 午夜欧美电影在线观看| 免费欧美日韩国产三级电影| 蜜臀av性久久久久av蜜臀妖精| 美腿丝袜在线亚洲一区| 经典三级一区二区| 国产成人av电影免费在线观看| 成人手机在线视频| 91麻豆国产香蕉久久精品| 91成人国产精品| 777精品伊人久久久久大香线蕉| 91精品国产91久久综合桃花| 久久网这里都是精品| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 石原莉奈一区二区三区在线观看| 99久久婷婷国产综合精品| 成人爽a毛片一区二区免费| 99精品视频在线免费观看| 91久久久免费一区二区| 91麻豆精品国产| 久久久久综合网| 国产女同性恋一区二区| 中文字幕日本不卡| 亚洲h动漫在线| 国产在线日韩欧美| 91啪亚洲精品| 91精品麻豆日日躁夜夜躁| 久久久久久久久久久99999| 中文字幕人成不卡一区| 婷婷激情综合网| 国产精品1区2区3区| 一本大道av一区二区在线播放| 91精品国产综合久久久久久漫画 | 在线精品亚洲一区二区不卡| 日韩一区二区视频| 中文字幕亚洲综合久久菠萝蜜| √…a在线天堂一区| 一区二区三区日韩| 蜜桃视频一区二区| 成人中文字幕在线| 欧美最新大片在线看| 欧美精品日韩综合在线| 精品国产在天天线2019| 国产日韩欧美高清| 一区二区在线观看视频在线观看| 丝瓜av网站精品一区二区| 久久精品国产成人一区二区三区 | 日本欧美大码aⅴ在线播放| 奇米精品一区二区三区四区| 黄一区二区三区| 成人手机电影网| 欧美视频一区在线| 国产欧美一区二区三区在线看蜜臀 | 91精品国产高清一区二区三区 | 韩国精品久久久| 欧美日韩日日夜夜| 1000部国产精品成人观看| 精品一区二区在线视频| 欧美另类一区二区三区| 成人欧美一区二区三区视频网页| 久久国产麻豆精品| 欧美日韩国产一二三| 亚洲欧洲精品天堂一级| 国产在线播精品第三| 制服丝袜一区二区三区| 亚洲精品水蜜桃| 成年人网站91| 久久精品夜色噜噜亚洲a∨| 欧美性生活影院| 欧洲精品在线观看| 国产精品成人免费| 国产精品亚洲第一区在线暖暖韩国| 欧美二区三区91| 亚洲一线二线三线久久久| 99久久久久免费精品国产| 久久精品视频免费观看| 久久精品99久久久| 日韩三区在线观看| 日韩影院免费视频| 欧美电影影音先锋| 午夜电影一区二区三区| 欧美日韩三级视频| 亚洲成av人片| 欧美乱妇15p| 天天综合网天天综合色| 欧美日高清视频| 午夜国产不卡在线观看视频| 欧美三级电影精品| 午夜精品久久久久久久蜜桃app| 在线观看日产精品| 亚洲日本va午夜在线影院| 91网站最新地址| 日韩美女啊v在线免费观看| 成人免费毛片片v| 日本一区二区高清| www.av亚洲| 亚洲欧美日韩久久精品| 日本丶国产丶欧美色综合| 一区二区三区蜜桃| 欧美亚洲一区二区在线| 夜夜揉揉日日人人青青一国产精品| 91福利精品第一导航| 亚洲综合男人的天堂| 欧美日韩亚洲不卡| 美日韩一级片在线观看| 精品国产髙清在线看国产毛片| 国产一区在线视频| 国产精品全国免费观看高清| 久草中文综合在线| 日韩三级视频在线观看| 美女视频一区二区三区| 日韩午夜精品视频| 麻豆精品一区二区三区| 色综合久久久久| 一区二区三区**美女毛片| 一本一本大道香蕉久在线精品| 亚洲另类在线制服丝袜| 欧美视频在线观看一区二区| 亚洲成人av资源| 欧美猛男男办公室激情| 日韩av中文在线观看| 欧美一区二区播放| 精品亚洲国产成人av制服丝袜| 欧美不卡一区二区| 国产精品资源网| 亚洲激情网站免费观看| 日韩精品一区二区三区蜜臀| 国产成人精品影视| 亚洲国产婷婷综合在线精品| 精品国产乱码久久久久久久| av电影在线观看一区| 日韩一区欧美二区| 中文字幕第一页久久| 欧美丝袜丝交足nylons| 国产一区二区精品久久99| 亚洲精品中文字幕乱码三区 | 一区二区三区中文在线观看| 欧美精品99久久久**| 国产精品一二一区| 亚洲综合在线电影| 日韩欧美国产成人一区二区| caoporm超碰国产精品| 日韩电影一区二区三区| 国产精品乱子久久久久| 91麻豆精品国产91久久久资源速度 | 日韩精品一区二区三区中文不卡 | 夜夜嗨av一区二区三区四季av| 精品欧美一区二区久久| 色综合久久88色综合天天| 经典三级视频一区| 亚洲成人免费在线| 国产精品久久久久久一区二区三区| 91精品国产综合久久小美女| 972aa.com艺术欧美| 激情综合网激情| 一区二区三区免费网站| 国产色爱av资源综合区| 欧美电影一区二区三区| caoporm超碰国产精品| 久久99久久久欧美国产| 亚洲成人在线网站| 国产精品第四页| 久久午夜色播影院免费高清| 欧美疯狂做受xxxx富婆| 一本大道久久a久久综合| 国产成人福利片| 久久国内精品视频| 天天影视网天天综合色在线播放| 国产精品欧美一级免费| 精品国产污污免费网站入口 | 色94色欧美sute亚洲线路一ni| 国产一区二区三区最好精华液| 五月婷婷色综合| 一区二区三区四区不卡在线| 国产精品欧美久久久久一区二区| 精品国产乱码久久久久久闺蜜| 日韩一区二区在线播放| 欧美日韩www| 欧美视频一区二区三区在线观看| 99精品一区二区三区| 成人午夜私人影院| 国产一二精品视频| 久久国产精品无码网站| 美日韩一级片在线观看| 老司机精品视频一区二区三区| 蜜臀av一区二区| 奇米一区二区三区| 奇米精品一区二区三区四区 |