void start_ai4g_connect_timer(uint32_t interval = 1000);
void stop_ai4g_connect_timer(void);
+ void start_ai4g_tts_play_timer(uint32_t interval = 1000);
+ void stop_ai4g_tts_play_timer(void);
+
void SetSelectAiModel(int index);
int GetSelectAiModel(void);
int GetAiModelTextId(void);
--- /dev/null
+#ifndef AI_VOICE_MODELC_H
+#define AI_VOICE_MODELC_H
+
+#ifdef __cplusplus
+#if __cplusplus
+extern "C"
+{
+#endif
+#endif
+#include <stdint.h>
+
+ uint8_t getselect4gorbtai(void);
+
+#ifdef __cplusplus
+#if __cplusplus
+}
+#endif
+#endif
+#endif
\ No newline at end of file
* @FilePath: /FD230/code/sdk/application/wearable/fd230app/nativeui/aivoice/src/AiVoiceModel.cpp
*/
#include "aivoice/include/AiVoiceModel.h"
+#include "aivoice/include/AiVoiceModelC.h"
#include "aivoice/include/AiVoicePresenter.h"
#include "aivoice/include/AiVoiceView.h"
#include "aivoice/include/AivoiceReturnResultTextView.h"
#include <custom_save_runtime.h>
#include "cat1_ws.h"
#include "custom_runtime.h"
+#include "voice_call_volte_sample_wrapper.h"
namespace OHOS
{
// 声明定时器变量
{
if (view_ != nullptr)
{
+ start_ai4g_tts_play_timer();//开启一个定时器,用于播放tts音频
if (view_->GetAiVoiceScrollView(AIVOICE_RETURN_RESULT_TEXT_VIEWID) && view_->GetAiVoiceScrollView(AIVOICE_RETURN_RESULT_TEXT_VIEWID)->IsVisible())
{
if (!OHOS::AiVoiceModel::GetInstance().GetIsLimitDisplayed()) // 如果ai答案没有显示到极限了,就更新ai答案字符串
#endif
int32_t AudioCaptureSample(int32_t argc, const char *argv[]);
int32_t streamingRecordAndSend_AI(int type);
- void is_4g_enable_AI(int enable);
#define IS_SUPPORT_REALTIME_RECORD_SEND_AI 1 // 是否支持实时发送录音数据
#ifdef __cplusplus
};
#if IS_SUPPORT_REALTIME_RECORD_SEND_AI
int type = GetCurUsingAiModelType();
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "type = %d", type);
- is_4g_enable_AI(GetSelect4gorbt());
- streamingRecordAndSend_AI(type); // 实时发送录音数据
+ if(AiVoiceModel::GetInstance().GetSelect4gorbt() == AI_SELECT_BT)
+ {
+ streamingRecordAndSend_AI(type); // 实时发送录音数据
+ }
+ else if(AiVoiceModel::GetInstance().GetSelect4gorbt() == AI_SELECT_4G)
+ {
+ startAudioCaptureTask();
+ }
#else
std::string audioPath = AiVoiceModel::GetInstance().GetAIAudioPath();
if (uapi_delete_files(audioPath.c_str())) // 先删除文件
if (GetSelect4gorbt() == AI_SELECT_4G) // 选的是4G需要关闭asr
{
uapi_stop_asr();
+ stop_AudioCaptureProcess_AI();
+ }
+ else if(GetSelect4gorbt() == AI_SELECT_BT)
+ {
+ int32_t argc = 1;
+ uint8_t *argv = (uint8_t *)"stop";
+ AudioCaptureSample(argc, (const char **)&argv);
}
- int32_t argc = 1;
- uint8_t *argv = (uint8_t *)"stop";
- AudioCaptureSample(argc, (const char **)&argv);
uapi_save_runtime_log(RUNTIME_LOG_RECORD_STOP_AI); // TOOD*
return;
}
{
// 60s后息屏停止定时
AiVoiceModel::GetInstance().ai_stop_screen60s_timer();
- // 取消常亮屏
- ScreenAlwaysOnCtr(CANCEL_SCREEN_ALWAYS_ON);
+ if(AiVoiceModel::GetInstance().GetSelect4gorbt() == AI_SELECT_BT)
+ {
+ ScreenAlwaysOnCtr(CANCEL_SCREEN_ALWAYS_ON); // 取消常亮屏
+ }
}
}
static void ai_start_screen60s_timer_callback(int data)
/* -------------------------------------------------------------------------- */
static osTimerId_t g_ai4g_is_suc_connected_Handle = nullptr; // 处理AI4G连接定时器
- static int8_t AI4G_IS_SUC_CON_TIMEOUT = 20; // 20s钟超时
+ static uint8_t AI4G_IS_SUC_CON_TIME = 25;
+ static int8_t AI4G_IS_SUC_CON_TIMEOUT = AI4G_IS_SUC_CON_TIME; // AI4G_IS_SUC_CON_TIME秒超时
static void AI4G_IS_SUC_CON_CallbackProc(int data)
{
AiVoiceView *view_ = AiVoiceView::GetInstance();
{
if (view_ != nullptr && p_AiVoicePresenter != nullptr)
{
- if (AiVoiceModel::GetInstance().GetInit_4gai_task())
+ uint8_t asr_state = 0;
+ uint8_t chat_state = 0;
+ asr_state = get_ai_asr_service_init_flag();
+ chat_state = get_ai_chat_service_init_flag();
+ if (asr_state == 1 && chat_state == 1)
{
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "4gAi服务初始化成功");
+ bool state = true;
+ SendMsgToUIService(UI_4G_AI_INIT_STAUS, 0, &state, sizeof(bool));
uapi_start_asr();
AiVoiceModel::GetInstance().stop_ai4g_connect_timer();
p_AiVoicePresenter->ChangeViewAndLogicOperator(AIVOICE_4GSERVICECON_VIEW, AIVOICE_AIMODE_CONNECTING);
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "osTimerDelete failed, ret = %lx!!", ret);
}
g_ai4g_is_suc_connected_Handle = nullptr;
- AI4G_IS_SUC_CON_TIMEOUT = 20;
+ AI4G_IS_SUC_CON_TIMEOUT = AI4G_IS_SUC_CON_TIME;
+ }
+ }
+
+ /* -------------------------------- tts播放定时器 -------------------------------- */
+ static osTimerId_t g_ai4g_is_start_tts_play_Handle = nullptr;
+ static uint8_t AI4G_IS_START_TTS_PLAY_TIME = 1;
+
+ static void AI4G_IS_START_TTS_CallbackProc(int data)
+ {
+ if (AI4G_IS_START_TTS_PLAY_TIME <= 0)
+ {
+ AiVoiceModel::GetInstance().stop_ai4g_tts_play_timer();
+ std::string str = AiVoiceModel::GetInstance().GetAiAnswerStr();
+ // 移除所有换行符(包括 '\n' 和 '\r')
+ str.erase(
+ std::remove(str.begin(), str.end(), '\n'),
+ str.end()
+ );
+ str.erase(
+ std::remove(str.begin(), str.end(), '\r'),
+ str.end()
+ );
+ uapi_start_tts_single_txt((char *)str.c_str());
+ }
+ }
+
+ static void AI4G_IS_START_TTS_Callback(int data)
+ {
+ AI4G_IS_START_TTS_PLAY_TIME--;
+ AI4G_IS_START_TTS_CallbackProc(data);
+ // GraphicService::GetInstance()->PostGraphicEvent(std::bind(AI4G_IS_START_TTS_CallbackProc, data));
+ }
+
+ void AiVoiceModel::start_ai4g_tts_play_timer(uint32_t interval)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiVoiceModel::start_ai_isready_timer");
+ AI4G_IS_START_TTS_PLAY_TIME = 1;
+ /* -------------------------- 1.检查定时器是否已经存在,如果存在则返回 ------------------------- */
+ if (g_ai4g_is_start_tts_play_Handle != nullptr)
+ {
+ // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Timer already exists!!");
+ return;
+ }
+ /* --------------------------------- 2.创建定时器 -------------------------------- */
+ g_ai4g_is_start_tts_play_Handle = osTimerNew((osTimerFunc_t)AI4G_IS_START_TTS_Callback, osTimerPeriodic, nullptr, nullptr);
+ // 检查定时器创建是否成功
+ if (g_ai4g_is_start_tts_play_Handle == nullptr)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Timer create failed!!");
+ return;
+ }
+ /* ----------------------------- 3.将毫秒转换为系统时钟节拍数 ---------------------------- */
+ int tick = osMs2Tick(interval);
+ /* --------------------------------- 4.启动定时器 -------------------------------- */
+ osStatus_t ret = osTimerStart(g_ai4g_is_start_tts_play_Handle, tick);
+ /* -------------------- 5.检查定时器启动是否成功,如果启动失败,删除定时器并置为 nullptr -------------------- */
+ if (ret != osOK)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "osTimerDelete failed, ret = %lx!!", ret);
+ if (g_ai4g_is_start_tts_play_Handle != nullptr)
+ {
+ ret = osTimerDelete(g_ai4g_is_start_tts_play_Handle);
+ }
+ g_ai4g_is_start_tts_play_Handle = nullptr;
+ return;
+ }
+ return;
+ }
+
+ void AiVoiceModel::stop_ai4g_tts_play_timer(void)
+ {
+ // 检查定时器是否存在
+ if (g_ai4g_is_start_tts_play_Handle != nullptr)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "AiVoiceModel::stop_ai_isready_timer");
+ osTimerStop(g_ai4g_is_start_tts_play_Handle);
+ // 删除定时器并置为 nullptr
+ osStatus_t ret = osTimerDelete(g_ai4g_is_start_tts_play_Handle);
+ if (ret != osOK)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "osTimerDelete failed, ret = %lx!!", ret);
+ }
+ g_ai4g_is_start_tts_play_Handle = nullptr;
+ AI4G_IS_START_TTS_PLAY_TIME = 1;
}
}
}
}
+
+#ifdef __cplusplus
+#if __cplusplus
+extern "C"
+{
+#endif /* __cplusplus */
+#endif /* __cplusplus */
+ uint8_t getselect4gorbtai(void) // 获取AI模型选择的是4G还是蓝牙
+ {
+ if (OHOS::AiVoiceModel::GetInstance().GetSelect4gorbt() == AI_SELECT_4G)
+ {
+ return 1;
+ }
+ return 0;
+ }
+
+#ifdef __cplusplus
+#if __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* __cplusplus */
\ No newline at end of file
#include "pm.h"
#include "pm_veto.h"
+#include <asm/delay.h>
void remove_4GAI_vote(void)
{
model->stop_listening_timer();
model->stop_ai_isready_timer();
model->stop_ai4g_connect_timer();
+ model->stop_ai4g_tts_play_timer();
remove_4GAI_vote();//移除4g投票
uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_SLOW);
if (it->first == AIVOICERETURNRESULTTEXT_CONTINUECHAT_BUTTON_VIEW_ID) // 点击继续对话按钮要发取消当前对话指令,避免AI回应中途按继续对话按钮没有取消上一次对话问题
{
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "CancelCurAIChat");
+ PlayersModel::GetInstance()->HandPausePhoneMusic(); // 暂停手机音乐
+ PlayersModel::GetInstance()->PlayerPause(); // 暂停手机音乐
if (model->GetSelect4gorbt() == AI_SELECT_4G)
{
uapi_start_asr();
+ usleep(50000);
+ ChangeViewAndLogicOperator(AIVOICE_RETURN_RESULT_TEXT_VIEWID,AIVOICE_AIMODE_CONNECTING);
+ return true;
}
else if (model->GetSelect4gorbt() == AI_SELECT_BT)
{
AiVoiceModel::GetInstance().CancelCurAIChat();
// AiVoiceModel::GetInstance().sendAIIsReady();
}
- PlayersModel::GetInstance()->HandPausePhoneMusic(); // 暂停手机音乐
- PlayersModel::GetInstance()->PlayerPause(); // 暂停手机音乐
}
ChangeViewAndLogicOperator(it->second.first, it->second.second);
return true;
{
// 通过4G调用大模型
model->SetSelect4gorbt(AI_SELECT_4G);
+ init_ai_task();
if (!model->GetInit_4gai_task())
{
- init_ai_task();
model->start_ai4g_connect_timer();
ChangeViewAndLogicOperator(AIVOICE_STARTCHAT_VIEWID, AIVOICE_4GSERVICECON_VIEW); // LOADING
}
{
// 通过4G调用大模型
model->SetSelect4gorbt(AI_SELECT_4G);
+ init_ai_task();
if (!model->GetInit_4gai_task())
{
- init_ai_task();
model->start_ai4g_connect_timer();
ChangeViewAndLogicOperator(AIVOICE_STARTCHAT_VIEWID, AIVOICE_4GSERVICECON_VIEW); // LOADING
}
/*连接超时界面右滑退到AI对话界面*/
ChangeViewAndLogicOperator(AIVOICE_AIMODE_CONNECTING, AIVOICE_STARTCHAT_VIEWID);
}
+ else if (scrollView == view_->GetAiVoiceScrollView(AIVOICE_SELECT_VIEW))
+ {
+ /*连接超时界面右滑退到AI对话界面*/
+ ChangeViewAndLogicOperator(AIVOICE_SELECT_VIEW, AIVOICE_STARTCHAT_VIEWID);
+ }
AiVoicePresenter::X_DRAG_FLAG = false;
}
else if (model->GetAiModelTextId() == STR_AIMODES_CHATGPT && event.GetDragDirection() == DragEvent::DIRECTION_BOTTOM_TO_TOP) /*上滑*/
#include "BluetoothWrapper.h"\r
#endif\r
#include "custom_save_runtime.h"\r
-\r
-\r
+#include "aivoice/include/AiVoiceModelC.h"\r
+#include "voice_call_volte_sample_wrapper.h"\r
// extern void bts_data_to_uuid_len2(uint16_t uuid_data, bt_uuid_t *out_uuid);\r
// extern void bts_init_128bit_uuid(const bt_uuid_t *uuid);\r
// #include "ble_hid_take_photo_server.h"\r
LOS_Msleep(AI_interval+get_ble_interval());\r
}\r
\r
-#define ENABLE_4GAI 0\r
static void blesrvAi_send_service_task(void const *arg)\r
{\r
unused(arg);\r
// if(get_ble_connect())\r
\r
\r
- #if ENABLE_4GAI\r
- if(mail.msg_data && mail.msg_len!=0)\r
+ if(getselect4gorbtai() == 1) //选择的是4g\r
{\r
- send_ai_bin(mail.msg_data,mail.msg_len);\r
+ if(mail.msg_data && mail.msg_len!=0)\r
+ {\r
+ if(server_handle == 200)\r
+ {\r
+ AIStreamWrite(mail.msg_data,mail.msg_len);\r
+ }\r
+ else{\r
+ send_ai_bin(mail.msg_data,mail.msg_len);\r
+ }\r
+ }\r
}\r
- #else\r
- if(mail.msg_data && mail.msg_len!=0)\r
- send_Ai_record(mail.msg_len,mail.msg_data,AI_data_count);\r
- #endif\r
- \r
+ else //蓝牙\r
+ {\r
+ if(mail.msg_data && mail.msg_len!=0)\r
+ {\r
+ send_Ai_record(mail.msg_len,mail.msg_data,AI_data_count);\r
+ }\r
+ }\r
+ \r
\r
if(mail.msg_data)\r
{\r
if (buff == NULL) return ERRCODE_FAIL;\r
\r
uint32_t sendlen = sizeof(blesrv_custom_cmd_t);\r
- uint32_t singlebuflen= ble_nus_max_data_len-20;\r
+ // uint32_t singlebuflen= ble_nus_max_data_len-20;\r
+ uint32_t singlebuflen = 0;\r
+ if(getselect4gorbtai() == 1) {\r
+ singlebuflen = 600;//4G\r
+ } else {\r
+ singlebuflen = ble_nus_max_data_len-20;//BT\r
+ }\r
blesrv_mail.msg_data=0;\r
\r
+ if(type == 200)\r
+ {\r
+ \r
+ blesrv_mail.service_handle = type;\r
+ blesrv_mail.msg_len = len;\r
+ blesrv_mail.msg_data = (uint8_t*)malloc(len);\r
+\r
+ if(blesrv_mail.msg_data==NULL)\r
+ {\r
+ return ERRCODE_FAIL;\r
+ }\r
+ memcpy_s((void *)(blesrv_mail.msg_data),len,buff,len);\r
+\r
+ ret = osal_msg_queue_write_copy(g_ble_Ai_record_queue, (void *)&blesrv_mail, sendlen , 0);\r
+ if (ret != OSAL_SUCCESS)\r
+ {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"len<=singlebuflen Error blesrv Check send failed! err=0x%X %d! \r\n", ret,send_msg_data_into_Ai_msg_queue_count);\r
+ }\r
+ return OSAL_SUCCESS;\r
+ \r
+ }\r
if(len<=singlebuflen)\r
{\r
if(type==1)\r
{
send_packet_total++;
}
-
+ printf("get_alipay_ble_nus_max_data_len: %u\r\n",get_alipay_ble_nus_max_data_len());
printf("总数据长度: %u 字节, 预计分包数量: %u 个\n", datalen, send_packet_total);
// 单包传输逻辑
uint32_t current_packet_id = *(uint32_t *)(buf + 11);
uint16_t current_datalen = *(uint16_t *)(buf + 15);
-#if alipay_transspecard_log
+#if 1
// 打印头部信息
printf("Message Header: 0x%02X\n", message_header);
printf("Message Type: 0x%02X\n", message_type);
printf("init_websocket_client end 2");
return client;
client_ERROR:
- if(buffer)
+ if(buffer) {
free(buffer);
- if(client)
+ buffer=NULL;
+ }
+ if(client){
free(client);
-
+ client = NULL;
+ }
free_url(parsed_url);
return NULL;
memcpy_s(content_str_chat,64,content_str,strlen(content_str));
ble_set_ai_Answer_str(content_str_chat,2);
// uapi_start_tts_single_txt(content_str_chat);
- static uint8_t test=1;
- if(test)
- {
- uapi_start_tts_single();
- test=0;
+ // static uint8_t test=1;
+ // if(test)
+ // {
+ // uapi_start_tts_single();
+ // test=0;
- }
+ // }
}
}
uint8_t is_bk_websocket_chat=0;
+static uint8_t ai_asr_service_init_flag = 0; //asr初始化标志
+static uint8_t ai_chat_service_init_flag = 0; //chat初始化标志
+static uint8_t ai_tts_server_init_flag = 0; //tts初始化标志
+// 获取ASR服务初始化标志
+uint8_t get_ai_asr_service_init_flag(void)
+{
+ return ai_asr_service_init_flag;
+}
+
+// 设置ASR服务初始化标志
+void set_ai_asr_service_init_flag(uint8_t flag)
+{
+ ai_asr_service_init_flag = flag;
+}
+
+// 获取Chat服务初始化标志
+uint8_t get_ai_chat_service_init_flag(void)
+{
+ return ai_chat_service_init_flag;
+}
+
+// 设置Chat服务初始化标志
+void set_ai_chat_service_init_flag(uint8_t flag)
+{
+ ai_chat_service_init_flag = flag;
+}
+
+// 获取tts服务初始化标志
+uint8_t get_ai_tts_server_init_flag(void)
+{
+ return ai_tts_server_init_flag;
+}
+// 设置tts服务初始化标志
+void set_ai_tts_server_init_flag(uint8_t flag)
+{
+ ai_tts_server_init_flag = flag;
+}
void bk_websocket_demo(void *data) {
// send_ai_txt(1,"你是谁");
-
+ set_ai_chat_service_init_flag(1);
WebSocketMessageType type;
while (1)
{
#include "common_def.h"
#include "los_printf.h"
-#define CAT1_SERVICE_TASK_SIZE (2048)
+#define CAT1_SERVICE_TASK_SIZE (3072)
#define CAT1_SERVICE_TASK_PRIO 5
{
char *jsonString ="{\"header\":{\"event\":\"StopTranscription\",\"trace_id\":\"3fa6b9e6a30b407ea38ad7ae69e6c291\"}}";
- uapi_tts_paly_init();
+ // uapi_tts_paly_init();
if (send_websocket_message(asr_client,( const unsigned char *)jsonString,strlen(jsonString),WS_TEXT)==0)
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"send_websocket_message succ 0\n");
}
#include "audio_capture_wrapper.h"
#include <ui_service.h>
+#include <bleService.h>
// {"status":20000000,"msg":"success","task_id":"80228c9f62821ffe3f867e1a5042d887","event":"TranscriptionStarted","result":null}
// {"status":20000000,
ble_set_ai_Question_str(result_str_asr);
send_ai_txt(0,result_str_asr);
- uapi_stop_asr();
- stop_AudioCaptureProcess_AI();
+ // uapi_stop_asr();
+ // stop_AudioCaptureProcess_AI();
}
- if(strcmp(event_str,"TranscriptionStarted")==0)
+ if(strcmp(event_str,"TranscriptionStarted")==0) //可以对话了,切换到聆听界面
{
//查询结果
// streamingRecordAndSend_AI(0);
- // bool state = true;
- // SendMsgToUIService(UI_AI_JUMP_TO_LISTENING_VIEW, 0, &state, sizeof(bool));
- startAudioCaptureTask();
+ // startAudioCaptureTask();
+ bool state = true;
+ SendMsgToUIService(UI_AI_JUMP_TO_LISTENING_VIEW, 0, &state, sizeof(bool));
}
if(strcmp(event_str,"Failed")==0)
{
// uapi_start_asr();
// SendMsgToUIService(UI_4G_AI_INIT_STAUS, 0,&state, sizeof(bool));
-
+ set_ai_asr_service_init_flag(1);
while (1)
{
memset_s(asr_recv_buf,1024,0,1024);
void uapi_start_tts_single_txt(char *buf)
{
- char jsonString[512] ={0};
+ char *jsonString = (char *)malloc(512);
sprintf(jsonString, " { \"header\": { \
\"event\": \"LongTextStream\",\
}, \
\"payload\": { \
\"voice\":\"xiaoyun\", \
- \"format\":\"pcm\", \
+ \"format\":\"mp3\", \
\"sample_rate\":16000, \
\"volume\":50, \
\"speech_rate\":0, \
if (send_websocket_message(tts_client,( const unsigned char *)jsonString,strlen(jsonString),WS_TEXT)==0)
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"send_websocket_message succ 0\n");
+
+ free(jsonString);
+ jsonString = NULL;
}
// char *tts_txt_str=
printf("bk_websocket_tts bk_websocket_tts %d\r\n",type);
if(type==WS_BINARY)
{
- AIStreamWrite((uint8_t *)tts_recv_buf,len);
+ // AIStreamWrite((uint8_t *)tts_recv_buf,len);
+ send_msg_data_into_Ai_msg_queue((uint8_t *)tts_recv_buf,len,200);
}
// aer_result_analysis(asr_recv_buf);
bool init_ai_task(void);
- void uapi_start_tts_single_txt(char *buf);
-
+void uapi_start_tts_single_txt(char *buf);
+uint8_t get_ai_asr_service_init_flag(void);
+void set_ai_asr_service_init_flag(uint8_t flag);
+uint8_t get_ai_chat_service_init_flag(void);
+void set_ai_chat_service_init_flag(uint8_t flag);
+uint8_t get_ai_tts_server_init_flag(void);
+void set_ai_tts_server_init_flag(uint8_t flag);
#ifdef __cplusplus
#if __cplusplus
}
#include "bleService.h"
static uint32_t AI_audio_size=0;
static uint8_t Cur_AI_Model= 0;
-static uint8_t ai_4g_enable_flag = 0;
-void is_4g_enable_AI(uint8_t enable)
-{
- ai_4g_enable_flag = enable;
-}
static void* AudioCaptureProcess_AI(void* arg)
{
int32_t streamingRecordAndSend_AI(int type)
{
// 定义argv数组在更大的作用域
- const char *argv[6];
- // if(ai_4g_enable_flag == 1)
- {
- argv[0] = "01"; argv[1] = "mp3"; argv[2] = "16000";
- argv[3] = "1"; argv[4] = "16"; argv[5] = "/user/aiRecord.sbc";
- }
- // else
- // {
- // argv[0] = "01"; argv[1] = "sbc"; argv[2] = "16000";
- // argv[3] = "1"; argv[4] = "16"; argv[5] = "/user/aiRecord.sbc";
- // }
+ const char *argv[6] ={"01", "sbc", "16000", "1", "16", "/user/aiRecord.sbc"};
int32_t argc = 6;
Cur_AI_Model = type;
if (g_audioSourceProcessInput.bThreadRun) {
int32_t streamingRecordAndSend_AI(int type);
-void is_4g_enable_AI(uint8_t enable);
#ifdef __cplusplus
};
// 16000 32000 44100 48000
AudioRendererConfig renderConfig = {};
- renderConfig.audioFormat = PCM;
+ renderConfig.audioFormat = MP3;
renderConfig.channelCount = 1;
renderConfig.linkDir = AUDIO_DOWN_LINK;
renderConfig.sampleRate = 16000;
MEDIA_ERR_LOG("g_stream_in_uplink->Start");
uint8_t* data_buf=(uint8_t *)malloc(1024);
-
- MEDIA_ERR_LOG("malloc");
+ if(data_buf == NULL)
+ {
+ MEDIA_ERR_LOG("malloc");
+ return NULL;
+ }
AudioCaptureTask_is_run=1;
// 蓝牙接口发送实时录音数据
}
free(data_buf);
+ data_buf = NULL;
MEDIA_ERR_LOG("AI_audio_size %d",AI_audio_size);
ret = g_stream_in_uplink->Stop();
#endif /* LOSCFG_KERNEL_SMP */
#define ROUND_UP_DIV(val, div) (((val) + (div) - 1) / (div))
-#define LWIP_LOG_BUF_SIZE 64
+// #define LWIP_LOG_BUF_SIZE 64
+#define LWIP_LOG_BUF_SIZE 512 //修改后,解决缓冲区溢出 死机问题
/**
* Thread and System misc
char buf[LWIP_LOG_BUF_SIZE] = {0};
va_list ap;
va_start(ap, fmt);
+
+ // 第一次尝试:正常格式化
len = vsprintf_s(buf, sizeof(buf) - 1, fmt, ap);
va_end(ap);
+
if (len < 0) {
- LWIP_LOGGER("log param invalid or buf is not enough.");
+ // 错误处理
+
+ // 检查是否是缓冲区不足
+ va_list ap_check;
+ va_start(ap_check, fmt);
+ int needed_len = vsnprintf(NULL, 0, fmt, ap_check);
+ va_end(ap_check);
+
+ if (needed_len > LWIP_LOG_BUF_SIZE - 1) {
+ // 缓冲区不足
+ printf("log buffer is not enough. Needed: %d, Available: %d",
+ needed_len, LWIP_LOG_BUF_SIZE - 1);
+ } else {
+ // 参数错误或其他问题
+ printf("log parameter invalid. vsnprintf needed: %d, vsprintf_s returned: %d",
+ needed_len, len);
+ }
return;
}
LWIP_LOGGER(buf);