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

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

?? gus_wave.c

?? 內核是系統的心臟
?? C
?? 第 1 頁 / 共 5 頁
字號:
	    return RET_ERROR (ENOSPC);

	  free_mem_ptr = tmp_mem;	/* 
					 * This leaves unusable memory 
					 */
	}
    }

  if ((free_mem_ptr + patch.len) > gus_mem_size)
    return RET_ERROR (ENOSPC);

  sample_ptrs[free_sample] = free_mem_ptr;

  /* 
   * Tremolo is not possible with envelopes 
   */

  if (patch.mode & WAVE_ENVELOPES)
    patch.mode &= ~WAVE_TREMOLO;

  memcpy ((char *) &samples[free_sample], &patch, sizeof_patch);

  /* 
   * Link this_one sample to the list of samples for patch 'instr'.
   */

  samples[free_sample].key = patch_table[instr];
  patch_table[instr] = free_sample;

  /* 
   * Use DMA to transfer the wave data to the DRAM
   */

  left = patch.len;
  src_offs = 0;
  target = free_mem_ptr;

  while (left)			/* 
				 * Not all moved 
				 */
    {
      blk_size = sound_buffsizes[gus_devnum];
      if (blk_size > left)
	blk_size = left;

      /* 
       * DMA cannot cross 256k bank boundaries. Check for that.
       */
      blk_end = target + blk_size;

      if ((target >> 18) != (blk_end >> 18))
	{			/* 
				 * Have to split the block 
				 */

	  blk_end &= ~(256 * 1024 - 1);
	  blk_size = blk_end - target;
	}

#if defined(GUS_NO_DMA) || defined(GUS_PATCH_NO_DMA)
      /* 
       * For some reason the DMA is not possible. We have to use PIO.
       */
      {
	long            i;
	unsigned char   data;

	for (i = 0; i < blk_size; i++)
	  {
	    GET_BYTE_FROM_USER (data, addr, sizeof_patch + i);
	    if (patch.mode & WAVE_UNSIGNED)

	      if (!(patch.mode & WAVE_16_BITS) || (i & 0x01))
		data ^= 0x80;	/* 
				 * Convert to signed 
				 */
	    gus_poke (target + i, data);
	  }
      }
#else /* 
       * * * GUS_NO_DMA   */
      {
	unsigned long   address, hold_address;
	unsigned char   dma_command;
	unsigned long   flags;

	/* 
	 * OK, move now. First in and then out.
	 */

	COPY_FROM_USER (snd_raw_buf[gus_devnum][0],
			addr, sizeof_patch + src_offs,
			blk_size);

	DISABLE_INTR (flags);	/******** INTERRUPTS DISABLED NOW ********/
	gus_write8 (0x41, 0);	/* 
				 * Disable GF1 DMA 
				 */
	DMAbuf_start_dma (gus_devnum, snd_raw_buf_phys[gus_devnum][0],
			  blk_size, DMA_MODE_WRITE);

	/* 
	 * Set the DRAM address for the wave data
	 */

	address = target;

	if (sound_dsp_dmachan[gus_devnum] > 3)
	  {
	    hold_address = address;
	    address = address >> 1;
	    address &= 0x0001ffffL;
	    address |= (hold_address & 0x000c0000L);
	  }

	gus_write16 (0x42, (address >> 4) & 0xffff);	/* 
							 * DRAM DMA address 
							 */

	/* 
	 * Start the DMA transfer
	 */

	dma_command = 0x21;	/* 
				 * IRQ enable, DMA start 
				 */
	if (patch.mode & WAVE_UNSIGNED)
	  dma_command |= 0x80;	/* 
				 * Invert MSB 
				 */
	if (patch.mode & WAVE_16_BITS)
	  dma_command |= 0x40;	/* 
				 * 16 bit _DATA_ 
				 */
	if (sound_dsp_dmachan[gus_devnum] > 3)
	  dma_command |= 0x04;	/* 
				 * 16 bit DMA channel 
				 */

	gus_write8 (0x41, dma_command);		/* 
						 * Let's go luteet (=bugs) 
						 */

	/* 
	 * Sleep here until the DRAM DMA done interrupt is served
	 */
	active_device = GUS_DEV_WAVE;

	DO_SLEEP (dram_sleeper, dram_sleep_flag, HZ);
	if (TIMED_OUT (dram_sleeper, dram_sleep_flag))
	  printk ("GUS: DMA Transfer timed out\n");
	RESTORE_INTR (flags);
      }
#endif /* 
        * * * GUS_NO_DMA   */

      /* 
       * Now the next part
       */

      left -= blk_size;
      src_offs += blk_size;
      target += blk_size;

      gus_write8 (0x41, 0);	/* 
				 * Stop DMA 
				 */
    }

  free_mem_ptr += patch.len;

  if (!pmgr_flag)
    pmgr_inform (dev, PM_E_PATCH_LOADED, instr, free_sample, 0, 0);
  free_sample++;
  return 0;
}

static void
guswave_hw_control (int dev, unsigned char *event)
{
  int             voice, cmd;
  unsigned short  p1, p2;
  unsigned long   plong, flags;

  cmd = event[2];
  voice = event[3];
  p1 = *(unsigned short *) &event[4];
  p2 = *(unsigned short *) &event[6];
  plong = *(unsigned long *) &event[4];

  if ((voices[voice].volume_irq_mode == VMODE_START_NOTE) &&
      (cmd != _GUS_VOICESAMPLE) && (cmd != _GUS_VOICE_POS))
    do_volume_irq (voice);

  switch (cmd)
    {

    case _GUS_NUMVOICES:
      DISABLE_INTR (flags);
      gus_select_voice (voice);
      gus_select_max_voices (p1);
      RESTORE_INTR (flags);
      break;

    case _GUS_VOICESAMPLE:
      guswave_set_instr (dev, voice, p1);
      break;

    case _GUS_VOICEON:
      DISABLE_INTR (flags);
      gus_select_voice (voice);
      p1 &= ~0x20;		/* 
				 * Disable intr 
				 */
      gus_voice_on (p1);
      RESTORE_INTR (flags);
      break;

    case _GUS_VOICEOFF:
      DISABLE_INTR (flags);
      gus_select_voice (voice);
      gus_voice_off ();
      RESTORE_INTR (flags);
      break;

    case _GUS_VOICEFADE:
      DISABLE_INTR (flags);
      gus_select_voice (voice);
      gus_voice_fade (voice);
      RESTORE_INTR (flags);
      break;

    case _GUS_VOICEMODE:
      DISABLE_INTR (flags);
      gus_select_voice (voice);
      p1 &= ~0x20;		/* 
				 * Disable intr 
				 */
      gus_voice_mode (p1);
      RESTORE_INTR (flags);
      break;

    case _GUS_VOICEBALA:
      DISABLE_INTR (flags);
      gus_select_voice (voice);
      gus_voice_balance (p1);
      RESTORE_INTR (flags);
      break;

    case _GUS_VOICEFREQ:
      DISABLE_INTR (flags);
      gus_select_voice (voice);
      gus_voice_freq (plong);
      RESTORE_INTR (flags);
      break;

    case _GUS_VOICEVOL:
      DISABLE_INTR (flags);
      gus_select_voice (voice);
      gus_voice_volume (p1);
      RESTORE_INTR (flags);
      break;

    case _GUS_VOICEVOL2:	/* 
				 * Just update the voice value 
				 */
      voices[voice].initial_volume =
	voices[voice].current_volume = p1;
      break;

    case _GUS_RAMPRANGE:
      if (voices[voice].mode & WAVE_ENVELOPES)
	break;			/* 
				 * NO-NO 
				 */
      DISABLE_INTR (flags);
      gus_select_voice (voice);
      gus_ramp_range (p1, p2);
      RESTORE_INTR (flags);
      break;

    case _GUS_RAMPRATE:
      if (voices[voice].mode & WAVE_ENVELOPES)
	break;			/* 
				 * NO-NO 
				 */
      DISABLE_INTR (flags);
      gus_select_voice (voice);
      gus_ramp_rate (p1, p2);
      RESTORE_INTR (flags);
      break;

    case _GUS_RAMPMODE:
      if (voices[voice].mode & WAVE_ENVELOPES)
	break;			/* 
				 * NO-NO 
				 */
      DISABLE_INTR (flags);
      gus_select_voice (voice);
      p1 &= ~0x20;		/* 
				 * Disable intr 
				 */
      gus_ramp_mode (p1);
      RESTORE_INTR (flags);
      break;

    case _GUS_RAMPON:
      if (voices[voice].mode & WAVE_ENVELOPES)
	break;			/* 
				 * NO-NO 
				 */
      DISABLE_INTR (flags);
      gus_select_voice (voice);
      p1 &= ~0x20;		/* 
				 * Disable intr 
				 */
      gus_rampon (p1);
      RESTORE_INTR (flags);
      break;

    case _GUS_RAMPOFF:
      if (voices[voice].mode & WAVE_ENVELOPES)
	break;			/* 
				 * NO-NO 
				 */
      DISABLE_INTR (flags);
      gus_select_voice (voice);
      gus_rampoff ();
      RESTORE_INTR (flags);
      break;

    case _GUS_VOLUME_SCALE:
      volume_base = p1;
      volume_scale = p2;
      break;

    case _GUS_VOICE_POS:
      DISABLE_INTR (flags);
      gus_select_voice (voice);
      gus_set_voice_pos (voice, plong);
      RESTORE_INTR (flags);
      break;

    default:;
    }
}

static int
gus_sampling_set_speed (int speed)
{
  if (speed <= 0)
    return gus_sampling_speed;

  if (speed > 44100)
    speed = 44100;

  gus_sampling_speed = speed;
  return speed;
}

static int
gus_sampling_set_channels (int channels)
{
  if (!channels)
    return gus_sampling_channels;
  if (channels > 2)
    channels = 2;
  if (channels < 1)
    channels = 1;
  gus_sampling_channels = channels;
  return channels;
}

static int
gus_sampling_set_bits (int bits)
{
  if (!bits)
    return gus_sampling_bits;

  if (bits != 8 && bits != 16)
    bits = 8;

  gus_sampling_bits = bits;
  return bits;
}

static int
gus_sampling_ioctl (int dev, unsigned int cmd, unsigned int arg, int local)
{
  switch (cmd)
    {
    case SOUND_PCM_WRITE_RATE:
      if (local)
	return gus_sampling_set_speed (arg);
      return IOCTL_OUT (arg, gus_sampling_set_speed (IOCTL_IN (arg)));
      break;

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

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

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

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

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

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

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

    case SOUND_PCM_READ_FILTER:
      return IOCTL_OUT (arg, RET_ERROR (EINVAL));
      break;

    default:
      return RET_ERROR (EINVAL);
    }
  return RET_ERROR (EINVAL);
}

static void
gus_sampling_reset (int dev)
{
}

static int
gus_sampling_open (int dev, int mode)
{
#ifdef GUS_NO_DMA
  printk ("GUS: DMA mode not enabled. Device not supported\n");
  return RET_ERROR (ENXIO);
#endif

  if (gus_busy)
    return RET_ERROR (EBUSY);

  gus_initialize ();

  gus_busy = 1;
  active_device = 0;

  gus_reset ();
  reset_sample_memory ();
  gus_select_max_voices (14);

  pcm_active = 0;
  pcm_opened = 1;
  if (mode & OPEN_READ) 
  {
     recording_active = 1;
     set_input_volumes();
  }

  return 0;
}

static void
gus_sampling_close (int dev)
{
  gus_reset ();
  gus_busy = 0;
  pcm_opened = 0;
  active_device = 0;

  if (recording_active)
     set_input_volumes();

  recording_active = 0;
}

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

  DISABLE_INTR (flags);
  if (pcm_active && pcm_opened)
    for (voice = 0; voice < gus_sampling_channels; voice++)
      {
	gus_select_voice (voice);
	gus_rampoff ();
	gus_voice_volume (1530 + (25 * gus_pcm_volume));
	gus_ramp_range (65, 1530 + (25 * gus_pcm_volume));
      }
  RESTORE_INTR (flags);
}

static void
play_next_pcm_block (void)
{
  unsigned long   flags;
  int             speed = gus_sampling_speed;
  int             this_one, is16bits, chn;
  unsigned long   dram_loc;
  unsigned char   mode[2], ramp_mode[2];

  if (!pcm_qlen)
    return;

  this_one = pcm_head;

  for (chn = 0; chn < gus_sampling_channels; chn++)
    {
      mode[chn] = 0x00;
      ramp_mode[chn] = 0x03;	/* 
				 * Ramping and rollover off 
				 */

      if (chn == 0)
	{
	  mode[chn] |= 0x20;	/* 
				 * Loop irq 
				 */
	  voices[chn].loop_irq_mode = LMODE_PCM;
	}

      if (gus_sampling_bits != 8)
	{
	  is16bits = 1;
	  mode[chn] |= 0x04;	/* 
				 * 16 bit data 
				 */
	}
      else
	is16bits = 0;

      dram_loc = this_one * pcm_bsize;
      dram_loc += chn * pcm_banksize;

      if (this_one == (pcm_nblk - 1))	/* 
					 * Last of the DRAM buffers 
					 */
	{
	  mode[chn] |= 0x08;	/* 
				 * Enable loop 
				 */
	  ramp_mode[chn] = 0x03;	/* 
					 * Disable rollover 
					 */
	}
      else
	{
	  if (chn == 0)
	    ramp_mode[chn] = 0x04;	/* 
					 * Enable rollover bit 
					 */
	}

      DISABLE_INTR (flags);
      gus_select_voice (chn);
      gus_voice_freq (speed);

      if (gus_sampling_channels == 1)
	gus_voice_balance (7);	/* 
				 * mono 
				 */
      else if (chn == 0)
	gus_voice_balance (0);	/* 
				 * left 
				 */
      else
	gus_voice_balance (15);	/* 
				 * right 
				 */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产女人aaa级久久久级| 欧美一区日本一区韩国一区| 亚洲一区二区三区四区在线 | 欧美综合天天夜夜久久| 日韩国产欧美在线视频| 国产精品久久久久久久蜜臀| 在线观看91精品国产麻豆| 成人深夜福利app| 国产精品色噜噜| 日韩欧美一级二级| 色婷婷精品久久二区二区蜜臀av | 欧美日韩一区三区| 91社区在线播放| 国模无码大尺度一区二区三区| 国产精品传媒视频| 亚洲精品在线电影| 日韩一区二区中文字幕| 日本韩国精品一区二区在线观看| 激情文学综合丁香| 日本va欧美va瓶| 日日噜噜夜夜狠狠视频欧美人| 亚洲视频一区在线观看| 国产精品久久久久aaaa| 久久久噜噜噜久久人人看| 337p粉嫩大胆色噜噜噜噜亚洲 | 国产曰批免费观看久久久| 久久er精品视频| 精品一区二区在线看| 久久精品噜噜噜成人av农村| 九九视频精品免费| 国产精品18久久久久久久久久久久| 久久精品国产色蜜蜜麻豆| 强制捆绑调教一区二区| 精品影视av免费| 99视频一区二区三区| 在线观看av一区| 日韩一区二区三区视频| 精品免费日韩av| 久久精品人人做人人综合| 国产精品久久久久久户外露出| 亚洲天堂成人网| 日韩精品亚洲一区| 成人精品在线视频观看| 色久综合一二码| 精品国产电影一区二区| 国产精品成人网| 日韩电影在线免费| 成人性生交大片免费看视频在线 | 欧美浪妇xxxx高跟鞋交| 日韩亚洲欧美高清| 久久毛片高清国产| 精品久久久久久久久久久久久久久久久 | 亚洲一区二区三区四区中文字幕| 亚洲精品成人天堂一二三| 亚洲一区在线观看免费| 国模一区二区三区白浆| 91福利在线观看| 精品剧情在线观看| 一区二区三区毛片| 奇米影视在线99精品| 国产91精品在线观看| 麻豆国产精品官网| 中文在线一区二区| 国产精品―色哟哟| 日韩一区欧美一区| 国产精品自产自拍| 日韩午夜激情视频| 国产精品无遮挡| 久久精品国产亚洲高清剧情介绍| 欧美性色黄大片手机版| 国产精品国产成人国产三级| 国产成人免费视频网站高清观看视频 | 26uuu精品一区二区| 美女国产一区二区三区| 欧美日韩激情在线| 五月婷婷激情综合网| 欧美系列在线观看| 亚洲成人tv网| 色婷婷av一区二区三区gif| 亚洲欧美一区二区久久| av网站免费线看精品| 国产精品沙发午睡系列990531| 国产精品123| 国产精品免费视频一区| 成人性生交大片免费看中文网站| 国产女人aaa级久久久级| 国产精品一区三区| 国产日韩精品一区| 国产成a人亚洲| 亚洲区小说区图片区qvod| 欧美综合天天夜夜久久| 蜜桃av一区二区三区电影| 久久影院午夜片一区| 白白色亚洲国产精品| 亚洲精品水蜜桃| 制服丝袜一区二区三区| 国产激情视频一区二区在线观看| 亚洲国产成人私人影院tom| 一本大道久久a久久精品综合| 午夜精品福利视频网站| 国产丝袜美腿一区二区三区| 91国内精品野花午夜精品| 五月天中文字幕一区二区| 久久蜜桃av一区二区天堂| 在线观看日韩高清av| 精品一区二区在线视频| 亚洲福利视频导航| 国产精品乱人伦| 欧美一区二区三区公司| 成人午夜视频在线| 日本女优在线视频一区二区 | 精品伦理精品一区| 欧美中文字幕久久 | 精品一区二区三区在线播放视频| 一区二区视频在线看| 国产女主播一区| 精品国产乱码久久久久久夜甘婷婷 | 91一区在线观看| 国产精品正在播放| 久久国产麻豆精品| 五月天视频一区| 亚洲最新视频在线观看| 日韩毛片精品高清免费| 国产亚洲自拍一区| 国产肉丝袜一区二区| 久久久不卡影院| 国产午夜亚洲精品不卡| 精品久久久久99| 欧美tk—视频vk| 久久综合狠狠综合久久激情| 欧美成人伊人久久综合网| 91精品国产91热久久久做人人| 欧美性生活一区| 91麻豆精品国产91| 欧美一卡2卡3卡4卡| 精品黑人一区二区三区久久| 欧美福利视频导航| 欧美一区二区三区免费大片| 欧美一级爆毛片| 91精品欧美一区二区三区综合在| 久久国产欧美日韩精品| 精品一区二区三区免费观看 | 久久久久久久综合| 久久免费看少妇高潮| 亚洲欧美视频在线观看| 亚洲卡通欧美制服中文| 肉丝袜脚交视频一区二区| 美美哒免费高清在线观看视频一区二区 | 久久精品人人做人人爽人人| 日韩欧美视频在线| 色婷婷综合久久久久中文| 欧美美女一区二区三区| 精品黑人一区二区三区久久| 中文字幕在线一区免费| 亚洲高清不卡在线观看| 九九国产精品视频| 色婷婷av一区| 欧美国产成人精品| 视频一区在线播放| 99精品视频在线观看| 国产网站一区二区三区| 亚洲丰满少妇videoshd| 北条麻妃一区二区三区| 337p粉嫩大胆噜噜噜噜噜91av| 悠悠色在线精品| 成人午夜免费av| 欧美一区二区成人6969| 亚洲成av人片在线观看无码| 99综合电影在线视频| 日韩欧美一二三四区| 亚洲影院久久精品| 国产精品99久久久久久有的能看| 欧美日韩国产首页在线观看| 国产精品久久夜| 日韩av一区二区三区| 一本色道久久综合狠狠躁的推荐| 日韩免费电影一区| 五月婷婷激情综合| 欧美三级电影在线看| 国产欧美日韩综合精品一区二区| 丝袜美腿亚洲一区| 欧美日韩国产免费| 午夜精品福利一区二区三区av| 91碰在线视频| 伊人色综合久久天天人手人婷| 成人h动漫精品一区二| 中日韩av电影| 国产成人亚洲综合色影视| 欧美一区二区观看视频| 久热成人在线视频| 精品国产sm最大网站免费看| 美女网站在线免费欧美精品| 精品盗摄一区二区三区| 免费精品视频最新在线| 精品久久99ma| 成人福利视频在线看| 亚洲欧美日韩系列| 99久久99久久精品国产片果冻| 一区二区三区蜜桃| 在线播放91灌醉迷j高跟美女 |