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

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

?? sound_switch.c

?? LINUX1.0源代碼,代碼條理清晰
?? C
字號:
/*
 * sound/sound_switch.c
 * 
 * The system call switch
 * 
 * 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

struct sbc_device
{
  int             usecount;
};

static struct sbc_device sbc_devices[SND_NDEVS] = {{0}};

static int      in_use = 0;	/* Total # of open device files (excluding
				 * minor 0) */

/*
 * /dev/sndstatus -device
 */
static char    *status_buf = NULL;
static int      status_len, status_ptr;
static int      status_busy = 0;

static int
put_status (char *s)
{
  int             l;

  for (l=0;l<256,s[l];l++);	/* l=strlen(s); */

  if (status_len + l >= 4000)
    return 0;

  memcpy (&status_buf[status_len], s, l);
  status_len += l;

  return 1;
}

static int
put_status_int (unsigned int val, int radix)
{
  int             l, v;

  static char hx[] = "0123456789abcdef";
  char buf[11];

  if (!val) return put_status("0");

  l = 0;
  buf[10]=0;

  while (val)
  {
  	v = val % radix;
  	val = val / radix;

  	buf[9-l] = hx[v];
  	l++;
  }

  if (status_len + l >= 4000)
    return 0;

  memcpy (&status_buf[status_len], &buf[10-l], l);
  status_len += l;

  return 1;
}

static void
init_status (void)
{
  /*
   * Write the status information to the status_buf and update status_len.
   * There is a limit of 4000 bytes for the data.
   */

  int             i;

  status_ptr = 0;

  put_status ("Sound Driver:" SOUND_VERSION_STRING
	      " (" SOUND_CONFIG_DATE " " SOUND_CONFIG_BY "@"
	      SOUND_CONFIG_HOST "." SOUND_CONFIG_DOMAIN ")"
	      "\n");

  if (!put_status ("Config options: "))
    return;
  if (!put_status_int(SELECTED_SOUND_OPTIONS, 16))
     return;

  if (!put_status ("\n\nHW config: \n"))
    return;

  for (i = 0; i < (num_sound_drivers - 1); i++)
    {
      if (!supported_drivers[i].enabled) 
      if (!put_status ("("))
	return;

      if (!put_status ("Type ")) return;
      if (!put_status_int(supported_drivers[i].card_type, 10)) return;
      if (!put_status (": ")) return;
      if (!put_status (supported_drivers[i].name)) return;
      if (!put_status (" at 0x")) return;
      if (!put_status_int(supported_drivers[i].config.io_base, 16)) return;
      if (!put_status (" irq ")) return;
      if (!put_status_int(supported_drivers[i].config.irq, 10)) return;
      if (!put_status (" drq ")) return;
      if (!put_status_int(supported_drivers[i].config.dma, 10)) return;

      if (!supported_drivers[i].enabled) 
      if (!put_status (")"))
	return;

      if (!put_status ("\n"))
	return;
    }

  if (!put_status ("\nPCM devices:\n"))
    return;

  for (i = 0; i < num_dspdevs; i++)
    {
      if (!put_status_int(i, 10)) return;
      if (!put_status(": "))return;
      if (!put_status(dsp_devs[i]->name))return;
      if (!put_status("\n"))return;
    }

  if (!put_status ("\nSynth devices:\n"))
    return;

  for (i = 0; i < num_synths; i++)
    {
      if (!put_status_int(i, 10)) return;
      if (!put_status(": "))return;
      if (!put_status(synth_devs[i]->info->name))return;
      if (!put_status("\n"))return;
    }

  if (!put_status ("\nMidi devices:\n"))
    return;

  for (i = 0; i < num_midis; i++)
    {
      if (!put_status_int(i, 10)) return;
      if (!put_status(": "))return;
      if (!put_status(midi_devs[i]->info.name))return;
      if (!put_status("\n"))return;
    }

  if (num_mixers)
    {
      if (!put_status ("\nMixer(s) installed\n"))
	return;
    }
  else
    {
      if (!put_status ("\nNo mixers installed\n"))
	return;
    }
}

static int
read_status (snd_rw_buf *buf, int count)
{
  /*
   * Return at most 'count' bytes from the status_buf.
   */
  int             l, c;

  l = count;
  c = status_len - status_ptr;

  if (l > c)
    l = c;
  if (l <= 0)
    return 0;

  COPY_TO_USER(buf, 0, &status_buf[status_ptr], l);
  status_ptr += l;

  return l;
}

int
sound_read_sw (int dev, struct fileinfo *file, snd_rw_buf *buf, int count)
{
  DEB (printk ("sound_read_sw(dev=%d, count=%d)\n", dev, count));

  switch (dev & 0x0f)
    {
    case SND_DEV_STATUS:
      return read_status (buf, count);
      break;

    case SND_DEV_DSP:
    case SND_DEV_DSP16:
    case SND_DEV_AUDIO:
      return audio_read (dev, file, buf, count);
      break;

    case SND_DEV_SEQ:
      return sequencer_read (dev, file, buf, count);
      break;

#ifndef EXCLUDE_MPU401
    case SND_DEV_MIDIN:
      return MIDIbuf_read (dev, file, buf, count);
#endif

    default:
      printk ("Sound: Undefined minor device %d\n", dev);
    }

  return RET_ERROR (EPERM);
}

int
sound_write_sw (int dev, struct fileinfo *file, snd_rw_buf *buf, int count)
{

  DEB (printk ("sound_write_sw(dev=%d, count=%d)\n", dev, count));

  switch (dev & 0x0f)
    {

    case SND_DEV_SEQ:
      return sequencer_write (dev, file, buf, count);
      break;

    case SND_DEV_DSP:
    case SND_DEV_DSP16:
    case SND_DEV_AUDIO:
      return audio_write (dev, file, buf, count);
      break;

    default:
      return RET_ERROR (EPERM);
    }

  return count;
}

int
sound_open_sw (int dev, struct fileinfo *file)
{
  int             retval;
  DEB (printk ("sound_open_sw(dev=%d) : usecount=%d\n", dev, sbc_devices[dev].usecount));

  if ((dev >= SND_NDEVS) || (dev < 0))
    {
      printk ("Invalid minor device %d\n", dev);
      return RET_ERROR (ENXIO);
    }

  switch (dev & 0x0f)
    {
    case SND_DEV_STATUS:
      if (status_busy)
	return RET_ERROR (EBUSY);
      status_busy = 1;
      if ((status_buf = (char *) KERNEL_MALLOC (4000)) == NULL)
	return RET_ERROR (EIO);
      status_len = status_ptr = 0;
      init_status ();
      break;

    case SND_DEV_CTL:
      return 0;
      break;

    case SND_DEV_SEQ:
      if ((retval = sequencer_open (dev, file)) < 0)
	return retval;
      break;

#ifndef EXCLUDE_MPU401
    case SND_DEV_MIDIN:
      if ((retval = MIDIbuf_open (dev, file)) < 0)
	return retval;
      break;
#endif

    case SND_DEV_DSP:
    case SND_DEV_DSP16:
    case SND_DEV_AUDIO:
      if ((retval = audio_open (dev, file)) < 0)
	return retval;
      break;

    default:
      printk ("Invalid minor device %d\n", dev);
      return RET_ERROR (ENXIO);
    }

  sbc_devices[dev].usecount++;
  in_use++;

  return 0;
}

void
sound_release_sw (int dev, struct fileinfo *file)
{

  DEB (printk ("sound_release_sw(dev=%d)\n", dev));

  switch (dev & 0x0f)
    {
    case SND_DEV_STATUS:
      if (status_buf)
	KERNEL_FREE (status_buf);
      status_buf = NULL;
      status_busy = 0;
      break;

    case SND_DEV_CTL:
      break;

    case SND_DEV_SEQ:
      sequencer_release (dev, file);
      break;

#ifndef EXCLUDE_MPU401
    case SND_DEV_MIDIN:
      MIDIbuf_release (dev, file);
      break;
#endif

    case SND_DEV_DSP:
    case SND_DEV_DSP16:
    case SND_DEV_AUDIO:
      audio_release (dev, file);
      break;

    default:
      printk ("Sound error: Releasing unknown device 0x%02x\n", dev);
    }

  sbc_devices[dev].usecount--;
  in_use--;
}

int
sound_ioctl_sw (int dev, struct fileinfo *file,
	     unsigned int cmd, unsigned long arg)
{
  DEB (printk ("sound_ioctl_sw(dev=%d, cmd=0x%x, arg=0x%x)\n", dev, cmd, arg));

  switch (dev & 0x0f)
    {

    case SND_DEV_CTL:

      if (!num_mixers)
	return RET_ERROR (ENXIO);

      if ((dev >> 4) >= num_mixers)
	return RET_ERROR (ENXIO);

      return mixer_devs[dev >> 4]->ioctl (dev >> 4, cmd, arg);
      break;

    case SND_DEV_SEQ:
      return sequencer_ioctl (dev, file, cmd, arg);
      break;

    case SND_DEV_DSP:
    case SND_DEV_DSP16:
    case SND_DEV_AUDIO:
      return audio_ioctl (dev, file, cmd, arg);
      break;

#ifndef EXCLUDE_MPU401
    case SND_DEV_MIDIN:
      return MIDIbuf_ioctl (dev, file, cmd, arg);
      break;
#endif

    default:
      return RET_ERROR (EPERM);
      break;
    }

  return RET_ERROR (EPERM);
}
#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲三级免费电影| 午夜视频在线观看一区二区 | 国产欧美日韩在线看| 欧美不卡激情三级在线观看| 6080亚洲精品一区二区| 在线免费观看视频一区| 一本一道综合狠狠老| 色视频成人在线观看免| 色噜噜夜夜夜综合网| 91福利在线免费观看| 91小视频免费看| caoporen国产精品视频| 韩国成人福利片在线播放| 久久超碰97人人做人人爱| 久久99国产精品麻豆| 国产成人在线免费观看| 成人免费观看视频| 色国产综合视频| 5858s免费视频成人| 日韩色在线观看| 久久综合精品国产一区二区三区| 久久亚区不卡日本| 国产精品理伦片| 亚洲成人自拍网| 国产一区二区导航在线播放| youjizz久久| 欧美精品色综合| 久久久噜噜噜久久中文字幕色伊伊 | 国产一区中文字幕| 99国产精品视频免费观看| 色狠狠综合天天综合综合| 国产精品一区二区果冻传媒| 波多野结衣的一区二区三区| 欧美区在线观看| 国产亚洲精品aa午夜观看| 亚洲精品日韩综合观看成人91| 视频一区在线视频| 国产大片一区二区| 在线观看国产一区二区| 欧美sm极限捆绑bd| 一区二区在线看| 国产麻豆精品久久一二三| 91精品福利视频| 精品国产乱码久久久久久牛牛| 亚洲欧美激情在线| 国产在线精品一区二区夜色| 91精彩视频在线观看| 久久久精品2019中文字幕之3| 亚洲午夜久久久久久久久电影院 | 午夜精品在线视频一区| 国产剧情一区在线| 欧美精品tushy高清| 国产精品嫩草影院com| 日韩精品乱码av一区二区| 白白色亚洲国产精品| 久久综合九色综合97婷婷女人 | 一区二区免费看| 丰满放荡岳乱妇91ww| 日韩精品一区二区三区swag | 国产ts人妖一区二区| 欧美一级理论性理论a| 亚洲欧美国产77777| 不卡在线观看av| 久久蜜桃av一区二区天堂| 国产精品国产三级国产有无不卡| 国产综合成人久久大片91| 欧美精品v国产精品v日韩精品 | 樱花影视一区二区| 大白屁股一区二区视频| 美女尤物国产一区| 欧美tk—视频vk| 麻豆精品视频在线| 欧美一区二视频| 日av在线不卡| 精品福利一区二区三区免费视频| 午夜国产不卡在线观看视频| 欧美亚洲愉拍一区二区| 一区二区三区中文在线观看| 99re成人精品视频| 亚洲欧美色一区| 色婷婷精品久久二区二区蜜臂av| 日本一区免费视频| 成人精品视频.| 中文字幕在线观看不卡| 成人午夜av在线| 中文字幕一区av| 色综合视频在线观看| 一区二区欧美精品| 欧美乱妇一区二区三区不卡视频| 亚洲国产精品影院| 宅男噜噜噜66一区二区66| 免费的成人av| 亚洲国产成人午夜在线一区| 91一区二区三区在线播放| 综合欧美一区二区三区| 91久久免费观看| 日本 国产 欧美色综合| 久久久影院官网| 91蜜桃视频在线| 午夜精品视频在线观看| 精品欧美久久久| 成人aaaa免费全部观看| 亚洲国产人成综合网站| 91精品国产色综合久久ai换脸| 蜜臀a∨国产成人精品| 中文字幕va一区二区三区| 欧美视频在线播放| 国产综合一区二区| 亚洲一区二区在线视频| 欧美大黄免费观看| 91性感美女视频| 蜜桃久久av一区| 一区二区三区四区中文字幕| 日韩欧美一二区| 色综合天天综合| 看片的网站亚洲| 亚洲精品菠萝久久久久久久| 日韩欧美一区在线| 91视视频在线观看入口直接观看www | 777色狠狠一区二区三区| 国内精品国产成人| 一区二区三区在线不卡| 久久久午夜精品| 欧美性三三影院| 粉嫩av一区二区三区| 亚洲电影一区二区三区| 精品国产乱码久久久久久牛牛| 色综合中文字幕| 国产精品一区不卡| 日本欧美韩国一区三区| 1区2区3区精品视频| 久久综合九色欧美综合狠狠| 一本在线高清不卡dvd| 国产一区91精品张津瑜| 午夜精品一区二区三区三上悠亚| 国产精品成人免费| 精品久久国产老人久久综合| 欧美日韩在线综合| 波多野结衣视频一区| 国产福利电影一区二区三区| 奇米色777欧美一区二区| 亚洲精品成a人| 亚洲三级理论片| 国产精品国产精品国产专区不蜜| 欧美精品一区二区精品网| 在线观看91av| 欧美日韩精品综合在线| 一本大道久久a久久精二百| 成人午夜伦理影院| 风间由美中文字幕在线看视频国产欧美| 热久久国产精品| 喷水一区二区三区| av高清久久久| 日韩激情在线观看| 午夜视频一区在线观看| 午夜av区久久| 六月丁香婷婷色狠狠久久| 日韩高清一级片| 美女脱光内衣内裤视频久久影院| 美腿丝袜亚洲综合| 精品一区中文字幕| 高清视频一区二区| 成人av资源在线| 91浏览器打开| 欧美高清视频一二三区| 337p亚洲精品色噜噜| 精品国产1区2区3区| 国产日韩欧美在线一区| 国产精品免费观看视频| 日韩理论片网站| 亚洲国产精品欧美一二99| 日日夜夜一区二区| 精品在线观看免费| 国产福利91精品一区| 成人小视频在线观看| 欧美在线观看视频一区二区| 欧美男男青年gay1069videost | 日韩和欧美一区二区三区| 全部av―极品视觉盛宴亚洲| 国内精品视频666| av中文字幕在线不卡| 欧美日韩精品一区二区天天拍小说| 欧美一级在线免费| 国产精品久久久久久久岛一牛影视| 一区二区三区精品在线观看| 久久97超碰色| 欧美三级欧美一级| 国产性天天综合网| 亚洲18女电影在线观看| 精品无人区卡一卡二卡三乱码免费卡| 成人高清视频免费观看| 欧美日韩的一区二区| 国产亚洲一区二区在线观看| 亚洲欧美一区二区久久| 激情综合网av| 欧美午夜寂寞影院| 国产日韩欧美不卡在线| 亚洲在线一区二区三区| 国产成人8x视频一区二区| 欧美伦理视频网站|