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

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

?? hda_proc.c

?? 一個Linux下的軟貓驅動
?? C
字號:
/* * Universal Interface for Intel High Definition Audio Codec *  * Generic proc interface * * Copyright (c) 2004 Takashi Iwai <tiwai@suse.de> * * *  This driver 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 driver 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 <sound/driver.h>#include <linux/init.h>#include <linux/pci.h>#include <sound/core.h>#include "hda_codec.h"static const char *get_wid_type_name(unsigned int wid_value){	static char *names[16] = {		[AC_WID_AUD_OUT] = "Audio Output",		[AC_WID_AUD_IN] = "Audio Input",		[AC_WID_AUD_MIX] = "Audio Mixer",		[AC_WID_AUD_SEL] = "Audio Selector",		[AC_WID_PIN] = "Pin Complex",		[AC_WID_POWER] = "Power Widget",		[AC_WID_VOL_KNB] = "Volume Knob Widget",		[AC_WID_BEEP] = "Beep Generator Widget",		[AC_WID_VENDOR] = "Vendor Defined Widget",	};	wid_value &= 0xf;	if (names[wid_value])		return names[wid_value];	else		return "UNKOWN Widget";}static void print_amp_caps(snd_info_buffer_t *buffer,			   struct hda_codec *codec, hda_nid_t nid, int dir){	unsigned int caps;	if (dir == HDA_OUTPUT)		caps = snd_hda_param_read(codec, nid, AC_PAR_AMP_OUT_CAP);	else		caps = snd_hda_param_read(codec, nid, AC_PAR_AMP_IN_CAP);	if (caps == -1 || caps == 0) {		snd_iprintf(buffer, "N/A\n");		return;	}	snd_iprintf(buffer, "ofs=0x%02x, nsteps=0x%02x, stepsize=0x%02x, mute=%x\n",		    caps & AC_AMPCAP_OFFSET,		    (caps & AC_AMPCAP_NUM_STEPS) >> AC_AMPCAP_NUM_STEPS_SHIFT,		    (caps & AC_AMPCAP_STEP_SIZE) >> AC_AMPCAP_STEP_SIZE_SHIFT,		    (caps & AC_AMPCAP_MUTE) >> AC_AMPCAP_MUTE_SHIFT);}static void print_amp_vals(snd_info_buffer_t *buffer,			   struct hda_codec *codec, hda_nid_t nid,			   int dir, int stereo, int indices){	unsigned int val;	int i;	if (dir == HDA_OUTPUT)		dir = AC_AMP_GET_OUTPUT;	else		dir = AC_AMP_GET_INPUT;	for (i = 0; i < indices; i++) {		snd_iprintf(buffer, " [");		if (stereo) {			val = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_AMP_GAIN_MUTE,						 AC_AMP_GET_LEFT | dir | i);			snd_iprintf(buffer, "0x%02x ", val);		}		val = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_AMP_GAIN_MUTE,					 AC_AMP_GET_RIGHT | dir | i);		snd_iprintf(buffer, "0x%02x]", val);	}	snd_iprintf(buffer, "\n");}static void print_pcm_caps(snd_info_buffer_t *buffer,			   struct hda_codec *codec, hda_nid_t nid){	unsigned int pcm = snd_hda_param_read(codec, nid, AC_PAR_PCM);	unsigned int stream = snd_hda_param_read(codec, nid, AC_PAR_STREAM);	if (pcm == -1 || stream == -1) {		snd_iprintf(buffer, "N/A\n");		return;	}	snd_iprintf(buffer, "rates 0x%03x, bits 0x%02x, types 0x%x\n",		    pcm & AC_SUPPCM_RATES, (pcm >> 16) & 0xff, stream & 0xf);}static const char *get_jack_location(u32 cfg){	static char *bases[7] = {		"N/A", "Rear", "Front", "Left", "Right", "Top", "Bottom",	};	static unsigned char specials_idx[] = {		0x07, 0x08,		0x17, 0x18, 0x19,		0x37, 0x38	};	static char *specials[] = {		"Rear Panel", "Drive Bar",		"Riser", "HDMI", "ATAPI",		"Mobile-In", "Mobile-Out"	};	int i;	cfg = (cfg & AC_DEFCFG_LOCATION) >> AC_DEFCFG_LOCATION_SHIFT;	if ((cfg & 0x0f) < 7)		return bases[cfg & 0x0f];	for (i = 0; i < ARRAY_SIZE(specials_idx); i++) {		if (cfg == specials_idx[i])			return specials[i];	}	return "UNKNOWN";}static const char *get_jack_connection(u32 cfg){	static char *names[16] = {		"Unknown", "1/8", "1/4", "ATAPI",		"RCA", "Optical","Digital", "Analog",		"DIN", "XLR", "RJ11", "Comb",		NULL, NULL, NULL, "Other"	};	cfg = (cfg & AC_DEFCFG_CONN_TYPE) >> AC_DEFCFG_CONN_TYPE_SHIFT;	if (names[cfg])		return names[cfg];	else		return "UNKNOWN";}static const char *get_jack_color(u32 cfg){	static char *names[16] = {		"Unknown", "Black", "Grey", "Blue",		"Green", "Red", "Orange", "Yellow",		"Purple", "Pink", NULL, NULL,		NULL, NULL, "White", "Other",	};	cfg = (cfg & AC_DEFCFG_COLOR) >> AC_DEFCFG_COLOR_SHIFT;	if (names[cfg])		return names[cfg];	else		return "UNKNOWN";}static void print_pin_caps(snd_info_buffer_t *buffer,			   struct hda_codec *codec, hda_nid_t nid){	static char *jack_conns[4] = { "Jack", "N/A", "Fixed", "Both" };	static char *jack_types[16] = {		"Line Out", "Speaker", "HP Out", "CD",		"SPDIF Out", "Digital Out", "Modem Line", "Modem Hand",		"Line In", "Aux", "Mic", "Telephony",		"SPDIF In", "Digitial In", "Reserved", "Other"	};	static char *jack_locations[4] = { "Ext", "Int", "Sep", "Oth" };	unsigned int caps;	caps = snd_hda_param_read(codec, nid, AC_PAR_PIN_CAP);	snd_iprintf(buffer, "  Pincap 0x08%x:", caps);	if (caps & AC_PINCAP_IN)		snd_iprintf(buffer, " IN");	if (caps & AC_PINCAP_OUT)		snd_iprintf(buffer, " OUT");	if (caps & AC_PINCAP_HP_DRV)		snd_iprintf(buffer, " HP");	snd_iprintf(buffer, "\n");	caps = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONFIG_DEFAULT, 0);	snd_iprintf(buffer, "  Pin Default 0x%08x: [%s] %s at %s %s\n", caps,		    jack_conns[(caps & AC_DEFCFG_PORT_CONN) >> AC_DEFCFG_PORT_CONN_SHIFT],		    jack_types[(caps & AC_DEFCFG_DEVICE) >> AC_DEFCFG_DEVICE_SHIFT],		    jack_locations[(caps >> (AC_DEFCFG_LOCATION_SHIFT + 4)) & 3],		    get_jack_location(caps));	snd_iprintf(buffer, "    Conn = %s, Color = %s\n",		    get_jack_connection(caps),		    get_jack_color(caps));}static void print_codec_info(snd_info_entry_t *entry, snd_info_buffer_t *buffer){	struct hda_codec *codec = entry->private_data;	char buf[32];	hda_nid_t nid;	int i, nodes;	snd_hda_get_codec_name(codec, buf, sizeof(buf));	snd_iprintf(buffer, "Codec: %s\n", buf);	snd_iprintf(buffer, "Address: %d\n", codec->addr);	snd_iprintf(buffer, "Vendor Id: 0x%x\n", codec->vendor_id);	snd_iprintf(buffer, "Subsystem Id: 0x%x\n", codec->subsystem_id);	snd_iprintf(buffer, "Revision Id: 0x%x\n", codec->revision_id);	if (! codec->afg)		return;	snd_iprintf(buffer, "Default PCM: ");	print_pcm_caps(buffer, codec, codec->afg);	snd_iprintf(buffer, "Default Amp-In caps: ");	print_amp_caps(buffer, codec, codec->afg, HDA_INPUT);	snd_iprintf(buffer, "Default Amp-Out caps: ");	print_amp_caps(buffer, codec, codec->afg, HDA_OUTPUT);	nodes = snd_hda_get_sub_nodes(codec, codec->afg, &nid);	if (! nid || nodes < 0) {		snd_iprintf(buffer, "Invalid AFG subtree\n");		return;	}	for (i = 0; i < nodes; i++, nid++) {		unsigned int wid_caps = snd_hda_param_read(codec, nid,							   AC_PAR_AUDIO_WIDGET_CAP);		unsigned int wid_type = (wid_caps & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT;		int conn_len = 0; 		hda_nid_t conn[HDA_MAX_CONNECTIONS];		snd_iprintf(buffer, "Node 0x%02x [%s] wcaps 0x%x:", nid,			    get_wid_type_name(wid_type), wid_caps);		if (wid_caps & AC_WCAP_STEREO)			snd_iprintf(buffer, " Stereo");		else			snd_iprintf(buffer, " Mono");		if (wid_caps & AC_WCAP_DIGITAL)			snd_iprintf(buffer, " Digital");		if (wid_caps & AC_WCAP_IN_AMP)			snd_iprintf(buffer, " Amp-In");		if (wid_caps & AC_WCAP_OUT_AMP)			snd_iprintf(buffer, " Amp-Out");		snd_iprintf(buffer, "\n");		if (wid_caps & AC_WCAP_CONN_LIST)			conn_len = snd_hda_get_connections(codec, nid, conn,							   HDA_MAX_CONNECTIONS);		if (wid_caps & AC_WCAP_IN_AMP) {			snd_iprintf(buffer, "  Amp-In caps: ");			print_amp_caps(buffer, codec, nid, HDA_INPUT);			snd_iprintf(buffer, "  Amp-In vals: ");			print_amp_vals(buffer, codec, nid, HDA_INPUT,				       wid_caps & AC_WCAP_STEREO, conn_len);		}		if (wid_caps & AC_WCAP_OUT_AMP) {			snd_iprintf(buffer, "  Amp-Out caps: ");			print_amp_caps(buffer, codec, nid, HDA_OUTPUT);			snd_iprintf(buffer, "  Amp-Out vals: ");			print_amp_vals(buffer, codec, nid, HDA_OUTPUT,				       wid_caps & AC_WCAP_STEREO, 1);		}		if (wid_type == AC_WID_PIN) {			unsigned int pinctls;			print_pin_caps(buffer, codec, nid);			pinctls = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0);			snd_iprintf(buffer, "  Pin-ctls: 0x%02x:", pinctls);			if (pinctls & AC_PINCTL_IN_EN)				snd_iprintf(buffer, " IN");			if (pinctls & AC_PINCTL_OUT_EN)				snd_iprintf(buffer, " OUT");			if (pinctls & AC_PINCTL_HP_EN)				snd_iprintf(buffer, " HP");			snd_iprintf(buffer, "\n");		}		if ((wid_type == AC_WID_AUD_OUT || wid_type == AC_WID_AUD_IN) &&		    (wid_caps & AC_WCAP_FORMAT_OVRD)) {			snd_iprintf(buffer, "  PCM: ");			print_pcm_caps(buffer, codec, nid);		}		if (wid_caps & AC_WCAP_POWER)			snd_iprintf(buffer, "  Power: 0x%x\n",				    snd_hda_codec_read(codec, nid, 0,						       AC_VERB_GET_POWER_STATE, 0));		if (wid_caps & AC_WCAP_CONN_LIST) {			int c, curr = -1;			if (conn_len > 1 && wid_type != AC_WID_AUD_MIX)				curr = snd_hda_codec_read(codec, nid, 0,					AC_VERB_GET_CONNECT_SEL, 0);			snd_iprintf(buffer, "  Connection: %d\n", conn_len);			snd_iprintf(buffer, "    ");			for (c = 0; c < conn_len; c++) {				snd_iprintf(buffer, " 0x%02x", conn[c]);				if (c == curr)					snd_iprintf(buffer, "*");			}			snd_iprintf(buffer, "\n");		}	}}/* * create a proc read */int snd_hda_codec_proc_new(struct hda_codec *codec){	char name[32];	snd_info_entry_t *entry;	int err;	snprintf(name, sizeof(name), "codec#%d", codec->addr);	err = snd_card_proc_new(codec->bus->card, name, &entry);	if (err < 0)		return err;	snd_info_set_text_ops(entry, codec, 32 * 1024, print_codec_info);	return 0;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品久久一级| 一区二区三区四区亚洲| 中文字幕一区二区三区不卡在线| 亚洲综合色噜噜狠狠| 久久精品国产澳门| 欧洲另类一二三四区| 久久网站热最新地址| 天堂成人国产精品一区| 成人国产亚洲欧美成人综合网| 9191精品国产综合久久久久久| 国产日产欧美一区| 蜜臀av性久久久久蜜臀aⅴ四虎| 91麻豆福利精品推荐| 国产日韩影视精品| 精品一区二区三区蜜桃| 91精品国产综合久久小美女| 亚洲视频免费在线观看| 久久精品国产亚洲高清剧情介绍| 在线观看中文字幕不卡| 国产精品久久三区| 成人性生交大片免费| 久久久久久亚洲综合影院红桃| 日韩精品一二三四| 欧美日韩久久一区| 亚洲国产成人tv| 色哟哟在线观看一区二区三区| 国产亚洲人成网站| 国产一区91精品张津瑜| 日韩精品中午字幕| 男人操女人的视频在线观看欧美| 欧美日韩精品电影| 图片区小说区区亚洲影院| 91在线观看成人| 亚洲日本丝袜连裤袜办公室| 福利电影一区二区| 国产日产精品一区| 成人黄色在线看| 国产精品久久久久久久久快鸭| 国产黄色精品网站| 欧美国产乱子伦 | 欧美一级一区二区| 人人狠狠综合久久亚洲| 日韩一区二区三区视频| 日韩av一级电影| 精品欧美乱码久久久久久| 久久99久久99| 欧美国产日韩精品免费观看| 99re6这里只有精品视频在线观看| 色素色在线综合| 色久综合一二码| 麻豆精品视频在线| 久久中文娱乐网| 成人中文字幕在线| 亚洲影视在线播放| 欧美一区二区性放荡片| 国产一区二区三区视频在线播放| 久久久久国产精品厨房| 不卡一区二区在线| 亚洲成人激情自拍| 日韩欧美国产一区二区在线播放 | 成人欧美一区二区三区| 欧洲中文字幕精品| 久色婷婷小香蕉久久| 久久先锋影音av| 91免费看视频| 免费看欧美美女黄的网站| 日本一区二区在线不卡| 91美女片黄在线观看91美女| 热久久免费视频| 中文字幕乱码一区二区免费| 在线亚洲高清视频| 韩国一区二区三区| 亚洲欧美激情一区二区| 精品国产成人系列| 色婷婷av一区二区三区大白胸 | 亚洲福利视频三区| 久久综合色天天久久综合图片| 91色在线porny| 国产综合成人久久大片91| 亚洲精选一二三| 久久夜色精品一区| 日本乱人伦aⅴ精品| 久久国产麻豆精品| 亚洲综合色视频| 国产精品午夜电影| 日韩久久久精品| 欧美日韩美少妇| 91视频www| 成人午夜私人影院| 黑人巨大精品欧美一区| 一区二区三区加勒比av| 国产女人18毛片水真多成人如厕| 欧美日韩卡一卡二| 色婷婷综合久久久中文一区二区| 国产精品一二三四区| 麻豆成人91精品二区三区| 亚洲一区二区五区| 一区二区三区在线观看动漫| 久久久久九九视频| 久久久噜噜噜久久人人看 | 国产日产欧美一区二区三区| 日韩一区二区三区视频在线观看 | 一区二区三区四区激情 | 五月天一区二区三区| 日韩理论片网站| 国产精品网站导航| 久久久不卡网国产精品二区| 91精品国产一区二区三区香蕉| 日本韩国视频一区二区| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 日韩午夜在线影院| 欧美嫩在线观看| 欧美日韩国产小视频在线观看| 在线免费观看日韩欧美| 99在线视频精品| 99精品视频在线播放观看| av高清不卡在线| 99精品热视频| 欧美专区日韩专区| 欧美午夜电影网| 欧美精品在线一区二区| 7878成人国产在线观看| 4438成人网| 欧美一区二区高清| www欧美成人18+| 国产日本欧洲亚洲| 亚洲女性喷水在线观看一区| 亚洲女同ⅹxx女同tv| 午夜久久福利影院| 蜜桃视频在线观看一区| 国产在线精品免费| 成人亚洲精品久久久久软件| 91麻豆123| 欧美日韩国产综合久久| 日韩视频在线永久播放| 久久久久久久电影| 亚洲免费观看高清完整版在线| 亚洲一区二区五区| 精品一区二区三区在线视频| 国产激情偷乱视频一区二区三区| 91免费观看在线| 8v天堂国产在线一区二区| 久久午夜老司机| 亚洲免费资源在线播放| 日韩精品亚洲专区| 国产福利一区在线| 欧亚洲嫩模精品一区三区| 欧美一区二区免费视频| 精品国产一区二区三区忘忧草| 国产精品乱人伦中文| 午夜av区久久| 国产精品亚洲视频| 欧美日韩国产首页在线观看| 久久久国产精华| 亚洲一区二区欧美激情| 精品亚洲欧美一区| 色国产综合视频| 久久久高清一区二区三区| 亚洲精品综合在线| 国产毛片精品视频| 欧美日韩高清一区二区三区| 久久久亚洲综合| 日韩精品国产精品| 97se狠狠狠综合亚洲狠狠| 欧美一区二区三区婷婷月色| 国产精品久久网站| 精品一区二区三区的国产在线播放| av不卡在线播放| 久久日韩精品一区二区五区| 亚洲综合久久久| 成人免费精品视频| 欧美不卡视频一区| 午夜成人免费视频| 欧洲一区在线观看| 亚洲人一二三区| 国产一区亚洲一区| 日韩一区二区三区观看| 亚洲精品国久久99热| 成人综合在线网站| 26uuu欧美| 蜜桃精品视频在线| 欧美综合在线视频| 一区二区三区资源| 97精品久久久久中文字幕 | 欧美视频一区二区三区| 国产欧美日本一区视频| 日本成人在线不卡视频| 欧美亚洲综合在线| 久久精品欧美一区二区三区不卡 | 欧美偷拍一区二区| 国产精品久久久久久久裸模| 国产美女娇喘av呻吟久久| 欧美一级理论性理论a| 亚洲一区免费视频| 91丨九色丨国产丨porny| 国产精品毛片高清在线完整版| 狠狠狠色丁香婷婷综合激情| 日韩欧美一卡二卡| 免费人成精品欧美精品| 91精品国产日韩91久久久久久|