Fix : connection replace failure
[platform/core/connectivity/bluetooth-frwk.git] / bt-service-adaptation / services / audio / bt-service-audio.c
index 17b2ade..49a59c3 100644 (file)
@@ -40,6 +40,8 @@
 #include "bt-service-avrcp-tg.h"
 #include "bt-service-avrcp-ctrl.h"
 #include "bt-service-hf.h"
+#include "bt-service-hf-client.h"
+#include "oal-hf-client.h"
 
 #ifdef TIZEN_SUPPORT_DUAL_HF
 #define VCONF_KEY_BT_HOST_BT_MAC_ADDR "db/wms/host_bt_mac"
@@ -416,6 +418,8 @@ static int __bt_process_audio_profile_connect(bt_audio_type_t type, bluetooth_de
        case BT_AUDIO_A2DP_SOURCE:
                return _bt_a2dp_connect_remote_source(address);
                break;
+       case BT_AUDIO_AG:
+               return _bt_connect_remote_ag(address);
        default:
                BT_ERR("Unknown role");
                return BLUETOOTH_ERROR_INTERNAL;
@@ -425,6 +429,7 @@ static int __bt_process_audio_profile_connect(bt_audio_type_t type, bluetooth_de
                //_bt_headset_set_local_connection(TRUE);
                /* Add data to the connected list */
                _bt_add_headset_to_list(type, BT_STATE_CONNECTING, addr);
+               BT_PERMANENT_LOG("Connect %d", type);
        } else {
                BT_ERR("Profile [%d] connect failed!!", type);
        }
@@ -481,6 +486,7 @@ static int __bt_process_audio_profile_disconnect(bt_audio_type_t type, bluetooth
 
                /* Update device status in connected list */
                _bt_add_headset_to_list(type, BT_STATE_DISCONNECTING, addr);
+               BT_PERMANENT_LOG("Disconnect %d", type);
        } else {
                BT_ERR("Profile [%d] connect failed!!", type);
        }
@@ -517,7 +523,14 @@ int _bt_audio_initialize(bt_service_module_t module)
                break;
        }
        case BT_HFP_MODULE: {
-               return BLUETOOTH_ERROR_NOT_SUPPORT;
+               status = hf_client_enable();
+               if (OAL_STATUS_SUCCESS != status) {
+                       BT_ERR("Failed to initialize Bluetooth HFP client Profile, status: %d", status);
+                       return BLUETOOTH_ERROR_INTERNAL;
+               }
+               /* Register Audio module event handler */
+               _bt_service_register_event_handler_callback(module, _bt_hf_client_event_handler);
+               break;
        }
        case BT_AG_MODULE: {
                status = hfp_enable(1);
@@ -835,6 +848,7 @@ int __bt_handle_audio_all_connect(bt_pending_audio_conn_t *info)
                        goto fail;
                }
 
+               BT_PERMANENT_LOG("Connect %d", info->type);
                /* If multiple profiles are supported, queue pending connection info */
                if ((info->is_hfp_supported && info->is_a2dp_sink_supported) ||
                                (info->is_hfp_supported && info->is_a2dp_src_supported)) {
@@ -851,12 +865,20 @@ int __bt_handle_audio_all_connect(bt_pending_audio_conn_t *info)
                }
        } else if (ret == BLUETOOTH_ERROR_NONE) {
                BT_INFO("Waiting for disconnection...");
-               /*
-                * It means, we dont need pending connect info as only A2DP (Src/Snk) or
-                * HFP will be connected for present device, so lets free pending info.
-                */
-               g_free(info->address);
-               g_free(info);
+
+               if ((info->is_hfp_supported && info->is_a2dp_sink_supported) ||
+                               (info->is_hfp_supported && info->is_a2dp_src_supported)) {
+                       BT_INFO("[%s] Supports HFP and (A2DP_Src or, A2DP_Snk)", info->address);
+                       pending_audio_conn_list = g_slist_append(pending_audio_conn_list, (gpointer)info);
+               } else {
+                       BT_INFO("[%s] Supports one profile only", info->address);
+                       /*
+                        * It means, we dont need pending connect info as only A2DP (Src/Snk) or
+                        * HFP will be connected for present device, so lets free pending info.
+                        */
+                       g_free(info->address);
+                       g_free(info);
+               }
        }
 
        BT_DBG("-");
@@ -1106,8 +1128,9 @@ static void __handle_pending_requests(int result, int service_function, void *us
        BT_DBG("+");
 
        /* Get method invocation context */
-       for (l = _bt_get_invocation_list(); l != NULL; l = g_slist_next(l)) {
+       for (l = _bt_get_invocation_list(); l != NULL; ) {
                req_info = l->data;
+               l = g_slist_next(l);
 
                if (req_info == NULL || req_info->service_function != service_function)
                        continue;
@@ -1262,3 +1285,31 @@ void _bt_audio_set_current_role(bluetooth_audio_role_t role)
        BT_INFO("role: %s", (role == BLUETOOTH_A2DP_SINK) ? "AUDIO_SINK" : "AUDIO_SOURCE");
        curr_audio_role = role;
 }
+
+int _bt_hf_connect(bluetooth_device_address_t *device_address)
+{
+       int result = BLUETOOTH_ERROR_NONE;
+       BT_INFO("+");
+
+       result = _bt_connect_remote_ag(device_address);
+       if (result != BLUETOOTH_ERROR_NONE)
+               BT_ERR("HF Client connect to remote AG failed");
+       else
+               BT_PERMANENT_LOG("Connect AG");
+
+       return result;
+}
+
+int _bt_hf_disconnect(bluetooth_device_address_t *device_address)
+{
+       int result = BLUETOOTH_ERROR_NONE;
+       BT_INFO("+");
+
+       result = _bt_disconnect_remote_ag(device_address);
+       if (result != BLUETOOTH_ERROR_NONE)
+               BT_ERR("HF Client disconnect to remote AG failed");
+       else
+               BT_PERMANENT_LOG("Disconnect AG");
+
+       return result;
+}