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

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

?? ctl_bluetooth.c

?? 基于LINUX內(nèi)核驅(qū)動的開發(fā)
?? C
字號:
/* * *  BlueZ - Bluetooth protocol stack for Linux * *  Copyright (C) 2004-2008  Marcel Holtmann <marcel@holtmann.org> * * *  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 library 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., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA * */#ifdef HAVE_CONFIG_H#include <config.h>#endif#include <sys/socket.h>#include <sys/un.h>#include <alsa/asoundlib.h>#include <alsa/control_external.h>#include <bluetooth/bluetooth.h>#include "ipc.h"#ifdef ENABLE_DEBUG#define DBG(fmt, arg...)  printf("DEBUG: %s: " fmt "\n" , __FUNCTION__ , ## arg)#else#define DBG(fmt, arg...)#endif#define BLUETOOTH_MINVOL 0#define BLUETOOTH_MAXVOL 15struct bluetooth_data {	snd_ctl_ext_t ext;	int sock;};enum {	BLUETOOTH_PLAYBACK,	BLUETOOTH_CAPTURE,};static const char *vol_devices[2] = {	[BLUETOOTH_PLAYBACK]	= "Playback volume",	[BLUETOOTH_CAPTURE]	= "Capture volume",};static void bluetooth_exit(struct bluetooth_data *data){	if (data == NULL)		return;	if (data->sock >= 0)		bt_audio_service_close(data->sock);	free(data);}static void bluetooth_close(snd_ctl_ext_t *ext){	struct bluetooth_data *data = ext->private_data;	DBG("ext %p", ext);	bluetooth_exit(data);}static int bluetooth_elem_count(snd_ctl_ext_t *ext){	DBG("ext %p", ext);	return 2;}static int bluetooth_elem_list(snd_ctl_ext_t *ext,				unsigned int offset, snd_ctl_elem_id_t *id){	DBG("ext %p offset %d id %p", ext, offset, id);	snd_ctl_elem_id_set_interface(id, SND_CTL_ELEM_IFACE_MIXER);	if (offset > 1)		return -EINVAL;	snd_ctl_elem_id_set_name(id, vol_devices[offset]);	return 0;}static snd_ctl_ext_key_t bluetooth_find_elem(snd_ctl_ext_t *ext,						const snd_ctl_elem_id_t *id){	const char *name = snd_ctl_elem_id_get_name(id);	int i;	DBG("ext %p id %p name '%s'", ext, id, name);	for (i = 0; i < 2; i++)		if (strcmp(name, vol_devices[i]) == 0)			return i;	return SND_CTL_EXT_KEY_NOT_FOUND;}static int bluetooth_get_attribute(snd_ctl_ext_t *ext, snd_ctl_ext_key_t key,			int *type, unsigned int *acc, unsigned int *count){	DBG("ext %p key %ld", ext, key);	*type  = SND_CTL_ELEM_TYPE_INTEGER;	*acc   = SND_CTL_EXT_ACCESS_READWRITE;	*count = 1;	return 0;}static int bluetooth_get_integer_info(snd_ctl_ext_t *ext, snd_ctl_ext_key_t key,					long *imin, long *imax, long *istep){	DBG("ext %p key %ld", ext, key);	*istep = 1;	*imin  = BLUETOOTH_MINVOL;	*imax  = BLUETOOTH_MAXVOL;	return 0;}static int bluetooth_send_ctl(struct bluetooth_data *data,			uint8_t mode, uint8_t key, struct bt_control_rsp *ctl_rsp){	int ret;	struct bt_control_req *ctl_req = (void *) ctl_rsp;	const char *type;	memset(ctl_req, 0, BT_AUDIO_IPC_PACKET_SIZE);	ctl_req->h.msg_type = BT_CONTROL_REQ;	ctl_req->mode = mode;	ctl_req->key = key;	ret = send(data->sock, ctl_req, BT_AUDIO_IPC_PACKET_SIZE, MSG_NOSIGNAL);	if (ret <= 0) {		SYSERR("Unable to request new volume value to server");		return  -errno;	}	ret = recv(data->sock, ctl_rsp, BT_AUDIO_IPC_PACKET_SIZE, 0);	if (ret <= 0) {		SNDERR("Unable to receive new volume value from server");		return  -errno;	}	type = bt_audio_strmsg(ctl_rsp->rsp_h.msg_h.msg_type);	if (!type) {		SNDERR("Bogus message type %d "				"received from audio service",				ctl_rsp->rsp_h.msg_h.msg_type);		return -EINVAL;	}	if (ctl_rsp->rsp_h.msg_h.msg_type != BT_CONTROL_RSP) {		SNDERR("Unexpected message %s received", type);		return -EINVAL;	}	if (ctl_rsp->rsp_h.posix_errno != 0) {		SNDERR("BT_CONTROL failed : %s (%d)",					strerror(ctl_rsp->rsp_h.posix_errno),					ctl_rsp->rsp_h.posix_errno);		return -ctl_rsp->rsp_h.posix_errno;	}	return 0;}static int bluetooth_read_integer(snd_ctl_ext_t *ext, snd_ctl_ext_key_t key,								long *value){	struct bluetooth_data *data = ext->private_data;	int ret;	char buf[BT_AUDIO_IPC_PACKET_SIZE];	struct bt_control_rsp *rsp = (void *) buf;	DBG("ext %p key %ld", ext, key);	memset(buf, 0, sizeof(buf));	*value = 0;	ret = bluetooth_send_ctl(data, key, 0, rsp);	if (ret < 0)		goto done;	*value = rsp->key;done:	return ret;}static int bluetooth_write_integer(snd_ctl_ext_t *ext, snd_ctl_ext_key_t key,								long *value){	struct bluetooth_data *data = ext->private_data;	char buf[BT_AUDIO_IPC_PACKET_SIZE];	struct bt_control_rsp *rsp = (void *) buf;	long current;	int ret, keyvalue;	DBG("ext %p key %ld", ext, key);	ret = bluetooth_read_integer(ext, key, &current);	if (ret < 0)		return ret;	if (*value == current)		return 0;	while (*value != current) {		keyvalue = (*value > current) ? BT_CONTROL_KEY_VOL_UP :				BT_CONTROL_KEY_VOL_DOWN;		ret = bluetooth_send_ctl(data, key, keyvalue, rsp);		if (ret < 0)			break;		current = keyvalue;	}	return ret;}static int bluetooth_read_event(snd_ctl_ext_t *ext, snd_ctl_elem_id_t *id,						unsigned int *event_mask){	struct bluetooth_data *data = ext->private_data;	char buf[BT_AUDIO_IPC_PACKET_SIZE];	struct bt_control_ind *ind = (void *) buf;	int ret;	const char *type;	DBG("ext %p id %p", ext, id);	memset(buf, 0, sizeof(buf));	ret = recv(data->sock, ind, BT_AUDIO_IPC_PACKET_SIZE, MSG_DONTWAIT);	type = bt_audio_strmsg(ind->h.msg_type);	if (!type) {		SNDERR("Bogus message type %d "				"received from audio service",				ind->h.msg_type);		return -EAGAIN;	}	if (ind->h.msg_type != BT_CONTROL_IND) {		SNDERR("Unexpected message %s received", type);		return -EAGAIN;	}	snd_ctl_elem_id_set_interface(id, SND_CTL_ELEM_IFACE_MIXER);	snd_ctl_elem_id_set_name(id, ind->mode == BLUETOOTH_PLAYBACK ?				vol_devices[BLUETOOTH_PLAYBACK] :				vol_devices[BLUETOOTH_CAPTURE]);	*event_mask = SND_CTL_EVENT_MASK_VALUE;	return 1;}static snd_ctl_ext_callback_t bluetooth_callback = {	.close			= bluetooth_close,	.elem_count		= bluetooth_elem_count,	.elem_list		= bluetooth_elem_list,	.find_elem		= bluetooth_find_elem,	.get_attribute		= bluetooth_get_attribute,	.get_integer_info	= bluetooth_get_integer_info,	.read_integer		= bluetooth_read_integer,	.write_integer		= bluetooth_write_integer,	.read_event		= bluetooth_read_event,};static int bluetooth_init(struct bluetooth_data *data){	int sk;	if (!data)		return -EINVAL;	memset(data, 0, sizeof(struct bluetooth_data));	data->sock = -1;	sk = bt_audio_service_open();	if (sk < 0)		return -errno;	data->sock = sk;	return 0;}SND_CTL_PLUGIN_DEFINE_FUNC(bluetooth){	struct bluetooth_data *data;	int err;	DBG("Bluetooth Control plugin");	data = malloc(sizeof(struct bluetooth_data));	if (!data) {		err = -ENOMEM;		goto error;	}	err = bluetooth_init(data);	if (err < 0)		goto error;	data->ext.version = SND_CTL_EXT_VERSION;	data->ext.card_idx = -1;	strncpy(data->ext.id, "bluetooth", sizeof(data->ext.id) - 1);	strncpy(data->ext.driver, "Bluetooth-Audio", sizeof(data->ext.driver) - 1);	strncpy(data->ext.name, "Bluetooth Audio", sizeof(data->ext.name) - 1);	strncpy(data->ext.longname, "Bluetooth Audio", sizeof(data->ext.longname) - 1);	strncpy(data->ext.mixername, "Bluetooth Audio", sizeof(data->ext.mixername) - 1);	data->ext.callback = &bluetooth_callback;	data->ext.poll_fd = data->sock;	data->ext.private_data = data;	err = snd_ctl_ext_create(&data->ext, name, mode);	if (err < 0)		goto error;	*handlep = data->ext.handle;	return 0;error:	bluetooth_exit(data);	return err;}SND_CTL_PLUGIN_SYMBOL(bluetooth);

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩国产精选| 精品一区二区三区蜜桃| 国产精品538一区二区在线| 成人动漫av在线| 国产亚洲一二三区| 国产一区二区三区| 2021中文字幕一区亚洲| 国产一区二区剧情av在线| 日韩三级电影网址| 美女网站一区二区| 欧美大胆人体bbbb| 日本在线播放一区二区三区| 欧美一区二区三区小说| 麻豆国产精品视频| 久久久不卡网国产精品二区| 成人黄色在线视频| 国产欧美一区二区三区沐欲 | 国产一区二区伦理片| 精品欧美一区二区在线观看| 国产在线视频精品一区| 国产亚洲成av人在线观看导航| 国产激情精品久久久第一区二区 | 午夜在线电影亚洲一区| 91丨porny丨最新| 亚洲丶国产丶欧美一区二区三区| 99久久精品免费看国产免费软件| 亚洲欧洲无码一区二区三区| 国产成人精品aa毛片| 精品91自产拍在线观看一区| 国产成人免费av在线| 中文字幕日韩欧美一区二区三区| 在线国产电影不卡| 男男视频亚洲欧美| 国产欧美视频一区二区| 欧美在线观看视频在线| 亚洲精品乱码久久久久久久久| 欧美手机在线视频| 九色porny丨国产精品| 日韩欧美在线123| 国产成人精品网址| 亚洲成人激情综合网| 日韩久久免费av| 成人h版在线观看| 亚洲国产精品尤物yw在线观看| 欧美亚洲另类激情小说| 国产精品久久久久久一区二区三区 | 91网站视频在线观看| 日韩va亚洲va欧美va久久| 国产精品美女一区二区三区 | 色综合久久中文字幕| 狠狠色狠狠色综合| 午夜伦欧美伦电影理论片| 国产欧美日韩精品一区| 日韩一区二区麻豆国产| 在线观看三级视频欧美| jlzzjlzz亚洲日本少妇| 国产一区二区三区免费看| 全国精品久久少妇| 午夜精品在线看| 一区二区欧美精品| 亚洲色图.com| 亚洲欧美在线视频| 国产日韩三级在线| 精品人伦一区二区色婷婷| 欧美一区二区三区在线视频| 欧美精品国产精品| 欧美色图免费看| 在线日韩一区二区| 91传媒视频在线播放| 91片黄在线观看| 色欧美日韩亚洲| 欧美亚洲日本国产| 欧美日韩精品一区二区天天拍小说| 91豆麻精品91久久久久久| 色哟哟在线观看一区二区三区| av一区二区不卡| 99精品欧美一区二区三区小说| 成人午夜视频网站| 欧美网站一区二区| 99久久伊人网影院| 国产一区二区三区在线看麻豆| 天堂久久一区二区三区| 五月综合激情日本mⅴ| 亚洲高清免费视频| 日韩中文字幕一区二区三区| 蜜桃视频在线一区| 美国一区二区三区在线播放| 精品一区二区三区免费视频| 国产精品99久久久久| jlzzjlzz国产精品久久| 色婷婷综合久久久久中文一区二区| 91国产丝袜在线播放| 欧美精品第1页| 精品捆绑美女sm三区| 中文字幕乱码亚洲精品一区| 亚洲欧洲国产日韩| 一区二区三区不卡在线观看 | 亚洲国产精品成人综合色在线婷婷 | 精品午夜一区二区三区在线观看| 蜜臀a∨国产成人精品| 中文字幕佐山爱一区二区免费| 一区在线观看免费| 亚洲精品videosex极品| 亚洲va韩国va欧美va| 精品一区二区免费| 国模大尺度一区二区三区| 不卡免费追剧大全电视剧网站| 色呦呦一区二区三区| 91精品国产麻豆| 久久亚洲精精品中文字幕早川悠里| 中文字幕制服丝袜成人av| 亚洲制服欧美中文字幕中文字幕| 日日欢夜夜爽一区| 丁香婷婷综合激情五月色| 色综合网色综合| 精品日韩一区二区| 亚洲狼人国产精品| 美女视频网站久久| 韩国v欧美v日本v亚洲v| 日本高清不卡一区| 精品免费一区二区三区| 亚洲欧美色一区| 欧美a级一区二区| 99久久99久久免费精品蜜臀| 91精品国产91热久久久做人人| 亚洲国产精华液网站w| 亚洲欧美日韩国产另类专区| 亚洲成av人片在线| 国产高清亚洲一区| 欧美视频一区二区三区在线观看| 日韩欧美不卡一区| 一区二区三区不卡在线观看| 国产一区二区日韩精品| 欧美人动与zoxxxx乱| 国产精品国产自产拍高清av| 日本三级韩国三级欧美三级| 欧美视频在线一区二区三区| 亚洲国产精品国自产拍av| 男人的天堂久久精品| 欧洲精品一区二区| 国产欧美一区二区三区鸳鸯浴| 日韩二区在线观看| 色嗨嗨av一区二区三区| 中文字幕第一区二区| 美女脱光内衣内裤视频久久影院| 欧美性猛片xxxx免费看久爱| 国产欧美日韩激情| 国内成人自拍视频| 欧美狂野另类xxxxoooo| 亚洲激情第一区| 91在线精品一区二区| 国产欧美日韩不卡| 国产一区二区视频在线| 欧美mv和日韩mv国产网站| 日本v片在线高清不卡在线观看| 色综合久久综合网97色综合| 亚洲视频在线观看一区| 成人激情动漫在线观看| 欧美国产欧美综合| 国产精品亚洲第一区在线暖暖韩国| 精品噜噜噜噜久久久久久久久试看 | 国产最新精品免费| 精品久久人人做人人爱| 老鸭窝一区二区久久精品| 欧美一区二区精品在线| 日韩av电影天堂| 日韩一区二区三区观看| 免费观看30秒视频久久| 日韩欧美一二三区| 精品综合免费视频观看| 精品奇米国产一区二区三区| 国模冰冰炮一区二区| 国产校园另类小说区| 国产电影一区在线| 国产精品天天看| aaa欧美大片| 亚洲日穴在线视频| 欧美午夜电影在线播放| 日日夜夜免费精品| 日韩女优av电影在线观看| 国内成人自拍视频| 日本一区免费视频| 色婷婷亚洲综合| 亚洲大片免费看| 欧美一二三区精品| 国产一区二区三区精品视频| 中文字幕中文字幕一区二区| 在线精品视频一区二区| 日韩精品亚洲一区二区三区免费| 91精品婷婷国产综合久久| 九九国产精品视频| 中文字幕一区二区三区不卡| 欧美在线影院一区二区| 美女诱惑一区二区| 日本一区二区三区电影| 欧美少妇xxx| 奇米精品一区二区三区四区| 国产欧美日本一区视频| 精品视频1区2区3区| 久久成人精品无人区|