diff options
Diffstat (limited to 'cras/src')
-rw-r--r-- | cras/src/common/cras_types.h | 2 | ||||
-rw-r--r-- | cras/src/server/cras_a2dp_iodev.c | 7 | ||||
-rw-r--r-- | cras/src/server/cras_bt_io.c | 13 | ||||
-rw-r--r-- | cras/src/server/cras_hfp_iodev.c | 10 | ||||
-rw-r--r-- | cras/src/server/cras_iodev_list.c | 2 | ||||
-rw-r--r-- | cras/src/server/cras_server_metrics.c | 5 | ||||
-rw-r--r-- | cras/src/tests/bt_io_unittest.cc | 6 |
7 files changed, 40 insertions, 5 deletions
diff --git a/cras/src/common/cras_types.h b/cras/src/common/cras_types.h index 3dd9413a..6dc85ef0 100644 --- a/cras/src/common/cras_types.h +++ b/cras/src/common/cras_types.h @@ -595,6 +595,8 @@ enum CRAS_NODE_TYPE { CRAS_NODE_TYPE_HOTWORD, CRAS_NODE_TYPE_POST_MIX_PRE_DSP, CRAS_NODE_TYPE_POST_DSP, + /* Type for the legacy BT narrow band mic .*/ + CRAS_NODE_TYPE_BLUETOOTH_NB_MIC, /* These value can be used for both output and input nodes. */ CRAS_NODE_TYPE_USB, CRAS_NODE_TYPE_BLUETOOTH, diff --git a/cras/src/server/cras_a2dp_iodev.c b/cras/src/server/cras_a2dp_iodev.c index f6351aba..ac86fc4b 100644 --- a/cras/src/server/cras_a2dp_iodev.c +++ b/cras/src/server/cras_a2dp_iodev.c @@ -510,11 +510,12 @@ struct cras_iodev *a2dp_iodev_create(struct cras_bt_transport *transport) node->volume = 100; gettimeofday(&node->plugged_time, NULL); - /* A2DP does output only */ - cras_bt_device_append_iodev( - device, iodev, cras_bt_transport_profile(a2dpio->transport)); + /* Prepare active node before append, so bt_io can extract correct + * info from A2DP iodev and node. */ cras_iodev_add_node(iodev, node); cras_iodev_set_active_node(iodev, node); + cras_bt_device_append_iodev( + device, iodev, cras_bt_transport_profile(a2dpio->transport)); return iodev; error: diff --git a/cras/src/server/cras_bt_io.c b/cras/src/server/cras_bt_io.c index 637f0a79..d63e8b5f 100644 --- a/cras/src/server/cras_bt_io.c +++ b/cras/src/server/cras_bt_io.c @@ -429,13 +429,24 @@ struct cras_iodev *cras_bt_io_create(struct cras_bt_device *device, return NULL; active->base.dev = iodev; active->base.idx = btio->next_node_id++; - active->base.type = CRAS_NODE_TYPE_BLUETOOTH; + active->base.type = dev->active_node->type; active->base.volume = 100; active->base.plugged = 1; active->base.stable_id = SuperFastHash(cras_bt_device_object_path(device), strlen(cras_bt_device_object_path(device)), strlen(cras_bt_device_object_path(device))); + /* + * If the same headset is connected in wideband mode, we shall assign + * a separate stable_id so the node priority/preference mechanism in + * Chrome UI doesn't break. + */ + if ((active->base.type == CRAS_NODE_TYPE_BLUETOOTH) && + (dev->direction == CRAS_STREAM_INPUT)) + active->base.stable_id = + SuperFastHash((const char *)&active->base.type, + sizeof(active->base.type), + active->base.stable_id); active->profile = profile; active->profile_dev = dev; gettimeofday(&active->base.plugged_time, NULL); diff --git a/cras/src/server/cras_hfp_iodev.c b/cras/src/server/cras_hfp_iodev.c index 08e26d6d..75ce5b8f 100644 --- a/cras/src/server/cras_hfp_iodev.c +++ b/cras/src/server/cras_hfp_iodev.c @@ -314,13 +314,21 @@ struct cras_iodev *hfp_iodev_create(enum CRAS_STREAM_DIRECTION dir, strcpy(node->name, iodev->info.name); node->plugged = 1; + /* If headset mic uses legacy narrow band, i.e CVSD codec, report a + * different node type so UI can set different plug priority. */ node->type = CRAS_NODE_TYPE_BLUETOOTH; + if ((hfp_slc_get_selected_codec(hfpio->slc) == HFP_CODEC_ID_CVSD) && + (dir == CRAS_STREAM_INPUT)) + node->type = CRAS_NODE_TYPE_BLUETOOTH_NB_MIC; + node->volume = 100; gettimeofday(&node->plugged_time, NULL); - cras_bt_device_append_iodev(device, iodev, profile); + /* Prepare active node before append, so bt_io can extract correct + * info from HFP iodev and node. */ cras_iodev_add_node(iodev, node); cras_iodev_set_active_node(iodev, node); + cras_bt_device_append_iodev(device, iodev, profile); hfpio->info = info; diff --git a/cras/src/server/cras_iodev_list.c b/cras/src/server/cras_iodev_list.c index fc335c2a..86793f5f 100644 --- a/cras/src/server/cras_iodev_list.c +++ b/cras/src/server/cras_iodev_list.c @@ -220,6 +220,8 @@ static const char *node_type_to_str(struct cras_ionode *node) return "USB"; case CRAS_NODE_TYPE_BLUETOOTH: return "BLUETOOTH"; + case CRAS_NODE_TYPE_BLUETOOTH_NB_MIC: + return "BLUETOOTH_NB_MIC"; case CRAS_NODE_TYPE_FALLBACK_NORMAL: return "FALLBACK_NORMAL"; case CRAS_NODE_TYPE_FALLBACK_ABNORMAL: diff --git a/cras/src/server/cras_server_metrics.c b/cras/src/server/cras_server_metrics.c index 5f51e83e..abdeb939 100644 --- a/cras/src/server/cras_server_metrics.c +++ b/cras/src/server/cras_server_metrics.c @@ -118,6 +118,7 @@ enum CRAS_METRICS_DEVICE_TYPE { CRAS_METRICS_DEVICE_HFP, CRAS_METRICS_DEVICE_HSP, CRAS_METRICS_DEVICE_BLUETOOTH, + CRAS_METRICS_DEVICE_BLUETOOTH_NB_MIC, CRAS_METRICS_DEVICE_NO_DEVICE, CRAS_METRICS_DEVICE_NORMAL_FALLBACK, CRAS_METRICS_DEVICE_ABNORMAL_FALLBACK, @@ -231,6 +232,8 @@ metrics_device_type_str(enum CRAS_METRICS_DEVICE_TYPE device_type) return "HSP"; case CRAS_METRICS_DEVICE_BLUETOOTH: return "Bluetooth"; + case CRAS_METRICS_DEVICE_BLUETOOTH_NB_MIC: + return "BluetoothNarrowBandMic"; case CRAS_METRICS_DEVICE_NO_DEVICE: return "NoDevice"; /* Other dummy devices. */ @@ -314,6 +317,8 @@ get_metrics_device_type(struct cras_iodev *iodev) return CRAS_METRICS_DEVICE_HSP; #endif return CRAS_METRICS_DEVICE_BLUETOOTH; + case CRAS_NODE_TYPE_BLUETOOTH_NB_MIC: + return CRAS_METRICS_DEVICE_BLUETOOTH_NB_MIC; case CRAS_NODE_TYPE_UNKNOWN: default: return CRAS_METRICS_DEVICE_UNKNOWN; diff --git a/cras/src/tests/bt_io_unittest.cc b/cras/src/tests/bt_io_unittest.cc index 97f4dae4..58a218b3 100644 --- a/cras/src/tests/bt_io_unittest.cc +++ b/cras/src/tests/bt_io_unittest.cc @@ -59,6 +59,8 @@ class BtIoBasicSuite : public testing::Test { ResetStubData(); SetUpIodev(&iodev_, CRAS_STREAM_OUTPUT); SetUpIodev(&iodev2_, CRAS_STREAM_OUTPUT); + iodev_.active_node = &node_; + iodev2_.active_node = &node2_; update_supported_formats_called_ = 0; frames_queued_called_ = 0; @@ -137,6 +139,8 @@ class BtIoBasicSuite : public testing::Test { static struct cras_iodev* bt_iodev; static struct cras_iodev iodev_; static struct cras_iodev iodev2_; + static struct cras_ionode node_; + static struct cras_ionode node2_; static unsigned int update_supported_formats_called_; static unsigned int frames_queued_called_; static unsigned int delay_frames_called_; @@ -149,6 +153,8 @@ class BtIoBasicSuite : public testing::Test { struct cras_iodev* BtIoBasicSuite::bt_iodev; struct cras_iodev BtIoBasicSuite::iodev_; struct cras_iodev BtIoBasicSuite::iodev2_; +struct cras_ionode BtIoBasicSuite::node_; +struct cras_ionode BtIoBasicSuite::node2_; unsigned int BtIoBasicSuite::update_supported_formats_called_; unsigned int BtIoBasicSuite::frames_queued_called_; unsigned int BtIoBasicSuite::delay_frames_called_; |