__MMI_CUSTOM_VOICECHAT_SUPPORT__
author@CHENG <2393524978@qq.com>
Wed, 25 Sep 2024 08:02:12 +0000 (16:02 +0800)
committer@CHENG <2393524978@qq.com>
Wed, 25 Sep 2024 08:02:12 +0000 (16:02 +0800)
2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/custom_function.c
2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/custom_function.h
2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/mmi_voicechat_data.c
2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/mmi_voicechat_data.h
2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/mmi_voicechat_ui.c
2.sdk/sdk/gui/lv_watch/lv_apps/custom_function/mmi_voicechat_ui.h
2.sdk/sdk/product/craneg_modem/pcac/wsclient/libwebsockets/src/mmi_voicechat_websocket.c
2.sdk/sdk/product/craneg_modem/pcac/wsclient/libwebsockets/src/mmi_voicechat_websocket_client.c

index c3fb592..679459e 100644 (file)
 #ifdef __MMI_CUSTOM_AIGC_SUPPORT__
 #include "mmi_aigc_ui.c"
 #include "mmi_aigc_data.c"
-#ifdef __MMI_CUSTOM_AIGC_AUTHENTICATE_SUPPORT__
-#include "mmi_aigc_authenticate.c"
-#endif
 #endif
 #ifdef __MMI_CUSTOM_VOICECHAT_SUPPORT__
 #include "mmi_voicechat_ui.c"
 #include "mmi_voicechat_data.c"
 #endif
+#ifdef __MMI_CUSTOM_AI_AUTHENTICATE_SUPPORT__
+#include "mmi_ai_authenticate.c"
+#endif
 
 #ifdef __MMI_CUSTOM_BEI_KE_RUI_SHENG__
 #include "bei_ke_rui_sheng.c"
 
 int mmi_ws_header_add_custom_info_check(void)
 {
-#ifdef __MMI_CUSTOM_VOICECHAT_SUPPORT__
-       return 1;
-#endif
+//#ifdef __MMI_CUSTOM_VOICECHAT_SUPPORT__
+//     return 1;
+//#endif
 
        return 0;
 }
 
 char * mmi_ws_header_add_custom_info_get(void)
 {
-#ifdef __MMI_CUSTOM_VOICECHAT_SUPPORT__
-       return "X-NLS-Token: 0c8b8f05a46f423096be64a9c4c46310\r\n";
-#endif
+//#ifdef __MMI_CUSTOM_VOICECHAT_SUPPORT__
+//     return "X-NLS-Token: 0c8b8f05a46f423096be64a9c4c46310\r\n";
+//#endif
 
        return NULL;
 }
index 32602fa..47032ff 100644 (file)
@@ -36,14 +36,14 @@ extern "C" {
 #ifdef __MMI_CUSTOM_AIGC_SUPPORT__
 #include "mmi_aigc_ui.h"
 #include "mmi_aigc_data.h"
-#ifdef __MMI_CUSTOM_AIGC_AUTHENTICATE_SUPPORT__
-#include "mmi_aigc_authenticate.h"
-#endif
 #endif
 #ifdef __MMI_CUSTOM_VOICECHAT_SUPPORT__
 #include "mmi_voicechat_ui.h"
 #include "mmi_voicechat_data.h"
 #endif
+#ifdef __MMI_CUSTOM_AI_AUTHENTICATE_SUPPORT__
+#include "mmi_ai_authenticate.h"
+#endif
 
 #ifdef __MMI_CUSTOM_BEI_KE_RUI_SHENG__
 #include "bei_ke_rui_sheng.h"
index 9eaaf8b..4f3ead8 100644 (file)
@@ -9,9 +9,7 @@ static void mmi_voicechat_data_send_task_msg_send(MMI_VOICECHAT_DATA_SEND_MSG_ID
 
 
 
-
 static char s_voicechat_dialog_id[MMI_VOICECHAT_MSG_DIALOG_ID_LEN + 1] = {0};
-
 void mmi_voicechat_dialog_id_set(char * id)
 {
        if(NULL == id)
@@ -26,6 +24,71 @@ char * mmi_voicechat_dialog_id_get(void)
        return s_voicechat_dialog_id;
 }
 
+static char s_voicechat_trace_id[MMI_VOICECHAT_MSG_TRACE_ID_LEN + 1] = {0};
+void mmi_voicechat_trace_id_set(char * id)
+{
+       if(NULL == id)
+               return;
+
+       _lv_memset_00(s_voicechat_trace_id, (MMI_VOICECHAT_MSG_TRACE_ID_LEN + 1));
+       _lv_memcpy(s_voicechat_trace_id, id, MMI_VOICECHAT_MSG_TRACE_ID_LEN);
+}
+
+char * mmi_voicechat_trace_id_get(void)
+{
+       return s_voicechat_trace_id;
+}
+
+static char s_voicechat_task_id[MMI_VOICECHAT_MSG_TASK_ID_LEN + 1] = {0};
+void mmi_voicechat_task_id_set(char * id)
+{
+       if(NULL == id)
+               return;
+
+       _lv_memset_00(s_voicechat_task_id, (MMI_VOICECHAT_MSG_TASK_ID_LEN + 1));
+       _lv_memcpy(s_voicechat_task_id, id, MMI_VOICECHAT_MSG_TASK_ID_LEN);
+}
+
+char * mmi_voicechat_task_id_get(void)
+{
+       return s_voicechat_task_id;
+}
+
+static char s_voicechat_server_state[32] = {0};
+void mmi_voicechat_server_state_set(char * state_str)
+{
+       if(0 == strncmp(MMI_VOICECHAT_SERVER_STATE_LISTENING, state_str, strlen(state_str))
+               || 0 == strncmp(MMI_VOICECHAT_SERVER_STATE_THINKING, state_str, strlen(state_str))
+               || 0 == strncmp(MMI_VOICECHAT_SERVER_STATE_RESPONDING, state_str, strlen(state_str))
+               )
+       {
+               _lv_memset_00(s_voicechat_server_state, 32);
+               _lv_memcpy(s_voicechat_server_state, state_str, strlen(state_str));
+       }
+}
+
+bool mmi_voicechat_server_state_is_listening(void)
+{
+       if(0 == strncmp(s_voicechat_server_state, MMI_VOICECHAT_SERVER_STATE_LISTENING, strlen(MMI_VOICECHAT_SERVER_STATE_LISTENING)))
+       {
+               return true;
+       }
+       
+       return false;
+}
+
+static bool s_voicechat_recv_tts_flag = false;
+void mmi_voicechat_recv_tts_flag_set(bool flag)
+{
+       s_voicechat_recv_tts_flag = flag;       
+}
+
+bool mmi_voicechat_recv_tts_flag_get(void)
+{
+       return s_voicechat_recv_tts_flag;
+}
+
+
 void mmi_random_string_generate(char * str_buf, uint16_t str_size, uint16_t str_len)
 {
 #if 0
@@ -82,30 +145,35 @@ void mmi_voicechat_send_start_request_msg(void * param, uint32_t param_size)
        mmi_voicechat_data_send_task_msg_send(VOICECHAT_MSG_ID_START_REQUEST, NULL, 0);
 }
 
+//{"header":{"trace_id":"ailaqbo0r6o","event":"Start"},
+//"payload":{"device_id":"test_device_id","user_agent":"python","in_format":"pcm","out_format":"pcm","sample_rate":16000,"space_time":100}}
 static void mmi_voicechat_send_start_request_process(void * data_ptr, uint32_t data_len)
 {
     char send_ptr[1024] = {0};
        int send_len = 0;
-       char message_id[MMI_VOICECHAT_MSG_MESSAGE_ID_LEN + 1] = {0};
-       char task_id[MMI_VOICECHAT_MSG_TASK_ID_LEN + 1] = {0};
+       char trace_id[MMI_VOICECHAT_MSG_TRACE_ID_LEN + 1] = {0};
 
        char imei[16 + 1] = {0};
        app_adp_get_imei_req(imei);
 
-       mmi_random_string_generate(message_id, MMI_VOICECHAT_MSG_MESSAGE_ID_LEN + 1, MMI_VOICECHAT_MSG_MESSAGE_ID_LEN);
-       mmi_random_string_generate(task_id, MMI_VOICECHAT_MSG_TASK_ID_LEN + 1, MMI_VOICECHAT_MSG_TASK_ID_LEN);
+       mmi_random_string_generate(trace_id, MMI_VOICECHAT_MSG_TRACE_ID_LEN + 1, MMI_VOICECHAT_MSG_TRACE_ID_LEN);
+       mmi_voicechat_trace_id_set(trace_id);
 
-       VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: message_id=%s\n", __FUNCTION__, __LINE__, message_id);  
-       VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: task_id=%s\n", __FUNCTION__, __LINE__, task_id);
+       VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: trace_id=%s\n", __FUNCTION__, __LINE__, trace_id);      
 
-       send_len += sprintf(send_ptr, "{\"header\":{\"namespace\":\"VoiceChat\",\"name\":\"Start\","
-                                                                       "\"appkey\":\"%s\",\"message_id\":\"%s\",\"task_id\":\"%s\"},", 
-                                                                       MMI_VOICECHAT_MSG_APPKEY, message_id, task_id);
+       send_len += sprintf(send_ptr, "{");
+       
+       send_len += sprintf(send_ptr + send_len, "\"header\":{\"event\":\"Start\",\"trace_id\":\"%s\"},", trace_id);
+       
        send_len += sprintf(send_ptr + send_len, "\"payload\":{\"user_agent\":\"python\",\"device_id\":\"%s\","
-                                                                       "\"dialog_attributes\":{\"model_id\":\"qwen-plus\","
-                                                                       "\"prompt\":\"你是一个有用的语音助手\","
-                                                                       "\"voice\":\"longxiaochun\"}}}",
-                                                                       imei);
+                                                                                       "\"in_format\":\"%s\",\"out_format\":\"%s\","
+                                                                                       //"\"sample_rate\":%d,\"space_time\":500,\"volume\":\"3\"}",
+                                                                                       "\"space_time\":400}",
+                                                                                       imei, 
+                                                                                       MMI_VOICECHAT_UL_AUDIO_FORMAT_STR, 
+                                                                                       MMI_VOICECHAT_DL_AUDIO_FORMAT_STR);
+       
+       send_len += sprintf(send_ptr + send_len, "}");
 
 #ifdef MMI_VOICECHAT_DEBUG_TO_FILE
        mmi_debug_info_write_to_file(VOICECHAT_SEND_DATA_FILE, send_ptr, send_len);
@@ -121,118 +189,184 @@ static void mmi_voicechat_send_start_request_process(void * data_ptr, uint32_t d
 }
 
 
-#if 0
-void mmi_voicechat_send_tts_text_msg(void * param, uint32_t param_size)
-{
-       mmi_voicechat_data_send_task_msg_send(MMI_VOICECHAT_MSG_TTS_TEXT_SEND, param, param_size);
+void mmi_voicechat_send_send_speech_msg(void * param, uint32_t param_size)
+{      
+       mmi_voicechat_data_send_task_msg_send(VOICECHAT_MSG_ID_SEND_SPEECH, NULL, 0);
 }
 
-static void mmi_voicechat_send_tts_text_data_process(void * data_ptr, uint32_t data_len)
+//{"header":{"trace_id":"ailaqbo0r6o","event":"SendSpeech"},"payload":{"dialog_id":"b0444aed86774e47a142a967e5668a8b"}}
+static void mmi_voicechat_send_send_speech_process(void * data_ptr, uint32_t data_len)
 {
-       VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: size=%d\n", __FUNCTION__, __LINE__, data_len);
+       VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);   
+    char send_ptr[1024] = {0};
+       int send_len = 0;
+
+       send_len += sprintf(send_ptr, "{");
        
-       uint32_t temp_len = 0;
-       uint32_t send_buff_len = data_len + 256;
-       char * send_buff_ptr = lv_mem_alloc(send_buff_len);
-       if(NULL == send_buff_ptr)
-       {
-               VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: memory alloc fail\n", __FUNCTION__, __LINE__);
-               return;
-       }
-       _lv_memset_00(send_buff_ptr, send_buff_len);
+       send_len += sprintf(send_ptr + send_len, "\"header\":{\"event\":\"SendSpeech\",\"trace_id\":\"%s\"},", mmi_voicechat_trace_id_get());
        
-       temp_len = 0;
-       temp_len += sprintf(send_buff_ptr + temp_len, "{\"header\":{\"event\":\"LongTextStream\",\"trace_id\":\"3fa6b9e6a30b407ea38ad7ae69e6c291\"},");
-       temp_len += sprintf(send_buff_ptr + temp_len, "\"payload\":{\"voice\":\"xiaoyun\",\"format\":\"mp3\",\"sample_rate\":8000,\"volume\":50,\"speech_rate\":2,"); // 0,");
-       temp_len += sprintf(send_buff_ptr + temp_len, "\"text\":\"%s\"}}", data_ptr); // 185 + data_len
+       send_len += sprintf(send_ptr + send_len, "\"payload\":{\"dialog_id\":\"%s\"}", mmi_voicechat_dialog_id_get());
+       
+       send_len += sprintf(send_ptr + send_len, "}");
 
 #ifdef MMI_VOICECHAT_DEBUG_TO_FILE
-       mmi_debug_info_write_to_file(VOICECHAT_SEND_TTS_TEXT_FILE, send_buff_ptr, temp_len);
+       mmi_debug_info_write_to_file(VOICECHAT_SEND_DATA_FILE, send_ptr, send_len);
 #endif
-       VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: send_len=%d\n", __FUNCTION__, __LINE__, temp_len);
-       //int ret = mmi_voicechat_tts_websocket_send_text_data(send_buff_ptr, temp_len);
-       //if(0 > ret)
-       {
-               //VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: error=%d,send fail\n", __FUNCTION__, __LINE__, ret);
-               //mmi_voicechat_list_screen_signal_weak_prompt();
-       }
 
-       if(NULL != send_buff_ptr)
+       int ret = mmi_voicechat_websocket_send_text_data(send_ptr, send_len);
+       if(0 > ret)
        {
-               lv_mem_free(send_buff_ptr);
-               send_buff_ptr = NULL;
-       }
+               VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: error=%d,send fail\n", __FUNCTION__, __LINE__, ret);
+       }       
+}
+
+void mmi_voicechat_send_speech_data_msg(void * param, uint32_t param_size)
+{
+       VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: size=%d,data=%s\n", __FUNCTION__, __LINE__, param_size, param); 
+       mmi_voicechat_data_send_task_msg_send(VOICECHAT_MSG_ID_SPEECH_DATA, param, param_size);
 }
+
+static void mmi_voicechat_send_speech_data_process(void * data_ptr, uint32_t data_len)
+{
+       VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: size=%d,data=%s\n", __FUNCTION__, __LINE__, data_len, data_ptr);        
+
+#ifdef MMI_VOICECHAT_DEBUG_TO_FILE
+       mmi_debug_info_write_to_file(VOICECHAT_SEND_DATA_FILE, data_ptr, data_len);
 #endif
 
+       int ret = mmi_voicechat_websocket_send_binary_data(data_ptr, data_len);
+       if(0 > ret)
+       {
+               VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: error=%d,send fail\n", __FUNCTION__, __LINE__, ret);
+       }       
+}
 
-#if 0
-static void mmi_voicechat_tts_audio_data_recv_msg(void * param, uint32_t param_size)
+void mmi_voicechat_send_stop_speech_msg(void * param, uint32_t param_size)
 {
-       mmi_voicechat_data_recv_task_msg_send(MMI_VOICECHAT_MSG_TTS_AUDIO_RECV, param, param_size);
+       mmi_voicechat_data_send_task_msg_send(VOICECHAT_MSG_ID_STOP_SPEECH, NULL, 0);
 }
 
-static void mmi_voicechat_recv_tts_audio_data_process(void * data_ptr, uint32_t data_len)
+//{"header":{"trace_id":"ailaqbo0r6o","event":"StopSpeech"},"payload":{"dialog_id":"b0444aed86774e47a142a967e5668a8b"}}
+static void mmi_voicechat_send_stop_speech_process(void * data_ptr, uint32_t data_len)
 {
-       VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: len=%d\n", __FUNCTION__, __LINE__, data_len);
-       cplog_printf("[@CHENG_DEBUG][%s][%d]: len=%d\n", __FUNCTION__, __LINE__, data_len);
-       if(NULL == data_ptr)
-       {
-               VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: no data\n", __FUNCTION__, __LINE__);
-               return;
-       }
+       VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);   
+    char send_ptr[1024] = {0};
+       int send_len = 0;
+
+       send_len += sprintf(send_ptr, "{");
+       
+       send_len += sprintf(send_ptr + send_len, "\"header\":{\"event\":\"StopSpeech\",\"trace_id\":\"%s\"},", mmi_voicechat_trace_id_get());
+       
+       send_len += sprintf(send_ptr + send_len, "\"payload\":{\"dialog_id\":\"%s\"}", mmi_voicechat_dialog_id_get());
+       
+       send_len += sprintf(send_ptr + send_len, "}");
 
 #ifdef MMI_VOICECHAT_DEBUG_TO_FILE
-       mmi_debug_info_write_to_file(VOICECHAT_RECV_TTS_FILE, data_ptr, data_len);
+       //mmi_debug_info_write_to_file(VOICECHAT_SEND_DATA_FILE, send_ptr, send_len);
 #endif
 
-       cJSON * json_root = cJSON_Parse(data_ptr);
-       if(NULL != json_root)
+       int ret = mmi_voicechat_websocket_send_text_data(send_ptr, send_len);
+       if(0 > ret)
        {
-               cplog_printf("[@CHENG_DEBUG][%s][%d]: json root\n", __FUNCTION__, __LINE__);
-               VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: tts json\n", __FUNCTION__, __LINE__);
+               VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: error=%d,send fail\n", __FUNCTION__, __LINE__, ret);
+       }       
+}
 
-               cJSON * json_header = cJSON_GetObjectItem(json_root, "header");
-               if(NULL != json_header)
-               {
-                       char * value_event_str = cJSON_GetStringValue(cJSON_GetObjectItem(json_header, "event"));
-                       if(0 == strncmp(value_event_str, "EndSynthesis", strlen("EndSynthesis")))
-                       {
-                               // end
-                               VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: EndSynthesis\n", __FUNCTION__, __LINE__);
-                               
-                               mmi_voicechat_tts_end_synthesis_action();
-                       }
-               }
-       }
-       else
+void mmi_voicechat_send_start_play_msg(void * param, uint32_t param_size)
+{
+       mmi_voicechat_data_send_task_msg_send(VOICECHAT_MSG_ID_START_PLAY, NULL, 0);
+}
+
+//{"header":{"trace_id":"ailaqbo0r6o","event":"LocalRespondingStarted"},"payload":{"dialog_id":"b0444aed86774e47a142a967e5668a8b"}}
+static void mmi_voicechat_send_start_play_process(void * data_ptr, uint32_t data_len)
+{
+       VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);   
+       char send_ptr[1024] = {0};
+       int send_len = 0;
+
+       send_len += sprintf(send_ptr, "{");
+       
+       send_len += sprintf(send_ptr + send_len, "\"header\":{\"event\":\"LocalRespondingStarted\",\"trace_id\":\"%s\"},", mmi_voicechat_trace_id_get());
+       
+       send_len += sprintf(send_ptr + send_len, "\"payload\":{\"dialog_id\":\"%s\"}", mmi_voicechat_dialog_id_get());
+       
+       send_len += sprintf(send_ptr + send_len, "}");
+
+#ifdef MMI_VOICECHAT_DEBUG_TO_FILE
+       //mmi_debug_info_write_to_file(VOICECHAT_SEND_DATA_FILE, send_ptr, send_len);
+#endif
+
+       int ret = mmi_voicechat_websocket_send_text_data(send_ptr, send_len);
+       if(0 > ret)
        {
-               // tts data
-               VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: tts data\n", __FUNCTION__, __LINE__);
+               VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: error=%d,send fail\n", __FUNCTION__, __LINE__, ret);
+       }       
+}
 
-               if(true == mmi_voicechat_tts_audio_store(data_ptr, data_len))
-               {
-               
-               }
-       }
+void mmi_voicechat_send_stop_play_msg(void * param, uint32_t param_size)
+{
+       mmi_voicechat_data_send_task_msg_send(VOICECHAT_MSG_ID_STOP_PLAY, NULL, 0);
+}
 
-       if(NULL != json_root)
+//{"header":{"trace_id":"ailaqbo0r6o","event":"LocalRespondingEnded"},"payload":{"dialog_id":"b0444aed86774e47a142a967e5668a8b"}}
+static void mmi_voicechat_send_stop_play_process(void * data_ptr, uint32_t data_len)
+{
+       VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);   
+       char send_ptr[1024] = {0};
+       int send_len = 0;
+
+       send_len += sprintf(send_ptr, "{");
+       
+       send_len += sprintf(send_ptr + send_len, "\"header\":{\"event\":\"LocalRespondingEnded\",\"trace_id\":\"%s\"},", mmi_voicechat_trace_id_get());
+       
+       send_len += sprintf(send_ptr + send_len, "\"payload\":{\"dialog_id\":\"%s\"}", mmi_voicechat_dialog_id_get());
+       
+       send_len += sprintf(send_ptr + send_len, "}");
+
+#ifdef MMI_VOICECHAT_DEBUG_TO_FILE
+       //mmi_debug_info_write_to_file(VOICECHAT_SEND_DATA_FILE, send_ptr, send_len);
+#endif
+
+       int ret = mmi_voicechat_websocket_send_text_data(send_ptr, send_len);
+       if(0 > ret)
        {
-               VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: free json root\n", __FUNCTION__, __LINE__);
-               cplog_printf("[@CHENG_DEBUG][%s][%d]: free json root\n", __FUNCTION__, __LINE__);
-               cJSON_Delete(json_root);
-               json_root = NULL;
-       }
+               VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: error=%d,send fail\n", __FUNCTION__, __LINE__, ret);
+       }       
 }
 
-void mmi_voicechat_websocket_recv_data_handler(char * data_ptr, int data_len, int payload_len, int payload_offset)
+void mmi_voicechat_send_speak_request_msg(void * param, uint32_t param_size)
 {
-       VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: size=%d\n", __FUNCTION__, __LINE__, data_len);
-       //cplog_printf("[@CHENG_DEBUG][%s][%d]: size=%d\n", __FUNCTION__, __LINE__, data_len);
+       mmi_voicechat_data_send_task_msg_send(VOICECHAT_MSG_ID_SPEAK_REQUEST, NULL, 0);
+}
+
+//{"header":{"trace_id":"ailaqbo0r6o","event":"RequestToSpeak"},"payload":{"dialog_id":"b0444aed86774e47a142a967e5668a8b"}}
+static void mmi_voicechat_send_speak_request_process(void * data_ptr, uint32_t data_len)
+{
+       VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);   
+       char send_ptr[1024] = {0};
+       int send_len = 0;
+
+       send_len += sprintf(send_ptr, "{");
        
-       mmi_voicechat_tts_audio_data_recv_msg(data_ptr, data_len);      
+       send_len += sprintf(send_ptr + send_len, "\"header\":{\"event\":\"RequestToSpeak\",\"trace_id\":\"%s\"},", mmi_voicechat_trace_id_get());
+       
+       send_len += sprintf(send_ptr + send_len, "\"payload\":{\"dialog_id\":\"%s\"}", mmi_voicechat_dialog_id_get());
+       
+       send_len += sprintf(send_ptr + send_len, "}");
+
+#ifdef MMI_VOICECHAT_DEBUG_TO_FILE
+       mmi_debug_info_write_to_file(VOICECHAT_SEND_DATA_FILE, send_ptr, send_len);
+#endif
+
+       int ret = mmi_voicechat_websocket_send_text_data(send_ptr, send_len);
+       if(0 > ret)
+       {
+               VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: error=%d,send fail\n", __FUNCTION__, __LINE__, ret);
+       }       
 }
-#else
+
+
+
 
 void mmi_voicechat_websocket_recv_data_handler(char * data_ptr, int data_len, int payload_len, int payload_offset)
 {
@@ -252,30 +386,100 @@ void mmi_voicechat_websocket_recv_data_handler(char * data_ptr, int data_len, in
        cJSON * json_root = cJSON_Parse(data_ptr);
        if(NULL != json_root)
        {
-               VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: tts json\n", __FUNCTION__, __LINE__);
+               VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: json\n", __FUNCTION__, __LINE__);
 
                cJSON * json_header = cJSON_GetObjectItem(json_root, "header");
                if(NULL != json_header)
                {
-                       char * value_event_str = cJSON_GetStringValue(cJSON_GetObjectItem(json_header, "event"));
-                       if(0 == strncmp(value_event_str, "EndSynthesis", strlen("EndSynthesis")))
+                       VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+                       //
+               }
+               else
+               {
+                       char * value_event = cJSON_GetStringValue(cJSON_GetObjectItem(json_root, "event"));
+                       cJSON * json_payload = cJSON_GetObjectItem(json_root, "payload");
+                       if(0 == strncmp(value_event, "Started", strlen("Started")))
                        {
-                               // end
-                               VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: EndSynthesis\n", __FUNCTION__, __LINE__);
+                               char * value_dialog_id = cJSON_GetStringValue(cJSON_GetObjectItem(json_payload, "dialog_id"));
                                
-                               mmi_voicechat_tts_end_synthesis_action();
+                               VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: Started,%s\n", __FUNCTION__, __LINE__, value_dialog_id);
+                               mmi_voicechat_dialog_id_set(value_dialog_id);
+                       }
+                       else if(0 == strncmp(value_event, "DialogStateChanged", strlen("DialogStateChanged")))
+                       {
+                               char * value_state = cJSON_GetStringValue(cJSON_GetObjectItem(json_payload, "state"));
+
+                               VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: DialogStateChanged,%s\n", __FUNCTION__, __LINE__, value_state);
+                               mmi_voicechat_server_state_set(value_state);
+                               
+                               if(true == mmi_voicechat_server_state_is_listening())
+                               {
+                                       mmi_voicechat_send_send_speech_msg(NULL, 0);
+                               }
+                       }
+                       else if(0 == strncmp(value_event, "SpeechContent", strlen("SpeechContent")))
+                       {
+                               VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: SpeechContent\n", __FUNCTION__, __LINE__);
+                               
+                               // update translate text
+                               // "finished":true
+                               char * value_text = cJSON_GetStringValue(cJSON_GetObjectItem(json_payload, "text"));
+                               mmi_voicechat_trans_text_result_update(value_text, strlen(value_text));
+                               mmi_voicechat_trans_text_screen_update();
+                       }
+                       else if(0 == strncmp(value_event, "SpeechEnded", strlen("SpeechEnded")))
+                       {
+                               VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: SpeechEnded\n", __FUNCTION__, __LINE__);
+                               
+                               mmi_voicechat_listening_screen_stop_update();           
+                               // translate text end
+                       }
+                       else if(0 == strncmp(value_event, "RespondingContent", strlen("RespondingContent")))
+                       {
+                               static uint16_t t_count = 0;
+                               t_count++;
+                               VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: RespondingContent.times=%d\n", __FUNCTION__, __LINE__, t_count);
+                               
+                               // update respone text
+                               // "finished":true
+                               char * value_text = cJSON_GetStringValue(cJSON_GetObjectItem(json_payload, "text"));
+                               mmi_voicechat_chat_text_result_update(value_text, strlen(value_text));
+                               mmi_voicechat_chat_text_screen_update();
+
+                               if(cJSON_IsTrue(cJSON_GetObjectItem(json_payload, "finished")))
+                               {
+                                       mmi_voicechat_chat_text_refresh_task_cb(NULL);
+                                       mmi_voicechat_chat_text_refresh_stop();
+                               }
+                       }
+                       else if(0 == strncmp(value_event, "RespondingStarted", strlen("RespondingStarted")))
+                       {
+                               VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: RespondingStarted\n", __FUNCTION__, __LINE__);
+                               
+                               // server start send audio prompt
+                               mmi_voicechat_recv_tts_flag_set(true);
+                               mmi_voicechat_tts_audio_update_pre();
+                       }
+                       else if(0 == strncmp(value_event, "RespondingEnded", strlen("RespondingEnded")))
+                       {
+                               VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: RespondingEnded\n", __FUNCTION__, __LINE__);
+
+                               // server stop send audio prompt
+                               mmi_voicechat_recv_tts_flag_set(false);
+
+                               mmi_voicechat_tts_audio_play();
                        }
                }
        }
        else
        {
-               // tts data
-               VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: tts data\n", __FUNCTION__, __LINE__);
+               VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: data\n", __FUNCTION__, __LINE__);
 
-               if(true == mmi_voicechat_tts_audio_store(data_ptr, data_len))
-               {
-               
-               }
+               //if(true == mmi_voicechat_recv_tts_flag_get())
+               //{
+                       //
+                       mmi_voicechat_tts_audio_result_update(data_ptr, data_len);
+               //}
        }
 
        if(NULL != json_root)
@@ -286,7 +490,6 @@ void mmi_voicechat_websocket_recv_data_handler(char * data_ptr, int data_len, in
                json_root = NULL;
        }
 }
-#endif
 
 
 #if 0
@@ -459,27 +662,29 @@ static void mm_voicechat_data_send_task_handle(void * param)
                        //mmi_voicechat_send_trans_audio_data_process(msg_param, param_size);
             break;
 
-       #if 0
-               case MMI_VOICECHAT_MSG_TRANS_STOP_SEND:
-                       //mmi_voicechat_send_trans_stop_data_process(msg_param, param_size);
+               case VOICECHAT_MSG_ID_SEND_SPEECH:
+                       mmi_voicechat_send_send_speech_process(msg_param, param_size);
                        break;
 
-               case MMI_VOICECHAT_MSG_CHAT_TEXT_SEND:
-                       //mmi_voicechat_send_chat_text_data_process(msg_param, param_size);
+               case VOICECHAT_MSG_ID_SPEECH_DATA:
+                       mmi_voicechat_send_speech_data_process(msg_param, param_size);
                        break;
 
-               case MMI_VOICECHAT_MSG_TTS_START_SEND:
-                       //mmi_voicechat_send_tts_start_data_process(msg_param, param_size);
+               case VOICECHAT_MSG_ID_STOP_SPEECH:
+                       mmi_voicechat_send_stop_speech_process(msg_param, param_size);
                        break;
-                       
-               case MMI_VOICECHAT_MSG_TTS_TEXT_SEND:
-                       //mmi_voicechat_send_tts_text_data_process(msg_param, param_size);
+
+               case VOICECHAT_MSG_ID_START_PLAY:
+                       mmi_voicechat_send_start_play_process(msg_param, param_size);
                        break;
-                               
-               case MMI_VOICECHAT_MSG_TTS_STOP_SEND:
-                       //mmi_voicechat_send_tts_stop_data_process(msg_param, param_size);
+
+               case VOICECHAT_MSG_ID_STOP_PLAY:
+                       mmi_voicechat_send_stop_play_process(msg_param, param_size);
+                       break;
+
+               case VOICECHAT_MSG_ID_SPEAK_REQUEST:
+                       mmi_voicechat_send_speak_request_process(msg_param, param_size);
                        break;
-       #endif
                
                default:
                        break;
index 2618067..12c26f4 100644 (file)
@@ -23,13 +23,16 @@ extern "C" {
 #include "../../../../product/craneg_modem/pcac/wsclient/libwebsockets/inc/mmi_voicechat_websocket.h"
 
 
-#define MMI_VOICECHAT_MSG_APPKEY ("j2QhAoOeBi5AUlrM")
-
 #define MMI_VOICECHAT_MSG_DIALOG_ID_LEN (32)
-#define MMI_VOICECHAT_MSG_MESSAGE_ID_LEN (32)
+#define MMI_VOICECHAT_MSG_TRACE_ID_LEN (32)
 #define MMI_VOICECHAT_MSG_TASK_ID_LEN (32)
 
 
+#define MMI_VOICECHAT_SERVER_STATE_LISTENING ("Listening")
+#define MMI_VOICECHAT_SERVER_STATE_THINKING ("Thinking")
+#define MMI_VOICECHAT_SERVER_STATE_RESPONDING ("Responding")
+
+
 
 #if 0
 #define MMI_VOICECHAT_DATA_RECV_TASK_PRIORITY 220
@@ -61,7 +64,14 @@ typedef enum
        VOICECHAT_MSG_ID_START_REQUEST,
        VOICECHAT_MSG_ID_STOP_REQUEST,
    
+       VOICECHAT_MSG_ID_SEND_SPEECH,
+       VOICECHAT_MSG_ID_SPEECH_DATA,
+       VOICECHAT_MSG_ID_STOP_SPEECH,
 
+       VOICECHAT_MSG_ID_START_PLAY,
+       VOICECHAT_MSG_ID_STOP_PLAY,
+
+       VOICECHAT_MSG_ID_SPEAK_REQUEST,
     
     VOICECHAT_MSG_ID_END
 }MMI_VOICECHAT_DATA_SEND_MSG_ID_E;
@@ -83,6 +93,17 @@ void mmi_voicechat_data_task_delete(void);
 
 void mmi_voicechat_send_start_request_msg(void * param, uint32_t param_size);
 
+void mmi_voicechat_send_send_speech_msg(void * param, uint32_t param_size);
+
+void mmi_voicechat_send_speech_data_msg(void * param, uint32_t param_size);
+
+void mmi_voicechat_send_stop_speech_msg(void * param, uint32_t param_size);
+
+void mmi_voicechat_send_start_play_msg(void * param, uint32_t param_size);
+
+void mmi_voicechat_send_stop_play_msg(void * param, uint32_t param_size);
+
+void mmi_voicechat_send_speak_request_msg(void * param, uint32_t param_size);
 
 
 #endif 
index 3a66e70..c0b0c61 100644 (file)
@@ -13,17 +13,13 @@ static mmi_voicechat_msg_info_t * s_voicechat_info_p = &s_voicechat_info_t;
 static uint8_t s_voicechat_current_chat_index = 0; // 1 chat = 2 msg items
 
 static uint32_t s_voicechat_recording_sent_size = 0;
-static uint32_t s_voicechat_tts_text_sent_size = 0;
-static bool s_voicechat_trans_text_end = false;
 static bool s_voicechat_tts_audio_playing = false;
 
 static lv_ll_t s_voicechat_tts_audio_ll = {0};
 static mmi_voicechat_tts_audio_ll_t * s_voicechat_tts_audio_play_node = NULL;
 
 static bool s_voicechat_ws_open_flag = false;
-
-#define MMI_VOICECHAT_SEND_TTS_TEXT_MAX (150) // 50
-#define MMI_VOICECHAT_SEND_TTS_TEXT_MIN (99) // 33
+static bool s_voicechat_start_flag = false;
 
 
 static lv_res_t mmi_voicechat_list_scrl_signal(lv_obj_t * scrl, lv_signal_t sign, void * param);
@@ -92,15 +88,9 @@ uint8_t mmi_voicechat_msg_count_get(void)
        return msg_count;
 }
 
-char * mmi_voicechat_trans_result_text_get(uint32_t * data_len)
-{
-       mmi_voicechat_msg_item_info_t * t_voicechat_item_info = &(s_voicechat_info_p->msg_item[0]);
-       
-       * data_len = t_voicechat_item_info->text_data_size;
-       return (t_voicechat_item_info->text_data_ptr);
-}
 
-bool mmi_voicechat_trans_result_text_store(char * data_buff, uint32_t data_len, bool is_end)
+
+bool mmi_voicechat_trans_text_result_update(char * data_buff, uint32_t data_len)
 {
        if(NULL == data_buff || 0 == data_len)
        {
@@ -108,16 +98,14 @@ bool mmi_voicechat_trans_result_text_store(char * data_buff, uint32_t data_len,
                return false;
        }
 
-       if(true == s_voicechat_trans_text_end)
+       mmi_voicechat_msg_item_info_t * t_voicechat_item_info = &(s_voicechat_info_p->msg_item[0]);
+       if(NULL != t_voicechat_item_info->text_data_ptr)
        {
-               VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-               return false;
+               lv_mem_free(t_voicechat_item_info->text_data_ptr);
+               t_voicechat_item_info->text_data_ptr = NULL;
+               t_voicechat_item_info->text_data_size = 0;
        }
-       s_voicechat_trans_text_end = is_end;
 
-       mmi_voicechat_msg_item_info_t * t_voicechat_item_info = &(s_voicechat_info_p->msg_item[0]);
-
-#if 1
        char * temp_ptr = lv_mem_alloc(data_len + 1);
        if(NULL == temp_ptr)
        {
@@ -126,106 +114,77 @@ bool mmi_voicechat_trans_result_text_store(char * data_buff, uint32_t data_len,
        }
        _lv_memset_00(temp_ptr, data_len + 1);
        _lv_memcpy(temp_ptr, data_buff, data_len);
-       
-       if(NULL != t_voicechat_item_info->text_data_ptr)
-       {
-               lv_mem_free(t_voicechat_item_info->text_data_ptr);
-               t_voicechat_item_info->text_data_ptr = NULL;
-       }
+
        t_voicechat_item_info->text_data_ptr = temp_ptr;
        t_voicechat_item_info->text_data_size = data_len;
-
-#else
-       if(NULL == t_voicechat_item_info->text_data_ptr)
-       {
-               char * temp_ptr = lv_mem_alloc(data_len + 1);
-               if(NULL == temp_ptr)
-               {
-                       VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: alloc memory fail\n", __FUNCTION__, __LINE__);
-                       return false;
-               }
-               _lv_memset_00(temp_ptr, data_len + 1);
-               _lv_memcpy(temp_ptr, data_buff, data_len);
-
-               t_voicechat_item_info->text_data_ptr = temp_ptr;
-               t_voicechat_item_info->text_data_size = data_len;
-       }
-       else
-       {
-               char * temp_ptr = lv_mem_realloc(t_voicechat_item_info->text_data_ptr, t_voicechat_item_info->text_data_size + data_len + 1);
-               if(NULL == temp_ptr)
-               {
-                       VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: realloc memory fail\n", __FUNCTION__, __LINE__);
-                       return false;
-               }
-               _lv_memset_00(temp_ptr + t_voicechat_item_info->text_data_size, data_len + 1);
-               _lv_memcpy(temp_ptr + t_voicechat_item_info->text_data_size, data_buff, data_len);
-
-               t_voicechat_item_info->text_data_ptr = temp_ptr;
-               t_voicechat_item_info->text_data_size += data_len;
-       }
-#endif
+       
        t_voicechat_item_info->msg_from = 0;
        s_voicechat_info_p->msg_count = 1;
        
-       VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: size=%d,ptr=0x%x\n", __FUNCTION__, __LINE__, t_voicechat_item_info->text_data_size, t_voicechat_item_info->text_data_ptr);
-
-#ifdef MMI_VOICECHAT_DEBUG_TO_FILE
-       //mmi_debug_info_write_to_file(VOICECHAT_RECV_TRANS_RESULT_FILE, t_voicechat_item_info->text_data_ptr, t_voicechat_item_info->text_data_size);
-#endif
+       VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: size=%d,ptr=0x%x\n", __FUNCTION__, __LINE__, 
+                                                                       t_voicechat_item_info->text_data_size, t_voicechat_item_info->text_data_ptr);
 
        return true;
 }
 
-static void mmi_voicechat_trans_text_middle_screen_task_cb(lv_task_t * task)
-{
-       VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: ui_state=%d\n", __FUNCTION__, __LINE__, s_voicechat_ui_state);
+static bool s_trans_text_update_flag = false;
+void mmi_voicechat_trans_text_refresh_stop(void)
+{      
+       lv_voicechat_ext_t * ext = mmi_voicechat_actId_ext_get(ACT_ID_VOICECHAT_MAIN);
+       if(NULL == ext)
+               return;
        
-       if(MMI_VOICECHAT_UI_STATE_LISTENING == s_voicechat_ui_state || MMI_VOICECHAT_UI_STATE_LISTENING_MIDDLE == s_voicechat_ui_state)
-       {               
+       if(NULL != ext->refresh_task_p)
+       {
+               lv_task_del(ext->refresh_task_p);
+               ext->refresh_task_p = NULL;
+       }
+}
+
+void mmi_voicechat_trans_text_refresh_task_cb(lv_task_t * task)
+{
+       if(MMI_VOICECHAT_UI_STATE_LIST == s_voicechat_ui_state)
+       {
+               VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
                lv_voicechat_ext_t * ext = mmi_voicechat_actId_ext_get(ACT_ID_VOICECHAT_MAIN);
                if(NULL == ext)
                        return;
-               
-               mmi_voicechat_list_set_slide_enable(&ext->old_ext, true);
-
-               if(0 != mmi_voicechat_msg_count_get())
-               {
-                       VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
 
-                       mmi_voicechat_listening_middle_screen_display();
-               }
+               //mmi_voicechat_list_screen_list_refresh();
+               mmi_voicechat_msg_item_info_t * msg_item = &(s_voicechat_info_p->msg_item[0]);
+               if(NULL != ext->list_self_label)
+                       lv_label_set_text(ext->list_self_label, msg_item->text_data_ptr);
+       }
+       else
+       {
+               mmi_voicechat_trans_text_refresh_stop();
        }
 }
 
-void mmi_voicechat_trans_text_middle_screen_update(void)
+void mmi_voicechat_trans_text_refresh_start(void)
 {
-       lv_task_t * task_p = lv_task_create(mmi_voicechat_trans_text_middle_screen_task_cb, 10, LV_TASK_PRIO_HIGH, NULL);
-       lv_task_once(task_p);
-}
+       lv_voicechat_ext_t * ext = mmi_voicechat_actId_ext_get(ACT_ID_VOICECHAT_MAIN);
+       if(NULL == ext)
+               return;
 
-static void mmi_voicechat_trans_text_screen_close_task_cb(lv_task_t * task)
-{
-       VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+       if(MMI_VOICECHAT_UI_STATE_LIST != s_voicechat_ui_state)
+               return;
        
-       mmi_voicechat_thinking_screen_display();
-
-       mmi_voicechat_chat_text_download_requst();
+       if(NULL != ext->refresh_task_p)
+       {
+               VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+               return;
+       }
+       ext->refresh_task_p = lv_task_create(mmi_voicechat_trans_text_refresh_task_cb, 100, LV_TASK_PRIO_HIGH, NULL);
 }
 
-static void mmi_voicechat_trans_text_stop_screen_task_cb(void)
+static void mmi_voicechat_trans_text_screen_task_cb(void)
 {
        VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: ui_state=%d\n", __FUNCTION__, __LINE__, s_voicechat_ui_state);
 
-       // wb
-       //mmi_voicechat_trans_websocket_close();
-       //mmi_voicechat_chat_websocket_open();
-
        if(MMI_VOICECHAT_UI_STATE_LISTENING == s_voicechat_ui_state || MMI_VOICECHAT_UI_STATE_LISTENING_MIDDLE == s_voicechat_ui_state)
        {
-               // record
-               mmi_voicechat_listening_stop(true);
-               
                lv_voicechat_ext_t * ext = mmi_voicechat_actId_ext_get(ACT_ID_VOICECHAT_MAIN);
                if(NULL == ext)
                        return;
@@ -242,128 +201,81 @@ static void mmi_voicechat_trans_text_stop_screen_task_cb(void)
                {
                        VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
 
-                       mmi_voicechat_listening_middle_screen_display();
+                       mmi_voicechat_list_screen_display();
 
-                       lv_task_t * task_p = lv_task_create(mmi_voicechat_trans_text_screen_close_task_cb, 1000, LV_TASK_PRIO_HIGH, NULL);
-                       lv_task_once(task_p);
+                       mmi_voicechat_trans_text_refresh_start();
                }
        }
 }
 
-void mmi_voicechat_trans_text_stop_screen_update(void)
-{
-       VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-
-       lv_task_t * task_p = lv_task_create(mmi_voicechat_trans_text_stop_screen_task_cb, 10, LV_TASK_PRIO_HIGH, NULL);
-       lv_task_once(task_p);   
-}
-
-static void mmi_voicechat_trans_text_fail_screen_task_cb(void)
+void mmi_voicechat_trans_text_screen_update(void)
 {
        VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
 
-       mmi_voicechat_default_screen_display();
-}
+       if(true == s_trans_text_update_flag)
+               return;
 
-void mmi_voicechat_trans_text_start_msg_send_fail(void)
-{
-       //mmi_voicechat_trans_websocket_close();
-       mmi_voicechat_listening_stop(true);
-       
-       lv_voicechat_ext_t * ext = (lv_voicechat_ext_t *)mmi_voicechat_actId_ext_get(ACT_ID_VOICECHAT_MAIN);
-       if(NULL == ext) 
-               return ;
+       s_trans_text_update_flag = true;
 
-       lv_obj_set_hidden(ext->listening_signal_weak_label, false);
-       
-       lv_task_t * task_p = lv_task_create(mmi_voicechat_trans_text_fail_screen_task_cb, 1500, LV_TASK_PRIO_HIGH, NULL);
+       lv_task_t * task_p = lv_task_create(mmi_voicechat_trans_text_screen_task_cb, 10, LV_TASK_PRIO_HIGH, NULL);
        lv_task_once(task_p);   
 }
 
-void mmi_voicechat_trans_text_audio_msg_send_fail(void)
-{
-       mmi_voicechat_websocket_close();
-       mmi_voicechat_websocket_open();
-}
-
 
-char * mmi_voicechat_chat_result_text_get(uint32_t * data_len)
-{
-       mmi_voicechat_msg_item_info_t * t_voicechat_item_info = &(s_voicechat_info_p->msg_item[1]);
-       
-       * data_len = t_voicechat_item_info->text_data_size;
-       return (t_voicechat_item_info->text_data_ptr);
-}
-
-bool mmi_voicechat_chat_result_text_store(char * data_buff, uint32_t data_len)
+bool mmi_voicechat_chat_text_result_update(char * data_buff, uint32_t data_len)
 {
        if(NULL == data_buff || 0 == data_len)
        {
-               printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+               VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
                return false;
        }
 
        mmi_voicechat_msg_item_info_t * t_voicechat_item_info = &(s_voicechat_info_p->msg_item[1]);
-       
-       if(NULL == t_voicechat_item_info->text_data_ptr)
+       if(NULL != t_voicechat_item_info->text_data_ptr)
        {
-               char * temp_ptr = lv_mem_alloc(data_len + 1);
-               if(NULL == temp_ptr)
-               {
-                       printf("[@CHENG_DEBUG][%s][%d]: alloc memory fail\n", __FUNCTION__, __LINE__);
-                       return false;
-               }
-               _lv_memset_00(temp_ptr, data_len + 1);
-               _lv_memcpy(temp_ptr, data_buff, data_len);
-
-               t_voicechat_item_info->text_data_ptr = temp_ptr;
-               t_voicechat_item_info->text_data_size = data_len;
+               lv_mem_free(t_voicechat_item_info->text_data_ptr);
+               t_voicechat_item_info->text_data_ptr = NULL;
+               t_voicechat_item_info->text_data_size = 0;
        }
-       else
-       {
-               char * temp_ptr = lv_mem_realloc(t_voicechat_item_info->text_data_ptr, t_voicechat_item_info->text_data_size + data_len + 1);
-               if(NULL == temp_ptr)
-               {
-                       printf("[@CHENG_DEBUG][%s][%d]: realloc memory fail\n", __FUNCTION__, __LINE__);
-                       return false;
-               }
-               _lv_memset_00(temp_ptr + t_voicechat_item_info->text_data_size, data_len + 1);
-               _lv_memcpy(temp_ptr + t_voicechat_item_info->text_data_size, data_buff, data_len);
 
-               t_voicechat_item_info->text_data_ptr = temp_ptr;
-               t_voicechat_item_info->text_data_size += data_len;
+       char * temp_ptr = lv_mem_alloc(data_len + 1);
+       if(NULL == temp_ptr)
+       {
+               VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: alloc memory fail\n", __FUNCTION__, __LINE__);
+               return false;
        }
+       _lv_memset_00(temp_ptr, data_len + 1);
+       _lv_memcpy(temp_ptr, data_buff, data_len);
+
+       t_voicechat_item_info->text_data_ptr = temp_ptr;
+       t_voicechat_item_info->text_data_size = data_len;
+       
        t_voicechat_item_info->msg_from = 1;
        s_voicechat_info_p->msg_count = 2;
        
-       printf("[@CHENG_DEBUG][%s][%d]: size=%d,ptr=0x%x\n", __FUNCTION__, __LINE__, t_voicechat_item_info->text_data_size, t_voicechat_item_info->text_data_ptr);
-
-#ifdef MMI_VOICECHAT_DEBUG_TO_FILE
-       //mmi_debug_info_write_to_file(VOICECHAT_RECV_CHAT_RESULT_FILE, t_voicechat_item_info->text_data_ptr, t_voicechat_item_info->text_data_size);
-#endif
+       VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: size=%d,ptr=0x%x\n", __FUNCTION__, __LINE__, 
+                                                                       t_voicechat_item_info->text_data_size, t_voicechat_item_info->text_data_ptr);
 
        return true;
 }
 
-void mmi_voicechat_chat_text_middle_task_cb(lv_task_t * task)
-{
-       if(MMI_VOICECHAT_UI_STATE_THINKING == s_voicechat_ui_state)
+static bool s_chat_text_update_flag = false;
+void mmi_voicechat_chat_text_refresh_stop(void)
+{      
+       lv_voicechat_ext_t * ext = mmi_voicechat_actId_ext_get(ACT_ID_VOICECHAT_MAIN);
+       if(NULL == ext)
+               return;
+       
+       if(NULL != ext->refresh_task_p)
        {
-               VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-               
-               lv_voicechat_ext_t * ext = mmi_voicechat_actId_ext_get(ACT_ID_VOICECHAT_MAIN);
-               if(NULL == ext)
-                       return;
-               
-               if(NULL != ext->thinking_task_p)
-               {
-                       lv_task_del(ext->thinking_task_p);
-                       ext->thinking_task_p = NULL;
-               }
-
-               mmi_voicechat_list_screen_display();
+               lv_task_del(ext->refresh_task_p);
+               ext->refresh_task_p = NULL;
        }
-       else if(MMI_VOICECHAT_UI_STATE_LIST == s_voicechat_ui_state)
+}
+
+void mmi_voicechat_chat_text_refresh_task_cb(lv_task_t * task)
+{
+       if(MMI_VOICECHAT_UI_STATE_LIST == s_voicechat_ui_state)
        {
                VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
 
@@ -371,263 +283,85 @@ void mmi_voicechat_chat_text_middle_task_cb(lv_task_t * task)
                if(NULL == ext)
                        return;
 
+               //mmi_voicechat_list_screen_list_refresh();
                mmi_voicechat_msg_item_info_t * msg_item = &(s_voicechat_info_p->msg_item[1]);
-               char * file_buf = msg_item->text_data_ptr;
-
-               lv_label_set_text(ext->list_other_label, file_buf);
-       }
-}
-
-void mmi_voicechat_chat_text_middle_screen_update(void)
-{
-       VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-               
-       lv_task_t * task_p = lv_task_create(mmi_voicechat_chat_text_middle_task_cb, 10, LV_TASK_PRIO_HIGH, NULL);
-       lv_task_once(task_p);
-}
-
-static void mmi_voicechat_chat_text_stop_screen_task_cb(void)
-{
-       VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: ui_state=%d\n", __FUNCTION__, __LINE__, s_voicechat_ui_state);
-
-       // wb
-       //mmi_voicechat_chat_websocket_close();
-       //mmi_voicechat_tts_websocket_open();
-
-       if((MMI_VOICECHAT_UI_STATE_THINKING == s_voicechat_ui_state) || (MMI_VOICECHAT_UI_STATE_LIST == s_voicechat_ui_state))
-       {
-               mmi_voicechat_main_screen_refresh();
-
-               mmi_voicechat_tts_audio_download_requst();
+               if(NULL != ext->list_other_label)
+                       lv_label_set_text(ext->list_other_label, msg_item->text_data_ptr);
        }
-}
-
-void mmi_voicechat_chat_text_stop_screen_update(void)
-{
-       VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-
-       lv_task_t * task_p = lv_task_create(mmi_voicechat_chat_text_stop_screen_task_cb, 10, LV_TASK_PRIO_HIGH, NULL);
-       lv_task_once(task_p);
-}
-
-void mmi_voicechat_chat_text_download_requst(void)
-{
-       uint32_t data_len = 0;
-       char * data_ptr = mmi_voicechat_trans_result_text_get(&data_len);
-
-       if(NULL != data_ptr && 0 != data_len)
+       else
        {
-               //mmi_voicechat_send_chat_text_msg(data_ptr, data_len);
+               mmi_voicechat_chat_text_refresh_stop();
        }
 }
 
-
-static void mmi_utf8_complete_character_judge(char * data_ptr, uint32_t data_len, uint32_t * output_len)
+void mmi_voicechat_chat_text_refresh_start(void)
 {
-       uint32_t i = 0;
-       uint32_t p = 0;
-       char ch = 0;
-       while(1)
-       {
-               ch = data_ptr[i];
-
-               //#1111110x
-               if(ch >= 252)
-                       p = p + 6;
-               //#111110xx
-               else if(ch >= 248)
-                       p = p + 5;
-               //#11110xxx
-               else if(ch >= 240)
-                       p = p + 4;
-               //#1110xxxx
-               else if(ch >= 224)
-                       p = p + 3;
-               //#110xxxxx
-               else if(ch >= 192)
-                       p = p + 2;
-               else
-                       p = p + 1;
-
-               if(p >= data_len)
-                       break;
-               else
-                       i = p;
-       }
-
-       * output_len = i;
-       VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: output_len=%d\n", __FUNCTION__, __LINE__, *output_len);
-}
-
-void mmi_voicechat_send_tts_text_seperate(char * data_ptr, uint32_t data_len, uint32_t * output_len)
-{
-       // cn ,
-       char cn_comma_str[4] = {0};
-       cn_comma_str[0] = 0XEF;
-       cn_comma_str[1] = 0XBC;
-       cn_comma_str[2] = 0X8C;
-       
-       // cn .
-       char cn_period_str[4] = {0};
-       cn_period_str[0] = 0XE3;
-       cn_period_str[1] = 0X80;
-       cn_period_str[2] = 0X82;
-
-       // cn ?
-       char cn_query_str[4] = {0};
-       cn_query_str[0] = 0XEF;
-       cn_query_str[1] = 0XBC;
-       cn_query_str[2] = 0X9F;
-
-       // cn !
-       char cn_mark_str[4] = {0};
-       cn_mark_str[0] = 0XEF;
-       cn_mark_str[1] = 0XBC;
-       cn_mark_str[2] = 0X81;
-
-
-       if(MMI_VOICECHAT_SEND_TTS_TEXT_MAX >= data_len)
-       {
-               * output_len = data_len;
-               VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: output_len=%d\n", __FUNCTION__, __LINE__, *output_len);
+       lv_voicechat_ext_t * ext = mmi_voicechat_actId_ext_get(ACT_ID_VOICECHAT_MAIN);
+       if(NULL == ext)
                return;
-       }
 
-       char * temp_ptr = lv_mem_alloc(MMI_VOICECHAT_SEND_TTS_TEXT_MAX + 1);
-       if(NULL == temp_ptr)
-       {
-               VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: alloc memory fail\n", __FUNCTION__, __LINE__);
-               return ;
-       }
-       _lv_memset_00(temp_ptr, (MMI_VOICECHAT_SEND_TTS_TEXT_MAX + 1));
-       _lv_memcpy(temp_ptr, data_ptr, MMI_VOICECHAT_SEND_TTS_TEXT_MAX);
-       
-       char * offset_ptr = NULL;
-       offset_ptr = strstr(temp_ptr, cn_comma_str);
-       if(NULL != offset_ptr)
-       {
-               * output_len = offset_ptr - temp_ptr + 2;
-               goto EXIT;
-       }
-       
-       offset_ptr = strstr(temp_ptr, cn_period_str);
-       if(NULL != offset_ptr)
-       {
-               * output_len = offset_ptr - temp_ptr + 2;
-               goto EXIT;
-       }
-       
-       offset_ptr = strstr(temp_ptr, cn_query_str);
-       if(NULL != offset_ptr)
-       {
-               * output_len = offset_ptr - temp_ptr + 2;
-               goto EXIT;
-       }
-       
-       offset_ptr = strstr(temp_ptr, cn_mark_str);
-       if(NULL != offset_ptr)
-       {
-               * output_len = offset_ptr - temp_ptr + 2;
-               goto EXIT;
-       }
+       if(MMI_VOICECHAT_UI_STATE_LIST != s_voicechat_ui_state)
+               return;
        
-       if(NULL == offset_ptr)
+       if(NULL != ext->refresh_task_p)
        {
-               mmi_utf8_complete_character_judge(temp_ptr, MMI_VOICECHAT_SEND_TTS_TEXT_MIN, output_len);
+               VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+               return;
        }
-
-EXIT:
-       lv_mem_free(temp_ptr);
-       temp_ptr = NULL;
-       VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: output_len=%d\n", __FUNCTION__, __LINE__, *output_len);
+       ext->refresh_task_p = lv_task_create(mmi_voicechat_chat_text_refresh_task_cb, 500, LV_TASK_PRIO_HIGH, NULL);
 }
 
-uint32_t mmi_voicechat_send_tts_text_data_escape_character(char * data_buff, int data_len, char * output_data)
+static void mmi_voicechat_chat_text_screen_task_cb(void)
 {
-    if (NULL == data_buff || 0 == data_len)
-               return;
-       
-       uint32_t curr_p = 0, i = 0;
+       VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: ui_state=%d\n", __FUNCTION__, __LINE__, s_voicechat_ui_state);
 
-       for(i = 0; i < data_len; i++)
+       if(MMI_VOICECHAT_UI_STATE_LIST == s_voicechat_ui_state)
        {
-               if(0X0A == data_buff[i]) // 0X0A -> 0X5C 0X6E 
-               {
-                       output_data[curr_p++] = 0X5C;
-                       output_data[curr_p++] = 0X6E;
-               }
-               else if(0X22 == data_buff[i]) // 0X22 -> 0X5C 0X22
+               lv_voicechat_ext_t * ext = mmi_voicechat_actId_ext_get(ACT_ID_VOICECHAT_MAIN);
+               if(NULL == ext)
+                       return;
+               
+               mmi_voicechat_list_set_slide_enable(&ext->old_ext, true);
+
+               if(0 == mmi_voicechat_msg_count_get())
                {
-                       output_data[curr_p++] = 0X5C;
-                       output_data[curr_p++] = 0X22;
+                       VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+                       mmi_voicechat_default_screen_display();
                }
                else
                {
-                       output_data[curr_p++] = data_buff[i];
-               }
-       }
+                       VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
 
-       return curr_p;
-}
+                       mmi_voicechat_list_screen_display();
 
-void mmi_voicechat_send_tts_text_action(char * data_ptr, uint32_t data_len)
-{
-       uint32_t output_len = 0;
-       mmi_voicechat_send_tts_text_seperate(data_ptr, data_len, &output_len);
-       
-       uint32_t send_len = 0;
-       char * send_ptr = lv_mem_alloc((output_len + output_len / 9 + 1));
-       if(NULL == send_ptr)
-       {
-               VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: alloc memory fail\n", __FUNCTION__, __LINE__);
-               return ;
+                       mmi_voicechat_trans_text_refresh_stop();
+                       mmi_voicechat_chat_text_refresh_start();
+               }
        }
-       _lv_memset_00(send_ptr, (output_len + output_len / 9 + 1));
-       send_len = mmi_voicechat_send_tts_text_data_escape_character(data_ptr, output_len, send_ptr);
-
-       //mmi_voicechat_send_tts_text_msg(send_ptr, send_len);
-       s_voicechat_tts_text_sent_size += output_len;
-
-       lv_mem_free(send_ptr);
-       send_ptr = NULL;
 }
 
-void mmi_voicechat_send_tts_text_action_pre(void)
+void mmi_voicechat_chat_text_screen_update(void)
 {
-       uint32_t node_total = mmi_voicechat_tts_audio_ll_node_num();
-       VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: node_total=%d\n", __FUNCTION__, __LINE__, node_total);
-       
-       uint32_t data_len = 0;
-       char * data_ptr = mmi_voicechat_chat_result_text_get(&data_len);
+       VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
 
-       VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: data_len=%d,sent_len=%d\n", __FUNCTION__, __LINE__, data_len, s_voicechat_tts_text_sent_size);
-       if((NULL != data_ptr) && (data_len > s_voicechat_tts_text_sent_size))
-       {
-               //mmi_voicechat_tts_audio_ll_new_tail_node();
-               
-               mmi_voicechat_send_tts_text_action(data_ptr + s_voicechat_tts_text_sent_size, data_len - s_voicechat_tts_text_sent_size);
-       }
-}
+       if(true == s_chat_text_update_flag)
+               return;
 
-void mmi_voicechat_tts_audio_download_requst(void)
-{
-       VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+       s_chat_text_update_flag = true;
 
-       s_voicechat_tts_text_sent_size = 0;
-       s_voicechat_tts_audio_playing = false;
-       mmi_voicechat_tts_audio_ll_clean();
-       mmi_voicechat_tts_audio_ll_new_tail_node();
-       mmi_voicechat_send_tts_text_action_pre();
+       lv_task_t * task_p = lv_task_create(mmi_voicechat_chat_text_screen_task_cb, 10, LV_TASK_PRIO_HIGH, NULL);
+       lv_task_once(task_p);   
 }
 
 
-void mmi_voicechat_tts_audio_ll_init(void)
+static void mmi_voicechat_tts_audio_ll_init(void)
 {
        _lv_ll_init(&s_voicechat_tts_audio_ll, sizeof(mmi_voicechat_tts_audio_ll_t));
        _lv_ll_clear(&s_voicechat_tts_audio_ll);
 }
 
-void mmi_voicechat_tts_audio_ll_clean(void)
+static void mmi_voicechat_tts_audio_ll_clean(void)
 {
        mmi_voicechat_tts_audio_ll_t * node = NULL;
     for(node = _lv_ll_get_head(&s_voicechat_tts_audio_ll); NULL != node; node = _lv_ll_get_next((&s_voicechat_tts_audio_ll), node))
@@ -662,7 +396,26 @@ mmi_voicechat_tts_audio_ll_t * mmi_voicechat_tts_audio_ll_new_tail_node(void)
        return node;
 }
 
-bool mmi_voicechat_tts_audio_store(char * data_buff, uint32_t data_len)
+
+
+static bool s_send_start_play = false;
+static bool s_data_first_frame = false;
+
+void mmi_voicechat_tts_audio_update_pre(void)
+{
+       VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+       s_voicechat_tts_audio_playing = false;
+       mmi_voicechat_tts_audio_ll_clean();
+       mmi_voicechat_tts_audio_ll_new_tail_node();
+
+
+       s_send_start_play = false;
+
+       s_data_first_frame = false;
+}
+
+bool mmi_voicechat_tts_audio_result_update(char * data_buff, uint32_t data_len)
 {
        if(NULL == data_buff || 0 == data_len)
        {
@@ -674,9 +427,44 @@ bool mmi_voicechat_tts_audio_store(char * data_buff, uint32_t data_len)
        if(NULL == node)
        {
                VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-               return false;
+               node = mmi_voicechat_tts_audio_ll_new_tail_node();
        }       
 
+#if 1
+       else if(NULL != node->audio_data_ptr && (16 * 1024 < node->audio_data_size))
+       {
+               VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+               node = mmi_voicechat_tts_audio_ll_new_tail_node();
+
+               mmi_voicechat_tts_audio_play();
+       }
+#else
+       else if(NULL != node->audio_data_ptr)
+       {
+               if(false == s_data_first_frame)
+               {
+                       if(16 * 1024 < node->audio_data_size)
+                       {
+                               VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+                               node = mmi_voicechat_tts_audio_ll_new_tail_node();
+                               
+                               s_data_first_frame = true;
+                               mmi_voicechat_tts_audio_play();
+                       }
+               }
+               else
+               {
+                       if(8 * 1024 < node->audio_data_size)
+                       {
+                               VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+                               node = mmi_voicechat_tts_audio_ll_new_tail_node();
+                               
+                               mmi_voicechat_tts_audio_play();
+                       }
+               }
+       }
+#endif
+
        if(NULL == node->audio_data_ptr)
        {
                VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
@@ -687,7 +475,13 @@ bool mmi_voicechat_tts_audio_store(char * data_buff, uint32_t data_len)
                        return false;
                }
                _lv_memset_00(temp_ptr, data_len + 1);
+       #if 0
                _lv_memcpy(temp_ptr, data_buff, data_len);
+       #else
+               char mp3_haed_info[10] = {'I', 'D', '3', 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22};
+               _lv_memcpy(temp_ptr, mp3_haed_info, 10);
+               _lv_memcpy(temp_ptr + 10, data_buff + 10, data_len - 10);
+       #endif
 
                node->audio_data_ptr = temp_ptr;
                node->audio_data_size = data_len;
@@ -713,7 +507,7 @@ bool mmi_voicechat_tts_audio_store(char * data_buff, uint32_t data_len)
        return true;
 }
 
-void mmi_voicechat_tts_audio_ctrl_callback(AUDIO_CTRL_PRIORITY priority)
+static void mmi_voicechat_tts_audio_ctrl_callback(AUDIO_CTRL_PRIORITY priority)
 {
        VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: priority=%d\n", __FUNCTION__, __LINE__, priority);
        
@@ -722,10 +516,7 @@ void mmi_voicechat_tts_audio_ctrl_callback(AUDIO_CTRL_PRIORITY priority)
 
     }
        else if(MMI_VOICECHAT_TTS_AUDIO_PRI > priority)
-       {
-               // wb
-               //mmi_voicechat_tts_websocket_close();
-               
+       {               
                // res
                mmi_voicechat_tts_audio_ll_clean();
        
@@ -752,14 +543,15 @@ static void mmi_voicechat_tts_audio_over_cb(void * para)
        s_voicechat_tts_audio_play_node = NULL;
        VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: node=%#X,total=%d\n", __FUNCTION__, __LINE__, node, mmi_voicechat_tts_audio_ll_node_num());
 
-       // get tts
-       //mmi_voicechat_send_tts_text_action_pre();
-       
-       if(MMI_VOICECHAT_TTS_AUDIO_PRI == Hal_Audio_Manage_Start_Req(MMI_VOICECHAT_TTS_AUDIO_PRI, mmi_voicechat_tts_audio_ctrl_callback))
+       //if(MMI_VOICECHAT_TTS_AUDIO_PRI == Hal_Audio_Manage_Start_Req(MMI_VOICECHAT_TTS_AUDIO_PRI, mmi_voicechat_tts_audio_ctrl_callback))
        {
                if(NULL == node || NULL == node->audio_data_ptr)
                {
                        VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+                       
+                       //mmi_voicechat_send_stop_play_msg(NULL, 0);
+                       
                        return ;
                }
                s_voicechat_tts_audio_play_node = node;
@@ -767,7 +559,7 @@ static void mmi_voicechat_tts_audio_over_cb(void * para)
 
                Hal_Tone_Play_Onetime((uint32_t *)node->audio_data_ptr,
                                                                node->audio_data_size,
-                                                               HAL_AUDIO_SPK_LEVEL_MAX,
+                                                               HAL_AUDIO_SPK_LEVEL_4, // HAL_AUDIO_SPK_LEVEL_MAX,
                                                                mmi_voicechat_tts_audio_over_cb,
                                                                NULL);  
        }
@@ -799,31 +591,23 @@ bool mmi_voicechat_tts_audio_play(void)
                                if(NULL == node || NULL == node->audio_data_ptr)
                                {
                                        VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: no data\n", __FUNCTION__, __LINE__);
-#if 0
-{
-       uint32_t node_total = mmi_voicechat_tts_audio_ll_node_num();
-       uint8_t i = 0;
-       mmi_voicechat_tts_audio_ll_t * node = _lv_ll_get_head(&s_voicechat_tts_audio_ll);
-       
-       VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: node_total=%d\n", __FUNCTION__, __LINE__, node_total);
-       for(i = 0; i < node_total; i++)
-       {
-               VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: %d,%#X,%#X\n", __FUNCTION__, __LINE__, i, node, node->audio_data_ptr);
-               
-               node = _lv_ll_get_next((&s_voicechat_tts_audio_ll), node);
-       }
-}
-#endif
                                        return false;
                                }
                        }
                }
+
+               if(false == s_send_start_play)
+               {
+                       s_send_start_play = true;
+                       mmi_voicechat_send_start_play_msg(NULL, 0);
+               }
+               
                s_voicechat_tts_audio_play_node = node;
                s_voicechat_tts_audio_playing = true;
 
                Hal_Tone_Play_Onetime((uint32_t *)node->audio_data_ptr,
                                                                node->audio_data_size,
-                                                               HAL_AUDIO_SPK_LEVEL_MAX,
+                                                               HAL_AUDIO_SPK_LEVEL_4, // HAL_AUDIO_SPK_LEVEL_MAX,
                                                                mmi_voicechat_tts_audio_over_cb,
                                                                NULL);  
        }
@@ -831,13 +615,26 @@ bool mmi_voicechat_tts_audio_play(void)
        return true;
 }
 
-void mmi_voicechat_tts_end_synthesis_action(void)
+bool mmi_voicechat_tts_audio_is_playing(void)
 {
-       mmi_voicechat_tts_audio_ll_new_tail_node();
-       mmi_voicechat_send_tts_text_action_pre();
+       if(true == s_voicechat_tts_audio_playing)
+               return true;
+
+       if(0 != mmi_voicechat_tts_audio_ll_node_num())
+               return true;
        
-       // 
-       mmi_voicechat_tts_audio_play();
+       return false;
+}
+
+
+
+void mmi_voicechat_listening_screen_stop_update(void)
+{
+       VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+
+       //lv_task_t * task_p = lv_task_create(mmi_voicechat_listening_screen_stop_task_cb, 10, LV_TASK_PRIO_HIGH, NULL);
+       //lv_task_once(task_p); 
+       mmi_voicechat_listening_stop(true);
 }
 
 
@@ -949,6 +746,8 @@ void mmi_voicechat_main_prepare_destory(lv_obj_t * activity_obj)
 {
        VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
 
+       s_voicechat_start_flag = false;
+       
        // websocket
        mmi_voicechat_websocket_close();
 
@@ -984,6 +783,11 @@ void mmi_voicechat_main_prepare_destory(lv_obj_t * activity_obj)
                lv_task_del(ext->thinking_task_p);
                ext->thinking_task_p = NULL;
        }
+       if(NULL != ext->refresh_task_p)
+       {
+               lv_task_del(ext->refresh_task_p);
+               ext->refresh_task_p = NULL;
+       }
        if(NULL != ext->gif_listening)
        {
                gif_close(ext->gif_listening);
@@ -1326,6 +1130,10 @@ bool mmi_voicechat_listening_stop(bool is_cancel)
        if(NULL == ext) 
                return false;
 
+
+       //mmi_debug_info_write_to_file("C:/record_data.amr", ext->record_buffer, ext->record_size);
+
+
        if(true == is_cancel)
        {
                printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
@@ -1411,6 +1219,13 @@ void mmi_voicechat_listening_cb(MCI_EVNET_T event, MCI_INFO_T info_type, int32_t
                                VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
                                return;
                        }
+
+                       if(false == mmi_voicechat_server_state_is_listening())
+                       {
+                               VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+                               mmi_voicechat_send_speak_request_msg(NULL, 0);
+                               return;
+                       }
                        
                        char * sending_buf = lv_mem_alloc(sending_size + 1);
                        if(NULL == sending_buf)
@@ -1421,7 +1236,7 @@ void mmi_voicechat_listening_cb(MCI_EVNET_T event, MCI_INFO_T info_type, int32_t
                        _lv_memset_00(sending_buf, sending_size + 1);
                        _lv_memcpy(sending_buf, ext->record_buffer + s_voicechat_recording_sent_size, sending_size);
                        
-                       //mmi_voicechat_send_trans_audio_msg(sending_buf, sending_size);                        
+                       mmi_voicechat_send_speech_data_msg(sending_buf, sending_size);                  
                        lv_mem_free(sending_buf);
                        s_voicechat_recording_sent_size += sending_size;
                }
@@ -1456,15 +1271,23 @@ void mmi_voicechat_listening_screen_display(void)
 
        s_voicechat_ui_state = MMI_VOICECHAT_UI_STATE_LISTENING;
 
-       s_voicechat_trans_text_end = false;
-       
        // stop audio
        Hal_NFFS_File_Play_End();
        Hal_Audio_Manage_End_Ind(MMI_VOICECHAT_TTS_AUDIO_PRI);
        
-       // wb
-       //mmi_voicechat_websocket_close();
-       //mmi_voicechat_websocket_open();
+       if(false == s_voicechat_start_flag)
+       {
+               s_voicechat_start_flag = true;
+               mmi_voicechat_send_start_request_msg(NULL, 0);
+       }
+       else if(false == mmi_voicechat_tts_audio_is_playing())
+       {
+               mmi_voicechat_send_stop_play_msg(NULL, 0);
+       }
+
+       // reset flag
+       s_trans_text_update_flag = false;
+       s_chat_text_update_flag = false;
        
        // res
        mmi_voicechat_msg_data_clean(); 
@@ -1485,15 +1308,13 @@ void mmi_voicechat_listening_screen_display(void)
                if(MMI_VOICECHAT_TTS_AUDIO_PRI == Hal_Audio_Manage_Start_Req(MMI_VOICECHAT_TTS_AUDIO_PRI, mmi_voicechat_listening_audio_ctrl_callback))
                {
                        VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-
-                       mmi_voicechat_send_start_request_msg(NULL, 0);
                        
                        s_voicechat_recording_sent_size = 0;
                        Hal_Record_Buffer_With_Format_Req(ext->record_buffer,
                                                                                MMI_VOICECHAT_DATA_RECORD_SIZE_MAX,
                                                                                MMI_VOICECHAT_DATA_RECORD_DURATION_MAX * 1000,
                                                                                mmi_voicechat_listening_cb,
-                                                                               (mci_type_enum)MMI_VOICECHAT_AUDIO_FORMAT);
+                                                                               (mci_type_enum)MMI_VOICECHAT_UL_AUDIO_FORMAT);
                }
        }
        
@@ -1632,6 +1453,7 @@ lv_obj_t * mmi_voicechat_list_msg_item_add(lv_obj_t * list_page, mmi_voicechat_m
                lv_obj_set_width(label_text, lv_obj_get_width(obj) - 20);
                lv_label_set_text(label_text, file_buf);
                lv_obj_align(label_text, obj, LV_ALIGN_IN_LEFT_MID, 10, 0);
+               ext->list_self_label = label_text;
        }
        else
        {
@@ -1695,7 +1517,7 @@ static lv_res_t mmi_voicechat_list_scrl_signal(lv_obj_t * scrl, lv_signal_t sign
     return LV_RES_OK;
 }
 
-lv_obj_t * mmi_voicechat_list_create(lv_obj_t * obj)
+static lv_obj_t * mmi_voicechat_list_create(lv_obj_t * obj)
 {
        VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
        
@@ -1745,6 +1567,23 @@ lv_obj_t * mmi_voicechat_list_create(lv_obj_t * obj)
        return list_page;
 }
 
+void mmi_voicechat_list_screen_list_refresh(void)
+{      
+       VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
+       
+       lv_voicechat_ext_t * ext = (lv_voicechat_ext_t *)mmi_voicechat_actId_ext_get(ACT_ID_VOICECHAT_MAIN);
+       if(NULL == ext) 
+               return ;
+       
+       if(NULL != ext->list)
+       {
+               lv_obj_clean(ext->list);
+               lv_obj_del(ext->list);
+               ext->list = NULL;
+       }
+       ext->list = mmi_voicechat_list_create(ext->cont_list);
+}
+
 void mmi_voicechat_list_screen_display(void)
 {      
        VOICECHAT_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
@@ -1759,6 +1598,7 @@ void mmi_voicechat_list_screen_display(void)
        lv_obj_t * cont = ext->cont_list;
        lv_obj_clean(cont);
        
+       //mmi_voicechat_list_screen_list_refresh();
        ext->list = mmi_voicechat_list_create(cont);
 
        // signal weak
@@ -1963,9 +1803,12 @@ lv_obj_t * mmi_voicechat_main_create(lv_obj_t * activity_obj)
        ext->cont_list = NULL;
 
        ext->list = NULL;
+       ext->list_self_label = NULL;
+       ext->list_other_label = NULL;
        ext->record_buffer = NULL;
        ext->record_size = 0;
        ext->thinking_task_p = NULL;
+       ext->refresh_task_p = NULL;
        ext->gif_listening = NULL;
        ext->gif_thinking = NULL;
 
@@ -1981,13 +1824,6 @@ lv_obj_t * mmi_voicechat_main_create(lv_obj_t * activity_obj)
         return obj;
     }
 
-       // data task
-       mmi_voicechat_data_task_create();
-       watch_set_suspend_enable(false, ACT_ID_VOICECHAT_MAIN, 0);
-
-       //mmi_voicechat_websocket_close();
-       mmi_voicechat_websocket_open();
-
        // cont_default
        lv_obj_t * cont_default = lv_cont_create(obj, NULL);
        lv_obj_set_size(cont_default, lv_obj_get_width(obj), lv_obj_get_height(obj));
@@ -2040,6 +1876,16 @@ lv_obj_t * mmi_voicechat_main_create(lv_obj_t * activity_obj)
        mmi_voicechat_lv_style_set();
 
        mmi_voicechat_default_screen_display();
+
+
+       watch_set_suspend_enable(false, ACT_ID_VOICECHAT_MAIN, 0);
+       // data task
+       mmi_voicechat_data_task_create();
+
+       mmi_voicechat_websocket_close();
+       mmi_voicechat_websocket_open();
+
+       s_voicechat_start_flag = false;
        
        return obj;
 }
@@ -2048,6 +1894,10 @@ void mmi_voicechat_create_event_cb(lv_obj_t * btn, lv_event_t e)
 {
     if(LV_EVENT_CLICKED == e) 
        {
+       #ifdef __MMI_CUSTOM_AI_AUTHENTICATE_SUPPORT__   
+               mmi_ai_device_active();
+       #endif 
+
                // free resource
                mmi_voicechat_msg_data_clean();
                mmi_voicechat_tts_audio_ll_init();
index 547c107..97486c7 100644 (file)
@@ -29,7 +29,7 @@ extern "C" {
 #endif
 
 
-#define MMI_VOICECHAT_DEBUG_TO_FILE
+//#define MMI_VOICECHAT_DEBUG_TO_FILE
 #ifdef MMI_VOICECHAT_DEBUG_TO_FILE
 #define VOICECHAT_SEND_DATA_FILE "C:/voicechat_send.txt"
 #define VOICECHAT_RECV_DATA_FILE "C:/voicechat_data.txt"
@@ -37,14 +37,20 @@ extern "C" {
 
 
 
-#define MMI_VOICECHAT_AUDIO_FORMAT (3) // 7-pcm8; 3-amr
-//#define MMI_VOICECHAT_AUDIO_FORMAT_STR       (".wav") // ".amr"
+#define MMI_VOICECHAT_UL_AUDIO_FORMAT (3) // 7-pcm8k; 3-amr; 8-pcm16k
+#define MMI_VOICECHAT_UL_AUDIO_FORMAT_STR      ("amr") // ("amr") // "pcm"
+#define MMI_VOICECHAT_DL_AUDIO_FORMAT_STR      ("mp3") // ("mp3") // "pcm" // "wav"
+//#define MMI_VOICECHAT_UL_AUDIO_SAMPLE_RATE   (16000) // (8000) // 16000
 
 #if 1 // amr
 #define MMI_VOICECHAT_DATA_RECORD_HEAD_SIZE            (6)
-#define MMI_VOICECHAT_DATA_RECORD_DURATION_MAX         (60) // seconds
+#define MMI_VOICECHAT_DATA_RECORD_DURATION_MAX         (30) // seconds
 #define MMI_VOICECHAT_DATA_RECORD_SIZE_MAX             ((MMI_VOICECHAT_DATA_RECORD_DURATION_MAX + 2) * HAL_AMR_BUFSIZE_PER_SECOND + MMI_VOICECHAT_DATA_RECORD_HEAD_SIZE)
-#else // pcm
+#elif 1 // pcm16k
+#define MMI_VOICECHAT_DATA_RECORD_HEAD_SIZE            (44)
+#define MMI_VOICECHAT_DATA_RECORD_DURATION_MAX         (10) // seconds
+#define MMI_VOICECHAT_DATA_RECORD_SIZE_MAX             (MMI_VOICECHAT_DATA_RECORD_DURATION_MAX * 32000 + MMI_VOICECHAT_DATA_RECORD_HEAD_SIZE)
+#else // pcm8k
 #define MMI_VOICECHAT_DATA_RECORD_HEAD_SIZE            (44)
 #define MMI_VOICECHAT_DATA_RECORD_DURATION_MAX         (10) // seconds
 #define MMI_VOICECHAT_DATA_RECORD_SIZE_MAX             (MMI_VOICECHAT_DATA_RECORD_DURATION_MAX * 16000 + MMI_VOICECHAT_DATA_RECORD_HEAD_SIZE)
@@ -111,6 +117,7 @@ typedef struct
        lv_obj_t * cont_list;
        lv_obj_t * list; // chat list
        lv_obj_t * list_signal_weak_label;
+       lv_obj_t * list_self_label;
        lv_obj_t * list_other_label;
 
     lv_style_t style_cont_self;
@@ -124,6 +131,7 @@ typedef struct
        uint32_t record_size;
 
        lv_task_t * thinking_task_p;
+       lv_task_t * refresh_task_p;
        
        gif_info_t * gif_listening;
        gif_info_t * gif_thinking;      
@@ -144,9 +152,14 @@ typedef enum
 
 
 
-char * mmi_voicechat_trans_result_text_get(uint32_t * data_len);
-bool mmi_voicechat_trans_result_text_store(char * data_buff, uint32_t data_len, bool is_end);
-bool mmi_voicechat_chat_result_text_store(char * data_buff, uint32_t data_len);
+bool mmi_voicechat_trans_text_result_update(char * data_buff, uint32_t data_len);
+bool mmi_voicechat_chat_text_result_update(char * data_buff, uint32_t data_len);
+
+void mmi_voicechat_tts_audio_update_pre(void);
+bool mmi_voicechat_tts_audio_result_update(char * data_buff, uint32_t data_len);
+bool mmi_voicechat_tts_audio_play(void);
+
+
 void mmi_voicechat_create_event_cb(lv_obj_t * btn, lv_event_t e);
 bool mmi_is_ACT_ID_VOICECHAT_MAIN(void);
 
index 331bd33..0334f60 100644 (file)
@@ -8,12 +8,17 @@
 
 #ifdef __MMI_CUSTOM_VOICECHAT_SUPPORT__
 
-#define MMI_VOICECHAT_WEBSOCKET_URI "wss://nls-gateway-cn-beijing.aliyuncs.com/ws/v1"
+//#define MMI_VOICECHAT_WEBSOCKET_URI "wss://nls-gateway-cn-beijing.aliyuncs.com/ws/v1"
+//#define MMI_VOICECHAT_WEBSOCKET_URI "ws://118.145.133.67:22080/voice-chat/ws"
+#define MMI_VOICECHAT_WEBSOCKET_URI "ws://118.145.158.207:22080/voice-chat/ws"
+//#define MMI_VOICECHAT_WEBSOCKET_URI "ws://amp.raisound.com/voice-chat/ws"
 
 static sim_esp_websocket_client_handle_t s_voicechat_ws_client_p = NULL;
 
 extern void mmi_voicechat_websocket_recv_data_handler(char * data_ptr, int data_len, int payload_len, int payload_offset);
-
+#ifdef __MMI_CUSTOM_AI_AUTHENTICATE_SUPPORT__
+extern char * mmi_ai_device_token_get(void);
+#endif
 
 
 int mmi_voicechat_websocket_send_text_data(char * data_ptr, int data_len)
@@ -120,8 +125,15 @@ void mmi_voicechat_websocket_app_start(void)
        int ret = 0;
     sim_esp_websocket_client_config_t websocket_cfg = {0};
 
+#ifdef __MMI_CUSTOM_AI_AUTHENTICATE_SUPPORT__
+       char url_str[256] = {0};
+       sprintf(url_str, "%s?dt=%s", MMI_VOICECHAT_WEBSOCKET_URI, mmi_ai_device_token_get());
+       
+    websocket_cfg.uri = url_str;
+#else
     websocket_cfg.uri = MMI_VOICECHAT_WEBSOCKET_URI;
-       websocket_cfg.transport == WEBSOCKET_TRANSPORT_OVER_SSL;
+       //websocket_cfg.transport == WEBSOCKET_TRANSPORT_OVER_SSL;
+#endif
 
        VOICECHAT_WB_DEBUG_PRINTF("[@CHENG_DEBUG][%s][%d]: url=%s\n", __FUNCTION__, __LINE__, websocket_cfg.uri);
 
index 4819982..bef22ba 100644 (file)
@@ -42,7 +42,7 @@ static void *    voicechat_websocket_client_stack_ptr = NULL;
 #define WEBSOCKET_TASK_PRIORITY         (90)
 #define WEBSOCKET_TASK_STACK            (8*1024)
 #define WEBSOCKET_NETWORK_TIMEOUT_MS    (10*1000)
-#define WEBSOCKET_PING_TIMEOUT_MS       (15*60*1000)
+#define WEBSOCKET_PING_TIMEOUT_MS       (15*60*1000) // (10*1000) // (15*60*1000)
 #define WEBSOCKET_EVENT_QUEUE_SIZE      (1)
 
 #define ESP_WS_CLIENT_MEM_CHECK(a, action) if (!(a)) {                                         \
@@ -439,7 +439,7 @@ static esp_err_t voicechat_websocket_client_recv(sim_esp_websocket_client_handle
     do {
         rlen = wb_esp_transport_read(client->transport, client->rx_buffer, client->buffer_size, client->config->network_timeout_ms);
         if (rlen <= 0) {
-            ESP_LOGE("Error read data");
+            ESP_LOGE("voicechat_websocket_client_recv.Error read data");
             voicechat_websocket_client_abort_connection(client);
             return ESP_FAIL;
         }