1 /* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
2 * Use of this source code is governed by a BSD-style license that can be
3 * found in the LICENSE file.
4 */
5
6 #ifndef _GNU_SOURCE
7 #define _GNU_SOURCE /* for ppoll */
8 #endif
9
10 #include <dbus/dbus.h>
11
12 #include <errno.h>
13 #include <poll.h>
14 #include <stdbool.h>
15 #include <stdint.h>
16 #include <stdlib.h>
17 #include <string.h>
18 #include <sys/socket.h>
19 #include <syslog.h>
20
21 #include "bluetooth.h"
22 #include "cras_a2dp_endpoint.h"
23 #include "cras_bt_adapter.h"
24 #include "cras_bt_device.h"
25 #include "cras_bt_constants.h"
26 #include "cras_bt_io.h"
27 #include "cras_bt_profile.h"
28 #include "cras_hfp_ag_profile.h"
29 #include "cras_hfp_slc.h"
30 #include "cras_iodev.h"
31 #include "cras_iodev_list.h"
32 #include "cras_main_message.h"
33 #include "cras_system_state.h"
34 #include "cras_tm.h"
35 #include "utlist.h"
36
37 #define DEFAULT_HFP_MTU_BYTES 48
38
39
40 static const unsigned int PROFILE_SWITCH_DELAY_MS = 500;
41
42 /* Check profile connections every 2 seconds and rerty 30 times maximum.
43 * Attemp to connect profiles which haven't been ready every 3 retries.
44 */
45 static const unsigned int CONN_WATCH_PERIOD_MS = 2000;
46 static const unsigned int CONN_WATCH_MAX_RETRIES = 30;
47 static const unsigned int PROFILE_CONN_RETRIES = 3;
48
49 /* Object to represent a general bluetooth device, and used to
50 * associate with some CRAS modules if it supports audio.
51 * Members:
52 * conn - The dbus connection object used to send message to bluetoothd.
53 * object_path - Object path of the bluetooth device.
54 * adapter - The object path of the adapter associates with this device.
55 * address - The BT address of this device.
56 * name - The readable name of this device.
57 * bluetooth_class - The bluetooth class of this device.
58 * paired - If this device is paired.
59 * trusted - If this device is trusted.
60 * connected - If this devices is connected.
61 * connected_profiles - OR'ed all connected audio profiles.
62 * profiles - OR'ed by all audio profiles this device supports.
63 * bt_iodevs - The pointer to the cras_iodevs of this device.
64 * active_profile - The flag to indicate the active audio profile this
65 * device is currently using.
66 * conn_watch_retries - The retry count for conn_watch_timer.
67 * conn_watch_timer - The timer used to watch connected profiles and start
68 * BT audio input/ouput when all profiles are ready.
69 * suspend_timer - The timer used to suspend device.
70 * switch_profile_timer - The timer used to delay enabling iodev after
71 * profile switch.
72 * append_iodev_cb - The callback to trigger when an iodev is appended.
73 */
74 struct cras_bt_device {
75 DBusConnection *conn;
76 char *object_path;
77 char *adapter_obj_path;
78 char *address;
79 char *name;
80 uint32_t bluetooth_class;
81 int paired;
82 int trusted;
83 int connected;
84 enum cras_bt_device_profile connected_profiles;
85 enum cras_bt_device_profile profiles;
86 struct cras_iodev *bt_iodevs[CRAS_NUM_DIRECTIONS];
87 unsigned int active_profile;
88 int use_hardware_volume;
89 int conn_watch_retries;
90 struct cras_timer *conn_watch_timer;
91 struct cras_timer *suspend_timer;
92 struct cras_timer *switch_profile_timer;
93 void (*append_iodev_cb)(void *data);
94
95 struct cras_bt_device *prev, *next;
96 };
97
98 enum BT_DEVICE_COMMAND {
99 BT_DEVICE_CANCEL_SUSPEND,
100 BT_DEVICE_SCHEDULE_SUSPEND,
101 BT_DEVICE_SWITCH_PROFILE,
102 BT_DEVICE_SWITCH_PROFILE_ENABLE_DEV,
103 };
104
105 struct bt_device_msg {
106 struct cras_main_message header;
107 enum BT_DEVICE_COMMAND cmd;
108 struct cras_bt_device *device;
109 struct cras_iodev *dev;
110 unsigned int arg;
111 };
112
113 static struct cras_bt_device *devices;
114
cras_bt_device_set_append_iodev_cb(struct cras_bt_device * device,void (* cb)(void * data))115 void cras_bt_device_set_append_iodev_cb(struct cras_bt_device *device,
116 void (*cb)(void *data))
117 {
118 device->append_iodev_cb = cb;
119 }
120
cras_bt_device_profile_from_uuid(const char * uuid)121 enum cras_bt_device_profile cras_bt_device_profile_from_uuid(const char *uuid)
122 {
123 if (strcmp(uuid, HSP_HS_UUID) == 0)
124 return CRAS_BT_DEVICE_PROFILE_HSP_HEADSET;
125 else if (strcmp(uuid, HSP_AG_UUID) == 0)
126 return CRAS_BT_DEVICE_PROFILE_HSP_AUDIOGATEWAY;
127 else if (strcmp(uuid, HFP_HF_UUID) == 0)
128 return CRAS_BT_DEVICE_PROFILE_HFP_HANDSFREE;
129 else if (strcmp(uuid, HFP_AG_UUID) == 0)
130 return CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY;
131 else if (strcmp(uuid, A2DP_SOURCE_UUID) == 0)
132 return CRAS_BT_DEVICE_PROFILE_A2DP_SOURCE;
133 else if (strcmp(uuid, A2DP_SINK_UUID) == 0)
134 return CRAS_BT_DEVICE_PROFILE_A2DP_SINK;
135 else if (strcmp(uuid, AVRCP_REMOTE_UUID) == 0)
136 return CRAS_BT_DEVICE_PROFILE_AVRCP_REMOTE;
137 else if (strcmp(uuid, AVRCP_TARGET_UUID) == 0)
138 return CRAS_BT_DEVICE_PROFILE_AVRCP_TARGET;
139 else
140 return 0;
141 }
142
cras_bt_device_create(DBusConnection * conn,const char * object_path)143 struct cras_bt_device *cras_bt_device_create(DBusConnection *conn,
144 const char *object_path)
145 {
146 struct cras_bt_device *device;
147
148 device = calloc(1, sizeof(*device));
149 if (device == NULL)
150 return NULL;
151
152 device->conn = conn;
153 device->object_path = strdup(object_path);
154 if (device->object_path == NULL) {
155 free(device);
156 return NULL;
157 }
158
159 DL_APPEND(devices, device);
160
161 return device;
162 }
163
on_connect_profile_reply(DBusPendingCall * pending_call,void * data)164 static void on_connect_profile_reply(DBusPendingCall *pending_call, void *data)
165 {
166 DBusMessage *reply;
167
168 reply = dbus_pending_call_steal_reply(pending_call);
169 dbus_pending_call_unref(pending_call);
170
171 if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR)
172 syslog(LOG_ERR, "Connect profile message replied error: %s",
173 dbus_message_get_error_name(reply));
174
175 dbus_message_unref(reply);
176 }
177
on_disconnect_reply(DBusPendingCall * pending_call,void * data)178 static void on_disconnect_reply(DBusPendingCall *pending_call, void *data)
179 {
180 DBusMessage *reply;
181
182 reply = dbus_pending_call_steal_reply(pending_call);
183 dbus_pending_call_unref(pending_call);
184
185 if (dbus_message_get_type(reply) == DBUS_MESSAGE_TYPE_ERROR)
186 syslog(LOG_ERR, "Disconnect message replied error");
187
188 dbus_message_unref(reply);
189 }
190
cras_bt_device_connect_profile(DBusConnection * conn,struct cras_bt_device * device,const char * uuid)191 int cras_bt_device_connect_profile(DBusConnection *conn,
192 struct cras_bt_device *device,
193 const char *uuid)
194 {
195 DBusMessage *method_call;
196 DBusError dbus_error;
197 DBusPendingCall *pending_call;
198
199 method_call = dbus_message_new_method_call(
200 BLUEZ_SERVICE,
201 device->object_path,
202 BLUEZ_INTERFACE_DEVICE,
203 "ConnectProfile");
204 if (!method_call)
205 return -ENOMEM;
206
207 if (!dbus_message_append_args(method_call,
208 DBUS_TYPE_STRING,
209 &uuid,
210 DBUS_TYPE_INVALID))
211 return -ENOMEM;
212
213 dbus_error_init(&dbus_error);
214
215 pending_call = NULL;
216 if (!dbus_connection_send_with_reply(conn,
217 method_call,
218 &pending_call,
219 DBUS_TIMEOUT_USE_DEFAULT)) {
220 dbus_message_unref(method_call);
221 syslog(LOG_ERR, "Failed to send Disconnect message");
222 return -EIO;
223 }
224
225 dbus_message_unref(method_call);
226 if (!dbus_pending_call_set_notify(pending_call,
227 on_connect_profile_reply,
228 conn, NULL)) {
229 dbus_pending_call_cancel(pending_call);
230 dbus_pending_call_unref(pending_call);
231 return -EIO;
232 }
233 return 0;
234 }
235
cras_bt_device_disconnect(DBusConnection * conn,struct cras_bt_device * device)236 int cras_bt_device_disconnect(DBusConnection *conn,
237 struct cras_bt_device *device)
238 {
239 DBusMessage *method_call;
240 DBusError dbus_error;
241 DBusPendingCall *pending_call;
242
243 method_call = dbus_message_new_method_call(
244 BLUEZ_SERVICE,
245 device->object_path,
246 BLUEZ_INTERFACE_DEVICE,
247 "Disconnect");
248 if (!method_call)
249 return -ENOMEM;
250
251 dbus_error_init(&dbus_error);
252
253 pending_call = NULL;
254 if (!dbus_connection_send_with_reply(conn,
255 method_call,
256 &pending_call,
257 DBUS_TIMEOUT_USE_DEFAULT)) {
258 dbus_message_unref(method_call);
259 syslog(LOG_ERR, "Failed to send Disconnect message");
260 return -EIO;
261 }
262
263 dbus_message_unref(method_call);
264 if (!dbus_pending_call_set_notify(pending_call,
265 on_disconnect_reply,
266 conn, NULL)) {
267 dbus_pending_call_cancel(pending_call);
268 dbus_pending_call_unref(pending_call);
269 return -EIO;
270 }
271 return 0;
272 }
273
cras_bt_device_destroy(struct cras_bt_device * device)274 void cras_bt_device_destroy(struct cras_bt_device *device)
275 {
276 struct cras_tm *tm = cras_system_state_get_tm();
277 DL_DELETE(devices, device);
278
279 if (device->conn_watch_timer)
280 cras_tm_cancel_timer(tm, device->conn_watch_timer);
281 if (device->switch_profile_timer)
282 cras_tm_cancel_timer(tm, device->switch_profile_timer);
283 if (device->suspend_timer)
284 cras_tm_cancel_timer(tm, device->suspend_timer);
285 free(device->object_path);
286 free(device->address);
287 free(device->name);
288 free(device);
289 }
290
cras_bt_device_reset()291 void cras_bt_device_reset()
292 {
293 while (devices) {
294 syslog(LOG_INFO, "Bluetooth Device: %s removed",
295 devices->address);
296 cras_bt_device_destroy(devices);
297 }
298 }
299
300
cras_bt_device_get(const char * object_path)301 struct cras_bt_device *cras_bt_device_get(const char *object_path)
302 {
303 struct cras_bt_device *device;
304
305 DL_FOREACH(devices, device) {
306 if (strcmp(device->object_path, object_path) == 0)
307 return device;
308 }
309
310 return NULL;
311 }
312
cras_bt_device_get_list(struct cras_bt_device *** device_list_out)313 size_t cras_bt_device_get_list(struct cras_bt_device ***device_list_out)
314 {
315 struct cras_bt_device *device;
316 struct cras_bt_device **device_list = NULL;
317 size_t num_devices = 0;
318
319 DL_FOREACH(devices, device) {
320 struct cras_bt_device **tmp;
321
322 tmp = realloc(device_list,
323 sizeof(device_list[0]) * (num_devices + 1));
324 if (!tmp) {
325 free(device_list);
326 return -ENOMEM;
327 }
328
329 device_list = tmp;
330 device_list[num_devices++] = device;
331 }
332
333 *device_list_out = device_list;
334 return num_devices;
335 }
336
cras_bt_device_object_path(const struct cras_bt_device * device)337 const char *cras_bt_device_object_path(const struct cras_bt_device *device)
338 {
339 return device->object_path;
340 }
341
cras_bt_device_adapter(const struct cras_bt_device * device)342 struct cras_bt_adapter *cras_bt_device_adapter(
343 const struct cras_bt_device *device)
344 {
345 return cras_bt_adapter_get(device->adapter_obj_path);
346 }
347
cras_bt_device_address(const struct cras_bt_device * device)348 const char *cras_bt_device_address(const struct cras_bt_device *device)
349 {
350 return device->address;
351 }
352
cras_bt_device_name(const struct cras_bt_device * device)353 const char *cras_bt_device_name(const struct cras_bt_device *device)
354 {
355 return device->name;
356 }
357
cras_bt_device_paired(const struct cras_bt_device * device)358 int cras_bt_device_paired(const struct cras_bt_device *device)
359 {
360 return device->paired;
361 }
362
cras_bt_device_trusted(const struct cras_bt_device * device)363 int cras_bt_device_trusted(const struct cras_bt_device *device)
364 {
365 return device->trusted;
366 }
367
cras_bt_device_connected(const struct cras_bt_device * device)368 int cras_bt_device_connected(const struct cras_bt_device *device)
369 {
370 return device->connected;
371 }
372
cras_bt_device_supports_profile(const struct cras_bt_device * device,enum cras_bt_device_profile profile)373 int cras_bt_device_supports_profile(const struct cras_bt_device *device,
374 enum cras_bt_device_profile profile)
375 {
376 return !!(device->profiles & profile);
377 }
378
cras_bt_device_append_iodev(struct cras_bt_device * device,struct cras_iodev * iodev,enum cras_bt_device_profile profile)379 void cras_bt_device_append_iodev(struct cras_bt_device *device,
380 struct cras_iodev *iodev,
381 enum cras_bt_device_profile profile)
382 {
383 struct cras_iodev *bt_iodev;
384
385 bt_iodev = device->bt_iodevs[iodev->direction];
386
387 if (bt_iodev) {
388 cras_bt_io_append(bt_iodev, iodev, profile);
389 } else {
390 if (device->append_iodev_cb) {
391 device->append_iodev_cb(device);
392 device->append_iodev_cb = NULL;
393 }
394 device->bt_iodevs[iodev->direction] =
395 cras_bt_io_create(device, iodev, profile);
396 }
397 }
398
399 static void bt_device_switch_profile(struct cras_bt_device *device,
400 struct cras_iodev *bt_iodev,
401 int enable_dev);
402
cras_bt_device_rm_iodev(struct cras_bt_device * device,struct cras_iodev * iodev)403 void cras_bt_device_rm_iodev(struct cras_bt_device *device,
404 struct cras_iodev *iodev)
405 {
406 struct cras_iodev *bt_iodev;
407 int rc;
408
409 bt_iodev = device->bt_iodevs[iodev->direction];
410 if (bt_iodev) {
411 unsigned try_profile;
412
413 /* Check what will the preffered profile be if we remove dev. */
414 try_profile = cras_bt_io_try_remove(bt_iodev, iodev);
415 if (!try_profile)
416 goto destroy_bt_io;
417
418 /* If the check result doesn't match with the active
419 * profile we are currently using, switch to the
420 * preffered profile before actually remove the iodev.
421 */
422 if (!cras_bt_io_on_profile(bt_iodev, try_profile)) {
423 device->active_profile = try_profile;
424 bt_device_switch_profile(device, bt_iodev, 0);
425 }
426 rc = cras_bt_io_remove(bt_iodev, iodev);
427 if (rc) {
428 syslog(LOG_ERR, "Fail to fallback to profile %u",
429 try_profile);
430 goto destroy_bt_io;
431 }
432 }
433 return;
434
435 destroy_bt_io:
436 device->bt_iodevs[iodev->direction] = NULL;
437 cras_bt_io_destroy(bt_iodev);
438
439 if (!device->bt_iodevs[CRAS_STREAM_INPUT] &&
440 !device->bt_iodevs[CRAS_STREAM_OUTPUT])
441 cras_bt_device_set_active_profile(device, 0);
442 }
443
cras_bt_device_a2dp_configured(struct cras_bt_device * device)444 void cras_bt_device_a2dp_configured(struct cras_bt_device *device)
445 {
446 device->connected_profiles |= CRAS_BT_DEVICE_PROFILE_A2DP_SINK;
447 }
448
cras_bt_device_has_a2dp(struct cras_bt_device * device)449 int cras_bt_device_has_a2dp(struct cras_bt_device *device)
450 {
451 struct cras_iodev *odev = device->bt_iodevs[CRAS_STREAM_OUTPUT];
452
453 /* Check if there is an output iodev with A2DP node attached. */
454 return odev && cras_bt_io_get_profile(
455 odev, CRAS_BT_DEVICE_PROFILE_A2DP_SOURCE);
456 }
457
cras_bt_device_can_switch_to_a2dp(struct cras_bt_device * device)458 int cras_bt_device_can_switch_to_a2dp(struct cras_bt_device *device)
459 {
460 struct cras_iodev *idev = device->bt_iodevs[CRAS_STREAM_INPUT];
461
462 return cras_bt_device_has_a2dp(device) &&
463 (!idev || !cras_iodev_is_open(idev));
464 }
465
cras_bt_device_audio_gateway_initialized(struct cras_bt_device * device)466 int cras_bt_device_audio_gateway_initialized(struct cras_bt_device *device)
467 {
468 int rc = 0;
469 struct cras_tm *tm;
470
471 /* Marks HFP/HSP as connected. This is what connection watcher
472 * checks. */
473 device->connected_profiles |=
474 (CRAS_BT_DEVICE_PROFILE_HFP_HANDSFREE |
475 CRAS_BT_DEVICE_PROFILE_HSP_HEADSET);
476
477 /* If this is a HFP/HSP only headset, no need to wait for A2DP. */
478 if (!cras_bt_device_supports_profile(
479 device, CRAS_BT_DEVICE_PROFILE_A2DP_SINK)) {
480
481 syslog(LOG_DEBUG,
482 "Start HFP audio gateway as A2DP is not supported");
483
484 rc = cras_hfp_ag_start(device);
485 if (rc) {
486 syslog(LOG_ERR, "Start audio gateway failed");
487 return rc;
488 }
489 if (device->conn_watch_timer) {
490 tm = cras_system_state_get_tm();
491 cras_tm_cancel_timer(tm, device->conn_watch_timer);
492 device->conn_watch_timer = NULL;
493 }
494 } else {
495 syslog(LOG_DEBUG, "HFP audio gateway is connected but A2DP "
496 "is not connected yet");
497 }
498
499 return rc;
500 }
501
cras_bt_device_get_active_profile(const struct cras_bt_device * device)502 int cras_bt_device_get_active_profile(const struct cras_bt_device *device)
503 {
504 return device->active_profile;
505 }
506
cras_bt_device_set_active_profile(struct cras_bt_device * device,unsigned int profile)507 void cras_bt_device_set_active_profile(struct cras_bt_device *device,
508 unsigned int profile)
509 {
510 device->active_profile = profile;
511 }
512
cras_bt_device_log_profile(const struct cras_bt_device * device,enum cras_bt_device_profile profile)513 static void cras_bt_device_log_profile(const struct cras_bt_device *device,
514 enum cras_bt_device_profile profile)
515 {
516 switch (profile) {
517 case CRAS_BT_DEVICE_PROFILE_HFP_HANDSFREE:
518 syslog(LOG_DEBUG, "Bluetooth Device: %s is HFP handsfree",
519 device->address);
520 break;
521 case CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY:
522 syslog(LOG_DEBUG, "Bluetooth Device: %s is HFP audio gateway",
523 device->address);
524 break;
525 case CRAS_BT_DEVICE_PROFILE_A2DP_SOURCE:
526 syslog(LOG_DEBUG, "Bluetooth Device: %s is A2DP source",
527 device->address);
528 break;
529 case CRAS_BT_DEVICE_PROFILE_A2DP_SINK:
530 syslog(LOG_DEBUG, "Bluetooth Device: %s is A2DP sink",
531 device->address);
532 break;
533 case CRAS_BT_DEVICE_PROFILE_AVRCP_REMOTE:
534 syslog(LOG_DEBUG, "Bluetooth Device: %s is AVRCP remote",
535 device->address);
536 break;
537 case CRAS_BT_DEVICE_PROFILE_AVRCP_TARGET:
538 syslog(LOG_DEBUG, "Bluetooth Device: %s is AVRCP target",
539 device->address);
540 break;
541 case CRAS_BT_DEVICE_PROFILE_HSP_HEADSET:
542 syslog(LOG_DEBUG, "Bluetooth Device: %s is HSP headset",
543 device->address);
544 break;
545 case CRAS_BT_DEVICE_PROFILE_HSP_AUDIOGATEWAY:
546 syslog(LOG_DEBUG, "Bluetooth Device: %s is HSP audio gateway",
547 device->address);
548 break;
549 }
550 }
551
cras_bt_device_is_profile_connected(const struct cras_bt_device * device,enum cras_bt_device_profile profile)552 static int cras_bt_device_is_profile_connected(
553 const struct cras_bt_device *device,
554 enum cras_bt_device_profile profile)
555 {
556 return !!(device->connected_profiles & profile);
557 }
558
559 static void bt_device_schedule_suspend(struct cras_bt_device *device,
560 unsigned int msec);
561
562 /* Callback used to periodically check if supported profiles are connected. */
bt_device_conn_watch_cb(struct cras_timer * timer,void * arg)563 static void bt_device_conn_watch_cb(struct cras_timer *timer, void *arg)
564 {
565 struct cras_tm *tm;
566 struct cras_bt_device *device = (struct cras_bt_device *)arg;
567
568 device->conn_watch_timer = NULL;
569
570 /* If A2DP is not ready, try connect it after a while. */
571 if (cras_bt_device_supports_profile(
572 device, CRAS_BT_DEVICE_PROFILE_A2DP_SINK) &&
573 !cras_bt_device_is_profile_connected(
574 device, CRAS_BT_DEVICE_PROFILE_A2DP_SINK)) {
575 if (0 == device->conn_watch_retries % PROFILE_CONN_RETRIES)
576 cras_bt_device_connect_profile(
577 device->conn, device, A2DP_SINK_UUID);
578 goto arm_retry_timer;
579 }
580
581 /* If HFP is not ready, try connect it after a while. */
582 if (cras_bt_device_supports_profile(
583 device, CRAS_BT_DEVICE_PROFILE_HFP_HANDSFREE) &&
584 !cras_bt_device_is_profile_connected(
585 device, CRAS_BT_DEVICE_PROFILE_HFP_HANDSFREE)) {
586 if (0 == device->conn_watch_retries % PROFILE_CONN_RETRIES)
587 cras_bt_device_connect_profile(
588 device->conn, device, HFP_HF_UUID);
589 goto arm_retry_timer;
590 }
591
592 if (cras_bt_device_is_profile_connected(
593 device, CRAS_BT_DEVICE_PROFILE_A2DP_SINK)) {
594 /* When A2DP-only device connected, suspend all HFP/HSP audio
595 * gateways. */
596 if (!cras_bt_device_supports_profile(device,
597 CRAS_BT_DEVICE_PROFILE_HFP_HANDSFREE |
598 CRAS_BT_DEVICE_PROFILE_HSP_HEADSET))
599 cras_hfp_ag_suspend();
600
601 cras_a2dp_start(device);
602 }
603
604 if (cras_bt_device_is_profile_connected(
605 device, CRAS_BT_DEVICE_PROFILE_HFP_HANDSFREE))
606 cras_hfp_ag_start(device);
607 return;
608
609 arm_retry_timer:
610
611 syslog(LOG_DEBUG, "conn_watch_retries: %d", device->conn_watch_retries);
612
613 if (--device->conn_watch_retries) {
614 tm = cras_system_state_get_tm();
615 device->conn_watch_timer = cras_tm_create_timer(tm,
616 CONN_WATCH_PERIOD_MS,
617 bt_device_conn_watch_cb, device);
618 } else {
619 syslog(LOG_ERR, "Connection watch timeout.");
620 bt_device_schedule_suspend(device, 0);
621 }
622 }
623
cras_bt_device_start_new_conn_watch_timer(struct cras_bt_device * device)624 static void cras_bt_device_start_new_conn_watch_timer(
625 struct cras_bt_device *device)
626 {
627 struct cras_tm *tm = cras_system_state_get_tm();
628
629 if (device->conn_watch_timer) {
630 cras_tm_cancel_timer(tm, device->conn_watch_timer);
631 }
632 device->conn_watch_retries = CONN_WATCH_MAX_RETRIES;
633 device->conn_watch_timer = cras_tm_create_timer(tm,
634 CONN_WATCH_PERIOD_MS,
635 bt_device_conn_watch_cb, device);
636 }
637
cras_bt_device_set_connected(struct cras_bt_device * device,int value)638 static void cras_bt_device_set_connected(struct cras_bt_device *device,
639 int value)
640 {
641 struct cras_tm *tm = cras_system_state_get_tm();
642
643 if (device->connected && !value) {
644 cras_bt_profile_on_device_disconnected(device);
645 /* Device is disconnected, resets connected profiles. */
646 device->connected_profiles = 0;
647 }
648
649 device->connected = value;
650
651 if (device->connected) {
652 cras_bt_device_start_new_conn_watch_timer(device);
653 } else if (device->conn_watch_timer) {
654 cras_tm_cancel_timer(tm, device->conn_watch_timer);
655 device->conn_watch_timer = NULL;
656 }
657 }
658
cras_bt_device_update_properties(struct cras_bt_device * device,DBusMessageIter * properties_array_iter,DBusMessageIter * invalidated_array_iter)659 void cras_bt_device_update_properties(struct cras_bt_device *device,
660 DBusMessageIter *properties_array_iter,
661 DBusMessageIter *invalidated_array_iter)
662 {
663
664 int get_profile = 0;
665
666 while (dbus_message_iter_get_arg_type(properties_array_iter) !=
667 DBUS_TYPE_INVALID) {
668 DBusMessageIter properties_dict_iter, variant_iter;
669 const char *key;
670 int type;
671
672 dbus_message_iter_recurse(properties_array_iter,
673 &properties_dict_iter);
674
675 dbus_message_iter_get_basic(&properties_dict_iter, &key);
676 dbus_message_iter_next(&properties_dict_iter);
677
678 dbus_message_iter_recurse(&properties_dict_iter, &variant_iter);
679 type = dbus_message_iter_get_arg_type(&variant_iter);
680
681 if (type == DBUS_TYPE_STRING || type == DBUS_TYPE_OBJECT_PATH) {
682 const char *value;
683
684 dbus_message_iter_get_basic(&variant_iter, &value);
685
686 if (strcmp(key, "Adapter") == 0) {
687 free(device->adapter_obj_path);
688 device->adapter_obj_path = strdup(value);
689 } else if (strcmp(key, "Address") == 0) {
690 free(device->address);
691 device->address = strdup(value);
692 } else if (strcmp(key, "Alias") == 0) {
693 free(device->name);
694 device->name = strdup(value);
695 }
696
697 } else if (type == DBUS_TYPE_UINT32) {
698 uint32_t value;
699
700 dbus_message_iter_get_basic(&variant_iter, &value);
701
702 if (strcmp(key, "Class") == 0)
703 device->bluetooth_class = value;
704
705 } else if (type == DBUS_TYPE_BOOLEAN) {
706 int value;
707
708 dbus_message_iter_get_basic(&variant_iter, &value);
709
710 if (strcmp(key, "Paired") == 0) {
711 device->paired = value;
712 } else if (strcmp(key, "Trusted") == 0) {
713 device->trusted = value;
714 } else if (strcmp(key, "Connected") == 0) {
715 cras_bt_device_set_connected(device, value);
716 }
717
718 } else if (strcmp(
719 dbus_message_iter_get_signature(&variant_iter),
720 "as") == 0 &&
721 strcmp(key, "UUIDs") == 0) {
722 DBusMessageIter uuid_array_iter;
723
724 dbus_message_iter_recurse(&variant_iter,
725 &uuid_array_iter);
726 while (dbus_message_iter_get_arg_type(
727 &uuid_array_iter) != DBUS_TYPE_INVALID) {
728 const char *uuid;
729 enum cras_bt_device_profile profile;
730
731 get_profile = 1;
732
733 dbus_message_iter_get_basic(&uuid_array_iter,
734 &uuid);
735 profile = cras_bt_device_profile_from_uuid(
736 uuid);
737
738 device->profiles |= profile;
739 cras_bt_device_log_profile(device, profile);
740
741 dbus_message_iter_next(&uuid_array_iter);
742 }
743 }
744
745 dbus_message_iter_next(properties_array_iter);
746 }
747
748 while (invalidated_array_iter &&
749 dbus_message_iter_get_arg_type(invalidated_array_iter) !=
750 DBUS_TYPE_INVALID) {
751 const char *key;
752
753 dbus_message_iter_get_basic(invalidated_array_iter, &key);
754
755 if (strcmp(key, "Adapter") == 0) {
756 free(device->adapter_obj_path);
757 device->adapter_obj_path = NULL;
758 } else if (strcmp(key, "Address") == 0) {
759 free(device->address);
760 device->address = NULL;
761 } else if (strcmp(key, "Alias") == 0) {
762 free(device->name);
763 device->name = NULL;
764 } else if (strcmp(key, "Class") == 0) {
765 device->bluetooth_class = 0;
766 } else if (strcmp(key, "Paired") == 0) {
767 device->paired = 0;
768 } else if (strcmp(key, "Trusted") == 0) {
769 device->trusted = 0;
770 } else if (strcmp(key, "Connected") == 0) {
771 device->connected = 0;
772 } else if (strcmp(key, "UUIDs") == 0) {
773 device->profiles = 0;
774 }
775
776 dbus_message_iter_next(invalidated_array_iter);
777 }
778
779 /* If updated properties includes profile, and device is connected,
780 * we need to start connection watcher. This is needed because on
781 * some bluetooth device, supported profiles do not present when
782 * device interface is added and they are updated later.
783 */
784 if (get_profile && device->connected) {
785 cras_bt_device_start_new_conn_watch_timer(device);
786 }
787 }
788
789 /* Converts bluetooth address string into sockaddr structure. The address
790 * string is expected of the form 1A:2B:3C:4D:5E:6F, and each of the six
791 * hex values will be parsed into sockaddr in inverse order.
792 * Args:
793 * str - The string version of bluetooth address
794 * addr - The struct to be filled with converted address
795 */
bt_address(const char * str,struct sockaddr * addr)796 static int bt_address(const char *str, struct sockaddr *addr)
797 {
798 int i;
799
800 if (strlen(str) != 17) {
801 syslog(LOG_ERR, "Invalid bluetooth address %s", str);
802 return -1;
803 }
804
805 memset(addr, 0, sizeof(*addr));
806 addr->sa_family = AF_BLUETOOTH;
807 for (i = 5; i >= 0; i--) {
808 addr->sa_data[i] = (unsigned char)strtol(str, NULL, 16);
809 str += 3;
810 }
811
812 return 0;
813 }
814
cras_bt_device_sco_connect(struct cras_bt_device * device)815 int cras_bt_device_sco_connect(struct cras_bt_device *device)
816 {
817 int sk = 0, err;
818 struct sockaddr addr;
819 struct cras_bt_adapter *adapter;
820 struct timespec timeout = { 1, 0 };
821 struct pollfd *pollfds;
822
823 adapter = cras_bt_device_adapter(device);
824 if (!adapter) {
825 syslog(LOG_ERR, "No adapter found for device %s at SCO connect",
826 cras_bt_device_object_path(device));
827 goto error;
828 }
829
830 sk = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_SCO);
831 if (sk < 0) {
832 syslog(LOG_ERR, "Failed to create socket: %s (%d)",
833 strerror(errno), errno);
834 return -errno;
835 }
836
837 /* Bind to local address */
838 if (bt_address(cras_bt_adapter_address(adapter), &addr))
839 goto error;
840 if (bind(sk, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
841 syslog(LOG_ERR, "Failed to bind socket: %s (%d)",
842 strerror(errno), errno);
843 goto error;
844 }
845
846 /* Connect to remote in nonblocking mode */
847 fcntl(sk, F_SETFL, O_NONBLOCK);
848 pollfds = (struct pollfd *)malloc(sizeof(*pollfds));
849 pollfds[0].fd = sk;
850 pollfds[0].events = POLLOUT;
851
852 if (bt_address(cras_bt_device_address(device), &addr))
853 goto error;
854 err = connect(sk, (struct sockaddr *) &addr, sizeof(addr));
855 if (err && errno != EINPROGRESS) {
856 syslog(LOG_ERR, "Failed to connect: %s (%d)",
857 strerror(errno), errno);
858 goto error;
859 }
860
861 err = ppoll(pollfds, 1, &timeout, NULL);
862 if (err <= 0) {
863 syslog(LOG_ERR, "Connect SCO: poll for writable timeout");
864 goto error;
865 }
866
867 if (pollfds[0].revents & (POLLERR | POLLHUP)) {
868 syslog(LOG_ERR, "SCO socket error, revents: %u",
869 pollfds[0].revents);
870 bt_device_schedule_suspend(device, 0);
871 goto error;
872 }
873
874 return sk;
875
876 error:
877 if (sk)
878 close(sk);
879 return -1;
880 }
881
cras_bt_device_sco_mtu(struct cras_bt_device * device,int sco_socket)882 int cras_bt_device_sco_mtu(struct cras_bt_device *device, int sco_socket)
883 {
884 struct sco_options so;
885 socklen_t len = sizeof(so);
886 struct cras_bt_adapter *adapter;
887
888 adapter = cras_bt_adapter_get(device->adapter_obj_path);
889 if (cras_bt_adapter_on_usb(adapter))
890 return DEFAULT_HFP_MTU_BYTES;
891
892 if (getsockopt(sco_socket, SOL_SCO, SCO_OPTIONS, &so, &len) < 0) {
893 syslog(LOG_ERR, "Get SCO options error: %s", strerror(errno));
894 return DEFAULT_HFP_MTU_BYTES;
895 }
896 return so.mtu;
897 }
898
cras_bt_device_set_use_hardware_volume(struct cras_bt_device * device,int use_hardware_volume)899 void cras_bt_device_set_use_hardware_volume(struct cras_bt_device *device,
900 int use_hardware_volume)
901 {
902 struct cras_iodev *iodev;
903
904 device->use_hardware_volume = use_hardware_volume;
905 iodev = device->bt_iodevs[CRAS_STREAM_OUTPUT];
906 if (iodev)
907 iodev->software_volume_needed = !use_hardware_volume;
908 }
909
cras_bt_device_get_use_hardware_volume(struct cras_bt_device * device)910 int cras_bt_device_get_use_hardware_volume(struct cras_bt_device *device)
911 {
912 return device->use_hardware_volume;
913 }
914
init_bt_device_msg(struct bt_device_msg * msg,enum BT_DEVICE_COMMAND cmd,struct cras_bt_device * device,struct cras_iodev * dev,unsigned int arg)915 static void init_bt_device_msg(struct bt_device_msg *msg,
916 enum BT_DEVICE_COMMAND cmd,
917 struct cras_bt_device *device,
918 struct cras_iodev *dev,
919 unsigned int arg)
920 {
921 memset(msg, 0, sizeof(*msg));
922 msg->header.type = CRAS_MAIN_BT;
923 msg->header.length = sizeof(*msg);
924 msg->cmd = cmd;
925 msg->device = device;
926 msg->dev = dev;
927 msg->arg = arg;
928 }
929
cras_bt_device_cancel_suspend(struct cras_bt_device * device)930 int cras_bt_device_cancel_suspend(struct cras_bt_device *device)
931 {
932 struct bt_device_msg msg;
933 int rc;
934
935 init_bt_device_msg(&msg, BT_DEVICE_CANCEL_SUSPEND, device, NULL, 0);
936 rc = cras_main_message_send((struct cras_main_message *)&msg);
937 return rc;
938 }
939
cras_bt_device_schedule_suspend(struct cras_bt_device * device,unsigned int msec)940 int cras_bt_device_schedule_suspend(struct cras_bt_device *device,
941 unsigned int msec)
942 {
943 struct bt_device_msg msg;
944 int rc;
945
946 init_bt_device_msg(&msg, BT_DEVICE_SCHEDULE_SUSPEND, device,
947 NULL, msec);
948 rc = cras_main_message_send((struct cras_main_message *)&msg);
949 return rc;
950 }
951
952 /* This diagram describes how the profile switching happens. When
953 * certain conditions met, bt iodev will call the APIs below to interact
954 * with main thread to switch to another active profile.
955 *
956 * Audio thread:
957 * +--------------------------------------------------------------+
958 * | bt iodev |
959 * | +------------------+ +-----------------+ |
960 * | | condition met to | | open, close, or | |
961 * | +--| change profile |<---| append profile |<--+ |
962 * | | +------------------+ +-----------------+ | |
963 * +-----------|------------------------------------------------|-+
964 * | |
965 * Main thread: |
966 * +-----------|------------------------------------------------|-+
967 * | | | |
968 * | | +------------+ +----------------+ | |
969 * | +----->| set active |---->| switch profile |-----+ |
970 * | | profile | +----------------+ |
971 * | bt device +------------+ |
972 * +--------------------------------------------------------------+
973 */
cras_bt_device_switch_profile_enable_dev(struct cras_bt_device * device,struct cras_iodev * bt_iodev)974 int cras_bt_device_switch_profile_enable_dev(struct cras_bt_device *device,
975 struct cras_iodev *bt_iodev)
976 {
977 struct bt_device_msg msg;
978 int rc;
979
980 init_bt_device_msg(&msg, BT_DEVICE_SWITCH_PROFILE_ENABLE_DEV,
981 device, bt_iodev, 0);
982 rc = cras_main_message_send((struct cras_main_message *)&msg);
983 return rc;
984 }
985
cras_bt_device_switch_profile(struct cras_bt_device * device,struct cras_iodev * bt_iodev)986 int cras_bt_device_switch_profile(struct cras_bt_device *device,
987 struct cras_iodev *bt_iodev)
988 {
989 struct bt_device_msg msg;
990 int rc;
991
992 init_bt_device_msg(&msg, BT_DEVICE_SWITCH_PROFILE,
993 device, bt_iodev, 0);
994 rc = cras_main_message_send((struct cras_main_message *)&msg);
995 return rc;
996 }
997
cras_bt_device_iodev_buffer_size_changed(struct cras_bt_device * device)998 void cras_bt_device_iodev_buffer_size_changed(struct cras_bt_device *device)
999 {
1000 struct cras_iodev *iodev;
1001
1002 iodev = device->bt_iodevs[CRAS_STREAM_INPUT];
1003 if (iodev && cras_iodev_is_open(iodev))
1004 cras_bt_io_update_buffer_size(iodev);
1005 iodev = device->bt_iodevs[CRAS_STREAM_OUTPUT];
1006 if (iodev && cras_iodev_is_open(iodev))
1007 cras_bt_io_update_buffer_size(iodev);
1008 }
1009
profile_switch_delay_cb(struct cras_timer * timer,void * arg)1010 static void profile_switch_delay_cb(struct cras_timer *timer, void *arg)
1011 {
1012 struct cras_bt_device *device = (struct cras_bt_device *)arg;
1013 struct cras_iodev *iodev;
1014
1015 device->switch_profile_timer = NULL;
1016 iodev = device->bt_iodevs[CRAS_STREAM_OUTPUT];
1017 if (!iodev)
1018 return;
1019
1020 /*
1021 * During the |PROFILE_SWITCH_DELAY_MS| time interval, BT iodev could
1022 * have been enabled by others, and its active profile may have changed.
1023 * If iodev has been enabled, that means it has already picked up a
1024 * reasonable profile to use and audio thread is accessing iodev now.
1025 * We should NOT call into update_active_node from main thread
1026 * because that may mess up the active node content.
1027 */
1028 if (cras_iodev_list_dev_is_enabled(iodev))
1029 return;
1030
1031 iodev->update_active_node(iodev, 0, 1);
1032 cras_iodev_list_enable_dev(iodev);
1033 }
1034
bt_device_switch_profile_with_delay(struct cras_bt_device * device,unsigned int delay_ms)1035 static void bt_device_switch_profile_with_delay(struct cras_bt_device *device,
1036 unsigned int delay_ms)
1037 {
1038 struct cras_tm *tm = cras_system_state_get_tm();
1039
1040 if (device->switch_profile_timer) {
1041 cras_tm_cancel_timer(tm, device->switch_profile_timer);
1042 device->switch_profile_timer = NULL;
1043 }
1044 device->switch_profile_timer = cras_tm_create_timer(
1045 tm, delay_ms, profile_switch_delay_cb, device);
1046 }
1047
1048 /* Switches associated bt iodevs to use the active profile. This is
1049 * achieved by close the iodevs, update their active nodes, and then
1050 * finally reopen them. */
bt_device_switch_profile(struct cras_bt_device * device,struct cras_iodev * bt_iodev,int enable_dev)1051 static void bt_device_switch_profile(struct cras_bt_device *device,
1052 struct cras_iodev *bt_iodev,
1053 int enable_dev)
1054 {
1055 struct cras_iodev *iodev;
1056 int was_enabled[CRAS_NUM_DIRECTIONS] = {0};
1057 int dir;
1058
1059 /* If a bt iodev is active, temporarily remove it from the active
1060 * device list. Note that we need to check all bt_iodevs for the
1061 * situation that both input and output are active while switches
1062 * from HFP/HSP to A2DP.
1063 */
1064 for (dir = 0; dir < CRAS_NUM_DIRECTIONS; dir++) {
1065 iodev = device->bt_iodevs[dir];
1066 if (!iodev)
1067 continue;
1068 was_enabled[dir] = cras_iodev_list_dev_is_enabled(iodev);
1069 cras_iodev_list_disable_dev(iodev, false);
1070 }
1071
1072 for (dir = 0; dir < CRAS_NUM_DIRECTIONS; dir++) {
1073 iodev = device->bt_iodevs[dir];
1074 if (!iodev)
1075 continue;
1076
1077 /* If the iodev was active or this profile switching is
1078 * triggered at opening iodev, add it to active dev list.
1079 * However for the output iodev, adding it back to active dev
1080 * list could cause immediate switching from HFP to A2DP if
1081 * there exists an output stream. Certain headset/speaker
1082 * would fail to playback afterwards when the switching happens
1083 * too soon, so put this task in a delayed callback.
1084 */
1085 if (was_enabled[dir] ||
1086 (enable_dev && iodev == bt_iodev)) {
1087 if (dir == CRAS_STREAM_INPUT) {
1088 iodev->update_active_node(iodev, 0, 1);
1089 cras_iodev_list_enable_dev(iodev);
1090 } else {
1091 bt_device_switch_profile_with_delay(
1092 device,
1093 PROFILE_SWITCH_DELAY_MS);
1094 }
1095 }
1096 }
1097 }
1098
bt_device_suspend_cb(struct cras_timer * timer,void * arg)1099 static void bt_device_suspend_cb(struct cras_timer *timer, void *arg)
1100 {
1101 struct cras_bt_device *device = (struct cras_bt_device *)arg;
1102
1103 device->suspend_timer = NULL;
1104
1105 cras_a2dp_suspend_connected_device(device);
1106 cras_hfp_ag_suspend_connected_device(device);
1107 }
1108
bt_device_schedule_suspend(struct cras_bt_device * device,unsigned int msec)1109 static void bt_device_schedule_suspend(struct cras_bt_device *device,
1110 unsigned int msec)
1111 {
1112 struct cras_tm *tm = cras_system_state_get_tm();
1113
1114 if (device->suspend_timer)
1115 return;
1116 device->suspend_timer = cras_tm_create_timer(tm, msec,
1117 bt_device_suspend_cb, device);
1118 }
1119
bt_device_cancel_suspend(struct cras_bt_device * device)1120 static void bt_device_cancel_suspend(struct cras_bt_device *device)
1121 {
1122 struct cras_tm *tm = cras_system_state_get_tm();
1123 if (device->suspend_timer == NULL)
1124 return;
1125 cras_tm_cancel_timer(tm, device->suspend_timer);
1126 device->suspend_timer = NULL;
1127 }
1128
bt_device_process_msg(struct cras_main_message * msg,void * arg)1129 static void bt_device_process_msg(struct cras_main_message *msg, void *arg)
1130 {
1131 struct bt_device_msg *bt_msg = (struct bt_device_msg *)msg;
1132 struct cras_bt_device *device = NULL;
1133
1134 DL_FOREACH(devices, device) {
1135 if (device == bt_msg->device)
1136 break;
1137 }
1138
1139 /* Do nothing if target device no longer exists. */
1140 if (device == NULL)
1141 return;
1142
1143 switch (bt_msg->cmd) {
1144 case BT_DEVICE_SWITCH_PROFILE:
1145 bt_device_switch_profile(bt_msg->device, bt_msg->dev, 0);
1146 break;
1147 case BT_DEVICE_SWITCH_PROFILE_ENABLE_DEV:
1148 bt_device_switch_profile(bt_msg->device, bt_msg->dev, 1);
1149 break;
1150 case BT_DEVICE_SCHEDULE_SUSPEND:
1151 bt_device_schedule_suspend(bt_msg->device, bt_msg->arg);
1152 break;
1153 case BT_DEVICE_CANCEL_SUSPEND:
1154 bt_device_cancel_suspend(bt_msg->device);
1155 break;
1156 default:
1157 break;
1158 }
1159 }
1160
cras_bt_device_start_monitor()1161 void cras_bt_device_start_monitor()
1162 {
1163 cras_main_message_add_handler(CRAS_MAIN_BT,
1164 bt_device_process_msg, NULL);
1165 }
1166
cras_bt_device_update_hardware_volume(struct cras_bt_device * device,int volume)1167 void cras_bt_device_update_hardware_volume(struct cras_bt_device *device,
1168 int volume)
1169 {
1170 struct cras_iodev *iodev;
1171
1172 iodev = device->bt_iodevs[CRAS_STREAM_OUTPUT];
1173 if (iodev == NULL)
1174 return;
1175
1176 /* Check if this BT device is okay to use hardware volume. If not
1177 * then ignore the reported volume change event.
1178 */
1179 if (!cras_bt_device_get_use_hardware_volume(device))
1180 return;
1181
1182 iodev->active_node->volume = volume;
1183 cras_iodev_list_notify_node_volume(iodev->active_node);
1184 }
1185