hfp_hf_bluez5: Watch for changes in the selected codec
authorVinicius Costa Gomes <vinicius.gomes@openbossa.org>
Mon, 15 Apr 2013 13:54:50 +0000 (10:54 -0300)
committerDenis Kenzior <denkenz@gmail.com>
Mon, 15 Apr 2013 12:00:39 +0000 (07:00 -0500)
This patch adds a function to monitor when the AG sends a new codec
before establishing the SCO connection.

plugins/hfp_hf_bluez5.c

index c63b1a20c14976ded9c1738a1ce368478540f069..2c67a215f874180a81e6e077ae3c0da424a86f80 100644 (file)
@@ -314,9 +314,49 @@ static struct ofono_modem_driver hfp_driver = {
        .post_sim       = hfp_post_sim,
 };
 
+static void bcs_notify(GAtResult *result, gpointer user_data)
+{
+       struct hfp *hfp = user_data;
+       struct hfp_slc_info *info = &hfp->info;
+       GAtResultIter iter;
+       char str[32];
+       int value;
+
+       g_at_result_iter_init(&iter, result);
+
+       if (!g_at_result_iter_next(&iter, "+BCS:"))
+               return;
+
+       if (!g_at_result_iter_next_number(&iter, &value))
+               return;
+
+       if (ofono_handsfree_card_set_codec(hfp->card, value) == FALSE) {
+               /* Unsupported codec, re-send our codecs */
+               if (ofono_handsfree_audio_has_wideband())
+                       sprintf(str, "AT+BAC=%d,%d", HFP_CODEC_CVSD,
+                                                       HFP_CODEC_MSBC);
+               else
+                       sprintf(str, "AT+BAC=%d", HFP_CODEC_CVSD);
+
+               goto done;
+       }
+
+       /* Confirm the codec */
+       sprintf(str, "AT+BCS=%d", value);
+
+done:
+       g_at_chat_send(info->chat, str, NULL, NULL, NULL, NULL);
+}
+
 static int hfp16_card_probe(struct ofono_handsfree_card *card,
                                        unsigned int vendor, void *data)
 {
+       struct hfp *hfp = data;
+       struct hfp_slc_info *info = &hfp->info;
+
+       g_at_chat_register(info->chat, "+BCS:", bcs_notify, FALSE,
+                                                               hfp, NULL);
+
        return 0;
 }