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