ln:解决对话过程中。日程播放不了bug 2948/target/2 2951/1 2951/head
authorluozheng <1732036298@qq.com>
Fri, 19 Dec 2025 12:44:31 +0000 (20:44 +0800)
committerluozheng <1732036298@qq.com>
Fri, 19 Dec 2025 12:44:31 +0000 (20:44 +0800)
code/sdk/zhihui/leiniao/imsl_ln/ln_api.c
code/sdk/zhihui/leiniao/ln_api_cpp/ln_audio_simple.cpp

index a72e9b2..f77fe8e 100644 (file)
@@ -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");
index e7ce3c1..49da1ba 100644 (file)
@@ -17,6 +17,8 @@
 #include <audio_player_service.h>
 #include <custom_utils.h>
 #include <los_base.h>
+/* 引入消息队列相关头文件 */
+#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<SimpleAudioCallback> 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<SimpleAudioCallback>(&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;
 
-    // è\8b¥æ­£å\9c¨æ\92­æ\94¾ï¼\8cå\85\88å\81\9cæ­¢
-    (void)ln_audio_simple_stop();
+    // è®¾ç½®æ\92­æ\94¾å\99¨å\9b\9eè°\83
+    g_simple.player->SetPlayerCallback(g_player_callback);
 
     // 设置音频源
     g_simple.source = std::make_shared<Source>(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);