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

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

?? gus_wave.c

?? 內核是系統的心臟
?? C
?? 第 1 頁 / 共 5 頁
字號:

/* 
 * sound/gus_wave.c
 * 
 * Driver for the Gravis UltraSound wave table synth.
 * 
 * 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"
#include <linux/ultrasound.h>
#include "gus_hw.h"

#if defined(CONFIGURE_SOUNDCARD) && !defined(EXCLUDE_GUS)

#define MAX_SAMPLE	128
#define MAX_PATCH	256

struct voice_info
  {
    unsigned long   orig_freq;
    unsigned long   current_freq;
    unsigned long   mode;
    int             bender;
    int             bender_range;
    int             panning;
    int             midi_volume;
    unsigned int    initial_volume;
    unsigned int    current_volume;
    int             loop_irq_mode, loop_irq_parm;
#define LMODE_FINISH		1
#define LMODE_PCM		2
#define LMODE_PCM_STOP		3
    int             volume_irq_mode, volume_irq_parm;
#define VMODE_HALT		1
#define VMODE_ENVELOPE		2
#define VMODE_START_NOTE	3

    int             env_phase;
    unsigned char   env_rate[6];
    unsigned char   env_offset[6];

    /* 
     * Volume computation parameters for gus_adagio_vol()
     */
    int             main_vol, expression_vol, patch_vol;

    /* Variables for "Ultraclick" removal */
    int             dev_pending, note_pending, volume_pending, sample_pending;
    char            kill_pending;
    long            offset_pending;

  };

extern int      gus_base;
extern int      gus_irq, gus_dma;
extern char    *snd_raw_buf[MAX_DSP_DEV][DSP_BUFFCOUNT];
extern unsigned long snd_raw_buf_phys[MAX_DSP_DEV][DSP_BUFFCOUNT];
extern int      snd_raw_count[MAX_DSP_DEV];
static long     gus_mem_size = 0;
static long     free_mem_ptr = 0;
static int      gus_busy = 0;
static int      nr_voices = 0;
static int      gus_devnum = 0;
static int      volume_base, volume_scale, volume_method;
static int	gus_line_vol = 100, gus_mic_vol = 0;
static int	gus_recmask = SOUND_MASK_MIC;
static int	recording_active = 0;

#define VOL_METHOD_ADAGIO	1
int             gus_wave_volume = 60;
int             gus_pcm_volume = 80;
static unsigned char mix_image = 0x00;

/* 
 * Current version of this driver doesn't allow synth and PCM functions
 * at the same time. The active_device specifies the active driver
 */
static int      active_device = 0;

#define GUS_DEV_WAVE		1	/* 
					 * * * Wave table synth   */
#define GUS_DEV_PCM_DONE	2	/* 
					 * * * PCM device, transfer done   */
#define GUS_DEV_PCM_CONTINUE	3	/* 
					 * * * PCM device, transfer the
					 * second * * * chn   */

static int      gus_sampling_speed;
static int      gus_sampling_channels;
static int      gus_sampling_bits;

DEFINE_WAIT_QUEUE (dram_sleeper, dram_sleep_flag);

/* 
 * Variables and buffers for PCM output
 */
#define MAX_PCM_BUFFERS		(32*MAX_REALTIME_FACTOR)	/* 
								 * * * Don't
								 * * * change 
								 * 
								 */

static int      pcm_bsize,	/* 
				 * Current blocksize 
				 */
                pcm_nblk,	/* 
				 * Current # of blocks 
				 */
                pcm_banksize;	/* 

				 * 
				 * *  * * # bytes allocated for channels   */
static int      pcm_datasize[MAX_PCM_BUFFERS];	/* 

						 * 
						 * *  * * Actual # of bytes
						 * in blk  *  */
static volatile int pcm_head, pcm_tail, pcm_qlen;	/* 

							 * 
							 * *  * * DRAM queue
							 *  */
static volatile int pcm_active;
static int      pcm_opened = 0;
static int      pcm_current_dev;
static int      pcm_current_block;
static unsigned long pcm_current_buf;
static int      pcm_current_count;
static int      pcm_current_intrflag;

struct voice_info voices[32];

static int      freq_div_table[] =
{
  44100,			/* 
				 * 14 
				 */
  41160,			/* 
				 * 15 
				 */
  38587,			/* 
				 * 16 
				 */
  36317,			/* 
				 * 17 
				 */
  34300,			/* 
				 * 18 
				 */
  32494,			/* 
				 * 19 
				 */
  30870,			/* 
				 * 20 
				 */
  29400,			/* 
				 * 21 
				 */
  28063,			/* 
				 * 22 
				 */
  26843,			/* 
				 * 23 
				 */
  25725,			/* 
				 * 24 
				 */
  24696,			/* 
				 * 25 
				 */
  23746,			/* 
				 * 26 
				 */
  22866,			/* 
				 * 27 
				 */
  22050,			/* 
				 * 28 
				 */
  21289,			/* 
				 * 29 
				 */
  20580,			/* 
				 * 30 
				 */
  19916,			/* 
				 * 31 
				 */
  19293				/* 
				 * 32 
				 */
};

static struct patch_info *samples;
static long     sample_ptrs[MAX_SAMPLE + 1];
static int      sample_map[32];
static int      free_sample;


static int      patch_table[MAX_PATCH];
static int      patch_map[32];

static struct synth_info gus_info =
{"Gravis UltraSound", 0, SYNTH_TYPE_SAMPLE, SAMPLE_TYPE_GUS, 0, 16, 0, MAX_PATCH};

static void     gus_poke (long addr, unsigned char data);
static void     compute_and_set_volume (int voice, int volume, int ramp_time);
extern unsigned short gus_adagio_vol (int vel, int mainv, int xpn, int voicev);
static void     compute_volume (int voice, int volume);
static void     do_volume_irq (int voice);
static void	set_input_volumes(void);

#define	INSTANT_RAMP		-1	/* 
					 * * * Dont use ramping   */
#define FAST_RAMP		0	/* 
					 * * * Fastest possible ramp   */

static void
reset_sample_memory (void)
{
  int             i;

  for (i = 0; i <= MAX_SAMPLE; i++)
    sample_ptrs[i] = -1;
  for (i = 0; i < 32; i++)
    sample_map[i] = -1;
  for (i = 0; i < 32; i++)
    patch_map[i] = -1;

  gus_poke (0, 0);		/* 
				 * Put silence here 
				 */
  gus_poke (1, 0);

  free_mem_ptr = 2;
  free_sample = 0;

  for (i = 0; i < MAX_PATCH; i++)
    patch_table[i] = -1;
}

void
gus_delay (void)
{
  int             i;

  for (i = 0; i < 7; i++)
    INB (u_DRAMIO);
}

static void
gus_poke (long addr, unsigned char data)
{
  unsigned long   flags;

  DISABLE_INTR (flags);
  OUTB (0x43, u_Command);
  OUTB (addr & 0xff, u_DataLo);
  OUTB ((addr >> 8) & 0xff, u_DataHi);

  OUTB (0x44, u_Command);
  OUTB ((addr >> 16) & 0xff, u_DataHi);
  OUTB (data, u_DRAMIO);
  RESTORE_INTR (flags);
}

static unsigned char
gus_peek (long addr)
{
  unsigned long   flags;
  unsigned char   tmp;

  DISABLE_INTR (flags);
  OUTB (0x43, u_Command);
  OUTB (addr & 0xff, u_DataLo);
  OUTB ((addr >> 8) & 0xff, u_DataHi);

  OUTB (0x44, u_Command);
  OUTB ((addr >> 16) & 0xff, u_DataHi);
  tmp = INB (u_DRAMIO);
  RESTORE_INTR (flags);

  return tmp;
}

void
gus_write8 (int reg, unsigned int data)
{
  unsigned long   flags;

  DISABLE_INTR (flags);

  OUTB (reg, u_Command);
  OUTB ((unsigned char) (data & 0xff), u_DataHi);

  RESTORE_INTR (flags);
}

unsigned char
gus_read8 (int reg)
{
  unsigned long   flags;
  unsigned char   val;

  DISABLE_INTR (flags);
  OUTB (reg | 0x80, u_Command);
  val = INB (u_DataHi);
  RESTORE_INTR (flags);

  return val;
}

unsigned char
gus_look8 (int reg)
{
  unsigned long   flags;
  unsigned char   val;

  DISABLE_INTR (flags);
  OUTB (reg, u_Command);
  val = INB (u_DataHi);
  RESTORE_INTR (flags);

  return val;
}

void
gus_write16 (int reg, unsigned int data)
{
  unsigned long   flags;

  DISABLE_INTR (flags);

  OUTB (reg, u_Command);

  OUTB ((unsigned char) (data & 0xff), u_DataLo);
  OUTB ((unsigned char) ((data >> 8) & 0xff), u_DataHi);

  RESTORE_INTR (flags);
}

unsigned short
gus_read16 (int reg)
{
  unsigned long   flags;
  unsigned char   hi, lo;

  DISABLE_INTR (flags);

  OUTB (reg | 0x80, u_Command);

  lo = INB (u_DataLo);
  hi = INB (u_DataHi);

  RESTORE_INTR (flags);

  return ((hi << 8) & 0xff00) | lo;
}

void
gus_write_addr (int reg, unsigned long address, int is16bit)
{
  unsigned long   hold_address;

  if (is16bit)
    {
      /* 
       * Special processing required for 16 bit patches
       */

      hold_address = address;
      address = address >> 1;
      address &= 0x0001ffffL;
      address |= (hold_address & 0x000c0000L);
    }

  gus_write16 (reg, (unsigned short) ((address >> 7) & 0xffff));
  gus_write16 (reg + 1, (unsigned short) ((address << 9) & 0xffff));
}

static void
gus_select_voice (int voice)
{
  if (voice < 0 || voice > 31)
    return;

  OUTB (voice, u_Voice);
}

static void
gus_select_max_voices (int nvoices)
{
  if (nvoices < 14)
    nvoices = 14;
  if (nvoices > 32)
    nvoices = 32;

  nr_voices = nvoices;

  gus_write8 (0x0e, (nvoices - 1) | 0xc0);
}

static void
gus_voice_on (unsigned int mode)
{
  gus_write8 (0x00, (unsigned char) (mode & 0xfc));
  gus_delay ();
  gus_write8 (0x00, (unsigned char) (mode & 0xfc));
}

static void
gus_voice_off (void)
{
  gus_write8 (0x00, gus_read8 (0x00) | 0x03);
}

static void
gus_voice_mode (unsigned int m)
{
  unsigned char   mode = (unsigned char) (m & 0xff);

  gus_write8 (0x00, (gus_read8 (0x00) & 0x03) | (mode & 0xfc));		/* 
									 * Don't 
									 * start 
									 * or 
									 * stop
									 * *
									 * voice 
									 */
  gus_delay ();
  gus_write8 (0x00, (gus_read8 (0x00) & 0x03) | (mode & 0xfc));
}

static void
gus_voice_freq (unsigned long freq)
{
  unsigned long   divisor = freq_div_table[nr_voices - 14];
  unsigned short  fc;

  fc = (unsigned short) (((freq << 9) + (divisor >> 1)) / divisor);
  fc = fc << 1;

  gus_write16 (0x01, fc);
}

static void
gus_voice_volume (unsigned int vol)
{
  gus_write8 (0x0d, 0x03);	/* 
				 * Stop ramp before setting volume 
				 */
  gus_write16 (0x09, (unsigned short) (vol << 4));
}

static void
gus_voice_balance (unsigned int balance)
{
  gus_write8 (0x0c, (unsigned char) (balance & 0xff));
}

static void
gus_ramp_range (unsigned int low, unsigned int high)
{
  gus_write8 (0x07, (unsigned char) ((low >> 4) & 0xff));
  gus_write8 (0x08, (unsigned char) ((high >> 4) & 0xff));
}

static void
gus_ramp_rate (unsigned int scale, unsigned int rate)
{
  gus_write8 (0x06, (unsigned char) (((scale & 0x03) << 6) | (rate & 0x3f)));
}

static void
gus_rampon (unsigned int m)
{
  unsigned char   mode = (unsigned char) (m & 0xff);

  gus_write8 (0x0d, mode & 0xfc);
  gus_delay ();
  gus_write8 (0x0d, mode & 0xfc);
}

static void
gus_ramp_mode (unsigned int m)
{
  unsigned char   mode = (unsigned char) (m & 0xff);

  gus_write8 (0x0d, (gus_read8 (0x0d) & 0x03) | (mode & 0xfc));		/* 
									 * Don't 
									 * start 
									 * or 
									 * stop
									 * *
									 * ramping 
									 */
  gus_delay ();
  gus_write8 (0x0d, (gus_read8 (0x0d) & 0x03) | (mode & 0xfc));
}

static void
gus_rampoff (void)
{
  gus_write8 (0x0d, 0x03);
}

static void
gus_set_voice_pos (int voice, long position)
{
  int             sample_no;

  if ((sample_no = sample_map[voice]) != -1)
    if (position < samples[sample_no].len)
      if (voices[voice].volume_irq_mode == VMODE_START_NOTE)
	voices[voice].offset_pending = position;
      else
	gus_write_addr (0x0a, sample_ptrs[sample_no] + position,
			samples[sample_no].mode & WAVE_16_BITS);
}

static void
gus_voice_init (int voice)
{
  unsigned long   flags;

  DISABLE_INTR (flags);
  gus_select_voice (voice);
  gus_voice_volume (0);
  gus_write_addr (0x0a, 0, 0);	/* 
				 * Set current position to 0 
				 */
  gus_write8 (0x00, 0x03);	/* 
				 * Voice off 
				 */
  gus_write8 (0x0d, 0x03);	/* 
				 * Ramping off 
				 */
  RESTORE_INTR (flags);

}

static void
gus_voice_init2 (int voice)
{
  voices[voice].panning = 0;
  voices[voice].mode = 0;
  voices[voice].orig_freq = 20000;
  voices[voice].current_freq = 20000;
  voices[voice].bender = 0;
  voices[voice].bender_range = 200;
  voices[voice].initial_volume = 0;
  voices[voice].current_volume = 0;
  voices[voice].loop_irq_mode = 0;
  voices[voice].loop_irq_parm = 0;
  voices[voice].volume_irq_mode = 0;
  voices[voice].volume_irq_parm = 0;
  voices[voice].env_phase = 0;
  voices[voice].main_vol = 127;
  voices[voice].patch_vol = 127;
  voices[voice].expression_vol = 127;
  voices[voice].sample_pending = -1;
}

static void
step_envelope (int voice)
{
  unsigned        vol, prev_vol, phase;
  unsigned char   rate;

  if (voices[voice].mode & WAVE_SUSTAIN_ON && voices[voice].env_phase == 2)
    {
      gus_rampoff ();

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产欧美精品国产国产专区 | 高清国产一区二区| 99久久精品免费精品国产| 制服丝袜国产精品| 亚洲免费在线视频一区 二区| 日本va欧美va欧美va精品| 国产99久久精品| 日韩一级免费一区| 亚洲乱码一区二区三区在线观看| 国产一区欧美一区| 欧美一区二区高清| 亚洲狠狠爱一区二区三区| 丁香亚洲综合激情啪啪综合| 欧美一级片在线| 丝袜美腿亚洲一区二区图片| 波多野结衣中文一区| 欧美精品一区二区三区蜜桃| 香蕉加勒比综合久久| 欧美综合天天夜夜久久| 国产精品欧美精品| 国产 日韩 欧美大片| 欧美成人bangbros| 久草精品在线观看| 欧美一区二区三区婷婷月色| 视频一区二区中文字幕| 精品1区2区3区| 亚洲在线观看免费| 欧美日韩中文字幕一区二区| 亚洲一区二区三区视频在线 | 成人午夜电影小说| 精品av久久707| 久久国产综合精品| 久久久久久免费毛片精品| 激情亚洲综合在线| 久久婷婷一区二区三区| 国产一区欧美日韩| 欧美国产日韩亚洲一区| 成人的网站免费观看| 中文字幕制服丝袜成人av| 成人久久视频在线观看| 中文字幕一区二区三区在线播放| 波多野结衣中文字幕一区| 亚洲欧美经典视频| 欧美三级韩国三级日本三斤| 奇米四色…亚洲| 国产日本一区二区| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 一区二区三区在线观看国产| 欧美午夜精品一区二区蜜桃| 婷婷国产v国产偷v亚洲高清| 日韩欧美电影一二三| 国产一区二区在线影院| 《视频一区视频二区| 欧美色图天堂网| 另类人妖一区二区av| 国产日韩精品一区二区三区| 99在线精品视频| 亚洲成人中文在线| 精品国产91亚洲一区二区三区婷婷| 国产一区二区0| 亚洲黄色片在线观看| 欧美一区午夜精品| 风间由美中文字幕在线看视频国产欧美| 国产精品免费视频网站| 在线观看成人小视频| 寂寞少妇一区二区三区| 日韩理论在线观看| 日韩三级视频中文字幕| 不卡欧美aaaaa| 美女网站在线免费欧美精品| 国产视频视频一区| 欧美伊人久久久久久午夜久久久久| 欧美aaaaa成人免费观看视频| 久久免费偷拍视频| 欧美日韩性生活| 成人禁用看黄a在线| 日韩精品每日更新| **欧美大码日韩| 亚洲精品在线一区二区| 在线国产亚洲欧美| 成人在线一区二区三区| 久久激情综合网| 一区二区三区免费| 中文字幕+乱码+中文字幕一区| 在线不卡a资源高清| 99精品偷自拍| 国产一区二区在线视频| 日韩和欧美一区二区| 亚洲免费三区一区二区| 久久精品免费在线观看| 91精品国产欧美日韩| 色国产精品一区在线观看| 国产a视频精品免费观看| 日韩中文字幕91| 一区二区三区高清在线| 国产精品美女久久久久高潮| 2024国产精品| 日韩美女在线视频| 欧洲av一区二区嗯嗯嗯啊| 99精品欧美一区二区三区小说| 国产一区二区三区免费播放| 免费成人在线播放| 日韩成人午夜精品| 日韩综合一区二区| 丝袜亚洲另类欧美| 婷婷久久综合九色综合伊人色| 亚洲激情图片小说视频| 自拍偷拍欧美精品| 成人免费一区二区三区视频| 中日韩av电影| 一区二区三区视频在线观看| 国产精品成人一区二区艾草 | 99精品黄色片免费大全| 成人h动漫精品| 99re热这里只有精品免费视频| 成人午夜激情在线| 成人性视频网站| 91一区二区在线| 91猫先生在线| 欧美三区在线观看| 日韩一级视频免费观看在线| 日韩三级免费观看| 欧美精品一区视频| 久久久高清一区二区三区| 久久精品一区二区三区不卡| 中文子幕无线码一区tr| 亚洲精品中文在线| 亚洲.国产.中文慕字在线| 美女一区二区在线观看| 韩国女主播一区| www.色精品| 欧美特级限制片免费在线观看| 欧美日韩国产电影| 久久丝袜美腿综合| 亚洲欧美综合网| 偷拍亚洲欧洲综合| 久久国产乱子精品免费女| 国产精品主播直播| 色综合av在线| 91精品国产综合久久久久久| 2023国产精品| 国产精品一区三区| gogogo免费视频观看亚洲一| 欧美视频第二页| 久久免费偷拍视频| 亚洲一区二区在线播放相泽| 日韩电影在线观看网站| 国产ts人妖一区二区| 欧美专区日韩专区| 欧美草草影院在线视频| 亚洲欧洲另类国产综合| 日韩和欧美一区二区三区| 国产成人午夜精品影院观看视频| 色欧美日韩亚洲| 精品国产免费视频| 亚洲精品国产精华液| 国产一区二区三区不卡在线观看| 91污片在线观看| 精品久久久久久久久久久久包黑料| 亚洲欧洲综合另类| 国产一区二区三区免费看| 欧美日韩亚洲综合一区| 国产精品毛片久久久久久| 麻豆精品视频在线观看| 91日韩一区二区三区| 久久亚洲捆绑美女| 亚洲成a天堂v人片| 色综合天天天天做夜夜夜夜做| 欧美大白屁股肥臀xxxxxx| 亚洲午夜在线视频| 91色乱码一区二区三区| 久久久综合九色合综国产精品| 三级欧美在线一区| 91久久国产综合久久| 国产精品国产精品国产专区不片| 麻豆精品精品国产自在97香蕉| 欧美中文字幕不卡| 亚洲少妇中出一区| 丁香桃色午夜亚洲一区二区三区| 日韩一区二区在线观看视频| 亚洲午夜免费电影| 色婷婷av一区二区| 最新成人av在线| 成人国产电影网| 国产精品三级在线观看| 国产成人综合亚洲91猫咪| 日韩欧美高清一区| 美女mm1313爽爽久久久蜜臀| 欧美日韩和欧美的一区二区| 成人欧美一区二区三区1314| 成人免费视频免费观看| 国产午夜精品理论片a级大结局| 极品少妇xxxx精品少妇| 欧美成人精品福利| 久久精品久久精品| 日韩欧美一区电影| 麻豆freexxxx性91精品| 精品国免费一区二区三区| 精品一区二区三区在线播放视频| 欧美一区二区三区电影|