From 8384f8a54393d977be0e84aca2535add517c7ee8 Mon Sep 17 00:00:00 2001 From: Bobie Date: Thu, 4 May 2023 14:56:06 +0800 Subject: [PATCH 1/2] blank frame discard strategy Signed-off-by: Bobie --- .../managersource/include/dmic_dev.h | 3 +++ .../managersource/src/dmic_dev.cpp | 25 +++++++++++++++---- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/services/audiomanager/managersource/include/dmic_dev.h b/services/audiomanager/managersource/include/dmic_dev.h index 4870b2de..9430e029 100644 --- a/services/audiomanager/managersource/include/dmic_dev.h +++ b/services/audiomanager/managersource/include/dmic_dev.h @@ -100,6 +100,9 @@ private: AudioParam param_; uint32_t timeInterval_ = 5; + uint32_t insertFrameCnt_ = 0; + std::atomic isExistedEmpty_ = false; + size_t dataQueSize_ = 0; sptr ashmem_ = nullptr; std::atomic isEnqueueRunning_ = false; int32_t ashmemLength_ = -1; diff --git a/services/audiomanager/managersource/src/dmic_dev.cpp b/services/audiomanager/managersource/src/dmic_dev.cpp index 960721f3..6fb64440 100644 --- a/services/audiomanager/managersource/src/dmic_dev.cpp +++ b/services/audiomanager/managersource/src/dmic_dev.cpp @@ -33,6 +33,8 @@ namespace OHOS { namespace DistributedHardware { +static constexpr size_t DATA_QUEUE_EXT_SIZE = 20; + int32_t DMicDev::EnableDMic(const int32_t dhId, const std::string &capability) { DHLOGI("Enable distributed mic dhId: %d.", dhId); @@ -164,9 +166,11 @@ int32_t DMicDev::NotifyEvent(const std::string &devId, const int32_t dhId, const switch (event.type) { case AudioEventType::AUDIO_START: curStatus_ = AudioStatus::STATUS_START; + isExistedEmpty_.store(false); break; case AudioEventType::AUDIO_STOP: curStatus_ = AudioStatus::STATUS_STOP; + isExistedEmpty_.store(false); break; default: break; @@ -273,10 +277,18 @@ int32_t DMicDev::ReadStreamData(const std::string &devId, const int32_t dhId, st return ERR_DH_AUDIO_FAILED; } std::lock_guard lock(dataQueueMtx_); - if (dataQueue_.empty()) { - DHLOGI("Data queue is empty."); - data = std::make_shared(param_.comParam.frameSize); + uint32_t queSize = dataQueue_.size(); + if (insertFrameCnt_ >= queSize || queSize == 0) { + ++insertFrameCnt_; + isExistedEmpty_.store(true); + DHLOGI("Data queue is empty, count :%u.", insertFrameCnt_); + data = std::make_shared(AudioData)(param_.comParam.frameSize); } else { + while (insertFrameCnt_ > 0) { + DHLOGD("Data discard, count: %u", insertFrameCnt_); + dataQueue_.pop(); + --insertFrameCnt_; + } data = dataQueue_.front(); dataQueue_.pop(); } @@ -428,10 +440,13 @@ int32_t DMicDev::OnDecodeTransDataDone(const std::shared_ptr &audioDa return ERR_DH_AUDIO_NULLPTR; } std::lock_guard lock(dataQueueMtx_); - size_t dataQueSize = curStatus_ != AudioStatus::STATUS_START ? + dataQueSize_ = curStatus_ != AudioStatus::STATUS_START ? (param_.captureOpts.capturerFlags == MMAP_MODE ? LOW_LATENCY_DATA_QUEUE_HALF_SIZE : DATA_QUEUE_HALF_SIZE) : (param_.captureOpts.capturerFlags == MMAP_MODE ? LOW_LATENCY_DATA_QUEUE_MAX_SIZE : DATA_QUEUE_MAX_SIZE); - while (dataQueue_.size() > dataQueSize) { + if (isExistedEmpty_.load()) { + dataQueSize_ = param_.captureOpts.capturerFlags == MMAP_MODE ? dataQueSize_ : DATA_QUEUE_EXT_SIZE; + } + while (dataQueue_.size() > dataQueSize_) { DHLOGI("Data queue overflow. buf current size: %d", dataQueue_.size()); dataQueue_.pop(); } -- Gitee From 810ae82d314cb67c67f0e3fd670d7638b55a1ab3 Mon Sep 17 00:00:00 2001 From: Bobie Date: Thu, 4 May 2023 16:11:38 +0800 Subject: [PATCH 2/2] blank frame discard strategy Signed-off-by: Bobie --- services/audiomanager/managersource/src/dmic_dev.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/audiomanager/managersource/src/dmic_dev.cpp b/services/audiomanager/managersource/src/dmic_dev.cpp index 6fb64440..d07286f4 100644 --- a/services/audiomanager/managersource/src/dmic_dev.cpp +++ b/services/audiomanager/managersource/src/dmic_dev.cpp @@ -282,7 +282,7 @@ int32_t DMicDev::ReadStreamData(const std::string &devId, const int32_t dhId, st ++insertFrameCnt_; isExistedEmpty_.store(true); DHLOGI("Data queue is empty, count :%u.", insertFrameCnt_); - data = std::make_shared(AudioData)(param_.comParam.frameSize); + data = std::make_shared(param_.comParam.frameSize); } else { while (insertFrameCnt_ > 0) { DHLOGD("Data discard, count: %u", insertFrameCnt_); -- Gitee