From 2331eb13d4e7e238fc447676a0931decf5f0ef03 Mon Sep 17 00:00:00 2001 From: dongyu_dy Date: Fri, 19 Jul 2024 10:29:05 +0000 Subject: [PATCH 1/5] optimize eos for BT device Signed-off-by: dongyu_dy --- interfaces/inner_api/native/audio_sink.h | 2 +- .../media_engine/modules/sink/audio_sink.cpp | 22 +++++++++---------- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/interfaces/inner_api/native/audio_sink.h b/interfaces/inner_api/native/audio_sink.h index 2387dd0e2..c0a716f98 100644 --- a/interfaces/inner_api/native/audio_sink.h +++ b/interfaces/inner_api/native/audio_sink.h @@ -75,7 +75,7 @@ private: int64_t getDurationUsPlayedAtSampleRate(uint32_t numFrames); void UpdateAudioWriteTimeMayWait(); void DrainAndReportEosEvent(); - void HandleEosInner(); + void HandleEosInner(bool drain); std::shared_ptr plugin_ {}; std::shared_ptr playerEventReceiver_; int32_t appUid_{0}; diff --git a/services/media_engine/modules/sink/audio_sink.cpp b/services/media_engine/modules/sink/audio_sink.cpp index 06d73b8d3..652fc6832 100644 --- a/services/media_engine/modules/sink/audio_sink.cpp +++ b/services/media_engine/modules/sink/audio_sink.cpp @@ -21,7 +21,6 @@ namespace { constexpr OHOS::HiviewDFX::HiLogLabel LABEL = { LOG_CORE, LOG_DOMAIN_SYSTEM_PLAYER, "HiStreamer" }; constexpr int64_t MAX_BUFFER_DURATION_US = 200000; // Max buffer duration is 200 ms -constexpr int64_t EOS_DRAIN_INTERVAL_US = 200000; // try drain each 200ms } namespace OHOS { @@ -199,7 +198,7 @@ Status AudioSink::Resume() eosInterruptType_ = EosInterruptState::RESUME; if (!eosDraining_ && eosTask_ != nullptr) { eosTask_->SubmitJobOnce([this] { - HandleEosInner(); + HandleEosInner(false); }); } } @@ -307,7 +306,7 @@ void AudioSink::SetThreadGroupId(const std::string& groupId) eosTask_ = std::make_unique("OS_EOSa", groupId, TaskType::AUDIO, TaskPriority::HIGH, false); } -void AudioSink::HandleEosInner() +void AudioSink::HandleEosInner(bool drain) { AutoLock lock(eosMutex_); eosDraining_ = true; @@ -316,14 +315,13 @@ void AudioSink::HandleEosInner() eosDraining_ = false; return; } - uint64_t latency = 0; - if (plugin_->GetLatency(latency) != Status::OK) { - MEDIA_LOG_W("failed to get latency, drain directly"); + if (drain) { DrainAndReportEosEvent(); return; } - if (latency < EOS_DRAIN_INTERVAL_US) { - MEDIA_LOG_I("Drain audiosink and report EOS"); + uint64_t latency = 0; + if (plugin_->GetLatency(latency) != Status::OK) { + MEDIA_LOG_W("failed to get latency, drain directly"); DrainAndReportEosEvent(); return; } @@ -332,10 +330,10 @@ void AudioSink::HandleEosInner() DrainAndReportEosEvent(); return; } - MEDIA_LOG_D("Drain audiosink wait next INTERVAL, latency = " PUBLIC_LOG_U64, latency); + MEDIA_LOG_I("Drain audiosink wait latency = " PUBLIC_LOG_U64, latency); eosTask_->SubmitJobOnce([this] { - HandleEosInner(); - }, EOS_DRAIN_INTERVAL_US, false); + HandleEosInner(true); + }, latency, false); } void AudioSink::DrainAndReportEosEvent() @@ -384,7 +382,7 @@ void AudioSink::DrainOutputBuffer() return; } eosTask_->SubmitJobOnce([this] { - HandleEosInner(); + HandleEosInner(false); }); return; } -- Gitee From 403deb0fd4bc74ab90d3ab5ef2c76cd10a908fea Mon Sep 17 00:00:00 2001 From: dongyu_dy Date: Fri, 19 Jul 2024 10:30:49 +0000 Subject: [PATCH 2/5] update services/media_engine/modules/sink/audio_sink.cpp. Signed-off-by: dongyu_dy --- services/media_engine/modules/sink/audio_sink.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/services/media_engine/modules/sink/audio_sink.cpp b/services/media_engine/modules/sink/audio_sink.cpp index 652fc6832..337ac9484 100644 --- a/services/media_engine/modules/sink/audio_sink.cpp +++ b/services/media_engine/modules/sink/audio_sink.cpp @@ -316,6 +316,7 @@ void AudioSink::HandleEosInner(bool drain) return; } if (drain) { + MEDIA_LOG_I("Drain audiosink and report EOS"); DrainAndReportEosEvent(); return; } -- Gitee From f1fcc0badab33d00dcc2ace55f3445f844039a75 Mon Sep 17 00:00:00 2001 From: dongyu_dy Date: Sat, 20 Jul 2024 01:34:55 +0000 Subject: [PATCH 3/5] update services/media_engine/modules/sink/audio_sink.cpp. Signed-off-by: dongyu_dy --- .../media_engine/modules/sink/audio_sink.cpp | 29 ++++++++++++++----- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/services/media_engine/modules/sink/audio_sink.cpp b/services/media_engine/modules/sink/audio_sink.cpp index 337ac9484..e335e7027 100644 --- a/services/media_engine/modules/sink/audio_sink.cpp +++ b/services/media_engine/modules/sink/audio_sink.cpp @@ -134,6 +134,7 @@ Status AudioSink::Prepare() { AutoLock lock(eosMutex_); eosInterruptType_ = EosInterruptState::NONE; + eosDraining_ = false; } return ret; } @@ -309,11 +310,21 @@ void AudioSink::SetThreadGroupId(const std::string& groupId) void AudioSink::HandleEosInner(bool drain) { AutoLock lock(eosMutex_); - eosDraining_ = true; - if (eosInterruptType_ != EosInterruptState::INITIAL && eosInterruptType_ != EosInterruptState::RESUME) { - MEDIA_LOG_W("drain audiosink interrupted"); - eosDraining_ = false; - return; + eosDraining_ = true; // start draining task + switch(eosInterruptType_) { + case EosInterruptState::INITIAL: // No user operation during EOS drain, complete drain normally + break; + case EosInterruptState::RESUME: // EOS drain is resumed after pause, do necessary changes + if (drain) { + // pause and resume happened before this task, audiosink latency should be updated + drain = false; + } + eosInterruptType_ = EosInterruptState::INITIAL; // Reset EOS draining state + break; + default: // EOS drain is interrupted by pause or stop, and not resumed + MEDIA_LOG_W("Drain audiosink interrupted"); + eosDraining_ = false; // abort draining task + return; } if (drain) { MEDIA_LOG_I("Drain audiosink and report EOS"); @@ -322,7 +333,7 @@ void AudioSink::HandleEosInner(bool drain) } uint64_t latency = 0; if (plugin_->GetLatency(latency) != Status::OK) { - MEDIA_LOG_W("failed to get latency, drain directly"); + MEDIA_LOG_W("Failed to get latency, drain audiosink directly"); DrainAndReportEosEvent(); return; } @@ -342,7 +353,7 @@ void AudioSink::DrainAndReportEosEvent() plugin_->Drain(); plugin_->PauseTransitent(); eosInterruptType_ = EosInterruptState::NONE; - eosDraining_ = false; + eosDraining_ = false; // finish draining task isEos_ = true; auto syncCenter = syncCenter_.lock(); if (syncCenter) { @@ -377,6 +388,10 @@ void AudioSink::DrainOutputBuffer() (filledOutputBuffer->pts_ > playRangeEndTime_ * MICROSECONDS_CONVERT_UNITS))) { inputBufferQueueConsumer_->ReleaseBuffer(filledOutputBuffer); AutoLock eosLock(eosMutex_); + if (eosDraining_) { + // avoid submit handle eos task multiple times + return; + } eosInterruptType_ = EosInterruptState::INITIAL; if (eosTask_ == nullptr) { DrainAndReportEosEvent(); -- Gitee From 4fe4e9fdae87e3e724a4aec8a6012b96051f8df7 Mon Sep 17 00:00:00 2001 From: dongyu_dy Date: Sat, 20 Jul 2024 01:35:58 +0000 Subject: [PATCH 4/5] update services/media_engine/modules/sink/audio_sink.cpp. Signed-off-by: dongyu_dy --- services/media_engine/modules/sink/audio_sink.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/media_engine/modules/sink/audio_sink.cpp b/services/media_engine/modules/sink/audio_sink.cpp index e335e7027..12917a4d3 100644 --- a/services/media_engine/modules/sink/audio_sink.cpp +++ b/services/media_engine/modules/sink/audio_sink.cpp @@ -311,7 +311,7 @@ void AudioSink::HandleEosInner(bool drain) { AutoLock lock(eosMutex_); eosDraining_ = true; // start draining task - switch(eosInterruptType_) { + switch (eosInterruptType_) { case EosInterruptState::INITIAL: // No user operation during EOS drain, complete drain normally break; case EosInterruptState::RESUME: // EOS drain is resumed after pause, do necessary changes -- Gitee From 8f84e3b40177db0de6517dc52569a63da952b3ee Mon Sep 17 00:00:00 2001 From: dongyu_dy Date: Sat, 20 Jul 2024 01:37:29 +0000 Subject: [PATCH 5/5] update services/media_engine/modules/sink/audio_sink.cpp. Signed-off-by: dongyu_dy --- services/media_engine/modules/sink/audio_sink.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/services/media_engine/modules/sink/audio_sink.cpp b/services/media_engine/modules/sink/audio_sink.cpp index 12917a4d3..6972d8f25 100644 --- a/services/media_engine/modules/sink/audio_sink.cpp +++ b/services/media_engine/modules/sink/audio_sink.cpp @@ -213,6 +213,7 @@ Status AudioSink::Flush() { AutoLock lock(eosMutex_); eosInterruptType_ = EosInterruptState::NONE; + eosDraining_ = false; } return ret; } -- Gitee