diff --git a/services/audiomanager/managersource/include/dmic_dev.h b/services/audiomanager/managersource/include/dmic_dev.h index 3c328b4d3fe560c8d7fc1d8c7416cca5fad7655a..4c2e049beb3a098a7481800131a3f343b12f97df 100644 --- a/services/audiomanager/managersource/include/dmic_dev.h +++ b/services/audiomanager/managersource/include/dmic_dev.h @@ -73,6 +73,7 @@ private: int32_t EnableDevice(const int32_t dhId, const std::string &capability); int32_t DisableDevice(const int32_t dhId); void EnqueueThread(); + void FillJitterQueue(); private: static constexpr uint8_t CHANNEL_WAIT_SECONDS = 5; @@ -80,6 +81,7 @@ private: static constexpr size_t DATA_QUEUE_HALF_SIZE = DATA_QUEUE_MAX_SIZE >> 1U; static constexpr size_t LOW_LATENCY_DATA_QUEUE_MAX_SIZE = 40; static constexpr size_t LOW_LATENCY_DATA_QUEUE_HALF_SIZE = LOW_LATENCY_DATA_QUEUE_MAX_SIZE >> 1U; + static constexpr uint32_t MMAP_WAIT_FRAME_US = 5000; static constexpr const char* ENQUEUE_THREAD = "micEnqueueTh"; std::string devId_; diff --git a/services/audiomanager/managersource/src/dmic_dev.cpp b/services/audiomanager/managersource/src/dmic_dev.cpp index 2863579cdd340a9219255159b6d814fc676a1b96..dafcf7570c6fcb0bd399196b85f94799ddb10281 100644 --- a/services/audiomanager/managersource/src/dmic_dev.cpp +++ b/services/audiomanager/managersource/src/dmic_dev.cpp @@ -351,6 +351,7 @@ void DMicDev::EnqueueThread() writeIndex_ = 0; writeNum_ = 0; DHLOGI("Enqueue thread start, lengthPerWrite length: %d.", lengthPerTrans_); + FillJitterQueue(); while (ashmem_ != nullptr && isEnqueueRunning_.load()) { int64_t timeOffset = UpdateTimeOffset(frameIndex_, LOW_LATENCY_INTERVAL_NS, startTime_); @@ -383,6 +384,20 @@ void DMicDev::EnqueueThread() } } +void DMicDev::FillJitterQueue() +{ + while (true) { + { + std::lock_guard lock(dataQueueMtx_); + if (dataQueue_.size() >= LOW_LATENCY_DATA_QUEUE_HALF_SIZE) { + break; + } + } + usleep(MMAP_WAIT_FRAME_US); + } + DHLOGI("Mic jitter data queue fill end."); +} + int32_t DMicDev::MmapStop() { std::lock_guard lock(writeAshmemMutex_);