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

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

?? audio.c

?? 講述linux的初始化過程
?? C
?? 第 1 頁 / 共 3 頁
字號:
			break;	}	if (entry == &emu10k1_devs)		return -ENODEV;	if ((wave_dev = (struct emu10k1_wavedevice *)	     kmalloc(sizeof(struct emu10k1_wavedevice), GFP_KERNEL)) == NULL) {		ERROR();		return -EINVAL;	}	wave_dev->card = card;	wave_dev->wiinst = NULL;	wave_dev->woinst = NULL;	wave_dev->enablebits = PCM_ENABLE_OUTPUT | PCM_ENABLE_INPUT;	/* Default */	if (file->f_mode & FMODE_READ) {		/* Recording */		struct wiinst *wiinst;		if ((wiinst = (struct wiinst *) kmalloc(sizeof(struct wiinst), GFP_KERNEL)) == NULL) {			ERROR();			return -ENODEV;		}		wiinst->recsrc = card->wavein.recsrc;                wiinst->fxwc = card->wavein.fxwc;		switch (wiinst->recsrc) {		case WAVERECORD_AC97:			wiinst->format.samplingrate = 8000;			wiinst->format.bitsperchannel = 16;			wiinst->format.channels = 1;			break;		case WAVERECORD_MIC:			wiinst->format.samplingrate = 8000;			wiinst->format.bitsperchannel = 16;			wiinst->format.channels = 1;			break;		case WAVERECORD_FX:			wiinst->format.samplingrate = 48000;			wiinst->format.bitsperchannel = 16;			wiinst->format.channels = hweight32(wiinst->fxwc);			break;		default:			BUG();			break;		}		wiinst->state = WAVE_STATE_CLOSED;		wiinst->buffer.ossfragshift = 0;		wiinst->buffer.fragment_size = 0;		wiinst->buffer.numfrags = 0;		init_waitqueue_head(&wiinst->wait_queue);		wiinst->mmapped = 0;		wiinst->total_recorded = 0;		wiinst->blocks = 0;		wiinst->lock = SPIN_LOCK_UNLOCKED;		tasklet_init(&wiinst->timer.tasklet, emu10k1_wavein_bh, (unsigned long) wave_dev);		wave_dev->wiinst = wiinst;		emu10k1_wavein_setformat(wave_dev, &wiinst->format);	}	if (file->f_mode & FMODE_WRITE) {		struct woinst *woinst;		if ((woinst = (struct woinst *) kmalloc(sizeof(struct woinst), GFP_KERNEL)) == NULL) {			ERROR();			return -ENODEV;		}		if (wave_dev->wiinst != NULL) {			woinst->format = wave_dev->wiinst->format;		} else {			woinst->format.samplingrate = 8000;			woinst->format.bitsperchannel = 8;			woinst->format.channels = 1;		}		woinst->state = WAVE_STATE_CLOSED;		woinst->buffer.fragment_size = 0;		woinst->buffer.ossfragshift = 0;		woinst->buffer.numfrags = 0;		woinst->device = (card->audio1_num == minor);		init_waitqueue_head(&woinst->wait_queue);		woinst->mmapped = 0;		woinst->total_copied = 0;		woinst->total_played = 0;		woinst->blocks = 0;		woinst->lock = SPIN_LOCK_UNLOCKED;		tasklet_init(&woinst->timer.tasklet, emu10k1_waveout_bh, (unsigned long) wave_dev);		wave_dev->woinst = woinst;		emu10k1_waveout_setformat(wave_dev, &woinst->format);#ifdef PRIVATE_PCM_VOLUME		{			int i;			int j = -1;			/*			 * find out if we've already been in this table			 * xmms reopens dsp on every move of slider			 * this way we keep the same local pcm for such			 * process			 */			for (i = 0; i < MAX_PCM_CHANNELS; i++) {				if (sblive_pcm_volume[i].files == current->files)					break;				// here we should select last used memeber				// improve me in case its not sufficient				if (j < 0 && !sblive_pcm_volume[i].opened)					j = i;			}			// current task not found			if (i == MAX_PCM_CHANNELS) {				// add new entry				if (j < 0)					printk(KERN_WARNING "emu10k1: too many writters!\n");				i = (j >= 0) ? j : 0;				DPD(2, "new pcm private %p\n", current->files);				sblive_pcm_volume[i].files = current->files;				sblive_pcm_volume[i].mixer = pcm_last_mixer;				sblive_pcm_volume[i].attn_l = 0;				sblive_pcm_volume[i].attn_r = 0;				sblive_pcm_volume[i].channel_l = NUM_G;				sblive_pcm_volume[i].channel_r = NUM_G;			} else				DPD(2, "old pcm private %p  0x%x\n", current->files,				    sblive_pcm_volume[i].mixer);			sblive_pcm_volume[i].opened++;		}#endif	}	file->private_data = (void *) wave_dev;	return 0;}static int emu10k1_audio_release(struct inode *inode, struct file *file){	struct emu10k1_wavedevice *wave_dev = (struct emu10k1_wavedevice *) file->private_data;	struct emu10k1_card *card;	unsigned long flags;	lock_kernel();	card = wave_dev->card;	DPF(2, "emu10k1_audio_release()\n");	if (file->f_mode & FMODE_WRITE) {		struct woinst *woinst = wave_dev->woinst;		spin_lock_irqsave(&woinst->lock, flags);		if (woinst->state & WAVE_STATE_OPEN) {			if (woinst->state & WAVE_STATE_STARTED) {				if (!(file->f_flags & O_NONBLOCK)) {					while (!signal_pending(current)					       && (woinst->total_played < woinst->total_copied)) {						DPF(4, "Buffer hasn't been totally played, sleep....\n");						spin_unlock_irqrestore(&woinst->lock, flags);						interruptible_sleep_on(&woinst->wait_queue);						spin_lock_irqsave(&woinst->lock, flags);					}				}			}			if (woinst->mmapped) {				int i;				/* Undo marking the pages as reserved */				for (i = 0; i < woinst->buffer.pages; i++)					mem_map_reserve(virt_to_page(woinst->buffer.addr[i]));			}			emu10k1_waveout_close(wave_dev);		}#ifdef PRIVATE_PCM_VOLUME		{			int i;			/* mark as closed			 * NOTE: structure remains unchanged for next reopen */			for (i = 0; i < MAX_PCM_CHANNELS; i++) {				if (sblive_pcm_volume[i].files == current->files) {					sblive_pcm_volume[i].opened--;					break;				}			}		}#endif		spin_unlock_irqrestore(&woinst->lock, flags);		/* wait for the tasklet (bottom-half) to finish */		tasklet_unlock_wait(&woinst->timer.tasklet);		kfree(wave_dev->woinst);	}	if (file->f_mode & FMODE_READ) {		struct wiinst *wiinst = wave_dev->wiinst;		spin_lock_irqsave(&wiinst->lock, flags);		if (wiinst->state & WAVE_STATE_OPEN)			emu10k1_wavein_close(wave_dev);		spin_unlock_irqrestore(&wiinst->lock, flags);		tasklet_unlock_wait(&wiinst->timer.tasklet);		kfree(wave_dev->wiinst);	}	kfree(wave_dev);	wake_up_interruptible(&card->open_wait);	unlock_kernel();	return 0;}static unsigned int emu10k1_audio_poll(struct file *file, struct poll_table_struct *wait){	struct emu10k1_wavedevice *wave_dev = (struct emu10k1_wavedevice *) file->private_data;	struct woinst *woinst = wave_dev->woinst;	struct wiinst *wiinst = wave_dev->wiinst;	unsigned int mask = 0;	u32 bytestocopy;	unsigned long flags;	DPF(4, "emu10k1_audio_poll()\n");	if (file->f_mode & FMODE_WRITE)		poll_wait(file, &woinst->wait_queue, wait);	if (file->f_mode & FMODE_READ)		poll_wait(file, &wiinst->wait_queue, wait);	if (file->f_mode & FMODE_WRITE) {		spin_lock_irqsave(&woinst->lock, flags);		if (woinst->state & WAVE_STATE_OPEN) {			emu10k1_waveout_update(woinst);			emu10k1_waveout_getxfersize(woinst, &bytestocopy);			if (bytestocopy >= woinst->buffer.fragment_size)				mask |= POLLOUT | POLLWRNORM;		} else			mask |= POLLOUT | POLLWRNORM;		if(woinst->mmapped) {			spin_unlock_irqrestore(&woinst->lock, flags);			return mask;		}		spin_unlock_irqrestore(&woinst->lock, flags);	}	if (file->f_mode & FMODE_READ) {		spin_lock_irqsave(&wiinst->lock, flags);		if (wiinst->state == WAVE_STATE_CLOSED) {			calculate_ifrag(wiinst);			if (emu10k1_wavein_open(wave_dev) < 0) {				spin_unlock_irqrestore(&wiinst->lock, flags);				return (mask |= POLLERR);			}		}		if (!(wiinst->state & WAVE_STATE_STARTED)) {			wave_dev->enablebits |= PCM_ENABLE_INPUT;			emu10k1_wavein_start(wave_dev);		}		emu10k1_wavein_update(wave_dev->card, wiinst);		emu10k1_wavein_getxfersize(wiinst, &bytestocopy);		if (bytestocopy >= wiinst->buffer.fragment_size)			mask |= POLLIN | POLLRDNORM;		spin_unlock_irqrestore(&wiinst->lock, flags);	}	return mask;}static void calculate_ofrag(struct woinst *woinst){	struct waveout_buffer *buffer = &woinst->buffer;	u32 fragsize;	if (buffer->fragment_size)		return;	if (!buffer->ossfragshift) {		fragsize = (woinst->format.bytespersec * WAVEOUT_DEFAULTFRAGLEN) / 1000 - 1;		while (fragsize) {			fragsize >>= 1;			buffer->ossfragshift++;		}	}	if (buffer->ossfragshift < WAVEOUT_MINFRAGSHIFT)		buffer->ossfragshift = WAVEOUT_MINFRAGSHIFT;	buffer->fragment_size = 1 << buffer->ossfragshift;	if (!buffer->numfrags) {		u32 numfrags;		numfrags = (woinst->format.bytespersec * WAVEOUT_DEFAULTBUFLEN) / (buffer->fragment_size * 1000) - 1;		buffer->numfrags = 1;		while (numfrags) {			numfrags >>= 1;			buffer->numfrags <<= 1;		}	}	if (buffer->numfrags < MINFRAGS)		buffer->numfrags = MINFRAGS;	if (buffer->numfrags * buffer->fragment_size > WAVEOUT_MAXBUFSIZE) {		buffer->numfrags = WAVEOUT_MAXBUFSIZE / buffer->fragment_size;		if (buffer->numfrags < MINFRAGS) {			buffer->numfrags = MINFRAGS;			buffer->fragment_size = WAVEOUT_MAXBUFSIZE / MINFRAGS;		}	} else if (buffer->numfrags * buffer->fragment_size < WAVEOUT_MINBUFSIZE)		buffer->numfrags = WAVEOUT_MINBUFSIZE / buffer->fragment_size;	buffer->size = buffer->fragment_size * buffer->numfrags;	buffer->pages = buffer->size / PAGE_SIZE + ((buffer->size % PAGE_SIZE) ? 1 : 0);	DPD(2, " calculated playback fragment_size -> %d\n", buffer->fragment_size);	DPD(2, " calculated playback numfrags -> %d\n", buffer->numfrags);	return;}static void calculate_ifrag(struct wiinst *wiinst){	struct wavein_buffer *buffer = &wiinst->buffer;	u32 fragsize, bufsize, size[4];	int i, j;	if (buffer->fragment_size)		return;	if (!buffer->ossfragshift) {		fragsize = (wiinst->format.bytespersec * WAVEIN_DEFAULTFRAGLEN) / 1000 - 1;		while (fragsize) {			fragsize >>= 1;			buffer->ossfragshift++;		}	}	if (buffer->ossfragshift < WAVEIN_MINFRAGSHIFT)		buffer->ossfragshift = WAVEIN_MINFRAGSHIFT;	buffer->fragment_size = 1 << buffer->ossfragshift;	if (!buffer->numfrags)		buffer->numfrags = (wiinst->format.bytespersec * WAVEIN_DEFAULTBUFLEN) / (buffer->fragment_size * 1000) - 1;	if (buffer->numfrags < MINFRAGS)		buffer->numfrags = MINFRAGS;	if (buffer->numfrags * buffer->fragment_size > WAVEIN_MAXBUFSIZE) {		buffer->numfrags = WAVEIN_MAXBUFSIZE / buffer->fragment_size;		if (buffer->numfrags < MINFRAGS) {			buffer->numfrags = MINFRAGS;			buffer->fragment_size = WAVEIN_MAXBUFSIZE / MINFRAGS;		}	} else if (buffer->numfrags * buffer->fragment_size < WAVEIN_MINBUFSIZE)		buffer->numfrags = WAVEIN_MINBUFSIZE / buffer->fragment_size;	bufsize = buffer->fragment_size * buffer->numfrags;	if (bufsize >= 0x10000) {		buffer->size = 0x10000;		buffer->sizeregval = 0x1f;	} else {		buffer->size = 0;		size[0] = 384;		size[1] = 448;		size[2] = 512;		size[3] = 640;		for (i = 0; i < 8; i++)			for (j = 0; j < 4; j++)				if (bufsize >= size[j]) {					buffer->size = size[j];					size[j] *= 2;					buffer->sizeregval = i * 4 + j + 1;				} else					goto exitloop;	      exitloop:		if (buffer->size == 0) {			buffer->size = 384;			buffer->sizeregval = 0x01;		}	}	buffer->numfrags = buffer->size / buffer->fragment_size;	if (buffer->size % buffer->fragment_size)		BUG();	DPD(2, " calculated recording fragment_size -> %d\n", buffer->fragment_size);	DPD(2, " calculated recording numfrags -> %d\n", buffer->numfrags);	DPD(2, " buffer size register -> 0x%2x\n", buffer->sizeregval);	return;}void emu10k1_wavein_bh(unsigned long refdata){	struct emu10k1_wavedevice *wave_dev = (struct emu10k1_wavedevice *) refdata;	struct wiinst *wiinst = wave_dev->wiinst;	u32 bytestocopy;	unsigned long flags;	spin_lock_irqsave(&wiinst->lock, flags);	if (!(wiinst->state & WAVE_STATE_STARTED)) {		spin_unlock_irqrestore(&wiinst->lock, flags);		return;	}	emu10k1_wavein_update(wave_dev->card, wiinst);	if (wiinst->mmapped) {		spin_unlock_irqrestore(&wiinst->lock, flags);		return;	}	emu10k1_wavein_getxfersize(wiinst, &bytestocopy);	spin_unlock_irqrestore(&wiinst->lock, flags);	if (bytestocopy >= wiinst->buffer.fragment_size)		wake_up_interruptible(&wiinst->wait_queue);	else		DPD(3, "Not enough transfer size, %d\n", bytestocopy);	return;}void emu10k1_waveout_bh(unsigned long refdata){	struct emu10k1_wavedevice *wave_dev = (struct emu10k1_wavedevice *) refdata;	struct woinst *woinst = wave_dev->woinst;	u32 bytestocopy;	unsigned long flags;	spin_lock_irqsave(&woinst->lock, flags);	if (!(woinst->state & WAVE_STATE_STARTED)) {		spin_unlock_irqrestore(&woinst->lock, flags);		return;	}	emu10k1_waveout_update(woinst);	emu10k1_waveout_getxfersize(woinst, &bytestocopy);	if (woinst->buffer.fill_silence) {		spin_unlock_irqrestore(&woinst->lock, flags);		emu10k1_waveout_fillsilence(woinst);	} else		spin_unlock_irqrestore(&woinst->lock, flags);	if (bytestocopy >= woinst->buffer.fragment_size)		wake_up_interruptible(&woinst->wait_queue);	else		DPD(3, "Not enough transfer size -> %d\n", bytestocopy);	return;}struct file_operations emu10k1_audio_fops = {	owner:		THIS_MODULE,	llseek:		emu10k1_audio_llseek,	read:		emu10k1_audio_read,	write:		emu10k1_audio_write,	poll:		emu10k1_audio_poll,	ioctl:		emu10k1_audio_ioctl,	mmap:		emu10k1_audio_mmap,	open:		emu10k1_audio_open,	release:	emu10k1_audio_release,};

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久久久久综合色一本| 亚洲欧洲综合另类| 亚洲精品一区在线观看| 日韩一区二区三区四区| 欧美一卡2卡三卡4卡5免费| 欧美高清hd18日本| 欧美理论在线播放| 日韩一区二区三区在线| 精品电影一区二区三区| 国产欧美精品国产国产专区| 欧美国产日韩精品免费观看| 国产精品看片你懂得| 国产精品不卡在线| 一区二区三区自拍| 亚洲成av人在线观看| 青青国产91久久久久久| 久久99精品一区二区三区三区| 国产麻豆一精品一av一免费| 成人性生交大片免费看在线播放| 成人国产精品免费观看| 色又黄又爽网站www久久| 欧美少妇xxx| 日韩一区二区视频| 欧美激情资源网| 怡红院av一区二区三区| 免费观看久久久4p| 粉嫩在线一区二区三区视频| 97国产一区二区| 欧美日韩午夜精品| 欧美精品一区二区在线播放| 国产精品进线69影院| 亚洲国产综合色| 麻豆国产欧美一区二区三区| 波多野结衣亚洲| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 制服丝袜亚洲色图| 久久精品视频一区二区| 亚洲综合久久久| 老司机精品视频线观看86| 不卡av电影在线播放| 欧美日韩一区二区三区四区五区 | 日韩一区二区三区三四区视频在线观看| 日韩一区二区高清| 亚洲欧美日本在线| 久久国产生活片100| 色天使色偷偷av一区二区| 精品少妇一区二区三区在线视频| 国产精品美女久久久久久久久| 婷婷成人激情在线网| 成人国产精品视频| 日韩欧美一区中文| 亚洲欧美日韩国产一区二区三区| 欧美aⅴ一区二区三区视频| 成人app下载| 日韩三级免费观看| 亚洲精品日韩一| 国产精品69毛片高清亚洲| 欧美日本一区二区三区四区| 欧美极品另类videosde| 全国精品久久少妇| 色婷婷av久久久久久久| 国产欧美1区2区3区| 麻豆成人av在线| 欧美色图片你懂的| 国产精品二三区| 激情五月婷婷综合| 欧美理论在线播放| 一区二区三区精品| 成人成人成人在线视频| 欧美成人vr18sexvr| 亚洲成人自拍一区| 色爱区综合激月婷婷| 中文幕一区二区三区久久蜜桃| 老色鬼精品视频在线观看播放| 欧美日韩一区二区在线观看视频| 亚洲欧美自拍偷拍色图| 粉嫩av一区二区三区粉嫩| 日韩欧美一区二区久久婷婷| 亚洲妇熟xx妇色黄| 在线免费精品视频| 国产精品第13页| 成人午夜在线视频| 在线观看www91| 国产精品一线二线三线精华| 亚洲精品高清在线观看| 亚洲精品成人a在线观看| 成人免费视频视频| 久久久久久亚洲综合| 久久99国产精品久久| 日韩一区二区三区视频在线| 五月天激情小说综合| 欧美日韩一区二区三区免费看| 一区二区日韩电影| 91黄色在线观看| 一区二区三区四区亚洲| 色哟哟一区二区在线观看| 一区二区中文视频| 色综合视频在线观看| 亚洲乱码国产乱码精品精98午夜| gogo大胆日本视频一区| 日韩一区在线看| 91一区二区在线| 成人欧美一区二区三区白人| 色综合色综合色综合| 亚洲人成亚洲人成在线观看图片 | 粉嫩av亚洲一区二区图片| 久久久美女艺术照精彩视频福利播放| 久久99国产精品久久99果冻传媒| 欧美一级欧美三级在线观看| 麻豆精品视频在线观看视频| 亚洲视频在线一区观看| av动漫一区二区| 一区二区视频在线| 欧美色区777第一页| 日韩高清在线不卡| 日韩一区二区三区四区| 国产一区美女在线| 国产精品乱码久久久久久| 色婷婷综合激情| 天堂一区二区在线| 精品99久久久久久| 粉嫩aⅴ一区二区三区四区| 中文字幕在线观看一区| 欧美特级限制片免费在线观看| 午夜亚洲国产au精品一区二区| 日韩午夜电影在线观看| 国产一区二区影院| 亚洲日本欧美天堂| 欧美一区二区三级| 国产精品综合av一区二区国产馆| 日韩一区在线免费观看| 欧美精品在线观看一区二区| 国内精品视频666| 中文字幕一区在线| 欧美肥胖老妇做爰| 国产精品亚洲成人| 一区二区三区美女| 亚洲精品一区二区精华| 91女神在线视频| 青青草视频一区| 国产精品色呦呦| 欧美日韩国产一区| 国产伦精品一区二区三区免费| 亚洲人成人一区二区在线观看| 在线电影国产精品| 成人性生交大片免费看中文网站| 亚洲国产精品麻豆| 国产日韩欧美一区二区三区综合| 欧洲在线/亚洲| 国产美女在线观看一区| 亚洲成人精品一区| 国产欧美一区二区精品性色超碰| 欧美系列在线观看| 国产精品影视在线观看| 天天射综合影视| 国产精品乱码人人做人人爱| 欧美一级在线免费| 91色在线porny| 国产精品一区二区91| 亚洲成人免费视频| 国产精品国产a级| 精品国产百合女同互慰| 欧美制服丝袜第一页| 国产盗摄精品一区二区三区在线 | 成人黄色小视频在线观看| 亚洲成av人片在线观看| 国产精品传媒视频| 久久久五月婷婷| 日韩欧美在线123| 欧美午夜精品理论片a级按摩| 国产91富婆露脸刺激对白| 美女www一区二区| 亚洲成人激情av| 国产精品国产三级国产aⅴ无密码| 精品免费99久久| 亚洲欧美在线aaa| 26uuu精品一区二区| 欧美日韩国产不卡| 色哟哟精品一区| 成人高清免费在线播放| 国产精品91xxx| 紧缚奴在线一区二区三区| 日韩极品在线观看| 亚洲一区二区三区中文字幕| 国产精品毛片高清在线完整版| 久久久www成人免费毛片麻豆 | 国产精品人成在线观看免费| 日韩欧美资源站| 欧美美女激情18p| 欧美猛男超大videosgay| 色综合久久66| 91精品1区2区| 91视视频在线直接观看在线看网页在线看 | 美女国产一区二区三区| 天天综合色天天综合| 亚洲午夜一区二区三区| 亚洲一级不卡视频| 亚洲制服丝袜av| 亚洲一区二区三区中文字幕| 一级日本不卡的影视|