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

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

?? headset.c

?? 基于LINUX內核驅動的開發
?? C
?? 第 1 頁 / 共 4 頁
字號:
/* * *  BlueZ - Bluetooth protocol stack for Linux * *  Copyright (C) 2006-2007  Nokia Corporation *  Copyright (C) 2004-2008  Marcel Holtmann <marcel@holtmann.org> * * *  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., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA * */#ifdef HAVE_CONFIG_H#include <config.h>#endif#include <stdio.h>#include <errno.h>#include <fcntl.h>#include <unistd.h>#include <stdlib.h>#include <stdarg.h>#include <signal.h>#include <string.h>#include <getopt.h>#include <sys/ioctl.h>#include <sys/socket.h>#include <bluetooth/bluetooth.h>#include <bluetooth/hci.h>#include <bluetooth/hci_lib.h>#include <bluetooth/sco.h>#include <bluetooth/rfcomm.h>#include <bluetooth/sdp.h>#include <bluetooth/sdp_lib.h>#include <glib.h>#include <dbus/dbus.h>#include "dbus.h"#include "dbus-helper.h"#include "logging.h"#include "device.h"#include "manager.h"#include "error.h"#include "headset.h"#define RING_INTERVAL 3000#define BUF_SIZE 1024#define HEADSET_GAIN_SPEAKER 'S'#define HEADSET_GAIN_MICROPHONE 'M'#define AG_FEATURE_THREE_WAY_CALLING             0x0001#define AG_FEATURE_EC_ANDOR_NR                   0x0002#define AG_FEATURE_VOICE_RECOGNITION             0x0004#define AG_FEATURE_INBAND_RINGTONE               0x0008#define AG_FEATURE_ATTACH_NUMBER_TO_VOICETAG     0x0010#define AG_FEATURE_REJECT_A_CALL                 0x0020#define AG_FEATURE_ENHANCES_CALL_STATUS          0x0040#define AG_FEATURE_ENHANCES_CALL_CONTROL         0x0080#define AG_FEATURE_EXTENDED_ERROR_RESULT_CODES   0x0100static uint32_t ag_features = 0;static gboolean sco_hci = TRUE;static char *str_state[] = {	"HEADSET_STATE_DISCONNECTED",	"HEADSET_STATE_CONNECT_IN_PROGRESS",	"HEADSET_STATE_CONNECTED",	"HEADSET_STATE_PLAY_IN_PROGRESS",	"HEADSET_STATE_PLAYING",};struct connect_cb {	unsigned int id;	headset_stream_cb_t cb;	void *cb_data;};struct pending_connect {	DBusMessage *msg;	DBusPendingCall *call;	GIOChannel *io;	int err;	headset_state_t target_state;	GSList *callbacks;};struct headset {	uint32_t hsp_handle;	uint32_t hfp_handle;	int rfcomm_ch;	GIOChannel *rfcomm;	GIOChannel *tmp_rfcomm;	GIOChannel *sco;	guint sco_id;	gboolean auto_dc;	guint ring_timer;	char buf[BUF_SIZE];	int data_start;	int data_length;	gboolean hfp_active;	gboolean search_hfp;	gboolean cli_active;	char *ph_number;	int type;	headset_state_t state;	struct pending_connect *pending;	int sp_gain;	int mic_gain;	unsigned int hfp_features;	headset_lock_t lock;};struct event {	const char *cmd;	int (*callback) (struct device *device, const char *buf);};static int rfcomm_connect(struct device *device, headset_stream_cb_t cb,				void *user_data, unsigned int *cb_id);static int get_handles(struct device *device, headset_stream_cb_t cb,			void *user_data, unsigned int *cb_id);static int headset_send(struct headset *hs, char *format, ...){	char rsp[BUF_SIZE];	va_list ap;	ssize_t total_written, written, count;	int fd;	va_start(ap, format);	count = vsnprintf(rsp, sizeof(rsp), format, ap);	va_end(ap);	if (count < 0)		return -EINVAL;	if (!hs->rfcomm) {		error("headset_send: the headset is not connected");		return -EIO;	}	written = total_written = 0;	fd = g_io_channel_unix_get_fd(hs->rfcomm);	while (total_written < count) {		written = write(fd, rsp + total_written, count - total_written);		if (written < 0)			return -errno;		total_written += written;	}	return 0;}static int supported_features(struct device *device, const char *buf){	struct headset *hs = device->headset;	int err;	if (strlen(buf) < 9)		return -EINVAL;	hs->hfp_features = strtoul(&buf[8], NULL, 10);	err = headset_send(hs, "\r\n+BRSF=%u\r\n", ag_features);	if (err < 0)		return err;	return headset_send(hs, "\r\nOK\r\n");}static int report_indicators(struct device *device, const char *buf){	struct headset *hs = device->headset;	int err;	if (buf[7] == '=')		err = headset_send(hs, "\r\n+CIND:(\"service\",(0,1)),"				"(\"call\",(0,1)),(\"callsetup\",(0-3))\r\n");	else		err = headset_send(hs, "\r\n+CIND:1,0,0\r\n");	if (err < 0)		return err;	return headset_send(hs, "\r\nOK\r\n");}static void pending_connect_complete(struct connect_cb *cb, struct device *dev){	struct headset *hs = dev->headset;	if (hs->pending->err)		cb->cb(NULL, cb->cb_data);	else		cb->cb(dev, cb->cb_data);}static void pending_connect_finalize(struct device *dev){	struct headset *hs = dev->headset;	struct pending_connect *p = hs->pending;	g_slist_foreach(p->callbacks, (GFunc) pending_connect_complete, dev);	g_slist_foreach(p->callbacks, (GFunc) g_free, NULL);	g_slist_free(p->callbacks);	if (p->io) {		g_io_channel_close(p->io);		g_io_channel_unref(p->io);	}	if (p->msg)		dbus_message_unref(p->msg);	if (p->call) {		dbus_pending_call_cancel(p->call);		dbus_pending_call_unref(p->call);	}	g_free(p);	hs->pending = NULL;}static void pending_connect_init(struct headset *hs, headset_state_t target_state){	if (hs->pending) {		if (hs->pending->target_state < target_state)			hs->pending->target_state = target_state;		return;	}	hs->pending = g_new0(struct pending_connect, 1);	hs->pending->target_state = target_state;}static unsigned int connect_cb_new(struct headset *hs,					headset_state_t target_state,					headset_stream_cb_t func,					void *user_data){	struct connect_cb *cb;	unsigned int free_cb_id = 1;	pending_connect_init(hs, target_state);	cb = g_new(struct connect_cb, 1);	cb->cb = func;	cb->cb_data = user_data;	cb->id = free_cb_id++;	hs->pending->callbacks = g_slist_append(hs->pending->callbacks,						cb);	return cb->id;}static gboolean sco_connect_cb(GIOChannel *chan, GIOCondition cond,				struct device *device){	struct headset *hs;	int ret, sk;	socklen_t len;	struct pending_connect *p;	if (cond & G_IO_NVAL)		return FALSE;	hs = device->headset;	p = hs->pending;	sk = g_io_channel_unix_get_fd(chan);	len = sizeof(ret);	if (getsockopt(sk, SOL_SOCKET, SO_ERROR, &ret, &len) < 0) {		p->err = errno;		error("getsockopt(SO_ERROR): %s (%d)", strerror(p->err),				p->err);		goto failed;	}	if (ret != 0) {		p->err = ret;		error("connect(): %s (%d)", strerror(ret), ret);		goto failed;	}	debug("SCO socket opened for headset %s", device->path);	info("SCO fd=%d", sk);	hs->sco = chan;	p->io = NULL;	pending_connect_finalize(device);	fcntl(sk, F_SETFL, 0);	headset_set_state(device, HEADSET_STATE_PLAYING);	return FALSE;failed:	pending_connect_finalize(device);	if (hs->rfcomm)		headset_set_state(device, HEADSET_STATE_CONNECTED);	else		headset_set_state(device, HEADSET_STATE_DISCONNECTED);	return FALSE;}static int sco_connect(struct device *dev, headset_stream_cb_t cb,			void *user_data, unsigned int *cb_id){	struct headset *hs = dev->headset;	struct sockaddr_sco addr;	GIOChannel *io;	int sk, err;	if (hs->state != HEADSET_STATE_CONNECTED)		return -EINVAL;	sk = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_SCO);	if (sk < 0) {		err = errno;		error("socket(BTPROTO_SCO): %s (%d)", strerror(err), err);		return -err;	}	io = g_io_channel_unix_new(sk);	if (!io) {		close(sk);		return -ENOMEM;	}	memset(&addr, 0, sizeof(addr));	addr.sco_family = AF_BLUETOOTH;	bacpy(&addr.sco_bdaddr, BDADDR_ANY);	if (bind(sk, (struct sockaddr *)&addr, sizeof(addr)) < 0) {		err = errno;		error("socket(BTPROTO_SCO): %s (%d)", strerror(err), err);		goto failed;	}	if (set_nonblocking(sk) < 0) {		err = errno;		goto failed;	}	memset(&addr, 0, sizeof(addr));	addr.sco_family = AF_BLUETOOTH;	bacpy(&addr.sco_bdaddr, &dev->dst);	err = connect(sk, (struct sockaddr *) &addr, sizeof(addr));	if (err < 0 && !(errno == EAGAIN || errno == EINPROGRESS)) {		err = errno;		error("connect: %s (%d)", strerror(errno), errno);		goto failed;	}	headset_set_state(dev, HEADSET_STATE_PLAY_IN_PROGRESS);	pending_connect_init(hs, HEADSET_STATE_PLAYING);	if (cb) {		unsigned int id = connect_cb_new(hs, HEADSET_STATE_PLAYING,							cb, user_data);		if (cb_id)			*cb_id = id;	}	g_io_add_watch(io, G_IO_OUT | G_IO_NVAL | G_IO_ERR | G_IO_HUP,			(GIOFunc) sco_connect_cb, dev);	hs->pending->io = io;	return 0;failed:	g_io_channel_close(io);	g_io_channel_unref(io);	return -err;}static void hfp_slc_complete(struct device *dev){	struct headset *hs = dev->headset;	struct pending_connect *p = hs->pending;	debug("HFP Service Level Connection established");	headset_set_state(dev, HEADSET_STATE_CONNECTED);	if (p == NULL)		return;	if (p->msg) {		DBusMessage *reply = dbus_message_new_method_return(p->msg);		send_message_and_unref(dev->conn, reply);	}	if (p->target_state == HEADSET_STATE_CONNECTED) {		pending_connect_finalize(dev);		return;	}	p->err = sco_connect(dev, NULL, NULL, NULL);	if (p->err < 0)		pending_connect_finalize(dev);}static int event_reporting(struct device *dev, const char *buf){	struct headset *hs = dev->headset;	int ret;	ret = headset_send(hs, "\r\nOK\r\n");	if (ret < 0)		return ret;	if (hs->state != HEADSET_STATE_CONNECT_IN_PROGRESS)		return 0;	if (ag_features & AG_FEATURE_THREE_WAY_CALLING)		return 0;	hfp_slc_complete(dev);	return 0;}static int call_hold(struct device *dev, const char *buf){	struct headset *hs = dev->headset;	int err;	err = headset_send(hs, "\r\n+CHLD:(0,1,1x,2,2x,3,4)\r\n");	if (err < 0)		return err;	err = headset_send(hs, "\r\nOK\r\n");	if (err < 0)		return err;	if (hs->state != HEADSET_STATE_CONNECT_IN_PROGRESS)		return 0;	hfp_slc_complete(dev);	return 0;}static int answer_call(struct device *device, const char *buf){	struct headset *hs = device->headset;	int err;	dbus_connection_emit_signal(device->conn, device->path,			AUDIO_HEADSET_INTERFACE, "AnswerRequested",			DBUS_TYPE_INVALID);	if (hs->ring_timer) {		g_source_remove(hs->ring_timer);		hs->ring_timer = 0;	}	if (!hs->hfp_active)		return headset_send(hs, "\r\nOK\r\n");	if (hs->ph_number) {		g_free(hs->ph_number);		hs->ph_number = NULL;	}	err = headset_send(hs, "\r\nOK\r\n");	if (err < 0)		return err;	/*+CIEV: (call = 1)*/	err = headset_send(hs, "\r\n+CIEV:2,1\r\n");	if (err < 0)		return err;	/*+CIEV: (callsetup = 0)*/	return headset_send(hs, "\r\n+CIEV:3,0\r\n");}static int terminate_call(struct device *device, const char *buf){	struct headset *hs = device->headset;	int err;	dbus_connection_emit_signal(device->conn, device->path,			AUDIO_HEADSET_INTERFACE, "CallTerminated",			DBUS_TYPE_INVALID);	err = headset_send(hs, "\r\nOK\r\n");	if (err < 0)		return err;	if (hs->ph_number) {		g_free(hs->ph_number);		hs->ph_number = NULL;	}	if (hs->ring_timer) {		g_source_remove(hs->ring_timer);		hs->ring_timer = 0;		/*+CIEV: (callsetup = 0)*/		return headset_send(hs, "\r\n+CIEV:3,0\r\n");	}	/*+CIEV: (call = 0)*/	return headset_send(hs, "\r\n+CIEV:2,0\r\n");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91小视频在线观看| 国产精品1区2区3区| 在线一区二区三区四区| 亚洲欧美国产77777| 91麻豆成人久久精品二区三区| 亚洲视频在线一区观看| 色狠狠综合天天综合综合| 亚洲午夜免费福利视频| 欧美日韩精品一区二区三区| 蜜臀av一区二区在线免费观看| 久久久美女艺术照精彩视频福利播放 | 五月婷婷久久综合| 欧美一级日韩不卡播放免费| 国模大尺度一区二区三区| 国产精品麻豆99久久久久久| 一本色道a无线码一区v| 奇米色777欧美一区二区| 26uuu精品一区二区| av亚洲产国偷v产偷v自拍| 一区二区三区免费在线观看| 3atv一区二区三区| 成人综合婷婷国产精品久久免费| 一区二区在线看| 精品女同一区二区| aaa国产一区| 日韩高清电影一区| 久久精品水蜜桃av综合天堂| 91黄色在线观看| 久久国产三级精品| 亚洲欧美激情在线| 精品国产自在久精品国产| 成人av电影在线| 理论片日本一区| 一区二区三区中文免费| 欧美本精品男人aⅴ天堂| 99视频精品全部免费在线| 美国三级日本三级久久99| 国产精品国产a| 欧美一区二区视频观看视频| 成人av免费在线| 精品在线你懂的| 亚洲成人免费在线| 综合精品久久久| 久久久午夜电影| 欧美一级高清大全免费观看| 91农村精品一区二区在线| 国产精品综合二区| 日韩av在线播放中文字幕| 亚洲欧美激情小说另类| 国产午夜精品在线观看| 欧美一区二区高清| 一本一道波多野结衣一区二区 | 国产成人精品亚洲日本在线桃色| 五月激情六月综合| 亚洲综合成人在线视频| 国产精品亲子伦对白| 精品黑人一区二区三区久久| 欧美肥妇free| 精品视频一区二区三区免费| 99精品视频一区| 国产成a人亚洲| 国产精品1024| 国产在线一区观看| 久久国产人妖系列| 久久精品久久99精品久久| 午夜欧美电影在线观看| 亚洲国产综合色| 亚洲在线观看免费视频| 亚洲欧美经典视频| 亚洲精品中文在线影院| 椎名由奈av一区二区三区| 中文幕一区二区三区久久蜜桃| 久久久久久久网| 久久久亚洲欧洲日产国码αv| 日韩你懂的电影在线观看| 日韩手机在线导航| 日韩欧美黄色影院| 欧美老人xxxx18| 欧美一区二区黄| 日韩视频免费观看高清在线视频| 8x福利精品第一导航| 7777精品伊人久久久大香线蕉的 | 精品久久久久久久久久久院品网| 91精品国产色综合久久| 日韩亚洲欧美成人一区| 精品国产区一区| 久久久精品一品道一区| 国产精品视频yy9299一区| 国产精品大尺度| 亚洲嫩草精品久久| 亚洲午夜视频在线观看| 日日夜夜一区二区| 麻豆国产欧美日韩综合精品二区| 捆绑紧缚一区二区三区视频| 国产美女在线观看一区| 国产白丝网站精品污在线入口| 不卡av在线免费观看| 日本精品一区二区三区四区的功能| 91久久精品国产91性色tv| 精品视频资源站| 精品国产髙清在线看国产毛片| 国产校园另类小说区| 中文字幕字幕中文在线中不卡视频| 一区二区三区中文在线观看| 婷婷久久综合九色综合绿巨人| 美女免费视频一区二区| 国产成人在线色| 在线观看网站黄不卡| 日韩精品一区在线| 中文字幕一区三区| 青青草成人在线观看| 高清不卡在线观看av| 欧美图区在线视频| 欧美精品一区二区三区在线| 综合久久久久综合| 美女尤物国产一区| 成人app在线| 日韩一区二区电影| 亚洲欧美偷拍三级| 精品在线一区二区三区| 91福利精品视频| 久久免费的精品国产v∧| 亚洲综合图片区| 国产99久久久久| 91精品黄色片免费大全| 亚洲国产精品av| 蜜臀av一区二区在线免费观看| jlzzjlzz亚洲日本少妇| 欧美大白屁股肥臀xxxxxx| 亚洲精品老司机| 韩国在线一区二区| 欧美日韩国产系列| 亚洲视频小说图片| 国产91在线观看| 欧美高清视频www夜色资源网| 国产精品短视频| 久久99国产精品麻豆| 欧美视频在线不卡| 亚洲欧美怡红院| 国产精品18久久久久久久久| 在线播放/欧美激情| 亚洲人成网站精品片在线观看| 国内精品在线播放| 欧美一区二区精品| 午夜精品国产更新| 欧美丝袜丝交足nylons| 1024成人网色www| 懂色av一区二区夜夜嗨| 精品久久久久一区| 青青草成人在线观看| 欧美在线色视频| 亚洲图片你懂的| 不卡的av网站| 国产精品丝袜一区| 成人免费毛片高清视频| 国产午夜精品美女毛片视频| 久久爱另类一区二区小说| 91精品国产综合久久婷婷香蕉| 亚洲大型综合色站| 在线看一区二区| 一区二区三区**美女毛片| 一本一本大道香蕉久在线精品| 国产精品网站在线观看| 成人毛片视频在线观看| 欧美国产日韩精品免费观看| 国产福利一区二区| 日本一区二区三区久久久久久久久不| 麻豆精品精品国产自在97香蕉| 日韩一区二区在线观看| 美女视频网站黄色亚洲| 欧美成人三级在线| 国产一区在线精品| 久久久久成人黄色影片| 成人一区二区三区中文字幕| 国产日产欧美一区| 99在线热播精品免费| 亚洲视频精选在线| 欧美午夜免费电影| 日本大胆欧美人术艺术动态| 日韩精品最新网址| 国产一区二区成人久久免费影院| 久久嫩草精品久久久久| 成人av午夜电影| 亚洲免费资源在线播放| 欧美在线视频全部完| 日日欢夜夜爽一区| 日韩你懂的电影在线观看| 国产综合一区二区| 国产精品高潮呻吟| 欧美日韩电影在线| 精品一区二区在线观看| 中文字幕高清不卡| 欧洲一区二区三区在线| 欧美aaaaa成人免费观看视频| 久久久噜噜噜久噜久久综合| 99精品欧美一区二区三区小说| 亚洲第一主播视频| 久久伊99综合婷婷久久伊| av资源网一区| 日本中文一区二区三区|