• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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