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

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

?? headset.c

?? 基于LINUX內核驅動的開發
?? C
?? 第 1 頁 / 共 4 頁
字號:
	reply = dbus_message_new_method_return(msg);	if (!reply)		return DBUS_HANDLER_RESULT_NEED_MEMORY;	g_free(hs->ph_number);	hs->ph_number = g_strdup(number);	hs->type = type;	send_message_and_unref(conn, reply);	return DBUS_HANDLER_RESULT_HANDLED;}static DBusMethodVTable headset_methods[] = {	{ "Connect",		hs_connect,		"",	""	},	{ "Disconnect",		hs_disconnect,		"",	""	},	{ "IsConnected",	hs_is_connected,	"",	"b"	},	{ "IndicateCall",	hs_ring,		"",	""	},	{ "CancelCall",		hs_cancel_ringing,	"",	""	},	{ "Play",		hs_play,		"",	""	},	{ "Stop",		hs_stop,		"",	""	},	{ "IsPlaying",		hs_is_playing,		"",	"b"	},	{ "GetSpeakerGain",	hs_get_speaker_gain,	"",	"q"	},	{ "GetMicrophoneGain",	hs_get_mic_gain,	"",	"q"	},	{ "SetSpeakerGain",	hs_set_speaker_gain,	"q",	""	},	{ "SetMicrophoneGain",	hs_set_mic_gain,	"q",	""	},	{ "SetupCall",		hf_setup_call,		"s",	""	},	{ "IdentifyCall",	hf_identify_call,	"si",	""	},	{ NULL, NULL, NULL, NULL }};static DBusSignalVTable headset_signals[] = {	{ "Connected",			""	},	{ "Disconnected",		""	},	{ "AnswerRequested",		""	},	{ "Stopped",			""	},	{ "Playing",			""	},	{ "SpeakerGainChanged",		"q"	},	{ "MicrophoneGainChanged",	"q"	},	{ "CallTerminated",		""	},	{ NULL, NULL }};static void headset_set_channel(struct headset *headset, sdp_record_t *record,				uint16_t svc){	int ch;	sdp_list_t *protos;	if (sdp_get_access_protos(record, &protos) < 0) {		error("Unable to get access protos from headset record");		return;	}	ch = sdp_get_proto_port(protos, RFCOMM_UUID);	sdp_list_foreach(protos, (sdp_list_func_t) sdp_list_free, NULL);	sdp_list_free(protos, NULL);	if (ch > 0) {		headset->rfcomm_ch = ch;		debug("Discovered %s service on RFCOMM channel %d",			svc == HEADSET_SVCLASS_ID ? "Headset" : "Handsfree",			ch);	} else		error("Unable to get RFCOMM channel from Headset record");}void headset_update(struct device *dev, sdp_record_t *record, uint16_t svc){	struct headset *headset = dev->headset;	switch (svc) {	case HANDSFREE_SVCLASS_ID:		if (headset->hfp_handle &&				(headset->hfp_handle != record->handle)) {			error("More than one HFP record found on device");			return;		}		headset->hfp_handle = record->handle;		break;	case HEADSET_SVCLASS_ID:		if (headset->hsp_handle &&				(headset->hsp_handle != record->handle)) {			error("More than one HSP record found on device");			return;		}		headset->hsp_handle = record->handle;		/* Ignore this record if we already have access to HFP */		if (headset->hfp_handle)			return;		break;	default:		debug("Invalid record passed to headset_update");		return;	}	headset_set_channel(headset, record, svc);}struct headset *headset_init(struct device *dev, sdp_record_t *record,				uint16_t svc){	struct headset *hs;	hs = g_new0(struct headset, 1);	hs->rfcomm_ch = -1;	hs->sp_gain = -1;	hs->mic_gain = -1;	hs->search_hfp = server_is_enabled(HANDSFREE_SVCLASS_ID);	hs->hfp_active = FALSE;	hs->cli_active = FALSE;	hs->ph_number = NULL;	if (!record)		goto register_iface;	switch (svc) {	case HANDSFREE_SVCLASS_ID:		hs->hfp_handle = record->handle;		break;	case HEADSET_SVCLASS_ID:		hs->hsp_handle = record->handle;		break;	default:		debug("Invalid record passed to headset_init");		g_free(hs);		return NULL;	}	headset_set_channel(hs, record, svc);register_iface:	if (!dbus_connection_register_interface(dev->conn, dev->path,						AUDIO_HEADSET_INTERFACE,						headset_methods,						headset_signals, NULL)) {		g_free(hs);		return NULL;	}	return hs;}uint32_t headset_config_init(GKeyFile *config){	GError *err = NULL;	gboolean value;	char *str;	/* Use the default values if there is no config file */	if (config == NULL)		return ag_features;	str = g_key_file_get_string(config, "General", "SCORouting",					&err);	if (err) {		debug("audio.conf: %s", err->message);		g_error_free(err);		err = NULL;	} else {		if (strcmp(str, "PCM") == 0)			sco_hci = FALSE;		else if (strcmp(str, "HCI") == 0)			sco_hci = TRUE;		else			error("Invalid Headset Routing value: %s", str);		g_free(str);	}	value = g_key_file_get_boolean(config, "Headset", "3WayCalling",					&err);	if (err) {		debug("audio.conf: %s", err->message);		g_error_free(err);		err = NULL;	} else if (value)		ag_features |= AG_FEATURE_THREE_WAY_CALLING;	value = g_key_file_get_boolean(config, "Headset", "EchoCancelNoiseCancel",					&err);	if (err) {		debug("audio.conf: %s", err->message);		g_error_free(err);		err = NULL;	} else if (value)		ag_features |= AG_FEATURE_EC_ANDOR_NR;	value = g_key_file_get_boolean(config, "Headset", "VoiceRecognition",					&err);	if (err) {		debug("audio.conf: %s", err->message);		g_error_free(err);		err = NULL;	} else if (value)		ag_features |= AG_FEATURE_VOICE_RECOGNITION;	value = g_key_file_get_boolean(config, "Headset", "InBandRingtone",					&err);	if (err) {		debug("audio.conf: %s", err->message);		g_error_free(err);		err = NULL;	} else if (value)		ag_features |= AG_FEATURE_INBAND_RINGTONE;	value = g_key_file_get_boolean(config, "Headset", "VoiceTags",					&err);	if (err) {		debug("audio.conf: %s", err->message);		g_error_free(err);		err = NULL;	} else if (value)		ag_features |= AG_FEATURE_ATTACH_NUMBER_TO_VOICETAG;	value = g_key_file_get_boolean(config, "Headset", "RejectingCalls",					&err);	if (err) {		debug("audio.conf: %s", err->message);		g_error_free(err);		err = NULL;	} else if (value)		ag_features |= AG_FEATURE_REJECT_A_CALL;	value = g_key_file_get_boolean(config, "Headset", "EnhancedCallStatus",					&err);	if (err) {		debug("audio.conf: %s", err->message);		g_error_free(err);		err = NULL;	} else if (value)		ag_features |= AG_FEATURE_ENHANCES_CALL_STATUS;	value = g_key_file_get_boolean(config, "Headset", "EnhancedCallControl",					&err);	if (err) {		debug("audio.conf: %s", err->message);		g_error_free(err);		err = NULL;	} else if (value)		ag_features |= AG_FEATURE_ENHANCES_CALL_CONTROL;	value = g_key_file_get_boolean(config, "Headset",					"ExtendedErrorResultCodes", &err);	if (err) {		debug("audio.conf: %s", err->message);		g_error_free(err);		err = NULL;	} else if (value)		ag_features |= AG_FEATURE_EXTENDED_ERROR_RESULT_CODES;	return ag_features;}void headset_free(struct device *dev){	struct headset *hs = dev->headset;	if (hs->sco) {		g_io_channel_close(hs->sco);		g_io_channel_unref(hs->sco);	}	if (hs->rfcomm) {		g_io_channel_close(hs->rfcomm);		g_io_channel_unref(hs->rfcomm);	}	g_free(hs);	dev->headset = NULL;}gboolean headset_cancel_stream(struct device *dev, unsigned int id){	struct headset *hs = dev->headset;	struct pending_connect *p = hs->pending;	GSList *l;	struct connect_cb *cb = NULL;	if (!p)		return FALSE;	for (l = p->callbacks; l != NULL; l = l->next) {		struct connect_cb *tmp = l->data;		if (tmp->id == id) {			cb = tmp;			break;		}	}	if (!cb)		return FALSE;	p->callbacks = g_slist_remove(p->callbacks, cb);	g_free(cb);	if (p->callbacks || p->msg)		return TRUE;	pending_connect_finalize(dev);	if (hs->auto_dc)		headset_set_state(dev, HEADSET_STATE_DISCONNECTED);	return TRUE;}static gboolean dummy_connect_complete(struct device *dev){	pending_connect_finalize(dev);	return FALSE;}unsigned int headset_request_stream(struct device *dev, headset_stream_cb_t cb,					void *user_data){	struct headset *hs = dev->headset;	unsigned int id;	if (hs->rfcomm && hs->sco) {		id = connect_cb_new(hs, HEADSET_STATE_PLAYING, cb, user_data);		g_idle_add((GSourceFunc) dummy_connect_complete, dev);		return id;	}	if (hs->state == HEADSET_STATE_CONNECT_IN_PROGRESS)		return connect_cb_new(hs, HEADSET_STATE_PLAYING, cb, user_data);	if (hs->rfcomm == NULL) {		if (rfcomm_connect(dev, cb, user_data, &id) < 0)			return 0;		hs->auto_dc = TRUE;	} else {		if (sco_connect(dev, cb, user_data, &id) < 0)			return 0;	}	hs->pending->target_state = HEADSET_STATE_PLAYING;	return id;}gboolean get_hfp_active(struct device *dev){	struct headset *hs = dev->headset;	return hs->hfp_active;}void set_hfp_active(struct device *dev, gboolean active){	struct headset *hs = dev->headset;	hs->hfp_active = active;}int headset_connect_rfcomm(struct device *dev, int sock){	struct headset *hs = dev->headset;	hs->tmp_rfcomm = g_io_channel_unix_new(sock);	return hs->tmp_rfcomm ? 0 : -EINVAL;}int headset_close_rfcomm(struct device *dev){	struct headset *hs = dev->headset;	GIOChannel *rfcomm = hs->tmp_rfcomm ? hs->tmp_rfcomm : hs->rfcomm;	if (hs->ring_timer) {		g_source_remove(hs->ring_timer);		hs->ring_timer = 0;	}	if (rfcomm) {		g_io_channel_close(rfcomm);		g_io_channel_unref(rfcomm);		hs->tmp_rfcomm = NULL;		hs->rfcomm = NULL;	}	hs->data_start = 0;	hs->data_length = 0;	return 0;}void headset_set_authorized(struct device *dev){	struct headset *hs = dev->headset;	hs->rfcomm = hs->tmp_rfcomm;	hs->tmp_rfcomm = NULL;	g_io_add_watch(hs->rfcomm,			G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_NVAL,			(GIOFunc) rfcomm_io_cb, dev);	hs->auto_dc = FALSE;	if (!hs->hfp_active)		headset_set_state(dev, HEADSET_STATE_CONNECTED);}void headset_set_state(struct device *dev, headset_state_t state){	struct headset *hs = dev->headset;	if (hs->state == state)		return;	switch (state) {	case HEADSET_STATE_DISCONNECTED:		close_sco(dev);		headset_close_rfcomm(dev);		dbus_connection_emit_signal(dev->conn, dev->path,						AUDIO_HEADSET_INTERFACE,						"Disconnected",						DBUS_TYPE_INVALID);		break;	case HEADSET_STATE_CONNECT_IN_PROGRESS:		break;	case HEADSET_STATE_CONNECTED:		close_sco(dev);		if (hs->state < state) {			dbus_connection_emit_signal(dev->conn, dev->path,						AUDIO_HEADSET_INTERFACE,						"Connected",						DBUS_TYPE_INVALID);		} else if (hs->state == HEADSET_STATE_PLAYING) {			dbus_connection_emit_signal(dev->conn, dev->path,						AUDIO_HEADSET_INTERFACE,						"Stopped",						DBUS_TYPE_INVALID);		}		break;	case HEADSET_STATE_PLAY_IN_PROGRESS:		break;	case HEADSET_STATE_PLAYING:		hs->sco_id = g_io_add_watch(hs->sco,					G_IO_ERR | G_IO_HUP | G_IO_NVAL,					(GIOFunc) sco_cb, dev);		dbus_connection_emit_signal(dev->conn, dev->path,						AUDIO_HEADSET_INTERFACE,						"Playing", DBUS_TYPE_INVALID);		if (hs->sp_gain >= 0)			headset_send(hs, "\r\n+VGS=%u\r\n", hs->sp_gain);		if (hs->mic_gain >= 0)			headset_send(hs, "\r\n+VGM=%u\r\n", hs->mic_gain);		break;	}	debug("State changed %s: %s -> %s", dev->path, str_state[hs->state],		str_state[state]);	hs->state = state;}headset_state_t headset_get_state(struct device *dev){	struct headset *hs = dev->headset;	return hs->state;}int headset_get_channel(struct device *dev){	struct headset *hs = dev->headset;	return hs->rfcomm_ch;}gboolean headset_is_active(struct device *dev){	struct headset *hs = dev->headset;	if (hs->state != HEADSET_STATE_DISCONNECTED)		return TRUE;	return FALSE;}gboolean headset_lock(struct device *dev, headset_lock_t lock){	struct headset *hs = dev->headset;	if (hs->lock & lock)		return FALSE;	hs->lock |= lock;	return TRUE;}gboolean headset_unlock(struct device *dev, headset_lock_t lock){	struct headset *hs = dev->headset;	if (!(hs->lock & lock))		return FALSE;	hs->lock &= ~lock;	if (hs->lock)		return TRUE;	if (hs->auto_dc)		headset_set_state(dev, HEADSET_STATE_DISCONNECTED);	else if (hs->state == HEADSET_STATE_PLAYING)		headset_set_state(dev, HEADSET_STATE_CONNECTED);	return TRUE;}gboolean headset_suspend(struct device *dev, void *data){	return TRUE;}gboolean headset_play(struct device *dev, void *data){	return TRUE;}int headset_get_sco_fd(struct device *dev){	struct headset *hs = dev->headset;	if (!hs->sco)		return -1;	return g_io_channel_unix_get_fd(hs->sco);}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩精品一二三四| 在线电影一区二区三区| 久久久亚洲综合| 激情成人综合网| 欧美激情自拍偷拍| 成人av在线影院| 亚洲美女在线一区| 在线观看亚洲精品| 日韩电影免费一区| 久久亚洲捆绑美女| 91在线丨porny丨国产| 亚洲一区二区在线播放相泽| 欧美丰满少妇xxxxx高潮对白| 男女激情视频一区| 国产欧美一区二区精品性色| 97精品国产97久久久久久久久久久久 | 亚洲综合在线免费观看| 欧美日韩国产高清一区二区三区 | 性感美女久久精品| 日韩欧美色综合| 成人精品国产免费网站| 亚洲国产综合在线| 久久综合九色综合欧美98| 91一区在线观看| 日产国产高清一区二区三区| 国产欧美视频一区二区| 欧美性色黄大片| 国产精品自在在线| 一区二区日韩av| 久久久综合激的五月天| 精品污污网站免费看| 国产精品一区一区三区| 亚洲成人福利片| 国产日本亚洲高清| 91 com成人网| 成人av网站在线| 麻豆久久一区二区| 亚洲免费视频成人| 久久久精品免费观看| 欧美高清视频www夜色资源网| 丁香婷婷综合激情五月色| 天使萌一区二区三区免费观看| 国产网站一区二区三区| 91精品久久久久久久91蜜桃 | 在线观看日韩精品| 国产一区二区三区久久悠悠色av| 一区二区三区鲁丝不卡| 久久久久亚洲综合| 91精品国产91久久久久久最新毛片| a在线播放不卡| 韩国视频一区二区| 免费人成在线不卡| 亚洲国产欧美在线人成| 中文字幕不卡三区| 久久久午夜电影| 日韩视频一区二区在线观看| 欧美影视一区二区三区| www.亚洲人| 成人午夜在线视频| 国产麻豆精品95视频| 久久国产生活片100| 日韩高清电影一区| 亚洲成人福利片| 亚洲bt欧美bt精品777| 一区二区在线免费观看| 国产精品成人网| 国产精品三级电影| 国产日产亚洲精品系列| 2021中文字幕一区亚洲| 欧美大片拔萝卜| 欧美一区二区不卡视频| 337p亚洲精品色噜噜噜| 欧美精品日韩综合在线| 欧美精品粉嫩高潮一区二区| 欧美三级韩国三级日本一级| 一本色道**综合亚洲精品蜜桃冫| av成人老司机| 91免费看片在线观看| 99久久久国产精品| 不卡的av网站| 色综合天天综合色综合av| 91美女在线观看| 日本精品一级二级| 欧美色综合久久| 制服丝袜日韩国产| 日韩欧美一级在线播放| 久久综合久久久久88| 国产精品亲子伦对白| 国产精品久久久久桃色tv| 国产精品久久久久四虎| 一区二区三区中文字幕| 亚洲成av人在线观看| 蜜臀久久99精品久久久画质超高清 | 亚洲日本在线a| 亚洲一卡二卡三卡四卡无卡久久| 一区二区三区成人| 日本伊人色综合网| 狠狠色狠狠色合久久伊人| 国产大片一区二区| 93久久精品日日躁夜夜躁欧美| 欧美亚洲另类激情小说| 欧美一级理论片| 欧美国产乱子伦| 一区二区三区在线播| 日韩不卡在线观看日韩不卡视频| 久久国产三级精品| 不卡一二三区首页| 欧美人伦禁忌dvd放荡欲情| 日韩欧美一区二区不卡| 中文字幕一区二区三区av| 亚洲综合色噜噜狠狠| 久久精品国产99国产| 成人ar影院免费观看视频| 欧美亚洲国产一区二区三区| 日韩免费观看高清完整版 | 国内不卡的二区三区中文字幕| 国产成人av电影在线| 欧美亚洲动漫制服丝袜| 精品欧美黑人一区二区三区| 亚洲欧洲色图综合| 热久久国产精品| 9色porny自拍视频一区二区| 欧美狂野另类xxxxoooo| 国产精品网友自拍| 美女在线视频一区| 色综合久久综合网欧美综合网| 欧美一区二区三区男人的天堂| 中文字幕乱码日本亚洲一区二区| 亚洲成人动漫一区| 国产91丝袜在线播放九色| 2021中文字幕一区亚洲| 久久国产精品免费| 久久久久久久久久久久久女国产乱| 久草在线在线精品观看| 91精品91久久久中77777| 国产精品系列在线| 亚洲欧洲av色图| 在线免费观看日韩欧美| 青青草原综合久久大伊人精品优势 | 色婷婷av一区| 天堂在线亚洲视频| 精品国产乱码久久| 国产在线看一区| 久久新电视剧免费观看| 狠狠色丁香久久婷婷综合_中| 国产午夜久久久久| 精品一区二区三区免费视频| 在线观看国产一区二区| 国产欧美日韩精品一区| 91浏览器打开| 亚洲一区国产视频| 欧美精选在线播放| 99视频在线精品| ...xxx性欧美| 99久久国产免费看| 国产麻豆视频一区二区| 国产精品成人网| 亚洲精品在线观看视频| 91看片淫黄大片一级在线观看| 久久99这里只有精品| 午夜精品一区在线观看| 一区二区在线观看免费| 亚洲国产精品精华液2区45| 精品污污网站免费看| 欧美日韩一级片网站| 欧美日韩国产综合一区二区三区| 91在线看国产| 91福利精品视频| 色哟哟欧美精品| 色综合一区二区| 在线免费精品视频| 91视频com| 色综合亚洲欧洲| 欧美三级韩国三级日本一级| 欧美日韩精品欧美日韩精品 | 日韩欧美亚洲一区二区| 欧美日韩1234| 欧美一区二区三区小说| 欧美日韩精品免费观看视频 | 亚洲国产日韩a在线播放| 亚洲午夜久久久久久久久电影网| 国产精品久久久久影院| 国产亚洲一区二区三区| 亚洲欧洲无码一区二区三区| 亚洲成人av福利| 国产精品一级片| 91福利区一区二区三区| 久久久国产精品午夜一区ai换脸| 国产精品网站在线| 亚洲午夜视频在线观看| 狠狠色丁香婷综合久久| eeuss鲁片一区二区三区在线观看| 欧美系列一区二区| 91亚洲精品乱码久久久久久蜜桃| 国产精品99久久久久久有的能看| 在线免费观看不卡av| 国产欧美日韩久久| 国产精品一区二区久久精品爱涩 | 日韩一区二区三区电影在线观看| 久久久综合视频|