---
 src/emulator.c |   58 ++++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 54 insertions(+), 4 deletions(-)

diff --git a/src/emulator.c b/src/emulator.c
index c468452..8b4fd80 100644
--- a/src/emulator.c
+++ b/src/emulator.c
@@ -90,6 +90,7 @@ struct ofono_emulator {
        gboolean bcs;
        int pns_id;
        struct ofono_handsfree_card *card;
+       struct cb_data *codec_data;
 };
 
 struct indicator {
@@ -485,6 +486,26 @@ static gboolean notify_ring(void *user_data)
        return TRUE;
 }
 
+static void call_card_connect_callback(struct ofono_emulator *em,
+                                                       GAtServerResult result)
+{
+       struct cb_data *cbd = em->codec_data;
+       ofono_handsfree_card_connect_cb_t cb;
+
+       if (cbd == NULL)
+               return;
+
+       cb = cbd->cb;
+
+       if (result == G_AT_SERVER_RESULT_OK)
+               CALLBACK_WITH_SUCCESS(cb, cbd->data);
+       else
+               CALLBACK_WITH_FAILURE(cb, cbd->data);
+
+       g_free(cbd);
+       em->codec_data = NULL;
+}
+
 static gboolean setup_synchronous_connection(void *user_data)
 {
        struct ofono_emulator *em = user_data;
@@ -533,14 +554,19 @@ static void bcs_cb(GAtServer *server, 
GAtServerRequestType type,
 
        default:
 fail:
+               call_card_connect_callback(em, G_AT_SERVER_RESULT_ERROR);
+
                g_at_server_send_final(server, G_AT_SERVER_RESULT_ERROR);
+
                break;
        }
+
+       
 }
 
-static gboolean setup_codec_connection(void *user_data)
+static void setup_codec_connection(struct ofono_emulator *em,
+                                                       struct cb_data *cbd)
 {
-       struct ofono_emulator *em = user_data;
        char str[16];
 
        DBG("");
@@ -554,6 +580,15 @@ static gboolean setup_codec_connection(void *user_data)
                em->bcs = TRUE;
        }
 
+       em->codec_data = cbd;
+}
+
+static gboolean call_setup_codec_connection(void *user_data)
+{
+       struct ofono_emulator *em = user_data;
+
+       setup_codec_connection(em, NULL);
+
        em->audiosetup_source = 0;
 
        return FALSE;
@@ -619,13 +654,18 @@ static void bac_cb(GAtServer *server, 
GAtServerRequestType type,
 
                if (bcs)
                        em->audiosetup_source = g_timeout_add_seconds(0,
-                                               setup_codec_connection, em);
+                                       call_setup_codec_connection, em);
 
                break;
 
        default:
 fail:
                g_at_server_send_final(server, G_AT_SERVER_RESULT_ERROR);
+
+               if (bcs)
+                       call_card_connect_callback(em,
+                                               G_AT_SERVER_RESULT_ERROR);
+
                break;
        }
 }
@@ -1006,7 +1046,7 @@ static void bcc_cb(GAtServer *server, 
GAtServerRequestType type,
                g_at_server_send_final(server, G_AT_SERVER_RESULT_OK);
 
                em->audiosetup_source = g_timeout_add_seconds(0,
-                                               setup_codec_connection, em);
+                                       call_setup_codec_connection, em);
 
                break;
 
@@ -1207,8 +1247,17 @@ static void hfp16_card_remove(struct 
ofono_handsfree_card *card)
 static void hfp16_card_connect(struct ofono_handsfree_card *card,
                        ofono_handsfree_card_connect_cb_t cb, void *data)
 {
+       struct ofono_emulator *em = ofono_handsfree_card_get_data(card);
+
        DBG("");
 
+       if (em->r_features & HFP_HF_FEATURE_CODEC_NEGOTIATION &&
+                       em->l_features & HFP_AG_FEATURE_CODEC_NEGOTIATION) {
+               struct cb_data *cbd = cb_data_new(cb, data);
+               setup_codec_connection(em, cbd);
+               return;
+       }
+
        ofono_handsfree_card_connect_sco(card);
 }
 
@@ -1268,6 +1317,7 @@ int ofono_emulator_create_card(struct ofono_emulator *em, 
int version)
                driver = HFP_16_AG_DRIVER;
 
        em->card = ofono_handsfree_card_create(0, driver, NULL);
+       ofono_handsfree_card_set_data(em->card, em);
 
        io = g_at_server_get_channel(em->server);
        fd = g_io_channel_unix_get_fd(io);
-- 
1.7.9.5

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

Reply via email to