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 ¶m)
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