#ifdef SUPPORT_MS_EXTENSIONS #pragma bss_seg(".phone_call.data.bss") #pragma data_seg(".phone_call.data") #pragma const_seg(".phone_call.text.const") #pragma code_seg(".phone_call.text") #endif #include "system/includes.h" #include "media/includes.h" #include "btstack/avctp_user.h" #include "btstack/btstack_task.h" #include "btstack/a2dp_media_codec.h" #include "btstack/bluetooth.h" #include "btctrler/btctrler_task.h" #include "btctrler/btcontroller_modules.h" #include "classic/hci_lmp.h" #include "bt_common.h" #include "bt_ble.h" #include "pbg_user.h" #include "user_cfg.h" #include "audio_cvp.h" #include "app_tone.h" #include "a2dp_player.h" #include "esco_player.h" #include "esco_recoder.h" #include "bt.h" #include "app_config.h" #include "app_testbox.h" #include "app_online_cfg.h" #include "app_main.h" #include "vol_sync.h" #include "audio_config.h" #include "bt_slience_detect.h" #include "mic_effect.h" #if TCFG_SMART_VOICE_ENABLE #include "asr/jl_kws.h" #include "smart_voice/smart_voice.h" #endif #include "ui_api.h" #include "data_storage.h" #include "app_common.h" #if(TCFG_USER_TWS_ENABLE == 0) #define LOG_TAG "[PHONECALL]" #define LOG_ERROR_ENABLE #define LOG_DEBUG_ENABLE #define LOG_INFO_ENABLE #define LOG_CLI_ENABLE #include "debug.h" #if TCFG_APP_BT_EN /*配置通话时前面丢掉的数据包包数*/ #define ESCO_DUMP_PACKET_ADJUST 1 /*配置使能*/ #define ESCO_DUMP_PACKET_DEFAULT 0 #define ESCO_DUMP_PACKET_CALL 60 /*0~0xFF*/ #define SYNC_TONE_PHONE_RING_TIME 300 enum { CMD_OPEN_ESCO_PLAYER = 1, CMD_CLOSE_ESCO_PLAYER, CMD_PHONE_INCOME, CMD_PHONE_OUT, CMD_PHONE_HANGUP, CMD_PHONE_ACTIVE, CMD_PHONE_LASET_CALL_TYPE, CMD_PHONE_SIRI, }; static void phone_income_num_check(void *priv); static void phone_call_send_cmd(u8 cmd, u8 *btaddr, u8 bt_value, u8 tx_do_action); #if (defined(CONFIG_UI_STYLE_JL_PUBLIC_MODLS_ENABLE)) extern void ui_phone_call_end_status_check(void); #endif static u8 g_play_addr[6]; static u8 esco_dump_packet = ESCO_DUMP_PACKET_CALL; static unsigned long phone_call_start = 0; static u8 phone_call_status = 0; //用于记录通话开始时间 unsigned long bt_phone_call_start_time_get() { printf("%s %d", __func__, (u32)phone_call_start); return phone_call_start; } void tone_ring_player_stop() { tone_player_stop(); ring_player_stop(); } #if TCFG_BT_CALL_PHONE_BY_WATCH extern void lmp_esco_rejust_establish(u8 value); #define WATCH_SCO_DLY_MS (300) // 延时断开sco链路 static u16 bt_esco_by_watch_time; static u16 disable_sco_timer; static bool bt_esco_by_watch; static u8 disable_sco_mod = 0; //通话拦截模式选择 0:连接后断开 1:拒绝esco连接 void set_bt_esco_by_watch(bool flag) { bt_esco_by_watch = flag; } bool get_bt_esco_by_watch() { return bt_esco_by_watch; } static void display_call_dly() { printf("%s dec_begin:%d call_status():%d", __func__, g_bt_hdl.phone_call_dec_begin, bt_get_call_status()); if (g_bt_hdl.phone_call_dec_begin) { if (bt_get_call_status() == BT_CALL_ACTIVE) { UI_WINDOW_PREEMPTION_POSH(ID_WINDOW_PHONE_CALL_STATUS, NULL, NULL, UI_WINDOW_PREEMPTION_TYPE_PHONE); } } else { if (bt_get_call_status() == BT_CALL_ACTIVE) { #if TCFG_UI_ENABLE && CONFIG_JL_UI_ENABLE if (get_need_password() == 1) { /* UI_HIDE_CURR_WINDOW(); */ UI_WINDOW_PREEMPTION_POP(ID_WINDOW_PHONE_CALL_STATUS); UI_SHOW_WINDOW(ID_WINDOW_POWERON_PASSWORD); } else { UI_WINDOW_PREEMPTION_POP(ID_WINDOW_PHONE_CALL_STATUS); } /* UI_WINDOW_PREEMPTION_POP(ID_WINDOW_PHONE_CALL_STATUS); */ #endif } } } /* ***************************************************************************/ /** * @brief :手机接听电话后定时器函数 @param @return @note 用于判断手机接听后一秒内禁止esco连接的计时函数 bt_esco_by_watch_time = sys_timeout_add (NULL,bt_esco_conn_time,1000); */ /* ***************************************************************************/ static void bt_esco_conn_time() { if (disable_sco_mod) { lmp_esco_rejust_establish(0); } if (bt_esco_by_watch_time) { sys_timeout_del(bt_esco_by_watch_time); bt_esco_by_watch_time = 0; } } static void watch_sco_dly_time_del(void) { if (disable_sco_timer) { sys_timeout_del(disable_sco_timer); disable_sco_timer = 0; } } static void send_sco_disconn(void *priv) { disable_sco_timer = 0; bt_cmd_prepare(USER_CTRL_DISCONN_SCO, 0, NULL); } static void watch_sco_dly_disconnection() { watch_sco_dly_time_del(); disable_sco_timer = sys_timeout_add(NULL, send_sco_disconn, WATCH_SCO_DLY_MS); } /* ***************************************************************************/ /** * @brief :手机接听电话后定时时间内禁止esco连接 @param @return @note 用于判断手机接听后一秒内禁止esco连接的函数 放于esco发生连接状态中调用 */ /* ***************************************************************************/ static bool bt_esco_ban_conn() { if (bt_esco_by_watch_time) { watch_sco_dly_disconnection(); return true; } return false; } #endif static u8 phone_ring_play_start(void) { log_info("%s,%d\n", __FUNCTION__, g_bt_hdl.inband_ringtone); /* check if support inband ringtone */ if (BT_CALL_INCOMING != bt_get_call_status_for_addr(g_bt_hdl.phone_ring_addr)) { return 0; } if (!g_bt_hdl.inband_ringtone) { play_ring_file_alone(get_tone_files()->phone_in); return 1; } return 0; } void phone_second_call_ring_play_start(void *priv) { //音频设计只有在ESCO工作的时候,播嘟嘟声才能叠加 //两种情况,一是先有嘟嘟声,然后来了ESCO铃声,要先关嘟嘟再开。 //二是两个都是ESCO铃声,第二个打断了第一个之后,第一个的铃声变成嘟嘟叠加。指示有两个来电 log_info("%s\n", __FUNCTION__); u8 *other_addr = NULL; if (priv) { other_addr = btstack_get_other_dev_addr(priv) ; put_buf(priv, 6); printf("bt_get_call_status_for_addr=%d,%d\n", bt_get_call_status_for_addr(priv), bt_get_call_status_for_addr(other_addr)); } if (bt_stack_get_incoming_call_num() > 1 || (priv && bt_get_call_status_for_addr(priv) == BT_CALL_INCOMING && bt_get_call_status_for_addr(other_addr) != BT_CALL_OUTGOING)) { play_ring_file_alone(get_tone_files()->phone_in); } } int bt_phone_income(u8 after_conn, u8 *bt_addr) { #if TCFG_BT_INBAND_RING #else lmp_private_esco_suspend_resume(3); #endif tone_ring_player_stop(); memcpy(g_bt_hdl.phone_ring_addr, bt_addr, 6); put_buf(g_bt_hdl.phone_ring_addr, 6); void *device = btstack_get_conn_device(bt_addr); if (!device || BT_CALL_HANGUP == btstack_bt_get_call_status(device)) { puts("bt_phone_income err 1\n"); return 1; } #if TCFG_BT_INBAND_RING g_bt_hdl.inband_ringtone = btstack_get_inband_ringtone_flag_for_addr(bt_addr); #else g_bt_hdl.inband_ringtone = 0 ; #endif printf("inband_ringtone=0x%x %d\n", g_bt_hdl.inband_ringtone, after_conn); g_bt_hdl.phone_ring_flag = 1; g_bt_hdl.phone_income_flag = 1; if (bt_stack_get_incoming_call_num() > 1) { //第一次来电被置上一次。第二次再来就有值了 sys_timeout_add(g_bt_hdl.phone_ring_addr, phone_second_call_ring_play_start, 2000); } else { if (g_bt_hdl.inband_ringtone) { if (after_conn == 2) { //强制播本地铃声 sys_timeout_add(g_bt_hdl.phone_ring_addr, phone_second_call_ring_play_start, 2000); } } else { #if TCFG_BT_PHONE_NUMBER_ENABLE if (after_conn) { phone_ring_play_start(); } else { phone_income_num_check(NULL); } #else phone_ring_play_start(); #endif } } return 0; } int bt_phone_hangup(u8 *bt_addr) { esco_dump_packet = ESCO_DUMP_PACKET_CALL; log_info("phone_handup\n"); if (g_bt_hdl.phone_ring_flag) { g_bt_hdl.phone_ring_flag = 0; tone_ring_player_stop(); if (g_bt_hdl.phone_timer_id) { sys_timeout_del(g_bt_hdl.phone_timer_id); g_bt_hdl.phone_timer_id = 0; } } g_bt_hdl.phone_income_flag = 0; g_bt_hdl.phone_num_flag = 0; lmp_private_esco_suspend_resume(4); /* * 挂断的时候会清除了一些标识并且会stop了提示音 * 判断如果另一个手机还在来电并且不支持inband ring,那就恢复一个嘟嘟声提示音 */ u8 temp_btaddr[6]; u8 *addr = btstack_get_other_dev_addr(bt_addr); if (addr && bt_get_call_status_for_addr(bt_addr) != BT_CALL_OUTGOING) { //有另一个连接存在 u8 call_status = bt_get_call_status_for_addr(addr); u8 inband_ring_flag = btstack_get_inband_ringtone_flag_for_addr(addr); printf("other connect call sta:%d-%d-%d\n", call_status, inband_ring_flag, bt_check_esco_state_via_addr(addr)); if (call_status == BT_CALL_INCOMING) { memcpy(g_bt_hdl.phone_ring_addr, addr, 6); if ((inband_ring_flag == 0) || (inband_ring_flag && bt_check_esco_state_via_addr(g_bt_hdl.phone_ring_addr) == BT_ESCO_STATUS_CLOSE)) { phone_call_send_cmd(CMD_PHONE_INCOME, g_bt_hdl.phone_ring_addr, 2, 1); } } } return 0; } static int bt_phone_out(u8 *bt_addr) { esco_dump_packet = ESCO_DUMP_PACKET_CALL; g_bt_hdl.phone_income_flag = 0; return 0; } static int esco_audio_open(u8 *bt_addr) { esco_player_open(bt_addr); #if TCFG_TWS_POWER_BALANCE_ENABLE && TCFG_USER_TWS_ENABLE /* #if 0 //功能未完善,暂时关闭 */ if (tws_api_get_role() == TWS_ROLE_MASTER) { log_info("tws_master open esco recoder\n"); esco_recoder_open(COMMON_SCO, bt_addr); } else { log_info("tws_slave don't open esco recoder\n"); } #else esco_recoder_open(COMMON_SCO, bt_addr); #endif/*TCFG_TWS_POWER_BALANCE_ENABLE && TCFG_USER_TWS_ENABLE*/ return 0; } static int bt_phone_active(u8 *bt_addr) { if (g_bt_hdl.phone_call_dec_begin) { log_info("call_active,dump_packet clear\n"); esco_dump_packet = ESCO_DUMP_PACKET_DEFAULT; } if (g_bt_hdl.phone_ring_flag) { g_bt_hdl.phone_ring_flag = 0; tone_ring_player_stop(); if (g_bt_hdl.phone_timer_id) { sys_timeout_del(g_bt_hdl.phone_timer_id); g_bt_hdl.phone_timer_id = 0; } } lmp_private_esco_suspend_resume(4); g_bt_hdl.phone_income_flag = 0; g_bt_hdl.phone_num_flag = 0; /* g_bt_hdl.phone_con_sync_ring = 0; */ g_bt_hdl.phone_vol = 15; r_printf("phone_active:%d\n", app_var.call_volume); app_audio_set_volume(APP_AUDIO_STATE_CALL, app_var.call_volume, 1); return 0; } #define ESCO_SIRI_WAKEUP() (app_var.siri_stu == 1 || app_var.siri_stu == 2) static void esco_smart_voice_detect_handler(void) { #if TCFG_SMART_VOICE_ENABLE && !TCFG_AUDIO_ASR_DEVELOP #if TCFG_CALL_KWS_SWITCH_ENABLE if (ESCO_SIRI_WAKEUP() || (bt_get_call_status() != BT_CALL_INCOMING)) { audio_smart_voice_detect_close(); } #else audio_smart_voice_detect_close(); #endif #endif } int bt_phone_esco_play(u8 *bt_addr) { puts("<<<<<<<<<<= ESCO_MEM_CHECK_SAVE_SIZE) { printf("esco ram is is ok \n"); esco_play_in_task(esco_cmd_data); sys_timer_del(esco_check_timer); esco_check_timer = 0; } } #endif static void esco_play_in_task(u8 *data) { u8 *bt_addr = data + 2; u8 bt_value = data[8] ; r_printf("esco_play_in_task=%d\n", data[0]); switch (data[0]) { case CMD_OPEN_ESCO_PLAYER: #if ESCO_MEM_CHECK //先丟包 int num = esco_media_get_packet_num(); if (num) { printf("free esco %d\n", num); lmp_private_clear_sco_packet(num); } //解决通话瞬态内存问题 #if (defined(CONFIG_UI_STYLE_JL_PUBLIC_MODLS_ENABLE)) if (UI_GET_WINDOW_ID() != ID_WINDOW_PHONE_CALL_STATUS) { if (call_ctrl_get_status() != BT_SIRI_STATE) { // 如果是siri状态,不显示通话界面 UI_WINDOW_PREEMPTION_POSH(ID_WINDOW_PHONE_CALL_STATUS, NULL, NULL, UI_WINDOW_PREEMPTION_TYPE_PHONE); } } #endif //释放内存 if (xPortGetPhysiceMemorySize() < ESCO_MEM_CHECK_SAVE_SIZE) { printf("esco ram is dangerous \n"); memcpy(esco_cmd_data, data, 9); if (!esco_check_timer) { esco_check_timer = sys_timer_add(NULL, memory_esco_opt_phone_timer, 100); } break; } #endif #if (TCFG_BT_ESCO_PLAYER_ENABLE == 0) lmp_private_esco_suspend_resume(1); break; #endif bt_phone_esco_play(bt_addr); break; case CMD_CLOSE_ESCO_PLAYER: #if ESCO_MEM_CHECK if (esco_check_timer) { sys_timer_del(esco_check_timer); esco_check_timer = 0; } #endif bt_phone_esco_stop(bt_addr); break; case CMD_PHONE_HANGUP: bt_phone_hangup(bt_addr); break; case CMD_PHONE_ACTIVE: bt_phone_active(bt_addr); break; case CMD_PHONE_INCOME: bt_phone_income(bt_value, bt_addr); break; case CMD_PHONE_OUT: bt_phone_out(bt_addr); break; case CMD_PHONE_LASET_CALL_TYPE: bt_phone_last_call_type(bt_addr, bt_value); break; case CMD_PHONE_SIRI: bt_phone_siri(bt_addr, bt_value); break; } } static void phone_call_send_cmd(u8 cmd, u8 *btaddr, u8 bt_value, u8 tx_do_action) { u8 data[9]; data[0] = cmd; data[1] = 2; memcpy(data + 2, btaddr, 6); data[8] = bt_value; esco_play_in_task(data); } void phone_sync_vol(void) { bt_cmd_prepare(USER_CTRL_HFP_CALL_SET_VOLUME, 1, &g_bt_hdl.phone_vol); } #if ESCO_DUMP_PACKET_ADJUST u8 get_esco_packet_dump(void) { //log_info("esco_dump_packet:%d\n", esco_dump_packet); return esco_dump_packet; } #endif static u8 check_phone_income_idle(void) { if (g_bt_hdl.phone_ring_flag) { return 0; } return 1; } REGISTER_LP_TARGET(phone_incom_lp_target) = { .name = "phone_check", .is_idle = check_phone_income_idle, }; static int bt_phone_num_to_file_list(const char *file_list[], int max_file_num) { int i; char *num = (char *)(g_bt_hdl.income_phone_num); printf("phone_num: %s\n", num); for (i = 0; i < max_file_num && num[i] != '\0'; i++) { file_list[i] = get_tone_files()->num[num[i] - '0']; } return i; } int phone_income_num_play_end(void *priv, enum stream_event ev) { printf("%s\n", __func__); switch (ev) { case STREAM_EVENT_STOP: ///来电报号结束,启动本地铃声播放 phone_ring_play_start(); break; default: break; } return 0; } static void phone_income_num_check(void *priv) { const char *file_list[20]; g_bt_hdl.phone_timer_id = 0; if (g_bt_hdl.phone_num_flag) { if (g_bt_hdl.phone_ring_flag) { tone_ring_player_stop(); int file_num = bt_phone_num_to_file_list(file_list, ARRAY_SIZE(file_list)); if (g_bt_hdl.inband_ringtone == 0) { play_tone_files_alone_callback(file_list, file_num, NULL, phone_income_num_play_end); } else { play_tone_files_alone(file_list, file_num); } } } else { /*电话号码还没有获取到,定时查询*/ g_bt_hdl.phone_timer_id = sys_timeout_add(NULL, phone_income_num_check, 200); } } bool is_siri_open() { if (app_var.siri_stu == 1 || app_var.siri_stu == 2) { return 1; } return 0; } /* * 对应原来的状态处理函数,连接,电话状态等 */ static int bt_phone_status_event_handler(int *msg) { u8 *phone_number = NULL; struct bt_event *bt = (struct bt_event *)msg; switch (bt->event) { case BT_STATUS_PHONE_INCOME: log_info("BT_STATUS_PHONE_INCOME\n"); put_buf(bt->args, 6); phone_call_status = CMD_PHONE_INCOME; esco_dump_packet = ESCO_DUMP_PACKET_CALL; u8 tmp_bd_addr[6]; memcpy(tmp_bd_addr, bt->args, 6); /* *(1)1t2有一台通话的时候,另一台如果来电会叠加 */ phone_call_send_cmd(CMD_PHONE_INCOME, bt->args, 0, 1); /* bt_phone_income(0, 0, tmp_bd_addr); */ bt_cmd_prepare(USER_CTRL_HFP_CALL_CURRENT, 0, NULL); //发命令获取电话号码 #if TCFG_DATA_STORAGE_ENABLE small_file_call_log_set_sel(CALL_SEL_BT); small_file_call_log_set_type(CALL_INCOME); #endif UI_MOTO_RUN(1); #if (defined(CONFIG_UI_STYLE_JL_PUBLIC_MODLS_ENABLE)) if (UI_GET_WINDOW_ID() == ID_WINDOW_PHONE_CALL_STATUS) { ui_phone_call_end_status_check(); UI_MSG_POST("phone_income:status=%4", 1); } else { UI_WINDOW_PREEMPTION_POSH(ID_WINDOW_PHONE_CALL_STATUS, NULL, NULL, UI_WINDOW_PREEMPTION_TYPE_PHONE); } #endif break; case BT_STATUS_PHONE_OUT: log_info("BT_STATUS_PHONE_OUT\n"); put_buf(bt->args, 6); phone_call_status = CMD_PHONE_OUT; bt_phone_out(bt->args); phone_call_send_cmd(CMD_PHONE_OUT, bt->args, 0, 0); bt_cmd_prepare(USER_CTRL_HFP_CALL_CURRENT, 0, NULL); //发命令获取电话号码 #if TCFG_BT_CALL_PHONE_BY_WATCH if (get_bt_esco_by_watch() == FALSE) { // 增加手机去电mic使用手机端,同时会禁掉微信来电走手表这个功能 /* 延时200ms发送断开esco的命令,测试发现立马发送断开命令,手机会再次发送esco请求 */ /* 此处定时1s,在1s内发起的esco链路都会被断开 */ if (disable_sco_mod) { lmp_esco_rejust_establish(1); } bt_esco_by_watch_time = sys_timeout_add(NULL, bt_esco_conn_time, 1000); break; } else { if (disable_sco_mod) { lmp_esco_rejust_establish(0); } } #endif #if TCFG_DATA_STORAGE_ENABLE small_file_call_log_set_sel(CALL_SEL_BT); small_file_call_log_set_type(CALL_OUT); #endif #if (defined(CONFIG_UI_STYLE_JL_PUBLIC_MODLS_ENABLE)) if (UI_GET_WINDOW_ID() == ID_WINDOW_PHONE_CALL_STATUS) { ui_phone_call_end_status_check(); UI_MSG_POST("phone_out:status=%4", 1); } else { UI_WINDOW_PREEMPTION_POSH(ID_WINDOW_PHONE_CALL_STATUS, NULL, NULL, UI_WINDOW_PREEMPTION_TYPE_PHONE); } #endif break; case BT_STATUS_PHONE_ACTIVE: log_info("BT_STATUS_PHONE_ACTIVE\n"); if ((phone_call_status == CMD_PHONE_INCOME) || (phone_call_status == CMD_PHONE_OUT)) { phone_call_start = jiffies_msec(); } phone_call_status = CMD_PHONE_ACTIVE; phone_call_send_cmd(CMD_PHONE_ACTIVE, bt->args, 0, 1); UI_MOTO_RUN(0); #if TCFG_BT_CALL_PHONE_BY_WATCH if (get_bt_esco_by_watch() == FALSE) { /* 延时200ms发送断开esco的命令,测试发现立马发送断开命令,手机会再次发送esco请求 */ /* 此处定时1.5s,在1.5s内发起的esco链路都会被断开 */ /* 针对iphone se修改增加定时 */ if (disable_sco_mod) { lmp_esco_rejust_establish(1); } watch_sco_dly_disconnection(); bt_esco_by_watch_time = sys_timeout_add(NULL, bt_esco_conn_time, 1500); #if TCFG_UI_ENABLE if (UI_GET_WINDOW_ID() == ID_WINDOW_PHONE_CALL_STATUS) {//判断手表在来电界面,退出界面 UI_WINDOW_PREEMPTION_POP(ID_WINDOW_PHONE_CALL_STATUS); } #endif /* #if TCFG_UI_ENABLE */ break; } else { if (disable_sco_mod) { lmp_esco_rejust_establish(0); } } #endif #if TCFG_DATA_STORAGE_ENABLE small_file_call_log_set_date(); #endif UI_MSG_POST("phone_active:status=%4", 1); break; case BT_STATUS_PHONE_HANGUP: log_info("BT_STATUS_PHONE_HANGUP\n"); put_buf(bt->args, 6); phone_call_start = 0; phone_call_status = CMD_PHONE_HANGUP; phone_call_send_cmd(CMD_PHONE_HANGUP, bt->args, 0, 1); #if TCFG_BT_CALL_PHONE_BY_WATCH set_bt_esco_by_watch(0); #endif #if TCFG_DATA_STORAGE_ENABLE u32 utc_time = small_file_call_log_get_date(); if (utc_time == 0) { small_file_call_log_set_date(); } small_file_call_log_save(); #endif if (UI_GET_WINDOW_ID() == ID_WINDOW_PHONE_CALL_STATUS) { UI_MSG_POST("phone_hangup:status=%4", 1); } else { /*通话页面存于抢占页面缓存时候,当前抢占页面一直未退出时候 这时候挂断,得pop通话页面*/ UI_WINDOW_PREEMPTION_POP(ID_WINDOW_PHONE_CALL_STATUS); } UI_MOTO_RUN(0); break; case BT_STATUS_PHONE_NUMBER: log_info("BT_STATUS_PHONE_NUMBER\n"); #if TCFG_BT_SUPPORT_PBAP_LIST bt_cmd_prepare(USER_CTRL_PBAP_READ_LIST, 0, NULL); #endif phone_number = (u8 *)bt->value; if (g_bt_hdl.phone_num_flag == 1) { break; } g_bt_hdl.income_phone_len = 0; memset(g_bt_hdl.income_phone_num, '\0', sizeof(g_bt_hdl.income_phone_num)); for (int i = 0; i < strlen((const char *)phone_number); i++) { if (phone_number[i] >= '0' && phone_number[i] <= '9') { //过滤,只有数字才能报号 g_bt_hdl.income_phone_num[g_bt_hdl.income_phone_len++] = phone_number[i]; if (g_bt_hdl.income_phone_len >= sizeof(g_bt_hdl.income_phone_num)) { break; /*buffer 空间不够,后面不要了*/ } } } if (g_bt_hdl.income_phone_len > 0) { g_bt_hdl.phone_num_flag = 1; #if TCFG_DATA_STORAGE_ENABLE char name[CALL_LOG_NAME_LEN] = {0}; if (small_file_phonebook_get_name_by_number(name, (char *)&g_bt_hdl.income_phone_num)) { small_file_call_log_set_name(name, sizeof(name)); } small_file_call_log_set_number((char *)&g_bt_hdl.income_phone_num, sizeof(g_bt_hdl.income_phone_num)); #endif UI_MSG_POST("phone_num:status=%4", 1); } else { log_info("PHONE_NUMBER len err\n"); } break; case BT_STATUS_PHONE_NAME: log_info("BT_STATUS_PHONE_NAME\n"); u8 *phone_name = NULL; phone_name = (u8 *)bt->value; log_info(">>name:%s\n", phone_name); #if TCFG_DATA_STORAGE_ENABLE small_file_call_log_set_name((char *)phone_name, strlen((const char *)phone_name) + 1); #endif UI_MSG_POST("phone_name:name=%4", (u8 *)bt->value); break; case BT_STATUS_INBAND_RINGTONE: log_info("BT_STATUS_INBAND_RINGTONE\n"); #if TCFG_BT_INBAND_RING g_bt_hdl.inband_ringtone = bt->value; #else g_bt_hdl.inband_ringtone = 0; #endif printf("inband_ringtone=0x%x\n", g_bt_hdl.inband_ringtone); break; case BT_STATUS_SCO_STATUS_CHANGE: printf("BT_STATUS_SCO_STATUS_CHANGE len:%d, type:%d\n", (bt->value >> 16), (bt->value & 0x0000ffff)); if (bt->value != 0xff) { #if TCFG_BT_CALL_PHONE_BY_WATCH if (bt_esco_ban_conn()) { break; } else if (get_bt_esco_by_watch() == FALSE) { /* 用于判断部分手机来电铃声会发起esco请求 */ #if !TCFG_BT_INBAND_RING if (bt_get_call_status() != BT_CALL_ACTIVE) { watch_sco_dly_disconnection(); break; } #endif } #endif u8 call_vol = 15; //为了解决两个手机都在通话,在手机上轮流切声卡的音量问题 call_vol = bt_get_call_vol_for_addr(bt->args); //r_printf("---bt_get_call_vol_for_addr--%d\n", call_vol); app_audio_state_switch(APP_AUDIO_STATE_CALL, app_var.aec_dac_gain, NULL); app_audio_set_volume(APP_AUDIO_STATE_CALL, call_vol, 1); #if TCFG_MIC_EFFECT_ENABLE mic_effect_player_pause(1); #endif phone_call_send_cmd(CMD_OPEN_ESCO_PLAYER, bt->args, 0, 1); } else { u8 bt_esco_play[6]; int ret = esco_player_get_btaddr(bt_esco_play); #if TCFG_BT_CALL_PHONE_BY_WATCH watch_sco_dly_time_del(); #endif if (ret && memcmp(bt_esco_play, bt->args, 6) != 0) { //如果有地址在是用esco音频,但跟传出来的值地址不一致,就不更新了。 puts("<<<<<<<<<<args); */ phone_call_send_cmd(CMD_CLOSE_ESCO_PLAYER, bt->args, 0, 1); #if TCFG_MIC_EFFECT_ENABLE mic_effect_player_pause(0); #endif } #if TCFG_BT_CALL_PHONE_BY_WATCH printf("[esco change] display_call_dly"); sys_timeout_add(NULL, display_call_dly, 300); #endif break; case BT_STATUS_CALL_VOL_CHANGE: //判断是当前地址的音量值才更新 u8 bt_esco_play[6]; int ret = esco_player_get_btaddr(bt_esco_play); if (ret && memcmp(bt_esco_play, bt->args, 6) != 0) { //如果有地址在是用esco音频,但跟传出来的值地址不一致,就不更新了。 break; } printf("call_vol:%d", bt->value); u8 volume = bt->value; u8 call_status = bt_get_call_status_for_addr(bt->args); #if TCFG_BT_INBAND_RING if ((call_status != BT_CALL_ACTIVE) && (bt->value == 0)) { printf("not set vol\n"); break; } #endif g_bt_hdl.phone_vol = bt->value; if ((call_status == BT_CALL_ACTIVE) || (call_status == BT_CALL_OUTGOING) || app_var.siri_stu) { app_audio_set_volume(APP_AUDIO_STATE_CALL, volume, 1); } else { /* *只保存,不设置到dac *微信语音通话的时候,会更新音量到app,但是此时的call status可能是hangup */ app_var.call_volume = volume; } UI_MSG_POST("phone_volume:volume=%4", volume); break; case BT_STATUS_LAST_CALL_TYPE_CHANGE: log_info("BT_STATUS_LAST_CALL_TYPE_CHANGE:%d\n", bt->value); g_bt_hdl.last_call_type = bt->value; phone_call_send_cmd(CMD_PHONE_LASET_CALL_TYPE, bt->args, bt->value, 0); break; case BT_STATUS_CONN_HFP_CH: r_printf("++++++++ BT_STATUS_CONN_HFP_CH +++++++++ \n"); break; case BT_STATUS_DISCON_HFP_CH: r_printf("++++++++ BT_STATUS_DISCON_HFP_CH +++++++++ \n"); break; case BT_STATUS_PHONE_MANUFACTURER: log_info("BT_STATUS_PHONE_MANUFACTURER:%d\n", bt->value); app_var.remote_dev_company = bt->value; break; case BT_STATUS_SIRI_OPEN: case BT_STATUS_SIRI_CLOSE: case BT_STATUS_SIRI_GET_STATE: /* case BT_STATUS_VOICE_RECOGNITION: */ log_info(" BT_STATUS_SIRI_RECOGNITION:%d \n", bt->value); /* put_buf(bt, sizeof(struct bt_event)); */ app_var.siri_stu = bt->value; esco_dump_packet = ESCO_DUMP_PACKET_DEFAULT; phone_call_send_cmd(CMD_PHONE_SIRI, bt->args, bt->value, 0); break; default: log_info(" BT STATUS DEFAULT\n"); break; } return 0; } APP_MSG_HANDLER(bt_phone_msg_handler_stub) = { .owner = 0xff, .from = MSG_FROM_BT_STACK, .handler = bt_phone_status_event_handler, }; static int phone_hci_event_handler(int *event) { struct bt_event *bt = (struct bt_event *)event; switch (bt->event) { case HCI_EVENT_DISCONNECTION_COMPLETE: if (esco_player_is_playing(bt->args)) { bt_phone_esco_stop(bt->args); } break; } return 0; } APP_MSG_HANDLER(phone_hci_msg_stub) = { .owner = 0xff, .from = MSG_FROM_BT_HCI, .handler = phone_hci_event_handler, }; #endif #endif