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

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

?? audio.c

?? LINUX1.0源代碼,代碼條理清晰
?? C
字號:
/*
 * sound/audio.c
 * 
 * Device file manager for /dev/audio
 * 
 * Copyright by Hannu Savolainen 1993
 * 
 * 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.
 * 
 */

#include "sound_config.h"

#ifdef CONFIGURE_SOUNDCARD
#ifndef EXCLUDE_AUDIO

#include "ulaw.h"

#define ON		1
#define OFF		0

static int      wr_buff_no[MAX_DSP_DEV];	/* != -1, if there is a
						 * incomplete output block */
static int      wr_buff_size[MAX_DSP_DEV], wr_buff_ptr[MAX_DSP_DEV];

static int	audio_mode[MAX_DSP_DEV];
#define		AM_NONE		0
#define		AM_WRITE	1
#define 	AM_READ		2

static char    *wr_dma_buf[MAX_DSP_DEV];

int
audio_open (int dev, struct fileinfo *file)
{
  int             ret;
  int		  bits;
  int		  dev_type = dev & 0x0f;
  int		  mode = file->mode & O_ACCMODE;

  dev = dev >> 4;

  if (dev_type == SND_DEV_DSP16)
     bits = 16;
  else
     bits = 8;

  if ((ret = DMAbuf_open (dev, mode)) < 0)
    return ret;

  if (DMAbuf_ioctl (dev, SNDCTL_DSP_SAMPLESIZE, bits, 1) != bits)
    {
      audio_release (dev, file);
      return RET_ERROR (ENXIO);
    }

  wr_buff_no[dev] = -1;
  audio_mode[dev] = AM_NONE;

  return ret;
}

void
audio_release (int dev, struct fileinfo *file)
{
  int             mode;

  dev = dev >> 4;
  mode = file->mode & O_ACCMODE;

  if (wr_buff_no[dev] >= 0)
    {
      DMAbuf_start_output (dev, wr_buff_no[dev], wr_buff_ptr[dev]);

      wr_buff_no[dev] = -1;
    }

  DMAbuf_release (dev, mode);
}

#ifdef NO_INLINE_ASM
static void
translate_bytes (const unsigned char *table, unsigned char *buff, unsigned long n)
{
  unsigned long   i;

  for (i = 0; i < n; ++i)
    buff[i] = table[buff[i]];
}

#else
extern inline void
translate_bytes (const void *table, void *buff, unsigned long n)
{
  __asm__ ("cld\n"
	   "1:\tlodsb\n\t"
	   "xlatb\n\t"
	   "stosb\n\t"
	   "loop 1b\n\t":
	   :"b" ((long) table), "c" (n), "D" ((long) buff), "S" ((long) buff)
	   :"bx", "cx", "di", "si", "ax");
}

#endif

int
audio_write (int dev, struct fileinfo *file, snd_rw_buf * buf, int count)
{
  int             c, p, l;
  int             err;
  int		  dev_type = dev & 0x0f;

  dev = dev >> 4;

  p = 0;
  c = count;

  if (audio_mode[dev] == AM_READ)	/* Direction changed */
  {
      wr_buff_no[dev] = -1;
  }

  audio_mode[dev] = AM_WRITE;

  if (!count)			/* Flush output */
    {
      if (wr_buff_no[dev] >= 0)
	{
	  DMAbuf_start_output (dev, wr_buff_no[dev], wr_buff_ptr[dev]);

	  wr_buff_no[dev] = -1;
	}
      return 0;
    }

  while (c)
    {				/* Perform output blocking */
      if (wr_buff_no[dev] < 0)	/* There is no incomplete buffers */
	{
	  if ((wr_buff_no[dev] = DMAbuf_getwrbuffer (dev, &wr_dma_buf[dev], &wr_buff_size[dev])) < 0)
	    return wr_buff_no[dev];
	  wr_buff_ptr[dev] = 0;
	}

      l = c;
      if (l > (wr_buff_size[dev] - wr_buff_ptr[dev]))
	l = (wr_buff_size[dev] - wr_buff_ptr[dev]);

      if (!dsp_devs[dev]->copy_from_user)
	{			/* No device specific copy routine */
	  COPY_FROM_USER (&wr_dma_buf[dev][wr_buff_ptr[dev]], buf, p, l);
	}
      else
	dsp_devs[dev]->copy_from_user (dev,
			       wr_dma_buf[dev], wr_buff_ptr[dev], buf, p, l);


      /* Insert local processing here */

      if (dev_type == SND_DEV_AUDIO)
      {
#ifdef linux
      /* This just allows interrupts while the conversion is running */
         __asm__ ("sti");
#endif
         translate_bytes (ulaw_dsp, &wr_dma_buf[dev][wr_buff_ptr[dev]], l);
      }

      c -= l;
      p += l;
      wr_buff_ptr[dev] += l;

      if (wr_buff_ptr[dev] >= wr_buff_size[dev])
	{
	  if ((err = DMAbuf_start_output (dev, wr_buff_no[dev], wr_buff_ptr[dev])) < 0)
	    return err;

	  wr_buff_no[dev] = -1;
	}

    }

  return count;
}

int
audio_read (int dev, struct fileinfo *file, snd_rw_buf * buf, int count)
{
  int             c, p, l;
  char           *dmabuf;
  int             buff_no;
  int		  dev_type = dev & 0x0f;

  dev = dev >> 4;
  p = 0;
  c = count;

  if (audio_mode[dev] == AM_WRITE)
  {
      if (wr_buff_no[dev] >= 0)
	{
	  DMAbuf_start_output (dev, wr_buff_no[dev], wr_buff_ptr[dev]);

	  wr_buff_no[dev] = -1;
	}
  }

  audio_mode[dev] = AM_READ;

  while (c)
    {
      if ((buff_no = DMAbuf_getrdbuffer (dev, &dmabuf, &l)) < 0)
	return buff_no;

      if (l > c)
	l = c;

      /* Insert any local processing here. */

      if (dev_type == SND_DEV_AUDIO)
      {
#ifdef linux
        /* This just allows interrupts while the conversion is running */
        __asm__ ("sti");
#endif

        translate_bytes (dsp_ulaw, dmabuf, l);
      }

      COPY_TO_USER (buf, p, dmabuf, l);

      DMAbuf_rmchars (dev, buff_no, l);

      p += l;
      c -= l;
    }

  return count - c;
}

int
audio_ioctl (int dev, struct fileinfo *file,
	     unsigned int cmd, unsigned int arg)
{
  int		  dev_type = dev & 0x0f;
  dev = dev >> 4;

  switch (cmd)
    {
    case SNDCTL_DSP_SYNC:
      if (wr_buff_no[dev] >= 0)
	{
	  DMAbuf_start_output (dev, wr_buff_no[dev], wr_buff_ptr[dev]);

	  wr_buff_no[dev] = -1;
	}
      return DMAbuf_ioctl (dev, cmd, arg, 0);
      break;

    case SNDCTL_DSP_POST:
      if (wr_buff_no[dev] >= 0)
	{
	  DMAbuf_start_output (dev, wr_buff_no[dev], wr_buff_ptr[dev]);

	  wr_buff_no[dev] = -1;
	}
      return 0;
      break;

    case SNDCTL_DSP_RESET:
      wr_buff_no[dev] = -1;
      return DMAbuf_ioctl (dev, cmd, arg, 0);
      break;

    default:
      if (dev_type == SND_DEV_AUDIO)
         return RET_ERROR (EIO);

      return DMAbuf_ioctl (dev, cmd, arg, 0);
    }
}

long
audio_init (long mem_start)
{
  return mem_start;
}

#else
/* Stub versions */

int
audio_read (int dev, struct fileinfo *file, snd_rw_buf * buf, int count)
{
  return RET_ERROR (EIO);
}

int
audio_write (int dev, struct fileinfo *file, snd_rw_buf * buf, int count)
{
  return RET_ERROR (EIO);
}

int
audio_open (int dev, struct fileinfo *file)
  {
    return RET_ERROR (ENXIO);
  }

void
audio_release (int dev, struct fileinfo *file)
  {
  };
int
audio_ioctl (int dev, struct fileinfo *file,
	     unsigned int cmd, unsigned int arg)
{
  return RET_ERROR (EIO);
}

int
audio_lseek (int dev, struct fileinfo *file, off_t offset, int orig)
{
  return RET_ERROR (EIO);
}

long
audio_init (long mem_start)
{
  return mem_start;
}

#endif

#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩专区中文字幕一区二区| 丁香婷婷综合五月| 韩国欧美一区二区| 色狠狠色噜噜噜综合网| 久久久久久久久蜜桃| 亚洲制服丝袜一区| 成人av在线资源网| 久久久亚洲午夜电影| 日韩国产高清在线| 欧美日韩一级视频| 亚洲精选在线视频| av电影一区二区| 国产婷婷精品av在线| 五月激情六月综合| 欧美亚洲动漫精品| 一区二区三区蜜桃网| 成人av资源在线| 国产三级精品三级| 精品一区二区三区免费观看| 欧美精品色综合| 亚洲午夜私人影院| 欧美午夜不卡视频| 亚洲韩国精品一区| 欧美日韩一区二区在线观看视频| 亚洲色图19p| 91免费观看视频| 国产精品久久777777| 成人久久视频在线观看| 欧美国产亚洲另类动漫| 国产露脸91国语对白| 久久精品人人做人人综合| 国产另类ts人妖一区二区| 久久久精品tv| 国产成人自拍网| 国产精品二区一区二区aⅴ污介绍| 国产乱国产乱300精品| 欧美国产乱子伦| 91热门视频在线观看| 亚洲乱码日产精品bd| 欧美做爰猛烈大尺度电影无法无天| 亚洲欧洲中文日韩久久av乱码| 91香蕉视频污在线| 亚洲成人三级小说| 精品国产不卡一区二区三区| 韩国三级中文字幕hd久久精品| 日本一区二区三区国色天香| a级高清视频欧美日韩| 亚洲黄色小说网站| 欧美人牲a欧美精品| 国内精品国产成人国产三级粉色| 久久久久久久国产精品影院| 成人免费视频一区二区| 亚洲激情男女视频| 日韩视频中午一区| www.99精品| 秋霞影院一区二区| 国产婷婷色一区二区三区在线| 99精品视频一区二区三区| 日日噜噜夜夜狠狠视频欧美人| 精品日韩欧美一区二区| k8久久久一区二区三区| 日韩av不卡在线观看| 精品国产91乱码一区二区三区| 国产精品亚洲专一区二区三区| 国产精品高清亚洲| 欧美二区在线观看| 成人av在线电影| 五月天激情综合网| 国产精品国产自产拍在线| 欧美精品久久99| 91视频com| 精品在线你懂的| 亚洲一区二区三区四区在线免费观看| 日韩欧美在线一区二区三区| 91麻豆国产福利精品| 久久99热99| 亚洲综合一二区| 中文字幕av一区二区三区免费看 | 91丨九色丨国产丨porny| 亚洲高清在线精品| 国产视频不卡一区| 欧美一卡二卡在线| 色八戒一区二区三区| 成人网在线播放| 久久成人羞羞网站| 日韩中文字幕91| 亚洲国产一区二区在线播放| 国产精品污网站| 久久亚洲精精品中文字幕早川悠里| 欧美自拍偷拍一区| 97久久超碰精品国产| 成人综合在线观看| 黄一区二区三区| 久久精品久久99精品久久| 天天色图综合网| 亚洲第一电影网| 亚洲自拍偷拍九九九| 一区二区三区在线观看国产| 欧美激情一区二区三区全黄| xnxx国产精品| 久久夜色精品国产噜噜av| 日韩午夜电影av| 欧美成人bangbros| 日韩欧美一区在线| 欧美第一区第二区| 日韩一区二区免费在线观看| 欧美精品亚洲二区| 91精品国产91久久综合桃花| 欧美老女人第四色| 欧美二区在线观看| 欧美一区二区免费视频| 欧美喷潮久久久xxxxx| 在线成人午夜影院| 日韩欧美高清一区| 精品福利一二区| 欧美国产日产图区| 中文字幕在线不卡一区二区三区| 中文字幕在线免费不卡| 成人欧美一区二区三区小说| 亚洲日本在线看| 亚洲午夜久久久久久久久久久| 亚洲小说春色综合另类电影| 亚洲超丰满肉感bbw| 日本在线不卡视频| 精品一区二区三区在线观看| 国产精品一级片在线观看| 国产成人av网站| 99热这里都是精品| 欧美中文字幕不卡| 日韩三级在线免费观看| 精品国产免费人成在线观看| 国产精品乱人伦| 亚洲一区二区在线视频| 久久精品国产99久久6| 成人免费高清视频在线观看| 欧美在线视频全部完| 欧美电影免费观看高清完整版在线 | 成人黄色av电影| 色悠悠久久综合| 91精品国产综合久久久蜜臀粉嫩| 2020国产精品自拍| 一区精品在线播放| 亚洲超碰97人人做人人爱| 黄色日韩网站视频| 日本精品一区二区三区四区的功能| 91精品国产一区二区三区香蕉| 久久老女人爱爱| 性做久久久久久免费观看| 国产精品亚洲专一区二区三区| 欧美亚洲一区三区| 精品国产网站在线观看| 亚洲精品成人精品456| 精品在线你懂的| 欧美午夜精品一区| 久久人人爽人人爽| 亚洲电影中文字幕在线观看| 国产一区不卡视频| 欧美日韩精品一区二区天天拍小说| 精品播放一区二区| 亚洲在线中文字幕| 成人一区二区三区在线观看 | 日韩片之四级片| 亚洲精品视频自拍| 丰满岳乱妇一区二区三区| 精品视频1区2区| 国产精品久久久久影院老司| 精品一区二区在线视频| 欧美日韩在线综合| 亚洲婷婷在线视频| 国产91富婆露脸刺激对白| 日韩午夜激情视频| 性感美女久久精品| 欧美综合色免费| 亚洲视频在线一区| 成人午夜视频网站| 久久精品夜夜夜夜久久| 人人狠狠综合久久亚洲| 欧美日韩免费观看一区三区| 国产精品国产a级| 国产高清不卡一区二区| 欧美精品一区二区三区视频| 日韩激情在线观看| 欧美在线色视频| 伊人色综合久久天天人手人婷| 成人小视频免费在线观看| 久久综合九色综合欧美就去吻| 男人操女人的视频在线观看欧美| 欧美日韩色综合| 亚洲国产sm捆绑调教视频| 欧美专区日韩专区| 亚洲精品菠萝久久久久久久| 91小视频免费看| 亚洲欧洲制服丝袜| 欧美伊人精品成人久久综合97| 亚洲视频 欧洲视频| 色婷婷av一区二区三区之一色屋| 国产精品久久久久一区二区三区 | 成人丝袜18视频在线观看| 久久一区二区三区四区| 国产激情91久久精品导航|