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
34 #include "lib/bluetooth.h"
36 #include "lib/sdp_lib.h"
37 #include "src/sdp-client.h"
38 #include "src/uuid-helper.h"
39 #include "src/shared/hfp.h"
40 #include "src/shared/queue.h"
41 #include "src/shared/util.h"
42 #include "btio/btio.h"
44 #include "ipc-common.h"
46 #include "handsfree.h"
47 #include "bluetooth.h"
53 #define HSP_AG_CHANNEL 12
54 #define HFP_AG_CHANNEL 13
56 #define HFP_AG_FEAT_3WAY 0x00000001
57 #define HFP_AG_FEAT_ECNR 0x00000002
58 #define HFP_AG_FEAT_VR 0x00000004
59 #define HFP_AG_FEAT_INBAND 0x00000008
60 #define HFP_AG_FEAT_VTAG 0x00000010
61 #define HFP_AG_FEAT_REJ_CALL 0x00000020
62 #define HFP_AG_FEAT_ECS 0x00000040
63 #define HFP_AG_FEAT_ECC 0x00000080
64 #define HFP_AG_FEAT_EXT_ERR 0x00000100
65 #define HFP_AG_FEAT_CODEC 0x00000200
67 #define HFP_HF_FEAT_ECNR 0x00000001
68 #define HFP_HF_FEAT_3WAY 0x00000002
69 #define HFP_HF_FEAT_CLI 0x00000004
70 #define HFP_HF_FEAT_VR 0x00000008
71 #define HFP_HF_FEAT_RVC 0x00000010
72 #define HFP_HF_FEAT_ECS 0x00000020
73 #define HFP_HF_FEAT_ECC 0x00000040
74 #define HFP_HF_FEAT_CODEC 0x00000080
76 #define HFP_AG_FEATURES (HFP_AG_FEAT_3WAY | HFP_AG_FEAT_ECNR |\
77 HFP_AG_FEAT_VR | HFP_AG_FEAT_REJ_CALL |\
78 HFP_AG_FEAT_ECS | HFP_AG_FEAT_EXT_ERR)
80 #define HFP_AG_CHLD "0,1,2,3"
82 /* offsets in indicators table, should be incremented when sending CIEV */
85 #define IND_CALLSETUP 2
86 #define IND_CALLHELD 3
90 #define IND_COUNT (IND_BATTCHG + 1)
92 #define RING_TIMEOUT 2
96 #define CODECS_COUNT (MSBC_OFFSET + 1)
98 #define CODEC_ID_CVSD 0x01
99 #define CODEC_ID_MSBC 0x02
112 bool local_supported;
113 bool remote_supported;
125 bool indicators_enabled;
126 struct indicator inds[IND_COUNT];
130 guint call_hanging_up;
132 uint8_t negotiated_codec;
133 uint8_t proposed_codec;
134 struct hfp_codec codecs[CODECS_COUNT];
144 static const struct indicator inds_defaults[] = {
145 { "service", 0, 1, 0, false, true },
146 { "call", 0, 1, 0, true, true },
147 { "callsetup", 0, 3, 0, true, true },
148 { "callheld", 0, 2, 0, true, true },
149 { "signal", 0, 5, 0, false, true },
150 { "roam", 0, 1, 0, false, true },
151 { "battchg", 0, 5, 0, false, true },
154 static const struct hfp_codec codecs_defaults[] = {
155 { CODEC_ID_CVSD, true, false},
156 { CODEC_ID_MSBC, false, false},
159 static struct queue *devices = NULL;
161 static uint32_t hfp_ag_features = 0;
163 static bdaddr_t adapter_addr;
165 static struct ipc *hal_ipc = NULL;
166 static struct ipc *sco_ipc = NULL;
168 static uint32_t hfp_record_id = 0;
169 static GIOChannel *hfp_server = NULL;
171 static uint32_t hsp_record_id = 0;
172 static GIOChannel *hsp_server = NULL;
174 static struct bt_sco *sco = NULL;
176 static unsigned int max_hfp_clients = 0;
178 static void set_state(struct hf_device *dev, uint8_t state)
180 struct hal_ev_handsfree_conn_state ev;
183 if (dev->state == state)
188 ba2str(&dev->bdaddr, address);
189 DBG("device %s state %u", address, state);
191 bdaddr2android(&dev->bdaddr, ev.bdaddr);
194 ipc_send_notif(hal_ipc, HAL_SERVICE_ID_HANDSFREE,
195 HAL_EV_HANDSFREE_CONN_STATE, sizeof(ev), &ev);
198 static void set_audio_state(struct hf_device *dev, uint8_t state)
200 struct hal_ev_handsfree_audio_state ev;
203 if (dev->audio_state == state)
206 dev->audio_state = state;
208 ba2str(&dev->bdaddr, address);
209 DBG("device %s audio state %u", address, state);
211 bdaddr2android(&dev->bdaddr, ev.bdaddr);
214 ipc_send_notif(hal_ipc, HAL_SERVICE_ID_HANDSFREE,
215 HAL_EV_HANDSFREE_AUDIO_STATE, sizeof(ev), &ev);
218 static void init_codecs(struct hf_device *dev)
220 memcpy(dev->codecs, codecs_defaults, sizeof(dev->codecs));
222 if (hfp_ag_features & HFP_AG_FEAT_CODEC)
223 dev->codecs[MSBC_OFFSET].local_supported = true;
226 static struct hf_device *device_create(const bdaddr_t *bdaddr)
228 struct hf_device *dev;
230 dev = new0(struct hf_device, 1);
234 bacpy(&dev->bdaddr, bdaddr);
235 dev->setup_state = HAL_HANDSFREE_CALL_STATE_IDLE;
236 dev->state = HAL_EV_HANDSFREE_CONN_STATE_DISCONNECTED;
237 dev->audio_state = HAL_EV_HANDSFREE_AUDIO_STATE_DISCONNECTED;
239 memcpy(dev->inds, inds_defaults, sizeof(dev->inds));
243 if (!queue_push_head(devices, dev)) {
251 static void device_destroy(struct hf_device *dev)
253 hfp_gw_unref(dev->gw);
256 g_source_remove(dev->delay_sco);
258 if (dev->audio_state == HAL_EV_HANDSFREE_AUDIO_STATE_CONNECTED)
259 bt_sco_disconnect(sco);
262 g_source_remove(dev->ring);
266 if (dev->call_hanging_up)
267 g_source_remove(dev->call_hanging_up);
269 set_audio_state(dev, HAL_EV_HANDSFREE_AUDIO_STATE_DISCONNECTED);
270 set_state(dev, HAL_EV_HANDSFREE_CONN_STATE_DISCONNECTED);
272 queue_remove(devices, dev);
276 static bool match_by_bdaddr(const void *data, const void *match_data)
278 const struct hf_device *dev = data;
279 const bdaddr_t *addr = match_data;
281 return !bacmp(&dev->bdaddr, addr);
284 static struct hf_device *find_device(const bdaddr_t *bdaddr)
286 if (!bacmp(bdaddr, BDADDR_ANY))
287 return queue_peek_head(devices);
289 return queue_find(devices, match_by_bdaddr, bdaddr);
292 static struct hf_device *get_device(const bdaddr_t *bdaddr)
294 struct hf_device *dev;
296 dev = find_device(bdaddr);
300 if (queue_length(devices) == max_hfp_clients)
303 return device_create(bdaddr);
306 static void disconnect_watch(void *user_data)
308 struct hf_device *dev = user_data;
315 static void at_cmd_unknown(const char *command, void *user_data)
317 struct hf_device *dev = user_data;
318 uint8_t buf[IPC_MTU];
319 struct hal_ev_handsfree_unknown_at *ev = (void *) buf;
321 bdaddr2android(&dev->bdaddr, ev->bdaddr);
323 /* copy while string including terminating NULL */
324 ev->len = strlen(command) + 1;
326 if (ev->len > IPC_MTU - sizeof(*ev)) {
327 hfp_gw_send_result(dev->gw, HFP_RESULT_ERROR);
331 memcpy(ev->buf, command, ev->len);
333 ipc_send_notif(hal_ipc, HAL_SERVICE_ID_HANDSFREE,
334 HAL_EV_HANDSFREE_UNKNOWN_AT, sizeof(*ev) + ev->len, ev);
337 static void at_cmd_vgm(struct hfp_context *context,
338 enum hfp_gw_cmd_type type, void *user_data)
340 struct hf_device *dev = user_data;
341 struct hal_ev_handsfree_volume ev;
347 case HFP_GW_CMD_TYPE_SET:
348 if (!hfp_context_get_number(context, &val) || val > 15)
351 if (hfp_context_has_next(context))
354 ev.type = HAL_HANDSFREE_VOLUME_TYPE_MIC;
356 bdaddr2android(&dev->bdaddr, ev.bdaddr);
358 ipc_send_notif(hal_ipc, HAL_SERVICE_ID_HANDSFREE,
359 HAL_EV_HANDSFREE_VOLUME, sizeof(ev), &ev);
361 /* Framework is not replying with result for AT+VGM */
362 hfp_gw_send_result(dev->gw, HFP_RESULT_OK);
364 case HFP_GW_CMD_TYPE_READ:
365 case HFP_GW_CMD_TYPE_TEST:
366 case HFP_GW_CMD_TYPE_COMMAND:
370 hfp_gw_send_result(dev->gw, HFP_RESULT_ERROR);
373 static void at_cmd_vgs(struct hfp_context *context,
374 enum hfp_gw_cmd_type type, void *user_data)
376 struct hf_device *dev = user_data;
377 struct hal_ev_handsfree_volume ev;
383 case HFP_GW_CMD_TYPE_SET:
384 if (!hfp_context_get_number(context, &val) || val > 15)
387 if (hfp_context_has_next(context))
390 ev.type = HAL_HANDSFREE_VOLUME_TYPE_SPEAKER;
392 bdaddr2android(&dev->bdaddr, ev.bdaddr);
394 ipc_send_notif(hal_ipc, HAL_SERVICE_ID_HANDSFREE,
395 HAL_EV_HANDSFREE_VOLUME, sizeof(ev), &ev);
397 /* Framework is not replying with result for AT+VGS */
398 hfp_gw_send_result(dev->gw, HFP_RESULT_OK);
400 case HFP_GW_CMD_TYPE_READ:
401 case HFP_GW_CMD_TYPE_TEST:
402 case HFP_GW_CMD_TYPE_COMMAND:
406 hfp_gw_send_result(dev->gw, HFP_RESULT_ERROR);
409 static void at_cmd_cops(struct hfp_context *context,
410 enum hfp_gw_cmd_type type, void *user_data)
412 struct hf_device *dev = user_data;
413 struct hal_ev_handsfree_cops ev;
417 case HFP_GW_CMD_TYPE_SET:
418 if (!hfp_context_get_number(context, &val) || val != 3)
421 if (!hfp_context_get_number(context, &val) || val != 0)
424 if (hfp_context_has_next(context))
427 hfp_gw_send_result(dev->gw, HFP_RESULT_OK);
429 case HFP_GW_CMD_TYPE_READ:
430 bdaddr2android(&dev->bdaddr, ev.bdaddr);
432 ipc_send_notif(hal_ipc, HAL_SERVICE_ID_HANDSFREE,
433 HAL_EV_HANDSFREE_COPS, sizeof(ev), &ev);
435 case HFP_GW_CMD_TYPE_TEST:
436 case HFP_GW_CMD_TYPE_COMMAND:
440 hfp_gw_send_result(dev->gw, HFP_RESULT_ERROR);
443 static void at_cmd_bia(struct hfp_context *context,
444 enum hfp_gw_cmd_type type, void *user_data)
446 struct hf_device *dev = user_data;
447 unsigned int val, i, def;
453 case HFP_GW_CMD_TYPE_SET:
454 for (i = 0; i < IND_COUNT; i++)
455 tmp[i] = dev->inds[i].active;
460 def = (i < IND_COUNT) ? dev->inds[i].active : 0;
462 if (!hfp_context_get_number_default(context, &val, def))
469 tmp[i] = val || dev->inds[i].always_active;
472 } while (hfp_context_has_next(context));
474 for (i = 0; i < IND_COUNT; i++)
475 dev->inds[i].active = tmp[i];
477 hfp_gw_send_result(dev->gw, HFP_RESULT_OK);
479 case HFP_GW_CMD_TYPE_TEST:
480 case HFP_GW_CMD_TYPE_READ:
481 case HFP_GW_CMD_TYPE_COMMAND:
486 hfp_gw_send_result(dev->gw, HFP_RESULT_ERROR);
489 static void at_cmd_a(struct hfp_context *context,
490 enum hfp_gw_cmd_type type, void *user_data)
492 struct hf_device *dev = user_data;
493 struct hal_ev_handsfree_answer ev;
498 case HFP_GW_CMD_TYPE_COMMAND:
499 if (hfp_context_has_next(context))
502 bdaddr2android(&dev->bdaddr, ev.bdaddr);
504 ipc_send_notif(hal_ipc, HAL_SERVICE_ID_HANDSFREE,
505 HAL_EV_HANDSFREE_ANSWER, sizeof(ev), &ev);
507 /* Framework is not replying with result for ATA */
508 hfp_gw_send_result(dev->gw, HFP_RESULT_OK);
510 case HFP_GW_CMD_TYPE_SET:
511 case HFP_GW_CMD_TYPE_READ:
512 case HFP_GW_CMD_TYPE_TEST:
516 hfp_gw_send_result(dev->gw, HFP_RESULT_ERROR);
519 static void at_cmd_d(struct hfp_context *context,
520 enum hfp_gw_cmd_type type, void *user_data)
522 struct hf_device *dev = user_data;
524 struct hal_ev_handsfree_dial *ev = (void *) buf;
530 case HFP_GW_CMD_TYPE_SET:
531 if (!hfp_context_get_unquoted_string(context,
532 (char *) ev->number, 255))
535 bdaddr2android(&dev->bdaddr, ev->bdaddr);
537 ev->number_len = strlen((char *) ev->number);
539 if (ev->number[ev->number_len - 1] != ';')
542 if (ev->number[0] == '>')
543 cnt = strspn((char *) ev->number + 1, "0123456789") + 1;
545 cnt = strspn((char *) ev->number, "0123456789ABC*#+");
547 if (cnt != ev->number_len - 1)
552 ipc_send_notif(hal_ipc, HAL_SERVICE_ID_HANDSFREE,
553 HAL_EV_HANDSFREE_DIAL,
554 sizeof(*ev) + ev->number_len, ev);
556 case HFP_GW_CMD_TYPE_READ:
557 case HFP_GW_CMD_TYPE_TEST:
558 case HFP_GW_CMD_TYPE_COMMAND:
562 hfp_gw_send_result(dev->gw, HFP_RESULT_ERROR);
565 static void at_cmd_ccwa(struct hfp_context *context,
566 enum hfp_gw_cmd_type type, void *user_data)
568 struct hf_device *dev = user_data;
574 case HFP_GW_CMD_TYPE_SET:
575 if (!hfp_context_get_number(context, &val) || val > 1)
578 if (hfp_context_has_next(context))
581 dev->ccwa_enabled = val;
583 hfp_gw_send_result(dev->gw, HFP_RESULT_OK);
585 case HFP_GW_CMD_TYPE_READ:
586 case HFP_GW_CMD_TYPE_TEST:
587 case HFP_GW_CMD_TYPE_COMMAND:
591 hfp_gw_send_result(dev->gw, HFP_RESULT_ERROR);
594 static void at_cmd_chup(struct hfp_context *context,
595 enum hfp_gw_cmd_type type, void *user_data)
597 struct hf_device *dev = user_data;
598 struct hal_ev_handsfree_hangup ev;
603 case HFP_GW_CMD_TYPE_COMMAND:
604 if (hfp_context_has_next(context))
607 bdaddr2android(&dev->bdaddr, ev.bdaddr);
609 ipc_send_notif(hal_ipc, HAL_SERVICE_ID_HANDSFREE,
610 HAL_EV_HANDSFREE_HANGUP, sizeof(ev), &ev);
612 /* Framework is not replying with result for AT+CHUP */
613 hfp_gw_send_result(dev->gw, HFP_RESULT_OK);
615 case HFP_GW_CMD_TYPE_READ:
616 case HFP_GW_CMD_TYPE_TEST:
617 case HFP_GW_CMD_TYPE_SET:
621 hfp_gw_send_result(dev->gw, HFP_RESULT_ERROR);
624 static void at_cmd_clcc(struct hfp_context *context,
625 enum hfp_gw_cmd_type type, void *user_data)
627 struct hf_device *dev = user_data;
628 struct hal_ev_handsfree_clcc ev;
633 case HFP_GW_CMD_TYPE_COMMAND:
634 if (hfp_context_has_next(context))
637 bdaddr2android(&dev->bdaddr, ev.bdaddr);
639 ipc_send_notif(hal_ipc, HAL_SERVICE_ID_HANDSFREE,
640 HAL_EV_HANDSFREE_CLCC, sizeof(ev), &ev);
642 case HFP_GW_CMD_TYPE_READ:
643 case HFP_GW_CMD_TYPE_TEST:
644 case HFP_GW_CMD_TYPE_SET:
648 hfp_gw_send_result(dev->gw, HFP_RESULT_ERROR);
651 static void at_cmd_cmee(struct hfp_context *context,
652 enum hfp_gw_cmd_type type, void *user_data)
654 struct hf_device *dev = user_data;
660 case HFP_GW_CMD_TYPE_SET:
661 if (!hfp_context_get_number(context, &val) || val > 1)
664 if (hfp_context_has_next(context))
667 dev->cmee_enabled = val;
669 hfp_gw_send_result(dev->gw, HFP_RESULT_OK);
671 case HFP_GW_CMD_TYPE_READ:
672 case HFP_GW_CMD_TYPE_TEST:
673 case HFP_GW_CMD_TYPE_COMMAND:
677 hfp_gw_send_result(dev->gw, HFP_RESULT_ERROR);
680 static void at_cmd_clip(struct hfp_context *context,
681 enum hfp_gw_cmd_type type, void *user_data)
683 struct hf_device *dev = user_data;
689 case HFP_GW_CMD_TYPE_SET:
690 if (!hfp_context_get_number(context, &val) || val > 1)
693 if (hfp_context_has_next(context))
696 dev->clip_enabled = val;
698 hfp_gw_send_result(dev->gw, HFP_RESULT_OK);
700 case HFP_GW_CMD_TYPE_READ:
701 case HFP_GW_CMD_TYPE_TEST:
702 case HFP_GW_CMD_TYPE_COMMAND:
706 hfp_gw_send_result(dev->gw, HFP_RESULT_ERROR);
709 static void at_cmd_vts(struct hfp_context *context,
710 enum hfp_gw_cmd_type type, void *user_data)
712 struct hf_device *dev = user_data;
713 struct hal_ev_handsfree_dtmf ev;
719 case HFP_GW_CMD_TYPE_SET:
720 if (!hfp_context_get_unquoted_string(context, str, 2))
723 if (!((str[0] >= '0' && str[0] <= '9') ||
724 (str[0] >= 'A' && str[0] <= 'D') ||
725 str[0] == '*' || str[0] == '#'))
728 if (hfp_context_has_next(context))
731 bdaddr2android(&dev->bdaddr, ev.bdaddr);
734 ipc_send_notif(hal_ipc, HAL_SERVICE_ID_HANDSFREE,
735 HAL_EV_HANDSFREE_DTMF, sizeof(ev), &ev);
737 /* Framework is not replying with result for AT+VTS */
738 hfp_gw_send_result(dev->gw, HFP_RESULT_OK);
740 case HFP_GW_CMD_TYPE_READ:
741 case HFP_GW_CMD_TYPE_TEST:
742 case HFP_GW_CMD_TYPE_COMMAND:
746 hfp_gw_send_result(dev->gw, HFP_RESULT_ERROR);
749 static void at_cmd_cnum(struct hfp_context *context,
750 enum hfp_gw_cmd_type type, void *user_data)
752 struct hf_device *dev = user_data;
753 struct hal_ev_handsfree_cnum ev;
758 case HFP_GW_CMD_TYPE_COMMAND:
759 if (hfp_context_has_next(context))
762 bdaddr2android(&dev->bdaddr, ev.bdaddr);
764 ipc_send_notif(hal_ipc, HAL_SERVICE_ID_HANDSFREE,
765 HAL_EV_HANDSFREE_CNUM, sizeof(ev), &ev);
767 case HFP_GW_CMD_TYPE_SET:
768 case HFP_GW_CMD_TYPE_READ:
769 case HFP_GW_CMD_TYPE_TEST:
773 hfp_gw_send_result(dev->gw, HFP_RESULT_ERROR);
776 static void at_cmd_binp(struct hfp_context *context,
777 enum hfp_gw_cmd_type type, void *user_data)
779 struct hf_device *dev = user_data;
785 hfp_gw_send_result(dev->gw, HFP_RESULT_ERROR);
788 static void at_cmd_bldn(struct hfp_context *context,
789 enum hfp_gw_cmd_type type, void *user_data)
791 struct hf_device *dev = user_data;
792 struct hal_ev_handsfree_dial ev;
797 case HFP_GW_CMD_TYPE_COMMAND:
798 if (hfp_context_has_next(context))
801 bdaddr2android(&dev->bdaddr, ev.bdaddr);
804 ipc_send_notif(hal_ipc, HAL_SERVICE_ID_HANDSFREE,
805 HAL_EV_HANDSFREE_DIAL, sizeof(ev), &ev);
807 case HFP_GW_CMD_TYPE_READ:
808 case HFP_GW_CMD_TYPE_TEST:
809 case HFP_GW_CMD_TYPE_SET:
813 hfp_gw_send_result(dev->gw, HFP_RESULT_ERROR);
816 static void at_cmd_bvra(struct hfp_context *context,
817 enum hfp_gw_cmd_type type, void *user_data)
819 struct hf_device *dev = user_data;
820 struct hal_ev_handsfree_vr_state ev;
826 case HFP_GW_CMD_TYPE_SET:
827 if (!hfp_context_get_number(context, &val) || val > 1)
830 if (hfp_context_has_next(context))
834 ev.state = HAL_HANDSFREE_VR_STARTED;
836 ev.state = HAL_HANDSFREE_VR_STOPPED;
838 bdaddr2android(&dev->bdaddr, ev.bdaddr);
840 ipc_send_notif(hal_ipc, HAL_SERVICE_ID_HANDSFREE,
841 HAL_EV_HANDSFREE_VR, sizeof(ev), &ev);
843 case HFP_GW_CMD_TYPE_READ:
844 case HFP_GW_CMD_TYPE_TEST:
845 case HFP_GW_CMD_TYPE_COMMAND:
849 hfp_gw_send_result(dev->gw, HFP_RESULT_ERROR);
852 static void at_cmd_nrec(struct hfp_context *context,
853 enum hfp_gw_cmd_type type, void *user_data)
855 struct hf_device *dev = user_data;
856 struct hal_ev_handsfree_nrec ev;
862 case HFP_GW_CMD_TYPE_SET:
864 * Android HAL defines start and stop parameter for NREC
865 * callback, but spec allows HF to only disable AG's NREC
866 * feature for SLC duration. Follow spec here.
868 if (!hfp_context_get_number(context, &val) || val != 0)
871 if (hfp_context_has_next(context))
874 ev.nrec = HAL_HANDSFREE_NREC_STOP;
875 bdaddr2android(&dev->bdaddr, ev.bdaddr);
877 ipc_send_notif(hal_ipc, HAL_SERVICE_ID_HANDSFREE,
878 HAL_EV_HANDSFREE_NREC, sizeof(ev), &ev);
880 /* Framework is not replying with context for AT+NREC */
881 hfp_gw_send_result(dev->gw, HFP_RESULT_OK);
883 case HFP_GW_CMD_TYPE_READ:
884 case HFP_GW_CMD_TYPE_TEST:
885 case HFP_GW_CMD_TYPE_COMMAND:
889 hfp_gw_send_result(dev->gw, HFP_RESULT_ERROR);
892 static void at_cmd_bsir(struct hfp_context *context,
893 enum hfp_gw_cmd_type type, void *user_data)
895 struct hf_device *dev = user_data;
901 hfp_gw_send_result(dev->gw, HFP_RESULT_ERROR);
904 static void at_cmd_btrh(struct hfp_context *context,
905 enum hfp_gw_cmd_type type, void *user_data)
907 struct hf_device *dev = user_data;
913 hfp_gw_send_result(dev->gw, HFP_RESULT_ERROR);
916 static void disconnect_sco_cb(const bdaddr_t *addr)
918 struct hf_device *dev;
922 dev = find_device(addr);
924 error("handsfree: Could not find device");
928 set_audio_state(dev, HAL_EV_HANDSFREE_AUDIO_STATE_DISCONNECTED);
931 static void select_codec(struct hf_device *dev, uint8_t codec_type)
933 uint8_t type = CODEC_ID_CVSD;
936 if (codec_type > 0) {
941 for (i = CODECS_COUNT - 1; i >= CVSD_OFFSET; i--) {
942 if (!dev->codecs[i].local_supported)
945 if (!dev->codecs[i].remote_supported)
948 type = dev->codecs[i].type;
953 dev->proposed_codec = type;
955 hfp_gw_send_info(dev->gw, "+BCS: %u", type);
958 static bool codec_negotiation_supported(struct hf_device *dev)
960 return (dev->features & HFP_HF_FEAT_CODEC) &&
961 (hfp_ag_features & HFP_AG_FEAT_CODEC);
964 static void connect_sco_cb(enum sco_status status, const bdaddr_t *addr)
966 struct hf_device *dev;
968 dev = find_device(addr);
970 error("handsfree: Connect sco failed, no device?");
974 if (status == SCO_STATUS_OK) {
975 set_audio_state(dev, HAL_EV_HANDSFREE_AUDIO_STATE_CONNECTED);
979 /* Try fallback to CVSD first */
980 if (codec_negotiation_supported(dev) &&
981 dev->negotiated_codec != CODEC_ID_CVSD) {
982 info("handsfree: trying fallback with CVSD");
983 select_codec(dev, CODEC_ID_CVSD);
987 error("handsfree: audio connect failed");
988 set_audio_state(dev, HAL_EV_HANDSFREE_AUDIO_STATE_DISCONNECTED);
991 static bool connect_sco(struct hf_device *dev)
993 uint16_t voice_settings;
995 if (codec_negotiation_supported(dev) &&
996 dev->negotiated_codec != CODEC_ID_CVSD)
997 voice_settings = BT_VOICE_TRANSPARENT;
999 voice_settings = BT_VOICE_CVSD_16BIT;
1001 if (!bt_sco_connect(sco, &dev->bdaddr, voice_settings))
1004 set_audio_state(dev, HAL_EV_HANDSFREE_AUDIO_STATE_CONNECTING);
1009 static gboolean connect_sco_delayed(void *data)
1011 struct hf_device *dev = data;
1017 if (connect_sco(dev))
1021 * we try connect to negotiated codec. If it fails, and it isn't
1022 * CVSD codec, try connect CVSD
1024 if (dev->negotiated_codec != CODEC_ID_CVSD)
1025 select_codec(dev, CODEC_ID_CVSD);
1030 static void at_cmd_bcc(struct hfp_context *result, enum hfp_gw_cmd_type type,
1033 struct hf_device *dev = user_data;
1038 case HFP_GW_CMD_TYPE_COMMAND:
1039 if (!codec_negotiation_supported(dev))
1042 if (hfp_context_has_next(result))
1045 hfp_gw_send_result(dev->gw, HFP_RESULT_OK);
1047 /* we haven't negotiated codec, start selection */
1048 if (!dev->negotiated_codec) {
1049 select_codec(dev, 0);
1053 /* Delay SCO connection so that OK response is send first */
1054 if (dev->delay_sco == 0)
1055 dev->delay_sco = g_idle_add(connect_sco_delayed, dev);
1057 case HFP_GW_CMD_TYPE_READ:
1058 case HFP_GW_CMD_TYPE_TEST:
1059 case HFP_GW_CMD_TYPE_SET:
1063 hfp_gw_send_result(dev->gw, HFP_RESULT_ERROR);
1066 static void at_cmd_bcs(struct hfp_context *result, enum hfp_gw_cmd_type type,
1069 struct hf_device *dev = user_data;
1075 case HFP_GW_CMD_TYPE_SET:
1076 if (!hfp_context_get_number(result, &val))
1079 if (hfp_context_has_next(result))
1082 /* Remote replied with other codec. Reply with error */
1083 if (dev->proposed_codec != val) {
1084 dev->proposed_codec = 0;
1088 dev->proposed_codec = 0;
1089 dev->negotiated_codec = val;
1091 hfp_gw_send_result(dev->gw, HFP_RESULT_OK);
1094 * Delay SCO connection so that OK response is send first,
1095 * then connect with negotiated parameters.
1097 if (dev->delay_sco == 0)
1098 dev->delay_sco = g_idle_add(connect_sco_delayed, dev);
1100 case HFP_GW_CMD_TYPE_READ:
1101 case HFP_GW_CMD_TYPE_TEST:
1102 case HFP_GW_CMD_TYPE_COMMAND:
1106 hfp_gw_send_result(dev->gw, HFP_RESULT_ERROR);
1109 static void at_cmd_ckpd(struct hfp_context *result, enum hfp_gw_cmd_type type,
1112 struct hf_device *dev = user_data;
1113 struct hal_ev_handsfree_hsp_key_press ev;
1119 case HFP_GW_CMD_TYPE_SET:
1120 if (!hfp_context_get_number(result, &val) || val != 200)
1123 if (hfp_context_has_next(result))
1126 bdaddr2android(&dev->bdaddr, ev.bdaddr);
1128 ipc_send_notif(hal_ipc, HAL_SERVICE_ID_HANDSFREE,
1129 HAL_EV_HANDSFREE_HSP_KEY_PRESS,
1132 hfp_gw_send_result(dev->gw, HFP_RESULT_OK);
1134 case HFP_GW_CMD_TYPE_READ:
1135 case HFP_GW_CMD_TYPE_TEST:
1136 case HFP_GW_CMD_TYPE_COMMAND:
1140 hfp_gw_send_result(dev->gw, HFP_RESULT_ERROR);
1143 static void register_post_slc_at(struct hf_device *dev)
1145 hfp_gw_set_command_handler(dev->gw, at_cmd_unknown, dev, NULL);
1148 hfp_gw_register(dev->gw, at_cmd_ckpd, "+CKPD", dev, NULL);
1149 hfp_gw_register(dev->gw, at_cmd_vgs, "+VGS", dev, NULL);
1150 hfp_gw_register(dev->gw, at_cmd_vgm, "+VGM", dev, NULL);
1154 hfp_gw_register(dev->gw, at_cmd_a, "A", dev, NULL);
1155 hfp_gw_register(dev->gw, at_cmd_d, "D", dev, NULL);
1156 hfp_gw_register(dev->gw, at_cmd_ccwa, "+CCWA", dev, NULL);
1157 hfp_gw_register(dev->gw, at_cmd_chup, "+CHUP", dev, NULL);
1158 hfp_gw_register(dev->gw, at_cmd_clcc, "+CLCC", dev, NULL);
1159 hfp_gw_register(dev->gw, at_cmd_cops, "+COPS", dev, NULL);
1160 hfp_gw_register(dev->gw, at_cmd_cmee, "+CMEE", dev, NULL);
1161 hfp_gw_register(dev->gw, at_cmd_clip, "+CLIP", dev, NULL);
1162 hfp_gw_register(dev->gw, at_cmd_vts, "+VTS", dev, NULL);
1163 hfp_gw_register(dev->gw, at_cmd_cnum, "+CNUM", dev, NULL);
1164 hfp_gw_register(dev->gw, at_cmd_bia, "+BIA", dev, NULL);
1165 hfp_gw_register(dev->gw, at_cmd_binp, "+BINP", dev, NULL);
1166 hfp_gw_register(dev->gw, at_cmd_bldn, "+BLDN", dev, NULL);
1167 hfp_gw_register(dev->gw, at_cmd_bvra, "+BVRA", dev, NULL);
1168 hfp_gw_register(dev->gw, at_cmd_nrec, "+NREC", dev, NULL);
1169 hfp_gw_register(dev->gw, at_cmd_vgs, "+VGS", dev, NULL);
1170 hfp_gw_register(dev->gw, at_cmd_vgm, "+VGM", dev, NULL);
1171 hfp_gw_register(dev->gw, at_cmd_bsir, "+BSIR", dev, NULL);
1172 hfp_gw_register(dev->gw, at_cmd_btrh, "+BTRH", dev, NULL);
1173 hfp_gw_register(dev->gw, at_cmd_bcc, "+BCC", dev, NULL);
1174 hfp_gw_register(dev->gw, at_cmd_bcs, "+BCS", dev, NULL);
1177 static void at_cmd_cmer(struct hfp_context *result, enum hfp_gw_cmd_type type,
1180 struct hf_device *dev = user_data;
1184 case HFP_GW_CMD_TYPE_SET:
1185 /* mode must be =3 */
1186 if (!hfp_context_get_number(result, &val) || val != 3)
1189 /* keyp is don't care */
1190 if (!hfp_context_get_number(result, &val))
1193 /* disp is don't care */
1194 if (!hfp_context_get_number(result, &val))
1197 /* ind must be 0 or 1 */
1198 if (!hfp_context_get_number(result, &val) || val > 1)
1201 dev->indicators_enabled = val;
1203 /* skip bfr if present */
1204 hfp_context_get_number(result, &val);
1206 if (hfp_context_has_next(result))
1209 hfp_gw_send_result(dev->gw, HFP_RESULT_OK);
1211 if (dev->features & HFP_HF_FEAT_3WAY)
1214 register_post_slc_at(dev);
1215 set_state(dev, HAL_EV_HANDSFREE_CONN_STATE_SLC_CONNECTED);
1217 case HFP_GW_CMD_TYPE_TEST:
1218 case HFP_GW_CMD_TYPE_READ:
1219 case HFP_GW_CMD_TYPE_COMMAND:
1223 hfp_gw_send_result(dev->gw, HFP_RESULT_ERROR);
1225 if (dev->state != HAL_EV_HANDSFREE_CONN_STATE_SLC_CONNECTED)
1226 hfp_gw_disconnect(dev->gw);
1229 static void at_cmd_cind(struct hfp_context *result, enum hfp_gw_cmd_type type,
1232 struct hf_device *dev = user_data;
1233 struct hal_ev_handsfree_cind ev;
1239 case HFP_GW_CMD_TYPE_TEST:
1242 * If device supports Codec Negotiation, AT+BAC should be
1245 if (codec_negotiation_supported(dev) &&
1246 !dev->codecs[CVSD_OFFSET].remote_supported)
1249 len = strlen("+CIND:") + 1;
1251 for (i = 0; i < IND_COUNT; i++) {
1252 len += strlen("(\"\",(X,X)),");
1253 len += strlen(dev->inds[i].name);
1256 buf = g_malloc(len);
1258 ptr = buf + sprintf(buf, "+CIND:");
1260 for (i = 0; i < IND_COUNT; i++) {
1261 ptr += sprintf(ptr, "(\"%s\",(%d%c%d)),",
1264 dev->inds[i].max == 1 ? ',' : '-',
1271 hfp_gw_send_info(dev->gw, "%s", buf);
1272 hfp_gw_send_result(dev->gw, HFP_RESULT_OK);
1276 case HFP_GW_CMD_TYPE_READ:
1277 bdaddr2android(&dev->bdaddr, ev.bdaddr);
1279 ipc_send_notif(hal_ipc, HAL_SERVICE_ID_HANDSFREE,
1280 HAL_EV_HANDSFREE_CIND, sizeof(ev), &ev);
1282 case HFP_GW_CMD_TYPE_SET:
1283 case HFP_GW_CMD_TYPE_COMMAND:
1287 hfp_gw_send_result(dev->gw, HFP_RESULT_ERROR);
1289 if (dev->state != HAL_EV_HANDSFREE_CONN_STATE_SLC_CONNECTED)
1290 hfp_gw_disconnect(dev->gw);
1293 static void at_cmd_brsf(struct hfp_context *result, enum hfp_gw_cmd_type type,
1296 struct hf_device *dev = user_data;
1300 case HFP_GW_CMD_TYPE_SET:
1301 if (!hfp_context_get_number(result, &feat))
1304 if (hfp_context_has_next(result))
1307 /* TODO verify features */
1308 dev->features = feat;
1310 hfp_gw_send_info(dev->gw, "+BRSF: %u", hfp_ag_features);
1311 hfp_gw_send_result(dev->gw, HFP_RESULT_OK);
1313 case HFP_GW_CMD_TYPE_READ:
1314 case HFP_GW_CMD_TYPE_TEST:
1315 case HFP_GW_CMD_TYPE_COMMAND:
1319 hfp_gw_send_result(dev->gw, HFP_RESULT_ERROR);
1321 if (dev->state != HAL_EV_HANDSFREE_CONN_STATE_SLC_CONNECTED)
1322 hfp_gw_disconnect(dev->gw);
1325 static void at_cmd_chld(struct hfp_context *result, enum hfp_gw_cmd_type type,
1328 struct hf_device *dev = user_data;
1329 struct hal_ev_handsfree_chld ev;
1335 case HFP_GW_CMD_TYPE_SET:
1336 if (!hfp_context_get_number(result, &val) || val > 3)
1339 /* No ECC support */
1340 if (hfp_context_has_next(result))
1343 /* value match HAL type */
1345 bdaddr2android(&dev->bdaddr, ev.bdaddr);
1347 ipc_send_notif(hal_ipc, HAL_SERVICE_ID_HANDSFREE,
1348 HAL_EV_HANDSFREE_CHLD, sizeof(ev), &ev);
1350 case HFP_GW_CMD_TYPE_TEST:
1351 hfp_gw_send_info(dev->gw, "+CHLD: (%s)", HFP_AG_CHLD);
1352 hfp_gw_send_result(dev->gw, HFP_RESULT_OK);
1354 register_post_slc_at(dev);
1355 set_state(dev, HAL_EV_HANDSFREE_CONN_STATE_SLC_CONNECTED);
1357 case HFP_GW_CMD_TYPE_READ:
1358 case HFP_GW_CMD_TYPE_COMMAND:
1362 hfp_gw_send_result(dev->gw, HFP_RESULT_ERROR);
1364 if (dev->state != HAL_EV_HANDSFREE_CONN_STATE_SLC_CONNECTED)
1365 hfp_gw_disconnect(dev->gw);
1368 static struct hfp_codec *find_codec_by_type(struct hf_device *dev, uint8_t type)
1372 for (i = 0; i < CODECS_COUNT; i++)
1373 if (type == dev->codecs[i].type)
1374 return &dev->codecs[i];
1379 static void at_cmd_bac(struct hfp_context *result, enum hfp_gw_cmd_type type,
1382 struct hf_device *dev = user_data;
1388 case HFP_GW_CMD_TYPE_SET:
1389 if (!codec_negotiation_supported(dev))
1392 /* set codecs to defaults */
1394 dev->negotiated_codec = 0;
1397 * At least CVSD mandatory codec must exist
1400 if (!hfp_context_get_number(result, &val) ||
1401 val != CODEC_ID_CVSD)
1404 dev->codecs[CVSD_OFFSET].remote_supported = true;
1406 if (hfp_context_get_number(result, &val)) {
1407 if (val != CODEC_ID_MSBC)
1410 dev->codecs[MSBC_OFFSET].remote_supported = true;
1413 while (hfp_context_has_next(result)) {
1414 struct hfp_codec *codec;
1416 if (!hfp_context_get_number(result, &val))
1419 codec = find_codec_by_type(dev, val);
1423 codec->remote_supported = true;
1426 hfp_gw_send_result(dev->gw, HFP_RESULT_OK);
1428 if (dev->proposed_codec)
1429 select_codec(dev, 0);
1431 case HFP_GW_CMD_TYPE_TEST:
1432 case HFP_GW_CMD_TYPE_READ:
1433 case HFP_GW_CMD_TYPE_COMMAND:
1438 hfp_gw_send_result(dev->gw, HFP_RESULT_ERROR);
1440 if (dev->state != HAL_EV_HANDSFREE_CONN_STATE_SLC_CONNECTED)
1441 hfp_gw_disconnect(dev->gw);
1444 static void register_slc_at(struct hf_device *dev)
1446 hfp_gw_register(dev->gw, at_cmd_brsf, "+BRSF", dev, NULL);
1447 hfp_gw_register(dev->gw, at_cmd_cind, "+CIND", dev, NULL);
1448 hfp_gw_register(dev->gw, at_cmd_cmer, "+CMER", dev, NULL);
1449 hfp_gw_register(dev->gw, at_cmd_chld, "+CHLD", dev, NULL);
1450 hfp_gw_register(dev->gw, at_cmd_bac, "+BAC", dev, NULL);
1453 static void connect_cb(GIOChannel *chan, GError *err, gpointer user_data)
1455 struct hf_device *dev = user_data;
1460 error("handsfree: connect failed (%s)", err->message);
1464 dev->gw = hfp_gw_new(g_io_channel_unix_get_fd(chan));
1468 g_io_channel_set_close_on_unref(chan, FALSE);
1470 hfp_gw_set_close_on_unref(dev->gw, true);
1471 hfp_gw_set_disconnect_handler(dev->gw, disconnect_watch, dev, NULL);
1474 register_post_slc_at(dev);
1475 set_state(dev, HAL_EV_HANDSFREE_CONN_STATE_CONNECTED);
1476 set_state(dev, HAL_EV_HANDSFREE_CONN_STATE_SLC_CONNECTED);
1480 register_slc_at(dev);
1481 set_state(dev, HAL_EV_HANDSFREE_CONN_STATE_CONNECTED);
1485 g_io_channel_shutdown(chan, TRUE, NULL);
1486 device_destroy(dev);
1489 static void confirm_cb(GIOChannel *chan, gpointer data)
1494 struct hf_device *dev;
1496 bt_io_get(chan, &err,
1497 BT_IO_OPT_DEST, address,
1498 BT_IO_OPT_DEST_BDADDR, &bdaddr,
1501 error("handsfree: confirm failed (%s)", err->message);
1506 DBG("incoming connect from %s", address);
1508 dev = get_device(&bdaddr);
1510 error("handsfree: Failed to get device object for %s", address);
1514 if (dev->state != HAL_EV_HANDSFREE_CONN_STATE_DISCONNECTED) {
1515 info("handsfree: refusing connection from %s", address);
1519 if (!bt_io_accept(chan, connect_cb, dev, NULL, NULL)) {
1520 error("handsfree: failed to accept connection");
1521 device_destroy(dev);
1525 dev->hsp = GPOINTER_TO_INT(data);
1527 set_state(dev, HAL_EV_HANDSFREE_CONN_STATE_CONNECTING);
1532 g_io_channel_shutdown(chan, TRUE, NULL);
1535 static void sdp_hsp_search_cb(sdp_list_t *recs, int err, gpointer data)
1537 struct hf_device *dev = data;
1539 GError *gerr = NULL;
1547 error("handsfree: unable to get SDP record: %s",
1552 sdp_uuid16_create(&class, HEADSET_SVCLASS_ID);
1554 /* Find record with proper service class */
1555 for (; recs; recs = recs->next) {
1556 sdp_record_t *rec = recs->data;
1558 if (rec && !sdp_uuid_cmp(&rec->svclass, &class))
1562 if (!recs || !recs->data) {
1563 info("handsfree: no valid HSP SDP records found");
1567 if (sdp_get_access_protos(recs->data, &protos) < 0) {
1568 error("handsfree: unable to get access protocols from record");
1572 /* TODO read remote version? */
1573 /* TODO read volume control support */
1575 channel = sdp_get_proto_port(protos, RFCOMM_UUID);
1576 sdp_list_foreach(protos, (sdp_list_func_t) sdp_list_free, NULL);
1577 sdp_list_free(protos, NULL);
1579 error("handsfree: unable to get RFCOMM channel from record");
1583 io = bt_io_connect(connect_cb, dev, NULL, &gerr,
1584 BT_IO_OPT_SOURCE_BDADDR, &adapter_addr,
1585 BT_IO_OPT_DEST_BDADDR, &dev->bdaddr,
1586 BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_MEDIUM,
1587 BT_IO_OPT_CHANNEL, channel,
1590 error("handsfree: unable to connect: %s", gerr->message);
1597 g_io_channel_unref(io);
1601 device_destroy(dev);
1604 static int sdp_search_hsp(struct hf_device *dev)
1608 sdp_uuid16_create(&uuid, HEADSET_SVCLASS_ID);
1610 return bt_search_service(&adapter_addr, &dev->bdaddr, &uuid,
1611 sdp_hsp_search_cb, dev, NULL, 0);
1614 static void sdp_hfp_search_cb(sdp_list_t *recs, int err, gpointer data)
1616 struct hf_device *dev = data;
1618 GError *gerr = NULL;
1626 error("handsfree: unable to get SDP record: %s",
1631 sdp_uuid16_create(&class, HANDSFREE_SVCLASS_ID);
1633 /* Find record with proper service class */
1634 for (; recs; recs = recs->next) {
1635 sdp_record_t *rec = recs->data;
1637 if (rec && !sdp_uuid_cmp(&rec->svclass, &class))
1641 if (!recs || !recs->data) {
1642 info("handsfree: no HFP SDP records found, trying HSP");
1644 if (sdp_search_hsp(dev) < 0) {
1645 error("handsfree: HSP SDP search failed");
1652 if (sdp_get_access_protos(recs->data, &protos) < 0) {
1653 error("handsfree: unable to get access protocols from record");
1657 channel = sdp_get_proto_port(protos, RFCOMM_UUID);
1658 sdp_list_foreach(protos, (sdp_list_func_t) sdp_list_free, NULL);
1659 sdp_list_free(protos, NULL);
1661 error("handsfree: unable to get RFCOMM channel from record");
1665 /* TODO read remote version? */
1667 io = bt_io_connect(connect_cb, dev, NULL, &gerr,
1668 BT_IO_OPT_SOURCE_BDADDR, &adapter_addr,
1669 BT_IO_OPT_DEST_BDADDR, &dev->bdaddr,
1670 BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_MEDIUM,
1671 BT_IO_OPT_CHANNEL, channel,
1674 error("handsfree: unable to connect: %s", gerr->message);
1679 g_io_channel_unref(io);
1683 device_destroy(dev);
1686 static int sdp_search_hfp(struct hf_device *dev)
1690 sdp_uuid16_create(&uuid, HANDSFREE_SVCLASS_ID);
1692 return bt_search_service(&adapter_addr, &dev->bdaddr, &uuid,
1693 sdp_hfp_search_cb, dev, NULL, 0);
1696 static void handle_connect(const void *buf, uint16_t len)
1698 const struct hal_cmd_handsfree_connect *cmd = buf;
1699 struct hf_device *dev;
1707 android2bdaddr(&cmd->bdaddr, &bdaddr);
1709 dev = get_device(&bdaddr);
1711 status = HAL_STATUS_FAILED;
1715 if (dev->state != HAL_EV_HANDSFREE_CONN_STATE_DISCONNECTED) {
1716 status = HAL_STATUS_FAILED;
1720 ba2str(&bdaddr, addr);
1721 DBG("connecting to %s", addr);
1723 /* prefer HFP over HSP */
1724 ret = hfp_server ? sdp_search_hfp(dev) : sdp_search_hsp(dev);
1726 error("handsfree: SDP search failed");
1727 device_destroy(dev);
1728 status = HAL_STATUS_FAILED;
1732 set_state(dev, HAL_EV_HANDSFREE_CONN_STATE_CONNECTING);
1734 status = HAL_STATUS_SUCCESS;
1737 ipc_send_rsp(hal_ipc, HAL_SERVICE_ID_HANDSFREE,
1738 HAL_OP_HANDSFREE_CONNECT, status);
1741 static void handle_disconnect(const void *buf, uint16_t len)
1743 const struct hal_cmd_handsfree_disconnect *cmd = buf;
1744 struct hf_device *dev;
1750 android2bdaddr(cmd->bdaddr, &bdaddr);
1752 dev = find_device(&bdaddr);
1754 status = HAL_STATUS_FAILED;
1758 if (dev->state == HAL_EV_HANDSFREE_CONN_STATE_DISCONNECTED) {
1759 status = HAL_STATUS_FAILED;
1763 if (dev->state == HAL_EV_HANDSFREE_CONN_STATE_DISCONNECTING) {
1764 status = HAL_STATUS_SUCCESS;
1768 if (dev->state == HAL_EV_HANDSFREE_CONN_STATE_CONNECTING) {
1769 device_destroy(dev);
1771 set_state(dev, HAL_EV_HANDSFREE_CONN_STATE_DISCONNECTING);
1772 hfp_gw_disconnect(dev->gw);
1775 status = HAL_STATUS_SUCCESS;
1778 ipc_send_rsp(hal_ipc, HAL_SERVICE_ID_HANDSFREE,
1779 HAL_OP_HANDSFREE_DISCONNECT, status);
1782 static bool disconnect_sco(struct hf_device *dev)
1784 if (dev->audio_state == HAL_EV_HANDSFREE_AUDIO_STATE_DISCONNECTED ||
1785 dev->audio_state == HAL_EV_HANDSFREE_AUDIO_STATE_DISCONNECTING)
1788 bt_sco_disconnect(sco);
1789 set_audio_state(dev, HAL_EV_HANDSFREE_AUDIO_STATE_DISCONNECTING);
1794 static bool connect_audio(struct hf_device *dev)
1796 if (dev->audio_state != HAL_EV_HANDSFREE_AUDIO_STATE_DISCONNECTED)
1799 /* we haven't negotiated codec, start selection */
1800 if (codec_negotiation_supported(dev) && !dev->negotiated_codec) {
1801 select_codec(dev, 0);
1805 return connect_sco(dev);
1808 static void handle_connect_audio(const void *buf, uint16_t len)
1810 const struct hal_cmd_handsfree_connect_audio *cmd = buf;
1811 struct hf_device *dev;
1817 android2bdaddr(cmd->bdaddr, &bdaddr);
1819 dev = find_device(&bdaddr);
1821 status = HAL_STATUS_FAILED;
1825 if (dev->audio_state != HAL_EV_HANDSFREE_AUDIO_STATE_DISCONNECTED) {
1826 status = HAL_STATUS_FAILED;
1830 status = connect_audio(dev) ? HAL_STATUS_SUCCESS : HAL_STATUS_FAILED;
1833 ipc_send_rsp(hal_ipc, HAL_SERVICE_ID_HANDSFREE,
1834 HAL_OP_HANDSFREE_CONNECT_AUDIO, status);
1837 static void handle_disconnect_audio(const void *buf, uint16_t len)
1839 const struct hal_cmd_handsfree_disconnect_audio *cmd = buf;
1840 struct hf_device *dev;
1846 android2bdaddr(cmd->bdaddr, &bdaddr);
1848 dev = find_device(&bdaddr);
1850 status = HAL_STATUS_FAILED;
1854 status = disconnect_sco(dev) ? HAL_STATUS_SUCCESS : HAL_STATUS_FAILED;
1857 ipc_send_rsp(hal_ipc, HAL_SERVICE_ID_HANDSFREE,
1858 HAL_OP_HANDSFREE_DISCONNECT_AUDIO, status);
1861 static void handle_start_vr(const void *buf, uint16_t len)
1863 const struct hal_cmd_handsfree_start_vr *cmd = buf;
1864 struct hf_device *dev;
1870 android2bdaddr(cmd->bdaddr, &bdaddr);
1872 dev = find_device(&bdaddr);
1874 status = HAL_STATUS_FAILED;
1878 if (dev->features & HFP_HF_FEAT_VR) {
1879 hfp_gw_send_info(dev->gw, "+BVRA: 1");
1880 status = HAL_STATUS_SUCCESS;
1882 status = HAL_STATUS_FAILED;
1886 ipc_send_rsp(hal_ipc, HAL_SERVICE_ID_HANDSFREE,
1887 HAL_OP_HANDSFREE_START_VR, status);
1890 static void handle_stop_vr(const void *buf, uint16_t len)
1892 const struct hal_cmd_handsfree_stop_vr *cmd = buf;
1893 struct hf_device *dev;
1899 android2bdaddr(cmd->bdaddr, &bdaddr);
1901 dev = find_device(&bdaddr);
1903 status = HAL_STATUS_FAILED;
1907 if (dev->features & HFP_HF_FEAT_VR) {
1908 hfp_gw_send_info(dev->gw, "+BVRA: 0");
1909 status = HAL_STATUS_SUCCESS;
1911 status = HAL_STATUS_FAILED;
1915 ipc_send_rsp(hal_ipc, HAL_SERVICE_ID_HANDSFREE,
1916 HAL_OP_HANDSFREE_STOP_VR, status);
1919 static void handle_volume_control(const void *buf, uint16_t len)
1921 const struct hal_cmd_handsfree_volume_control *cmd = buf;
1922 struct hf_device *dev;
1923 uint8_t status, volume;
1926 DBG("type=%u volume=%u", cmd->type, cmd->volume);
1928 android2bdaddr(cmd->bdaddr, &bdaddr);
1930 dev = find_device(&bdaddr);
1932 status = HAL_STATUS_FAILED;
1936 volume = cmd->volume > 15 ? 15 : cmd->volume;
1938 switch (cmd->type) {
1939 case HAL_HANDSFREE_VOLUME_TYPE_MIC:
1940 hfp_gw_send_info(dev->gw, "+VGM: %u", volume);
1942 status = HAL_STATUS_SUCCESS;
1944 case HAL_HANDSFREE_VOLUME_TYPE_SPEAKER:
1945 hfp_gw_send_info(dev->gw, "+VGS: %u", volume);
1947 status = HAL_STATUS_SUCCESS;
1950 status = HAL_STATUS_FAILED;
1955 ipc_send_rsp(hal_ipc, HAL_SERVICE_ID_HANDSFREE,
1956 HAL_OP_HANDSFREE_VOLUME_CONTROL, status);
1959 static void update_indicator(struct hf_device *dev, int ind, uint8_t val)
1961 DBG("ind=%u new=%u old=%u", ind, val, dev->inds[ind].val);
1963 if (dev->inds[ind].val == val)
1966 dev->inds[ind].val = val;
1968 if (!dev->indicators_enabled)
1971 if (!dev->inds[ind].active)
1974 /* indicator numbers in CIEV start from 1 */
1975 hfp_gw_send_info(dev->gw, "+CIEV: %u,%u", ind + 1, val);
1978 static void device_status_notif(void *data, void *user_data)
1980 struct hf_device *dev = data;
1981 struct hal_cmd_handsfree_device_status_notif *cmd = user_data;
1983 update_indicator(dev, IND_SERVICE, cmd->state);
1984 update_indicator(dev, IND_ROAM, cmd->type);
1985 update_indicator(dev, IND_SIGNAL, cmd->signal);
1986 update_indicator(dev, IND_BATTCHG, cmd->battery);
1989 static void handle_device_status_notif(const void *buf, uint16_t len)
1991 const struct hal_cmd_handsfree_device_status_notif *cmd = buf;
1996 if (queue_isempty(devices)) {
1997 status = HAL_STATUS_FAILED;
2001 /* Cast cmd to void as queue api needs that */
2002 queue_foreach(devices, device_status_notif, (void *) cmd);
2004 status = HAL_STATUS_SUCCESS;
2007 ipc_send_rsp(hal_ipc, HAL_SERVICE_ID_HANDSFREE,
2008 HAL_OP_HANDSFREE_DEVICE_STATUS_NOTIF, status);
2011 static void handle_cops(const void *buf, uint16_t len)
2013 const struct hal_cmd_handsfree_cops_response *cmd = buf;
2014 struct hf_device *dev;
2018 if (len != sizeof(*cmd) + cmd->len ||
2019 (cmd->len != 0 && cmd->buf[cmd->len - 1] != '\0')) {
2020 error("Invalid cops response command, terminating");
2027 android2bdaddr(cmd->bdaddr, &bdaddr);
2029 dev = find_device(&bdaddr);
2031 status = HAL_STATUS_FAILED;
2035 hfp_gw_send_info(dev->gw, "+COPS: 0,0,\"%.16s\"",
2036 cmd->len ? (char *) cmd->buf : "");
2038 hfp_gw_send_result(dev->gw, HFP_RESULT_OK);
2040 status = HAL_STATUS_SUCCESS;
2043 ipc_send_rsp(hal_ipc, HAL_SERVICE_ID_HANDSFREE,
2044 HAL_OP_HANDSFREE_COPS_RESPONSE, status);
2047 static unsigned int get_callsetup(uint8_t state)
2050 case HAL_HANDSFREE_CALL_STATE_INCOMING:
2052 case HAL_HANDSFREE_CALL_STATE_DIALING:
2054 case HAL_HANDSFREE_CALL_STATE_ALERTING:
2061 static void handle_cind(const void *buf, uint16_t len)
2063 const struct hal_cmd_handsfree_cind_response *cmd = buf;
2064 struct hf_device *dev;
2070 android2bdaddr(cmd->bdaddr, &bdaddr);
2072 dev = find_device(&bdaddr);
2074 status = HAL_STATUS_FAILED;
2078 /* HAL doesn't provide indicators values so need to convert here */
2079 dev->inds[IND_SERVICE].val = cmd->svc;
2080 dev->inds[IND_CALL].val = !!(cmd->num_active + cmd->num_held);
2081 dev->inds[IND_CALLSETUP].val = get_callsetup(cmd->state);
2082 dev->inds[IND_CALLHELD].val = cmd->num_held ?
2083 (cmd->num_active ? 1 : 2) : 0;
2084 dev->inds[IND_SIGNAL].val = cmd->signal;
2085 dev->inds[IND_ROAM].val = cmd->roam;
2086 dev->inds[IND_BATTCHG].val = cmd->batt_chg;
2088 /* Order must match indicators_defaults table */
2089 hfp_gw_send_info(dev->gw, "+CIND: %u,%u,%u,%u,%u,%u,%u",
2090 dev->inds[IND_SERVICE].val,
2091 dev->inds[IND_CALL].val,
2092 dev->inds[IND_CALLSETUP].val,
2093 dev->inds[IND_CALLHELD].val,
2094 dev->inds[IND_SIGNAL].val,
2095 dev->inds[IND_ROAM].val,
2096 dev->inds[IND_BATTCHG].val);
2098 hfp_gw_send_result(dev->gw, HFP_RESULT_OK);
2100 status = HAL_STATUS_SUCCESS;
2103 ipc_send_rsp(hal_ipc, HAL_SERVICE_ID_HANDSFREE,
2104 HAL_OP_HANDSFREE_CIND_RESPONSE, status);
2107 static void handle_formatted_at_resp(const void *buf, uint16_t len)
2109 const struct hal_cmd_handsfree_formatted_at_response *cmd = buf;
2110 struct hf_device *dev;
2116 if (len != sizeof(*cmd) + cmd->len ||
2117 (cmd->len != 0 && cmd->buf[cmd->len - 1] != '\0')) {
2118 error("Invalid formatted AT response command, terminating");
2123 android2bdaddr(cmd->bdaddr, &bdaddr);
2125 dev = find_device(&bdaddr);
2127 status = HAL_STATUS_FAILED;
2131 hfp_gw_send_info(dev->gw, "%s", cmd->len ? (char *) cmd->buf : "");
2133 status = HAL_STATUS_SUCCESS;
2136 ipc_send_rsp(hal_ipc, HAL_SERVICE_ID_HANDSFREE,
2137 HAL_OP_HANDSFREE_FORMATTED_AT_RESPONSE, status);
2140 static void handle_at_resp(const void *buf, uint16_t len)
2142 const struct hal_cmd_handsfree_at_response *cmd = buf;
2143 struct hf_device *dev;
2149 android2bdaddr(cmd->bdaddr, &bdaddr);
2151 dev = find_device(&bdaddr);
2153 status = HAL_STATUS_FAILED;
2157 if (cmd->response == HAL_HANDSFREE_AT_RESPONSE_OK)
2158 hfp_gw_send_result(dev->gw, HFP_RESULT_OK);
2159 else if (dev->cmee_enabled)
2160 hfp_gw_send_error(dev->gw, cmd->error);
2162 hfp_gw_send_result(dev->gw, HFP_RESULT_ERROR);
2164 status = HAL_STATUS_SUCCESS;
2167 ipc_send_rsp(hal_ipc, HAL_SERVICE_ID_HANDSFREE,
2168 HAL_OP_HANDSFREE_AT_RESPONSE, status);
2171 static void handle_clcc_resp(const void *buf, uint16_t len)
2173 const struct hal_cmd_handsfree_clcc_response *cmd = buf;
2174 struct hf_device *dev;
2179 if (len != sizeof(*cmd) + cmd->number_len || (cmd->number_len != 0 &&
2180 cmd->number[cmd->number_len - 1] != '\0')) {
2181 error("Invalid CLCC response command, terminating");
2188 android2bdaddr(cmd->bdaddr, &bdaddr);
2190 dev = find_device(&bdaddr);
2192 status = HAL_STATUS_FAILED;
2197 hfp_gw_send_result(dev->gw, HFP_RESULT_OK);
2199 status = HAL_STATUS_SUCCESS;
2203 number = cmd->number_len ? (char *) cmd->number : "";
2205 switch (cmd->state) {
2206 case HAL_HANDSFREE_CALL_STATE_INCOMING:
2207 case HAL_HANDSFREE_CALL_STATE_WAITING:
2208 case HAL_HANDSFREE_CALL_STATE_ACTIVE:
2209 case HAL_HANDSFREE_CALL_STATE_HELD:
2210 case HAL_HANDSFREE_CALL_STATE_DIALING:
2211 case HAL_HANDSFREE_CALL_STATE_ALERTING:
2212 if (cmd->type == HAL_HANDSFREE_CALL_ADDRTYPE_INTERNATIONAL &&
2214 hfp_gw_send_info(dev->gw,
2215 "+CLCC: %u,%u,%u,%u,%u,\"+%s\",%u",
2216 cmd->index, cmd->dir, cmd->state,
2217 cmd->mode, cmd->mpty, number,
2220 hfp_gw_send_info(dev->gw,
2221 "+CLCC: %u,%u,%u,%u,%u,\"%s\",%u",
2222 cmd->index, cmd->dir, cmd->state,
2223 cmd->mode, cmd->mpty, number,
2226 status = HAL_STATUS_SUCCESS;
2228 case HAL_HANDSFREE_CALL_STATE_IDLE:
2230 status = HAL_STATUS_FAILED;
2235 ipc_send_rsp(hal_ipc, HAL_SERVICE_ID_HANDSFREE,
2236 HAL_OP_HANDSFREE_CLCC_RESPONSE, status);
2239 static gboolean ring_cb(gpointer user_data)
2241 struct hf_device *dev = user_data;
2243 hfp_gw_send_info(dev->gw, "RING");
2245 if (dev->clip_enabled && dev->clip)
2246 hfp_gw_send_info(dev->gw, "%s", dev->clip);
2251 static void phone_state_dialing(struct hf_device *dev, int num_active,
2254 if (dev->call_hanging_up) {
2255 g_source_remove(dev->call_hanging_up);
2256 dev->call_hanging_up = 0;
2259 update_indicator(dev, IND_CALLSETUP, 2);
2261 if (num_active == 0 && num_held > 0)
2262 update_indicator(dev, IND_CALLHELD, 2);
2264 if (dev->num_active == 0 && dev->num_held == 0)
2268 static void phone_state_alerting(struct hf_device *dev, int num_active,
2271 if (dev->call_hanging_up) {
2272 g_source_remove(dev->call_hanging_up);
2273 dev->call_hanging_up = 0;
2276 update_indicator(dev, IND_CALLSETUP, 3);
2279 static void phone_state_waiting(struct hf_device *dev, int num_active,
2280 int num_held, uint8_t type,
2281 const uint8_t *number, int number_len)
2285 if (!dev->ccwa_enabled)
2288 num = number_len ? (char *) number : "";
2290 if (type == HAL_HANDSFREE_CALL_ADDRTYPE_INTERNATIONAL && num[0] != '+')
2291 hfp_gw_send_info(dev->gw, "+CCWA: \"+%s\",%u", num, type);
2293 hfp_gw_send_info(dev->gw, "+CCWA: \"%s\",%u", num, type);
2295 update_indicator(dev, IND_CALLSETUP, 1);
2298 static void phone_state_incoming(struct hf_device *dev, int num_active,
2299 int num_held, uint8_t type,
2300 const uint8_t *number, int number_len)
2304 if (dev->setup_state == HAL_HANDSFREE_CALL_STATE_INCOMING) {
2305 if (dev->num_active != num_active ||
2306 dev->num_held != num_held) {
2307 if (dev->num_active == num_held &&
2308 dev->num_held == num_active)
2311 * calls changed while waiting call ie. due to
2312 * termination of active call
2314 update_indicator(dev, IND_CALLHELD,
2315 num_held ? (num_active ? 1 : 2) : 0);
2316 update_indicator(dev, IND_CALL,
2317 !!(num_active + num_held));
2323 if (dev->call_hanging_up)
2326 if (num_active > 0 || num_held > 0) {
2327 phone_state_waiting(dev, num_active, num_held, type, number,
2332 update_indicator(dev, IND_CALLSETUP, 1);
2334 num = number_len ? (char *) number : "";
2336 if (type == HAL_HANDSFREE_CALL_ADDRTYPE_INTERNATIONAL && num[0] != '+')
2337 dev->clip = g_strdup_printf("+CLIP: \"+%s\",%u", num, type);
2339 dev->clip = g_strdup_printf("+CLIP: \"%s\",%u", num, type);
2341 /* send first RING */
2344 dev->ring = g_timeout_add_seconds_full(G_PRIORITY_DEFAULT,
2345 RING_TIMEOUT, ring_cb,
2353 static gboolean hang_up_cb(gpointer user_data)
2355 struct hf_device *dev = user_data;
2359 dev->call_hanging_up = 0;
2364 static void phone_state_idle(struct hf_device *dev, int num_active,
2368 g_source_remove(dev->ring);
2377 switch (dev->setup_state) {
2378 case HAL_HANDSFREE_CALL_STATE_INCOMING:
2379 if (num_active > dev->num_active) {
2380 update_indicator(dev, IND_CALL, 1);
2382 if (dev->num_active == 0 && dev->num_held == 0)
2386 if (num_held >= dev->num_held && num_held != 0)
2387 update_indicator(dev, IND_CALLHELD, 1);
2389 update_indicator(dev, IND_CALLSETUP, 0);
2391 if (num_active == 0 && num_held == 0 &&
2392 num_active == dev->num_active &&
2393 num_held == dev->num_held)
2394 dev->call_hanging_up = g_timeout_add(800, hang_up_cb,
2397 case HAL_HANDSFREE_CALL_STATE_DIALING:
2398 case HAL_HANDSFREE_CALL_STATE_ALERTING:
2399 if (num_active > dev->num_active)
2400 update_indicator(dev, IND_CALL, 1);
2402 update_indicator(dev, IND_CALLHELD,
2403 num_held ? (num_active ? 1 : 2) : 0);
2405 update_indicator(dev, IND_CALLSETUP, 0);
2407 /* disconnect SCO if we hang up while dialing or alerting */
2408 if (num_active == 0 && num_held == 0)
2409 disconnect_sco(dev);
2411 case HAL_HANDSFREE_CALL_STATE_IDLE:
2412 if (dev->call_hanging_up) {
2413 g_source_remove(dev->call_hanging_up);
2414 dev->call_hanging_up = 0;
2418 /* check if calls swapped */
2419 if (num_held != 0 && num_active != 0 &&
2420 dev->num_active == num_held &&
2421 dev->num_held == num_active) {
2422 /* TODO better way for forcing indicator */
2423 dev->inds[IND_CALLHELD].val = 0;
2424 } else if ((num_active > 0 || num_held > 0) &&
2425 dev->num_active == 0 &&
2426 dev->num_held == 0) {
2428 * If number of active or held calls change but there
2429 * was no call setup change this means that there were
2430 * calls present when headset was connected.
2433 } else if (num_active == 0 && num_held == 0) {
2434 disconnect_sco(dev);
2437 update_indicator(dev, IND_CALLHELD,
2438 num_held ? (num_active ? 1 : 2) : 0);
2439 update_indicator(dev, IND_CALL, !!(num_active + num_held));
2440 update_indicator(dev, IND_CALLSETUP, 0);
2442 /* If call was terminated due to carrier lost send NO CARRIER */
2443 if (num_active == 0 && num_held == 0 &&
2444 dev->inds[IND_SERVICE].val == 0 &&
2445 (dev->num_active > 0 || dev->num_held > 0))
2446 hfp_gw_send_info(dev->gw, "NO CARRIER");
2450 DBG("unhandled state %u", dev->setup_state);
2455 static void phone_state_change(void *data, void *user_data)
2457 struct hf_device *dev = data;
2458 struct hal_cmd_handsfree_phone_state_change *cmd = user_data;
2460 switch (cmd->state) {
2461 case HAL_HANDSFREE_CALL_STATE_DIALING:
2462 phone_state_dialing(dev, cmd->num_active, cmd->num_held);
2464 case HAL_HANDSFREE_CALL_STATE_ALERTING:
2465 phone_state_alerting(dev, cmd->num_active, cmd->num_held);
2467 case HAL_HANDSFREE_CALL_STATE_INCOMING:
2468 phone_state_incoming(dev, cmd->num_active, cmd->num_held,
2469 cmd->type, cmd->number,
2472 case HAL_HANDSFREE_CALL_STATE_IDLE:
2473 phone_state_idle(dev, cmd->num_active, cmd->num_held);
2476 DBG("unhandled new state %u (current state %u)", cmd->state,
2482 dev->num_active = cmd->num_active;
2483 dev->num_held = cmd->num_held;
2484 dev->setup_state = cmd->state;
2488 static void handle_phone_state_change(const void *buf, uint16_t len)
2490 const struct hal_cmd_handsfree_phone_state_change *cmd = buf;
2493 if (len != sizeof(*cmd) + cmd->number_len || (cmd->number_len != 0 &&
2494 cmd->number[cmd->number_len - 1] != '\0')) {
2495 error("Invalid phone state change command, terminating");
2500 DBG("active=%u hold=%u state=%u", cmd->num_active, cmd->num_held,
2503 if (queue_isempty(devices)) {
2504 status = HAL_STATUS_FAILED;
2508 /* Cast cmd to void as queue api needs that */
2509 queue_foreach(devices, phone_state_change, (void *) cmd);
2511 status = HAL_STATUS_SUCCESS;
2514 ipc_send_rsp(hal_ipc, HAL_SERVICE_ID_HANDSFREE,
2515 HAL_OP_HANDSFREE_PHONE_STATE_CHANGE, status);
2518 static void handle_configure_wbs(const void *buf, uint16_t len)
2520 const struct hal_cmd_handsfree_configure_wbs *cmd = buf;
2521 struct hf_device *dev;
2525 if (!(hfp_ag_features & HFP_AG_FEAT_CODEC)) {
2526 status = HAL_STATUS_FAILED;
2530 android2bdaddr(cmd->bdaddr, &bdaddr);
2532 dev = find_device(&bdaddr);
2534 status = HAL_STATUS_FAILED;
2538 if (dev->audio_state != HAL_EV_HANDSFREE_AUDIO_STATE_DISCONNECTED) {
2539 status = HAL_STATUS_FAILED;
2543 switch (cmd->config) {
2544 case HAL_HANDSFREE_WBS_NO:
2545 dev->codecs[MSBC_OFFSET].local_supported = false;
2547 case HAL_HANDSFREE_WBS_YES:
2548 dev->codecs[MSBC_OFFSET].local_supported = true;
2550 case HAL_HANDSFREE_WBS_NONE:
2553 status = HAL_STATUS_FAILED;
2558 * cleanup negotiated codec if WBS support was changed, it will be
2559 * renegotiated on next audio connection based on currently supported
2562 dev->negotiated_codec = 0;
2563 status = HAL_STATUS_SUCCESS;
2566 ipc_send_rsp(hal_ipc, HAL_SERVICE_ID_HANDSFREE,
2567 HAL_OP_HANDSFREE_CONFIGURE_WBS, status);
2570 static const struct ipc_handler cmd_handlers[] = {
2571 /* HAL_OP_HANDSFREE_CONNECT */
2572 { handle_connect, false,
2573 sizeof(struct hal_cmd_handsfree_connect) },
2574 /* HAL_OP_HANDSFREE_DISCONNECT */
2575 { handle_disconnect, false,
2576 sizeof(struct hal_cmd_handsfree_disconnect) },
2577 /* HAL_OP_HANDSFREE_CONNECT_AUDIO */
2578 { handle_connect_audio, false,
2579 sizeof(struct hal_cmd_handsfree_connect_audio) },
2580 /* HAL_OP_HANDSFREE_DISCONNECT_AUDIO */
2581 { handle_disconnect_audio, false,
2582 sizeof(struct hal_cmd_handsfree_disconnect_audio) },
2583 /* define HAL_OP_HANDSFREE_START_VR */
2584 { handle_start_vr, false, sizeof(struct hal_cmd_handsfree_start_vr) },
2585 /* define HAL_OP_HANDSFREE_STOP_VR */
2586 { handle_stop_vr, false, sizeof(struct hal_cmd_handsfree_stop_vr) },
2587 /* HAL_OP_HANDSFREE_VOLUME_CONTROL */
2588 { handle_volume_control, false,
2589 sizeof(struct hal_cmd_handsfree_volume_control) },
2590 /* HAL_OP_HANDSFREE_DEVICE_STATUS_NOTIF */
2591 { handle_device_status_notif, false,
2592 sizeof(struct hal_cmd_handsfree_device_status_notif) },
2593 /* HAL_OP_HANDSFREE_COPS_RESPONSE */
2594 { handle_cops, true,
2595 sizeof(struct hal_cmd_handsfree_cops_response) },
2596 /* HAL_OP_HANDSFREE_CIND_RESPONSE */
2597 { handle_cind, false,
2598 sizeof(struct hal_cmd_handsfree_cind_response) },
2599 /* HAL_OP_HANDSFREE_FORMATTED_AT_RESPONSE */
2600 { handle_formatted_at_resp, true,
2601 sizeof(struct hal_cmd_handsfree_formatted_at_response) },
2602 /* HAL_OP_HANDSFREE_AT_RESPONSE */
2603 { handle_at_resp, false,
2604 sizeof(struct hal_cmd_handsfree_at_response) },
2605 /* HAL_OP_HANDSFREE_CLCC_RESPONSE */
2606 { handle_clcc_resp, true,
2607 sizeof(struct hal_cmd_handsfree_clcc_response) },
2608 /* HAL_OP_HANDSFREE_PHONE_STATE_CHANGE */
2609 { handle_phone_state_change, true,
2610 sizeof(struct hal_cmd_handsfree_phone_state_change) },
2611 /* HAL_OP_HANDSFREE_CONFIGURE_WBS */
2612 { handle_configure_wbs, false,
2613 sizeof(struct hal_cmd_handsfree_configure_wbs) },
2616 static sdp_record_t *headset_ag_record(void)
2618 sdp_list_t *svclass_id, *pfseq, *apseq, *root;
2619 uuid_t root_uuid, svclass_uuid, ga_svclass_uuid;
2620 uuid_t l2cap_uuid, rfcomm_uuid;
2621 sdp_profile_desc_t profile;
2622 sdp_list_t *aproto, *proto[2];
2623 sdp_record_t *record;
2624 sdp_data_t *channel;
2625 uint8_t netid = 0x01;
2626 sdp_data_t *network;
2627 uint8_t ch = HSP_AG_CHANNEL;
2629 record = sdp_record_alloc();
2633 network = sdp_data_alloc(SDP_UINT8, &netid);
2635 sdp_record_free(record);
2639 sdp_uuid16_create(&root_uuid, PUBLIC_BROWSE_GROUP);
2640 root = sdp_list_append(NULL, &root_uuid);
2641 sdp_set_browse_groups(record, root);
2643 sdp_uuid16_create(&svclass_uuid, HEADSET_AGW_SVCLASS_ID);
2644 svclass_id = sdp_list_append(NULL, &svclass_uuid);
2645 sdp_uuid16_create(&ga_svclass_uuid, GENERIC_AUDIO_SVCLASS_ID);
2646 svclass_id = sdp_list_append(svclass_id, &ga_svclass_uuid);
2647 sdp_set_service_classes(record, svclass_id);
2649 sdp_uuid16_create(&profile.uuid, HEADSET_PROFILE_ID);
2650 profile.version = 0x0102;
2651 pfseq = sdp_list_append(NULL, &profile);
2652 sdp_set_profile_descs(record, pfseq);
2654 sdp_uuid16_create(&l2cap_uuid, L2CAP_UUID);
2655 proto[0] = sdp_list_append(NULL, &l2cap_uuid);
2656 apseq = sdp_list_append(NULL, proto[0]);
2658 sdp_uuid16_create(&rfcomm_uuid, RFCOMM_UUID);
2659 proto[1] = sdp_list_append(NULL, &rfcomm_uuid);
2660 channel = sdp_data_alloc(SDP_UINT8, &ch);
2661 proto[1] = sdp_list_append(proto[1], channel);
2662 apseq = sdp_list_append(apseq, proto[1]);
2664 aproto = sdp_list_append(NULL, apseq);
2665 sdp_set_access_protos(record, aproto);
2667 sdp_set_info_attr(record, "Voice Gateway", NULL, NULL);
2669 sdp_attr_add(record, SDP_ATTR_EXTERNAL_NETWORK, network);
2671 sdp_data_free(channel);
2672 sdp_list_free(proto[0], NULL);
2673 sdp_list_free(proto[1], NULL);
2674 sdp_list_free(apseq, NULL);
2675 sdp_list_free(pfseq, NULL);
2676 sdp_list_free(aproto, NULL);
2677 sdp_list_free(root, NULL);
2678 sdp_list_free(svclass_id, NULL);
2683 static bool confirm_sco_cb(const bdaddr_t *addr, uint16_t *voice_settings)
2686 struct hf_device *dev;
2688 ba2str(addr, address);
2690 DBG("incoming SCO connection from %s", address);
2692 dev = find_device(addr);
2693 if (!dev || dev->state != HAL_EV_HANDSFREE_CONN_STATE_SLC_CONNECTED) {
2694 error("handsfree: audio connection from %s rejected", address);
2698 /* If HF initiate SCO there must be no WBS used */
2699 *voice_settings = 0;
2701 set_audio_state(dev, HAL_EV_HANDSFREE_AUDIO_STATE_CONNECTING);
2705 static bool enable_hsp_ag(void)
2712 hsp_server = bt_io_listen(NULL, confirm_cb, GINT_TO_POINTER(true),
2714 BT_IO_OPT_SOURCE_BDADDR, &adapter_addr,
2715 BT_IO_OPT_CHANNEL, HSP_AG_CHANNEL,
2716 BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_MEDIUM,
2719 error("Failed to listen on Headset rfcomm: %s", err->message);
2724 rec = headset_ag_record();
2726 error("Failed to allocate Headset record");
2730 if (bt_adapter_add_record(rec, 0) < 0) {
2731 error("Failed to register Headset record");
2732 sdp_record_free(rec);
2736 hsp_record_id = rec->handle;
2740 g_io_channel_shutdown(hsp_server, TRUE, NULL);
2741 g_io_channel_unref(hsp_server);
2747 static void cleanup_hsp_ag(void)
2750 g_io_channel_shutdown(hsp_server, TRUE, NULL);
2751 g_io_channel_unref(hsp_server);
2755 if (hsp_record_id > 0) {
2756 bt_adapter_remove_record(hsp_record_id);
2761 static sdp_record_t *hfp_ag_record(void)
2763 sdp_list_t *svclass_id, *pfseq, *apseq, *root;
2764 uuid_t root_uuid, svclass_uuid, ga_svclass_uuid;
2765 uuid_t l2cap_uuid, rfcomm_uuid;
2766 sdp_profile_desc_t profile;
2767 sdp_list_t *aproto, *proto[2];
2768 sdp_record_t *record;
2769 sdp_data_t *channel, *features;
2770 uint8_t netid = 0x01;
2772 sdp_data_t *network;
2773 uint8_t ch = HFP_AG_CHANNEL;
2775 record = sdp_record_alloc();
2779 network = sdp_data_alloc(SDP_UINT8, &netid);
2781 sdp_record_free(record);
2785 sdp_uuid16_create(&root_uuid, PUBLIC_BROWSE_GROUP);
2786 root = sdp_list_append(NULL, &root_uuid);
2787 sdp_set_browse_groups(record, root);
2789 sdp_uuid16_create(&svclass_uuid, HANDSFREE_AGW_SVCLASS_ID);
2790 svclass_id = sdp_list_append(NULL, &svclass_uuid);
2791 sdp_uuid16_create(&ga_svclass_uuid, GENERIC_AUDIO_SVCLASS_ID);
2792 svclass_id = sdp_list_append(svclass_id, &ga_svclass_uuid);
2793 sdp_set_service_classes(record, svclass_id);
2795 sdp_uuid16_create(&profile.uuid, HANDSFREE_PROFILE_ID);
2796 profile.version = 0x0106;
2797 pfseq = sdp_list_append(NULL, &profile);
2798 sdp_set_profile_descs(record, pfseq);
2800 sdp_uuid16_create(&l2cap_uuid, L2CAP_UUID);
2801 proto[0] = sdp_list_append(NULL, &l2cap_uuid);
2802 apseq = sdp_list_append(NULL, proto[0]);
2804 sdp_uuid16_create(&rfcomm_uuid, RFCOMM_UUID);
2805 proto[1] = sdp_list_append(NULL, &rfcomm_uuid);
2806 channel = sdp_data_alloc(SDP_UINT8, &ch);
2807 proto[1] = sdp_list_append(proto[1], channel);
2808 apseq = sdp_list_append(apseq, proto[1]);
2810 /* Codec Negotiation bit in SDP feature is different then in BRSF */
2811 sdpfeat = hfp_ag_features & 0x0000003F;
2812 if (hfp_ag_features & HFP_AG_FEAT_CODEC)
2813 sdpfeat |= 0x00000020;
2815 sdpfeat &= ~0x00000020;
2817 features = sdp_data_alloc(SDP_UINT16, &sdpfeat);
2818 sdp_attr_add(record, SDP_ATTR_SUPPORTED_FEATURES, features);
2820 aproto = sdp_list_append(NULL, apseq);
2821 sdp_set_access_protos(record, aproto);
2823 sdp_set_info_attr(record, "Hands-Free Audio Gateway", NULL, NULL);
2825 sdp_attr_add(record, SDP_ATTR_EXTERNAL_NETWORK, network);
2827 sdp_data_free(channel);
2828 sdp_list_free(proto[0], NULL);
2829 sdp_list_free(proto[1], NULL);
2830 sdp_list_free(apseq, NULL);
2831 sdp_list_free(pfseq, NULL);
2832 sdp_list_free(aproto, NULL);
2833 sdp_list_free(root, NULL);
2834 sdp_list_free(svclass_id, NULL);
2839 static bool enable_hfp_ag(void)
2849 hfp_server = bt_io_listen(NULL, confirm_cb, GINT_TO_POINTER(false),
2851 BT_IO_OPT_SOURCE_BDADDR, &adapter_addr,
2852 BT_IO_OPT_CHANNEL, HFP_AG_CHANNEL,
2853 BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_MEDIUM,
2856 error("Failed to listen on Handsfree rfcomm: %s", err->message);
2861 rec = hfp_ag_record();
2863 error("Failed to allocate Handsfree record");
2867 if (bt_adapter_add_record(rec, 0) < 0) {
2868 error("Failed to register Handsfree record");
2869 sdp_record_free(rec);
2873 hfp_record_id = rec->handle;
2877 g_io_channel_shutdown(hfp_server, TRUE, NULL);
2878 g_io_channel_unref(hfp_server);
2884 static void cleanup_hfp_ag(void)
2887 g_io_channel_shutdown(hfp_server, TRUE, NULL);
2888 g_io_channel_unref(hfp_server);
2892 if (hfp_record_id > 0) {
2893 bt_adapter_remove_record(hfp_record_id);
2898 static void bt_sco_get_fd(const void *buf, uint16_t len)
2900 const struct sco_cmd_get_fd *cmd = buf;
2901 struct sco_rsp_get_fd rsp;
2902 struct hf_device *dev;
2908 android2bdaddr(cmd->bdaddr, &bdaddr);
2910 dev = find_device(&bdaddr);
2911 if (!dev || !bt_sco_get_fd_and_mtu(sco, &fd, &rsp.mtu))
2914 DBG("fd %d mtu %u", fd, rsp.mtu);
2916 ipc_send_rsp_full(sco_ipc, SCO_SERVICE_ID, SCO_OP_GET_FD,
2917 sizeof(rsp), &rsp, fd);
2922 ipc_send_rsp(sco_ipc, SCO_SERVICE_ID, SCO_OP_STATUS, SCO_STATUS_FAILED);
2925 static const struct ipc_handler sco_handlers[] = {
2927 { bt_sco_get_fd, false, 0 }
2930 static void bt_sco_unregister(void)
2934 ipc_cleanup(sco_ipc);
2938 static bool bt_sco_register(ipc_disconnect_cb disconnect)
2942 sco_ipc = ipc_init(BLUEZ_SCO_SK_PATH, sizeof(BLUEZ_SCO_SK_PATH),
2943 SCO_SERVICE_ID, false, disconnect, NULL);
2947 ipc_register(sco_ipc, SCO_SERVICE_ID, sco_handlers,
2948 G_N_ELEMENTS(sco_handlers));
2953 bool bt_handsfree_register(struct ipc *ipc, const bdaddr_t *addr, uint8_t mode,
2956 DBG("mode 0x%x max_clients %d", mode, max_clients);
2958 bacpy(&adapter_addr, addr);
2960 if (max_clients < 1)
2963 devices = queue_new();
2967 if (!enable_hsp_ag())
2970 sco = bt_sco_new(addr);
2974 bt_sco_set_confirm_cb(sco, confirm_sco_cb);
2975 bt_sco_set_connect_cb(sco, connect_sco_cb);
2976 bt_sco_set_disconnect_cb(sco, disconnect_sco_cb);
2978 if (mode == HAL_MODE_HANDSFREE_HSP_ONLY)
2981 hfp_ag_features = HFP_AG_FEATURES;
2983 if (mode == HAL_MODE_HANDSFREE_HFP_WBS)
2984 hfp_ag_features |= HFP_AG_FEAT_CODEC;
2986 if (enable_hfp_ag())
2991 hfp_ag_features = 0;
2995 queue_destroy(devices, NULL);
3002 ipc_register(hal_ipc, HAL_SERVICE_ID_HANDSFREE, cmd_handlers,
3003 G_N_ELEMENTS(cmd_handlers));
3005 bt_sco_register(NULL);
3007 max_hfp_clients = max_clients;
3012 void bt_handsfree_unregister(void)
3016 bt_sco_unregister();
3017 ipc_unregister(hal_ipc, HAL_SERVICE_ID_HANDSFREE);
3025 hfp_ag_features = 0;
3027 queue_destroy(devices, (queue_destroy_func_t) device_destroy);
3030 max_hfp_clients = 0;