Hi Vinicius,
On 04/09/2013 03:45 PM, Vinicius Costa Gomes wrote:
This patch adds a function to monitor when the AG sends a new codec
before establishing the SCO connection.
---
drivers/hfpmodem/slc.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++
drivers/hfpmodem/slc.h | 4 ++++
2 files changed, 66 insertions(+)
diff --git a/drivers/hfpmodem/slc.c b/drivers/hfpmodem/slc.c
index 40b22a1..51c1373 100644
--- a/drivers/hfpmodem/slc.c
+++ b/drivers/hfpmodem/slc.c
@@ -54,6 +54,12 @@ struct slc_establish_data {
gpointer userdata;
};
+struct codec_watch {
+ struct hfp_slc_info *slc;
+ hfp_slc_codec_watch_cb_t cb;
+ gpointer user_data;
+};
+
void hfp_slc_info_init(struct hfp_slc_info *info, guint16 version)
{
info->ag_features = 0;
@@ -347,3 +353,59 @@ void hfp_slc_establish(struct hfp_slc_info *info, hfp_slc_cb_t
connect_cb,
g_at_chat_send(info->chat, buf, brsf_prefix,
brsf_cb, sed, slc_establish_data_unref);
}
+
+static void bcs_notify(GAtResult *result, gpointer user_data)
+{
+ struct codec_watch *watch = user_data;
+ struct hfp_slc_info *info = watch->slc;
+ 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;
+
+ memset(str, 0, sizeof(str));
+
+ switch (value) {
+ case HFP_CODEC_MSBC:
+ if (!ofono_handsfree_audio_has_wideband()) {
+ sprintf(str, "AT+BAC=%d", HFP_CODEC_CVSD);
+ break;
+ }
+
+ /* fallthrough */
+
+ case HFP_CODEC_CVSD:
+ sprintf(str, "AT+BCS=%d", value);
+ watch->cb(value, watch->user_data);
+ break;
+
+ default:
+ 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);
+ }
+
+ g_at_chat_send(info->chat, str, NULL, NULL, NULL, NULL);
+}
+
+guint hfp_slc_codec_watch_register(struct hfp_slc_info *info,
+ hfp_slc_codec_watch_cb_t cb, void *user_data)
+{
+ struct codec_watch *watch = g_new0(struct codec_watch, 1);
+
+ watch->slc = info;
+ watch->cb = cb;
+ watch->user_data = user_data;
+
+ return g_at_chat_register(info->chat, "+BCS:", bcs_notify, FALSE,
+ watch, g_free);
+}
Why would you do this in the SLC ? The SLC establishment only requires
HF to send a BAC after the BRSF has been exchanged. We do this
successfully in brsf_cb. I do not see why we can't monitor +BCS inside
plugins/hfp_hf_bluez5.c?
diff --git a/drivers/hfpmodem/slc.h b/drivers/hfpmodem/slc.h
index b71ffe9..95539c8 100644
--- a/drivers/hfpmodem/slc.h
+++ b/drivers/hfpmodem/slc.h
@@ -45,6 +45,7 @@ enum hfp_indicator {
};
typedef void (*hfp_slc_cb_t)(void *userdata);
+typedef void (*hfp_slc_codec_watch_cb_t)(unsigned char codec, void *userdata);
struct hfp_slc_info {
GAtChat *chat;
@@ -60,3 +61,6 @@ void hfp_slc_info_free(struct hfp_slc_info *info);
void hfp_slc_establish(struct hfp_slc_info *info, hfp_slc_cb_t connect_cb,
hfp_slc_cb_t failed_cb, void *userdata);
+
+guint hfp_slc_codec_watch_register(struct hfp_slc_info *info,
+ hfp_slc_codec_watch_cb_t cb, void *user_data);
Regards,
-Denis