From e3fa93750804a5521e43bb4ed57d72efe0a2ad1f Mon Sep 17 00:00:00 2001 From: "Igor V. Kovalenko" Date: Wed, 14 Apr 2021 22:55:38 +0300 Subject: [PATCH] bluetooth: handle HFP codec list in any order HFP HF peer can send +BAC= list of codecs in any order and pa only expects "1,2" Fix this by actually parsing codec list elements while looking for "2" (mSBC) Part-of: --- src/modules/bluetooth/backend-native.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/modules/bluetooth/backend-native.c b/src/modules/bluetooth/backend-native.c index 2dd78fa..d3dd0bd 100644 --- a/src/modules/bluetooth/backend-native.c +++ b/src/modules/bluetooth/backend-native.c @@ -562,6 +562,9 @@ static bool hfp_rfcomm_handle(int fd, pa_bluetooth_transport *t, const char *buf struct hfp_config *c = t->config; int val; char str[5]; + const char *r; + size_t len; + const char *state; /* first-time initialize selected codec to CVSD */ if (c->selected_codec == 0) @@ -576,10 +579,17 @@ static bool hfp_rfcomm_handle(int fd, pa_bluetooth_transport *t, const char *buf return true; } else if (sscanf(buf, "AT+BAC=%3s", str) == 1) { - if (strncmp(str, "1,2", 3) == 0) - c->support_msbc = true; - else - c->support_msbc = false; + c->support_msbc = false; + + state = NULL; + + /* check if codec id 2 (mSBC) is in the list of supported codecs */ + while ((r = pa_split_in_place(str, ",", &len, &state))) { + if (len == 1 && r[0] == '2') { + c->support_msbc = true; + break; + } + } c->support_codec_negotiation = true; -- 2.7.4