From: luozheng <1732036298@qq.com> Date: Tue, 23 Sep 2025 04:22:16 +0000 (+0800) Subject: 录音和播放接口采用4gai中接口,未测试 X-Git-Tag: V1.0.9_20251128_194606_LN~343 X-Git-Url: http://git.snicker.com.cn/css/static/gitweb.css?a=commitdiff_plain;h=3c920c73d7c89afe58f7e1e4522053e95aba769f;p=mirrors%2FFD230.git 录音和播放接口采用4gai中接口,未测试 --- diff --git a/code/sdk/zhihui/leiniao/imsl_ln/leiniao_api_at.c b/code/sdk/zhihui/leiniao/imsl_ln/leiniao_api_at.c index d0ce9f2c5..ea58f1794 100644 --- a/code/sdk/zhihui/leiniao/imsl_ln/leiniao_api_at.c +++ b/code/sdk/zhihui/leiniao/imsl_ln/leiniao_api_at.c @@ -773,7 +773,8 @@ static uint32_t ln_audio_play_at(uint8_t *para, uint32_t paraLen, char *strCommo { VAD_UNUSED(para); VAD_UNUSED(paraLen); VAD_UNUSED(strCommonCmd); printf("[LN][AUDIO_PLAY]\n"); - do_ln_http_server_send_data(LN_HTTP_SERVICE_CMD_AUDIO_PLAY, NULL, 0); + // do_ln_http_server_send_data(LN_HTTP_SERVICE_CMD_AUDIO_PLAY, NULL, 0); + ln_ai_record_start(); return ERRCODE_SUCC; } @@ -782,7 +783,8 @@ static uint32_t ln_audio_stop_at(uint8_t *para, uint32_t paraLen, char *strCommo { VAD_UNUSED(para); VAD_UNUSED(paraLen); VAD_UNUSED(strCommonCmd); printf("[LN][AUDIO_STOP]\n"); - do_ln_http_server_send_data(LN_HTTP_SERVICE_CMD_AUDIO_STOP, NULL, 0); + // do_ln_http_server_send_data(LN_HTTP_SERVICE_CMD_AUDIO_STOP, NULL, 0); + ln_ai_record_stop(); return ERRCODE_SUCC; } @@ -810,7 +812,6 @@ static uint32_t ln_audio_pause_at(uint8_t *para, uint32_t paraLen, char *strComm VAD_UNUSED(para); VAD_UNUSED(paraLen); VAD_UNUSED(strCommonCmd); printf("[LN][AUDIO_PAUSE]\n"); // do_ln_http_server_send_data(LN_HTTP_SERVICE_CMD_AUDIO_PAUSE, NULL, 0); - uapi_ln_audio_download_is_cancel(1); return ERRCODE_SUCC; } @@ -820,7 +821,6 @@ static uint32_t ln_audio_resume_at(uint8_t *para, uint32_t paraLen, char *strCom VAD_UNUSED(para); VAD_UNUSED(paraLen); VAD_UNUSED(strCommonCmd); printf("[LN][AUDIO_RESUME]\n"); do_ln_http_server_send_data(LN_HTTP_SERVICE_CMD_AUDIO_RESUME, NULL, 0); - uapi_ln_audio_download_is_cancel(0); return ERRCODE_SUCC; } diff --git a/code/sdk/zhihui/leiniao/imsl_ln/ln_api.c b/code/sdk/zhihui/leiniao/imsl_ln/ln_api.c index 986f4f09b..38523c3bc 100644 --- a/code/sdk/zhihui/leiniao/imsl_ln/ln_api.c +++ b/code/sdk/zhihui/leiniao/imsl_ln/ln_api.c @@ -13,6 +13,7 @@ #include "stdio.h" #include "audio_stream_player.h" #include "custom_utils.h" +#include "ai_media.h" // 声明播放器消息处理函数 extern void ln_story_player_simple_handle_message(int cmd, char *data, uint32_t len); @@ -37,7 +38,6 @@ char *g_ln_last_package_url = NULL; // 最近一次查询到的 OTA 包 URL char *g_ln_last_target_version = NULL; // 最近一次查询到的 OTA 包目标版本(动态分配) char *g_ln_last_package_md5 = NULL; // 最近一次查询到的 OTA 包 MD5(动态分配) int g_ln_last_package_size = 0; // 最近一次查询到的 OTA 包大小(字节) -static int g_ln_audio_download_cancel = 0; /* 0=正常, 1=取消 */ int g_ln_is_device_bound = 0; /* 设备绑定状态 */ char g_ln_device_user_id[64] = {0}; // 设备绑定用户ID @@ -174,7 +174,7 @@ const char *uapi_ln_ota_get_saved_path(void) return (g_ln_last_saved_path && g_ln_last_saved_path[0] != '\0') ? g_ln_last_saved_path : NULL; } -/* 获取选择故事录音音频路径 */ +/* 获取录音音频路径 */ const char *uapi_ln_get_audio_path(void) { // 判断目录是否存在,不存在则创建 @@ -186,20 +186,6 @@ const char *uapi_ln_get_audio_path(void) return path; } -//中断语音对话播放 -void uapi_ln_audio_download_is_cancel(int status) -{ - g_ln_audio_download_cancel = status; - if(g_ln_audio_download_cancel) - { - ln_audio_player_pause(); - } - else - { - ln_audio_player_resume(); - } -} - /* 获取是否绑定用户 */ int uapi_ln_is_device_bound(void) { @@ -739,10 +725,6 @@ static uint32_t ln_download_mp3_file_advanced(const char *audio_url, const char // 接收响应数据(支持取消) do { - if (g_ln_audio_download_cancel) { - printf("download canceled by user\n"); - break; - } HTTPC_RESULT recv_res = HttpClientRecvResponse(&client, &client_data); if (recv_res == HTTP_SUCCESS || recv_res == HTTP_EAGAIN) { @@ -763,21 +745,7 @@ static uint32_t ln_download_mp3_file_advanced(const char *audio_url, const char } total_written += written; #endif - - /* 非阻塞入队,队列满则忽略该块 */ - //播放下载的音频 - int ret = ln_audio_player_write((const uint8_t*)client_data.responseBuf, (uint32_t)client_data.contentBlockLen); - if (ret != 0) - { - printf("download mp3 file advanced: write failed, ret=%d\n", ret); - // 写失败重新写 - LOS_Msleep(100); - ret = ln_audio_player_write((const uint8_t*)client_data.responseBuf, (uint32_t)client_data.contentBlockLen); - if (ret != 0) - { - printf("download mp3 file advanced: write failed, ret=%d\n", ret); - } - } + AI_SendAudioDataToQueue((const uint8_t*)client_data.responseBuf, client_data.contentBlockLen); } else { @@ -797,8 +765,6 @@ static uint32_t ln_download_mp3_file_advanced(const char *audio_url, const char #endif HttpClientUnprepare(&client_data); HttpClientClse(&client); - - printf("[SSE] download completed, total bytes: %zu\n", total_written); free(save_path); return ERRCODE_SUCC; } @@ -1043,18 +1009,8 @@ uint32_t ln_parse_file_and_process_data(const char *file_path, int interface_typ set_start_conversation_flag(START_CONVERSATION_FLAG_STORY_START); } - if(g_ln_audio_download_cancel)//如果之前中断了播放,新的对话就恢复播放 - { - uapi_ln_audio_download_is_cancel(0); - } - while (fgets(line, 2048, fp)) { - if (g_ln_audio_download_cancel) { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[SSE] download canceled by user\n"); - break; - } - line_count++; // 去除行尾的换行符 @@ -1249,12 +1205,10 @@ static void ln_http_server_send_task(void const *arg) else if (mail.cmd == LN_HTTP_SERVICE_CMD_AUDIO_PAUSE) { printf("LN_HTTP_SERVICE_CMD_AUDIO_PAUSE:暂停播放\n"); - uapi_ln_audio_download_is_cancel(1); } else if (mail.cmd == LN_HTTP_SERVICE_CMD_AUDIO_RESUME) { printf("LN_HTTP_SERVICE_CMD_AUDIO_RESUME:恢复播放\n"); - uapi_ln_audio_download_is_cancel(0); } if (mail.data != NULL) { @@ -1433,6 +1387,55 @@ void do_ln_http_server_recv_data(int cmd, char *data, uint32_t len) if (recv_data.data) free(recv_data.data); } } + +static FILE* g_aiCtx_fp = NULL; +static int g_is_ai_record_start = 0; +// 示例音频数据回调函数 +static void LeiniaoDataCallback(const uint8_t* data, uint32_t size, void* userData)//用来上传的数据,可以边录音边上传 +{ + // 在这里处理音频数据,例如: + // - 发送到AI语音识别服务 + // - 保存到文件 + // - 进行音频处理等 + // 注意:data指针指向的缓冲区在回调函数返回后可能被释放,如需保存数据请复制 + if(g_is_ai_record_start) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"Received audio data: size=%u bytes", size); + if (!data || size == 0) return; + const char *path = uapi_ln_get_audio_path(); + if (!path || !path[0]) return; + if (!g_aiCtx_fp) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"fopen %s\r\n", path); + g_aiCtx_fp = fopen(path, "wb+"); + if (!g_aiCtx_fp) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"fopen fail %s\r\n", path); + return; + } + } + if (g_aiCtx_fp) + { + (void)fwrite(data, 1, size, g_aiCtx_fp); + } + } +} + +void ln_ai_record_start(void) +{ + g_is_ai_record_start = 1; +} + +void ln_ai_record_stop(void) +{ + if (g_aiCtx_fp) + { + fclose(g_aiCtx_fp); + g_aiCtx_fp = NULL; + } + g_is_ai_record_start = 0; +} + // 雷鸟http服务初始化 errcode_t uapi_ln_http_server_init(void) { @@ -1466,13 +1469,14 @@ errcode_t uapi_ln_http_server_init(void) return ERRCODE_FAIL; } - /* 初始化音频播放器(流式输出) */ - if (ln_audio_player_init() != ERRCODE_SUCC) - { - printf("[LN_AUDIO] init failed in http server init\n"); - /* 不中断HTTP服务,按需可返回失败 */ - } + // /* 初始化音频播放器(流式输出) */ + // if (ln_audio_player_init() != ERRCODE_SUCC) + // { + // printf("[LN_AUDIO] init failed in http server init\n"); + // /* 不中断HTTP服务,按需可返回失败 */ + // } + old_Start_AIVoice(LeiniaoDataCallback,NULL); return ERRCODE_SUCC; } diff --git a/code/sdk/zhihui/leiniao/imsl_ln/ln_api.h b/code/sdk/zhihui/leiniao/imsl_ln/ln_api.h index ade4727ca..a2b2b88a9 100644 --- a/code/sdk/zhihui/leiniao/imsl_ln/ln_api.h +++ b/code/sdk/zhihui/leiniao/imsl_ln/ln_api.h @@ -198,8 +198,6 @@ int uapi_ln_ota_get_update_type(void); const char *uapi_ln_ota_get_saved_path(void); /* 获取选择录音音频路径 */ const char *uapi_ln_get_audio_path(void); -/* 音频下载/播放控制 */ -void uapi_ln_audio_download_is_cancel(int status); /* 获取是否绑定用户 */ int uapi_ln_is_device_bound(void); /* 设置是否绑定用户 */ @@ -257,6 +255,12 @@ void ln_parse_schedule_reminder_config(const char *json_str, int json_len); void ln_parse_download_emoji(const char *json_str, int json_len); /* 解析删除表情 */ void ln_parse_delete_emoji(const char *json_str, int json_len); + +/* 开始录音 */ +void ln_ai_record_start(void); +/* 停止录音 */ +void ln_ai_record_stop(void); + /* ============================== 各接口函数声明 ============================== */ uint32_t ln_get_device_token_http(const char *device_id, const char *device_iccid,