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

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

?? gus_wave.c

?? LINUX1.0源代碼,代碼條理清晰
?? 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一区二区三区免费野_久草精品视频
亚洲成人一区在线| 不卡大黄网站免费看| yourporn久久国产精品| 欧美日韩高清一区二区不卡| 日韩欧美卡一卡二| 亚洲综合无码一区二区| 国产jizzjizz一区二区| 欧美一区二区三区在线电影| 一区二区三区不卡在线观看| 成人综合在线观看| 精品国产百合女同互慰| 天使萌一区二区三区免费观看| 99精品久久免费看蜜臀剧情介绍| 久久久综合九色合综国产精品| 日韩高清在线观看| 欧美日韩三级在线| 亚洲黄色av一区| 色香蕉成人二区免费| 国产精品美女久久久久av爽李琼 | 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 亚洲五月六月丁香激情| 波多野结衣一区二区三区| 精品日产卡一卡二卡麻豆| 青青草97国产精品免费观看 | 国产日韩精品视频一区| 精品制服美女久久| 精品国产乱码久久久久久蜜臀| 日本中文一区二区三区| 9191久久久久久久久久久| 亚洲一区欧美一区| 欧美亚洲日本一区| 亚洲图片欧美一区| 欧美色图在线观看| 天天爽夜夜爽夜夜爽精品视频| 欧美日韩黄色一区二区| 日韩电影免费一区| 欧美大片在线观看一区二区| 精品在线免费观看| 久久精品夜色噜噜亚洲aⅴ| 国产精品一区二区在线观看不卡| 久久精品一区二区| av电影在线不卡| 亚洲一区二区三区在线看| 欧美日韩日日夜夜| 美腿丝袜一区二区三区| 精品免费国产一区二区三区四区| 精品一区二区三区免费观看| 久久久久久影视| 99久久99久久精品国产片果冻| 亚洲色图视频网站| 欧美日韩成人一区二区| 久久99国产精品尤物| 国产精品国产自产拍高清av王其| 色婷婷综合中文久久一本| 午夜精品一区二区三区三上悠亚| 91精品国产色综合久久| 国产精品一区不卡| 夜夜嗨av一区二区三区| 日韩欧美高清dvd碟片| 成人免费va视频| 天堂午夜影视日韩欧美一区二区| 337p日本欧洲亚洲大胆色噜噜| 福利视频网站一区二区三区| 亚洲综合精品久久| 精品国产一区二区三区忘忧草| 粉嫩高潮美女一区二区三区| 亚洲午夜久久久久久久久久久| 欧美成人一区二区三区| 99久久99久久精品免费看蜜桃| 蜜臀av性久久久久av蜜臀妖精| 国产精品久久久久久久蜜臀| 欧美妇女性影城| 99久久伊人网影院| 免费在线观看视频一区| ...xxx性欧美| 欧美成人精品1314www| 91丝袜美腿高跟国产极品老师 | 欧美成人三级在线| 91蜜桃视频在线| 国产一区二区三区电影在线观看| 亚洲精品亚洲人成人网| 久久亚洲私人国产精品va媚药| 欧美在线免费观看视频| 成人黄色av电影| 九九精品一区二区| 亚洲成人在线网站| 亚洲男同1069视频| 国产三级欧美三级日产三级99| 欧美一级在线免费| 精品视频1区2区3区| 99在线热播精品免费| 狠狠色综合日日| 性久久久久久久| 一区二区三区国产豹纹内裤在线| 中文字幕精品一区| 2020国产精品| 精品国产一区二区三区久久久蜜月| 欧美日韩免费不卡视频一区二区三区| www.一区二区| 丁香激情综合国产| 国产精品一区二区三区四区| 狠狠色狠狠色合久久伊人| 日韩激情一区二区| 三级在线观看一区二区| 亚洲国产成人tv| 亚洲精品视频一区| 亚洲人吸女人奶水| 亚洲天堂精品在线观看| 18欧美乱大交hd1984| 成人免费在线视频| 亚洲少妇最新在线视频| 亚洲精品视频自拍| 亚洲一二三四在线观看| 一区二区三区欧美日韩| 一区二区三区不卡视频| 夜夜嗨av一区二区三区中文字幕 | 成人午夜看片网址| 成人小视频在线| 成人小视频在线| 91香蕉视频在线| 色综合久久久久久久久| 日本道在线观看一区二区| 欧美视频一区在线观看| 欧美挠脚心视频网站| 日韩视频永久免费| 久久久99精品免费观看| 国产精品国产三级国产普通话三级| 国产精品美女www爽爽爽| 亚洲美腿欧美偷拍| 免费看黄色91| 国产成人一区在线| 在线观看日韩电影| 欧美一级日韩免费不卡| 国产欧美一区二区精品仙草咪| 国产精品久久久久久亚洲伦 | 亚洲免费av高清| 天天综合网 天天综合色| 精品一区二区久久久| 成人国产精品免费观看动漫| 色综合久久久久| 日韩三级电影网址| 中文字幕一区二区5566日韩| 性做久久久久久久免费看| 精品在线免费观看| 色哟哟一区二区三区| 日韩三区在线观看| 最新热久久免费视频| 视频一区在线视频| eeuss鲁片一区二区三区在线看| 欧美性一区二区| 欧美激情艳妇裸体舞| 午夜不卡av免费| 国产成人精品免费| 欧美男女性生活在线直播观看| 国产亚洲va综合人人澡精品| 亚洲午夜久久久久久久久电影网| 精品一区二区三区视频| 在线一区二区三区四区五区 | 成人丝袜18视频在线观看| 精品视频一区 二区 三区| 亚洲国产精品成人久久综合一区| 亚洲电影中文字幕在线观看| 国产精品99久久久久久久女警 | 丰满少妇在线播放bd日韩电影| 欧美日韩一区二区三区在线| 欧美激情一区在线观看| 毛片av一区二区| 欧美午夜精品免费| 中文字幕中文字幕中文字幕亚洲无线| 日韩高清不卡一区二区三区| 91丨九色丨尤物| 日本一区二区在线不卡| 久久99精品久久久久婷婷| 欧美私人免费视频| 亚洲欧洲无码一区二区三区| 久久av资源站| 欧美一级生活片| 天堂影院一区二区| 欧美丝袜丝nylons| 亚洲欧美色一区| 成人app下载| 久久久.com| 国产精品 欧美精品| 日韩精品资源二区在线| 日精品一区二区三区| 在线日韩国产精品| **欧美大码日韩| 91香蕉视频黄| 亚洲卡通动漫在线| 在线免费观看视频一区| 综合分类小说区另类春色亚洲小说欧美| 国产乱对白刺激视频不卡 | 欧美午夜精品免费| 亚洲午夜在线视频| 欧美性视频一区二区三区| 亚洲第一电影网| 欧美一区国产二区| 美日韩一区二区三区| 精品久久久久av影院 | 国产日韩一级二级三级|