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

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

?? a2dp.c

?? 基于LINUX內核驅動的開發
?? C
?? 第 1 頁 / 共 3 頁
字號:
/* * *  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 <stdlib.h>#include <errno.h>#include <dbus/dbus.h>#include <glib.h>#include <bluetooth/bluetooth.h>#include <bluetooth/sdp.h>#include <bluetooth/sdp_lib.h>#include "logging.h"#include "device.h"#include "manager.h"#include "avdtp.h"#include "sink.h"#include "a2dp.h"/* The duration that streams without users are allowed to stay in * STREAMING state. */#define SUSPEND_TIMEOUT 5000#define RECONFIGURE_TIMEOUT 500#ifndef MIN# define MIN(x, y) ((x) < (y) ? (x) : (y))#endif#ifndef MAX# define MAX(x, y) ((x) > (y) ? (x) : (y))#endifstruct a2dp_sep {	uint8_t type;	uint8_t codec;	struct avdtp_local_sep *sep;	struct avdtp *session;	struct avdtp_stream *stream;	guint suspend_timer;	gboolean locked;	gboolean suspending;	gboolean starting;};struct a2dp_setup_cb {	a2dp_config_cb_t config_cb;	a2dp_stream_cb_t resume_cb;	a2dp_stream_cb_t suspend_cb;	void *user_data;	int id;};struct a2dp_setup {	struct avdtp *session;	struct a2dp_sep *sep;	struct avdtp_stream *stream;	struct avdtp_error *err;	GSList *client_caps;	gboolean reconfigure;	gboolean canceled;	gboolean start;	GSList *cb;	int ref;};static DBusConnection *connection = NULL;static GSList *sinks = NULL;static GSList *sources = NULL;static uint32_t source_record_id = 0;static uint32_t sink_record_id = 0;static GSList *setups = NULL;static unsigned int cb_id = 0;static struct a2dp_setup *setup_ref(struct a2dp_setup *setup){	setup->ref++;	debug("setup_ref(%p): ref=%d", setup, setup->ref);	return setup;}static void setup_free(struct a2dp_setup *s){	debug("setup_free(%p)", s);	setups = g_slist_remove(setups, s);	if (s->session)		avdtp_unref(s->session);	g_slist_foreach(s->cb, (GFunc) g_free, NULL);	g_slist_free(s->cb);	g_free(s);}static void setup_unref(struct a2dp_setup *setup){	setup->ref--;	debug("setup_unref(%p): ref=%d", setup, setup->ref);	if (setup->ref <= 0)		setup_free(setup);}static struct device *a2dp_get_dev(struct avdtp *session){	bdaddr_t addr;	avdtp_get_peers(session, NULL, &addr);	return manager_device_connected(&addr, A2DP_SOURCE_UUID);}static gboolean finalize_config(struct a2dp_setup *s){	GSList *l;	setup_ref(s);	for (l = s->cb; l != NULL; l = l->next) {		struct a2dp_setup_cb *cb = l->data;		if (cb->config_cb) {			cb->config_cb(s->session, s->sep, s->stream, s->err,					cb->user_data);			cb->config_cb = NULL;			setup_unref(s);		}	}	setup_unref(s);	return FALSE;}static gboolean finalize_config_errno(struct a2dp_setup *s, int err){	struct avdtp_error avdtp_err;	avdtp_error_init(&avdtp_err, AVDTP_ERROR_ERRNO, -err);	s->err = err ? &avdtp_err : NULL;	return finalize_config(s);}static gboolean finalize_resume(struct a2dp_setup *s){	GSList *l;	setup_ref(s);	for (l = s->cb; l != NULL; l = l->next) {		struct a2dp_setup_cb *cb = l->data;		if (cb->resume_cb) {			cb->resume_cb(s->session, s->err, cb->user_data);			cb->resume_cb = NULL;			setup_unref(s);		}	}	setup_unref(s);	return FALSE;}static gboolean finalize_resume_errno(struct a2dp_setup *s, int err){	struct avdtp_error avdtp_err;	avdtp_error_init(&avdtp_err, AVDTP_ERROR_ERRNO, -err);	s->err = err ? &avdtp_err : NULL;	return finalize_resume(s);}static gboolean finalize_suspend(struct a2dp_setup *s){	GSList *l;	setup_ref(s);	for (l = s->cb; l != NULL; l = l->next) {		struct a2dp_setup_cb *cb = l->data;		if (cb->suspend_cb) {			cb->suspend_cb(s->session, s->err, cb->user_data);			cb->suspend_cb = NULL;			setup_unref(s);		}	}	setup_unref(s);	return FALSE;}static gboolean finalize_suspend_errno(struct a2dp_setup *s, int err){	struct avdtp_error avdtp_err;	avdtp_error_init(&avdtp_err, AVDTP_ERROR_ERRNO, -err);	s->err = err ? &avdtp_err : NULL;	return finalize_suspend(s);}static struct a2dp_setup *find_setup_by_session(struct avdtp *session){	GSList *l;	for (l = setups; l != NULL; l = l->next) {		struct a2dp_setup *setup = l->data;		if (setup->session == session)			return setup;	}	return NULL;}static struct a2dp_setup *find_setup_by_dev(struct device *dev){	GSList *l;	for (l = setups; l != NULL; l = l->next) {		struct a2dp_setup *setup = l->data;		struct device *setup_dev = a2dp_get_dev(setup->session);		if (setup_dev == dev)			return setup;	}	return NULL;}static void stream_state_changed(struct avdtp_stream *stream,					avdtp_state_t old_state,					avdtp_state_t new_state,					struct avdtp_error *err,					void *user_data){	struct a2dp_sep *sep = user_data;	if (new_state != AVDTP_STATE_IDLE)		return;	if (sep->suspend_timer) {		g_source_remove(sep->suspend_timer);		sep->suspend_timer = 0;	}	if (sep->session) {		avdtp_unref(sep->session);		sep->session = NULL;	}	sep->stream = NULL;}static gboolean sbc_setconf_ind(struct avdtp *session,				struct avdtp_local_sep *sep,				struct avdtp_stream *stream,				GSList *caps, uint8_t *err,				uint8_t *category, void *user_data){	struct a2dp_sep *a2dp_sep = user_data;	struct device *dev;	struct avdtp_service_capability *cap;	struct avdtp_media_codec_capability *codec_cap;	struct sbc_codec_cap *sbc_cap;	if (a2dp_sep->type == AVDTP_SEP_TYPE_SINK)		debug("Sink %p: Set_Configuration_Ind", sep);	else		debug("Source %p: Set_Configuration_Ind", sep);	dev = a2dp_get_dev(session);	if (!dev) {		*err = AVDTP_UNSUPPORTED_CONFIGURATION;		*category = 0x00;		return FALSE;	}	/* Check bipool range */	for (codec_cap = NULL; caps; caps = g_slist_next(caps)) {		cap = caps->data;		if (cap->category == AVDTP_MEDIA_CODEC) {			codec_cap = (void *) cap->data;			if (codec_cap->media_codec_type == A2DP_CODEC_SBC) {				sbc_cap = (void *) codec_cap;				if (sbc_cap->min_bitpool < MIN_BITPOOL ||					sbc_cap->max_bitpool > MAX_BITPOOL) {					*err = AVDTP_UNSUPPORTED_CONFIGURATION;					*category = AVDTP_MEDIA_CODEC;					return FALSE;				}			}			break;		}	}	avdtp_stream_add_cb(session, stream, stream_state_changed, a2dp_sep);	a2dp_sep->stream = stream;	if (a2dp_sep->type == AVDTP_SEP_TYPE_SOURCE)		sink_new_stream(dev, session, stream);	return TRUE;}static gboolean sbc_getcap_ind(struct avdtp *session, struct avdtp_local_sep *sep,				GSList **caps, uint8_t *err, void *user_data){	struct a2dp_sep *a2dp_sep = user_data;	struct avdtp_service_capability *media_transport, *media_codec;	struct sbc_codec_cap sbc_cap;	if (a2dp_sep->type == AVDTP_SEP_TYPE_SINK)		debug("Sink %p: Get_Capability_Ind", sep);	else		debug("Source %p: Get_Capability_Ind", sep);	*caps = NULL;	media_transport = avdtp_service_cap_new(AVDTP_MEDIA_TRANSPORT,						NULL, 0);	*caps = g_slist_append(*caps, media_transport);	memset(&sbc_cap, 0, sizeof(struct sbc_codec_cap));	sbc_cap.cap.media_type = AVDTP_MEDIA_TYPE_AUDIO;	sbc_cap.cap.media_codec_type = A2DP_CODEC_SBC;	sbc_cap.frequency = ( SBC_SAMPLING_FREQ_48000 |				SBC_SAMPLING_FREQ_44100 |				SBC_SAMPLING_FREQ_32000 |				SBC_SAMPLING_FREQ_16000 );	sbc_cap.channel_mode = ( SBC_CHANNEL_MODE_JOINT_STEREO |					SBC_CHANNEL_MODE_STEREO |					SBC_CHANNEL_MODE_DUAL_CHANNEL |					SBC_CHANNEL_MODE_MONO );	sbc_cap.block_length = ( SBC_BLOCK_LENGTH_16 |					SBC_BLOCK_LENGTH_12 |					SBC_BLOCK_LENGTH_8 |					SBC_BLOCK_LENGTH_4 );	sbc_cap.subbands = ( SBC_SUBBANDS_8 | SBC_SUBBANDS_4 );	sbc_cap.allocation_method = ( SBC_ALLOCATION_LOUDNESS |					SBC_ALLOCATION_SNR );	sbc_cap.min_bitpool = MIN_BITPOOL;	sbc_cap.max_bitpool = MAX_BITPOOL;	media_codec = avdtp_service_cap_new(AVDTP_MEDIA_CODEC, &sbc_cap,						sizeof(sbc_cap));	*caps = g_slist_append(*caps, media_codec);	return TRUE;}static gboolean mpeg_setconf_ind(struct avdtp *session,				struct avdtp_local_sep *sep,				struct avdtp_stream *stream,				GSList *caps, uint8_t *err,				uint8_t *category, void *user_data){	struct a2dp_sep *a2dp_sep = user_data;	struct device *dev;	if (a2dp_sep->type == AVDTP_SEP_TYPE_SINK)		debug("Sink %p: Set_Configuration_Ind", sep);	else		debug("Source %p: Set_Configuration_Ind", sep);	dev = a2dp_get_dev(session);	if (!dev) {		*err = AVDTP_UNSUPPORTED_CONFIGURATION;		*category = 0x00;		return FALSE;	}	avdtp_stream_add_cb(session, stream, stream_state_changed, a2dp_sep);	a2dp_sep->stream = stream;	if (a2dp_sep->type == AVDTP_SEP_TYPE_SOURCE)		sink_new_stream(dev, session, stream);	return TRUE;}static gboolean mpeg_getcap_ind(struct avdtp *session,				struct avdtp_local_sep *sep,				GSList **caps, uint8_t *err, void *user_data){	struct a2dp_sep *a2dp_sep = user_data;	struct avdtp_service_capability *media_transport, *media_codec;	struct mpeg_codec_cap mpeg_cap;	if (a2dp_sep->type == AVDTP_SEP_TYPE_SINK)		debug("Sink %p: Get_Capability_Ind", sep);	else		debug("Source %p: Get_Capability_Ind", sep);	*caps = NULL;	media_transport = avdtp_service_cap_new(AVDTP_MEDIA_TRANSPORT,						NULL, 0);	*caps = g_slist_append(*caps, media_transport);	memset(&mpeg_cap, 0, sizeof(struct mpeg_codec_cap));	mpeg_cap.cap.media_type = AVDTP_MEDIA_TYPE_AUDIO;	mpeg_cap.cap.media_codec_type = A2DP_CODEC_MPEG12;	mpeg_cap.frequency = ( MPEG_SAMPLING_FREQ_48000 |				MPEG_SAMPLING_FREQ_44100 |				MPEG_SAMPLING_FREQ_32000 |				MPEG_SAMPLING_FREQ_24000 |				MPEG_SAMPLING_FREQ_22050 |				MPEG_SAMPLING_FREQ_16000 );	mpeg_cap.channel_mode = ( MPEG_CHANNEL_MODE_JOINT_STEREO |					MPEG_CHANNEL_MODE_STEREO |					MPEG_CHANNEL_MODE_DUAL_CHANNEL |					MPEG_CHANNEL_MODE_MONO );	mpeg_cap.layer = ( MPEG_LAYER_MP3 | MPEG_LAYER_MP2 | MPEG_LAYER_MP1 );	mpeg_cap.bitrate = 0xFFFF;	media_codec = avdtp_service_cap_new(AVDTP_MEDIA_CODEC, &mpeg_cap,						sizeof(mpeg_cap));	*caps = g_slist_append(*caps, media_codec);	return TRUE;}static void setconf_cfm(struct avdtp *session, struct avdtp_local_sep *sep,				struct avdtp_stream *stream,				struct avdtp_error *err, void *user_data){	struct a2dp_sep *a2dp_sep = user_data;	struct a2dp_setup *setup;	struct device *dev;	int ret;	if (a2dp_sep->type == AVDTP_SEP_TYPE_SINK)		debug("Sink %p: Set_Configuration_Cfm", sep);	else		debug("Source %p: Set_Configuration_Cfm", sep);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产亚洲精品7777| 久久se精品一区二区| 欧美三级在线看| 一区av在线播放| 欧美猛男gaygay网站| 麻豆国产精品官网| 国产欧美日韩另类一区| 91丝袜高跟美女视频| 亚洲国产一二三| 日韩一区二区免费视频| 国产精品18久久久久| 成人欧美一区二区三区黑人麻豆| 日本高清视频一区二区| 日本不卡一二三| 国产拍欧美日韩视频二区| 一本大道av伊人久久综合| 视频在线观看91| 欧美精品一区二区三区高清aⅴ| 国产99久久久国产精品免费看| 亚洲男人天堂av网| 日韩一区二区三区免费观看| 丰满白嫩尤物一区二区| 亚洲一区二区偷拍精品| 日韩精品专区在线影院重磅| 成人a免费在线看| 天天影视色香欲综合网老头| 久久精子c满五个校花| 91久久国产最好的精华液| 久久爱www久久做| 亚洲视频免费在线观看| 日韩视频不卡中文| av毛片久久久久**hd| 婷婷中文字幕综合| 中文一区二区在线观看| 欧美日韩一级片在线观看| 国产精品一区二区在线观看网站| 亚洲天堂福利av| 日韩一区二区精品| 99国产精品99久久久久久| 免费观看成人av| 亚洲婷婷综合久久一本伊一区| 欧美一级精品在线| 99精品国产热久久91蜜凸| 久久国产精品72免费观看| 成人免费视频在线观看| 日韩三级免费观看| 色综合久久久久综合| 国产在线不卡一卡二卡三卡四卡| 一区二区三区 在线观看视频| 精品国产在天天线2019| 欧美性感一区二区三区| 国产成人超碰人人澡人人澡| 午夜一区二区三区在线观看| 中文字幕欧美激情一区| 欧美一区在线视频| 91麻豆产精品久久久久久| 国产精品资源站在线| 天涯成人国产亚洲精品一区av| 国产精品久久久久一区二区三区共| 日韩欧美亚洲国产精品字幕久久久 | 国产精品久久久久久亚洲毛片| 制服丝袜一区二区三区| 色婷婷av一区二区三区gif | 色综合久久综合网97色综合| 韩国女主播一区| 三级亚洲高清视频| 一区二区三区资源| 中文字幕va一区二区三区| 精品人伦一区二区色婷婷| 欧美日韩亚洲不卡| 91在线观看下载| 国产成人午夜片在线观看高清观看| 日韩成人午夜精品| 一区二区三区资源| 成人欧美一区二区三区白人| 国产午夜久久久久| 精品免费日韩av| 这里只有精品电影| 欧美色男人天堂| 色婷婷激情综合| eeuss鲁片一区二区三区在线看| 国产在线乱码一区二区三区| 天天综合网 天天综合色| 亚洲午夜一二三区视频| 亚洲激情网站免费观看| 亚洲欧洲另类国产综合| 国产欧美精品一区二区色综合朱莉| 日韩欧美不卡一区| 51精品视频一区二区三区| 欧美日韩激情在线| 欧美性三三影院| 色8久久人人97超碰香蕉987| 99热在这里有精品免费| av在线不卡电影| av激情亚洲男人天堂| 不卡一区二区中文字幕| 成人的网站免费观看| 成人国产精品免费| 成人精品小蝌蚪| 成人av在线观| 成+人+亚洲+综合天堂| www.性欧美| 成人av在线一区二区| heyzo一本久久综合| 99国产精品久久久| 99国产精品国产精品久久| 99国产精品久久久久久久久久| 成人午夜激情在线| bt7086福利一区国产| 色综合久久综合网| 在线免费观看日本一区| 欧美性大战久久久久久久| 欧美日韩一区二区三区不卡| 欧美精品久久天天躁| 日韩一区二区三区在线| 精品sm在线观看| 久久久久国产一区二区三区四区| 久久精品欧美日韩| 国产日韩欧美高清在线| 欧美日韩国产高清一区二区三区| 国产在线视频不卡二| 高清国产一区二区| 99精品欧美一区二区蜜桃免费| 色婷婷久久久久swag精品| 欧美丝袜自拍制服另类| 欧美一区二区视频在线观看| 精品日韩一区二区三区免费视频| 久久色在线观看| 中文字幕中文乱码欧美一区二区| 亚洲免费在线观看| 日韩专区在线视频| 精品一区二区三区在线播放视频| 国产成人av一区二区三区在线观看| 成人黄页毛片网站| 欧洲一区二区av| 日韩一区二区精品| 亚洲国产成人午夜在线一区| 亚洲美女偷拍久久| 五月婷婷激情综合| 国产乱码精品一区二区三区忘忧草 | 日韩制服丝袜av| 蜜臀精品久久久久久蜜臀| 国产一区二区三区日韩| 国产suv精品一区二区6| 99亚偷拍自图区亚洲| 欧美日韩免费观看一区二区三区| 日韩欧美在线123| 国产精品色噜噜| 亚洲一区二区三区四区在线观看 | 午夜av一区二区三区| 激情都市一区二区| 99久久精品国产一区| 欧美日韩第一区日日骚| 国产亚洲女人久久久久毛片| 伊人开心综合网| 精品亚洲aⅴ乱码一区二区三区| 成人激情综合网站| 欧美精品aⅴ在线视频| 久久久噜噜噜久久人人看| 一区二区三区四区av| 精品在线播放免费| 色88888久久久久久影院按摩| 精品美女一区二区| 亚洲激情在线激情| 国精产品一区一区三区mba桃花| 91一区一区三区| 日韩欧美你懂的| 亚洲人成在线观看一区二区| 久久不见久久见免费视频7| 一本一道综合狠狠老| 精品美女在线播放| 亚洲精品乱码久久久久久| 国产制服丝袜一区| 欧美日韩一区三区四区| 国产人妖乱国产精品人妖| 亚洲成人激情av| www.欧美.com| 精品国产制服丝袜高跟| 亚洲一卡二卡三卡四卡五卡| 国产成人精品网址| 538prom精品视频线放| 亚洲伦理在线免费看| 国产精品99久久久| 欧美日本在线观看| 最新国产成人在线观看| 精品一区二区三区免费毛片爱| 欧洲精品在线观看| 中文字幕在线不卡一区二区三区| 美女视频黄 久久| 欧美视频一区二区三区在线观看 | 亚洲女爱视频在线| 国产高清成人在线| 日韩三级视频中文字幕| 亚洲一区欧美一区| 波多野结衣中文字幕一区二区三区| 日韩欧美一区中文| 五月婷婷色综合| 在线观看不卡一区| 中文字幕一区二区三区在线播放| 韩国v欧美v日本v亚洲v|