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

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

?? pas2_pcm.c

?? 內核是系統的心臟
?? C
字號:
#define _PAS2_PCM_C_
/*
 * sound/pas2_pcm.c
 * 
 * The low level driver for the Pro Audio Spectrum ADC/DAC.
 * 
 * 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

#include "pas.h"

#if !defined(EXCLUDE_PAS) && !defined(EXCLUDE_AUDIO)

#define TRACE(WHAT)		/* (WHAT) */

#define PAS_PCM_INTRBITS (0x08)
/* Sample buffer timer interrupt enable */

#define PCM_NON	0
#define PCM_DAC	1
#define PCM_ADC	2

static unsigned long pcm_speed = 0;	/* sampling rate */
static unsigned char pcm_channels = 1;	/* channels/sample (1 or 2) */
static unsigned char pcm_bits = 8;	/* bits/sample (8 or 16) */
static unsigned char pcm_filter = 0;	/* filter FLAG */
static unsigned char pcm_mode = PCM_NON;
static unsigned long pcm_count = 0;
static unsigned short pcm_bitsok = 8;	/* mask of OK bits */
static int      my_devnum = 0;

int
pcm_set_speed (int arg)
{
  int             foo, tmp;
  unsigned long   flags;

  if (arg > 44100)
    arg = 44100;
  if (arg < 5000)
    arg = 5000;

  foo = 1193180 / arg;
  arg = 1193180 / foo;

  if (pcm_channels & 2)
    foo = foo >> 1;

  pcm_speed = arg;

  tmp = pas_read (FILTER_FREQUENCY);

  DISABLE_INTR (flags);

  pas_write (tmp & ~(F_F_PCM_RATE_COUNTER | F_F_PCM_BUFFER_COUNTER), FILTER_FREQUENCY);
  pas_write (S_C_C_SAMPLE_RATE | S_C_C_LSB_THEN_MSB | S_C_C_SQUARE_WAVE, SAMPLE_COUNTER_CONTROL);
  pas_write (foo & 0xff, SAMPLE_RATE_TIMER);
  pas_write ((foo >> 8) & 0xff, SAMPLE_RATE_TIMER);
  pas_write (tmp, FILTER_FREQUENCY);

  RESTORE_INTR (flags);

  return pcm_speed;
}

int
pcm_set_channels (int arg)
{

  if ((arg != 1) && (arg != 2))
    return pcm_channels;

  if (arg != pcm_channels)
    {
      pas_write (pas_read (PCM_CONTROL) ^ P_C_PCM_MONO, PCM_CONTROL);

      pcm_channels = arg;
      pcm_set_speed (pcm_speed);/* The speed must be reinitialized */
    }

  return pcm_channels;
}

int
pcm_set_bits (int arg)
{
  if ((arg & pcm_bitsok) != arg)
    return pcm_bits;

  if (arg != pcm_bits)
    {
      pas_write (pas_read (SYSTEM_CONFIGURATION_2) ^ S_C_2_PCM_16_BIT, SYSTEM_CONFIGURATION_2);

      pcm_bits = arg;
    }

  return pcm_bits;
}

static int
pas_pcm_ioctl (int dev, unsigned int cmd, unsigned int arg, int local)
{
  TRACE (printk ("pas2_pcm.c: static int pas_pcm_ioctl(unsigned int cmd = %X, unsigned int arg = %X)\n", cmd, arg));

  switch (cmd)
    {
    case SOUND_PCM_WRITE_RATE:
      if (local)
	return pcm_set_speed (arg);
      return IOCTL_OUT (arg, pcm_set_speed (IOCTL_IN (arg)));
      break;

    case SOUND_PCM_READ_RATE:
      if (local)
	return pcm_speed;
      return IOCTL_OUT (arg, pcm_speed);
      break;

    case SNDCTL_DSP_STEREO:
      if (local)
	return pcm_set_channels (arg + 1) - 1;
      return IOCTL_OUT (arg, pcm_set_channels (IOCTL_IN (arg) + 1) - 1);
      break;

    case SOUND_PCM_WRITE_CHANNELS:
      if (local)
         return pcm_set_channels (arg);
      return IOCTL_OUT (arg, pcm_set_channels (IOCTL_IN (arg)));
      break;

    case SOUND_PCM_READ_CHANNELS:
      if (local)
	return pcm_channels;
      return IOCTL_OUT (arg, pcm_channels);
      break;

    case SNDCTL_DSP_SAMPLESIZE:
      if (local)
	return pcm_set_bits (arg);
      return IOCTL_OUT (arg, pcm_set_bits (IOCTL_IN (arg)));
      break;

    case SOUND_PCM_READ_BITS:
      if (local)
	return pcm_bits;
      return IOCTL_OUT (arg, pcm_bits);

    case SOUND_PCM_WRITE_FILTER:	/* NOT YET IMPLEMENTED */
      if (IOCTL_IN (arg) > 1)
	return IOCTL_OUT (arg, RET_ERROR (EINVAL));
      break;

      pcm_filter = IOCTL_IN (arg);
    case SOUND_PCM_READ_FILTER:
      return IOCTL_OUT (arg, pcm_filter);
      break;

    default:
      return RET_ERROR (EINVAL);
    }

  return RET_ERROR (EINVAL);
}

static void
pas_pcm_reset (int dev)
{
  TRACE (printk ("pas2_pcm.c: static void pas_pcm_reset(void)\n"));

  pas_write (pas_read (PCM_CONTROL) & ~P_C_PCM_ENABLE, PCM_CONTROL);
}

static int
pas_pcm_open (int dev, int mode)
{
  int             err;

  TRACE (printk ("pas2_pcm.c: static int pas_pcm_open(int mode = %X)\n", mode));

  if ((err = pas_set_intr (PAS_PCM_INTRBITS)) < 0)
    return err;

  if (!DMAbuf_open_dma (dev))
    {
      pas_remove_intr (PAS_PCM_INTRBITS);
      return RET_ERROR (EBUSY);
    }

  pcm_count = 0;

  return 0;
}

static void
pas_pcm_close (int dev)
{
  unsigned long   flags;

  TRACE (printk ("pas2_pcm.c: static void pas_pcm_close(void)\n"));

  DISABLE_INTR (flags);

  pas_pcm_reset (dev);
  DMAbuf_close_dma (dev);
  pas_remove_intr (PAS_PCM_INTRBITS);
  pcm_mode = PCM_NON;

  RESTORE_INTR (flags);
}

static void
pas_pcm_output_block (int dev, unsigned long buf, int count, 
		      int intrflag, int restart_dma)
{
  unsigned long   flags, cnt;

  TRACE (printk ("pas2_pcm.c: static void pas_pcm_output_block(char *buf = %P, int count = %X)\n", buf, count));

  cnt = count;
  if (sound_dsp_dmachan[dev] > 3)
    cnt >>= 1;

  if (sound_dma_automode[dev] &&
      intrflag &&
      cnt == pcm_count)
    return;			/* Auto mode on. No need to react */

  DISABLE_INTR (flags);

  pas_write (pas_read (PCM_CONTROL) & ~P_C_PCM_ENABLE,
	     PCM_CONTROL);

  if (restart_dma) 
     DMAbuf_start_dma (dev, buf, count, DMA_MODE_WRITE);

  if (sound_dsp_dmachan[dev] > 3)
    count >>= 1;

  if (count != pcm_count)
    {
      pas_write (pas_read (FILTER_FREQUENCY) & ~F_F_PCM_BUFFER_COUNTER, FILTER_FREQUENCY);
      pas_write (S_C_C_SAMPLE_BUFFER | S_C_C_LSB_THEN_MSB | S_C_C_SQUARE_WAVE, SAMPLE_COUNTER_CONTROL);
      pas_write (count & 0xff, SAMPLE_BUFFER_COUNTER);
      pas_write ((count >> 8) & 0xff, SAMPLE_BUFFER_COUNTER);
      pas_write (pas_read (FILTER_FREQUENCY) | F_F_PCM_BUFFER_COUNTER, FILTER_FREQUENCY);

      pcm_count = count;
    }
  pas_write (pas_read (FILTER_FREQUENCY) | F_F_PCM_BUFFER_COUNTER | F_F_PCM_RATE_COUNTER, FILTER_FREQUENCY);
  pas_write (pas_read (PCM_CONTROL) | P_C_PCM_ENABLE | P_C_PCM_DAC_MODE, PCM_CONTROL);

  pcm_mode = PCM_DAC;

  RESTORE_INTR (flags);
}

static void
pas_pcm_start_input (int dev, unsigned long buf, int count, 
		     int intrflag, int restart_dma)
{
  unsigned long   flags;
  int             cnt;

  TRACE (printk ("pas2_pcm.c: static void pas_pcm_start_input(char *buf = %P, int count = %X)\n", buf, count));

  cnt = count;
  if (sound_dsp_dmachan[dev] > 3)
    cnt >>= 1;

  if (sound_dma_automode[my_devnum] &&
      intrflag &&
      cnt == pcm_count)
    return;			/* Auto mode on. No need to react */

  DISABLE_INTR (flags);

  if (restart_dma)
     DMAbuf_start_dma (dev, buf, count, DMA_MODE_READ);

  if (sound_dsp_dmachan[dev] > 3)
    count >>= 1;

  if (count != pcm_count)
    {
      pas_write (pas_read (FILTER_FREQUENCY) & ~F_F_PCM_BUFFER_COUNTER, FILTER_FREQUENCY);
      pas_write (S_C_C_SAMPLE_BUFFER | S_C_C_LSB_THEN_MSB | S_C_C_SQUARE_WAVE, SAMPLE_COUNTER_CONTROL);
      pas_write (count & 0xff, SAMPLE_BUFFER_COUNTER);
      pas_write ((count >> 8) & 0xff, SAMPLE_BUFFER_COUNTER);
      pas_write (pas_read (FILTER_FREQUENCY) | F_F_PCM_BUFFER_COUNTER, FILTER_FREQUENCY);

      pcm_count = count;
    }
  pas_write (pas_read (FILTER_FREQUENCY) | F_F_PCM_BUFFER_COUNTER | F_F_PCM_RATE_COUNTER, FILTER_FREQUENCY);
  pas_write ((pas_read (PCM_CONTROL) | P_C_PCM_ENABLE) & ~P_C_PCM_DAC_MODE, PCM_CONTROL);

  pcm_mode = PCM_ADC;

  RESTORE_INTR (flags);
}

static int
pas_pcm_prepare_for_input (int dev, int bsize, int bcount)
{
  return 0;
}
static int
pas_pcm_prepare_for_output (int dev, int bsize, int bcount)
{
  return 0;
}

static struct audio_operations pas_pcm_operations =
{
  "Pro Audio Spectrum",
  pas_pcm_open,			/* */
  pas_pcm_close,		/* */
  pas_pcm_output_block,		/* */
  pas_pcm_start_input,		/* */
  pas_pcm_ioctl,		/* */
  pas_pcm_prepare_for_input,	/* */
  pas_pcm_prepare_for_output,	/* */
  pas_pcm_reset,		/* */
  pas_pcm_reset,		/* halt_xfer */
  NULL,				/* has_output_drained */
  NULL				/* copy_from_user */
};

long
pas_pcm_init (long mem_start, struct address_info *hw_config)
{
  TRACE (printk ("pas2_pcm.c: long pas_pcm_init(long mem_start = %X)\n", mem_start));

  pcm_bitsok = 8;
  if (pas_read (OPERATION_MODE_1) & O_M_1_PCM_TYPE)
    pcm_bitsok |= 16;

  pcm_set_speed (DSP_DEFAULT_SPEED);

  if (num_dspdevs < MAX_DSP_DEV)
    {
      dsp_devs[my_devnum = num_dspdevs++] = &pas_pcm_operations;
      sound_dsp_dmachan[my_devnum] = hw_config->dma;
#ifndef PAS_NO_AUTODMA
      if (hw_config->dma > 3)
	{
	  sound_buffcounts[my_devnum] = 1;
	  sound_buffsizes[my_devnum] = 2 * 65536;
	  sound_dma_automode[my_devnum] = 1;
	}
      else
	{
	  sound_buffcounts[my_devnum] = 1;
	  sound_buffsizes[my_devnum] = DSP_BUFFSIZE;
	  sound_dma_automode[my_devnum] = 1;
	}
#else
	  sound_buffcounts[my_devnum] = 2;
	  sound_buffsizes[my_devnum] = DSP_BUFFSIZE;
	  sound_dma_automode[my_devnum] = 0;
#endif
    }
  else
    printk ("PAS2: Too many PCM devices available\n");

  return mem_start;
}

void
pas_pcm_interrupt (unsigned char status, int cause)
{
  if (cause == 1)		/* PCM buffer done */
    {
      /*
       * Halt the PCM first. Otherwise we don't have time to start a new
       * block before the PCM chip proceeds to the next sample
       */

      if (!sound_dma_automode[my_devnum])
	{
	  pas_write (pas_read (PCM_CONTROL) & ~P_C_PCM_ENABLE,
		     PCM_CONTROL);
	}

      switch (pcm_mode)
	{

	case PCM_DAC:
	  DMAbuf_outputintr (my_devnum, 1);
	  break;

	case PCM_ADC:
	  DMAbuf_inputintr (my_devnum);
	  break;

	default:
	  printk ("PAS: Unexpected PCM interrupt\n");
	}
    }
}

#endif

#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲精品免费在线播放| 2024国产精品视频| 亚洲欧美aⅴ...| 91免费视频网址| 一区免费观看视频| 欧美在线免费视屏| 天天综合天天做天天综合| 在线不卡a资源高清| 毛片av中文字幕一区二区| 久久九九国产精品| 成人av网站在线观看| 玉足女爽爽91| 欧美不卡123| 成人免费看片app下载| 一区二区三区久久久| 欧美日本韩国一区| 国产一区二区三区四区五区入口 | 国产精品久久久久一区二区三区共 | 亚洲精品一区二区三区四区高清| 国产乱色国产精品免费视频| 中文字幕日韩一区| 制服.丝袜.亚洲.另类.中文| 国产精品一区二区x88av| 国产精品二区一区二区aⅴ污介绍| 在线观看av不卡| 另类成人小视频在线| 国产精品久久久爽爽爽麻豆色哟哟| 91福利资源站| 美女视频黄 久久| 亚洲少妇中出一区| 日韩视频永久免费| 99久久777色| 美女www一区二区| 日韩美女啊v在线免费观看| 欧美精品欧美精品系列| 成人动漫一区二区三区| 爽好多水快深点欧美视频| 中文字幕欧美区| 欧美一级午夜免费电影| 97se亚洲国产综合在线| 国产综合久久久久久鬼色| 亚洲与欧洲av电影| 日本一区二区动态图| 欧美一级精品在线| 在线视频综合导航| 成人国产电影网| 久久精品国产色蜜蜜麻豆| 夜夜嗨av一区二区三区网页| 国产亚洲欧洲一区高清在线观看| 欧美一三区三区四区免费在线看| 91视频你懂的| 国产一区二区三区免费播放| 免费在线看一区| 亚洲国产中文字幕| 亚洲欧美视频在线观看| 久久久久青草大香线综合精品| 欧美精品一卡两卡| 欧美最新大片在线看| kk眼镜猥琐国模调教系列一区二区 | 裸体歌舞表演一区二区| 亚洲一区二区三区三| 亚洲人成在线播放网站岛国| 国产亚洲精久久久久久| 久久网站热最新地址| 日韩欧美一二区| 欧美一卡二卡在线| 91精品蜜臀在线一区尤物| 欧美视频你懂的| 欧美视频中文一区二区三区在线观看| 99精品久久免费看蜜臀剧情介绍| 国产成人在线观看| 国产精品1区2区3区在线观看| 捆绑变态av一区二区三区| 三级一区在线视频先锋| 石原莉奈在线亚洲二区| 日韩国产精品久久久| 日韩激情av在线| 日韩和欧美一区二区三区| 日韩电影在线观看网站| 日韩中文字幕亚洲一区二区va在线 | 国产在线视频精品一区| 精品一区二区三区日韩| 精品写真视频在线观看| 九九精品一区二区| 国产原创一区二区| 高清日韩电视剧大全免费| caoporn国产一区二区| 99热精品一区二区| 欧美性猛片xxxx免费看久爱| 欧美男人的天堂一二区| 欧美一区二区三区在线| 欧美成人高清电影在线| 国产午夜久久久久| 亚洲色图在线播放| 亚洲国产成人av网| 看电视剧不卡顿的网站| 国产999精品久久久久久绿帽| 成人免费高清在线| 欧美制服丝袜第一页| 91精品在线麻豆| 久久丝袜美腿综合| 亚洲私人影院在线观看| 午夜国产精品影院在线观看| 久久国产综合精品| 成人aaaa免费全部观看| 欧美日韩国产综合一区二区三区| 日韩欧美在线123| 国产精品久久久久aaaa樱花| 亚洲成人综合在线| 国产91丝袜在线18| 日本丰满少妇一区二区三区| 日韩一区二区三区电影| 国产精品欧美综合在线| 亚洲成人资源在线| 夫妻av一区二区| 911国产精品| 中文字幕亚洲电影| 日本成人在线网站| 91影视在线播放| 欧美大片在线观看一区| 亚洲精品欧美专区| 黄色精品一二区| 欧美日韩精品综合在线| 欧美国产日韩a欧美在线观看| 午夜激情一区二区| 99麻豆久久久国产精品免费| 色香蕉成人二区免费| 欧美一区二区三区四区久久| 最新久久zyz资源站| 麻豆精品一区二区综合av| 一本一道久久a久久精品| 久久久久国产精品人| 亚洲bt欧美bt精品| gogo大胆日本视频一区| www成人在线观看| 天天色天天操综合| 91麻豆免费观看| 久久久噜噜噜久噜久久综合| 午夜精品久久久久影视| 色综合久久综合中文综合网| 国产日本一区二区| 美美哒免费高清在线观看视频一区二区 | 美脚の诱脚舐め脚责91| 欧美性淫爽ww久久久久无| 中文字幕第一区二区| 久99久精品视频免费观看| 欧美精品黑人性xxxx| 亚洲一区二区三区自拍| 91一区二区三区在线观看| 久久精品无码一区二区三区| 美女在线视频一区| 欧美一级夜夜爽| 日本亚洲免费观看| 在线不卡欧美精品一区二区三区| 亚洲一区二区三区视频在线播放| 91麻豆国产福利在线观看| 中文av一区二区| 国产二区国产一区在线观看| 久久久一区二区| 国产在线精品一区二区不卡了 | 欧美性大战久久久| 一区二区三区免费在线观看| 91免费在线看| 亚洲欧美aⅴ...| 在线视频你懂得一区| 亚洲午夜激情av| 欧美精品久久久久久久多人混战| 亚洲国产精品一区二区www | 久久国产精品无码网站| 欧美高清视频一二三区| 日韩不卡一二三区| 日韩欧美在线123| 蜜臀久久99精品久久久久久9| 欧美一区二区国产| 国内欧美视频一区二区| 久久综合色播五月| 国产精品18久久久| 日韩毛片视频在线看| 色天使色偷偷av一区二区| 亚洲综合丁香婷婷六月香| 欧美二区三区91| 国精品**一区二区三区在线蜜桃| 久久综合九色综合欧美亚洲| 成人av高清在线| 一区二区三区免费网站| 欧美精品123区| 国产真实乱子伦精品视频| 欧美高清在线一区| 在线一区二区观看| 日韩av高清在线观看| 久久久一区二区三区| 色综合色狠狠综合色| 日韩不卡一区二区| 国产欧美中文在线| 欧洲一区二区av| 蜜臀av性久久久久蜜臀aⅴ流畅 | 一区二区三区波多野结衣在线观看| 欧美日韩综合在线免费观看| 久久精品国产亚洲高清剧情介绍 | 亚洲综合一区二区三区|