优化蓝牙通话的问题
authordxy <1731678236qq.com>
Thu, 11 Sep 2025 02:58:11 +0000 (10:58 +0800)
committerdxy <1731678236qq.com>
Thu, 11 Sep 2025 02:58:11 +0000 (10:58 +0800)
2.code/1.sdk/apps/BK_app/BK_drive/bk_audio.c
2.code/1.sdk/apps/BK_app/BK_drive/bk_uart.c
2.code/1.sdk/apps/BK_app/bk_app.c
2.code/1.sdk/apps/common/third_party_profile/jieli/trans_data_demo/le_trans_data.c

index 0d8ea0b..cb2be86 100644 (file)
@@ -430,11 +430,12 @@ int audio_link_demo_RX_data(char *data, int len)
     if(iis_rx_exc_data_len)//不要多余数据
     {
         printf("前面数据可能是上一个音频残留,丢掉:len:%d,iis_rx_exc_data_len:%d",len,iis_rx_exc_data_len);
-        if(iis_rx_exc_data_len>len)
+        if(iis_rx_exc_data_len>len){
             iis_rx_exc_data_len-=len;
-        else
+        }  
+        else{
             iis_rx_exc_data_len = 0;
-        
+        } 
         return len;
     }
     if(!dac_cbuffer)
@@ -508,18 +509,20 @@ void open_bt_audio(void)//打开蓝牙通话
 {
     check_bt_active=0;
     BT_state = 1;
-    __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);
+    printf("open_bt_audio get_call_status:%d",get_call_status());
+    if(get_call_status() != BT_CALL_ACTIVE){ //不在通话的时候才需要重新建立
+        __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); //
 }
 void close_bt_audio(void)
 {
     printf("close_bt_audio get_call_status:%d",get_call_status());
-    if(get_call_status() != BT_CALL_HANGUP){ //å¦\82æ\9e\9cæ\98¯ä¸»å\8a¨æ\8c\82æ\96­ç\9a\84ä¸\8dé\9c\80è¦\81å\86\8dé\87\8då¤\8dæ\8c\82æ\96­
+    if(get_call_status() != BT_CALL_HANGUP){ //没æ\8c\82æ\96­é\9c\80è¦\81æ\8c\82æ\96­ å·²ç»\8fæ\8c\82æ\96­äº\86ä¸\8dé\9c\80è¦\81å\86\8dæ\8c\82æ\96­
         user_emitter_cmd_prepare(USER_CTRL_HFP_CALL_HANGUP,0,NULL);
     }
-        
 }
 #if EN_AEC
 //extern void uart_demo();
index 70d934b..5421333 100644 (file)
@@ -15,6 +15,7 @@
 #include "BK_versions.h"
 #include "btstack/avctp_user.h"
 int ut=0;
+static u8 uart_init_flag = 0;
 OS_SEM uart_callback;
 char read_ack_flag= 0;
 char ota_flag = 0;
@@ -306,42 +307,46 @@ static void uart_timer_cb(void *p)//有串口数据后10ms一次回调
 }
 void bk_uart_send_smg(bk_uart_msg_event event,char *data,int data_len)
 {
-        char *data_tmp =NULL;
-        if(data !=NULL  && data_len>0)
+    if(!uart_init_flag){ //串口没有初始化不能发送串口消息
+        printf("bk_uart_task_init is not init error");
+        return;
+    }
+    char *data_tmp =NULL;
+    if(data !=NULL  && data_len>0)
+    {
+        data_tmp= zalloc(data_len);
+        if(data_tmp)
         {
-            data_tmp= zalloc(data_len);
-            if(data_tmp)
-            {
-                memcpy(data_tmp,data ,data_len);
-                
-            }else
-            {
-                
-                log_info("%s:zalloc error",__FUNCTION__);
-                return;
-            }
-        }
-        
-        int ret = os_taskq_post_msg("bk_uart_task", 3, event,(int)data_tmp, data_len);
-        printf("bk_uart_send_smg event:%d ret:%d--------------------1",event,ret);
-        // if(ret)
-        // {
-        //     u8 count=20;
-        //     while (count--)
-        //     {
-        //         ret = os_taskq_post_msg("bk_uart_task", 3, event,(int)data_tmp, data_len);
-        //         if(!ret){
-        //             printf("bk_uart_send_smg event:%d ret:%d--------------------2",event,ret);
-        //             break;
-        //         }
-        //         printf("bk_uart_send_smg event:%d ret:%d--------------------3",event,ret);
-        //         os_time_dly(1);
-        //     }
-        // }
-        if(ret != 0 && data_tmp)
+            memcpy(data_tmp,data ,data_len);
+            
+        }else
         {
-            free(data_tmp);
+            
+            log_info("%s:zalloc error",__FUNCTION__);
+            return;
         }
+    }
+    
+    int ret = os_taskq_post_msg("bk_uart_task", 3, event,(int)data_tmp, data_len);
+    printf("bk_uart_send_smg event:%d ret:%d--------------------1",event,ret);
+    // if(ret)
+    // {
+    //     u8 count=20;
+    //     while (count--)
+    //     {
+    //         ret = os_taskq_post_msg("bk_uart_task", 3, event,(int)data_tmp, data_len);
+    //         if(!ret){
+    //             printf("bk_uart_send_smg event:%d ret:%d--------------------2",event,ret);
+    //             break;
+    //         }
+    //         printf("bk_uart_send_smg event:%d ret:%d--------------------3",event,ret);
+    //         os_time_dly(1);
+    //     }
+    // }
+    if(ret != 0 && data_tmp)
+    {
+        free(data_tmp);
+    }
 
 }
 void bk_uart_init()
@@ -390,10 +395,13 @@ void bk_uart_init()
     }
 
     uart_dump();
+    uart_init_flag=0;
     //int err = os_task_create(bk_uart_task, NULL, 31, 512, 256, "bk_uart_task");
      int err =task_create(bk_uart_task, NULL, "bk_uart_task");
     if (err != OS_ERR_NONE) {
         r_printf("creat fail %x\n", err);
+    }else{
+        uart_init_flag=1;
     }
     //uart_timer_init();
   
index 7dfd438..81dcb4e 100644 (file)
@@ -26,6 +26,7 @@ static char AI_start_flag = 0;
 #include "aec_user.h"
 #include "bk_alg.h"
 //获取运行状态,返回0代表在休眠,返回1代表在运行
+static u8 bk_app_task_init = 0;
 char get_ai_state(void)
 {
     return AI_start_flag;
@@ -184,42 +185,47 @@ int get_ai_start(void)
 }
 void bk_app_send_smg(bk_app_msg_event event,char *data,int data_len)
 {
-        char *data_tmp =NULL;
-        if(data !=NULL  && data_len>0)
+    if(!bk_app_task_init)
+    {
+        printf("bk_app_task_init is not init error");
+        return;
+    }
+    char *data_tmp =NULL;
+    if(data !=NULL  && data_len>0)
+    {
+        data_tmp= zalloc(data_len);
+        if(data_tmp)
         {
-            data_tmp= zalloc(data_len);
-            if(data_tmp)
-            {
-                memcpy(data_tmp,data ,data_len);
-                
-            }else
-            {
-                
-                log_info("%s:zalloc error",__FUNCTION__);
-                return;
-            }
-        }
-        
-        int ret = os_taskq_post_msg("bk_app_task", 3, event,(int)data_tmp, data_len);
-        printf("event:%d ret:%d--------------------1",event,ret);
-        if(ret)
+            memcpy(data_tmp,data ,data_len);
+            
+        }else
         {
-            u8 count=20;
-            while (count--)
-            {
-                ret = os_taskq_post_msg("bk_app_task", 3, event,(int)data_tmp, data_len);
-                if(!ret){
-                    printf("event:%d ret:%d--------------------2",event,ret);
-                    break;
-                }
-                printf("event:%d ret:%d--------------------3",event,ret);
-                os_time_dly(1);
-            }
+            
+            log_info("%s:zalloc error",__FUNCTION__);
+            return;
         }
-        if(ret != 0 && data_tmp)
+    }
+    
+    int ret = os_taskq_post_msg("bk_app_task", 3, event,(int)data_tmp, data_len);
+    printf("event:%d ret:%d--------------------1",event,ret);
+    if(ret)
+    {
+        u8 count=20;
+        while (count--)
         {
-            free(data_tmp);
+            ret = os_taskq_post_msg("bk_app_task", 3, event,(int)data_tmp, data_len);
+            if(!ret){
+                printf("event:%d ret:%d--------------------2",event,ret);
+                break;
+            }
+            printf("event:%d ret:%d--------------------3",event,ret);
+            os_time_dly(1);
         }
+    }
+    if(ret != 0 && data_tmp)
+    {
+        free(data_tmp);
+    }
             
 }
 void bk_app_task(void *p)
@@ -401,11 +407,13 @@ void bk_app_init(void)
     gpio_write(IO_PORTA_06,1);
     // while(1)
     // ;
-   
+    bk_app_task_init=0;
     err = os_task_create(bk_app_task, NULL, 3, 512, 512, "bk_app_task");
     //int err = task_create(bk_app_task, NULL, "bk_app_task");
     if (err != OS_ERR_NONE) {
         r_printf("creat fail %x\n", err);
+    }else{
+        bk_app_task_init=1;
     }
     //AI_VC_1S_id = sys_timer_add(NULL, AI_VC_1S_cb, 1000);
     alg_init();//算法初始化
index 75159e3..b500b9a 100644 (file)
@@ -220,7 +220,10 @@ extern u8 bt_connect;
 //关闭经典蓝牙先断开已连接的设备
 void disconected_device(void){
     if (bt_connect) { //搜索前断开已连接得蓝牙耳机
-        user_emitter_cmd_prepare(USER_CTRL_HFP_CALL_HANGUP,0,NULL);
+        if(get_call_status() != BT_CALL_HANGUP){ //如果是主动挂断的不需要再重复挂断
+            user_emitter_cmd_prepare(USER_CTRL_HFP_CALL_HANGUP,0,NULL);
+        }
+        // user_emitter_cmd_prepare(USER_CTRL_HFP_CALL_HANGUP,0,NULL);
         user_emitter_cmd_prepare(USER_CTRL_DISCONNECTION_HCI, 0, NULL);
     }
 }
@@ -235,7 +238,9 @@ void start_scan_bt(void){
         return;
     }
     if(bt_connect){
-        user_emitter_cmd_prepare(USER_CTRL_HFP_CALL_HANGUP,0,NULL);
+        if(get_call_status() != BT_CALL_HANGUP){ //如果是主动挂断的不需要再重复挂断
+            user_emitter_cmd_prepare(USER_CTRL_HFP_CALL_HANGUP,0,NULL);
+        }
         user_emitter_cmd_prepare(USER_CTRL_DISCONNECTION_HCI, 0, NULL);
     }
     scan_state = 1;
@@ -402,7 +407,9 @@ void connect_bt(char *json_data,u8 conect){
     //     }
     if(conect){ //断开连接
         if (bt_connect) { //搜索前断开已连接得蓝牙耳机
-            user_emitter_cmd_prepare(USER_CTRL_HFP_CALL_HANGUP,0,NULL);
+            if(get_call_status() != BT_CALL_HANGUP){ //如果是主动挂断的不需要再重复挂断
+                user_emitter_cmd_prepare(USER_CTRL_HFP_CALL_HANGUP,0,NULL);
+            }
             user_emitter_cmd_prepare(USER_CTRL_DISCONNECTION_HCI, 0, NULL);
         }
         return;
@@ -442,7 +449,9 @@ 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);
+                if(get_call_status() != BT_CALL_HANGUP){ //如果是主动挂断的不需要再重复挂断
+                    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);//连接地址
             }