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

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

?? sb.c

?? 很不錯的tcpip源碼, 尤其是針對嵌入式系統編程來說是個非常不錯的選擇
?? C
?? 第 1 頁 / 共 2 頁
字號:
		break;
	case 10:
		sb_write_mix(base,0x80,8);
		break;
	default:
		printf("invalid irq %d\n",irq);
		return -1;
	}
	maskon(irq);
	if(dma8 < 0 || dma8 > 3 || dma8 == 2){
		printf("dma8 invalid\n");
		return -1;
	}
	if(dma16 < 5 || dma16 > 7){
		printf("dma16 invalid\n");
		return -1;
	}
	dis_dmaxl(dma16);
	dis_dmaxl(dma8);
	dma = (1 << dma16) | (1<<dma8);
	sb_write_mix(base,0x81,dma);

	return 0;
}
/* Enter A/D mode */
int
sb_adc(rate,stereo,bufsiz)
long rate;	/* Sampling rate, Hz */
int stereo;	/* 1 = stereo, 0 = mono */
int bufsiz;	/* Size of mbufs to be generated (1/2 DMA buffer) */
{
	if(Sb.base == 0){
		printf("No SB16 card attached\n");
		return -1;
	}
	if(Sb.state != IDLE){
		printf("SB16 not idle\n");
		return -1;
	}
	/* Allocate DMA buffer */
	if((Sb.ioptr = Sb.dmabuf = dma_malloc(&Sb.physaddr,2*bufsiz)) == NULL){
		printf("Can't alloc dma buffer\n");
		return -1;
	}
	Sb.state = ADC;
	Sb.dmasize = 2*bufsiz;
	setup_dma(Sb.dma16,Sb.physaddr,Sb.dmasize,0x54);

	/* Set sampling rate */
	sb_write_byte(Sb.base,0x42);
	sb_write_word_be(Sb.base,rate);

	sb_write_byte(Sb.base,0xbe);	/* 16-bit input, auto-init, fifo on */
	if(stereo)
		sb_write_byte(Sb.base,0x30);	/* stereo, signed */
	else
		sb_write_byte(Sb.base,0x10);	/* mono, signed */
	/* Write number of 16-bit words in half buffer, minus 1 */
	sb_write_word_le(Sb.base,Sb.dmasize/4-1);
	return 0;
}
/* Enter DAC mode */
int
sb_dac(rate,stereo,bufsiz)
long rate;	/* Sampling rate, Hz */
int stereo;	/* 1 = stereo, 0 = mono */
int bufsiz;	/* Size of buffer unit (1/2 DMA buffer) */
{
	if(Sb.base == 0){
		printf("No SB16 card attached\n");
		return -1;
	}
	if(Sb.state != IDLE){
		printf("SB16 not idle\n");
		return -1;
	}
	/* Allocate DMA buffer */
	if((Sb.ioptr = Sb.dmabuf = dma_malloc(&Sb.physaddr,2*bufsiz)) == NULL){
		printf("Can't alloc dma buffer\n");
		return -1;
	}
	Sb.state = DAC;
	Sb.dmasize = 2*bufsiz;
	Sb.stuffsamples = 0;
	Sb.bufcnt = 0;
	memset(Sb.dmabuf,0,Sb.dmasize);
	
	sb_write_byte(Sb.base,0xd1);	/* spkr on */
	setup_dma(Sb.dma16,Sb.physaddr,Sb.dmasize,0x58);

	/* Set up sampling rate */
	sb_write_byte(Sb.base,0x41);
	sb_write_word_be(Sb.base,rate);

	sb_write_byte(Sb.base,0xb6);	/* 16-bit output, auto-init, fifo on */
	if(stereo)
		sb_write_byte(Sb.base,0x30);	/* stereo, signed */
	else
		sb_write_byte(Sb.base,0x10);	/* mono, signed */
	/* Number of 16-bit words in a half-buffer, minus 1 */
	sb_write_word_le(Sb.base,Sb.dmasize/4-1);
	Sb.pause = 1;
	sb_write_byte(Sb.base,0xd5);	/* Pause until we get data */
	return 0;
}
/* Return soundblaster to idle condition */
int
sb_idle()
{
	switch(Sb.state){
	case IDLE:
		return 0;	/* Already idle */		
	case DAC:		/* Wait for output queue to drain */
	case ADC:
		/* stop conversion */
		sb_write_byte(Sb.base,0xd9);
		break;
	}
	Sb.state = IDLE;
	kwait(NULL);
	/* Ought to wait for last interrupt here */
	free_q(&Sb.sndq);
	free_q(&Sb.rcvq);
	dma_disable(Sb.dma16);
	dmaunlock(Sb.physaddr,Sb.dmasize);
	free(Sb.dmabuf);
	Sb.dmabuf = NULL;
	Sb.physaddr = 0;

	return 0;
}

/* Reset Soundblaster card */
static int
sb_reset(base)
int base;
{
	unsigned int i;

	outportb(base+SB_RESET,1);
	for(i=100;i !=0;i--)
		;
	outportb(base+SB_RESET,0);
	for(i=65535;i != 0;i--){
		if(sb_read_data(base) == 0xaa)
			break;
	}
	if(i == 0)
		return -1;
	return 0;
}
/* Wait for read data to become available, then read it. Return -1 on timeout */
static int
sb_read_data(base)
int base;
{
	unsigned int i;

	for(i=65535;i!=0;i--){
		if(inportb(base+SB_RB_STAT) & 0x80)
			break;
	}
	if(i == 0)
		return -1;	/* Timeout */
	return inportb(base+SB_READ_DATA);
}

/* Write data byte to soundblaster when it's ready. return 0 normally, -1 on err */
static int
sb_write_byte(base,data)
int base,data;
{
	int i;

	for(i=65535;i!=0;i--){
		if((inportb(base+SB_WB_STAT) & 0x80) == 0)
			break;
	}
	if(i == 0)
		return -1;
	outportb(base+SB_WB,data);
	return 0;
}
/* Write 16-bit word in big-endian order */
static int
sb_write_word_be(base,data)
int base;
short data;
{
	sb_write_byte(base,data >> 8);
	sb_write_byte(base,data);
	return 0;
}
/* Write 16-bit word in little-endian order */
static int
sb_write_word_le(base,data)
int base;
short data;
{
	sb_write_byte(base,data);
	sb_write_byte(base,data >> 8);
	return 0;
}
/* Read the mixer */
static int
sb_read_mix(base,reg)
int base,reg;
{
	outportb(base+SB_MIX_INDEX,reg);
	return inportb(base+SB_MIX_DATA);
}

/* Write data to soundblaster when it's ready. return 0 normally, -1 on err */
static int
sb_write_mix(base,reg,data)
int base,reg,data;
{
	outportb(base+SB_MIX_INDEX,reg);
	outportb(base+SB_MIX_DATA,data);
	return 0;
}

dosbcal(argc,argv,p)
int argc;
char *argv[];
void *p;
{
	long rate;

	rate = atol(argv[1]);
	sb_calibrate(rate);
	return 0;
}

/* Find DC offsets of each channel */
sb_calibrate(rate)
long rate;
{
	long leftavg,rightavg;
	uint8 omixl,omixr;
	long samples;

	/* Save previous mixer state,
	 * then turn everything off
	 */
	omixl = sb_read_mix(Sb.base,SB_INMIXL);
	omixr = sb_read_mix(Sb.base,SB_INMIXR);
	sb_write_mix(Sb.base,SB_INMIXL,0);		/* All inputs off */
	sb_write_mix(Sb.base,SB_INMIXR,0);

	/* Collect a second of samples */
	sb_adc(rate,1,TXBUF);
	ppause(1000L);
	sb_idle();

	/* Restore previous mixer switches */
	sb_write_mix(Sb.base,SB_INMIXL,omixl);
	sb_write_mix(Sb.base,SB_INMIXR,omixr);

	/* Analyze the data */
	leftavg = rightavg = 0;
	samples = 0;
	while(Sb.rcvq != NULL){
		uint16 left,right;

		left = pull16le(&Sb.rcvq);
		right = pull16le(&Sb.rcvq);

		leftavg += left;
		rightavg += right;		
		samples++;
	}
	leftavg /= samples;
	rightavg /= samples;
	printf("Left channel avg: %ld Right channel avg: %ld\n",
	 leftavg,rightavg);

	return 0;
}
unsigned short
pull16le(bpp)
struct mbuf **bpp;
{
	uint16 x;

	x = pull16(bpp);
	return (x >> 8) | (x << 8);
}
/* Copy as much of the buffer as will fit into the DMA buffer and start
 * the DAC if it was paused
 */
void
sb_outstart(bpp)
struct mbuf **bpp;
{
	int cnt;
	int istate;

	istate = dirps();
	/* Copy as much send queue data as we can into the DMA buffer */
	while(Sb.bufcnt < Sb.dmasize){
		cnt = min(Sb.dmasize-Sb.bufcnt,Sb.dmabuf+Sb.dmasize-Sb.ioptr);
		cnt = pullup(bpp,Sb.ioptr,cnt);
		if(cnt == 0)
			break;
		Sb.ioptr += cnt;
		if(Sb.ioptr >= Sb.dmabuf + Sb.dmasize)
			Sb.ioptr = Sb.dmabuf;	/* Write pointer wraparound */
		Sb.bufcnt += cnt;		/* Add to bytes in buffer */
	}
	if(!Sb.pause && Sb.bufcnt != 0 && Sb.bufcnt < Sb.dmasize/2){
		/* While running, pad out a partial half-buffer with silence */
		cnt = Sb.dmasize/2 - Sb.bufcnt;
		memset(Sb.ioptr,0,cnt);
		Sb.stuffsamples += cnt;
		Sb.ioptr += cnt;
		if(Sb.ioptr >= Sb.dmabuf + Sb.dmasize)
			Sb.ioptr = Sb.dmabuf;	/* Write pointer wraparound */
		Sb.bufcnt += cnt;
	} else if(Sb.pause && Sb.bufcnt >= Sb.dmasize/2){
		/* If paused and there's now at least one full buffer, resume */
		Sb.pause = 0;
		sb_write_byte(Sb.base,0xd6);	/* Resume output */
	}
	restore(istate);
}
/* Send a buffer to the DAC */
int
sb_send(bp)
struct mbuf *bp;
{
	if(Sb.state == DAC)
		sb_outstart(&bp);

	if(bp != NULL){
		/* Queue remainder */
		disable();
		append(&Sb.sndq,&bp);
		enable();
	}
	return 0;
}

/* Soundblaster interrupt handler */
INTERRUPT (far *(sbint)(dev))()
int dev;
{
	int i;
	struct mbuf *bp;

	i = sb_read_mix(Sb.base,0x82);
	if(i & 1)	/* 8-bit transfers not used, reset anyway */
		(void)inportb(Sb.base+0xe);
	if(i & 2){
		(void)inportb(Sb.base+0xf);
		switch(Sb.state){
		case IDLE:
			break;
		case DAC:
			Sb.bufcnt -= Sb.dmasize/2;	/* Amount sent */
			sb_outstart(&Sb.sndq);		/* Try to send more */
			if(Sb.bufcnt == 0){
				/* buffer empty, pause */
				Sb.pause = 1;
				sb_write_byte(Sb.base,0xd5);
			}
			break;
		case ADC:
			bp = alloc_mbuf(Sb.dmasize/2);
			memcpy(bp->data,Sb.ioptr,Sb.dmasize/2);
			bp->cnt = Sb.dmasize/2;
			Sb.ioptr += bp->cnt;
			if(Sb.ioptr >= Sb.dmabuf + Sb.dmasize)
				Sb.ioptr = Sb.dmabuf;
			enqueue(&Sb.rcvq,&bp);
			break;
		}
		ksignal(&Sb,0);
	}
	return NULL;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
制服丝袜av成人在线看| 精品一区二区三区影院在线午夜| 欧美一区二区三区免费视频| 91黄视频在线观看| 91在线丨porny丨国产| 顶级嫩模精品视频在线看| 久久97超碰国产精品超碰| 日韩电影在线免费看| 日本欧美加勒比视频| 日韩电影网1区2区| 奇米888四色在线精品| 精品亚洲成av人在线观看| 国产精品99久久久久久有的能看| 久久精品999| 国产成人日日夜夜| 99久久久精品| 在线观看不卡一区| 日韩欧美国产三级| 国产欧美一区视频| 亚洲猫色日本管| 五月激情丁香一区二区三区| 蜜臀av性久久久久av蜜臀妖精| 精品无人码麻豆乱码1区2区| 国产成人精品一区二| 色婷婷一区二区三区四区| 欧美日韩国产综合一区二区 | 国产在线播精品第三| 国产乱人伦偷精品视频不卡 | 国产精品欧美综合在线| **性色生活片久久毛片| 午夜精品久久久久久久| 黄色日韩三级电影| 一本色道久久加勒比精品 | 欧美精品丝袜久久久中文字幕| 欧美一区二区免费| 国产精品美日韩| 午夜精品爽啪视频| 成人国产免费视频| 在线综合亚洲欧美在线视频| 久久久久久影视| 性做久久久久久久免费看| 国产一区二区三区视频在线播放| 91亚洲午夜精品久久久久久| 91精品国产综合久久蜜臀| 国产精品乱人伦| 亚洲成人av中文| www.亚洲激情.com| 精品国产伦一区二区三区观看体验| 国产欧美一区二区精品性 | 制服.丝袜.亚洲.中文.综合| 国产亚洲精品福利| 日韩精品一二区| 色婷婷国产精品| 国产精品国产三级国产| 久久国产乱子精品免费女| 91电影在线观看| 中文字幕一区二区三区乱码在线| 秋霞午夜av一区二区三区| 色婷婷综合久久久中文字幕| 国产清纯白嫩初高生在线观看91| 美女视频第一区二区三区免费观看网站| 成人av免费在线观看| 久久综合99re88久久爱| 青青草国产精品97视觉盛宴| 欧洲一区在线电影| 亚洲色图清纯唯美| 99精品国产视频| 中文字幕精品在线不卡| 国产精品夜夜嗨| 日韩女优视频免费观看| 免费高清在线一区| 91精品国产丝袜白色高跟鞋| 午夜视频在线观看一区| 欧美日韩中文精品| 亚洲一区二区视频在线| 91国模大尺度私拍在线视频| 亚洲天堂免费在线观看视频| 91影院在线观看| 亚洲精品中文在线| 色欧美88888久久久久久影院| 国产精品欧美一区喷水| av一区二区久久| 亚洲另类中文字| 欧美体内she精高潮| 亚洲电影中文字幕在线观看| 欧美精品色一区二区三区| 视频一区中文字幕国产| 欧美一区二区免费视频| 国产一区二区三区免费| 国产精品免费丝袜| 91免费看视频| 性欧美疯狂xxxxbbbb| 日韩一区二区电影网| 国内一区二区视频| 国产精品少妇自拍| 91福利视频网站| 免费人成黄页网站在线一区二区| 欧美成人在线直播| 成人午夜激情片| 亚洲一区二区三区视频在线播放 | 精品无码三级在线观看视频| 久久久亚洲精华液精华液精华液| 成人av免费观看| 亚洲成人一区二区| 舔着乳尖日韩一区| 精品亚洲porn| 在线免费亚洲电影| 亚洲精品一二三四区| 91污在线观看| 亚洲福利视频三区| 精品国产一二三| 波多野结衣在线一区| 亚洲国产成人av好男人在线观看| 日韩一区二区在线观看| 成人午夜免费av| 香蕉成人伊视频在线观看| 久久精品一区二区| 欧美伊人久久久久久久久影院| 久久 天天综合| 一区二区三区欧美亚洲| 欧美大片一区二区三区| 一本色道久久加勒比精品| 国产自产高清不卡| 亚洲尤物视频在线| 久久九九国产精品| 91精品国产综合久久精品app| 成人丝袜视频网| 久久97超碰色| 日本最新不卡在线| 一区二区三区成人在线视频| 国产亚洲精品中文字幕| 69堂精品视频| 91国偷自产一区二区开放时间| 国产精品小仙女| 精品影视av免费| 欧美aa在线视频| 亚洲午夜在线观看视频在线| 国产精品视频yy9299一区| 欧美电影免费观看高清完整版在线观看| 97久久超碰精品国产| 丁香亚洲综合激情啪啪综合| 国产专区欧美精品| 久久精品国产精品青草| 五月激情六月综合| 亚洲成人免费视频| 亚洲一级电影视频| 一区二区三区在线播放| 久久一留热品黄| 久久午夜羞羞影院免费观看| 日韩不卡一二三区| 欧美一级免费大片| 亚洲三级视频在线观看| 在线精品视频一区二区三四| 国产寡妇亲子伦一区二区| 久久精品国产**网站演员| 亚洲sss视频在线视频| 亚洲韩国一区二区三区| 夜色激情一区二区| 亚洲小说欧美激情另类| 午夜精品一区二区三区电影天堂| 亚洲一区二区在线播放相泽| 亚洲成人精品一区二区| 天天亚洲美女在线视频| 日韩电影在线免费看| 美女任你摸久久| 国产一区二区福利| 从欧美一区二区三区| 94色蜜桃网一区二区三区| 欧美性xxxxx极品少妇| 在线成人av网站| 精品久久久久久久一区二区蜜臀| 狠狠狠色丁香婷婷综合激情 | 日韩高清一区在线| 午夜精品福利久久久| 亚洲国产精品一区二区www| 依依成人精品视频| 亚洲成人先锋电影| 国产在线精品一区二区三区不卡| 国产精品99久久久久久有的能看| 成人av片在线观看| 欧美伦理视频网站| 久久精品视频在线看| 亚洲美女偷拍久久| 久久国产人妖系列| 99re视频精品| 欧美日韩国产经典色站一区二区三区| 精品第一国产综合精品aⅴ| 国产午夜亚洲精品理论片色戒| **欧美大码日韩| 免费成人深夜小野草| av中文字幕一区| 欧美一区二区私人影院日本| 中文字幕av一区二区三区高| 亚洲国产va精品久久久不卡综合| 极品少妇一区二区三区精品视频| 国产精品一级片| 中文字幕av资源一区| 国产精一区二区三区| 香蕉久久夜色精品国产使用方法| 精品写真视频在线观看|