录音和播放接口采用4gai中接口,未测试
authorluozheng <1732036298@qq.com>
Tue, 23 Sep 2025 04:22:16 +0000 (12:22 +0800)
committerluozheng <1732036298@qq.com>
Tue, 23 Sep 2025 04:22:16 +0000 (12:22 +0800)
code/sdk/zhihui/leiniao/imsl_ln/leiniao_api_at.c
code/sdk/zhihui/leiniao/imsl_ln/ln_api.c
code/sdk/zhihui/leiniao/imsl_ln/ln_api.h

index d0ce9f2..ea58f17 100644 (file)
@@ -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;
 }
 
index 986f4f0..38523c3 100644 (file)
@@ -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;
 }
index ade4727..a2b2b88 100644 (file)
@@ -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,