summaryrefslogtreecommitdiff
path: root/cras/src
diff options
context:
space:
mode:
Diffstat (limited to 'cras/src')
-rw-r--r--cras/src/common/cras_types.h2
-rw-r--r--cras/src/server/cras_a2dp_iodev.c7
-rw-r--r--cras/src/server/cras_bt_io.c13
-rw-r--r--cras/src/server/cras_hfp_iodev.c10
-rw-r--r--cras/src/server/cras_iodev_list.c2
-rw-r--r--cras/src/server/cras_server_metrics.c5
-rw-r--r--cras/src/tests/bt_io_unittest.cc6
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_;