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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? sbase.c

?? alsa-driver-1.0.14編譯聲卡所需要的庫
?? C
字號:
/* *  Mixer Interface - simple abstact module - base library *  Copyright (c) 2005 by Jaroslav Kysela <perex@suse.cz> * * *   This library is free software; you can redistribute it and/or modify *   it under the terms of the GNU Lesser General Public License as *   published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. * *   You should have received a copy of the GNU Lesser General Public *   License along with this library; if not, write to the Free Software *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA * */#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>#include <fcntl.h>#include <sys/ioctl.h>#include <math.h>#include "asoundlib.h"#include "mixer_abst.h"#include "sbase.h"/* * Prototypes */static int selem_read(snd_mixer_elem_t *elem);/* * Helpers */static unsigned int chanmap_to_channels(unsigned int chanmap){	unsigned int i, res;		for (i = 0, res = 0; i < MAX_CHANNEL; i++)		if (chanmap & (1 << i))			res++;	return res;}#if 0static long to_user(struct selem_base *s, int dir, struct helem_base *c, long value){	int64_t n;	if (c->max == c->min)		return s->dir[dir].min;	n = (int64_t) (value - c->min) * (s->dir[dir].max - s->dir[dir].min);	return s->dir[dir].min + (n + (c->max - c->min) / 2) / (c->max - c->min);}static long from_user(struct selem_base *s, int dir, struct helem_base *c, long value){         int64_t n;	if (s->dir[dir].max == s->dir[dir].min)		return c->min;        n = (int64_t) (value - s->dir[dir].min) * (c->max - c->min);	return c->min + (n + (s->dir[dir].max - s->dir[dir].min) / 2) / (s->dir[dir].max - s->dir[dir].min);}#endifstatic void update_ranges(struct selem_base *s){	static unsigned int mask[2] = { SM_CAP_PVOLUME, SM_CAP_CVOLUME };	static unsigned int gmask[2] = { SM_CAP_GVOLUME, SM_CAP_GVOLUME };	unsigned int dir, ok_flag;	struct list_head *pos;	struct helem_base *helem;		for (dir = 0; dir < 2; dir++) {		s->dir[dir].min = 0;		s->dir[dir].max = 0;		ok_flag = 0;		list_for_each(pos, &s->helems) {			helem = list_entry(pos, struct helem_base, list);			printf("min = %li, max = %li\n", helem->min, helem->max);			if (helem->caps & mask[dir]) {				s->dir[dir].min = helem->min;				s->dir[dir].max = helem->max;				ok_flag = 1;				break;			}		}		if (ok_flag)			continue;		list_for_each(pos, &s->helems) {			helem = list_entry(pos, struct helem_base, list);			if (helem->caps & gmask[dir]) {				s->dir[dir].min = helem->min;				s->dir[dir].max = helem->max;				break;			}		}	}}/* * Simple Mixer Operations */static int is_ops(snd_mixer_elem_t *elem, int dir, int cmd, int val){	struct selem_base *s = snd_mixer_elem_get_private(elem);	switch (cmd) {	case SM_OPS_IS_ACTIVE: {		struct list_head *pos;		struct helem_base *helem;		list_for_each(pos, &s->helems) {			helem = list_entry(pos, struct helem_base, list);			if (helem->inactive)				return 0;		}		return 1;	}	case SM_OPS_IS_MONO:		return chanmap_to_channels(s->dir[dir].chanmap) == 1;	case SM_OPS_IS_CHANNEL:		if (val > MAX_CHANNEL)			return 0;		return !!((1 << val) & s->dir[dir].chanmap);	case SM_OPS_IS_ENUMERATED: {		struct helem_base *helem;		helem = list_entry(s->helems.next, struct helem_base, list);		return !!(helem->purpose == PURPOSE_ENUMLIST);	}		case SM_OPS_IS_ENUMCNT: {		struct helem_base *helem;		helem = list_entry(s->helems.next, struct helem_base, list);		return helem->max;	}	}		return 1;}static int get_range_ops(snd_mixer_elem_t *elem, int dir,			 long *min, long *max){	struct selem_base *s = snd_mixer_elem_get_private(elem);		*min = s->dir[dir].min;	*max = s->dir[dir].max;	return 0;}static int get_dB_range_ops(snd_mixer_elem_t *elem ATTRIBUTE_UNUSED,			    int dir ATTRIBUTE_UNUSED,			    long *min ATTRIBUTE_UNUSED,			    long *max ATTRIBUTE_UNUSED){	return -ENXIO;}static int set_range_ops(snd_mixer_elem_t *elem, int dir,			 long min, long max){	struct selem_base *s = snd_mixer_elem_get_private(elem);	int err;	s->dir[dir].forced_range = 1;	s->dir[dir].min = min;	s->dir[dir].max = max;		if ((err = selem_read(elem)) < 0)		return err;	return 0;}static int get_volume_ops(snd_mixer_elem_t *elem, int dir,			  snd_mixer_selem_channel_id_t channel, long *value){	struct selem_base *s = snd_mixer_elem_get_private(elem);		*value = s->dir[dir].vol[channel];	return 0;}static int get_dB_ops(snd_mixer_elem_t *elem ATTRIBUTE_UNUSED,		      int dir ATTRIBUTE_UNUSED,		      snd_mixer_selem_channel_id_t channel ATTRIBUTE_UNUSED,		      long *value ATTRIBUTE_UNUSED){	return -ENXIO;}static int get_switch_ops(snd_mixer_elem_t *elem ATTRIBUTE_UNUSED,			  int dir ATTRIBUTE_UNUSED,			  snd_mixer_selem_channel_id_t channel ATTRIBUTE_UNUSED,			  int *value){	/* struct selem_base *s = snd_mixer_elem_get_private(elem); */	*value = 0;	return 0;}static int set_volume_ops(snd_mixer_elem_t *elem ATTRIBUTE_UNUSED,			  int dir ATTRIBUTE_UNUSED,			  snd_mixer_selem_channel_id_t channel ATTRIBUTE_UNUSED,			  long value ATTRIBUTE_UNUSED){	/* struct selem_base *s = snd_mixer_elem_get_private(elem); */	return 0;}static int set_dB_ops(snd_mixer_elem_t *elem ATTRIBUTE_UNUSED,		      int dir ATTRIBUTE_UNUSED,		      snd_mixer_selem_channel_id_t channel ATTRIBUTE_UNUSED,		      long value ATTRIBUTE_UNUSED,		      int xdir ATTRIBUTE_UNUSED){	return -ENXIO;}static int set_switch_ops(snd_mixer_elem_t *elem ATTRIBUTE_UNUSED,			  int dir ATTRIBUTE_UNUSED,			  snd_mixer_selem_channel_id_t channel ATTRIBUTE_UNUSED,			  int value ATTRIBUTE_UNUSED){	/* struct selem_base *s = snd_mixer_elem_get_private(elem); */	/* int changed; */	return 0;}static int enum_item_name_ops(snd_mixer_elem_t *elem ATTRIBUTE_UNUSED,			      unsigned int item ATTRIBUTE_UNUSED,			      size_t maxlen ATTRIBUTE_UNUSED,			      char *buf ATTRIBUTE_UNUSED){	/* struct selem_base *s = snd_mixer_elem_get_private(elem);*/	return 0;}static int get_enum_item_ops(snd_mixer_elem_t *elem ATTRIBUTE_UNUSED,			     snd_mixer_selem_channel_id_t channel ATTRIBUTE_UNUSED,			     unsigned int *itemp ATTRIBUTE_UNUSED){	/* struct selem_base *s = snd_mixer_elem_get_private(elem); */	return 0;}static int set_enum_item_ops(snd_mixer_elem_t *elem ATTRIBUTE_UNUSED,			     snd_mixer_selem_channel_id_t channel ATTRIBUTE_UNUSED,			     unsigned int item ATTRIBUTE_UNUSED){	/* struct selem_base *s = snd_mixer_elem_get_private(elem); */	return 0;}static struct sm_elem_ops simple_ac97_ops = {	.is		= is_ops,	.get_range	= get_range_ops,	.get_dB_range	= get_dB_range_ops,	.set_range	= set_range_ops,	.get_volume	= get_volume_ops,	.get_dB		= get_dB_ops,	.set_volume	= set_volume_ops,	.set_dB		= set_dB_ops,	.get_switch	= get_switch_ops,	.set_switch	= set_switch_ops,	.enum_item_name	= enum_item_name_ops,	.get_enum_item	= get_enum_item_ops,	.set_enum_item	= set_enum_item_ops};/* * event handling */static int selem_read(snd_mixer_elem_t *elem){	printf("elem read: %p\n", elem);	return 0;}static int simple_event_remove(snd_hctl_elem_t *helem,			       snd_mixer_elem_t *melem ATTRIBUTE_UNUSED){	printf("event remove: %p\n", helem);	return 0;}static void selem_free(snd_mixer_elem_t *elem){	struct selem_base *simple = snd_mixer_elem_get_private(elem);	struct helem_base *hsimple;	struct list_head *pos, *npos;	if (simple->selem.id)		snd_mixer_selem_id_free(simple->selem.id);	list_for_each_safe(pos, npos, &simple->helems) {		hsimple = list_entry(pos, struct helem_base, list);		free(hsimple);	}	free(simple);}static int simple_event_add1(snd_mixer_class_t *class,			     snd_hctl_elem_t *helem,			     struct helem_selector *sel){	struct bclass_private *priv = snd_mixer_sbasic_get_private(class);	snd_mixer_elem_t *melem;	snd_mixer_selem_id_t *id;	snd_ctl_elem_info_t *info;	struct selem_base *simple;	struct helem_base *hsimple;	snd_ctl_elem_type_t ctype;	unsigned long values;	long min, max;	int err, new = 0;	struct list_head *pos;	struct bclass_sid *bsid;	struct melem_sids *sid;	unsigned int ui;		list_for_each(pos, &priv->sids) {		bsid = list_entry(pos, struct bclass_sid, list);		for (ui = 0; ui < bsid->count; ui++) {			if (bsid->sids[ui].sid == sel->sid) {				sid = &bsid->sids[ui];				goto __sid_ok;			}		}	}	return 0;      __sid_ok:	snd_ctl_elem_info_alloca(&info);	err = snd_hctl_elem_info(helem, info);	if (err < 0)		return err;	ctype = snd_ctl_elem_info_get_type(info);	values = snd_ctl_elem_info_get_count(info);	switch (ctype) {	case SND_CTL_ELEM_TYPE_ENUMERATED:		min = 0;		max = snd_ctl_elem_info_get_items(info);		break;	case SND_CTL_ELEM_TYPE_INTEGER:		min = snd_ctl_elem_info_get_min(info);		max = snd_ctl_elem_info_get_max(info);		break;	default:		min = max = 0;		break;	}		printf("event add: %p, %p (%s)\n", helem, sel, snd_hctl_elem_get_name(helem));	if (snd_mixer_selem_id_malloc(&id))		return -ENOMEM;	hsimple = calloc(1, sizeof(*hsimple));	if (hsimple == NULL) {		snd_mixer_selem_id_free(id);		return -ENOMEM;	}	switch (sel->purpose) {	case PURPOSE_SWITCH:		if (ctype != SND_CTL_ELEM_TYPE_BOOLEAN) {		      __invalid_type:		      	snd_mixer_selem_id_free(id);			return -EINVAL;		}		break;	case PURPOSE_VOLUME:		if (ctype != SND_CTL_ELEM_TYPE_INTEGER)			goto __invalid_type;		break;	}	hsimple->purpose = sel->purpose;	hsimple->caps = sel->caps;	hsimple->min = min;	hsimple->max = max;	snd_mixer_selem_id_set_name(id, sid->sname);	snd_mixer_selem_id_set_index(id, sid->sindex);	melem = snd_mixer_find_selem(snd_mixer_class_get_mixer(class), id);	if (!melem) {		simple = calloc(1, sizeof(*simple));		if (!simple) {			snd_mixer_selem_id_free(id);			free(hsimple);			return -ENOMEM;		}		simple->selem.id = id;		simple->selem.ops = &simple_ac97_ops;		INIT_LIST_HEAD(&simple->helems);		simple->sid = sel->sid;		err = snd_mixer_elem_new(&melem, SND_MIXER_ELEM_SIMPLE,					 sid->weight,					 simple, selem_free);		if (err < 0) {			snd_mixer_selem_id_free(id);			free(hsimple);			free(simple);			return err;		}		new = 1;	} else {		simple = snd_mixer_elem_get_private(melem);		snd_mixer_selem_id_free(id);	}	list_add_tail(&hsimple->list, &simple->helems);	hsimple->inactive = snd_ctl_elem_info_is_inactive(info);	err = snd_mixer_elem_attach(melem, helem);	if (err < 0)		goto __error;	simple->dir[0].chanmap |= sid->chanmap[0];	simple->dir[1].chanmap |= sid->chanmap[1];	simple->selem.caps |= hsimple->caps;	update_ranges(simple);#if 0	err = simple_update(melem);	if (err < 0) {		if (new)			goto __error;		return err;	}#endif	if (new)		err = snd_mixer_elem_add(melem, class);	else		err = snd_mixer_elem_info(melem);	if (err < 0)		return err;	err = selem_read(melem);	if (err < 0)		return err;	if (err)		err = snd_mixer_elem_value(melem);	return err;      __error:      	if (new)      		snd_mixer_elem_free(melem);      	return -EINVAL;}static int simple_event_add(snd_mixer_class_t *class, snd_hctl_elem_t *helem){	struct bclass_private *priv = snd_mixer_sbasic_get_private(class);	struct bclass_selector *sel;	struct helem_selector *hsel;	struct list_head *pos;	snd_ctl_elem_iface_t iface = snd_hctl_elem_get_interface(helem);	const char *name = snd_hctl_elem_get_name(helem);	unsigned int index = snd_hctl_elem_get_index(helem);	unsigned int ui;	int err;	list_for_each(pos, &priv->selectors) {		sel = list_entry(pos, struct bclass_selector, list);		for (ui = 0; ui < sel->count; ui++) {			hsel = &sel->selectors[ui];			if (hsel->iface == iface && !strcmp(hsel->name, name) && hsel->index == index) {				err = simple_event_add1(class, helem, hsel);				if (err < 0)					return err;	/* early exit? */			}		}	}	return 0;}int alsa_mixer_sbasic_event(snd_mixer_class_t *class, unsigned int mask,			    snd_hctl_elem_t *helem, snd_mixer_elem_t *melem){	int err;	if (mask == SND_CTL_EVENT_MASK_REMOVE)		return simple_event_remove(helem, melem);	if (mask & SND_CTL_EVENT_MASK_ADD) {		err = simple_event_add(class, helem);		if (err < 0)			return err;	}	if (mask & SND_CTL_EVENT_MASK_INFO) {		err = simple_event_remove(helem, melem);		if (err < 0)			return err;		err = simple_event_add(class, helem);		if (err < 0)			return err;		return 0;	}	if (mask & SND_CTL_EVENT_MASK_VALUE) {		err = selem_read(melem);		if (err < 0)			return err;		if (err) {			err = snd_mixer_elem_value(melem);			if (err < 0)				return err;		}	}	return 0;}static void sbasic_cpriv_free(snd_mixer_class_t *class){	struct bclass_private *priv = snd_mixer_sbasic_get_private(class);	struct bclass_selector *sel;	struct bclass_sid *sid;	struct list_head *pos, *pos1;	list_for_each_safe(pos, pos1, &priv->selectors) {		sel = list_entry(pos, struct bclass_selector, list);		free(sel);	}	list_for_each_safe(pos, pos1, &priv->sids) {		sid = list_entry(pos, struct bclass_sid, list);		free(sid);	}	free(priv);}void alsa_mixer_sbasic_initpriv(snd_mixer_class_t *class,				struct bclass_private *priv){	INIT_LIST_HEAD(&priv->selectors);	INIT_LIST_HEAD(&priv->sids);	snd_mixer_sbasic_set_private(class, priv);	snd_mixer_sbasic_set_private_free(class, sbasic_cpriv_free);}int alsa_mixer_sbasic_selreg(snd_mixer_class_t *class,			     struct helem_selector *selectors,			     unsigned int count){	struct bclass_private *priv = snd_mixer_sbasic_get_private(class);	struct bclass_selector *sel = calloc(1, sizeof(*sel));	if (sel == NULL)		return -ENOMEM;	if (priv == NULL) {		priv = calloc(1, sizeof(*priv));		if (priv == NULL) {			free(sel);			return -ENOMEM;		}	}	sel->selectors = selectors;	sel->count = count;	list_add_tail(&sel->list, &priv->selectors);	return 0;}int alsa_mixer_sbasic_sidreg(snd_mixer_class_t *class,			     struct melem_sids *sids,			     unsigned int count){	struct bclass_private *priv = snd_mixer_sbasic_get_private(class);	struct bclass_sid *sid = calloc(1, sizeof(*sid));	if (sid == NULL)		return -ENOMEM;	if (priv == NULL) {		priv = calloc(1, sizeof(*priv));		if (priv == NULL) {			free(sid);			return -ENOMEM;		}		INIT_LIST_HEAD(&priv->selectors);		INIT_LIST_HEAD(&priv->sids);		snd_mixer_sbasic_set_private(class, priv);		snd_mixer_sbasic_set_private_free(class, sbasic_cpriv_free);	}	sid->sids = sids;	sid->count = count;	list_add(&sid->list, &priv->sids);	return 0;}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
xf在线a精品一区二区视频网站| 色老汉一区二区三区| 精品噜噜噜噜久久久久久久久试看| 日韩黄色小视频| 日韩一区二区麻豆国产| 国内精品伊人久久久久影院对白| 久久精品日韩一区二区三区| 成人午夜激情影院| 亚洲一区二区三区美女| 91精品国产91久久久久久一区二区| 麻豆国产一区二区| 久久免费看少妇高潮| 99精品久久99久久久久| 亚洲国产精品一区二区久久| 日韩欧美一区二区三区在线| 国产成人一区在线| 亚洲久草在线视频| 日韩一区二区不卡| 国产69精品久久久久毛片| 亚洲日本免费电影| 91精品视频网| 国产精品18久久久久| 亚洲免费av观看| 欧美一区二区三区男人的天堂| 福利91精品一区二区三区| 亚洲综合在线五月| 久久天堂av综合合色蜜桃网| 91在线国产福利| 久久不见久久见中文字幕免费| 国产精品视频免费| 欧美日韩久久久久久| 国产91综合一区在线观看| 亚洲一线二线三线久久久| 久久综合色综合88| 欧美三级一区二区| 粉嫩在线一区二区三区视频| 五月婷婷欧美视频| 成人免费小视频| 国产精品美女久久久久aⅴ | 欧美一级欧美一级在线播放| 成人一区二区三区视频在线观看| 同产精品九九九| 国产精品萝li| 精品盗摄一区二区三区| 欧美丝袜自拍制服另类| 成人三级在线视频| 久久国内精品视频| 亚洲最大成人网4388xx| 国产精品电影院| 精品国产免费久久| 911精品国产一区二区在线| 不卡视频在线看| 国产伦精品一区二区三区视频青涩| 亚洲自拍都市欧美小说| 亚洲国产精品成人综合色在线婷婷| 欧美丰满嫩嫩电影| 日本乱人伦一区| caoporen国产精品视频| 狠狠色丁香婷婷综合久久片| 亚洲18色成人| 亚洲无线码一区二区三区| 国产精品美女久久福利网站| 久久精品亚洲麻豆av一区二区| 91精品国产91久久久久久最新毛片| 在线观看91视频| jvid福利写真一区二区三区| 高清在线不卡av| 国产黄色精品视频| 久久99精品一区二区三区三区| 午夜精品久久久久久久久久| 亚洲一区电影777| 中文字幕日韩欧美一区二区三区| 欧美激情综合在线| 国产欧美视频一区二区| 久久久精品黄色| 精品1区2区在线观看| 精品久久久久久久久久久久久久久久久| 欧美一三区三区四区免费在线看| 欧美男男青年gay1069videost| 在线观看成人小视频| 欧美色爱综合网| 欧美精品第1页| 91精品国产高清一区二区三区| 欧美疯狂性受xxxxx喷水图片| 欧美精三区欧美精三区| 欧美二区三区的天堂| 制服丝袜成人动漫| 日韩欧美色电影| 亚洲精品在线免费播放| 精品嫩草影院久久| 国产日韩一级二级三级| 国产精品电影一区二区三区| 亚洲精品成人少妇| 亚洲超碰精品一区二区| 免费欧美在线视频| 国产美女精品人人做人人爽 | 成人sese在线| 91美女蜜桃在线| 欧美视频在线一区二区三区 | 91视视频在线观看入口直接观看www| 日韩精品中文字幕在线不卡尤物| 欧美一区二区在线不卡| 精品成人一区二区| 国产精品剧情在线亚洲| 亚洲一区二区三区视频在线| 美女网站色91| 成人在线综合网站| 日本韩国精品一区二区在线观看| 欧美精选一区二区| 久久久久久久久99精品| 一区二区三区视频在线看| 奇米一区二区三区av| 国产宾馆实践打屁股91| 色噜噜夜夜夜综合网| 日韩三级免费观看| 欧美国产亚洲另类动漫| 五月天丁香久久| 高清在线观看日韩| 7777精品伊人久久久大香线蕉的| 国产日韩欧美不卡在线| 舔着乳尖日韩一区| 成人短视频下载| 日韩一区二区三区免费观看| 亚洲欧洲av色图| 蜜臀国产一区二区三区在线播放| www.久久精品| 欧美xfplay| 亚洲大型综合色站| 国产精品99精品久久免费| 欧美性受xxxx| 国产精品色婷婷久久58| 日韩电影在线一区| 色诱视频网站一区| 久久品道一品道久久精品| 日韩精品五月天| 99久久婷婷国产精品综合| 精品日韩一区二区三区免费视频| 亚洲免费在线电影| 国产成人一级电影| 欧美刺激午夜性久久久久久久| 一区二区在线看| 成人午夜在线播放| 欧美成人伊人久久综合网| 亚洲国产日韩一区二区| 91亚洲资源网| 国产精品久久久久久亚洲伦| 精品一区二区av| 欧美挠脚心视频网站| 亚洲精品v日韩精品| 成人高清免费在线播放| 国产亚洲精品免费| 狠狠色综合日日| 欧美成人一区二区三区片免费| 天天综合网 天天综合色| 91豆麻精品91久久久久久| 亚洲欧洲性图库| 国产99精品视频| 国产欧美日韩在线| 国产在线精品一区二区不卡了| 在线电影一区二区三区| 亚洲va天堂va国产va久| 欧美亚洲一区二区在线| 亚洲精品少妇30p| 99re视频精品| 亚洲天堂精品视频| av网站一区二区三区| 国产精品色婷婷| av不卡免费电影| 国产精品第四页| bt7086福利一区国产| 日韩久久一区二区| 91麻豆精品视频| 一区二区三区小说| 欧美日韩三级在线| 日韩国产一二三区| 日韩午夜小视频| 国产一区二区伦理片| 国产亚洲一区二区三区四区| 日韩欧美三级在线| 久久99久久精品| 欧美激情一区二区三区全黄| 不卡高清视频专区| 亚洲日本电影在线| 欧美色视频在线| 日本va欧美va瓶| 久久婷婷国产综合国色天香| 成人免费va视频| 一区2区3区在线看| 欧美精选一区二区| 国产精品一区二区三区乱码| 国产精品久久久久久久久免费丝袜| 99久久免费视频.com| 亚洲国产乱码最新视频| 欧美成人性战久久| 国产传媒日韩欧美成人| 亚洲精品成a人| 欧美不卡一区二区三区四区| 成人激情动漫在线观看| 亚洲成人av一区二区| 欧美成人女星排名|