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

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

?? seq_oss_midi.c

?? 優龍2410linux2.6.8內核源代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* * OSS compatible sequencer driver * * MIDI device handlers * * Copyright (C) 1998,99 Takashi Iwai <tiwai@suse.de> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA */#include "seq_oss_midi.h"#include "seq_oss_readq.h"#include "seq_oss_timer.h"#include "seq_oss_event.h"#include <sound/seq_midi_event.h>#include "../seq_lock.h"#include <linux/init.h>/* * constants */#define SNDRV_SEQ_OSS_MAX_MIDI_NAME	30/* * definition of midi device record */struct seq_oss_midi_t {	int seq_device;		/* device number */	int client;		/* sequencer client number */	int port;		/* sequencer port number */	unsigned int flags;	/* port capability */	int opened;		/* flag for opening */	unsigned char name[SNDRV_SEQ_OSS_MAX_MIDI_NAME];	snd_midi_event_t *coder;	/* MIDI event coder */	seq_oss_devinfo_t *devinfo;	/* assigned OSSseq device */	snd_use_lock_t use_lock;};/* * midi device table */static int max_midi_devs;static seq_oss_midi_t *midi_devs[SNDRV_SEQ_OSS_MAX_MIDI_DEVS];static spinlock_t register_lock = SPIN_LOCK_UNLOCKED;/* * prototypes */static seq_oss_midi_t *get_mdev(int dev);static seq_oss_midi_t *get_mididev(seq_oss_devinfo_t *dp, int dev);static int send_synth_event(seq_oss_devinfo_t *dp, snd_seq_event_t *ev, int dev);static int send_midi_event(seq_oss_devinfo_t *dp, snd_seq_event_t *ev, seq_oss_midi_t *mdev);/* * look up the existing ports * this looks a very exhausting job. */int __initsnd_seq_oss_midi_lookup_ports(int client){	snd_seq_system_info_t sysinfo;	snd_seq_client_info_t clinfo;	snd_seq_port_info_t pinfo;	int rc;	rc = snd_seq_kernel_client_ctl(client, SNDRV_SEQ_IOCTL_SYSTEM_INFO, &sysinfo);	if (rc < 0)		return rc;		memset(&clinfo, 0, sizeof(clinfo));	memset(&pinfo, 0, sizeof(pinfo));	clinfo.client = -1;	while (snd_seq_kernel_client_ctl(client, SNDRV_SEQ_IOCTL_QUERY_NEXT_CLIENT, &clinfo) == 0) {		if (clinfo.client == client)			continue; /* ignore myself */		pinfo.addr.client = clinfo.client;		pinfo.addr.port = -1;		while (snd_seq_kernel_client_ctl(client, SNDRV_SEQ_IOCTL_QUERY_NEXT_PORT, &pinfo) == 0)			snd_seq_oss_midi_check_new_port(&pinfo);	}	return 0;}/* */static seq_oss_midi_t *get_mdev(int dev){	seq_oss_midi_t *mdev;	unsigned long flags;	spin_lock_irqsave(&register_lock, flags);	mdev = midi_devs[dev];	if (mdev)		snd_use_lock_use(&mdev->use_lock);	spin_unlock_irqrestore(&register_lock, flags);	return mdev;}/* * look for the identical slot */static seq_oss_midi_t *find_slot(int client, int port){	int i;	seq_oss_midi_t *mdev;	unsigned long flags;	spin_lock_irqsave(&register_lock, flags);	for (i = 0; i < max_midi_devs; i++) {		mdev = midi_devs[i];		if (mdev && mdev->client == client && mdev->port == port) {			/* found! */			snd_use_lock_use(&mdev->use_lock);			spin_unlock_irqrestore(&register_lock, flags);			return mdev;		}	}	spin_unlock_irqrestore(&register_lock, flags);	return NULL;}#define PERM_WRITE (SNDRV_SEQ_PORT_CAP_WRITE|SNDRV_SEQ_PORT_CAP_SUBS_WRITE)#define PERM_READ (SNDRV_SEQ_PORT_CAP_READ|SNDRV_SEQ_PORT_CAP_SUBS_READ)/* * register a new port if it doesn't exist yet */intsnd_seq_oss_midi_check_new_port(snd_seq_port_info_t *pinfo){	int i;	seq_oss_midi_t *mdev;	unsigned long flags;	debug_printk(("check for MIDI client %d port %d\n", pinfo->addr.client, pinfo->addr.port));	/* the port must include generic midi */	if (! (pinfo->type & SNDRV_SEQ_PORT_TYPE_MIDI_GENERIC))		return 0;	/* either read or write subscribable */	if ((pinfo->capability & PERM_WRITE) != PERM_WRITE &&	    (pinfo->capability & PERM_READ) != PERM_READ)		return 0;	/*	 * look for the identical slot	 */	if ((mdev = find_slot(pinfo->addr.client, pinfo->addr.port)) != NULL) {		/* already exists */		snd_use_lock_free(&mdev->use_lock);		return 0;	}	/*	 * allocate midi info record	 */	if ((mdev = snd_kcalloc(sizeof(*mdev), GFP_KERNEL)) == NULL) {		snd_printk(KERN_ERR "can't malloc midi info\n");		return -ENOMEM;	}	/* copy the port information */	mdev->client = pinfo->addr.client;	mdev->port = pinfo->addr.port;	mdev->flags = pinfo->capability;	mdev->opened = 0;	snd_use_lock_init(&mdev->use_lock);	/* copy and truncate the name of synth device */	strlcpy(mdev->name, pinfo->name, sizeof(mdev->name));	/* create MIDI coder */	if (snd_midi_event_new(MAX_MIDI_EVENT_BUF, &mdev->coder) < 0) {		snd_printk(KERN_ERR "can't malloc midi coder\n");		kfree(mdev);		return -ENOMEM;	}	/* OSS sequencer adds running status to all sequences */	snd_midi_event_no_status(mdev->coder, 1);	/*	 * look for en empty slot	 */	spin_lock_irqsave(&register_lock, flags);	for (i = 0; i < max_midi_devs; i++) {		if (midi_devs[i] == NULL)			break;	}	if (i >= max_midi_devs) {		if (max_midi_devs >= SNDRV_SEQ_OSS_MAX_MIDI_DEVS) {			spin_unlock_irqrestore(&register_lock, flags);			snd_midi_event_free(mdev->coder);			kfree(mdev);			return -ENOMEM;		}		max_midi_devs++;	}	mdev->seq_device = i;	midi_devs[mdev->seq_device] = mdev;	spin_unlock_irqrestore(&register_lock, flags);	return 0;}/* * release the midi device if it was registered */intsnd_seq_oss_midi_check_exit_port(int client, int port){	seq_oss_midi_t *mdev;	unsigned long flags;	int index;	if ((mdev = find_slot(client, port)) != NULL) {		spin_lock_irqsave(&register_lock, flags);		midi_devs[mdev->seq_device] = NULL;		spin_unlock_irqrestore(&register_lock, flags);		snd_use_lock_free(&mdev->use_lock);		snd_use_lock_sync(&mdev->use_lock);		if (mdev->coder)			snd_midi_event_free(mdev->coder);		kfree(mdev);	}	spin_lock_irqsave(&register_lock, flags);	for (index = max_midi_devs - 1; index >= 0; index--) {		if (midi_devs[index])			break;	}	max_midi_devs = index + 1;	spin_unlock_irqrestore(&register_lock, flags);	return 0;}/* * release the midi device if it was registered */voidsnd_seq_oss_midi_clear_all(void){	int i;	seq_oss_midi_t *mdev;	unsigned long flags;	spin_lock_irqsave(&register_lock, flags);	for (i = 0; i < max_midi_devs; i++) {		if ((mdev = midi_devs[i]) != NULL) {			if (mdev->coder)				snd_midi_event_free(mdev->coder);			kfree(mdev);			midi_devs[i] = NULL;		}	}	max_midi_devs = 0;	spin_unlock_irqrestore(&register_lock, flags);}/* * set up midi tables */voidsnd_seq_oss_midi_setup(seq_oss_devinfo_t *dp){	dp->max_mididev = max_midi_devs;}/* * clean up midi tables */voidsnd_seq_oss_midi_cleanup(seq_oss_devinfo_t *dp){	int i;	for (i = 0; i < dp->max_mididev; i++)		snd_seq_oss_midi_close(dp, i);	dp->max_mididev = 0;}/* * open all midi devices.  ignore errors. */voidsnd_seq_oss_midi_open_all(seq_oss_devinfo_t *dp, int file_mode){	int i;	for (i = 0; i < dp->max_mididev; i++)		snd_seq_oss_midi_open(dp, i, file_mode);}/* * get the midi device information */static seq_oss_midi_t *get_mididev(seq_oss_devinfo_t *dp, int dev){	if (dev < 0 || dev >= dp->max_mididev)		return NULL;	return get_mdev(dev);}/* * open the midi device if not opened yet */intsnd_seq_oss_midi_open(seq_oss_devinfo_t *dp, int dev, int fmode){	int perm;	seq_oss_midi_t *mdev;	snd_seq_port_subscribe_t subs;	if ((mdev = get_mididev(dp, dev)) == NULL)		return -ENODEV;	/* already used? */	if (mdev->opened && mdev->devinfo != dp) {		snd_use_lock_free(&mdev->use_lock);		return -EBUSY;	}	perm = 0;	if (is_write_mode(fmode))		perm |= PERM_WRITE;	if (is_read_mode(fmode))		perm |= PERM_READ;	perm &= mdev->flags;	if (perm == 0) {		snd_use_lock_free(&mdev->use_lock);		return -ENXIO;	}	/* already opened? */	if ((mdev->opened & perm) == perm) {		snd_use_lock_free(&mdev->use_lock);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产成人免费视频网站高清观看视频| 亚洲超碰精品一区二区| 99久久精品国产毛片| 日韩精品一级二级 | 国产欧美精品区一区二区三区| 91香蕉国产在线观看软件| 久久99九九99精品| 亚洲国产精品一区二区www在线| xnxx国产精品| 欧美绝品在线观看成人午夜影视| 国产大陆精品国产| 久久aⅴ国产欧美74aaa| 亚洲自拍另类综合| 国产欧美日韩在线看| 欧美一区二区日韩| 欧美日韩一区二区三区不卡| 国产乱码精品一区二区三区忘忧草 | 91性感美女视频| 国产精品一区二区在线播放| 蜜桃视频在线观看一区| 亚洲一区免费在线观看| 亚洲三级电影网站| 国产精品国产a级| 久久精品夜夜夜夜久久| 精品国产乱码久久久久久免费| 6080国产精品一区二区| 欧美亚洲国产一区在线观看网站| 99精品视频在线观看| 成人高清免费观看| 粉嫩av一区二区三区粉嫩| 韩国v欧美v亚洲v日本v| 久久99久久99| 国模套图日韩精品一区二区| 久久精品国产99久久6| 蜜臀av性久久久久av蜜臀妖精| 爽好多水快深点欧美视频| 亚洲午夜电影在线观看| 亚洲高清一区二区三区| 亚洲国产欧美日韩另类综合| 夜夜精品浪潮av一区二区三区 | 日本va欧美va精品发布| 日韩激情视频网站| 青青草成人在线观看| 日韩激情中文字幕| 日本伊人色综合网| 男女性色大片免费观看一区二区 | 精品对白一区国产伦| 日韩欧美国产wwwww| 欧美一级电影网站| 精品嫩草影院久久| 久久久久综合网| 国产精品二区一区二区aⅴ污介绍| 中文字幕一区日韩精品欧美| 亚洲激情图片一区| 亚洲1区2区3区4区| 奇米精品一区二区三区在线观看| 日本午夜精品一区二区三区电影 | 日本一区二区成人| 亚洲天堂免费看| 亚洲国产日韩一区二区| 日韩在线一区二区| 精彩视频一区二区| 粉嫩aⅴ一区二区三区四区| 91日韩精品一区| 欧美人牲a欧美精品| 精品黑人一区二区三区久久| 中文子幕无线码一区tr| 夜夜爽夜夜爽精品视频| 久久97超碰国产精品超碰| 粉嫩av一区二区三区粉嫩| 日本韩国精品在线| 日韩你懂的电影在线观看| 中文字幕不卡一区| 婷婷综合另类小说色区| 国产成人精品亚洲777人妖 | 91麻豆自制传媒国产之光| 欧美色男人天堂| 久久精品免视看| 亚洲一级在线观看| 国产成人鲁色资源国产91色综 | 国产精品免费aⅴ片在线观看| 亚洲欧美日韩成人高清在线一区| 日韩av成人高清| 成人福利视频在线| 日韩免费观看2025年上映的电影| 国产精品黄色在线观看| 日韩和欧美一区二区三区| 成人永久免费视频| 欧美高清性hdvideosex| 中文字幕免费在线观看视频一区| 日韩国产精品久久| 97精品国产97久久久久久久久久久久 | 亚洲欧美综合网| 蜜臀精品久久久久久蜜臀 | 国产mv日韩mv欧美| 欧美精品亚洲二区| 国产精品久久久爽爽爽麻豆色哟哟| 亚洲aⅴ怡春院| 91视频.com| 国产天堂亚洲国产碰碰| 日本va欧美va瓶| 精品视频一区二区不卡| 日本一区二区三区国色天香 | 一本一本大道香蕉久在线精品| 日韩欧美亚洲国产另类| 亚洲最新视频在线观看| 国产福利一区二区三区视频| 欧美精品乱人伦久久久久久| 中文字幕中文乱码欧美一区二区 | 天天亚洲美女在线视频| 成人av网站在线观看| 精品av久久707| 日韩成人av影视| 欧美撒尿777hd撒尿| 专区另类欧美日韩| 成人免费视频网站在线观看| 精品88久久久久88久久久| 成熟亚洲日本毛茸茸凸凹| 91精品婷婷国产综合久久| 亚洲综合丝袜美腿| 色综合天天综合狠狠| 国产精品无人区| 国产 日韩 欧美大片| 久久久久久99久久久精品网站| 另类综合日韩欧美亚洲| 91.成人天堂一区| 日日夜夜精品免费视频| 欧美午夜在线一二页| 一个色在线综合| 欧美艳星brazzers| 亚洲一区二区三区中文字幕在线| eeuss鲁一区二区三区| 国产欧美日本一区二区三区| 国产乱人伦精品一区二区在线观看| 精品精品国产高清a毛片牛牛| 麻豆精品新av中文字幕| 日韩欧美aaaaaa| 国产九色精品成人porny | 国产精品白丝在线| 91在线观看一区二区| 中文字幕一区在线| 色噜噜狠狠成人网p站| 亚洲人xxxx| 欧美日韩综合在线免费观看| 日日摸夜夜添夜夜添国产精品| 欧美制服丝袜第一页| 亚洲综合色视频| 欧美一区二区三区视频在线观看| 奇米色一区二区| 国产日韩欧美在线一区| 成人综合婷婷国产精品久久免费| 欧美激情综合网| 在线视频一区二区免费| 三级影片在线观看欧美日韩一区二区| 欧美一级高清片| 国产成人午夜片在线观看高清观看| 国产精品嫩草久久久久| 欧美在线影院一区二区| 日韩不卡一区二区| 久久九九全国免费| 91麻豆精品秘密| 天堂一区二区在线免费观看| 精品日韩成人av| 91在线精品一区二区| 亚洲va欧美va人人爽午夜| 精品99一区二区三区| 99精品欧美一区| 奇米影视7777精品一区二区| 久久久九九九九| 在线精品视频免费播放| 美腿丝袜一区二区三区| 国产精品色眯眯| 欧美视频一区二区| 国产美女在线精品| 一区二区成人在线| 日韩三级中文字幕| 99久久99久久精品免费观看| 视频在线在亚洲| 国产精品久久久久aaaa樱花| 欧美肥胖老妇做爰| 成人97人人超碰人人99| 日本va欧美va精品| 日韩一区欧美一区| 日韩免费在线观看| 91国在线观看| 国产成人免费视频精品含羞草妖精| 亚洲已满18点击进入久久| 久久欧美一区二区| 精品视频在线视频| 不卡电影免费在线播放一区| 美女脱光内衣内裤视频久久影院| 亚洲色图清纯唯美| 亚洲香肠在线观看| 久久午夜色播影院免费高清| 欧美在线综合视频| 99久久99久久久精品齐齐| 国模大尺度一区二区三区| 亚洲成av人综合在线观看| 中文字幕一区视频| 国产亚洲精品福利|