From 2846e4039c1514e67923933e1d845edf7f0af2de Mon Sep 17 00:00:00 2001 From: guoyao Date: Thu, 9 Jan 2025 14:14:36 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E9=AB=98=E6=B8=85=E9=80=9A=E8=B7=AFgetlate?= =?UTF-8?q?ncy=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: guoyao --- .../server/include/audio_playback_engine.h | 1 + .../server/include/i_audio_engine.h | 1 + .../server/include/i_stream_manager.h | 1 + .../server/include/none_mix_engine.h | 3 +++ .../server/include/pa_adapter_manager.h | 1 + .../server/include/pro_audio_stream_manager.h | 3 +++ .../server/src/audio_playback_engine.cpp | 5 +++++ .../server/src/none_mix_engine.cpp | 22 +++++++++++++++++++ .../server/src/pa_adapter_manager.cpp | 5 +++++ .../server/src/pro_audio_stream_manager.cpp | 6 +++++ .../server/src/renderer_in_server.cpp | 3 +++ 11 files changed, 51 insertions(+) diff --git a/services/audio_service/server/include/audio_playback_engine.h b/services/audio_service/server/include/audio_playback_engine.h index 3e0745fbca..0f4b8caf41 100644 --- a/services/audio_service/server/include/audio_playback_engine.h +++ b/services/audio_service/server/include/audio_playback_engine.h @@ -34,6 +34,7 @@ public: virtual int32_t Stop() override; virtual int32_t Pause() override; virtual int32_t Flush() override; + virtual uint64_t GetLatency() noexcept override; virtual bool IsPlaybackEngineRunning() const noexcept override; diff --git a/services/audio_service/server/include/i_audio_engine.h b/services/audio_service/server/include/i_audio_engine.h index 575a6a4633..8f32c381a9 100644 --- a/services/audio_service/server/include/i_audio_engine.h +++ b/services/audio_service/server/include/i_audio_engine.h @@ -29,6 +29,7 @@ public: virtual int32_t Pause() = 0; virtual int32_t Flush() = 0; virtual bool IsPlaybackEngineRunning() const noexcept = 0; + virtual uint64_t GetLatency() noexcept = 0; }; } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_service/server/include/i_stream_manager.h b/services/audio_service/server/include/i_stream_manager.h index 56d13d3942..810e75f2ed 100644 --- a/services/audio_service/server/include/i_stream_manager.h +++ b/services/audio_service/server/include/i_stream_manager.h @@ -49,6 +49,7 @@ public: virtual int32_t CreateCapturer(AudioProcessConfig processConfig, std::shared_ptr &stream) = 0; virtual int32_t ReleaseCapturer(uint32_t streamIndex_) = 0; virtual int32_t AddUnprocessStream(int32_t appUid) = 0; + virtual uint64_t GetLatency() noexcept = 0; }; } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_service/server/include/none_mix_engine.h b/services/audio_service/server/include/none_mix_engine.h index 5d2fe39591..9a1d6fbcd5 100644 --- a/services/audio_service/server/include/none_mix_engine.h +++ b/services/audio_service/server/include/none_mix_engine.h @@ -35,6 +35,8 @@ public: void RemoveRenderer(const std::shared_ptr &stream) override; bool IsPlaybackEngineRunning() const noexcept override; + uint64_t GetLatency() noexcept override; + protected: void MixStreams() override; @@ -60,6 +62,7 @@ private: std::atomic failedCount_; uint64_t writeCount_; uint64_t fwkSyncTime_; + uint64_t latency_; std::shared_ptr stream_; std::mutex startMutex; diff --git a/services/audio_service/server/include/pa_adapter_manager.h b/services/audio_service/server/include/pa_adapter_manager.h index cc2405cf36..87bf9b1440 100644 --- a/services/audio_service/server/include/pa_adapter_manager.h +++ b/services/audio_service/server/include/pa_adapter_manager.h @@ -72,6 +72,7 @@ public: int32_t ReleaseCapturer(uint32_t streamIndex_) override; int32_t AddUnprocessStream(int32_t appUid) override; uint32_t ConvertChLayoutToPaChMap(const uint64_t &channelLayout, pa_channel_map &paMap); + uint64_t GetLatency() noexcept override; private: // audio channel index diff --git a/services/audio_service/server/include/pro_audio_stream_manager.h b/services/audio_service/server/include/pro_audio_stream_manager.h index db7cb5048b..5b1d1bb6a1 100644 --- a/services/audio_service/server/include/pro_audio_stream_manager.h +++ b/services/audio_service/server/include/pro_audio_stream_manager.h @@ -38,6 +38,9 @@ public: int32_t ReleaseCapturer(uint32_t streamIndex) override; int32_t AddUnprocessStream(int32_t appUid) override; + + uint64_t GetLatency() noexcept override; + private: std::shared_ptr CreateRendererStream(AudioProcessConfig processConfig); int32_t CreatePlayBackEngine(const std::shared_ptr &stream); diff --git a/services/audio_service/server/src/audio_playback_engine.cpp b/services/audio_service/server/src/audio_playback_engine.cpp index ef42d37804..f559d5ca49 100644 --- a/services/audio_service/server/src/audio_playback_engine.cpp +++ b/services/audio_service/server/src/audio_playback_engine.cpp @@ -68,5 +68,10 @@ bool AudioPlaybackEngine::IsPlaybackEngineRunning() const noexcept { return false; } + +uint64_t AudioPlaybackEngine::GetLatency() noexcept +{ + return 0; +} } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_service/server/src/none_mix_engine.cpp b/services/audio_service/server/src/none_mix_engine.cpp index 7bbe7c51b8..866a437ff5 100644 --- a/services/audio_service/server/src/none_mix_engine.cpp +++ b/services/audio_service/server/src/none_mix_engine.cpp @@ -26,6 +26,9 @@ namespace OHOS { namespace AudioStandard { constexpr int32_t DELTA_TIME = 4000000; // 4ms constexpr int32_t PERIOD_NS = 20000000; // 20ms +constexpr int32_t AUDIO_US_PER_S = 1000000; +constexpr int32_t AUDIO_DEFAULT_LATENCY = 164000; +constexpr int32_t AUDIO_FRAME_WORK_LATENCY = 40000; constexpr int32_t FADING_MS = 20; // 20ms constexpr int32_t MAX_ERROR_COUNT = 50; constexpr int16_t STEREO_CHANNEL_COUNT = 2; @@ -45,6 +48,7 @@ NoneMixEngine::NoneMixEngine() failedCount_(0), writeCount_(0), fwkSyncTime_(0), + latency_(0), stream_(nullptr), startFadein_(false), startFadeout_(false), @@ -105,6 +109,7 @@ int32_t NoneMixEngine::Start() playbackThread_ = std::make_unique(THREAD_NAME); playbackThread_->RegisterJob([this] { this->MixStreams(); }); } + latency_ = 0; if (!isStart_) { startFadeout_ = false; startFadein_ = true; @@ -449,5 +454,22 @@ int32_t NoneMixEngine::SwitchSink(const AudioStreamInfo &streamInfo, bool isVoip isVoip_ = isVoip; return InitSink(streamInfo); } + +uint64_t NoneMixEngine::GetLatency() noexcept +{ + if (!isStart_) { + return 0; + } + if (latency_ > 0) { + return latency_; + } + uint32_t latency = 0; + if (renderSink_->GetLatency(&latency) == 0) { + latency_ = latency * AUDIO_US_PER_S + AUDIO_FRAME_WORK_LATENCY; + } else { + latency_ = AUDIO_DEFAULT_LATENCY; + } + return latency_; +} } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_service/server/src/pa_adapter_manager.cpp b/services/audio_service/server/src/pa_adapter_manager.cpp index 9c3f5e2d0a..5fecf1e23a 100644 --- a/services/audio_service/server/src/pa_adapter_manager.cpp +++ b/services/audio_service/server/src/pa_adapter_manager.cpp @@ -881,5 +881,10 @@ const std::string PaAdapterManager::GetEnhanceSceneName(SourceType sourceType) return sceneName; } +uint64_t PaAdapterManager::GetLatency() noexcept +{ + return 0; +} + } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_service/server/src/pro_audio_stream_manager.cpp b/services/audio_service/server/src/pro_audio_stream_manager.cpp index 9dddbf3aa9..8d8d354893 100644 --- a/services/audio_service/server/src/pro_audio_stream_manager.cpp +++ b/services/audio_service/server/src/pro_audio_stream_manager.cpp @@ -214,5 +214,11 @@ int32_t ProAudioStreamManager::AddUnprocessStream(int32_t appUid) return SUCCESS; } +uint64_t ProAudioStreamManager::GetLatency() noexcept +{ + CHECK_AND_RETURN_RET_LOG(playbackEngine_ != nullptr, 0, "engine not init"); + return playbackEngine_->GetLatency(); +} + } // namespace AudioStandard } // namespace OHOS \ No newline at end of file diff --git a/services/audio_service/server/src/renderer_in_server.cpp b/services/audio_service/server/src/renderer_in_server.cpp index 829bf43c6f..4dfdb23611 100644 --- a/services/audio_service/server/src/renderer_in_server.cpp +++ b/services/audio_service/server/src/renderer_in_server.cpp @@ -939,6 +939,9 @@ int32_t RendererInServer::GetAudioPosition(uint64_t &framePos, uint64_t ×ta int32_t RendererInServer::GetLatency(uint64_t &latency) { std::unique_lock lock(statusLock_); + if (managerType_ == DIRECT_PLAYBACK) { + return IStreamManager::GetPlaybackManager(managerType_).GetLatency(); + } return stream_->GetLatency(latency); } -- Gitee From fd4875bd740f38c339f71d686f5d43bd25714dd6 Mon Sep 17 00:00:00 2001 From: guoyao Date: Thu, 9 Jan 2025 15:54:56 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E9=AB=98=E6=B8=85=E9=80=9A=E8=B7=AFgetlate?= =?UTF-8?q?ncy=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: guoyao --- services/audio_service/server/src/none_mix_engine.cpp | 6 +++--- services/audio_service/server/src/renderer_in_server.cpp | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/services/audio_service/server/src/none_mix_engine.cpp b/services/audio_service/server/src/none_mix_engine.cpp index 866a437ff5..80cb5e1a21 100644 --- a/services/audio_service/server/src/none_mix_engine.cpp +++ b/services/audio_service/server/src/none_mix_engine.cpp @@ -26,8 +26,8 @@ namespace OHOS { namespace AudioStandard { constexpr int32_t DELTA_TIME = 4000000; // 4ms constexpr int32_t PERIOD_NS = 20000000; // 20ms -constexpr int32_t AUDIO_US_PER_S = 1000000; -constexpr int32_t AUDIO_DEFAULT_LATENCY = 164000; +constexpr int32_t AUDIO_US_PER_MS = 1000; +constexpr int32_t AUDIO_DEFAULT_LATENCY = 160000; constexpr int32_t AUDIO_FRAME_WORK_LATENCY = 40000; constexpr int32_t FADING_MS = 20; // 20ms constexpr int32_t MAX_ERROR_COUNT = 50; @@ -465,7 +465,7 @@ uint64_t NoneMixEngine::GetLatency() noexcept } uint32_t latency = 0; if (renderSink_->GetLatency(&latency) == 0) { - latency_ = latency * AUDIO_US_PER_S + AUDIO_FRAME_WORK_LATENCY; + latency_ = latency * AUDIO_US_PER_MS + AUDIO_FRAME_WORK_LATENCY; } else { latency_ = AUDIO_DEFAULT_LATENCY; } diff --git a/services/audio_service/server/src/renderer_in_server.cpp b/services/audio_service/server/src/renderer_in_server.cpp index 4dfdb23611..1add858394 100644 --- a/services/audio_service/server/src/renderer_in_server.cpp +++ b/services/audio_service/server/src/renderer_in_server.cpp @@ -940,7 +940,8 @@ int32_t RendererInServer::GetLatency(uint64_t &latency) { std::unique_lock lock(statusLock_); if (managerType_ == DIRECT_PLAYBACK) { - return IStreamManager::GetPlaybackManager(managerType_).GetLatency(); + latency = IStreamManager::GetPlaybackManager(managerType_).GetLatency(); + return SUCCESS; } return stream_->GetLatency(latency); } -- Gitee From c9199c97259b24288c7617e9a0c3ef228376e878 Mon Sep 17 00:00:00 2001 From: guoyao Date: Wed, 15 Jan 2025 10:46:46 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E9=AB=98=E6=B8=85=E9=80=9A=E8=B7=AFgetlate?= =?UTF-8?q?ncy=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: guoyao --- .../server/src/none_mix_engine.cpp | 1 + .../unittest/none_mix_engine_unit_test.cpp | 34 +++++++++++++++++++ .../pro_audio_stream_manager_unit_test.cpp | 3 ++ 3 files changed, 38 insertions(+) diff --git a/services/audio_service/server/src/none_mix_engine.cpp b/services/audio_service/server/src/none_mix_engine.cpp index 80cb5e1a21..5f6726f899 100644 --- a/services/audio_service/server/src/none_mix_engine.cpp +++ b/services/audio_service/server/src/none_mix_engine.cpp @@ -469,6 +469,7 @@ uint64_t NoneMixEngine::GetLatency() noexcept } else { latency_ = AUDIO_DEFAULT_LATENCY; } + AUDIO_INFO_LOG("latency value:%{public}ld", latency_); return latency_; } } // namespace AudioStandard diff --git a/services/audio_service/test/unittest/none_mix_engine_unit_test.cpp b/services/audio_service/test/unittest/none_mix_engine_unit_test.cpp index fae814d3eb..0521f267d9 100644 --- a/services/audio_service/test/unittest/none_mix_engine_unit_test.cpp +++ b/services/audio_service/test/unittest/none_mix_engine_unit_test.cpp @@ -1197,5 +1197,39 @@ HWTEST_F(NoneMixEngineUnitTest, NoneMixEngine_030, TestSize.Level1) EXPECT_EQ(ret, SUCCESS); } +/** + * @tc.name : Test NoneMixEngine API + * @tc.type : FUNC + * @tc.number: NoneMixEngine_036 + * @tc.desc : Test NoneMixEngine::GetLatency + */ +HWTEST_F(NoneMixEngineUnitTest, NoneMixEngine_036, TestSize.Level1) +{ + auto ptrNoneMixEngine = std::make_shared(); + EXPECT_NE(ptrNoneMixEngine, nullptr); + uint64_t latency = ptrNoneMixEngine->GetLatency(); + EXPECT_EQ(latency, 0); + + AudioStreamInfo streamInfo; + ptrNoneMixEngine->isInit_ = false; + ptrNoneMixEngine->renderSink_ = IAudioRendererSink::GetInstance("primary", ""); + EXPECT_NE(ptrNoneMixEngine->renderSink_, nullptr); + + streamInfo.channels = AudioChannel::CHANNEL_15; + streamInfo.format = AudioSampleFormat::SAMPLE_U8; + ptrNoneMixEngine->uChannel_ = 2; + ptrNoneMixEngine->uFormat_ = HdiAdapterFormat::SAMPLE_S16; + ptrNoneMixEngine->isVoip_ = true; + streamInfo.samplingRate = AudioSamplingRate::SAMPLE_RATE_8000; + ptrNoneMixEngine->uSampleRate_ = AudioSamplingRate::SAMPLE_RATE_16000; + bool isVoip = true; + ptrNoneMixEngine->SwitchSink(streamInfo, isVoip); + int32_t ret = ptrNoneMixEngine->Start(); + EXPECT_EQ(ret, SUCCESS); + + latency = ptrNoneMixEngine->GetLatency(); + EXPECT_NE(latency, 0); +} + } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_service/test/unittest/pro_audio_stream_manager_unit_test/src/pro_audio_stream_manager_unit_test.cpp b/services/audio_service/test/unittest/pro_audio_stream_manager_unit_test/src/pro_audio_stream_manager_unit_test.cpp index 1e6cf32ef1..0a4f0f506e 100644 --- a/services/audio_service/test/unittest/pro_audio_stream_manager_unit_test/src/pro_audio_stream_manager_unit_test.cpp +++ b/services/audio_service/test/unittest/pro_audio_stream_manager_unit_test/src/pro_audio_stream_manager_unit_test.cpp @@ -361,6 +361,9 @@ HWTEST(ProAudioStreamManagerUnitTest, ProAudioStreamManager_012, TestSize.Level1 shared_ptr audioStreamManager = make_shared(DIRECT_PLAYBACK); ASSERT_TRUE(audioStreamManager != nullptr); + uint64_t latency = audioStreamManager->GetLatency(); + EXPECT_EQ(latency, 0); + AudioProcessConfig config; config.appInfo.appUid = CAPTURER_FLAG; config.appInfo.appPid = CAPTURER_FLAG; -- Gitee From f142efe388b6cec4b349c6bedfd84659ea5be8d5 Mon Sep 17 00:00:00 2001 From: guoyao Date: Wed, 15 Jan 2025 06:59:25 +0000 Subject: [PATCH 4/6] update services/audio_service/server/src/none_mix_engine.cpp. Signed-off-by: guoyao --- services/audio_service/server/src/none_mix_engine.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/audio_service/server/src/none_mix_engine.cpp b/services/audio_service/server/src/none_mix_engine.cpp index bb3a91811b..4f788a998a 100644 --- a/services/audio_service/server/src/none_mix_engine.cpp +++ b/services/audio_service/server/src/none_mix_engine.cpp @@ -473,7 +473,7 @@ uint64_t NoneMixEngine::GetLatency() noexcept } else { latency_ = AUDIO_DEFAULT_LATENCY; } - AUDIO_INFO_LOG("latency value:%{public}ld", latency_); + AUDIO_INFO_LOG("latency value:%{public}" PRId64 " ns", latency_); return latency_; } } // namespace AudioStandard -- Gitee From cc314f0c6e47d10de41c0f2c8705fdeb913a9e3d Mon Sep 17 00:00:00 2001 From: guoyao Date: Thu, 16 Jan 2025 03:32:01 +0000 Subject: [PATCH 5/6] update services/audio_service/server/src/none_mix_engine.cpp. Signed-off-by: guoyao --- services/audio_service/server/src/none_mix_engine.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/services/audio_service/server/src/none_mix_engine.cpp b/services/audio_service/server/src/none_mix_engine.cpp index 4f788a998a..3b3a687b15 100644 --- a/services/audio_service/server/src/none_mix_engine.cpp +++ b/services/audio_service/server/src/none_mix_engine.cpp @@ -471,6 +471,7 @@ uint64_t NoneMixEngine::GetLatency() noexcept if (renderSink_->GetLatency(&latency) == 0) { latency_ = latency * AUDIO_US_PER_MS + AUDIO_FRAME_WORK_LATENCY; } else { + AUDIO_INFO_LOG("get latency failed,use default"); latency_ = AUDIO_DEFAULT_LATENCY; } AUDIO_INFO_LOG("latency value:%{public}" PRId64 " ns", latency_); -- Gitee From 2abd177f9a2d1b4e98fe8218dd6e2bc083b7a340 Mon Sep 17 00:00:00 2001 From: guoyao Date: Thu, 16 Jan 2025 06:35:49 +0000 Subject: [PATCH 6/6] update services/audio_service/server/src/none_mix_engine.cpp. Signed-off-by: guoyao --- services/audio_service/server/src/none_mix_engine.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/services/audio_service/server/src/none_mix_engine.cpp b/services/audio_service/server/src/none_mix_engine.cpp index 3b3a687b15..1b6de6e883 100644 --- a/services/audio_service/server/src/none_mix_engine.cpp +++ b/services/audio_service/server/src/none_mix_engine.cpp @@ -28,8 +28,8 @@ namespace AudioStandard { constexpr int32_t DELTA_TIME = 4000000; // 4ms constexpr int32_t PERIOD_NS = 20000000; // 20ms constexpr int32_t AUDIO_US_PER_MS = 1000; -constexpr int32_t AUDIO_DEFAULT_LATENCY = 160000; -constexpr int32_t AUDIO_FRAME_WORK_LATENCY = 40000; +constexpr int32_t AUDIO_DEFAULT_LATENCY_US = 160000; +constexpr int32_t AUDIO_FRAME_WORK_LATENCY_US = 40000; constexpr int32_t FADING_MS = 20; // 20ms constexpr int32_t MAX_ERROR_COUNT = 50; constexpr int16_t STEREO_CHANNEL_COUNT = 2; @@ -469,10 +469,10 @@ uint64_t NoneMixEngine::GetLatency() noexcept } uint32_t latency = 0; if (renderSink_->GetLatency(&latency) == 0) { - latency_ = latency * AUDIO_US_PER_MS + AUDIO_FRAME_WORK_LATENCY; + latency_ = latency * AUDIO_US_PER_MS + AUDIO_FRAME_WORK_LATENCY_US; } else { AUDIO_INFO_LOG("get latency failed,use default"); - latency_ = AUDIO_DEFAULT_LATENCY; + latency_ = AUDIO_DEFAULT_LATENCY_US; } AUDIO_INFO_LOG("latency value:%{public}" PRId64 " ns", latency_); return latency_; -- Gitee