From 4e7f0690e9827eef6cf413611c589bb023fcb7c1 Mon Sep 17 00:00:00 2001 From: Vinicius Costa Gomes Date: Mon, 15 Apr 2013 10:54:50 -0300 Subject: hfp_hf_bluez5: Watch for changes in the selected codec This patch adds a function to monitor when the AG sends a new codec before establishing the SCO connection. --- plugins/hfp_hf_bluez5.c | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/plugins/hfp_hf_bluez5.c b/plugins/hfp_hf_bluez5.c index c63b1a20..2c67a215 100644 --- a/plugins/hfp_hf_bluez5.c +++ b/plugins/hfp_hf_bluez5.c @@ -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; } -- cgit v1.2.3