3 * BlueZ - Bluetooth protocol stack for Linux
5 * Copyright (C) 2013-2014 Intel Corporation. All rights reserved.
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
36 #include "btio/btio.h"
37 #include "lib/bluetooth.h"
39 #include "lib/sdp_lib.h"
40 #include "profiles/audio/a2dp-codecs.h"
41 #include "src/shared/queue.h"
44 #include "ipc-common.h"
48 #include "bluetooth.h"
51 #include "audio-msg.h"
53 #define SVC_HINT_CAPTURING 0x08
54 #define IDLE_TIMEOUT 1
55 #define AUDIO_RETRY_TIMEOUT 2
57 static GIOChannel *server = NULL;
58 static GSList *devices = NULL;
59 static GSList *endpoints = NULL;
60 static GSList *setups = NULL;
61 static bdaddr_t adapter_addr;
62 static uint32_t record_id = 0;
63 static guint audio_retry_id = 0;
64 static bool audio_retrying = false;
66 static struct ipc *hal_ipc = NULL;
67 static struct ipc *audio_ipc = NULL;
69 static struct queue *lseps = NULL;
76 struct a2dp_endpoint {
79 struct avdtp_local_sep *sep;
80 struct a2dp_preset *caps;
88 struct avdtp *session;
93 struct a2dp_device *dev;
94 struct a2dp_endpoint *endpoint;
95 struct a2dp_preset *preset;
96 struct avdtp_stream *stream;
100 static int device_cmp(gconstpointer s, gconstpointer user_data)
102 const struct a2dp_device *dev = s;
103 const bdaddr_t *dst = user_data;
105 return bacmp(&dev->dst, dst);
108 static void preset_free(void *data)
110 struct a2dp_preset *preset = data;
112 g_free(preset->data);
116 static void unregister_endpoint(void *data)
118 struct a2dp_endpoint *endpoint = data;
121 avdtp_unregister_sep(lseps, endpoint->sep);
124 preset_free(endpoint->caps);
126 g_slist_free_full(endpoint->presets, preset_free);
131 static void setup_free(void *data)
133 struct a2dp_setup *setup = data;
135 if (!g_slist_find(setup->endpoint->presets, setup->preset))
136 preset_free(setup->preset);
141 static void setup_remove(struct a2dp_setup *setup)
143 setups = g_slist_remove(setups, setup);
147 static void setup_remove_all_by_dev(struct a2dp_device *dev)
152 struct a2dp_setup *setup = l->data;
153 GSList *next = g_slist_next(l);
155 if (setup->dev == dev)
162 static void a2dp_device_free(void *data)
164 struct a2dp_device *dev = data;
166 if (dev->idle_id > 0)
167 g_source_remove(dev->idle_id);
170 avdtp_unref(dev->session);
173 g_io_channel_shutdown(dev->io, FALSE, NULL);
174 g_io_channel_unref(dev->io);
177 setup_remove_all_by_dev(dev);
182 static void a2dp_device_remove(struct a2dp_device *dev)
184 devices = g_slist_remove(devices, dev);
185 a2dp_device_free(dev);
188 static struct a2dp_device *a2dp_device_new(const bdaddr_t *dst)
190 struct a2dp_device *dev;
192 dev = g_new0(struct a2dp_device, 1);
193 bacpy(&dev->dst, dst);
194 devices = g_slist_prepend(devices, dev);
199 static bool a2dp_device_connect(struct a2dp_device *dev, BtIOConnect cb)
203 dev->io = bt_io_connect(cb, dev, NULL, &err,
204 BT_IO_OPT_SOURCE_BDADDR, &adapter_addr,
205 BT_IO_OPT_DEST_BDADDR, &dev->dst,
206 BT_IO_OPT_PSM, AVDTP_PSM,
207 BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_MEDIUM,
210 error("%s", err->message);
218 static void bt_a2dp_notify_state(struct a2dp_device *dev, uint8_t state)
220 struct hal_ev_a2dp_conn_state ev;
223 if (dev->state == state)
228 ba2str(&dev->dst, address);
229 DBG("device %s state %u", address, state);
231 bdaddr2android(&dev->dst, ev.bdaddr);
234 ipc_send_notif(hal_ipc, HAL_SERVICE_ID_A2DP, HAL_EV_A2DP_CONN_STATE,
237 if (state != HAL_A2DP_STATE_DISCONNECTED)
240 bt_avrcp_disconnect(&dev->dst);
242 a2dp_device_remove(dev);
245 static void bt_audio_notify_state(struct a2dp_setup *setup, uint8_t state)
247 struct hal_ev_a2dp_audio_state ev;
250 if (setup->state == state)
253 setup->state = state;
255 ba2str(&setup->dev->dst, address);
256 DBG("device %s state %u", address, state);
258 bdaddr2android(&setup->dev->dst, ev.bdaddr);
261 ipc_send_notif(hal_ipc, HAL_SERVICE_ID_A2DP, HAL_EV_A2DP_AUDIO_STATE,
265 static void disconnect_cb(void *user_data)
267 struct a2dp_device *dev = user_data;
269 bt_a2dp_notify_state(dev, HAL_A2DP_STATE_DISCONNECTED);
272 static int sbc_check_config(void *caps, uint8_t caps_len, void *conf,
275 a2dp_sbc_t *cap, *config;
277 if (conf_len != caps_len || conf_len != sizeof(a2dp_sbc_t)) {
278 error("SBC: Invalid configuration size (%u)", conf_len);
285 if (!(cap->frequency & config->frequency)) {
286 error("SBC: Unsupported frequency (%u) by endpoint",
291 if (!(cap->channel_mode & config->channel_mode)) {
292 error("SBC: Unsupported channel mode (%u) by endpoint",
293 config->channel_mode);
297 if (!(cap->block_length & config->block_length)) {
298 error("SBC: Unsupported block length (%u) by endpoint",
299 config->block_length);
303 if (!(cap->allocation_method & config->allocation_method)) {
304 error("SBC: Unsupported allocation method (%u) by endpoint",
305 config->block_length);
309 if (config->max_bitpool < cap->min_bitpool) {
310 error("SBC: Invalid maximun bitpool (%u < %u)",
311 config->max_bitpool, cap->min_bitpool);
315 if (config->min_bitpool > cap->max_bitpool) {
316 error("SBC: Invalid minimun bitpool (%u > %u)",
317 config->min_bitpool, cap->min_bitpool);
321 if (config->max_bitpool > cap->max_bitpool)
324 if (config->min_bitpool < cap->min_bitpool)
330 static int aac_check_config(void *caps, uint8_t caps_len, void *conf,
333 a2dp_aac_t *cap, *config;
335 if (conf_len != caps_len || conf_len != sizeof(a2dp_aac_t)) {
336 error("AAC: Invalid configuration size (%u)", conf_len);
343 if (!(cap->object_type & config->object_type)) {
344 error("AAC: Unsupported object type (%u) by endpoint",
345 config->object_type);
349 if (!(AAC_GET_FREQUENCY(*cap) & AAC_GET_FREQUENCY(*config))) {
350 error("AAC: Unsupported frequency (%u) by endpoint",
351 AAC_GET_FREQUENCY(*config));
355 if (!(cap->channels & config->channels)) {
356 error("AAC: Unsupported channels (%u) by endpoint",
361 /* VBR support in SNK is mandatory but let's make sure we don't try to
362 * have VBR on remote which for some reason does not support it
364 if (!cap->vbr && config->vbr) {
365 error("AAC: Unsupported VBR (%u) by endpoint",
370 if (AAC_GET_BITRATE(*cap) < AAC_GET_BITRATE(*config))
376 static int aptx_check_config(void *caps, uint8_t caps_len, void *conf,
379 a2dp_aptx_t *cap, *config;
381 if (conf_len != caps_len || conf_len != sizeof(a2dp_aptx_t)) {
382 error("APTX: Invalid configuration size (%u)", conf_len);
389 if (!(cap->frequency & config->frequency)) {
390 error("APTX: Unsupported frequenct (%u) by endpoint",
395 if (!(cap->channel_mode & config->channel_mode)) {
396 error("APTX: Unsupported channel mode (%u) by endpoint",
397 config->channel_mode);
404 static int check_capabilities(struct a2dp_preset *preset,
405 struct avdtp_media_codec_capability *codec,
408 a2dp_vendor_codec_t *vndcodec;
411 switch (codec->media_codec_type) {
413 return sbc_check_config(codec->data, codec_len, preset->data,
415 case A2DP_CODEC_MPEG24:
416 return aac_check_config(codec->data, codec_len, preset->data,
418 case A2DP_CODEC_VENDOR:
419 vndcodec = (void *) codec->data;
420 if (btohl(vndcodec->vendor_id) == APTX_VENDOR_ID &&
421 btohs(vndcodec->codec_id) == APTX_CODEC_ID)
422 return aptx_check_config(codec->data, codec_len,
423 preset->data, preset->len);
430 static struct a2dp_preset *sbc_select_range(void *caps, uint8_t caps_len,
431 void *conf, uint8_t conf_len)
433 struct a2dp_preset *p;
434 a2dp_sbc_t *cap, *config;
439 config->min_bitpool = MAX(config->min_bitpool, cap->min_bitpool);
440 config->max_bitpool = MIN(config->max_bitpool, cap->max_bitpool);
442 p = g_new0(struct a2dp_preset, 1);
444 p->data = g_memdup(conf, p->len);
449 static struct a2dp_preset *aac_select_range(void *caps, uint8_t caps_len,
450 void *conf, uint8_t conf_len)
452 struct a2dp_preset *p;
453 a2dp_aac_t *cap, *config;
459 bitrate = MIN(AAC_GET_BITRATE(*cap), AAC_GET_BITRATE(*config));
460 AAC_SET_BITRATE(*config, bitrate);
462 p = g_new0(struct a2dp_preset, 1);
464 p->data = g_memdup(conf, p->len);
469 static struct a2dp_preset *select_preset_range(struct a2dp_preset *preset,
470 struct avdtp_media_codec_capability *codec,
474 switch (codec->media_codec_type) {
476 return sbc_select_range(codec->data, codec_len, preset->data,
478 case A2DP_CODEC_MPEG24:
479 return aac_select_range(codec->data, codec_len, preset->data,
486 static struct a2dp_preset *select_preset(struct a2dp_endpoint *endpoint,
487 struct avdtp_remote_sep *rsep)
489 struct avdtp_service_capability *service;
490 struct avdtp_media_codec_capability *codec;
494 service = avdtp_get_codec(rsep);
495 codec = (struct avdtp_media_codec_capability *) service->data;
496 codec_len = service->length - sizeof(*codec);
498 for (l = endpoint->presets; l; l = g_slist_next(l)) {
499 struct a2dp_preset *preset = l->data;
502 err = check_capabilities(preset, codec, codec_len);
507 return select_preset_range(preset, codec, codec_len);
513 static void setup_add(struct a2dp_device *dev, struct a2dp_endpoint *endpoint,
514 struct a2dp_preset *preset, struct avdtp_stream *stream)
516 struct a2dp_setup *setup;
518 setup = g_new0(struct a2dp_setup, 1);
520 setup->endpoint = endpoint;
521 setup->preset = preset;
522 setup->stream = stream;
523 setups = g_slist_append(setups, setup);
525 if (dev->idle_id > 0) {
526 g_source_remove(dev->idle_id);
531 static int select_configuration(struct a2dp_device *dev,
532 struct a2dp_endpoint *endpoint,
533 struct avdtp_remote_sep *rsep)
535 struct a2dp_preset *preset;
536 struct avdtp_stream *stream;
537 struct avdtp_service_capability *service;
538 struct avdtp_media_codec_capability *codec;
542 preset = select_preset(endpoint, rsep);
544 error("Unable to select codec preset");
548 service = avdtp_service_cap_new(AVDTP_MEDIA_TRANSPORT, NULL, 0);
549 caps = g_slist_append(NULL, service);
551 codec = g_malloc0(sizeof(*codec) + preset->len);
552 codec->media_type = AVDTP_MEDIA_TYPE_AUDIO;
553 codec->media_codec_type = endpoint->codec;
554 memcpy(codec->data, preset->data, preset->len);
556 service = avdtp_service_cap_new(AVDTP_MEDIA_CODEC, codec,
557 sizeof(*codec) + preset->len);
558 caps = g_slist_append(caps, service);
562 err = avdtp_set_configuration(dev->session, rsep, endpoint->sep, caps,
564 g_slist_free_full(caps, g_free);
566 error("avdtp_set_configuration: %s", strerror(-err));
570 setup_add(dev, endpoint, preset, stream);
575 static void discover_cb(struct avdtp *session, GSList *seps,
576 struct avdtp_error *err, void *user_data)
578 struct a2dp_device *dev = user_data;
579 struct a2dp_endpoint *endpoint = NULL;
580 struct avdtp_remote_sep *rsep = NULL;
583 for (l = endpoints; l; l = g_slist_next(l)) {
586 rsep = avdtp_find_remote_sep(session, endpoint->sep);
592 error("Unable to find matching endpoint");
596 if (select_configuration(dev, endpoint, rsep) < 0)
602 avdtp_shutdown(session);
605 static gboolean idle_timeout(gpointer user_data)
607 struct a2dp_device *dev = user_data;
612 err = avdtp_discover(dev->session, discover_cb, dev);
616 error("avdtp_discover: %s", strerror(-err));
617 bt_a2dp_notify_state(dev, HAL_A2DP_STATE_DISCONNECTED);
622 static void signaling_connect_cb(GIOChannel *chan, GError *err,
625 struct a2dp_device *dev = user_data;
626 struct avdtp *session;
632 bt_a2dp_notify_state(dev, HAL_A2DP_STATE_DISCONNECTED);
633 error("%s", err->message);
637 bt_io_get(chan, &gerr,
638 BT_IO_OPT_IMTU, &imtu,
639 BT_IO_OPT_OMTU, &omtu,
642 error("%s", gerr->message);
647 fd = g_io_channel_unix_get_fd(chan);
649 /* FIXME: Add proper version */
650 session = avdtp_new(fd, imtu, omtu, 0x0100, lseps);
654 dev->session = session;
656 avdtp_add_disconnect_cb(dev->session, disconnect_cb, dev);
658 /* Proceed to stream setup if initiator */
662 g_io_channel_unref(dev->io);
665 perr = avdtp_discover(dev->session, discover_cb, dev);
667 error("avdtp_discover: %s", strerror(-perr));
670 bt_avrcp_connect(&dev->dst);
671 } else /* Init idle timeout to discover */
672 dev->idle_id = g_timeout_add_seconds(IDLE_TIMEOUT, idle_timeout,
678 bt_a2dp_notify_state(dev, HAL_A2DP_STATE_DISCONNECTED);
681 static void bt_a2dp_connect(const void *buf, uint16_t len)
683 const struct hal_cmd_a2dp_connect *cmd = buf;
684 struct a2dp_device *dev;
692 android2bdaddr(&cmd->bdaddr, &dst);
694 l = g_slist_find_custom(devices, &dst, device_cmp);
696 status = HAL_STATUS_FAILED;
700 dev = a2dp_device_new(&dst);
701 if (!a2dp_device_connect(dev, signaling_connect_cb)) {
702 a2dp_device_remove(dev);
703 status = HAL_STATUS_FAILED;
707 ba2str(&dev->dst, addr);
708 DBG("connecting to %s", addr);
710 bt_a2dp_notify_state(dev, HAL_A2DP_STATE_CONNECTING);
712 status = HAL_STATUS_SUCCESS;
715 ipc_send_rsp(hal_ipc, HAL_SERVICE_ID_A2DP, HAL_OP_A2DP_CONNECT, status);
718 static void bt_a2dp_disconnect(const void *buf, uint16_t len)
720 const struct hal_cmd_a2dp_connect *cmd = buf;
722 struct a2dp_device *dev;
728 android2bdaddr(&cmd->bdaddr, &dst);
730 l = g_slist_find_custom(devices, &dst, device_cmp);
732 status = HAL_STATUS_FAILED;
737 status = HAL_STATUS_SUCCESS;
740 bt_a2dp_notify_state(dev, HAL_A2DP_STATE_DISCONNECTED);
744 /* Wait AVDTP session to shutdown */
745 avdtp_shutdown(dev->session);
746 bt_a2dp_notify_state(dev, HAL_A2DP_STATE_DISCONNECTING);
749 ipc_send_rsp(hal_ipc, HAL_SERVICE_ID_A2DP, HAL_OP_A2DP_DISCONNECT,
753 static const struct ipc_handler cmd_handlers[] = {
754 /* HAL_OP_A2DP_CONNECT */
755 { bt_a2dp_connect, false, sizeof(struct hal_cmd_a2dp_connect) },
756 /* HAL_OP_A2DP_DISCONNECT */
757 { bt_a2dp_disconnect, false, sizeof(struct hal_cmd_a2dp_disconnect) },
760 static struct a2dp_setup *find_setup_by_device(struct a2dp_device *dev)
764 for (l = setups; l; l = g_slist_next(l)) {
765 struct a2dp_setup *setup = l->data;
767 if (setup->dev == dev)
774 static void transport_connect_cb(GIOChannel *chan, GError *err,
777 struct a2dp_device *dev = user_data;
778 struct a2dp_setup *setup;
784 error("%s", err->message);
788 setup = find_setup_by_device(dev);
790 error("Unable to find stream setup");
794 bt_io_get(chan, &gerr,
795 BT_IO_OPT_IMTU, &imtu,
796 BT_IO_OPT_OMTU, &omtu,
799 error("%s", gerr->message);
804 fd = g_io_channel_unix_get_fd(chan);
806 if (!avdtp_stream_set_transport(setup->stream, fd, imtu, omtu)) {
807 error("avdtp_stream_set_transport: failed");
811 g_io_channel_set_close_on_unref(chan, FALSE);
814 g_io_channel_unref(dev->io);
818 bt_a2dp_notify_state(dev, HAL_A2DP_STATE_CONNECTED);
821 static void connect_cb(GIOChannel *chan, GError *err, gpointer user_data)
823 struct a2dp_device *dev;
830 error("%s", err->message);
834 bt_io_get(chan, &gerr,
835 BT_IO_OPT_DEST_BDADDR, &dst,
838 error("%s", gerr->message);
840 g_io_channel_shutdown(chan, TRUE, NULL);
844 ba2str(&dst, address);
845 DBG("Incoming connection from %s", address);
847 l = g_slist_find_custom(devices, &dst, device_cmp);
849 transport_connect_cb(chan, err, l->data);
853 dev = a2dp_device_new(&dst);
854 bt_a2dp_notify_state(dev, HAL_A2DP_STATE_CONNECTING);
855 signaling_connect_cb(chan, err, dev);
858 static sdp_record_t *a2dp_record(void)
860 sdp_list_t *svclass_id, *pfseq, *apseq, *root;
861 uuid_t root_uuid, l2cap_uuid, avdtp_uuid, a2dp_uuid;
862 sdp_profile_desc_t profile[1];
863 sdp_list_t *aproto, *proto[2];
864 sdp_record_t *record;
865 sdp_data_t *psm, *version, *features;
866 uint16_t lp = AVDTP_UUID;
867 uint16_t a2dp_ver = 0x0103, avdtp_ver = 0x0103, feat = 0x000f;
869 record = sdp_record_alloc();
873 sdp_uuid16_create(&root_uuid, PUBLIC_BROWSE_GROUP);
874 root = sdp_list_append(NULL, &root_uuid);
875 sdp_set_browse_groups(record, root);
877 sdp_uuid16_create(&a2dp_uuid, AUDIO_SOURCE_SVCLASS_ID);
878 svclass_id = sdp_list_append(NULL, &a2dp_uuid);
879 sdp_set_service_classes(record, svclass_id);
881 sdp_uuid16_create(&profile[0].uuid, ADVANCED_AUDIO_PROFILE_ID);
882 profile[0].version = a2dp_ver;
883 pfseq = sdp_list_append(NULL, &profile[0]);
884 sdp_set_profile_descs(record, pfseq);
886 sdp_uuid16_create(&l2cap_uuid, L2CAP_UUID);
887 proto[0] = sdp_list_append(NULL, &l2cap_uuid);
888 psm = sdp_data_alloc(SDP_UINT16, &lp);
889 proto[0] = sdp_list_append(proto[0], psm);
890 apseq = sdp_list_append(NULL, proto[0]);
892 sdp_uuid16_create(&avdtp_uuid, AVDTP_UUID);
893 proto[1] = sdp_list_append(NULL, &avdtp_uuid);
894 version = sdp_data_alloc(SDP_UINT16, &avdtp_ver);
895 proto[1] = sdp_list_append(proto[1], version);
896 apseq = sdp_list_append(apseq, proto[1]);
898 aproto = sdp_list_append(NULL, apseq);
899 sdp_set_access_protos(record, aproto);
901 features = sdp_data_alloc(SDP_UINT16, &feat);
902 sdp_attr_add(record, SDP_ATTR_SUPPORTED_FEATURES, features);
904 sdp_set_info_attr(record, "Audio Source", NULL, NULL);
907 sdp_data_free(version);
908 sdp_list_free(proto[0], NULL);
909 sdp_list_free(proto[1], NULL);
910 sdp_list_free(apseq, NULL);
911 sdp_list_free(pfseq, NULL);
912 sdp_list_free(aproto, NULL);
913 sdp_list_free(root, NULL);
914 sdp_list_free(svclass_id, NULL);
919 static gboolean sep_getcap_ind(struct avdtp *session,
920 struct avdtp_local_sep *sep,
921 GSList **caps, uint8_t *err,
924 struct a2dp_endpoint *endpoint = user_data;
925 struct a2dp_preset *cap = endpoint->caps;
926 struct avdtp_service_capability *service;
927 struct avdtp_media_codec_capability *codec;
931 service = avdtp_service_cap_new(AVDTP_MEDIA_TRANSPORT, NULL, 0);
932 *caps = g_slist_append(*caps, service);
934 codec = g_malloc0(sizeof(*codec) + cap->len);
935 codec->media_type = AVDTP_MEDIA_TYPE_AUDIO;
936 codec->media_codec_type = endpoint->codec;
937 memcpy(codec->data, cap->data, cap->len);
939 service = avdtp_service_cap_new(AVDTP_MEDIA_CODEC, codec,
940 sizeof(*codec) + cap->len);
941 *caps = g_slist_append(*caps, service);
947 static int check_config(struct a2dp_endpoint *endpoint,
948 struct a2dp_preset *config)
951 struct a2dp_preset *caps;
953 for (l = endpoint->presets; l; l = g_slist_next(l)) {
954 struct a2dp_preset *preset = l->data;
956 if (preset->len != config->len)
959 if (memcmp(preset->data, config->data, preset->len) == 0)
963 caps = endpoint->caps;
966 switch (endpoint->codec) {
968 return sbc_check_config(caps->data, caps->len, config->data,
975 static struct a2dp_device *find_device_by_session(struct avdtp *session)
979 for (l = devices; l; l = g_slist_next(l)) {
980 struct a2dp_device *dev = l->data;
982 if (dev->session == session)
989 static struct a2dp_setup *find_setup(uint8_t id)
993 for (l = setups; l; l = g_slist_next(l)) {
994 struct a2dp_setup *setup = l->data;
996 if (setup->endpoint->id == id)
1003 static void setup_remove_by_id(uint8_t id)
1005 struct a2dp_setup *setup;
1007 setup = find_setup(id);
1009 error("Unable to find stream setup for endpoint %u", id);
1013 setup_remove(setup);
1016 static gboolean sep_setconf_ind(struct avdtp *session,
1017 struct avdtp_local_sep *sep,
1018 struct avdtp_stream *stream,
1020 avdtp_set_configuration_cb cb,
1023 struct a2dp_endpoint *endpoint = user_data;
1024 struct a2dp_device *dev;
1025 struct a2dp_preset *preset = NULL;
1029 dev = find_device_by_session(session);
1031 error("Unable to find device for session %p", session);
1035 for (; caps != NULL; caps = g_slist_next(caps)) {
1036 struct avdtp_service_capability *cap = caps->data;
1037 struct avdtp_media_codec_capability *codec;
1039 if (cap->category == AVDTP_DELAY_REPORTING)
1042 if (cap->category != AVDTP_MEDIA_CODEC)
1045 codec = (struct avdtp_media_codec_capability *) cap->data;
1047 if (codec->media_codec_type != endpoint->codec)
1050 preset = g_new0(struct a2dp_preset, 1);
1051 preset->len = cap->length - sizeof(*codec);
1052 preset->data = g_memdup(codec->data, preset->len);
1054 if (check_config(endpoint, preset) < 0) {
1055 preset_free(preset);
1063 setup_add(dev, endpoint, preset, stream);
1065 cb(session, stream, NULL);
1070 static gboolean sep_open_ind(struct avdtp *session, struct avdtp_local_sep *sep,
1071 struct avdtp_stream *stream, uint8_t *err,
1074 struct a2dp_endpoint *endpoint = user_data;
1075 struct a2dp_setup *setup;
1079 setup = find_setup(endpoint->id);
1081 error("Unable to find stream setup for endpoint %u",
1083 *err = AVDTP_SEP_NOT_IN_USE;
1090 static gboolean sep_close_ind(struct avdtp *session,
1091 struct avdtp_local_sep *sep,
1092 struct avdtp_stream *stream,
1096 struct a2dp_endpoint *endpoint = user_data;
1097 struct a2dp_setup *setup;
1101 setup = find_setup(endpoint->id);
1103 error("Unable to find stream setup for endpoint %u",
1105 *err = AVDTP_SEP_NOT_IN_USE;
1109 bt_audio_notify_state(setup, HAL_AUDIO_STOPPED);
1111 setup_remove(setup);
1116 static gboolean sep_start_ind(struct avdtp *session,
1117 struct avdtp_local_sep *sep,
1118 struct avdtp_stream *stream,
1122 struct a2dp_endpoint *endpoint = user_data;
1123 struct a2dp_setup *setup;
1127 setup = find_setup(endpoint->id);
1129 error("Unable to find stream setup for endpoint %u",
1131 *err = AVDTP_SEP_NOT_IN_USE;
1135 bt_audio_notify_state(setup, HAL_AUDIO_STARTED);
1140 static gboolean sep_suspend_ind(struct avdtp *session,
1141 struct avdtp_local_sep *sep,
1142 struct avdtp_stream *stream,
1146 struct a2dp_endpoint *endpoint = user_data;
1147 struct a2dp_setup *setup;
1151 setup = find_setup(endpoint->id);
1153 error("Unable to find stream setup for endpoint %u",
1155 *err = AVDTP_SEP_NOT_IN_USE;
1159 bt_audio_notify_state(setup, HAL_AUDIO_SUSPEND);
1164 static struct avdtp_sep_ind sep_ind = {
1165 .get_capability = sep_getcap_ind,
1166 .set_configuration = sep_setconf_ind,
1167 .open = sep_open_ind,
1168 .close = sep_close_ind,
1169 .start = sep_start_ind,
1170 .suspend = sep_suspend_ind,
1173 static void sep_setconf_cfm(struct avdtp *session, struct avdtp_local_sep *sep,
1174 struct avdtp_stream *stream,
1175 struct avdtp_error *err, void *user_data)
1177 struct a2dp_endpoint *endpoint = user_data;
1178 struct a2dp_setup *setup;
1183 setup = find_setup(endpoint->id);
1185 error("Unable to find stream setup for endpoint %u",
1193 ret = avdtp_open(session, stream);
1195 error("avdtp_open: %s", strerror(-ret));
1202 setup_remove(setup);
1205 static void sep_open_cfm(struct avdtp *session, struct avdtp_local_sep *sep,
1206 struct avdtp_stream *stream, struct avdtp_error *err,
1209 struct a2dp_endpoint *endpoint = user_data;
1210 struct a2dp_device *dev;
1217 dev = find_device_by_session(session);
1219 error("Unable to find device for session");
1223 a2dp_device_connect(dev, transport_connect_cb);
1228 setup_remove_by_id(endpoint->id);
1231 static void sep_start_cfm(struct avdtp *session, struct avdtp_local_sep *sep,
1232 struct avdtp_stream *stream, struct avdtp_error *err,
1235 struct a2dp_endpoint *endpoint = user_data;
1236 struct a2dp_setup *setup;
1241 setup_remove_by_id(endpoint->id);
1245 setup = find_setup(endpoint->id);
1247 error("Unable to find stream setup for %u endpoint",
1252 bt_audio_notify_state(setup, HAL_AUDIO_STARTED);
1255 static void sep_suspend_cfm(struct avdtp *session, struct avdtp_local_sep *sep,
1256 struct avdtp_stream *stream, struct avdtp_error *err,
1259 struct a2dp_endpoint *endpoint = user_data;
1260 struct a2dp_setup *setup;
1265 setup_remove_by_id(endpoint->id);
1269 setup = find_setup(endpoint->id);
1271 error("Unable to find stream setup for %u endpoint",
1276 bt_audio_notify_state(setup, HAL_AUDIO_STOPPED);
1279 static void sep_close_cfm(struct avdtp *session, struct avdtp_local_sep *sep,
1280 struct avdtp_stream *stream, struct avdtp_error *err,
1283 struct a2dp_endpoint *endpoint = user_data;
1284 struct a2dp_setup *setup;
1291 setup = find_setup(endpoint->id);
1293 error("Unable to find stream setup for %u endpoint",
1298 bt_audio_notify_state(setup, HAL_AUDIO_STOPPED);
1300 setup_remove(setup);
1303 static void sep_abort_cfm(struct avdtp *session, struct avdtp_local_sep *sep,
1304 struct avdtp_stream *stream, struct avdtp_error *err,
1307 struct a2dp_endpoint *endpoint = user_data;
1314 setup_remove_by_id(endpoint->id);
1317 static struct avdtp_sep_cfm sep_cfm = {
1318 .set_configuration = sep_setconf_cfm,
1319 .open = sep_open_cfm,
1320 .start = sep_start_cfm,
1321 .suspend = sep_suspend_cfm,
1322 .close = sep_close_cfm,
1323 .abort = sep_abort_cfm,
1326 static uint8_t register_endpoint(const uint8_t *uuid, uint8_t codec,
1329 struct a2dp_endpoint *endpoint;
1331 /* FIXME: Add proper check for uuid */
1333 endpoint = g_new0(struct a2dp_endpoint, 1);
1334 endpoint->id = g_slist_length(endpoints) + 1;
1335 endpoint->codec = codec;
1336 endpoint->sep = avdtp_register_sep(lseps, AVDTP_SEP_TYPE_SOURCE,
1337 AVDTP_MEDIA_TYPE_AUDIO,
1338 codec, FALSE, &sep_ind,
1339 &sep_cfm, endpoint);
1340 endpoint->caps = presets->data;
1341 endpoint->presets = g_slist_copy(g_slist_nth(presets, 1));
1343 if (endpoint->codec == A2DP_CODEC_VENDOR) {
1344 a2dp_vendor_codec_t *vndcodec = (void *) endpoint->caps->data;
1346 avdtp_sep_set_vendor_codec(endpoint->sep,
1347 btohl(vndcodec->vendor_id),
1348 btohs(vndcodec->codec_id));
1351 endpoints = g_slist_append(endpoints, endpoint);
1353 return endpoint->id;
1356 static GSList *parse_presets(const struct audio_preset *p, uint8_t count,
1362 for (i = 0; count > i; i++) {
1363 const uint8_t *ptr = (const uint8_t *) p;
1364 struct a2dp_preset *preset;
1366 if (len < sizeof(struct audio_preset)) {
1367 DBG("Invalid preset index %u", i);
1368 g_slist_free_full(l, preset_free);
1372 len -= sizeof(struct audio_preset);
1373 if (len == 0 || len < p->len) {
1374 DBG("Invalid preset size of %u for index %u", len, i);
1375 g_slist_free_full(l, preset_free);
1379 preset = g_new0(struct a2dp_preset, 1);
1380 preset->len = p->len;
1381 preset->data = g_memdup(p->data, preset->len);
1382 l = g_slist_append(l, preset);
1385 ptr += sizeof(*p) + preset->len;
1386 p = (const struct audio_preset *) ptr;
1392 static void bt_audio_open(const void *buf, uint16_t len)
1394 const struct audio_cmd_open *cmd = buf;
1395 struct audio_rsp_open rsp;
1400 audio_retrying = false;
1402 if (cmd->presets == 0) {
1403 error("No audio presets found");
1407 presets = parse_presets(cmd->preset, cmd->presets, len - sizeof(*cmd));
1409 error("No audio presets found");
1413 rsp.id = register_endpoint(cmd->uuid, cmd->codec, presets);
1415 g_slist_free_full(presets, preset_free);
1416 error("Unable to register endpoint");
1420 g_slist_free(presets);
1422 ipc_send_rsp_full(audio_ipc, AUDIO_SERVICE_ID, AUDIO_OP_OPEN,
1423 sizeof(rsp), &rsp, -1);
1428 ipc_send_rsp(audio_ipc, AUDIO_SERVICE_ID, AUDIO_OP_OPEN,
1429 AUDIO_STATUS_FAILED);
1432 static struct a2dp_endpoint *find_endpoint(uint8_t id)
1436 for (l = endpoints; l; l = g_slist_next(l)) {
1437 struct a2dp_endpoint *endpoint = l->data;
1439 if (endpoint->id == id)
1446 static void bt_audio_close(const void *buf, uint16_t len)
1448 const struct audio_cmd_close *cmd = buf;
1449 struct a2dp_endpoint *endpoint;
1453 endpoint = find_endpoint(cmd->id);
1455 error("Unable to find endpoint %u", cmd->id);
1456 ipc_send_rsp(audio_ipc, AUDIO_SERVICE_ID, AUDIO_OP_CLOSE,
1457 AUDIO_STATUS_FAILED);
1461 endpoints = g_slist_remove(endpoints, endpoint);
1462 unregister_endpoint(endpoint);
1464 ipc_send_rsp(audio_ipc, AUDIO_SERVICE_ID, AUDIO_OP_CLOSE,
1465 AUDIO_STATUS_SUCCESS);
1468 static void bt_stream_open(const void *buf, uint16_t len)
1470 const struct audio_cmd_open_stream *cmd = buf;
1471 struct audio_rsp_open_stream *rsp;
1472 struct a2dp_setup *setup;
1479 setup = find_setup(cmd->id);
1481 setup = setups ? setups->data : NULL;
1483 error("Unable to find stream for endpoint %u", cmd->id);
1484 ipc_send_rsp(audio_ipc, AUDIO_SERVICE_ID, AUDIO_OP_OPEN_STREAM,
1485 AUDIO_STATUS_FAILED);
1489 if (!avdtp_stream_get_transport(setup->stream, &fd, NULL, &omtu,
1491 error("avdtp_stream_get_transport: failed");
1492 ipc_send_rsp(audio_ipc, AUDIO_SERVICE_ID, AUDIO_OP_OPEN_STREAM,
1493 AUDIO_STATUS_FAILED);
1497 len = sizeof(struct audio_rsp_open_stream) +
1498 sizeof(struct audio_preset) + setup->preset->len;
1499 rsp = g_malloc0(len);
1500 rsp->id = setup->endpoint->id;
1502 rsp->preset->len = setup->preset->len;
1503 memcpy(rsp->preset->data, setup->preset->data, setup->preset->len);
1505 ipc_send_rsp_full(audio_ipc, AUDIO_SERVICE_ID, AUDIO_OP_OPEN_STREAM,
1511 static void bt_stream_close(const void *buf, uint16_t len)
1513 const struct audio_cmd_close_stream *cmd = buf;
1514 struct a2dp_setup *setup;
1519 setup = find_setup(cmd->id);
1521 error("Unable to find stream for endpoint %u", cmd->id);
1525 err = avdtp_close(setup->dev->session, setup->stream, FALSE);
1527 error("avdtp_close: %s", strerror(-err));
1531 ipc_send_rsp(audio_ipc, AUDIO_SERVICE_ID, AUDIO_OP_CLOSE_STREAM,
1532 AUDIO_STATUS_SUCCESS);
1537 ipc_send_rsp(audio_ipc, AUDIO_SERVICE_ID, AUDIO_OP_CLOSE_STREAM,
1538 AUDIO_STATUS_FAILED);
1541 static void bt_stream_resume(const void *buf, uint16_t len)
1543 const struct audio_cmd_resume_stream *cmd = buf;
1544 struct a2dp_setup *setup;
1549 setup = find_setup(cmd->id);
1551 error("Unable to find stream for endpoint %u", cmd->id);
1555 if (setup->state != HAL_AUDIO_STARTED) {
1556 err = avdtp_start(setup->dev->session, setup->stream);
1558 error("avdtp_start: %s", strerror(-err));
1563 ipc_send_rsp(audio_ipc, AUDIO_SERVICE_ID, AUDIO_OP_RESUME_STREAM,
1564 AUDIO_STATUS_SUCCESS);
1569 ipc_send_rsp(audio_ipc, AUDIO_SERVICE_ID, AUDIO_OP_RESUME_STREAM,
1570 AUDIO_STATUS_FAILED);
1573 static void bt_stream_suspend(const void *buf, uint16_t len)
1575 const struct audio_cmd_suspend_stream *cmd = buf;
1576 struct a2dp_setup *setup;
1581 setup = find_setup(cmd->id);
1583 error("Unable to find stream for endpoint %u", cmd->id);
1587 err = avdtp_suspend(setup->dev->session, setup->stream);
1589 error("avdtp_suspend: %s", strerror(-err));
1593 ipc_send_rsp(audio_ipc, AUDIO_SERVICE_ID, AUDIO_OP_SUSPEND_STREAM,
1594 AUDIO_STATUS_SUCCESS);
1599 ipc_send_rsp(audio_ipc, AUDIO_SERVICE_ID, AUDIO_OP_SUSPEND_STREAM,
1600 AUDIO_STATUS_FAILED);
1603 static const struct ipc_handler audio_handlers[] = {
1605 { bt_audio_open, true, sizeof(struct audio_cmd_open) },
1606 /* AUDIO_OP_CLOSE */
1607 { bt_audio_close, false, sizeof(struct audio_cmd_close) },
1608 /* AUDIO_OP_OPEN_STREAM */
1609 { bt_stream_open, false, sizeof(struct audio_cmd_open_stream) },
1610 /* AUDIO_OP_CLOSE_STREAM */
1611 { bt_stream_close, false, sizeof(struct audio_cmd_close_stream) },
1612 /* AUDIO_OP_RESUME_STREAM */
1613 { bt_stream_resume, false, sizeof(struct audio_cmd_resume_stream) },
1614 /* AUDIO_OP_SUSPEND_STREAM */
1615 { bt_stream_suspend, false, sizeof(struct audio_cmd_suspend_stream) },
1618 static void bt_audio_unregister(void)
1622 if (audio_retry_id > 0)
1623 g_source_remove(audio_retry_id);
1625 g_slist_free_full(endpoints, unregister_endpoint);
1628 g_slist_free_full(setups, setup_free);
1631 ipc_cleanup(audio_ipc);
1634 queue_destroy(lseps, NULL);
1637 static bool bt_audio_register(ipc_disconnect_cb disconnect)
1641 audio_ipc = ipc_init(BLUEZ_AUDIO_SK_PATH, sizeof(BLUEZ_AUDIO_SK_PATH),
1642 AUDIO_SERVICE_ID_MAX, false, disconnect, NULL);
1646 ipc_register(audio_ipc, AUDIO_SERVICE_ID, audio_handlers,
1647 G_N_ELEMENTS(audio_handlers));
1652 static gboolean audio_retry_register(void *data)
1654 ipc_disconnect_cb cb = data;
1657 audio_retrying = true;
1659 bt_audio_register(cb);
1664 static void audio_disconnected(void *data)
1674 restart = endpoints != NULL ? true : false;
1676 bt_audio_unregister();
1678 for (l = devices; l; l = g_slist_next(l)) {
1679 struct a2dp_device *dev = l->data;
1681 avdtp_shutdown(dev->session);
1688 audio_retry_id = g_timeout_add_seconds(AUDIO_RETRY_TIMEOUT,
1689 audio_retry_register,
1690 audio_disconnected);
1693 bool bt_a2dp_register(struct ipc *ipc, const bdaddr_t *addr, uint8_t mode)
1700 bacpy(&adapter_addr, addr);
1702 lseps = queue_new();
1704 server = bt_io_listen(connect_cb, NULL, NULL, NULL, &err,
1705 BT_IO_OPT_SOURCE_BDADDR, &adapter_addr,
1706 BT_IO_OPT_PSM, AVDTP_PSM,
1707 BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_MEDIUM,
1708 BT_IO_OPT_MASTER, true,
1711 error("Failed to listen on AVDTP channel: %s", err->message);
1716 rec = a2dp_record();
1718 error("Failed to allocate A2DP record");
1722 if (bt_adapter_add_record(rec, SVC_HINT_CAPTURING) < 0) {
1723 error("Failed to register A2DP record");
1724 sdp_record_free(rec);
1727 record_id = rec->handle;
1731 ipc_register(hal_ipc, HAL_SERVICE_ID_A2DP, cmd_handlers,
1732 G_N_ELEMENTS(cmd_handlers));
1734 if (bt_audio_register(audio_disconnected))
1738 g_io_channel_shutdown(server, TRUE, NULL);
1739 g_io_channel_unref(server);
1744 void bt_a2dp_unregister(void)
1748 g_slist_free_full(setups, setup_free);
1751 g_slist_free_full(endpoints, unregister_endpoint);
1754 g_slist_free_full(devices, a2dp_device_free);
1757 ipc_unregister(hal_ipc, HAL_SERVICE_ID_A2DP);
1760 bt_adapter_remove_record(record_id);
1764 g_io_channel_shutdown(server, TRUE, NULL);
1765 g_io_channel_unref(server);
1770 ipc_unregister(audio_ipc, AUDIO_SERVICE_ID);
1771 ipc_cleanup(audio_ipc);