From 8845f6650dd120291a08ad92972902fc002dca7b Mon Sep 17 00:00:00 2001 From: luozheng <1732036298@qq.com> Date: Fri, 19 Dec 2025 20:44:31 +0800 Subject: [PATCH] =?utf8?q?ln=EF=BC=9A=E8=A7=A3=E5=86=B3=E5=AF=B9=E8=AF=9D?= =?utf8?q?=E8=BF=87=E7=A8=8B=E4=B8=AD=E3=80=82=E6=97=A5=E7=A8=8B=E6=92=AD?= =?utf8?q?=E6=94=BE=E4=B8=8D=E4=BA=86bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- code/sdk/zhihui/leiniao/imsl_ln/ln_api.c | 7 ++ .../leiniao/ln_api_cpp/ln_audio_simple.cpp | 88 ++++++++++++++++--- 2 files changed, 81 insertions(+), 14 deletions(-) diff --git a/code/sdk/zhihui/leiniao/imsl_ln/ln_api.c b/code/sdk/zhihui/leiniao/imsl_ln/ln_api.c index a72e9b20b..f77fe8e07 100644 --- a/code/sdk/zhihui/leiniao/imsl_ln/ln_api.c +++ b/code/sdk/zhihui/leiniao/imsl_ln/ln_api.c @@ -22,6 +22,7 @@ #endif #include "bluetooth/Ln_Bluetooth_apiC.h" #include "cat1_tcpServer.h" +#include "ln_audio_simple.h" // 声明播放器消息处理函数 static app_task_definition_t ln_send_taskcfg = {0}; @@ -1361,6 +1362,12 @@ static void ln_http_server_send_task(void const *arg) printf("LN_HTTP_SERVICE_CMD_CHAT_SESSION_END:语音对话流结束\n"); ln_ws_send_chat_session_end(); } + else if (mail.cmd == LN_HTTP_SERVICE_CMD_AUDIO_STOP) + { + printf("[LN_HTTP_SERVICE] LN_HTTP_SERVICE_CMD_AUDIO_STOP:停止音频播放并清理资源\n"); + // 清理 ln_audio_simple 的音频资源 + ln_audio_simple_stop(); + } if (mail.data != NULL) { printf("free(mail.data)\n"); diff --git a/code/sdk/zhihui/leiniao/ln_api_cpp/ln_audio_simple.cpp b/code/sdk/zhihui/leiniao/ln_api_cpp/ln_audio_simple.cpp index e7ce3c125..49da1ba5a 100644 --- a/code/sdk/zhihui/leiniao/ln_api_cpp/ln_audio_simple.cpp +++ b/code/sdk/zhihui/leiniao/ln_api_cpp/ln_audio_simple.cpp @@ -17,6 +17,8 @@ #include #include #include +/* 引入消息队列相关头文件 */ +#include "../imsl_ln/ln_api.h" using OHOS::Media::Player; using OHOS::Media::Source; @@ -44,6 +46,40 @@ typedef struct static ln_audio_simple_impl_t g_simple = {0}; +/* ============================== 播放器回调类 ============================== */ + +class SimpleAudioCallback : public PlayerCallback +{ +public: + SimpleAudioCallback(ln_audio_simple_impl_t *impl) : impl_(impl) {} + + void OnPlaybackComplete() override + { + if (impl_) + { + printf("[LN_AUDIO_SIMPLE] playback completed, sending cleanup message\n"); + // 通过消息队列发送清理命令,避免在回调中直接调用导致卡住 + // 发送消息到 ln_http_server_send_task 线程 + do_ln_http_server_send_data(LN_HTTP_SERVICE_CMD_AUDIO_STOP, NULL, 0); + impl_->is_playing = false; + } + } + + void OnError(int32_t errorType, int32_t errorCode) override + { + printf("[LN_AUDIO_SIMPLE] playback error: type=%d, code=%d\n", errorType, errorCode); + } + + void OnInfo(int32_t type, int32_t extra) override {} + void OnRewindToComplete() override {} + +private: + ln_audio_simple_impl_t *impl_; +}; + +/* ============================== 中断监听器类 ============================== */ +static std::shared_ptr g_player_callback = nullptr; + class SimpleSingleInterruptListener : public InterruptListener { public: @@ -82,10 +118,32 @@ private: ln_audio_simple_impl_t *impl_; }; +static void ClearAudioInterrupt() +{ + if (g_simple.is_activate_audio_interrupt && g_simple.interrupt && g_simple.sessionId != AUDIO_SESSION_ID_NONE) + { + AudioManager &amInstance = AudioManager::GetInstance(); + amInstance.DeactivateAudioInterrupt(*g_simple.interrupt); + g_simple.is_activate_audio_interrupt = false; + } + g_simple.is_playing = false; + g_simple.is_paused = false; + g_simple.audio_initialized = false; + g_simple.sessionId = AUDIO_SESSION_ID_NONE; + g_simple.interrupt.reset(); + g_simple.interruptListener.reset(); + g_simple.player->Reset(); + printf("[LN_AUDIO_SIMPLE] ClearAudioInterrupt done\n"); +} + static bool AudioInitOnce(void) { if (g_simple.audio_initialized) - return true; + { + printf("[LN_AUDIO_SIMPLE] AudioManager already initialized\n"); + ClearAudioInterrupt(); + // return true; + } AudioManager &amInstance = AudioManager::GetInstance(); if (!amInstance.Initialize()) @@ -101,6 +159,14 @@ static bool AudioInitOnce(void) return false; } + // 创建播放器回调对象 + g_player_callback = std::make_shared(&g_simple); + if (!g_player_callback) + { + printf("[LN_AUDIO_SIMPLE] PlayerCallback create failed\n"); + return false; + } + g_simple.audio_initialized = true; g_simple.is_activate_audio_interrupt = false; g_simple.is_playing = false; @@ -137,17 +203,7 @@ static bool EnsureAudioInterrupt() return true; } -static void ClearAudioInterrupt() -{ - if (g_simple.is_activate_audio_interrupt && g_simple.interrupt && g_simple.sessionId != AUDIO_SESSION_ID_NONE) - { - AudioManager &amInstance = AudioManager::GetInstance(); - amInstance.DeactivateAudioInterrupt(*g_simple.interrupt); - g_simple.is_activate_audio_interrupt = false; - } - g_simple.interrupt.reset(); - g_simple.interruptListener.reset(); -} + extern "C" { @@ -162,8 +218,8 @@ int ln_audio_simple_play(const char *file_path) if (!AudioInitOnce()) return -2; - // 若正在播放,先停止 - (void)ln_audio_simple_stop(); + // 设置播放器回调 + g_simple.player->SetPlayerCallback(g_player_callback); // 设置音频源 g_simple.source = std::make_shared(file_path, g_simple.header); @@ -231,8 +287,12 @@ int ln_audio_simple_play(const char *file_path) int ln_audio_simple_stop(void) { if (!g_simple.player) + { + printf("[LN_AUDIO_SIMPLE] Player not initialized\n"); return 0; + } + printf("[LN_AUDIO_SIMPLE] stop\n"); int32_t state = 0; (void)g_simple.player->GetPlayerState(state); -- 2.17.1