X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=hf-agent%2Fbluetooth-hf-agent.c;h=a2fae12cdb93b12d5956d1a555b098b399880807;hb=refs%2Fheads%2Ftizen_7.0;hp=edc623ab29709ef96d1795d64cae37cf68de306f;hpb=2d1f0002e2e0c4cdf1d847da98fb295ec4e7677f;p=platform%2Fcore%2Fconnectivity%2Fbluetooth-agent.git diff --git a/hf-agent/bluetooth-hf-agent.c b/hf-agent/bluetooth-hf-agent.c index edc623a..5f10057 100644 --- a/hf-agent/bluetooth-hf-agent.c +++ b/hf-agent/bluetooth-hf-agent.c @@ -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,20 @@ 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) { + ret = __bt_hf_send_and_read(bt_hf_info, BT_HF_XSAT_DA, buf, + sizeof(BT_HF_XSAT_DA) - 1); + if (!ret) { + ERR("BT_HF_XSAT_DA sending failed"); + return FALSE; + } + } + + 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 +3147,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 +3316,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 +3441,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 +3459,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 +3559,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 +3609,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 +3653,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 +3675,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 +4149,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 +4165,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 +4185,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;