#include "audio_stream_player.h"
#include <stdlib.h>
+#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
-#include <errno.h>
// 包含音频管理相关头文件
#include "audio_manager_c_wrapper.h"
}
// 激活音频中断
- if (AudioManagerActivateInterrupt(AUDIO_STREAM_VOICE_ASSISTANT, sessionId) == INTERRUPT_FAILED)
+ if (AudioManagerActivateInterrupt(AUDIO_STREAM_ALARM_CLOCK, sessionId) == INTERRUPT_FAILED)
{
MEDIA_ERR_LOG("AudioStreamPlayerInit: failed to activate audio interrupt");
return -1;
renderConfig.linkDir = AUDIO_UP_LINK; // 上行链路,用于播放
renderConfig.sampleRate = ctx->config.sampleRate;
renderConfig.sessionID = sessionId;
- renderConfig.streamType = AUDIO_STREAM_VOICE_ASSISTANT;
+ renderConfig.streamType = AUDIO_STREAM_ALARM_CLOCK;
// 初始化音频输出流
int32_t ret = AudioStreamOutInit(renderConfig);
task_cfg.create_queue_handle = CreateAudioStreamQueue;
task_cfg.attr.name = "AudioStreamPlayThread";
task_cfg.attr.priority = (osPriority_t)16;
- task_cfg.attr.stack_size = 0x2000; // 8KB
+ task_cfg.attr.stack_size = 0x1000; // 8KB
task_cfg.func = AudioStreamPlayThread;
task_cfg.use_mem = USE_EXTEND_MEM;
extern errcode_t uapi_create_osThread_custom(app_task_definition_t * task_cfg);
AudioStreamPlayerContext *ctx = (AudioStreamPlayerContext *)handle;
ctx->volume = volume;
// 设置音频流音量 - 使用AudioManagerSetVolume
- AudioManagerSetVolume(AUDIO_STREAM_VOICE_ASSISTANT, (int32_t)(volume * 100));
+ AudioManagerSetVolume(AUDIO_STREAM_ALARM_CLOCK, (int32_t)(volume * 100));
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"AudioStreamPlayerSetVolume: set to %.2f", volume);
return 0;
}
return AudioStreamPlayerGetStats(g_ln_audio_player, stats);
}
+uint32_t ln_audio_player_stop(void)
+{
+ if (g_ln_audio_player == nullptr) {
+ return ERRCODE_SUCC;
+ }
+ (void)AudioStreamPlayerDestroy(g_ln_audio_player);
+ g_ln_audio_player = nullptr;
+ return ERRCODE_SUCC;
+}
+
+uint32_t ln_audio_player_play_file(const char *file_path)
+{
+ if (file_path == nullptr) {
+ return ERRCODE_FAIL;
+ }
+
+ FILE *file = fopen(file_path, "rb");
+ if (file == nullptr) {
+ return ERRCODE_FAIL;
+ }
+
+ if (ln_audio_player_init() != ERRCODE_SUCC) {
+ fclose(file);
+ return ERRCODE_FAIL;
+ }
+
+ // 获取文件大小(可用于完成判定的辅助)
+ long file_size = 0;
+ long current_pos = ftell(file);
+ if (current_pos >= 0) {
+ (void)fseek(file, 0, SEEK_END);
+ file_size = ftell(file);
+ (void)fseek(file, 0, SEEK_SET);
+ }
+
+ const size_t CHUNK_SIZE = 1024; // 与现有用法一致
+ uint8_t buffer[CHUNK_SIZE];
+ size_t read_len;
+ while ((read_len = fread(buffer, 1, CHUNK_SIZE, file)) > 0) {
+ if (ln_audio_player_write(buffer, (uint32_t)read_len) != 0) {
+ fclose(file);
+ (void)ln_audio_player_stop();
+ return ERRCODE_FAIL;
+ }
+ }
+ fclose(file);
+
+ // 先等待播放队列清空
+ const int wait_step_us = 50 * 1000; // 50ms
+ for (;;) {
+ AudioStreamStats stats = {0};
+ if (ln_audio_player_get_stats(&stats) == 0) {
+ if (stats.queueCurrentSize == 0) {
+ break;
+ }
+ }
+ usleep(wait_step_us);
+ }
+
+ // 再额外等待尾部缓冲播放完成,避免被立即Stop打断结尾
+ const int tail_grace_us = 2000 * 1000; // 2s
+ usleep(tail_grace_us);
+
+ // 停止并销毁,确保线程回收
+ (void)ln_audio_player_stop();
+ return ERRCODE_SUCC;
+}
+
#ifdef __cplusplus
};
#endif
\ No newline at end of file