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

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

?? audio.c

?? 內核是系統的心臟
?? 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高清不卡在线| 在线观看日韩毛片| 538prom精品视频线放| 日韩一级视频免费观看在线| 精品处破学生在线二十三| 日本一区二区在线不卡| 亚洲精品一卡二卡| 日韩高清不卡一区二区| 国产电影精品久久禁18| 99re视频精品| 91精品国产综合久久精品app| 欧美电影免费观看高清完整版在线观看| 欧美一区二区三区四区久久| 久久久久久久久免费| 亚洲色图都市小说| 日韩av不卡在线观看| 国产一区二区精品久久99| 一本到一区二区三区| 欧美电视剧在线看免费| 亚洲欧洲无码一区二区三区| 亚洲成人手机在线| 国产不卡高清在线观看视频| 在线一区二区视频| 久久久三级国产网站| 一区二区三区日韩欧美精品 | 中文字幕在线观看一区| 亚洲欧美日韩中文播放 | 精品国产99国产精品| 中文字幕日韩一区二区| 丝袜a∨在线一区二区三区不卡| 国产乱码精品一品二品| 欧美日韩免费一区二区三区 | 日韩欧美成人午夜| 亚洲欧洲另类国产综合| 久久精品国产99| 色综合久久久久久久| 久久久影视传媒| 亚洲成av人片在线观看| 成人avav影音| 精品国产精品一区二区夜夜嗨| 亚洲精品高清视频在线观看| 国产高清亚洲一区| 精品福利av导航| 午夜国产精品一区| 色88888久久久久久影院野外| 久久久99久久| 狠狠色狠狠色综合日日91app| 欧美日韩中文字幕精品| 亚洲精品欧美激情| 成人精品视频一区二区三区| 欧美va亚洲va国产综合| 偷拍亚洲欧洲综合| 欧美三级电影在线观看| 亚洲女人****多毛耸耸8| av电影在线不卡| 中文字幕一区av| 成人免费视频播放| 欧美韩日一区二区三区| 国产激情精品久久久第一区二区| 欧美成人猛片aaaaaaa| 青青草一区二区三区| 91精品福利在线一区二区三区 | 欧美在线免费播放| 一区二区三区四区蜜桃| 欧美在线看片a免费观看| 亚洲免费观看高清完整版在线 | 国产欧美视频一区二区三区| 国产一区不卡视频| 国产欧美一区二区精品婷婷| 国产乱码一区二区三区| 国产欧美精品一区| 成人免费av网站| 亚洲欧美日韩国产综合在线| 色婷婷狠狠综合| 亚洲成人精品影院| 欧美一级淫片007| 国产一区二区三区四区五区入口| 久久久久青草大香线综合精品| 国产又黄又大久久| 国产精品蜜臀在线观看| 91激情五月电影| 三级影片在线观看欧美日韩一区二区 | 亚洲五码中文字幕| 欧美一区二区性放荡片| 国产一区二区在线看| 国产免费久久精品| 欧美在线免费视屏| 韩国精品免费视频| 国产精品国产馆在线真实露脸| 色8久久精品久久久久久蜜| 日韩精品1区2区3区| 国产人成一区二区三区影院| 欧美在线999| 国产呦精品一区二区三区网站| 中文字幕在线一区二区三区| 欧美日韩小视频| 粗大黑人巨茎大战欧美成人| 亚洲国产精品自拍| 国产日韩在线不卡| 欧美日韩免费高清一区色橹橹| 久久超碰97中文字幕| 椎名由奈av一区二区三区| 欧美一级一级性生活免费录像| 成人福利视频在线| 久久国产精品第一页| 亚洲免费av高清| 久久婷婷成人综合色| 欧美日韩亚洲另类| 94-欧美-setu| 国产精品一区免费视频| 艳妇臀荡乳欲伦亚洲一区| 久久午夜电影网| 欧美猛男超大videosgay| av不卡在线观看| 精品无码三级在线观看视频| 亚洲精品视频在线| 中文字幕成人网| 久久综合狠狠综合| 欧美日韩免费在线视频| 91视频一区二区| 成人永久aaa| 国产福利91精品一区二区三区| 婷婷久久综合九色综合伊人色| 国产精品女人毛片| 久久精品亚洲精品国产欧美| 91精品蜜臀在线一区尤物| 91久久精品国产91性色tv| av一区二区不卡| 成人激情开心网| 国产一本一道久久香蕉| 激情综合色播激情啊| 另类中文字幕网| 日韩极品在线观看| 天堂一区二区在线免费观看| 一区二区三区精密机械公司| 亚洲欧美日韩成人高清在线一区| 亚洲国产激情av| 中文字幕中文字幕在线一区| 国产精品天美传媒沈樵| 国产精品水嫩水嫩| 国产精品理伦片| 国产精品视频在线看| 国产精品久久久久久久岛一牛影视 | 久久精品水蜜桃av综合天堂| 日韩欧美国产高清| 欧美刺激午夜性久久久久久久| 欧美一级日韩不卡播放免费| 91精品国产综合久久久久久漫画| 精品视频一区 二区 三区| 欧美三级一区二区| 欧美日韩国产成人在线91 | 精品一区二区三区在线观看| 久久精品国产精品亚洲综合| 久久精品国产77777蜜臀| 国内成人精品2018免费看| 国产不卡在线视频| 色伊人久久综合中文字幕| 精品1区2区3区| 精品久久久久久久久久久久久久久| 26uuu另类欧美| 欧美激情综合五月色丁香| 亚洲精品一二三| 蜜桃视频在线观看一区| 国产91在线看| 一本色道综合亚洲| 69堂亚洲精品首页| 国产欧美一区二区精品久导航| 亚洲欧美日韩中文播放| 手机精品视频在线观看| 国产成人综合在线观看| 色婷婷av一区二区三区gif | 欧美激情在线看| 亚洲免费视频中文字幕| 欧美aⅴ一区二区三区视频| 国产一区二区福利视频| 欧美亚洲国产一区二区三区va | 亚洲欧美激情一区二区| 视频一区二区中文字幕| 国产精品系列在线播放| 欧美视频在线一区二区三区 | 国产午夜精品在线观看| 亚洲同性gay激情无套| 日韩精品色哟哟| 粉嫩av一区二区三区在线播放| 欧美午夜精品理论片a级按摩| 国产亚洲一区二区三区四区| 亚洲成人在线免费| av一区二区三区在线| 亚洲精品一区二区三区福利| 一区二区三区色|