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

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

?? audio.c

?? 講述linux的初始化過程
?? C
?? 第 1 頁 / 共 3 頁
字號:
			}			return put_user(val, (int *) arg);		} else {			if (file->f_mode & FMODE_READ)				val = wiinst->format.channels;			else if (file->f_mode & FMODE_WRITE)				val = woinst->format.channels;			return put_user(val, (int *) arg);		}		break;	case SNDCTL_DSP_GETFMTS:		DPF(2, "SNDCTL_DSP_GETFMTS:\n");		if (file->f_mode & FMODE_READ)			val = AFMT_S16_LE;		else if (file->f_mode & FMODE_WRITE)			val = AFMT_S16_LE | AFMT_U8;		return put_user(val, (int *) arg);	case SNDCTL_DSP_SETFMT:	/* Same as SNDCTL_DSP_SAMPLESIZE */		DPF(2, "SNDCTL_DSP_SETFMT:\n");		if (get_user(val, (int *) arg))			return -EFAULT;		DPD(2, " val is %d\n", val);		if (val != AFMT_QUERY) {			if (file->f_mode & FMODE_READ) {				struct wave_format format;				spin_lock_irqsave(&wiinst->lock, flags);				format = wiinst->format;				format.bitsperchannel = val;				if (emu10k1_wavein_setformat(wave_dev, &format) < 0)					return -EINVAL;				val = wiinst->format.bitsperchannel;				spin_unlock_irqrestore(&wiinst->lock, flags);				DPD(2, "set recording sample size -> %d\n", val);			}			if (file->f_mode & FMODE_WRITE) {				struct wave_format format;				spin_lock_irqsave(&woinst->lock, flags);				format = woinst->format;				format.bitsperchannel = val;				if (emu10k1_waveout_setformat(wave_dev, &format) < 0)					return -EINVAL;				val = woinst->format.bitsperchannel;				spin_unlock_irqrestore(&woinst->lock, flags);				DPD(2, "set playback sample size -> %d\n", val);			}			return put_user((val == 16) ? AFMT_S16_LE : AFMT_U8, (int *) arg);		} else {			if (file->f_mode & FMODE_READ)				val = wiinst->format.bitsperchannel;			else if (file->f_mode & FMODE_WRITE)				val = woinst->format.bitsperchannel;			return put_user((val == 16) ? AFMT_S16_LE : AFMT_U8, (int *) arg);		}		break;	case SOUND_PCM_READ_BITS:		if (file->f_mode & FMODE_READ)			val = wiinst->format.bitsperchannel;		else if (file->f_mode & FMODE_WRITE)			val = woinst->format.bitsperchannel;		return put_user((val == 16) ? AFMT_S16_LE : AFMT_U8, (int *) arg);	case SOUND_PCM_READ_RATE:		if (file->f_mode & FMODE_READ)			val = wiinst->format.samplingrate;		else if (file->f_mode & FMODE_WRITE)			val = woinst->format.samplingrate;		return put_user(val, (int *) arg);	case SOUND_PCM_READ_CHANNELS:		if (file->f_mode & FMODE_READ)			val = wiinst->format.channels;		else if (file->f_mode & FMODE_WRITE)			val = woinst->format.channels;		return put_user(val, (int *) arg);	case SOUND_PCM_WRITE_FILTER:		DPF(2, "SOUND_PCM_WRITE_FILTER: not implemented\n");		break;	case SOUND_PCM_READ_FILTER:		DPF(2, "SOUND_PCM_READ_FILTER: not implemented\n");		break;	case SNDCTL_DSP_SETSYNCRO:		DPF(2, "SNDCTL_DSP_SETSYNCRO: not implemented\n");		break;	case SNDCTL_DSP_GETTRIGGER:		DPF(2, "SNDCTL_DSP_GETTRIGGER:\n");		if (file->f_mode & FMODE_WRITE && (wave_dev->enablebits & PCM_ENABLE_OUTPUT))			val |= PCM_ENABLE_OUTPUT;		if (file->f_mode & FMODE_READ && (wave_dev->enablebits & PCM_ENABLE_INPUT))			val |= PCM_ENABLE_INPUT;		return put_user(val, (int *) arg);	case SNDCTL_DSP_SETTRIGGER:		DPF(2, "SNDCTL_DSP_SETTRIGGER:\n");		if (get_user(val, (int *) arg))			return -EFAULT;		if (file->f_mode & FMODE_WRITE) {			spin_lock_irqsave(&woinst->lock, flags);			if (val & PCM_ENABLE_OUTPUT) {				wave_dev->enablebits |= PCM_ENABLE_OUTPUT;				if (woinst->state & WAVE_STATE_OPEN)					emu10k1_waveout_start(wave_dev);			} else {				wave_dev->enablebits &= ~PCM_ENABLE_OUTPUT;				if (woinst->state & WAVE_STATE_STARTED)					emu10k1_waveout_stop(wave_dev);			}			spin_unlock_irqrestore(&woinst->lock, flags);		}		if (file->f_mode & FMODE_READ) {			spin_lock_irqsave(&wiinst->lock, flags);			if (val & PCM_ENABLE_INPUT) {				wave_dev->enablebits |= PCM_ENABLE_INPUT;				if (wiinst->state & WAVE_STATE_OPEN)					emu10k1_wavein_start(wave_dev);			} else {				wave_dev->enablebits &= ~PCM_ENABLE_INPUT;				if (wiinst->state & WAVE_STATE_STARTED)					emu10k1_wavein_stop(wave_dev);			}			spin_unlock_irqrestore(&wiinst->lock, flags);		}		break;	case SNDCTL_DSP_GETOSPACE:		{			audio_buf_info info;			DPF(4, "SNDCTL_DSP_GETOSPACE:\n");			if (!(file->f_mode & FMODE_WRITE))				return -EINVAL;			spin_lock_irqsave(&woinst->lock, flags);			if (woinst->state & WAVE_STATE_OPEN) {				emu10k1_waveout_update(woinst);				emu10k1_waveout_getxfersize(woinst, &bytestocopy);				info.bytes = bytestocopy;			} else {				calculate_ofrag(woinst);				info.bytes = woinst->buffer.size;			}			spin_unlock_irqrestore(&woinst->lock, flags);			info.fragstotal = woinst->buffer.numfrags;			info.fragments = info.bytes / woinst->buffer.fragment_size;			info.fragsize = woinst->buffer.fragment_size;			if (copy_to_user((int *) arg, &info, sizeof(info)))				return -EFAULT;		}		break;	case SNDCTL_DSP_GETISPACE:		{			audio_buf_info info;			DPF(4, "SNDCTL_DSP_GETISPACE:\n");			if (!(file->f_mode & FMODE_READ))				return -EINVAL;			spin_lock_irqsave(&wiinst->lock, flags);			if (wiinst->state & WAVE_STATE_OPEN) {				emu10k1_wavein_update(wave_dev->card, wiinst);				emu10k1_wavein_getxfersize(wiinst, &bytestocopy);				info.bytes = bytestocopy;			} else {				calculate_ifrag(wiinst);				info.bytes = 0;			}			spin_unlock_irqrestore(&wiinst->lock, flags);			info.fragstotal = wiinst->buffer.numfrags;			info.fragments = info.bytes / wiinst->buffer.fragment_size;			info.fragsize = wiinst->buffer.fragment_size;			if (copy_to_user((int *) arg, &info, sizeof(info)))				return -EFAULT;		}		break;	case SNDCTL_DSP_NONBLOCK:		DPF(2, "SNDCTL_DSP_NONBLOCK:\n");		file->f_flags |= O_NONBLOCK;		break;	case SNDCTL_DSP_GETODELAY:		DPF(4, "SNDCTL_DSP_GETODELAY:\n");		if (!(file->f_mode & FMODE_WRITE))			return -EINVAL;		spin_lock_irqsave(&woinst->lock, flags);		if (woinst->state & WAVE_STATE_OPEN) {			emu10k1_waveout_update(woinst);			emu10k1_waveout_getxfersize(woinst, &bytestocopy);			val = woinst->buffer.size - bytestocopy;		} else			val = 0;		spin_unlock_irqrestore(&woinst->lock, flags);		return put_user(val, (int *) arg);	case SNDCTL_DSP_GETIPTR:		{			count_info cinfo;			DPF(4, "SNDCTL_DSP_GETIPTR: \n");			if (!(file->f_mode & FMODE_READ))				return -EINVAL;			spin_lock_irqsave(&wiinst->lock, flags);			if (wiinst->state & WAVE_STATE_OPEN) {				emu10k1_wavein_update(wave_dev->card, wiinst);				cinfo.ptr = wiinst->buffer.hw_pos;				cinfo.bytes = cinfo.ptr + wiinst->total_recorded - wiinst->total_recorded % wiinst->buffer.size;				cinfo.blocks = cinfo.bytes / wiinst->buffer.fragment_size - wiinst->blocks;				wiinst->blocks = cinfo.bytes / wiinst->buffer.fragment_size;			} else {				cinfo.ptr = 0;				cinfo.bytes = 0;				cinfo.blocks = 0;			}			spin_unlock_irqrestore(&wiinst->lock, flags);			if (copy_to_user((void *) arg, &cinfo, sizeof(cinfo)))				return -EFAULT;		}		break;	case SNDCTL_DSP_GETOPTR:		{			count_info cinfo;			DPF(4, "SNDCTL_DSP_GETOPTR:\n");			if (!(file->f_mode & FMODE_WRITE))				return -EINVAL;			spin_lock_irqsave(&woinst->lock, flags);			if (woinst->state & WAVE_STATE_OPEN) {				emu10k1_waveout_update(woinst);				cinfo.ptr = woinst->buffer.hw_pos;				cinfo.bytes = cinfo.ptr + woinst->total_played - woinst->total_played % woinst->buffer.size;				cinfo.blocks = cinfo.bytes / woinst->buffer.fragment_size - woinst->blocks;				woinst->blocks = cinfo.bytes / woinst->buffer.fragment_size;			} else {				cinfo.ptr = 0;				cinfo.bytes = 0;				cinfo.blocks = 0;			}			if(woinst->mmapped)				woinst->buffer.bytestocopy %= woinst->buffer.fragment_size;			spin_unlock_irqrestore(&woinst->lock, flags);			if (copy_to_user((void *) arg, &cinfo, sizeof(cinfo)))				return -EFAULT;		}		break;	case SNDCTL_DSP_GETBLKSIZE:		DPF(2, "SNDCTL_DSP_GETBLKSIZE:\n");		if (file->f_mode & FMODE_WRITE) {			spin_lock_irqsave(&woinst->lock, flags);			calculate_ofrag(woinst);			val = woinst->buffer.fragment_size;			spin_unlock_irqrestore(&woinst->lock, flags);		}		if (file->f_mode & FMODE_READ) {			spin_lock_irqsave(&wiinst->lock, flags);			calculate_ifrag(wiinst);			val = wiinst->buffer.fragment_size;			spin_unlock_irqrestore(&wiinst->lock, flags);		}		return put_user(val, (int *) arg);		break;	case SNDCTL_DSP_POST:		if (file->f_mode & FMODE_WRITE) {			spin_lock_irqsave(&woinst->lock, flags);			if (!(woinst->state & WAVE_STATE_STARTED)			    && (wave_dev->enablebits & PCM_ENABLE_OUTPUT)			    && (woinst->total_copied > 0))				emu10k1_waveout_start(wave_dev);			spin_unlock_irqrestore(&woinst->lock, flags);		}		break;	case SNDCTL_DSP_SUBDIVIDE:		DPF(2, "SNDCTL_DSP_SUBDIVIDE: not implemented\n");		break;	case SNDCTL_DSP_SETFRAGMENT:		DPF(2, "SNDCTL_DSP_SETFRAGMENT:\n");		if (get_user(val, (int *) arg))			return -EFAULT;		DPD(2, "val is 0x%x\n", val);		if (val == 0)			return -EIO;		if (file->f_mode & FMODE_WRITE) {			if (woinst->state & WAVE_STATE_OPEN)				return -EINVAL;	/* too late to change */			woinst->buffer.ossfragshift = val & 0xffff;			woinst->buffer.numfrags = (val >> 16) & 0xffff;		}		if (file->f_mode & FMODE_READ) {			if (wiinst->state & WAVE_STATE_OPEN)				return -EINVAL;	/* too late to change */			wiinst->buffer.ossfragshift = val & 0xffff;			wiinst->buffer.numfrags = (val >> 16) & 0xffff;		}		break;	case SNDCTL_COPR_LOAD:		{			copr_buffer buf;			u32 i;			DPF(2, "SNDCTL_COPR_LOAD:\n");			if (copy_from_user(&buf, (copr_buffer *) arg, sizeof(buf)))				return -EFAULT;			if ((buf.command != 1) && (buf.command != 2))				return -EINVAL;			if ((buf.offs < 0x100)			    || (buf.offs < 0x000)			    || (buf.offs + buf.len > 0x800) || (buf.len > 1000))				return -EINVAL;			if (buf.command == 1) {				for (i = 0; i < buf.len; i++)					((u32 *) buf.data)[i] = sblive_readptr(wave_dev->card, buf.offs + i, 0);				if (copy_to_user((copr_buffer *) arg, &buf, sizeof(buf)))					return -EFAULT;			} else {				for (i = 0; i < buf.len; i++)					sblive_writeptr(wave_dev->card, buf.offs + i, 0, ((u32 *) buf.data)[i]);			}			break;		}	default:		/* Default is unrecognized command */		DPD(2, "default: 0x%x\n", cmd);		return -EINVAL;	}	return 0;}static int emu10k1_audio_mmap(struct file *file, struct vm_area_struct *vma){	struct emu10k1_wavedevice *wave_dev = (struct emu10k1_wavedevice *) file->private_data;	DPF(2, "emu10k1_audio_mmap()\n");	if (vma_get_pgoff(vma) != 0)		return -ENXIO;	lock_kernel();	if (vma->vm_flags & VM_WRITE) {		struct woinst *woinst = wave_dev->woinst;		u32 size;		unsigned long flags;		int i;		spin_lock_irqsave(&woinst->lock, flags);		if (woinst->state == WAVE_STATE_CLOSED) {			calculate_ofrag(woinst);			if (emu10k1_waveout_open(wave_dev) < 0) {				spin_unlock_irqrestore(&woinst->lock, flags);				ERROR();				unlock_kernel();				return -EINVAL;			}			/* Now mark the pages as reserved, otherwise remap_page_range doesn't do what we want */			for (i = 0; i < woinst->buffer.pages; i++)				mem_map_reserve(virt_to_page(woinst->buffer.addr[i]));		}		size = vma->vm_end - vma->vm_start;		if (size > (PAGE_SIZE * woinst->buffer.pages)) {			spin_unlock_irqrestore(&woinst->lock, flags);			unlock_kernel();			return -EINVAL;		}		for (i = 0; i < woinst->buffer.pages; i++) {			if (remap_page_range(vma->vm_start + (i * PAGE_SIZE), virt_to_phys(woinst->buffer.addr[i]), PAGE_SIZE, vma->vm_page_prot)) {				spin_unlock_irqrestore(&woinst->lock, flags);				return -EAGAIN;			}		}		woinst->mmapped = 1;		spin_unlock_irqrestore(&woinst->lock, flags);	}	if (vma->vm_flags & VM_READ) {		struct wiinst *wiinst = wave_dev->wiinst;		unsigned long flags;		spin_lock_irqsave(&wiinst->lock, flags);		wiinst->mmapped = 1;		spin_unlock_irqrestore(&wiinst->lock, flags);	}	unlock_kernel();	return 0;}static int emu10k1_audio_open(struct inode *inode, struct file *file){	int minor = MINOR(inode->i_rdev);	struct emu10k1_card *card;	struct list_head *entry;	struct emu10k1_wavedevice *wave_dev;	DPF(2, "emu10k1_audio_open()\n");	/* Check for correct device to open */	list_for_each(entry, &emu10k1_devs) {		card = list_entry(entry, struct emu10k1_card, list);		if (!((card->audio_num ^ minor) & ~0xf) || !((card->audio1_num ^ minor) & ~0xf))

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美成人三级电影在线| 69成人精品免费视频| 亚洲成人动漫一区| 欧美一区二区三区视频免费播放 | 亚洲三级免费观看| 日韩欧美国产系列| 666欧美在线视频| 在线不卡中文字幕| 4438x亚洲最大成人网| 欧美日本韩国一区二区三区视频| 久久精品国产久精国产| 依依成人精品视频| 久久久精品黄色| 久久精品在这里| 日本一区二区三区高清不卡| 日本一区二区不卡视频| 国产精品卡一卡二卡三| 亚洲精品高清在线| 午夜精品久久久| 久久精品999| 国产91丝袜在线播放| 成人性生交大合| 色综合天天综合狠狠| 在线视频综合导航| 67194成人在线观看| 久久免费午夜影院| 日韩一区中文字幕| 午夜婷婷国产麻豆精品| 麻豆精品久久久| 成人在线一区二区三区| 91国产视频在线观看| 日韩一区二区视频| 国产欧美一区二区精品性色| 亚洲柠檬福利资源导航| 日韩激情一二三区| 国产精品中文字幕欧美| 色婷婷激情一区二区三区| 欧美一级日韩免费不卡| 国产欧美综合在线| 亚洲国产精品久久久久婷婷884| 日韩高清在线观看| 国产伦精品一区二区三区免费迷| 成人av第一页| 欧美日韩国产精品自在自线| 久久久噜噜噜久噜久久综合| 亚洲靠逼com| 激情综合亚洲精品| 色天使色偷偷av一区二区| 日韩免费电影网站| 亚洲品质自拍视频网站| 免费成人结看片| 99re热这里只有精品视频| 欧美一区二区美女| 中文字幕一区二区三区在线不卡| 日韩精品欧美精品| 视频在线在亚洲| 欧美国产一区二区在线观看| 一区二区三区四区蜜桃| 久久精品二区亚洲w码| 99国产精品久久| 日韩一区二区三区免费看| 亚洲四区在线观看| 老司机精品视频一区二区三区| bt欧美亚洲午夜电影天堂| 欧美一区三区四区| 亚洲美女少妇撒尿| 国产成人精品网址| 91精品在线一区二区| 亚洲视频一区二区在线| 韩国v欧美v亚洲v日本v| 欧美在线高清视频| 国产精品麻豆欧美日韩ww| 九色综合狠狠综合久久| 欧美日韩国产a| 中文字幕综合网| 国产精品自在在线| 日韩女优制服丝袜电影| 亚洲一区二区三区四区在线| 成人免费观看av| 久久先锋影音av| 日韩高清一区在线| 欧美性视频一区二区三区| 国产精品丝袜黑色高跟| 国产美女一区二区| 日韩一级二级三级精品视频| 亚洲国产aⅴ成人精品无吗| 一本大道久久精品懂色aⅴ| 亚洲国产精品精华液ab| 国产精品99久久久久久宅男| 精品99999| 久久精品国产77777蜜臀| 91精品国产色综合久久| 亚洲一区二区三区影院| 一本大道久久a久久精品综合| 国产精品人成在线观看免费| 国产福利精品一区| 久久久精品国产免大香伊| 激情欧美日韩一区二区| 日韩女优av电影在线观看| 蜜桃精品在线观看| 日韩欧美专区在线| 麻豆久久久久久| 欧美一区二区三区免费观看视频| 亚洲高清久久久| 欧美日韩国产综合草草| 五月激情综合网| 欧美一区二区福利视频| 免费人成黄页网站在线一区二区 | 精品av久久707| 国内精品第一页| 国产无遮挡一区二区三区毛片日本| 激情久久五月天| 国产免费观看久久| 91丨porny丨在线| 玉足女爽爽91| 欧美三级电影网| 青青草伊人久久| www日韩大片| 成人午夜免费电影| 亚洲欧美日韩国产另类专区| 在线观看亚洲精品视频| 丝袜脚交一区二区| 日韩欧美久久一区| 国产精品1024| 国产精品白丝在线| 91成人在线免费观看| 天天综合网 天天综合色| 欧美xxx久久| 成人免费福利片| 一区二区三区免费看视频| 欧美精品少妇一区二区三区| 久久电影国产免费久久电影 | 青青青伊人色综合久久| 久久色在线视频| 99精品在线免费| 亚洲电影在线免费观看| 日韩三级在线免费观看| 国产精品1区二区.| 一个色妞综合视频在线观看| 欧美一区欧美二区| 国产成+人+日韩+欧美+亚洲| 亚洲资源中文字幕| 欧美精品一区二区三区蜜桃视频| 99久久国产综合精品女不卡| 午夜视频一区在线观看| 久久婷婷一区二区三区| 91国偷自产一区二区使用方法| 免费精品视频在线| 国产精品第13页| 欧美精品自拍偷拍动漫精品| 国产黄色精品网站| 午夜精品久久久久久久| 中文乱码免费一区二区| 制服视频三区第一页精品| 国产成人av电影在线| 日韩成人免费看| 亚洲欧美一区二区视频| 精品国产乱码久久久久久牛牛| aaa欧美大片| 久久成人久久爱| 夜夜嗨av一区二区三区四季av| 精品三级在线看| 色琪琪一区二区三区亚洲区| 韩国欧美国产一区| 奇米一区二区三区| 日韩理论片在线| 精品国产3级a| 欧美日韩免费电影| 成人的网站免费观看| 精品一区二区三区久久久| 亚洲一区日韩精品中文字幕| 久久久青草青青国产亚洲免观| 欧美日韩精品是欧美日韩精品| 国产91清纯白嫩初高中在线观看| 日韩电影在线看| 亚洲欧美一区二区三区孕妇| 久久影院午夜论| 欧美一区二区免费视频| 91福利视频网站| 成人av集中营| 国产一区二区伦理| 日本麻豆一区二区三区视频| 亚洲曰韩产成在线| 日韩美女精品在线| 亚洲国产精品精华液2区45| 久久午夜老司机| 日韩女优av电影| 欧美二区三区的天堂| 欧美性xxxxx极品少妇| 99久久99久久精品免费看蜜桃| 国产一区在线观看视频| 人人狠狠综合久久亚洲| 亚洲国产婷婷综合在线精品| 亚洲视频精选在线| 欧美激情自拍偷拍| 中文字幕二三区不卡| 久久久久99精品国产片| 欧美mv日韩mv国产| 精品日韩一区二区三区免费视频| 91精品欧美久久久久久动漫|