#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;
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:
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())
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;
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" {
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);
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);