When the emulator receives a AT+BAC SET command, it stores the
available HF codecs.
---
 src/emulator.c |   32 ++++++++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

diff --git a/src/emulator.c b/src/emulator.c
index 490ee73..24c5e48 100644
--- a/src/emulator.c
+++ b/src/emulator.c
@@ -55,6 +55,7 @@ struct ofono_emulator {
        gboolean slc;
        int l_features;
        int r_features;
+       int r_codecs;
        int events_mode;
        gboolean events_ind;
        unsigned char cmee_mode;
@@ -481,6 +482,36 @@ fail:
        }
 }
 
+static void bac_cb(GAtServer *server, GAtServerRequestType type,
+                                       GAtResult *result, gpointer user_data)
+{
+       struct ofono_emulator *em = user_data;
+       GAtResultIter iter;
+       int codec, codecs = 0;
+
+       switch (type) {
+       case G_AT_SERVER_REQUEST_TYPE_SET:
+               g_at_result_iter_init(&iter, result);
+               g_at_result_iter_next(&iter, "");
+
+               while (g_at_result_iter_next_number(&iter, &codec))
+                       codecs |= codec;
+
+               if (!(codecs & HFP_CODEC_CVSD))
+                       goto fail;
+
+               em->r_codecs = codecs;
+
+               g_at_server_send_final(server, G_AT_SERVER_RESULT_OK);
+               break;
+
+       default:
+fail:
+               g_at_server_send_final(server, G_AT_SERVER_RESULT_ERROR);
+               break;
+       }
+}
+
 static void cind_cb(GAtServer *server, GAtServerRequestType type,
                        GAtResult *result, gpointer user_data)
 {
@@ -941,6 +972,7 @@ void ofono_emulator_register(struct ofono_emulator *em, int 
fd)
                                                                        FALSE);
 
                g_at_server_register(em->server, "+BRSF", brsf_cb, em, NULL);
+               g_at_server_register(em->server, "+BAC", bac_cb, em, NULL);
                g_at_server_register(em->server, "+CIND", cind_cb, em, NULL);
                g_at_server_register(em->server, "+CMER", cmer_cb, em, NULL);
                g_at_server_register(em->server, "+CLIP", clip_cb, em, NULL);
-- 
1.7.9.5

_______________________________________________
ofono mailing list
[email protected]
https://lists.ofono.org/mailman/listinfo/ofono

Reply via email to