• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "dmic_dev.h"
17 
18 #include <condition_variable>
19 #include <mutex>
20 #include <string>
21 #include <thread>
22 
23 #include "audio_decode_transport.h"
24 #include "daudio_constants.h"
25 #include "daudio_errorcode.h"
26 #include "daudio_hisysevent.h"
27 #include "daudio_hitrace.h"
28 #include "daudio_log.h"
29 #include "daudio_source_manager.h"
30 #include "daudio_util.h"
31 
32 #undef DH_LOG_TAG
33 #define DH_LOG_TAG "DMicDev"
34 
35 namespace OHOS {
36 namespace DistributedHardware {
37 static constexpr size_t DATA_QUEUE_EXT_SIZE = 20;
OnEngineTransEvent(const AVTransEvent & event)38 void DMicDev::OnEngineTransEvent(const AVTransEvent &event)
39 {
40     if (event.type == EventType::EVENT_START_SUCCESS) {
41         OnStateChange(DATA_OPENED);
42     } else if ((event.type == EventType::EVENT_STOP_SUCCESS) ||
43         (event.type == EventType::EVENT_CHANNEL_CLOSED) ||
44         (event.type == EventType::EVENT_START_FAIL)) {
45         OnStateChange(DATA_CLOSED);
46     }
47 }
48 
OnEngineTransMessage(const std::shared_ptr<AVTransMessage> & message)49 void DMicDev::OnEngineTransMessage(const std::shared_ptr<AVTransMessage> &message)
50 {
51     DHLOGI("On Engine message");
52     if (message == nullptr) {
53         DHLOGE("The parameter is nullptr");
54         return;
55     }
56     DAudioSourceManager::GetInstance().HandleDAudioNotify(message->dstDevId_, message->dstDevId_,
57         message->type_, message->content_);
58 }
59 
OnEngineTransDataAvailable(const std::shared_ptr<AudioData> & audioData)60 void DMicDev::OnEngineTransDataAvailable(const std::shared_ptr<AudioData> &audioData)
61 {
62     DHLOGE("On Engine Data available");
63     OnDecodeTransDataDone(audioData);
64 }
65 
InitReceiverEngine(IAVEngineProvider * providerPtr)66 int32_t DMicDev::InitReceiverEngine(IAVEngineProvider *providerPtr)
67 {
68     DHLOGI("InitReceiverEngine enter.");
69     if (micTrans_ == nullptr) {
70         micTrans_ = std::make_shared<AVTransReceiverTransport>(devId_, shared_from_this());
71     }
72     int32_t ret = micTrans_->InitEngine(providerPtr);
73     if (ret != DH_SUCCESS) {
74         DHLOGE("Mic dev initialize av receiver adapter failed.");
75         return ERR_DH_AUDIO_TRANS_NULL_VALUE;
76     }
77     ret = micTrans_->CreateCtrl();
78     if (ret != DH_SUCCESS) {
79         DHLOGE("Create ctrl channel failed. micdev");
80         return ERR_DH_AUDIO_TRANS_NULL_VALUE;
81     }
82     return DH_SUCCESS;
83 }
84 
EnableDMic(const int32_t dhId,const std::string & capability)85 int32_t DMicDev::EnableDMic(const int32_t dhId, const std::string &capability)
86 {
87     DHLOGI("Enable distributed mic dhId: %d.", dhId);
88     if (enabledPorts_.empty()) {
89         if (EnableDevice(PIN_IN_DAUDIO_DEFAULT, capability) != DH_SUCCESS) {
90             return ERR_DH_AUDIO_FAILED;
91         }
92     }
93     int32_t ret = EnableDevice(dhId, capability);
94     if (ret != DH_SUCCESS) {
95         return ret;
96     }
97 
98     DaudioFinishAsyncTrace(DAUDIO_REGISTER_AUDIO, DAUDIO_REGISTER_AUDIO_TASKID);
99     DAudioHisysevent::GetInstance().SysEventWriteBehavior(DAUIDO_REGISTER, devId_, std::to_string(dhId),
100         "daudio mic enable success.");
101     return DH_SUCCESS;
102 }
103 
EnableDevice(const int32_t dhId,const std::string & capability)104 int32_t DMicDev::EnableDevice(const int32_t dhId, const std::string &capability)
105 {
106     DHLOGI("Enable default mic device.");
107     int32_t ret = DAudioHdiHandler::GetInstance().RegisterAudioDevice(devId_, dhId, capability, shared_from_this());
108     if (ret != DH_SUCCESS) {
109         DHLOGE("Register mic device failed, ret: %d.", ret);
110         DAudioHisysevent::GetInstance().SysEventWriteFault(DAUDIO_REGISTER_FAIL, devId_, std::to_string(dhId), ret,
111             "daudio register mic device failed.");
112         return ret;
113     }
114     enabledPorts_.insert(dhId);
115     return DH_SUCCESS;
116 }
117 
DisableDMic(const int32_t dhId)118 int32_t DMicDev::DisableDMic(const int32_t dhId)
119 {
120     DHLOGI("Disable distributed mic.");
121     if (dhId == curPort_) {
122         isOpened_.store(false);
123     }
124     if (DisableDevice(dhId) != DH_SUCCESS) {
125         return ERR_DH_AUDIO_FAILED;
126     }
127 
128     if (enabledPorts_.size() == SINGLE_ITEM && enabledPorts_.find(PIN_IN_DAUDIO_DEFAULT) != enabledPorts_.end()) {
129         if (DisableDevice(PIN_IN_DAUDIO_DEFAULT) != DH_SUCCESS) {
130             return ERR_DH_AUDIO_FAILED;
131         }
132     }
133 
134     DaudioFinishAsyncTrace(DAUDIO_UNREGISTER_AUDIO, DAUDIO_UNREGISTER_AUDIO_TASKID);
135     DAudioHisysevent::GetInstance().SysEventWriteBehavior(DAUDIO_UNREGISTER, devId_, std::to_string(dhId),
136         "daudio mic disable success.");
137     return DH_SUCCESS;
138 }
139 
DisableDevice(const int32_t dhId)140 int32_t DMicDev::DisableDevice(const int32_t dhId)
141 {
142     int32_t ret = DAudioHdiHandler::GetInstance().UnRegisterAudioDevice(devId_, dhId);
143     if (ret != DH_SUCCESS) {
144         DHLOGE("unregister audio device failed, ret: %d", ret);
145         DAudioHisysevent::GetInstance().SysEventWriteFault(DAUDIO_UNREGISTER_FAIL, devId_, std::to_string(dhId), ret,
146             "daudio unregister audio mic device failed.");
147         return ret;
148     }
149     enabledPorts_.erase(dhId);
150     return DH_SUCCESS;
151 }
152 
OpenDevice(const std::string & devId,const int32_t dhId)153 int32_t DMicDev::OpenDevice(const std::string &devId, const int32_t dhId)
154 {
155     DHLOGI("Open mic device devId: %s, dhId: %d.", GetAnonyString(devId).c_str(), dhId);
156     std::shared_ptr<IAudioEventCallback> cbObj = audioEventCallback_.lock();
157     if (cbObj == nullptr) {
158         DHLOGE("Event callback is null");
159         return ERR_DH_AUDIO_SA_MICCALLBACK_NULL;
160     }
161     json jParam = { { KEY_DH_ID, std::to_string(dhId) } };
162     AudioEvent event(AudioEventType::OPEN_MIC, jParam.dump());
163     cbObj->NotifyEvent(event);
164     DAudioHisysevent::GetInstance().SysEventWriteBehavior(DAUDIO_OPEN, devId, std::to_string(dhId),
165         "daudio mic device open success.");
166     return DH_SUCCESS;
167 }
168 
CloseDevice(const std::string & devId,const int32_t dhId)169 int32_t DMicDev::CloseDevice(const std::string &devId, const int32_t dhId)
170 {
171     DHLOGI("Close mic device devId: %s, dhId: %d.", GetAnonyString(devId).c_str(), dhId);
172     std::shared_ptr<IAudioEventCallback> cbObj = audioEventCallback_.lock();
173     if (cbObj == nullptr) {
174         DHLOGE("Event callback is null");
175         return ERR_DH_AUDIO_SA_MICCALLBACK_NULL;
176     }
177     json jParam = { { KEY_DH_ID, std::to_string(dhId) } };
178     AudioEvent event(AudioEventType::CLOSE_MIC, jParam.dump());
179     cbObj->NotifyEvent(event);
180     DAudioHisysevent::GetInstance().SysEventWriteBehavior(DAUDIO_CLOSE, devId, std::to_string(dhId),
181         "daudio mic device close success.");
182     curPort_ = 0;
183     return DH_SUCCESS;
184 }
185 
SetParameters(const std::string & devId,const int32_t dhId,const AudioParamHDF & param)186 int32_t DMicDev::SetParameters(const std::string &devId, const int32_t dhId, const AudioParamHDF &param)
187 {
188     DHLOGD("Set mic parameters {samplerate: %d, channelmask: %d, format: %d, period: %d, "
189         "framesize: %d, ext{%s}}.",
190         param.sampleRate, param.channelMask, param.bitFormat, param.period, param.frameSize,
191         param.ext.c_str());
192     curPort_ = dhId;
193     paramHDF_ = param;
194 
195     param_.comParam.sampleRate = paramHDF_.sampleRate;
196     param_.comParam.channelMask = paramHDF_.channelMask;
197     param_.comParam.bitFormat = paramHDF_.bitFormat;
198     param_.comParam.codecType = AudioCodecType::AUDIO_CODEC_AAC;
199     param_.comParam.frameSize = paramHDF_.frameSize;
200     param_.captureOpts.sourceType = SOURCE_TYPE_MIC;
201     param_.captureOpts.capturerFlags = paramHDF_.capturerFlags;
202     return DH_SUCCESS;
203 }
204 
NotifyEvent(const std::string & devId,const int32_t dhId,const AudioEvent & event)205 int32_t DMicDev::NotifyEvent(const std::string &devId, const int32_t dhId, const AudioEvent &event)
206 {
207     DHLOGD("Notify mic event, type: %d.", event.type);
208     std::shared_ptr<IAudioEventCallback> cbObj = audioEventCallback_.lock();
209     if (cbObj == nullptr) {
210         DHLOGE("Event callback is null");
211         return ERR_DH_AUDIO_SA_EVENT_CALLBACK_NULL;
212     }
213     switch (event.type) {
214         case AudioEventType::AUDIO_START:
215             curStatus_ = AudioStatus::STATUS_START;
216             isExistedEmpty_.store(false);
217             break;
218         case AudioEventType::AUDIO_STOP:
219             curStatus_ = AudioStatus::STATUS_STOP;
220             isExistedEmpty_.store(false);
221             break;
222         default:
223             break;
224     }
225     AudioEvent audioEvent(event.type, event.content);
226     cbObj->NotifyEvent(audioEvent);
227     return DH_SUCCESS;
228 }
229 
SetUp()230 int32_t DMicDev::SetUp()
231 {
232     DHLOGI("Set up mic device.");
233     if (micTrans_ == nullptr) {
234         DHLOGE("mic trans should be init by dev.");
235         return ERR_DH_AUDIO_NULLPTR;
236     }
237 
238     int32_t ret = micTrans_->SetUp(param_, param_, shared_from_this(), CAP_MIC);
239     if (ret != DH_SUCCESS) {
240         DHLOGE("Mic trans set up failed. ret: %d.", ret);
241         return ret;
242     }
243     return DH_SUCCESS;
244 }
245 
Start()246 int32_t DMicDev::Start()
247 {
248     DHLOGI("Start mic device.");
249     if (micTrans_ == nullptr) {
250         DHLOGE("Mic trans is null.");
251         return ERR_DH_AUDIO_SA_MIC_TRANS_NULL;
252     }
253     int32_t ret = micTrans_->Start();
254     if (ret != DH_SUCCESS) {
255         DHLOGE("Mic trans start failed, ret: %d.", ret);
256         return ret;
257     }
258     std::unique_lock<std::mutex> lck(channelWaitMutex_);
259     auto status = channelWaitCond_.wait_for(lck, std::chrono::seconds(CHANNEL_WAIT_SECONDS),
260         [this]() { return isTransReady_.load(); });
261     if (!status) {
262         DHLOGE("Wait channel open timeout(%ds).", CHANNEL_WAIT_SECONDS);
263         return ERR_DH_AUDIO_SA_MIC_CHANNEL_WAIT_TIMEOUT;
264     }
265     isOpened_.store(true);
266     return DH_SUCCESS;
267 }
268 
Stop()269 int32_t DMicDev::Stop()
270 {
271     DHLOGI("Stop mic device.");
272     if (micTrans_ == nullptr) {
273         DHLOGE("Mic trans is null.");
274         return DH_SUCCESS;
275     }
276 
277     isOpened_.store(false);
278     isTransReady_.store(false);
279     int32_t ret = micTrans_->Stop();
280     if (ret != DH_SUCCESS) {
281         DHLOGE("Stop mic trans failed, ret: %d.", ret);
282     }
283     return DH_SUCCESS;
284 }
285 
Release()286 int32_t DMicDev::Release()
287 {
288     DHLOGI("Release mic device.");
289     if (ashmem_ != nullptr) {
290         ashmem_->UnmapAshmem();
291         ashmem_->CloseAshmem();
292         ashmem_ = nullptr;
293         DHLOGI("UnInit ashmem success.");
294     }
295     if (micTrans_ == nullptr) {
296         DHLOGE("Mic trans is null.");
297         return DH_SUCCESS;
298     }
299 
300     int32_t ret = micTrans_->Release();
301     if (ret != DH_SUCCESS) {
302         DHLOGE("Release mic trans failed, ret: %d.", ret);
303         return ret;
304     }
305     return DH_SUCCESS;
306 }
307 
IsOpened()308 bool DMicDev::IsOpened()
309 {
310     return isOpened_.load();
311 }
312 
WriteStreamData(const std::string & devId,const int32_t dhId,std::shared_ptr<AudioData> & data)313 int32_t DMicDev::WriteStreamData(const std::string& devId, const int32_t dhId, std::shared_ptr<AudioData> &data)
314 {
315     (void)devId;
316     (void)dhId;
317     (void)data;
318     return DH_SUCCESS;
319 }
320 
ReadStreamData(const std::string & devId,const int32_t dhId,std::shared_ptr<AudioData> & data)321 int32_t DMicDev::ReadStreamData(const std::string &devId, const int32_t dhId, std::shared_ptr<AudioData> &data)
322 {
323     if (curStatus_ != AudioStatus::STATUS_START) {
324         DHLOGE("Distributed audio is not starting status.");
325         return ERR_DH_AUDIO_FAILED;
326     }
327     std::lock_guard<std::mutex> lock(dataQueueMtx_);
328     uint32_t queSize = dataQueue_.size();
329     if (insertFrameCnt_ >= queSize || queSize == 0) {
330         ++insertFrameCnt_;
331         isExistedEmpty_.store(true);
332         DHLOGD("Data queue is empty, count :%u.", insertFrameCnt_);
333         data = std::make_shared<AudioData>(param_.comParam.frameSize);
334     } else {
335         while (insertFrameCnt_ > 0) {
336             DHLOGD("Data discard, count: %u", insertFrameCnt_);
337             dataQueue_.pop();
338             --insertFrameCnt_;
339         }
340         data = dataQueue_.front();
341         dataQueue_.pop();
342     }
343     return DH_SUCCESS;
344 }
345 
ReadMmapPosition(const std::string & devId,const int32_t dhId,uint64_t & frames,CurrentTimeHDF & time)346 int32_t DMicDev::ReadMmapPosition(const std::string &devId, const int32_t dhId,
347     uint64_t &frames, CurrentTimeHDF &time)
348 {
349     DHLOGD("Read mmap position. frames: %lu, tvsec: %lu, tvNSec:%lu",
350         writeNum_, writeTvSec_, writeTvNSec_);
351     frames = writeNum_;
352     time.tvSec = writeTvSec_;
353     time.tvNSec = writeTvNSec_;
354     return DH_SUCCESS;
355 }
356 
RefreshAshmemInfo(const std::string & devId,const int32_t dhId,int32_t fd,int32_t ashmemLength,int32_t lengthPerTrans)357 int32_t DMicDev::RefreshAshmemInfo(const std::string &devId, const int32_t dhId,
358     int32_t fd, int32_t ashmemLength, int32_t lengthPerTrans)
359 {
360     DHLOGD("RefreshAshmemInfo: fd:%d, ashmemLength: %d, lengthPerTrans: %d", fd, ashmemLength, lengthPerTrans);
361     if (param_.captureOpts.capturerFlags == MMAP_MODE) {
362         DHLOGD("DMic dev low-latency mode");
363         if (ashmem_ != nullptr) {
364             return DH_SUCCESS;
365         }
366         ashmem_ = new Ashmem(fd, ashmemLength);
367         ashmemLength_ = ashmemLength;
368         lengthPerTrans_ = lengthPerTrans;
369         DHLOGD("Create ashmem success. fd:%d, ashmem length: %d, lengthPreTrans: %d",
370             fd, ashmemLength_, lengthPerTrans_);
371         bool mapRet = ashmem_->MapReadAndWriteAshmem();
372         if (!mapRet) {
373             DHLOGE("Mmap ashmem failed.");
374             return ERR_DH_AUDIO_NULLPTR;
375         }
376     }
377     return DH_SUCCESS;
378 }
379 
MmapStart()380 int32_t DMicDev::MmapStart()
381 {
382     if (ashmem_ == nullptr) {
383         DHLOGE("Ashmem is nullptr");
384         return ERR_DH_AUDIO_NULLPTR;
385     }
386     std::lock_guard<std::mutex> lock(writeAshmemMutex_);
387     frameIndex_ = 0;
388     startTime_ = 0;
389     isEnqueueRunning_.store(true);
390     enqueueDataThread_ = std::thread(&DMicDev::EnqueueThread, this);
391     if (pthread_setname_np(enqueueDataThread_.native_handle(), ENQUEUE_THREAD) != DH_SUCCESS) {
392         DHLOGE("Enqueue data thread setname failed.");
393     }
394     return DH_SUCCESS;
395 }
396 
EnqueueThread()397 void DMicDev::EnqueueThread()
398 {
399     writeIndex_ = 0;
400     writeNum_ = 0;
401     DHLOGD("Enqueue thread start, lengthPerWrite length: %d.", lengthPerTrans_);
402     FillJitterQueue();
403     while (ashmem_ != nullptr && isEnqueueRunning_.load()) {
404         int64_t timeOffset = UpdateTimeOffset(frameIndex_, LOW_LATENCY_INTERVAL_NS,
405             startTime_);
406         DHLOGD("Write frameIndex: %lld, timeOffset: %lld.", frameIndex_, timeOffset);
407         std::shared_ptr<AudioData> audioData = nullptr;
408         {
409             std::lock_guard<std::mutex> lock(dataQueueMtx_);
410             if (dataQueue_.empty()) {
411                 DHLOGD("Data queue is Empty.");
412                 audioData = std::make_shared<AudioData>(param_.comParam.frameSize);
413             } else {
414                 audioData = dataQueue_.front();
415                 dataQueue_.pop();
416             }
417         }
418         bool writeRet = ashmem_->WriteToAshmem(audioData->Data(), audioData->Size(), writeIndex_);
419         if (writeRet) {
420             DHLOGD("Write to ashmem success! write index: %d, writeLength: %d.", writeIndex_, lengthPerTrans_);
421         } else {
422             DHLOGE("Write data to ashmem failed.");
423         }
424         writeIndex_ += lengthPerTrans_;
425         if (writeIndex_ >= ashmemLength_) {
426             writeIndex_ = 0;
427         }
428         writeNum_ += static_cast<uint64_t>(CalculateSampleNum(param_.comParam.sampleRate, timeInterval_));
429         GetCurrentTime(writeTvSec_, writeTvNSec_);
430         frameIndex_++;
431         AbsoluteSleep(startTime_ + frameIndex_ * LOW_LATENCY_INTERVAL_NS - timeOffset);
432     }
433 }
434 
FillJitterQueue()435 void DMicDev::FillJitterQueue()
436 {
437     while (true) {
438         {
439             std::lock_guard<std::mutex> lock(dataQueueMtx_);
440             if (dataQueue_.size() >= LOW_LATENCY_DATA_QUEUE_HALF_SIZE) {
441                 break;
442             }
443         }
444         usleep(MMAP_WAIT_FRAME_US);
445     }
446     DHLOGD("Mic jitter data queue fill end.");
447 }
448 
MmapStop()449 int32_t DMicDev::MmapStop()
450 {
451     std::lock_guard<std::mutex> lock(writeAshmemMutex_);
452     isEnqueueRunning_.store(false);
453     if (enqueueDataThread_.joinable()) {
454         enqueueDataThread_.join();
455     }
456     DHLOGI("Mic mmap stop end.");
457     return DH_SUCCESS;
458 }
459 
GetAudioParam() const460 AudioParam DMicDev::GetAudioParam() const
461 {
462     return param_;
463 }
464 
NotifyHdfAudioEvent(const AudioEvent & event)465 int32_t DMicDev::NotifyHdfAudioEvent(const AudioEvent &event)
466 {
467     int32_t ret = DAudioHdiHandler::GetInstance().NotifyEvent(devId_, curPort_, event);
468     if (ret != DH_SUCCESS) {
469         DHLOGE("Notify event: %d, result: %s.", event.type, event.content.c_str());
470     }
471     return DH_SUCCESS;
472 }
473 
OnStateChange(const AudioEventType type)474 int32_t DMicDev::OnStateChange(const AudioEventType type)
475 {
476     DHLOGD("On mic device state change, type: %d", type);
477     AudioEvent event;
478     switch (type) {
479         case AudioEventType::DATA_OPENED:
480             isTransReady_.store(true);
481             channelWaitCond_.notify_one();
482             event.type = AudioEventType::MIC_OPENED;
483             break;
484         case AudioEventType::DATA_CLOSED:
485             isTransReady_.store(false);
486             event.type = AudioEventType::MIC_CLOSED;
487             break;
488         default:
489             break;
490     }
491     std::shared_ptr<IAudioEventCallback> cbObj = audioEventCallback_.lock();
492     if (cbObj == nullptr) {
493         DHLOGE("Event callback is null");
494         return ERR_DH_AUDIO_SA_MICCALLBACK_NULL;
495     }
496     cbObj->NotifyEvent(event);
497     return DH_SUCCESS;
498 }
499 
SendMessage(uint32_t type,std::string content,std::string dstDevId)500 int32_t DMicDev::SendMessage(uint32_t type, std::string content, std::string dstDevId)
501 {
502     DHLOGI("Send message to remote.");
503     if (type != static_cast<uint32_t>(OPEN_MIC) && type != static_cast<uint32_t>(CLOSE_MIC)) {
504         DHLOGE("Send message to remote. not OPEN_MIC or CLOSE_MIC. type: %u", type);
505         return ERR_DH_AUDIO_NULLPTR;
506     }
507     if (micTrans_ == nullptr) {
508         DHLOGE("mic trans is null.");
509         return ERR_DH_AUDIO_NULLPTR;
510     }
511     micTrans_->SendMessage(type, content, dstDevId);
512     return DH_SUCCESS;
513 }
514 
OnDecodeTransDataDone(const std::shared_ptr<AudioData> & audioData)515 int32_t DMicDev::OnDecodeTransDataDone(const std::shared_ptr<AudioData> &audioData)
516 {
517     if (audioData == nullptr) {
518         DHLOGE("The parameter is empty.");
519         return ERR_DH_AUDIO_NULLPTR;
520     }
521     std::lock_guard<std::mutex> lock(dataQueueMtx_);
522     dataQueSize_ = curStatus_ != AudioStatus::STATUS_START ?
523         (param_.captureOpts.capturerFlags == MMAP_MODE ? LOW_LATENCY_DATA_QUEUE_HALF_SIZE : DATA_QUEUE_HALF_SIZE) :
524         (param_.captureOpts.capturerFlags == MMAP_MODE ? LOW_LATENCY_DATA_QUEUE_MAX_SIZE : DATA_QUEUE_MAX_SIZE);
525     if (isExistedEmpty_.load()) {
526         dataQueSize_ = param_.captureOpts.capturerFlags == MMAP_MODE ? dataQueSize_ : DATA_QUEUE_EXT_SIZE;
527     }
528     while (dataQueue_.size() > dataQueSize_) {
529         DHLOGD("Data queue overflow. buf current size: %d", dataQueue_.size());
530         dataQueue_.pop();
531     }
532     dataQueue_.push(audioData);
533     DHLOGD("Push new mic data, buf len: %d", dataQueue_.size());
534     return DH_SUCCESS;
535 }
536 } // DistributedHardware
537 } // OHOS
538