From: dxy <1731678236qq.com> Date: Fri, 22 Aug 2025 11:05:46 +0000 (+0800) Subject: 蓝牙耳机连接功能优化 X-Git-Url: http://git.snicker.com.cn/?a=commitdiff_plain;h=d52584005cac2daa537012806dcecaf4af3e5b9f;p=mirrors%2F7PIN_V1_5_Jl_SDK.git 蓝牙耳机连接功能优化 --- diff --git a/2.code/1.sdk/apps/BK_app/BK_drive/bk_audio.c b/2.code/1.sdk/apps/BK_app/BK_drive/bk_audio.c index 7e04cba..b73849b 100644 --- a/2.code/1.sdk/apps/BK_app/BK_drive/bk_audio.c +++ b/2.code/1.sdk/apps/BK_app/BK_drive/bk_audio.c @@ -250,8 +250,8 @@ static void bk_iis_tx_cb(void *priv, void *buf, int len) } else { //memccpy(buf) //memset(buf, 0, 1024); - printf("bk_iis_tx_cb:数据不够!!!!!!!!!!!"); - printf("bk_iis_tx_cb:wlen:%d,len:%d",wlen,len); + // printf("bk_iis_tx_cb:数据不够!!!!!!!!!!!"); + // printf("bk_iis_tx_cb:wlen:%d,len:%d",wlen,len); alink_set_shn(&iis->alink_parm.ch_cfg[iis->alink_tx_ch], 256); } @@ -470,17 +470,36 @@ int read_iis_play_data(char *data, int len) } - +extern u8 esco_flag;//=1开启了通话,=0关闭了通话 void open_bt_audio(void)//打开蓝牙通话 { + BT_state=1; + printf("open_bt_audio"); __set_bt_esco_by_watch(1); user_emitter_cmd_prepare(USER_CTRL_CONN_SCO,0,NULL); user_emitter_cmd_prepare(USER_CTRL_HFP_CALL_LAST_NO,0,NULL); gpio_direction_output(TCFG_AUDIO_DAC_PA_PORT, 0); // + int count =100; + while(count --)//等待打开完成 + { + + if(esco_flag == 1 ) + break; + os_time_dly(1); + } } void close_bt_audio(void) { + printf("close_bt_audio"); user_emitter_cmd_prepare(USER_CTRL_HFP_CALL_HANGUP,0,NULL); + int count =100; + while(count --)//等待打开完成 + { + + if(esco_flag == 0 ) + break; + os_time_dly(1); + } } //extern void uart_demo(); @@ -490,7 +509,7 @@ void bk_audio_open() int err = 0; //return; - printf("audio_link_demo_open"); + printf("audio_link_demo_open:%d",bt_connect); printf("audio_link_demo_open:!!!!!!!!!!!!!\r\n"); printf("audio_link_demo_open:!!!!!!!!!!!!!\r\n"); @@ -498,9 +517,11 @@ void bk_audio_open() printf("audio_link_demo_open:!!!!!!!!!!!!!\r\n"); bk_iis_open(); - if(bt_connect){//蓝牙耳机 + + if(bt_connect == 2){//蓝牙耳机 if(local_audio_state == 1)//如果连了蓝牙,而且本地录音和音频已经打开,就关闭一次 { + printf("关闭本地通道!!!!!!!!!!"); close_local_audio(); local_audio_state = 0; } @@ -512,9 +533,10 @@ void bk_audio_open() printf("打开蓝牙通道!!!!!!!!!"); printf("打开蓝牙通道!!!!!!!!!"); //sys_timeout_add(NULL,emitter_hfp_call_answer,2000); - }else{ - BT_state = 0; - } + }else{ + BT_state = 0; + + } }else{ if(BT_state == 1)//如果打开了蓝牙耳机通道,关一次通话 @@ -546,6 +568,7 @@ void bk_audio_close() local_audio_state = 0; close_local_audio(); } + //close_local_audio(); //audio_adc_mic_close_demo(); } diff --git a/2.code/1.sdk/apps/BK_app/BK_drive/bk_uart.c b/2.code/1.sdk/apps/BK_app/BK_drive/bk_uart.c index 9eee113..1e5e5ba 100644 --- a/2.code/1.sdk/apps/BK_app/BK_drive/bk_uart.c +++ b/2.code/1.sdk/apps/BK_app/BK_drive/bk_uart.c @@ -13,6 +13,7 @@ #include "bk_app.h" #include "bk_uart.h" #include "BK_versions.h" +#include "btstack/avctp_user.h" int ut=0; OS_SEM uart_callback; char read_ack_flag= 0; @@ -481,11 +482,21 @@ int uart_send_single_bt_mac(u8 *name,u8 *mac,u8 connect) return -1; } printf("JSON数据: %s\n", json_string); + read_ack_flag = 0; bk_uart_send_smg(BK_UART_WRITE_DATA,json_string,strlen(json_string)); // (ut, json_string, strlen(json_string), 20); // 释放内存 cJSON_free(json_string); cJSON_Delete(root); + int count = 50; + while(count--) + { + if(read_ack_flag == 1) + { + break; + } + os_time_dly(1); + } return 0; } extern char userremote_name[32]; //当前连接或者断开的蓝牙名称 @@ -534,6 +545,7 @@ void send_bt_connect_state(void){ return; } printf("JSON数据1: %s\n", json_string); + read_ack_flag=0; bk_uart_send_smg(BK_UART_WRITE_DATA,json_string,strlen(json_string)); //(ut, json_string, strlen(json_string), 20); // 释放内存 @@ -552,11 +564,21 @@ void send_bt_connect_state(void){ printf("JSON数据2: %s\n", json_string); // uart_send_blocking(ut, json_string, strlen(json_string), 20); + read_ack_flag=0; bk_uart_send_smg(BK_UART_WRITE_DATA,json_string,strlen(json_string)); // 释放内存 cJSON_free(json_string); cJSON_Delete(root); } + int count = 50; + while(count--) + { + if(read_ack_flag == 1) + { + break; + } + os_time_dly(1); + } } int uart_send_bt_list(u8 *data) { @@ -827,15 +849,17 @@ void get_ble_switch_imei_timer_init(void) } } +static u16 auto_call_timerout_id = 0; extern u8 maddr[6]; -int uart_send_bt_state(u8 bt_state) //蓝牙向4G发送蓝牙耳机的状态 +void auto_switch_local_mic(void) //蓝牙耳机断开和进入通话后自动切换到本地麦克风输出音频播放 { - if(bt_state == 0){ //断开蓝牙耳机连接 - bk_app_send_smg(AI_CLOSE,NULL,0); - bk_app_send_smg(AI_OPEN,NULL,0); - } - + printf("auto_switch_local_mic!!!!!!!!"); + bk_app_send_smg(BT_State_Change_CB,NULL,0); +} +#include "key_event_deal.h" +int uart_send_bt_state(u8 bt_state) //蓝牙向4G发送蓝牙耳机的状态 +{ printf("uart_send_bt_state:%d %d\n",bt_state,is_need_send_bt_state); if(!is_need_send_bt_state) { @@ -898,11 +922,21 @@ int uart_send_bt_state(u8 bt_state) //蓝牙向4G发送蓝牙耳机的状态 } // 打印JSON字符串 printf("uart_send_bt_state JSON数据: %s\n", json_string); + read_ack_flag=0; bk_uart_send_smg(BK_UART_WRITE_DATA, json_string,strlen(json_string)); // uart_send_blocking(ut, json_string, strlen(json_string), 20); // 释放内存 cJSON_free(json_string); cJSON_Delete(root); + int count = 50; + while(count--) + { + if(read_ack_flag == 1) + { + break; + } + os_time_dly(1); + } return 0; } int uart_send_error(void) diff --git a/2.code/1.sdk/apps/BK_app/BK_drive/bk_uart.h b/2.code/1.sdk/apps/BK_app/BK_drive/bk_uart.h index 4872507..4202aac 100644 --- a/2.code/1.sdk/apps/BK_app/BK_drive/bk_uart.h +++ b/2.code/1.sdk/apps/BK_app/BK_drive/bk_uart.h @@ -22,4 +22,5 @@ void get_ble_switch_imei_timer_init(void); void UART_event(void); int uart_send_bt_state(u8 bt_state); int uart_send_kws(void); +void auto_switch_local_mic(void); #endif diff --git a/2.code/1.sdk/apps/BK_app/bk_app.c b/2.code/1.sdk/apps/BK_app/bk_app.c index 5b62d00..6f256e2 100644 --- a/2.code/1.sdk/apps/BK_app/bk_app.c +++ b/2.code/1.sdk/apps/BK_app/bk_app.c @@ -17,6 +17,7 @@ static char AI_start_flag = 0; #endif #include "bk_app.h" #include "BK_versions.h" +void BT_State_Change_cb(void); //获取运行状态,返回0代表在休眠,返回1代表在运行 char get_ai_state(void) { @@ -212,6 +213,16 @@ void bk_app_task(void *p) break; case AI_VC_1S_EVENT: AI_VC_1S_event(); + break; + case OPEN_CALL: + open_bt_audio(); + break; + case CLOSE_BT_AUDIO_EVENT: + close_bt_audio(); + break; + case BT_State_Change_CB: + BT_State_Change_cb(); + break; default: break; } @@ -241,6 +252,17 @@ void bk_ALG_send_smg(bk_ALG_msg_event event,char *data,int data_len) os_taskq_post_msg("bk_ALG_task", 3, event,(int)data_tmp, data_len); } +extern u8 esco_flag; +void BT_State_Change_cb(void) +{ + os_time_dly(100); + if(esco_flag){ + bk_app_send_smg(CLOSE_BT_AUDIO_EVENT,NULL,0); + } + + bk_app_send_smg(AI_CLOSE,NULL,0); + bk_app_send_smg(AI_OPEN,NULL,0); +} //#include "rtc.h" //void read_sys_time(struct sys_time *curr_time); //char vad_data_t[320]; diff --git a/2.code/1.sdk/apps/BK_app/bk_app.h b/2.code/1.sdk/apps/BK_app/bk_app.h index 63f8edd..9b97e34 100644 --- a/2.code/1.sdk/apps/BK_app/bk_app.h +++ b/2.code/1.sdk/apps/BK_app/bk_app.h @@ -12,6 +12,9 @@ typedef enum VAD_RUN, UART_EVENT, AI_VC_1S_EVENT, + CLOSE_BT_AUDIO_EVENT, + BT_State_Change_CB,//蓝牙连接状态切换 + OPEN_CALL }bk_app_msg_event; typedef enum diff --git a/2.code/1.sdk/apps/common/third_party_profile/jieli/trans_data_demo/le_trans_data.c b/2.code/1.sdk/apps/common/third_party_profile/jieli/trans_data_demo/le_trans_data.c index 3897168..8ef3927 100644 --- a/2.code/1.sdk/apps/common/third_party_profile/jieli/trans_data_demo/le_trans_data.c +++ b/2.code/1.sdk/apps/common/third_party_profile/jieli/trans_data_demo/le_trans_data.c @@ -234,7 +234,10 @@ void start_scan_bt(void){ if (scan_state){ return; } - user_emitter_cmd_prepare(USER_CTRL_DISCONNECTION_HCI, 0, NULL); // + if(bt_connect){ + user_emitter_cmd_prepare(USER_CTRL_HFP_CALL_HANGUP,0,NULL); + user_emitter_cmd_prepare(USER_CTRL_DISCONNECTION_HCI, 0, NULL); + } scan_state = 1; bt_emitter_start_search_device(); //开始扫描 } @@ -397,6 +400,7 @@ void connect_bt(char *json_data,u8 conect){ // } if(conect){ //断开连接 if (bt_connect) { //搜索前断开已连接得蓝牙耳机 + user_emitter_cmd_prepare(USER_CTRL_HFP_CALL_HANGUP,0,NULL); user_emitter_cmd_prepare(USER_CTRL_DISCONNECTION_HCI, 0, NULL); } return; @@ -436,6 +440,7 @@ void connect_bt(char *json_data,u8 conect){ if(bt_connect == 2) //已经连上了看看连接的地址是否一致 { if (memcmp(bt_conn_addr, reversed_mac, 6) != 0){//如果连上了并且和小程序下发得mac地址是一致不需要重新连接 + user_emitter_cmd_prepare(USER_CTRL_HFP_CALL_HANGUP,0,NULL); user_emitter_cmd_prepare(USER_CTRL_DISCONNECTION_HCI, 0, NULL); // emitter_bt_connect(reversed_mac);//连接地址 } diff --git a/2.code/1.sdk/apps/watch/task_manager/bt/bt.c b/2.code/1.sdk/apps/watch/task_manager/bt/bt.c index 89718c0..4454631 100644 --- a/2.code/1.sdk/apps/watch/task_manager/bt/bt.c +++ b/2.code/1.sdk/apps/watch/task_manager/bt/bt.c @@ -439,7 +439,7 @@ void bt_updata_fix_rx_result() } /*定频测试的时候tx的mac_addr设置成rx的地址 */ u8 fix_rx_mac_addr[6] = {0xC0, 0xFF, 0x68, 0x7D, 0x16, 0x00}; - +u8 esco_flag = 0; /*----------------------------------------------------------------------------*/ /**@brief 蓝牙模式协议栈对应状态处理函数 @param bt:事件 @@ -450,7 +450,7 @@ u8 fix_rx_mac_addr[6] = {0xC0, 0xFF, 0x68, 0x7D, 0x16, 0x00}; static int bt_connction_status_event_handler(struct bt_event *bt) { - log_debug("-----------------------bt_connction_status_event_handler %d", bt->event); + log_debug("-----------------------bt_connction_status_event_handler %d %x", bt->event,bt->value); if (bt_status_event_filter(bt) == false) { return false; @@ -576,6 +576,7 @@ static int bt_connction_status_event_handler(struct bt_event *bt) #endif bt_status_phone_hangup(bt); __set_bt_esco_by_watch(0); + #if TCFG_UI_ENABLE if (UI_GET_WINDOW_ID() != ID_WINDOW_PHONE) {//判断手表在来电界面,退出界面 break; @@ -653,6 +654,13 @@ static int bt_connction_status_event_handler(struct bt_event *bt) watch_sco_dly_time_del(); } bt_status_sco_change(bt); + if(bt->value != 0xff) + { + esco_flag = 1; + }else + { + esco_flag = 0; + } break; case BT_STATUS_CALL_VOL_CHANGE: log_info(" BT_STATUS_CALL_VOL_CHANGE "); diff --git a/2.code/1.sdk/apps/watch/task_manager/bt/bt_event_fun.c b/2.code/1.sdk/apps/watch/task_manager/bt/bt_event_fun.c index ad856ff..c2d1cc6 100644 --- a/2.code/1.sdk/apps/watch/task_manager/bt/bt_event_fun.c +++ b/2.code/1.sdk/apps/watch/task_manager/bt/bt_event_fun.c @@ -1259,7 +1259,7 @@ void bt_status_connect(struct bt_event *bt) { bt_connect = BT_CONN_STATE_CONNECTED; uart_send_bt_state(bt_connect); - // connect_bt_cb(bt_connect); + auto_switch_local_mic(); sys_auto_sniff_controle(1, NULL); sys_auto_shut_down_disable(); @@ -1452,7 +1452,7 @@ void bt_status_disconnect(struct bt_event *bt) { bt_connect = BT_CONN_STATE_INIT; uart_send_bt_state(bt_connect); - + auto_switch_local_mic(); sys_auto_sniff_controle(0, NULL); __this->call_flag = 0; /* log_info("BT_STATUS_DISCONNECT\n"); */