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

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

?? streams.c

?? 十七種模擬器源代碼 非常有用的作課程設計不可缺少的
?? C
字號:
#ifdef __RAINE__#include "sasound.h"#else#include "driver.h"#endif#include <math.h>#include "newmem.h"#include "ingame.h"int SampleVol[MAX_STREAM_CHANNELS];static int SamplePan[MAX_STREAM_CHANNELS];static UINT8 init_timer[MAX_STREAM_CHANNELS];static int stream_joined_channels[MAX_STREAM_CHANNELS];static char stream_name[MAX_STREAM_CHANNELS][40];static void *stream_buffer[MAX_STREAM_CHANNELS];static UINT8 counter[MAX_STREAM_CHANNELS]; static int stream_buffer_len[MAX_STREAM_CHANNELS];static int remaining_cycles[MAX_STREAM_CHANNELS];static int base_len; // base length of sample for 1 framestatic int stream_sample_rate[MAX_STREAM_CHANNELS];static int stream_sample_bits[MAX_STREAM_CHANNELS];static int stream_buffer_pos[MAX_STREAM_CHANNELS];static int stream_sample_length[MAX_STREAM_CHANNELS];	/* in usec */static int stream_param[MAX_STREAM_CHANNELS];static void (*stream_callback[MAX_STREAM_CHANNELS])(int param,INT16 *buffer,int length);static void (*stream_callback_multi[MAX_STREAM_CHANNELS])(int param,INT16 **buffer,int length);int (*cpupos)(int len)=NULL;static int memory[MAX_STREAM_CHANNELS];static int r1[MAX_STREAM_CHANNELS];static int r2[MAX_STREAM_CHANNELS];static int r3[MAX_STREAM_CHANNELS];static int c[MAX_STREAM_CHANNELS];void streams_init_timers() {  int n;  // When the emulations pauses, streams are not restarted !!!  // So I need this...  for (n=0; n<MAX_STREAM_CHANNELS; n++){    init_timer[n] = 0;    remaining_cycles[n] = 0;  }}/*signal >--R1--+--R2--+              |      |              C      R3---> amp              |      |             GND    GND*//* R1, R2, R3 in Ohm; C in pF *//* set C = 0 to disable the filter */void set_RC_filter(int channel,int R1,int R2,int R3,int C){	r1[channel] = R1;	r2[channel] = R2;	r3[channel] = R3;	c[channel] = C;}void apply_RC_filter_8(int channel,signed char *buf,int len,int sample_rate){	float R1,R2,R3,C;	float Req;	int K;	int i;	if (c[channel] == 0) return;	/* filter disabled */	R1 = r1[channel];	R2 = r2[channel];	R3 = r3[channel];	C = (float)c[channel] * 1E-12;	/* convert pF to F */	/* Cut Frequency = 1/(2*Pi*Req*C) */	Req = (R1*(R2+R3))/(R1+R2+R3);	K = 0x10000 * exp(-1 / (Req * C) / sample_rate);	buf[0] = buf[0] + (memory[channel] - buf[0]) * K / 0x10000;	for (i = 1;i < len;i++)		buf[i] = buf[i] + (buf[i-1] - buf[i]) * K / 0x10000;	memory[channel] = buf[len-1];}void apply_RC_filter_16(int channel,signed short *buf,int len,int sample_rate){	float R1,R2,R3,C;	float Req;	int K;	int i;	if (c[channel] == 0) return;	/* filter disabled */	R1 = r1[channel];	R2 = r2[channel];	R3 = r3[channel];	C = (float)c[channel] * 1E-12;	/* convert pF to F */	/* Cut Frequency = 1/(2*Pi*Req*C) */	Req = (R1*(R2+R3))/(R1+R2+R3);	K = 0x10000 * exp(-1 / (Req * C) / sample_rate);	buf[0] = buf[0] + (memory[channel] - buf[0]) * K / 0x10000;	for (i = 1;i < len;i++)		buf[i] = buf[i] + (buf[i-1] - buf[i]) * K / 0x10000;	memory[channel] = buf[len-1];}void apply_volume_16( INT16 *buf, UINT32 len, int vol ){  // Normally, now that we have the same values as osd functions,  // we should be abble to simply make a voice_set_volume here...  // I keep this for the end !  if(vol != VOLUME_MAX){	// Add [J3d!]: Small speedup      if( vol != VOLUME_MIN){	// Add [J3d!]: Another speedup      if(len){      do{         *buf = (INT16)((((INT32)*buf) * vol)>>8);         buf++;      }while(--len);      }      }      else{         memset(buf,0x00,len<<1);      }   }}void apply_volume_8( INT8 *buf, UINT32 len, int vol ){   if(vol != VOLUME_MAX){	// Add [J3d!]: Small speedup      if( vol != VOLUME_MIN){	// Add [J3d!]: Another speedup      if(len){      do{         *buf = (INT8)((((INT32)*buf) * vol)>>8);         buf++;      }while(--len);      }      }      else{         memset(buf,0x00,len);      }   }}int streams_sh_start(void){	int i;	for (i = 0;i < MAX_STREAM_CHANNELS;i++)	{		stream_joined_channels[i] = 1;		stream_buffer[i] = 0;	}	return 0;}void streams_sh_stop(void){	int i;	for (i = 0;i < MAX_STREAM_CHANNELS;i++)	{		if(stream_buffer[i]) FreeMem(stream_buffer[i]);		stream_buffer[i] = 0;	}}void streams_sh_update(void){  int channel,i;#ifndef __RAINE__  if (Machine->sample_rate == 0) return;#endif  /* update all the output buffers */  for (channel = 0;channel < MAX_STREAM_CHANNELS;channel += stream_joined_channels[channel]){    if (stream_buffer[channel]){      int newpos;      int buflen;      newpos = stream_buffer_len[channel];	        buflen = newpos - stream_buffer_pos[channel];            if (stream_joined_channels[channel] > 1){	INT16 *buf[MAX_STREAM_CHANNELS];	      	if (buflen > 0){#ifdef USE_8BITS	  if (stream_sample_bits[channel] == 16){#endif	    for (i = 0;i < stream_joined_channels[channel];i++)	      buf[i] = &((short *)stream_buffer[channel+i])[stream_buffer_pos[channel+i]];#ifdef USE_8BITS	  } else {	    for (i = 0;i < stream_joined_channels[channel];i++)	      buf[i] = &((char *)stream_buffer[channel+i])[stream_buffer_pos[channel+i]];	  }#endif		  	  (*stream_callback_multi[channel])(stream_param[channel],buf,buflen);	}	      	for (i = 0;i < stream_joined_channels[channel];i++)	  stream_buffer_pos[channel+i] = 0;	      #if SOFT_VOL	// In hardware mode, no mixing is necessary :	// volume & pan are set at the begining and that's all !	if (stream_sample_bits[channel] == 16){	  for (i = 0;i < stream_joined_channels[channel];i++)#ifndef __RAINE__	    apply_RC_filter_16(channel+i,stream_buffer[channel+i],stream_buffer_len[channel+i],stream_sample_rate[channel+i]);#else	  apply_volume_16( stream_buffer[channel+i], stream_buffer_len[channel+i], SampleVol[channel+i] );#endif	} else {	  for (i = 0;i < stream_joined_channels[channel];i++)#ifndef __RAINE__	    apply_RC_filter_8(channel+i,stream_buffer[channel+i],stream_buffer_len[channel+i],stream_sample_rate[channel+i]);#else	  apply_volume_8( stream_buffer[channel+i], stream_buffer_len[channel+i], SampleVol[channel+i] );#endif	}#endif // SOFT_VOL	            } else { // stream_joinded_channels	if (buflen > 0){	  void *buf;		  	  if (stream_sample_bits[channel] == 16)	    buf = &((short *)stream_buffer[channel])[stream_buffer_pos[channel]];	  else	    buf = &((char *)stream_buffer[channel])[stream_buffer_pos[channel]];	  (*stream_callback[channel])(stream_param[channel],buf,buflen);	}	      	stream_buffer_pos[channel] = 0;#if SOFT_VOL	      if (stream_sample_bits[channel] == 16)#ifndef __RAINE__		apply_RC_filter_16(channel,stream_buffer[channel],stream_buffer_len[channel],stream_sample_rate[channel]);#else	      apply_volume_16( stream_buffer[channel], stream_buffer_len[channel], SampleVol[channel] );#endif	      else#ifndef __RAINE__					apply_RC_filter_8(channel,stream_buffer[channel],stream_buffer_len[channel],stream_sample_rate[channel]);#else	      apply_volume_8( stream_buffer[channel], stream_buffer_len[channel], SampleVol[channel] );#endif#endif      }    }  }    for (channel = 0;channel < MAX_STREAM_CHANNELS;channel += stream_joined_channels[channel]){    if (stream_buffer[channel]){#ifdef USE_8BITS      if (stream_sample_bits[channel] == 16){#endif		for (i = 0;i < stream_joined_channels[channel];i++)	  osd_play_streamed_sample_16(channel+i,stream_buffer[channel+i],				      2*stream_buffer_len[channel+i],				      stream_sample_rate[channel+i],				      255, 128  );#ifdef USE_8BITS      } else {	for (i = 0;i < stream_joined_channels[channel];i++)	  osd_play_streamed_sample(channel+i,stream_buffer[channel+i],				   stream_buffer_len[channel+i],				   stream_sample_rate[channel+i],				   255, 128  );      }#endif          }  }}int stream_init(const char *name,int sample_rate,int sample_bits,		int param,void (*callback)(int param,INT16 *buffer,int length)){  int channel;    channel = get_play_channels(1);  stream_joined_channels[channel] = 1;  strcpy(stream_name[channel],name);#ifndef __RAINE__  stream_buffer_len[channel] = sample_rate / Machine->drv->frames_per_second;  /* adjust sample rate to make it a multiple of buffer_len */  sample_rate = stream_buffer_len[channel] * Machine->drv->frames_per_second;#else  stream_buffer_len[channel] = audio_sample_rate / CPU_FPS;  base_len = audio_sample_rate / CPU_FPS;  // Needs +1 to adjust more precisely to what the result should be !!!  /* adjust sample rate to make it a multiple of buffer_len */  sample_rate = stream_buffer_len[channel] * CPU_FPS;#endif  if ((stream_buffer[channel] = AllocateMem((sample_bits/8)*stream_buffer_len[channel])) == 0)		return -1;	stream_sample_rate[channel] = sample_rate;	stream_sample_bits[channel] = sample_bits;	stream_buffer_pos[channel] = 0;	if (sample_rate)		stream_sample_length[channel] = 1000000 / sample_rate;	else		stream_sample_length[channel] = 0;	stream_param[channel] = param;	stream_callback[channel] = callback;	init_timer[channel] = 0;	return channel;}int stream_init_multi(int channels,const char **name,int sample_rate,int sample_bits,		int param,void (*callback)(int param,INT16 **buffer,int length)){  int channel,i;  channel = get_play_channels(channels);  stream_joined_channels[channel] = channels;  for (i = 0;i < channels;i++)    {      strcpy(stream_name[channel+i],name[i]);#ifndef  __RAINE__      stream_buffer_len[channel+i] = sample_rate / Machine->drv->frames_per_second;      /* adjust sample rate to make it a multiple of buffer_len */      sample_rate = stream_buffer_len[channel+i] * Machine->drv->frames_per_second;#else      stream_buffer_len[channel+i] = audio_sample_rate / CPU_FPS;      base_len = audio_sample_rate / CPU_FPS;            /* adjust sample rate to make it a multiple of buffer_len */      sample_rate = stream_buffer_len[channel+i] * CPU_FPS;#endif       if ((stream_buffer[channel+i] = AllocateMem((sample_bits/8)*stream_buffer_len[channel+i])) == 0)	return -1;      memset(stream_buffer[channel+i],0,(sample_bits/8)*stream_buffer_len[channel+i]);      stream_sample_rate[channel+i] = sample_rate;      stream_sample_bits[channel+i] = sample_bits;      stream_buffer_pos[channel+i] = 0;      if (sample_rate)	stream_sample_length[channel+i] = 1000000 / sample_rate;      else	stream_sample_length[channel+i] = 0;      init_timer[channel+i] = 0;    }  stream_param[channel] = param;  stream_callback_multi[channel] = callback;  return channel;}int stream_initm(const char *name,int mixing_level,int sample_rate,		int param,void (*callback)(int param,INT16 *buffer,int length)){  int stream = stream_init(name,sample_rate,16,param,callback);  stream_set_volume(stream,mixing_level & 0xff);  stream_set_pan(stream,mixing_level >> 8);  return stream;}int stream_init_multim(int channels,const char **name,int *mixing_level,int sample_rate,		       int param,void (*callback)(int param,INT16 **buffer,int length)){  int i,stream = stream_init_multi(channels,name,sample_rate,16,param,callback);  for (i=0; i<channels; i++){    stream_set_volume(stream+i,mixing_level[i] & 0xff);    stream_set_pan(stream+i,mixing_level[i] >> 8);  }  return stream;}    /* min_interval is in usec */void stream_update(int channel,int min_interval){#ifndef __RAINE_ORG__        // int newpos;	int buflen;                //if (stream_buffer[channel] == 0)        //        return;        buflen=0;	/* get current position based on the timer */        if (cpupos) buflen=cpupos(stream_sample_length[channel]);        if (buflen > 0 &&                buflen+stream_buffer_pos[channel]                        < stream_buffer_len[channel]) {                //newpos = sound_scalebufferpos(stream_buffer_len[channel]);        // buflen = newpos - stream_buffer_pos[channel];		if (stream_joined_channels[channel] > 1)		{                        INT16 *buf[MAX_STREAM_CHANNELS];			int i;			if (stream_sample_bits[channel] == 16)			{				for (i = 0;i < stream_joined_channels[channel];i++)					buf[i] = &((short *)stream_buffer[channel+i])[stream_buffer_pos[channel+i]];			}			else			{			  for (i = 0;i < stream_joined_channels[channel];i++)			    buf[i] = (UINT16*)&((char *)stream_buffer[channel+i])[stream_buffer_pos[channel+i]];			}			//osd_profiler(OSD_PROFILE_SOUND);                         (*stream_callback_multi[channel])(stream_param[channel],buf,buflen);			//osd_profiler(OSD_PROFILE_END);			for (i = 0;i < stream_joined_channels[channel];i++)				stream_buffer_pos[channel+i] += buflen;		}		else		{			void *buf;			if (stream_sample_bits[channel] == 16)				buf = &((short *)stream_buffer[channel])[stream_buffer_pos[channel]];			else				buf = &((char *)stream_buffer[channel])[stream_buffer_pos[channel]];			//osd_profiler(OSD_PROFILE_SOUND);                         (*stream_callback[channel])(stream_param[channel],buf,buflen);			//osd_profiler(OSD_PROFILE_END);			stream_buffer_pos[channel] += buflen;		}        }#endif}void stream_set_volume(int channel,int volume){  /* My goal is now to have the same volume/pan values for streams and for     osd low level functions... */  SampleVol[channel] = volume & 0xff;  saSetVolume(channel,volume);}int stream_get_volume(int channel){	return SampleVol[channel];}void stream_set_pan(int channel,int pan){  SamplePan[channel] = pan & 0xff;}int stream_get_pan(int channel){	return SamplePan[channel];}const char *stream_get_name(int channel){	if (stream_buffer[channel])		return stream_name[channel];	else return 0;	/* unused channel */}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
波多野结衣中文字幕一区| 国产亚洲美州欧州综合国| 欧美一级高清片| 国产精品久久久久久福利一牛影视| 亚洲第一主播视频| 成人短视频下载| 精品99999| 亚洲精品成人天堂一二三| 麻豆精品视频在线| 欧美午夜一区二区三区免费大片| 2017欧美狠狠色| 婷婷激情综合网| 欧美亚一区二区| 国产精品久久影院| 国产在线观看一区二区| 欧美日韩在线三级| 亚洲精品日产精品乱码不卡| 国产精品69久久久久水密桃| 欧美一激情一区二区三区| 亚洲一区二区三区四区在线观看| 成人网男人的天堂| 久久精品视频在线看| 蜜桃视频一区二区三区| 欧美日韩电影在线| 亚洲国产精品麻豆| 欧亚一区二区三区| 亚洲精品国产精品乱码不99| 99久久亚洲一区二区三区青草| 亚洲精品在线观看视频| 奇米一区二区三区av| 91精品国产综合久久久蜜臀粉嫩 | 日韩成人午夜精品| 欧美日韩国产高清一区| 亚洲一区二区成人在线观看| 99国内精品久久| 日韩美女啊v在线免费观看| 99久久精品国产一区| 国产精品久久久久久久久果冻传媒 | www.欧美日韩| 中文字幕在线一区二区三区| 成人小视频在线| 亚洲手机成人高清视频| 91国产免费观看| 午夜免费欧美电影| 日韩欧美成人激情| 国产麻豆视频精品| 国产精品色呦呦| 色欲综合视频天天天| 亚洲国产精品久久久久婷婷884 | 免费在线观看精品| 久久亚洲综合色一区二区三区 | 免费成人美女在线观看| 日韩欧美国产综合一区| 国产乱子轮精品视频| 国产精品家庭影院| 欧美日韩一区二区三区四区| 久久91精品久久久久久秒播| 国产人伦精品一区二区| 91福利小视频| 激情成人综合网| 自拍偷拍亚洲激情| 69堂国产成人免费视频| 国产成人激情av| 一区二区三区四区乱视频| 欧美一区2区视频在线观看| 国内精品免费**视频| 一区二区三区中文在线| 日韩精品中文字幕在线一区| 成人永久免费视频| 亚洲成人精品一区二区| 久久精品亚洲精品国产欧美 | 成人国产亚洲欧美成人综合网 | 国产成人免费网站| 亚洲综合免费观看高清在线观看| 日韩一区二区三区电影在线观看| 成人在线视频一区| 日本vs亚洲vs韩国一区三区二区| 亚欧色一区w666天堂| 久久综合色婷婷| 欧美日韩一区精品| 麻豆高清免费国产一区| 久久一留热品黄| 欧美剧情片在线观看| 国产精品一区二区免费不卡| 亚洲小少妇裸体bbw| 久久久九九九九| 欧美日韩另类一区| 成人av网址在线| 久久99深爱久久99精品| 亚洲444eee在线观看| 中文字幕中文在线不卡住| 日韩美女一区二区三区四区| 在线观看av一区二区| 成人成人成人在线视频| 国产综合色在线| 免费成人av在线播放| 亚洲精品日日夜夜| 国产日韩欧美精品在线| 精品国偷自产国产一区| 欧美日韩国产一级| 欧美私人免费视频| 91免费国产在线观看| 国产成人精品亚洲午夜麻豆| 国产一区二区中文字幕| 日本aⅴ精品一区二区三区| 亚洲一区二区三区四区在线| 国产精品美女久久久久久久久久久 | 亚洲精品在线电影| 日韩欧美国产一区二区三区| 欧美精品aⅴ在线视频| 91福利国产精品| 色婷婷av一区二区三区大白胸| av在线综合网| 91视频国产观看| 99视频超级精品| 99精品黄色片免费大全| 成人美女视频在线看| 成人免费毛片aaaaa**| 成人中文字幕电影| 99精品久久免费看蜜臀剧情介绍| 国产suv精品一区二区三区| 国产成人综合亚洲网站| 国产精品66部| 波多野结衣欧美| 91蝌蚪porny九色| 在线欧美小视频| 欧美三级午夜理伦三级中视频| 欧美日韩在线综合| 欧美一卡二卡三卡四卡| 亚洲精品一区二区三区99| 国产亚洲综合av| 亚洲国产精品t66y| 亚洲精品国产成人久久av盗摄 | 怡红院av一区二区三区| 亚洲国产日韩a在线播放性色| 午夜欧美视频在线观看| 国内精品嫩模私拍在线| 不卡一卡二卡三乱码免费网站| 色综合久久中文综合久久牛| 日本韩国欧美一区| 欧美一级免费观看| 国产女同性恋一区二区| 亚洲欧美日韩成人高清在线一区| 夜夜揉揉日日人人青青一国产精品| 天堂一区二区在线| 激情文学综合网| 91亚洲午夜精品久久久久久| 欧美日韩高清一区| 国产天堂亚洲国产碰碰| 亚洲欧美日韩电影| 麻豆精品国产91久久久久久| 成人一区在线观看| 欧美日韩成人激情| 中文字幕的久久| 五月婷婷综合在线| 国产成人8x视频一区二区| 欧美色图片你懂的| 久久只精品国产| 亚洲午夜精品久久久久久久久| 久久97超碰国产精品超碰| 一本色道亚洲精品aⅴ| 精品国产乱码久久久久久夜甘婷婷| 国产精品嫩草久久久久| 免费在线看一区| 91丨九色丨国产丨porny| 精品国产亚洲一区二区三区在线观看| 国产精品久久网站| 精品在线播放午夜| 欧美日韩一区不卡| 亚洲蜜臀av乱码久久精品蜜桃| 国产一区二区调教| 9191成人精品久久| 亚洲六月丁香色婷婷综合久久| 国产一区二区三区香蕉| 欧美精选在线播放| 亚洲乱码国产乱码精品精98午夜| 国产一区二区三区四区五区入口| 欧美日韩精品是欧美日韩精品| 中文字幕一区在线观看| 久久精品国产色蜜蜜麻豆| 欧美精品久久天天躁| 亚洲激情图片qvod| 成人免费视频一区| 久久久久久久久久久电影| 另类专区欧美蜜桃臀第一页| 欧美日韩精品欧美日韩精品一| 亚洲婷婷综合久久一本伊一区| 国产盗摄一区二区| 国产欧美一区在线| 成人午夜碰碰视频| 中文av一区特黄| 国产成人精品免费| 国产精品嫩草久久久久| 国产电影精品久久禁18| 久久嫩草精品久久久久| 国产美女精品一区二区三区| 久久久国产精品午夜一区ai换脸| 国产乱色国产精品免费视频| 精品成a人在线观看| 国产成人aaa|