bluetooth: handle HFP codec list in any order
authorIgor V. Kovalenko <igor.v.kovalenko@gmail.com>
Wed, 14 Apr 2021 19:55:38 +0000 (22:55 +0300)
committerPulseAudio Marge Bot <pulseaudio-maintainers@lists.freedesktop.org>
Wed, 14 Apr 2021 21:30:27 +0000 (21:30 +0000)
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: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/537>

src/modules/bluetooth/backend-native.c

index 2dd78fa..d3dd0bd 100644 (file)
@@ -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;