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

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

?? audio.c

?? 一個2.4.21版本的嵌入式linux內核
?? C
?? 第 1 頁 / 共 3 頁
字號:
		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;			if (emu10k1_find_control_gpr(&wave_dev->card->mgr,			    			     wave_dev->card->pt.patch_name, 			    			     wave_dev->card->pt.enable_gpr_name) >= 0)				val |= AFMT_AC3;		}		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.id = val;				if (emu10k1_wavein_setformat(wave_dev, &format) < 0) {					spin_unlock_irqrestore(&wiinst->lock, flags);					return -EINVAL;				}				val = wiinst->format.id;				spin_unlock_irqrestore(&wiinst->lock, flags);				DPD(2, "set recording format -> %d\n", val);			}			if (file->f_mode & FMODE_WRITE) {				struct wave_format format;				spin_lock_irqsave(&woinst->lock, flags);				format = woinst->format;				format.id = val;				if (emu10k1_waveout_setformat(wave_dev, &format) < 0) {					spin_unlock_irqrestore(&woinst->lock, flags);					return -EINVAL;				}				val = woinst->format.id;				spin_unlock_irqrestore(&woinst->lock, flags);				DPD(2, "set playback format -> %d\n", val);			}			return put_user(val, (int *) arg);		} else {			if (file->f_mode & FMODE_READ)				val = wiinst->format.id;			else if (file->f_mode & FMODE_WRITE)				val = woinst->format.id;			return put_user(val, (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, (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.bytes *= woinst->num_voices;			info.fragsize = woinst->buffer.fragment_size * woinst->num_voices;			info.fragstotal = woinst->buffer.numfrags * woinst->num_voices;			info.fragments = info.bytes / info.fragsize;			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;		val *= woinst->num_voices;		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;			}			if(wiinst->mmapped)				wiinst->buffer.bytestocopy %= wiinst->buffer.fragment_size;			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 || 			    (woinst->format.passthrough && wave_dev->card->pt.state)) {				int num_fragments;				if (woinst->format.passthrough) {					emu10k1_pt_waveout_update(wave_dev);					cinfo.bytes = woinst->total_played;				} else {					emu10k1_waveout_update(woinst);					cinfo.bytes = woinst->total_played;				}				cinfo.ptr = woinst->buffer.hw_pos;				num_fragments = cinfo.bytes / woinst->buffer.fragment_size;				cinfo.blocks = num_fragments - woinst->blocks;				woinst->blocks = num_fragments;				cinfo.bytes *= woinst->num_voices;				cinfo.ptr *= woinst->num_voices;			} else {				cinfo.ptr = 0;				cinfo.bytes = 0;				cinfo.blocks = 0;			}			if (woinst->mmapped)				woinst->buffer.free_bytes %= 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 * woinst->num_voices;			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 %#x\n", val);		if (val == 0)			return -EIO;		if (file->f_mode & FMODE_WRITE) {			/* digital pass-through fragment count and size are fixed values */			if (woinst->state & WAVE_STATE_OPEN || woinst->format.passthrough)				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(4, "SNDCTL_COPR_LOAD:\n");			buf = kmalloc(sizeof(copr_buffer), GFP_KERNEL);			if (!buf)				return -ENOMEM;			if (copy_from_user(buf, (copr_buffer *) arg, sizeof(copr_buffer))) {				kfree (buf);				return -EFAULT;			}			if ((buf->command != CMD_READ) && (buf->command != CMD_WRITE)) {				kfree (buf);				return -EINVAL;			}#ifdef DBGEMU			if ( (buf->offs < 0) || (buf->offs + buf->len > 0x800) || (buf->len > 1000)) {#else			if ( ((buf->offs < 0x100 ) || (buf->offs + buf->len > 0x800) || (buf->len > 1000))			     && !( ( buf->offs == DBG) && (buf->len ==1) )){#endif					kfree(buf);				return -EINVAL;			}			if (buf->command == CMD_READ) {				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(copr_buffer))) {					kfree(buf);					return -EFAULT;				}			} else {				for (i = 0; i < buf->len; i++)					sblive_writeptr(wave_dev->card, buf->offs + i, 0, ((u32 *) buf->data)[i]);			}			kfree (buf);			break;		}	default:		/* Default is unrecognized command */		DPD(2, "default: %#x\n", cmd);		return -EINVAL;	}	return 0;}static struct page *emu10k1_mm_nopage (struct vm_area_struct * vma, unsigned long address, int write_access){	struct emu10k1_wavedevice *wave_dev = vma->vm_private_data;	struct woinst *woinst = wave_dev->woinst;	struct wiinst *wiinst = wave_dev->wiinst;	struct page *dmapage;	unsigned long pgoff;	int rd, wr;	DPF(3, "emu10k1_mm_nopage()\n");	DPD(3, "addr: %#lx\n", address);	if (address > vma->vm_end) {		DPF(1, "EXIT, returning NOPAGE_SIGBUS\n");		return NOPAGE_SIGBUS; /* Disallow mremap */	}	pgoff = vma->vm_pgoff + ((address - vma->vm_start) >> PAGE_SHIFT);	if (woinst != NULL)		wr = woinst->mmapped;	else		wr = 0;	if (wiinst != NULL)		rd = wiinst->mmapped;	else		rd = 0;	/* if full-duplex (read+write) and we have two sets of bufs,	* then the playback buffers come first, sez soundcard.c */	if (wr) {		if (pgoff >= woinst->buffer.pages) {			pgoff -= woinst->buffer.pages;			dmapage = virt_to_page ((u8 *) wiinst->buffer.addr + pgoff * PAGE_SIZE);		} else			dmapage = virt_to_page (woinst->voice[0].mem.addr[pgoff]);	} else {		dmapage = virt_to_page ((u8 *) wiinst->buffer.addr + pgoff * PAGE_SIZE);	}	get_page (dmapage);	DPD(3, "page: %#lx\n", (unsigned long) dmapage);	return dmapage;}struct vm_operations_struct emu10k1_mm_ops = {	nopage:         emu10k1_mm_nopage,};static int emu10k1_audio_mmap(struct file *file, struct vm_area_struct *vma){	struct emu10k1_wavedevice *wave_dev = (struct emu10k1_wavedevice *) file->private_data;	unsigned long max_pages, n_pages, pgoffset;	struct woinst *woinst = NULL;	struct wiinst *wiinst = NULL;	unsigned long flags;	DPF(2, "emu10k1_audio_mmap()\n");	max_pages = 0;	if (vma->vm_flags & VM_WRITE) {		woinst = wave_dev->woinst;		spin_lock_irqsave(&woinst->lock, flags);		/* No m'mapping possible for multichannel */		if (woinst->num_voices > 1) {			spin_unlock_irqrestore(&woinst->lock, flags);                	return -EINVAL;		}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人av在线一区二区三区| 欧美色中文字幕| 欧美日韩在线观看一区二区| 51精品秘密在线观看| 国产精品美女一区二区在线观看| 亚洲国产一区在线观看| 91免费版在线| 精品国产一二三区| 天天色综合成人网| 91亚洲精品久久久蜜桃| 国产农村妇女毛片精品久久麻豆| 亚洲成人在线免费| av在线不卡电影| 久久久99精品久久| 日产国产欧美视频一区精品| 成人精品免费视频| 精品国产乱码久久久久久久久| 一区二区三区四区蜜桃| eeuss鲁片一区二区三区| 亚洲精品在线电影| 日韩二区三区在线观看| 欧美色图片你懂的| 玉米视频成人免费看| 成人动漫视频在线| 中文字幕第一区二区| 国产在线一区观看| 欧美精品一区二区三区蜜桃视频 | 久久品道一品道久久精品| 亚洲狠狠爱一区二区三区| 一本色道久久综合狠狠躁的推荐| 中文字幕精品一区二区精品绿巨人 | 7777精品伊人久久久大香线蕉 | 国产一区二区精品久久| 欧美一级xxx| 青青国产91久久久久久 | 精品国产三级电影在线观看| 免费看日韩精品| 欧美一区二区黄| 日韩精品一二区| 日韩欧美久久一区| 国产自产视频一区二区三区| 久久这里只有精品6| 国产福利一区二区| 中文字幕精品一区二区三区精品| 成人国产亚洲欧美成人综合网| 国产精品久久久久一区二区三区| 成人高清伦理免费影院在线观看| 国产精品久久久久9999吃药| 91视频xxxx| 午夜精品免费在线| 日韩视频免费直播| 国产精品99久久久久久久女警| 日韩精品一卡二卡三卡四卡无卡| 欧美日韩精品欧美日韩精品 | 一区在线观看视频| 欧洲一区在线观看| 麻豆成人久久精品二区三区小说| 精品国产免费人成在线观看| 国产成人精品三级| 亚洲激情六月丁香| 日韩欧美你懂的| 成人app软件下载大全免费| 樱花影视一区二区| 日韩欧美中文字幕公布| 成人免费av在线| 五月婷婷激情综合网| 久久精品欧美日韩| 欧美在线观看你懂的| 激情另类小说区图片区视频区| 欧美国产成人精品| 欧美日韩一区国产| 福利一区在线观看| 午夜免费久久看| 欧美精品一区二区不卡 | 18成人在线观看| 91精品婷婷国产综合久久性色| 国产精品538一区二区在线| 一区二区三区四区不卡在线| 精品国产成人在线影院| 色吧成人激情小说| 国产综合色精品一区二区三区| 国产精品动漫网站| 老司机精品视频在线| 欧美日韩黄视频| 亚洲成a人v欧美综合天堂| 免费久久精品视频| 欧美日韩mp4| 99视频国产精品| 久久久美女毛片| 色视频一区二区| 国产精品美女久久久久久久久| 亚洲一区二区不卡免费| 国产午夜精品一区二区三区嫩草| 精品视频在线免费观看| 99久久精品国产观看| 精品中文字幕一区二区| 亚洲丶国产丶欧美一区二区三区| 欧美国产日韩一二三区| 制服丝袜亚洲播放| 欧美日韩卡一卡二| 一本大道久久a久久精品综合| 黄色日韩网站视频| 美脚の诱脚舐め脚责91| 午夜亚洲国产au精品一区二区| 国产精品久久久久久久久动漫| 欧美精品一区二区三区在线| 欧美一区在线视频| 欧美日韩精品三区| 精品污污网站免费看| 色欧美日韩亚洲| 色天天综合色天天久久| 一本一道综合狠狠老| av在线播放成人| 91免费视频观看| 91猫先生在线| 色狠狠综合天天综合综合| 91丨九色丨蝌蚪富婆spa| 97国产精品videossex| 97精品国产97久久久久久久久久久久 | 欧美aaaaa成人免费观看视频| 亚洲影院免费观看| 亚洲成人自拍偷拍| 日韩精品乱码av一区二区| 亚洲18影院在线观看| 亚洲风情在线资源站| 日本一区中文字幕| 玖玖九九国产精品| 国产精品资源网站| 99国产精品99久久久久久| 色婷婷综合久久久久中文一区二区| 99这里都是精品| 欧美视频一区二区三区在线观看| 欧美综合欧美视频| 日韩午夜精品电影| 久久精品一区二区三区av| 国产精品午夜电影| 亚洲一区在线免费观看| 日日噜噜夜夜狠狠视频欧美人 | 国产91综合一区在线观看| 成人午夜激情片| 日韩美女视频一区二区在线观看| 亚洲高清视频在线| 成人免费毛片aaaaa**| 精品一区二区三区香蕉蜜桃 | 欧美日韩三级一区二区| 一本大道av一区二区在线播放 | 欧美精品久久一区| 精品电影一区二区三区| 欧美在线一区二区三区| 51久久夜色精品国产麻豆| 欧美精品一区二区三区四区 | 亚洲一区在线观看视频| 美女网站一区二区| 成人av在线资源网| 欧美一区二区人人喊爽| 国产精品欧美久久久久无广告 | 国产成人精品www牛牛影视| 色综合天天天天做夜夜夜夜做| 欧美精品vⅰdeose4hd| 国产天堂亚洲国产碰碰| 亚洲国产成人porn| 国产99精品在线观看| 欧美妇女性影城| 国产精品久久久久久久久搜平片| 亚洲大片在线观看| 成人精品国产一区二区4080 | 在线看一区二区| 久久久久久亚洲综合| 亚洲福中文字幕伊人影院| 国产suv精品一区二区三区| 欧美精品日韩综合在线| 最新热久久免费视频| 国产一区亚洲一区| 91麻豆精品91久久久久久清纯| 亚洲欧美日韩小说| 国产酒店精品激情| 日韩欧美一区在线观看| 亚洲国产一二三| 91在线云播放| 国产精品麻豆网站| 国产成人av电影在线| 欧美va亚洲va国产综合| 五月综合激情日本mⅴ| 色婷婷激情久久| 亚洲欧美一区二区三区极速播放| 国产一区二区在线观看免费| 日韩女优av电影| 日本在线不卡视频一二三区| 欧美亚洲日本一区| 亚洲婷婷综合色高清在线| 国产成人精品三级| 国产欧美一区二区三区在线看蜜臀 | 亚洲人精品午夜| 大陆成人av片| 欧美国产激情一区二区三区蜜月| 国产曰批免费观看久久久| 精品国产一区二区三区不卡| 免费在线观看一区| 日韩一卡二卡三卡| 激情综合色丁香一区二区|