{
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;
}
{
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;
}
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;
}
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;
}
#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);
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
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)
{
// 判断目录是否存在,不存在则创建
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)
{
// 接收响应数据(支持取消)
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)
{
}
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
{
#endif
HttpClientUnprepare(&client_data);
HttpClientClse(&client);
-
- printf("[SSE] download completed, total bytes: %zu\n", total_written);
free(save_path);
return ERRCODE_SUCC;
}
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++;
// 去除行尾的换行符
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)
{
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)
{
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;
}