Add new DA model names
[platform/core/connectivity/bluetooth-agent.git] / hf-agent / bluetooth-hf-agent.c
index edc623a..7c41013 100644 (file)
@@ -1212,7 +1212,7 @@ static void __bt_hf_agent_handle_ind_change(bt_hf_agent_info_t *bt_hf_info,
                                        "CallStarted", NULL);
                        bt_hf_info->is_dialing = FALSE;
                        bt_hf_info->call_active = TRUE;
-                       if (TIZEN_MODEL_NAME_FHUB)
+                       if (TIZEN_MODEL_NAME_DA)
                                bt_hf_info->call_state = BT_HF_DA_CALL_STAT_CALL_STARTED;
                } else if (bt_hf_info->call_active) {
                        __bt_hf_agent_emit_signal(conn,
@@ -1220,7 +1220,7 @@ static void __bt_hf_agent_handle_ind_change(bt_hf_agent_info_t *bt_hf_info,
                                        BT_HF_SERVICE_INTERFACE,
                                        "CallEnded", NULL);
                        bt_hf_info->call_active = FALSE;
-                       if (TIZEN_MODEL_NAME_FHUB)
+                       if (TIZEN_MODEL_NAME_DA)
                                bt_hf_info->call_state = BT_HF_DA_CALL_STAT_CALL_ENDED;
 
                        if (bt_hf_info->ciev_call_setup_status == 0) {
@@ -1228,7 +1228,7 @@ static void __bt_hf_agent_handle_ind_change(bt_hf_agent_info_t *bt_hf_info,
                                                BT_HF_AGENT_OBJECT_PATH,
                                                BT_HF_SERVICE_INTERFACE,
                                                "CallIdle", NULL);
-                               if (TIZEN_MODEL_NAME_FHUB)
+                               if (TIZEN_MODEL_NAME_DA)
                                        bt_hf_info->call_state = BT_HF_DA_CALL_STAT_CALL_IDLE;
                        }
                }
@@ -1242,7 +1242,7 @@ static void __bt_hf_agent_handle_ind_change(bt_hf_agent_info_t *bt_hf_info,
                                        BT_HF_SERVICE_INTERFACE,
                                        "CallTerminated",
                                        NULL);
-                       if (TIZEN_MODEL_NAME_FHUB)
+                       if (TIZEN_MODEL_NAME_DA)
                                bt_hf_info->call_state = BT_HF_DA_CALL_STAT_CALL_TERMINATED;
                } else if (!bt_hf_info->is_dialing && value > 0) {
                        bt_hf_info->is_dialing = TRUE;
@@ -1253,7 +1253,7 @@ static void __bt_hf_agent_handle_ind_change(bt_hf_agent_info_t *bt_hf_info,
                                        BT_HF_AGENT_OBJECT_PATH,
                                        BT_HF_SERVICE_INTERFACE,
                                        "CallSetupIncoming", NULL);
-                       if (TIZEN_MODEL_NAME_FHUB)
+                       if (TIZEN_MODEL_NAME_DA)
                                bt_hf_info->call_state = BT_HF_DA_CALL_STAT_CALL_SETUP_INCOMING;
                        if (__bt_hf_agent_launch_call_app()  == FALSE)
                                DBG("call app launching failed");
@@ -1262,14 +1262,14 @@ static void __bt_hf_agent_handle_ind_change(bt_hf_agent_info_t *bt_hf_info,
                                        BT_HF_AGENT_OBJECT_PATH,
                                        BT_HF_SERVICE_INTERFACE,
                                        "CallSetupDialing", NULL);
-                       if (TIZEN_MODEL_NAME_FHUB)
+                       if (TIZEN_MODEL_NAME_DA)
                                bt_hf_info->call_state = BT_HF_DA_CALL_STAT_CALL_SETUP_DIALING;
                } else if (bt_hf_info->ciev_call_setup_status == 3) {
                        __bt_hf_agent_emit_signal(gdbus_conn,
                                        BT_HF_AGENT_OBJECT_PATH,
                                        BT_HF_SERVICE_INTERFACE,
                                        "CallSetupAlerting", NULL);
-                       if (TIZEN_MODEL_NAME_FHUB)
+                       if (TIZEN_MODEL_NAME_DA)
                                bt_hf_info->call_state = BT_HF_DA_CALL_STAT_CALL_SETUP_ALERTING;
                } else  if (bt_hf_info->ciev_call_status == 0 &&
                                                bt_hf_info->ciev_call_setup_status == 0) {
@@ -1277,7 +1277,7 @@ static void __bt_hf_agent_handle_ind_change(bt_hf_agent_info_t *bt_hf_info,
                                        BT_HF_AGENT_OBJECT_PATH,
                                        BT_HF_SERVICE_INTERFACE,
                                                "CallIdle", NULL);
-                       if (TIZEN_MODEL_NAME_FHUB)
+                       if (TIZEN_MODEL_NAME_DA)
                                bt_hf_info->call_state = BT_HF_DA_CALL_STAT_CALL_IDLE;
                }
        } else if (!strcmp(name, "\"callheld\"")) {
@@ -2571,7 +2571,8 @@ static void __release_audio_out(bt_hf_agent_info_t *bt_hf_info)
        INFO("+");
 
        if (bt_hf_info->audio_output != NULL) {
-               audio_out_drain((audio_out_h)bt_hf_info->audio_output);
+               /* Skip audio drain */
+               //audio_out_drain((audio_out_h)bt_hf_info->audio_output);
                audio_out_unprepare((audio_out_h)bt_hf_info->audio_output);
                audio_out_destroy((audio_out_h)bt_hf_info->audio_output);
                bt_hf_info->audio_output = NULL;
@@ -2805,7 +2806,7 @@ static gboolean __bt_hf_agent_sco_accept_cb(GIOChannel *chan, GIOCondition cond,
        g_io_channel_set_flags(sco_io, G_IO_FLAG_NONBLOCK, NULL);
        g_io_channel_set_buffered(sco_io, FALSE);
 
-       if (TIZEN_MODEL_NAME_FHUB) {
+       if (TIZEN_MODEL_NAME_DA) {
                bt_hf_info->call_state = BT_HF_DA_CALL_STAT_CALL_IDLE;
                bt_hf_info->is_first_audio_out = TRUE;
                bt_hf_info->is_first_audio_in = TRUE;
@@ -3024,10 +3025,10 @@ static gboolean __bt_establish_service_level_conn(bt_hf_agent_info_t *bt_hf_info
        char *buf_ptr;
        guint feature;
 
-       if (TIZEN_MODEL_NAME_FHUB)
+       if (TIZEN_MODEL_NAME_DA)
                feature = BT_HF_FEATURE_CLI_PRESENTATION |
                                BT_HF_FEATURE_REMOTE_VOLUME_CONTROL |
-                               BT_HF_FEATURE_ENHANCED_CALL_STATUS;
+                               BT_HF_FEATURE_ESCO_S4;
        else {
                feature = BT_HF_FEATURE_EC_ANDOR_NR |
                                BT_HF_FEATURE_CALL_WAITING_AND_3WAY |
@@ -3136,12 +3137,14 @@ static void __bt_establish_initialization(bt_hf_agent_info_t *bt_hf_info)
        else
                ERR("__bt_get_bia_cmd is failed");
 
-       ret = __bt_hf_send_and_read(bt_hf_info, BT_HF_XSAT, buf,
+       if (!TIZEN_MODEL_NAME_DA) {
+               ret = __bt_hf_send_and_read(bt_hf_info, BT_HF_XSAT, buf,
                                                sizeof(BT_HF_XSAT) - 1);
-       if (ret)
-               DBG("sent BT_HF_XSAT");
-       else
-               ERR("BT_HF_XSAT sending failed");
+               if (ret)
+                       DBG("sent BT_HF_XSAT");
+               else
+                       ERR("BT_HF_XSAT sending failed");
+       }
 
        if (TIZEN_PROFILE_WEARABLE) {
                /* send Bluetooth Samsung Support Feature cmd */
@@ -3303,6 +3306,100 @@ done:
        return FALSE;
 }
 
+static void __unprepare_stream_info(void)
+{
+       int ret;
+
+       if (!g_stream_info_write_h) {
+               ERR("no stream to destroy");
+               return;
+       }
+
+       ret = sound_manager_destroy_stream_information(g_stream_info_write_h);
+       if (ret != SOUND_MANAGER_ERROR_NONE) {
+               ERR("Failed to destroy stream information");
+               return;
+       }
+
+       g_stream_info_write_h = NULL;
+}
+
+void stream_focus_cb(sound_stream_info_h stream_info, sound_stream_focus_mask_e focus_mask, sound_stream_focus_state_e focus_state,
+                       sound_stream_focus_change_reason_e reason, int sound_behavior, const char *extra_info, void *user_data)
+{
+       return;
+}
+
+static gboolean __prepare_stream_info(void)
+{
+       int ret;
+       sound_device_list_h g_device_list = NULL;
+       sound_device_h device = NULL;
+       sound_device_type_e selected_type = SOUND_DEVICE_BUILTIN_SPEAKER;
+       sound_device_type_e type = SOUND_DEVICE_BUILTIN_SPEAKER;
+
+       if (TIZEN_MODEL_NAME_FHUB) {
+               char *processor = NULL;
+
+               system_info_get_platform_string("tizen.org/system/platform.processor", &processor);
+               if (processor) {
+                       if (!strcasecmp(processor, "SDP1601")) {
+                               DBG("set specific sound type");
+                               selected_type = SOUND_DEVICE_BUILTIN_RECEIVER;
+                               type = SOUND_DEVICE_BUILTIN_RECEIVER;
+                       }
+                       free(processor);
+               }
+       }
+
+       if (g_stream_info_write_h) {
+               ERR("there is already created one %p", g_stream_info_write_h);
+               __unprepare_stream_info();
+       }
+
+       ret = sound_manager_create_stream_information(SOUND_STREAM_TYPE_VOIP, stream_focus_cb, NULL, &g_stream_info_write_h);
+       if (ret != SOUND_MANAGER_ERROR_NONE) {
+               ERR("Failed to create stream information");
+               return FALSE;
+       }
+       INFO("created stream info %p", g_stream_info_write_h);
+
+       ret = sound_manager_get_device_list(SOUND_DEVICE_IO_DIRECTION_OUT_MASK, &g_device_list);
+       if (ret != SOUND_MANAGER_ERROR_NONE) {
+               ERR("fail to get current device list, ret(0x%x)\n", ret);
+               return FALSE;
+       }
+
+       // find voip device
+       while (!sound_manager_get_next_device(g_device_list, &device)) {
+               if ((ret = sound_manager_get_device_type(device, &type))) {
+                       ERR("fail to get type of device, ret(0x%x)\n", ret);
+                       break;
+               }
+
+               if (selected_type == type) {
+                       DBG("try to set route for device\n");
+                       ret = sound_manager_add_device_for_stream_routing(g_stream_info_write_h, device);
+                       if (ret == SOUND_MANAGER_ERROR_NONE) {
+                               ret = sound_manager_apply_stream_routing(g_stream_info_write_h);
+                               if (ret != SOUND_MANAGER_ERROR_NONE)
+                                       ERR("failed to sound_manager_apply_stream_routing(), ret(0x%x)\n", ret);
+                       } else {
+                               ERR("failed to sound_manager_add_device_for_stream_routing(), ret(0x%x)\n", ret);
+                       }
+                       break;
+               }
+       }
+
+       ret = sound_manager_free_device_list(g_device_list);
+       if (ret != SOUND_MANAGER_ERROR_NONE)
+               ERR("fail to free device list, ret[0x%x]\n", ret);
+       else
+               g_device_list = NULL;
+
+       return TRUE;
+}
+
 static gboolean __bt_hf_agent_connection(gint32 fd, const gchar *obj_path)
 {
        GIOFlags flags;
@@ -3334,6 +3431,9 @@ static gboolean __bt_hf_agent_connection(gint32 fd, const gchar *obj_path)
        __bt_convert_addr_type_to_rev_string(bt_hf_info.remote_addr,
                                                address.remote_bdaddr.b);
 
+       if (TIZEN_MODEL_NAME_DA)
+               __prepare_stream_info();
+
        g_idle_add(__bt_agent_request_service_level_conn, NULL);
 
        return TRUE;
@@ -3349,6 +3449,9 @@ static gboolean __bt_hf_agent_release(void)
        int bt_device_state = VCONFKEY_BT_DEVICE_NONE;
        GDBusConnection *conn;
 
+       if (TIZEN_MODEL_NAME_DA)
+               __unprepare_stream_info();
+
        if (clcc_timer) {
                g_source_remove(clcc_timer);
                clcc_timer = 0;
@@ -3446,7 +3549,7 @@ static int __bt_hf_register_profile(const char *uuid, uint16_t version,
        g_variant_builder_add(builder, "{sv}",
                        "features", g_variant_new("q", features));
 
-       if (TIZEN_MODEL_NAME_FHUB)
+       if (TIZEN_MODEL_NAME_DA)
                ret = g_dbus_proxy_call_sync(proxy, "RegisterProfile",
                                        g_variant_new("(osa{sv})", object,
                                                uuid, builder),
@@ -3496,7 +3599,7 @@ static void __bt_hf_agent_register(void)
        if (ret)
                ERR("Error in hf register");
 
-       if (TIZEN_MODEL_NAME_FHUB) {
+       if (TIZEN_MODEL_NAME_DA) {
                ret = __bt_hf_register_profile(PBAP_PCE_UUID, 0x0101,
                                        "Phone Book Access Client",
                                        BT_PBAP_CLIENT_OBJECT_PATH, 0);
@@ -3540,15 +3643,14 @@ static void __bt_hf_agent_filter_cb(GDBusConnection *connection,
                                                 GVariant *parameters,
                                                 gpointer user_data)
 {
-       DBG("+");
        char *path = NULL;
-
-       GVariant *optional_param;
+       GVariant *optional_param = NULL;
 
        if (strcasecmp(signal_name, "InterfacesAdded") == 0) {
+               g_variant_get(parameters, "(&o@a{sa{sv}})", &path, &optional_param);
+               if (optional_param)
+                       g_variant_unref(optional_param);
 
-               g_variant_get(parameters, "(&o@a{sa{sv}})",
-                               &path, &optional_param);
                if (!path) {
                        ERR("Invalid adapter path");
                        return;
@@ -3563,8 +3665,10 @@ static void __bt_hf_agent_filter_cb(GDBusConnection *connection,
                g_variant_get(parameters, "(&o@as)", &path, &optional_param);
                if (!path)
                        __bt_hf_agent_unregister();
+
+               if (optional_param)
+                       g_variant_unref(optional_param);
        }
-       DBG("-");
 }
 
 static int __bt_hf_agent_get_adapter_path(GDBusConnection *conn, char *path)
@@ -4035,10 +4139,10 @@ static uint32_t __bt_hf_agent_get_hf_features(void)
 {
        uint32_t hf_features;
 
-       if (TIZEN_MODEL_NAME_FHUB)
+       if (TIZEN_MODEL_NAME_DA)
                hf_features = BT_HF_FEATURE_CLI_PRESENTATION |
                                BT_HF_FEATURE_REMOTE_VOLUME_CONTROL |
-                               BT_HF_FEATURE_ENHANCED_CALL_STATUS;
+                               BT_HF_FEATURE_ESCO_S4;
        else {
                hf_features = BT_HF_FEATURE_EC_ANDOR_NR |
                                BT_HF_FEATURE_CALL_WAITING_AND_3WAY |
@@ -4051,7 +4155,10 @@ static uint32_t __bt_hf_agent_get_hf_features(void)
                        hf_features = hf_features | BT_HF_FEATURE_CODEC_NEGOTIATION;
        }
 
-       hf_ver = HFP_VERSION_1_6;
+       if (TIZEN_MODEL_NAME_DA)
+               hf_ver = HFP_VERSION_1_7;
+       else
+               hf_ver = HFP_VERSION_1_6;
 
        return hf_features;
 }
@@ -4068,7 +4175,10 @@ int main(void)
        g_type_init();
 #endif
        hf_features = __bt_hf_agent_get_hf_features();
-       bt_hf_info.feature = (uint16_t) hf_features & 0x3F;
+       if (TIZEN_MODEL_NAME_DA)
+               bt_hf_info.feature = (uint16_t) hf_features & 0xFFFF;
+       else
+               bt_hf_info.feature = (uint16_t) hf_features & 0x3F;
 
        bt_hf_info.audio_input = NULL;
        bt_hf_info.audio_output = NULL;