1 /*
2 * Copyright (c) 2024 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 "daudio_source_dev.h"
17
18 #include <random>
19
20 #include "cJSON.h"
21
22 #include "daudio_constants.h"
23 #include "daudio_errorcode.h"
24 #include "daudio_hitrace.h"
25 #include "daudio_log.h"
26 #include "daudio_radar.h"
27 #include "daudio_source_manager.h"
28 #include "daudio_util.h"
29
30 #undef DH_LOG_TAG
31 #define DH_LOG_TAG "DAudioSourceDev"
32
33 namespace OHOS {
34 namespace DistributedHardware {
35 namespace {
36 constexpr uint32_t EVENT_OPEN_SPEAKER = 11;
37 constexpr uint32_t EVENT_CLOSE_SPEAKER = 12;
38 constexpr uint32_t EVENT_OPEN_MIC = 21;
39 constexpr uint32_t EVENT_CLOSE_MIC = 22;
40 constexpr uint32_t EVENT_DMIC_CLOSED = 24;
41 constexpr uint32_t EVENT_VOLUME_SET = 31;
42 constexpr uint32_t EVENT_VOLUME_CHANGE = 33;
43 constexpr uint32_t EVENT_AUDIO_FOCUS_CHANGE = 41;
44 constexpr uint32_t EVENT_AUDIO_RENDER_STATE_CHANGE = 42;
45 constexpr uint32_t EVENT_CHANGE_PLAY_STATUS = 71;
46 constexpr uint32_t EVENT_MMAP_SPK_START = 81;
47 constexpr uint32_t EVENT_MMAP_SPK_STOP = 82;
48 constexpr uint32_t EVENT_MMAP_MIC_START = 83;
49 constexpr uint32_t EVENT_MMAP_MIC_STOP = 84;
50 constexpr uint32_t EVENT_DAUDIO_ENABLE = 88;
51 constexpr uint32_t EVENT_DAUDIO_DISABLE = 89;
52 }
53
DAudioSourceDev(const std::string & devId,const std::shared_ptr<DAudioSourceMgrCallback> & callback)54 DAudioSourceDev::DAudioSourceDev(const std::string &devId, const std::shared_ptr<DAudioSourceMgrCallback> &callback)
55 : devId_(devId), mgrCallback_(callback)
56 {
57 memberFuncMap_[OPEN_SPEAKER] = &DAudioSourceDev::HandleOpenDSpeaker;
58 memberFuncMap_[CLOSE_SPEAKER] = &DAudioSourceDev::HandleCloseDSpeaker;
59 memberFuncMap_[SPEAKER_OPENED] = &DAudioSourceDev::HandleDSpeakerOpened;
60 memberFuncMap_[SPEAKER_CLOSED] = &DAudioSourceDev::HandleDSpeakerClosed;
61 memberFuncMap_[NOTIFY_OPEN_SPEAKER_RESULT] = &DAudioSourceDev::HandleNotifyRPC;
62 memberFuncMap_[NOTIFY_CLOSE_SPEAKER_RESULT] = &DAudioSourceDev::HandleNotifyRPC;
63 memberFuncMap_[OPEN_MIC] = &DAudioSourceDev::HandleOpenDMic;
64 memberFuncMap_[CLOSE_MIC] = &DAudioSourceDev::HandleCloseDMic;
65 memberFuncMap_[MIC_OPENED] = &DAudioSourceDev::HandleDMicOpened;
66 memberFuncMap_[MIC_CLOSED] = &DAudioSourceDev::HandleDMicClosed;
67 memberFuncMap_[NOTIFY_OPEN_MIC_RESULT] = &DAudioSourceDev::HandleNotifyRPC;
68 memberFuncMap_[NOTIFY_CLOSE_MIC_RESULT] = &DAudioSourceDev::HandleNotifyRPC;
69 memberFuncMap_[NOTIFY_OPEN_CTRL_RESULT] = &DAudioSourceDev::HandleNotifyRPC;
70 memberFuncMap_[NOTIFY_CLOSE_CTRL_RESULT] = &DAudioSourceDev::HandleNotifyRPC;
71 memberFuncMap_[CTRL_CLOSED] = &DAudioSourceDev::HandleCtrlTransClosed;
72 memberFuncMap_[VOLUME_SET] = &DAudioSourceDev::HandleVolumeSet;
73 memberFuncMap_[VOLUME_MUTE_SET] = &DAudioSourceDev::HandleVolumeSet;
74 memberFuncMap_[VOLUME_CHANGE] = &DAudioSourceDev::HandleVolumeChange;
75 memberFuncMap_[AUDIO_FOCUS_CHANGE] = &DAudioSourceDev::HandleFocusChange;
76 memberFuncMap_[AUDIO_RENDER_STATE_CHANGE] = &DAudioSourceDev::HandleRenderStateChange;
77 memberFuncMap_[CHANGE_PLAY_STATUS] = &DAudioSourceDev::HandlePlayStatusChange;
78 memberFuncMap_[MMAP_SPK_START] = &DAudioSourceDev::HandleSpkMmapStart;
79 memberFuncMap_[MMAP_SPK_STOP] = &DAudioSourceDev::HandleSpkMmapStop;
80 memberFuncMap_[MMAP_MIC_START] = &DAudioSourceDev::HandleMicMmapStart;
81 memberFuncMap_[MMAP_MIC_STOP] = &DAudioSourceDev::HandleMicMmapStop;
82
83 eventNotifyMap_[NOTIFY_OPEN_SPEAKER_RESULT] = EVENT_NOTIFY_OPEN_SPK;
84 eventNotifyMap_[NOTIFY_CLOSE_SPEAKER_RESULT] = EVENT_NOTIFY_CLOSE_SPK;
85 eventNotifyMap_[NOTIFY_OPEN_MIC_RESULT] = EVENT_NOTIFY_OPEN_MIC;
86 eventNotifyMap_[NOTIFY_CLOSE_MIC_RESULT] = EVENT_NOTIFY_CLOSE_MIC;
87 eventNotifyMap_[NOTIFY_OPEN_CTRL_RESULT] = EVENT_NOTIFY_OPEN_CTRL;
88 eventNotifyMap_[NOTIFY_CLOSE_CTRL_RESULT] = EVENT_NOTIFY_CLOSE_CTRL;
89 }
90
AwakeAudioDev()91 int32_t DAudioSourceDev::AwakeAudioDev()
92 {
93 auto runner = AppExecFwk::EventRunner::Create(true);
94 CHECK_NULL_RETURN(runner, ERR_DH_AUDIO_NULLPTR);
95 handler_ = std::make_shared<DAudioSourceDev::SourceEventHandler>(runner, shared_from_this());
96 return DH_SUCCESS;
97 }
98
SleepAudioDev()99 void DAudioSourceDev::SleepAudioDev()
100 {
101 DHLOGD("Sleep audio dev.");
102 CHECK_NULL_VOID(handler_);
103 while (!handler_->IsIdle()) {
104 DHLOGD("handler is running, wait for idle.");
105 usleep(WAIT_HANDLER_IDLE_TIME_US);
106 }
107 DHLOGI("Sleep audio dev over.");
108 }
109
SetRegDataType(const std::string & capability)110 void DAudioSourceDev::SetRegDataType(const std::string &capability)
111 {
112 DHLOGI("SetRegDataType enter.");
113 cJSON *jParam = cJSON_Parse(capability.c_str());
114 CHECK_NULL_VOID(jParam);
115 if (!CJsonParamCheck(jParam, { KEY_DATATYPE })) {
116 DHLOGE("The key dataType is not found.");
117 cJSON_Delete(jParam);
118 return;
119 }
120 cJSON *dataType = cJSON_GetObjectItem(jParam, KEY_DATATYPE);
121 if (dataType == nullptr || !cJSON_IsString(dataType)) {
122 DHLOGE("The key dataType is null.");
123 cJSON_Delete(jParam);
124 return;
125 }
126 DHLOGI("RegData type is : %{public}s.", dataType->valuestring);
127 std::string typeStr(dataType->valuestring);
128 if (typeStr == KEY_TYPE_FULL) {
129 isFull_.store(true);
130 } else {
131 isFull_.store(false);
132 }
133 cJSON_Delete(jParam);
134 }
135
EnableDAudio(const std::string & dhId,const std::string & attrs)136 int32_t DAudioSourceDev::EnableDAudio(const std::string &dhId, const std::string &attrs)
137 {
138 DHLOGI("Enable audio device, dhId: %{public}s.", dhId.c_str());
139 isRpcOpen_.store(true);
140 CHECK_NULL_RETURN(handler_, ERR_DH_AUDIO_NULLPTR);
141
142 cJSON *jParam = cJSON_CreateObject();
143 CHECK_NULL_RETURN(jParam, ERR_DH_AUDIO_NULLPTR);
144 cJSON_AddStringToObject(jParam, KEY_DEV_ID, devId_.c_str());
145 cJSON_AddStringToObject(jParam, KEY_DH_ID, dhId.c_str());
146 cJSON_AddStringToObject(jParam, KEY_ATTRS, attrs.c_str());
147 char *jsonString = cJSON_PrintUnformatted(jParam);
148 CHECK_NULL_FREE_RETURN(jsonString, ERR_DH_AUDIO_NULLPTR, jParam);
149 auto eventParam = std::make_shared<std::string>(jsonString);
150 auto msgEvent = AppExecFwk::InnerEvent::Get(EVENT_DAUDIO_ENABLE, eventParam, 0);
151 if (!handler_->SendEvent(msgEvent, 0, AppExecFwk::EventQueue::Priority::IMMEDIATE)) {
152 DHLOGE("Send event failed.");
153 cJSON_Delete(jParam);
154 cJSON_free(jsonString);
155 return ERR_DH_AUDIO_FAILED;
156 }
157 DHLOGI("Enable audio task generate successfully.");
158 cJSON_Delete(jParam);
159 cJSON_free(jsonString);
160 if (!isFull_.load()) {
161 SetRegDataType(attrs);
162 }
163 return DH_SUCCESS;
164 }
165
DisableDAudioInner(const std::string & dhId)166 int32_t DAudioSourceDev::DisableDAudioInner(const std::string &dhId)
167 {
168 CHECK_NULL_RETURN(handler_, ERR_DH_AUDIO_NULLPTR);
169 cJSON *jParam = cJSON_CreateObject();
170 CHECK_NULL_RETURN(jParam, ERR_DH_AUDIO_NULLPTR);
171 cJSON_AddStringToObject(jParam, KEY_DEV_ID, devId_.c_str());
172 cJSON_AddStringToObject(jParam, KEY_DH_ID, dhId.c_str());
173 char *jsonString = cJSON_PrintUnformatted(jParam);
174 CHECK_NULL_FREE_RETURN(jsonString, ERR_DH_AUDIO_NULLPTR, jParam);
175 auto eventParam = std::make_shared<std::string>(jsonString);
176 auto msgEvent = AppExecFwk::InnerEvent::Get(EVENT_DAUDIO_DISABLE, eventParam, 0);
177 if (!handler_->SendEvent(msgEvent, 0, AppExecFwk::EventQueue::Priority::IMMEDIATE)) {
178 DHLOGE("Send event failed.");
179 cJSON_Delete(jParam);
180 cJSON_free(jsonString);
181 return ERR_DH_AUDIO_FAILED;
182 }
183 cJSON_Delete(jParam);
184 cJSON_free(jsonString);
185 return DH_SUCCESS;
186 }
187
DisableDAudio(const std::string & dhId)188 int32_t DAudioSourceDev::DisableDAudio(const std::string &dhId)
189 {
190 DHLOGI("Disable audio device, dhId: %{public}s.", dhId.c_str());
191 isRpcOpen_.store(false);
192
193 cJSON *jParamClose = cJSON_CreateObject();
194 CHECK_NULL_RETURN(jParamClose, ERR_DH_AUDIO_NULLPTR);
195 cJSON_AddStringToObject(jParamClose, KEY_DH_ID, dhId.c_str());
196 char *data = cJSON_PrintUnformatted(jParamClose);
197 CHECK_NULL_FREE_RETURN(data, ERR_DH_AUDIO_NULLPTR, jParamClose);
198 AudioEvent event(AudioEventType::EVENT_UNKNOWN, std::string(data));
199 int32_t dhIdNum = ConvertString2Int(dhId);
200 if (dhIdNum == ERR_DH_AUDIO_FAILED) {
201 DHLOGE("Parse dhId error.");
202 cJSON_Delete(jParamClose);
203 cJSON_free(data);
204 return ERR_DH_AUDIO_NOT_SUPPORT;
205 }
206 switch (GetDevTypeByDHId(dhIdNum)) {
207 case AUDIO_DEVICE_TYPE_SPEAKER:
208 event.type = CLOSE_SPEAKER;
209 HandleCloseDSpeaker(event);
210 break;
211 case AUDIO_DEVICE_TYPE_MIC:
212 event.type = CLOSE_MIC;
213 HandleCloseDMic(event);
214 break;
215 default:
216 cJSON_Delete(jParamClose);
217 cJSON_free(data);
218 DHLOGE("Unknown audio device. dhId: %{public}d.", dhIdNum);
219 return ERR_DH_AUDIO_NOT_SUPPORT;
220 }
221 cJSON_Delete(jParamClose);
222 cJSON_free(data);
223 int32_t ret = DisableDAudioInner(dhId);
224 if (ret != DH_SUCCESS) {
225 DHLOGE("Failed to disable audio device, result is: %{public}d.", ret);
226 return ret;
227 }
228 DHLOGI("Disable audio task generate successfully.");
229 return DH_SUCCESS;
230 }
231
GetThreadStatusFlag()232 bool DAudioSourceDev::GetThreadStatusFlag()
233 {
234 return threadStatusFlag_;
235 }
236
SetThreadStatusFlag(bool flag)237 void DAudioSourceDev::SetThreadStatusFlag(bool flag)
238 {
239 threadStatusFlag_ = flag;
240 }
241
NotifyEventInner(const AudioEvent & event)242 void DAudioSourceDev::NotifyEventInner(const AudioEvent &event)
243 {
244 switch (event.type) {
245 case OPEN_MIC:
246 HandleOpenDMic(event);
247 break;
248 case CLOSE_MIC:
249 HandleCloseDMic(event);
250 break;
251 case MIC_OPENED:
252 HandleDMicOpened(event);
253 break;
254 case MIC_CLOSED:
255 HandleDMicClosed(event);
256 break;
257 case CTRL_CLOSED:
258 HandleCtrlTransClosed(event);
259 break;
260 case VOLUME_SET:
261 case VOLUME_MUTE_SET:
262 HandleVolumeSet(event);
263 break;
264 case VOLUME_CHANGE:
265 HandleVolumeChange(event);
266 break;
267 case AUDIO_FOCUS_CHANGE:
268 HandleFocusChange(event);
269 break;
270 case AUDIO_RENDER_STATE_CHANGE:
271 HandleRenderStateChange(event);
272 break;
273 case CHANGE_PLAY_STATUS:
274 HandlePlayStatusChange(event);
275 break;
276 case MMAP_SPK_START:
277 HandleSpkMmapStart(event);
278 break;
279 case MMAP_SPK_STOP:
280 HandleSpkMmapStop(event);
281 break;
282 case MMAP_MIC_START:
283 HandleMicMmapStart(event);
284 break;
285 case MMAP_MIC_STOP:
286 HandleMicMmapStop(event);
287 break;
288 default:
289 break;
290 }
291 }
292
NotifyEvent(const AudioEvent & event)293 void DAudioSourceDev::NotifyEvent(const AudioEvent &event)
294 {
295 switch (event.type) {
296 case OPEN_SPEAKER:
297 HandleOpenDSpeaker(event);
298 break;
299 case CLOSE_SPEAKER:
300 HandleCloseDSpeaker(event);
301 break;
302 case SPEAKER_OPENED:
303 HandleDSpeakerOpened(event);
304 break;
305 case SPEAKER_CLOSED:
306 HandleDSpeakerClosed(event);
307 break;
308 case NOTIFY_OPEN_SPEAKER_RESULT:
309 case NOTIFY_CLOSE_SPEAKER_RESULT:
310 case NOTIFY_OPEN_MIC_RESULT:
311 case NOTIFY_CLOSE_MIC_RESULT:
312 case NOTIFY_OPEN_CTRL_RESULT:
313 case NOTIFY_CLOSE_CTRL_RESULT:
314 HandleNotifyRPC(event);
315 break;
316 #ifdef AUDIO_SUPPORT_SHARED_BUFFER
317 case AUDIO_START:
318 case AUDIO_STOP:
319 HandleAudioStatus(event);
320 break;
321 #endif
322 case OPEN_MIC:
323 case CLOSE_MIC:
324 case MIC_OPENED:
325 case MIC_CLOSED:
326 case CTRL_CLOSED:
327 case VOLUME_SET:
328 case VOLUME_MUTE_SET:
329 case VOLUME_CHANGE:
330 case AUDIO_FOCUS_CHANGE:
331 case AUDIO_RENDER_STATE_CHANGE:
332 case CHANGE_PLAY_STATUS:
333 case MMAP_SPK_START:
334 case MMAP_SPK_STOP:
335 case MMAP_MIC_START:
336 case MMAP_MIC_STOP:
337 NotifyEventInner(event);
338 break;
339 default:
340 DHLOGE("Invalid eventType: %{public}d.", event.type);
341 break;
342 }
343 }
344
345 #ifdef AUDIO_SUPPORT_SHARED_BUFFER
HandleAudioStatus(const AudioEvent & event)346 void DAudioSourceDev::HandleAudioStatus(const AudioEvent &event)
347 {
348 switch (event.type) {
349 case AUDIO_START:
350 HandleAudioStart(event);
351 break;
352 case AUDIO_STOP:
353 HandleAudioStop(event);
354 break;
355 default:
356 break;
357 }
358 }
359
HandleAudioStart(const AudioEvent & event)360 int32_t DAudioSourceDev::HandleAudioStart(const AudioEvent &event)
361 {
362 DHLOGI("Audio start, content: %{public}s.", event.content.c_str());
363 int32_t dhId = ParseDhidFromEvent(event.content);
364 if (dhId == ERR_DH_AUDIO_FAILED) {
365 DHLOGE("Failed to parse dhardware id.");
366 return ERR_DH_AUDIO_SA_PARAM_INVALID;
367 }
368 if (dhId == PIN_IN_MIC) {
369 DHLOGI("MIC start");
370 return DH_SUCCESS;
371 }
372 CHECK_NULL_RETURN(handler_, ERR_DH_AUDIO_NULLPTR);
373 auto eventParam = std::make_shared<AudioEvent>(event);
374 auto msgEvent = AppExecFwk::InnerEvent::Get(EVENT_MMAP_SPK_START, eventParam, 0);
375 if (!handler_->SendEvent(msgEvent, 0, AppExecFwk::EventQueue::Priority::IMMEDIATE)) {
376 DHLOGE("Send event failed.");
377 return ERR_DH_AUDIO_FAILED;
378 }
379 DHLOGD("Mmap Start event is sent successfully.");
380 return DH_SUCCESS;
381 }
382
HandleAudioStop(const AudioEvent & event)383 int32_t DAudioSourceDev::HandleAudioStop(const AudioEvent &event)
384 {
385 DHLOGI("Audio mmap stop, content: %{public}s.", event.content.c_str());
386 int32_t dhId = ParseDhidFromEvent(event.content);
387 if (dhId == ERR_DH_AUDIO_FAILED) {
388 DHLOGE("Failed to parse dhardware id.");
389 return ERR_DH_AUDIO_SA_PARAM_INVALID;
390 }
391 if (dhId == PIN_IN_MIC) {
392 DHLOGI("MIC stop");
393 return DH_SUCCESS;
394 }
395 CHECK_NULL_RETURN(handler_, ERR_DH_AUDIO_NULLPTR);
396 auto eventParam = std::make_shared<AudioEvent>(event);
397 auto msgEvent = AppExecFwk::InnerEvent::Get(EVENT_MMAP_SPK_STOP, eventParam, 0);
398 if (!handler_->SendEvent(msgEvent, 0, AppExecFwk::EventQueue::Priority::IMMEDIATE)) {
399 DHLOGE("Send event failed.");
400 return ERR_DH_AUDIO_FAILED;
401 }
402 DHLOGD("Speaker Mmap Stop event is sent successfully.");
403 return DH_SUCCESS;
404 }
405 #endif
406
HandleOpenDSpeaker(const AudioEvent & event)407 int32_t DAudioSourceDev::HandleOpenDSpeaker(const AudioEvent &event)
408 {
409 DHLOGI("Open speaker device.");
410 CHECK_NULL_RETURN(handler_, ERR_DH_AUDIO_NULLPTR);
411
412 auto eventParam = std::make_shared<AudioEvent>(event);
413 auto msgEvent = AppExecFwk::InnerEvent::Get(EVENT_OPEN_SPEAKER, eventParam, 0);
414 if (!handler_->SendEvent(msgEvent, 0, AppExecFwk::EventQueue::Priority::IMMEDIATE)) {
415 DHLOGE("Send event failed.");
416 return ERR_DH_AUDIO_FAILED;
417 }
418 DHLOGD("Opening DSpeaker event is sent successfully.");
419 return DH_SUCCESS;
420 }
421
HandleCloseDSpeaker(const AudioEvent & event)422 int32_t DAudioSourceDev::HandleCloseDSpeaker(const AudioEvent &event)
423 {
424 DHLOGI("Close speaker device.");
425 CHECK_NULL_RETURN(handler_, ERR_DH_AUDIO_NULLPTR);
426 auto eventParam = std::make_shared<AudioEvent>(event);
427 auto msgEvent = AppExecFwk::InnerEvent::Get(EVENT_CLOSE_SPEAKER, eventParam, 0);
428 if (!handler_->SendEvent(msgEvent, 0, AppExecFwk::EventQueue::Priority::IMMEDIATE)) {
429 DHLOGE("Send event failed.");
430 return ERR_DH_AUDIO_FAILED;
431 }
432 DHLOGD("Closing DSpeaker event is sent successfully.");
433 return DH_SUCCESS;
434 }
435
HandleDSpeakerOpened(const AudioEvent & event)436 int32_t DAudioSourceDev::HandleDSpeakerOpened(const AudioEvent &event)
437 {
438 (void)event;
439 DHLOGI("Speaker device opened.");
440 return DH_SUCCESS;
441 }
442
HandleDSpeakerClosed(const AudioEvent & event)443 int32_t DAudioSourceDev::HandleDSpeakerClosed(const AudioEvent &event)
444 {
445 DHLOGI("Speaker device closed, event.content = %{public}s.", event.content.c_str());
446 int32_t dhId = ParseDhidFromEvent(event.content);
447 if (dhId == ERR_DH_AUDIO_FAILED) {
448 DHLOGE("Failed to parse dhardware id.");
449 return ERR_DH_AUDIO_FAILED;
450 }
451 auto speaker = FindIoDevImpl(event.content);
452 CHECK_NULL_RETURN(speaker, ERR_DH_AUDIO_NULLPTR);
453 return speaker->NotifyHdfAudioEvent(event, dhId);
454 }
455
FindIoDevImpl(std::string args)456 std::shared_ptr<DAudioIoDev> DAudioSourceDev::FindIoDevImpl(std::string args)
457 {
458 int32_t dhId = ParseDhidFromEvent(args);
459 if (dhId == ERR_DH_AUDIO_FAILED) {
460 DHLOGE("Failed to parse dhardware id.");
461 return nullptr;
462 }
463 std::lock_guard<std::mutex> devLck(ioDevMtx_);
464 if (deviceMap_.find(dhId) == deviceMap_.end()) {
465 DHLOGE("Not find IO device instance.");
466 return nullptr;
467 }
468 return deviceMap_[dhId];
469 }
470
HandleOpenDMic(const AudioEvent & event)471 int32_t DAudioSourceDev::HandleOpenDMic(const AudioEvent &event)
472 {
473 DHLOGI("Open mic device.");
474 CHECK_NULL_RETURN(handler_, ERR_DH_AUDIO_NULLPTR);
475
476 auto eventParam = std::make_shared<AudioEvent>(event);
477 auto msgEvent = AppExecFwk::InnerEvent::Get(EVENT_OPEN_MIC, eventParam, 0);
478 if (!handler_->SendEvent(msgEvent, 0, AppExecFwk::EventQueue::Priority::IMMEDIATE)) {
479 DHLOGE("Send event failed.");
480 return ERR_DH_AUDIO_FAILED;
481 }
482 DHLOGD("Opening DMic event is sent successfully.");
483 return DH_SUCCESS;
484 }
485
HandleCloseDMic(const AudioEvent & event)486 int32_t DAudioSourceDev::HandleCloseDMic(const AudioEvent &event)
487 {
488 DHLOGI("Close mic device.");
489 CHECK_NULL_RETURN(handler_, ERR_DH_AUDIO_NULLPTR);
490 auto eventParam = std::make_shared<AudioEvent>(event);
491 auto msgEvent = AppExecFwk::InnerEvent::Get(EVENT_CLOSE_MIC, eventParam, 0);
492 if (!handler_->SendEvent(msgEvent, 0, AppExecFwk::EventQueue::Priority::IMMEDIATE)) {
493 DHLOGE("Send event failed.");
494 return ERR_DH_AUDIO_FAILED;
495 }
496 DHLOGD("Closing DMic event is sent successfully.");
497 return DH_SUCCESS;
498 }
499
HandleDMicOpened(const AudioEvent & event)500 int32_t DAudioSourceDev::HandleDMicOpened(const AudioEvent &event)
501 {
502 (void)event;
503 DHLOGD("Mic device opened.");
504 return DH_SUCCESS;
505 }
506
HandleDMicClosed(const AudioEvent & event)507 int32_t DAudioSourceDev::HandleDMicClosed(const AudioEvent &event)
508 {
509 DHLOGI("Dmic device closed, event.content = %{public}s.", event.content.c_str());
510 CHECK_NULL_RETURN(handler_, ERR_DH_AUDIO_NULLPTR);
511 auto eventParam = std::make_shared<AudioEvent>(event);
512 auto msgEvent = AppExecFwk::InnerEvent::Get(EVENT_DMIC_CLOSED, eventParam, 0);
513 if (!handler_->SendEvent(msgEvent, 0, AppExecFwk::EventQueue::Priority::IMMEDIATE)) {
514 DHLOGE("Send event failed.");
515 return ERR_DH_AUDIO_FAILED;
516 }
517 DHLOGD("Dmic closed event is sent successfully.");
518 return DH_SUCCESS;
519 }
520
HandleCtrlTransClosed(const AudioEvent & event)521 int32_t DAudioSourceDev::HandleCtrlTransClosed(const AudioEvent &event)
522 {
523 DHLOGD("Control trans closed.");
524 return DH_SUCCESS;
525 }
526
HandleNotifyRPC(const AudioEvent & event)527 int32_t DAudioSourceDev::HandleNotifyRPC(const AudioEvent &event)
528 {
529 std::lock_guard<std::mutex> dataLock(rpcWaitMutex_);
530 if (event.content.length() > DAUDIO_MAX_JSON_LEN || event.content.empty()) {
531 return ERR_DH_AUDIO_SA_PARAM_INVALID;
532 }
533 cJSON *jParam = cJSON_Parse(event.content.c_str());
534 CHECK_NULL_RETURN(jParam, ERR_DH_AUDIO_NULLPTR);
535 if (!CJsonParamCheck(jParam, { KEY_RESULT })) {
536 DHLOGE("Not found the keys of result.");
537 cJSON_Delete(jParam);
538 return ERR_DH_AUDIO_FAILED;
539 }
540
541 rpcResult_ = cJSON_GetObjectItem(jParam, KEY_RESULT)->valueint;
542 DHLOGD("Notify RPC event: %{public}d, result: %{public}d.", event.type, rpcResult_);
543 std::map<AudioEventType, uint8_t>::iterator iter = eventNotifyMap_.find(event.type);
544 if (iter == eventNotifyMap_.end()) {
545 DHLOGE("Invalid eventType.");
546 cJSON_Delete(jParam);
547 return ERR_DH_AUDIO_NOT_FOUND_KEY;
548 }
549 rpcNotify_ = iter->second;
550 rpcWaitCond_.notify_all();
551 cJSON_Delete(jParam);
552 return DH_SUCCESS;
553 }
554
HandleVolumeSet(const AudioEvent & event)555 int32_t DAudioSourceDev::HandleVolumeSet(const AudioEvent &event)
556 {
557 DHLOGD("Start handle volume set.");
558 CHECK_NULL_RETURN(handler_, ERR_DH_AUDIO_NULLPTR);
559 auto eventParam = std::make_shared<AudioEvent>(event);
560 auto msgEvent = AppExecFwk::InnerEvent::Get(EVENT_VOLUME_SET, eventParam, 0);
561 if (!handler_->SendEvent(msgEvent, 0, AppExecFwk::EventQueue::Priority::IMMEDIATE)) {
562 DHLOGE("Send event failed.");
563 return ERR_DH_AUDIO_FAILED;
564 }
565 DHLOGD("Volume setting event is sent successfully.");
566 return DH_SUCCESS;
567 }
568
HandleVolumeChange(const AudioEvent & event)569 int32_t DAudioSourceDev::HandleVolumeChange(const AudioEvent &event)
570 {
571 DHLOGD("Start handle volume change.");
572 CHECK_NULL_RETURN(handler_, ERR_DH_AUDIO_NULLPTR);
573 auto eventParam = std::make_shared<AudioEvent>(event);
574 auto msgEvent = AppExecFwk::InnerEvent::Get(EVENT_VOLUME_CHANGE, eventParam, 0);
575 if (!handler_->SendEvent(msgEvent, 0, AppExecFwk::EventQueue::Priority::IMMEDIATE)) {
576 DHLOGE("Send event failed.");
577 return ERR_DH_AUDIO_FAILED;
578 }
579 DHLOGD("Volume change event is sent successfully.");
580 return DH_SUCCESS;
581 }
582
HandleFocusChange(const AudioEvent & event)583 int32_t DAudioSourceDev::HandleFocusChange(const AudioEvent &event)
584 {
585 DHLOGD("Start handle focus change.");
586 CHECK_NULL_RETURN(handler_, ERR_DH_AUDIO_NULLPTR);
587 auto eventParam = std::make_shared<AudioEvent>(event);
588 auto msgEvent = AppExecFwk::InnerEvent::Get(EVENT_AUDIO_FOCUS_CHANGE, eventParam, 0);
589 if (!handler_->SendEvent(msgEvent, 0, AppExecFwk::EventQueue::Priority::IMMEDIATE)) {
590 DHLOGE("Send event failed.");
591 return ERR_DH_AUDIO_FAILED;
592 }
593 DHLOGD("Focus change event is sent successfully.");
594 return DH_SUCCESS;
595 }
596
HandleRenderStateChange(const AudioEvent & event)597 int32_t DAudioSourceDev::HandleRenderStateChange(const AudioEvent &event)
598 {
599 DHLOGD("Start handle render state change.");
600 CHECK_NULL_RETURN(handler_, ERR_DH_AUDIO_NULLPTR);
601 auto eventParam = std::make_shared<AudioEvent>(event);
602 auto msgEvent = AppExecFwk::InnerEvent::Get(EVENT_AUDIO_RENDER_STATE_CHANGE, eventParam, 0);
603 if (!handler_->SendEvent(msgEvent, 0, AppExecFwk::EventQueue::Priority::IMMEDIATE)) {
604 DHLOGE("Send event failed.");
605 return ERR_DH_AUDIO_FAILED;
606 }
607 DHLOGD("Render state change event is sent successfully.");
608 return DH_SUCCESS;
609 }
610
HandlePlayStatusChange(const AudioEvent & event)611 int32_t DAudioSourceDev::HandlePlayStatusChange(const AudioEvent &event)
612 {
613 DHLOGD("Play status change, content: %{public}s.", event.content.c_str());
614 CHECK_NULL_RETURN(handler_, ERR_DH_AUDIO_NULLPTR);
615 auto eventParam = std::make_shared<AudioEvent>(event);
616 auto msgEvent = AppExecFwk::InnerEvent::Get(EVENT_CHANGE_PLAY_STATUS, eventParam, 0);
617 if (!handler_->SendEvent(msgEvent, 0, AppExecFwk::EventQueue::Priority::IMMEDIATE)) {
618 DHLOGE("Send event failed.");
619 return ERR_DH_AUDIO_FAILED;
620 }
621 DHLOGD("Play state change event is sent successfully.");
622 return DH_SUCCESS;
623 }
624
HandleSpkMmapStart(const AudioEvent & event)625 int32_t DAudioSourceDev::HandleSpkMmapStart(const AudioEvent &event)
626 {
627 DHLOGI("Spk mmap start, content: %{public}s.", event.content.c_str());
628 CHECK_NULL_RETURN(handler_, ERR_DH_AUDIO_NULLPTR);
629 auto eventParam = std::make_shared<AudioEvent>(event);
630 auto msgEvent = AppExecFwk::InnerEvent::Get(EVENT_MMAP_SPK_START, eventParam, 0);
631 if (!handler_->SendEvent(msgEvent, 0, AppExecFwk::EventQueue::Priority::IMMEDIATE)) {
632 DHLOGE("Send event failed.");
633 return ERR_DH_AUDIO_FAILED;
634 }
635 DHLOGD("Speaker Mmap Start event is sent successfully.");
636 return DH_SUCCESS;
637 }
638
HandleSpkMmapStop(const AudioEvent & event)639 int32_t DAudioSourceDev::HandleSpkMmapStop(const AudioEvent &event)
640 {
641 DHLOGI("Spk mmap stop, content: %{public}s.", event.content.c_str());
642 CHECK_NULL_RETURN(handler_, ERR_DH_AUDIO_NULLPTR);
643 auto eventParam = std::make_shared<AudioEvent>(event);
644 auto msgEvent = AppExecFwk::InnerEvent::Get(EVENT_MMAP_SPK_STOP, eventParam, 0);
645 if (!handler_->SendEvent(msgEvent, 0, AppExecFwk::EventQueue::Priority::IMMEDIATE)) {
646 DHLOGE("Send event failed.");
647 return ERR_DH_AUDIO_FAILED;
648 }
649 DHLOGD("Speaker Mmap Stop event is sent successfully.");
650 return DH_SUCCESS;
651 }
652
HandleMicMmapStart(const AudioEvent & event)653 int32_t DAudioSourceDev::HandleMicMmapStart(const AudioEvent &event)
654 {
655 DHLOGI("Mic mmap start, content: %{public}s.", event.content.c_str());
656 CHECK_NULL_RETURN(handler_, ERR_DH_AUDIO_NULLPTR);
657 auto eventParam = std::make_shared<AudioEvent>(event);
658 auto msgEvent = AppExecFwk::InnerEvent::Get(EVENT_MMAP_MIC_START, eventParam, 0);
659 if (!handler_->SendEvent(msgEvent, 0, AppExecFwk::EventQueue::Priority::IMMEDIATE)) {
660 DHLOGE("Send event failed.");
661 return ERR_DH_AUDIO_FAILED;
662 }
663 DHLOGD("Mic Mmap Start event is sent successfully.");
664 return DH_SUCCESS;
665 }
666
HandleMicMmapStop(const AudioEvent & event)667 int32_t DAudioSourceDev::HandleMicMmapStop(const AudioEvent &event)
668 {
669 DHLOGI("Mic mmap stop, content: %{public}s.", event.content.c_str());
670 CHECK_NULL_RETURN(handler_, ERR_DH_AUDIO_NULLPTR);
671 auto eventParam = std::make_shared<AudioEvent>(event);
672 auto msgEvent = AppExecFwk::InnerEvent::Get(EVENT_MMAP_MIC_STOP, eventParam, 0);
673 if (!handler_->SendEvent(msgEvent, 0, AppExecFwk::EventQueue::Priority::IMMEDIATE)) {
674 DHLOGE("Send event failed.");
675 return ERR_DH_AUDIO_FAILED;
676 }
677 DHLOGD("Mic Mmap Stop event is sent successfully.");
678 return DH_SUCCESS;
679 }
680
WaitForRPC(const AudioEventType type)681 int32_t DAudioSourceDev::WaitForRPC(const AudioEventType type)
682 {
683 std::unique_lock<std::mutex> lck(rpcWaitMutex_);
684 DHLOGI("Wait sink device notify type: %{public}d.", type);
685 auto status = rpcWaitCond_.wait_for(lck, std::chrono::seconds(RPC_WAIT_SECONDS), [this, type]() {
686 switch (type) {
687 case AudioEventType::NOTIFY_OPEN_SPEAKER_RESULT:
688 return rpcNotify_ == EVENT_NOTIFY_OPEN_SPK;
689 case AudioEventType::NOTIFY_CLOSE_SPEAKER_RESULT:
690 return rpcNotify_ == EVENT_NOTIFY_CLOSE_SPK;
691 case AudioEventType::NOTIFY_OPEN_MIC_RESULT:
692 return rpcNotify_ == EVENT_NOTIFY_OPEN_MIC;
693 case AudioEventType::NOTIFY_CLOSE_MIC_RESULT:
694 return rpcNotify_ == EVENT_NOTIFY_CLOSE_MIC;
695 case AudioEventType::NOTIFY_OPEN_CTRL_RESULT:
696 return rpcNotify_ == EVENT_NOTIFY_OPEN_CTRL;
697 case AudioEventType::NOTIFY_CLOSE_CTRL_RESULT:
698 return rpcNotify_ == EVENT_NOTIFY_CLOSE_CTRL;
699 default:
700 return false;
701 }
702 });
703 if (!status) {
704 DHLOGE("RPC notify wait timeout(%{public}ds).", RPC_WAIT_SECONDS);
705 return ERR_DH_AUDIO_SA_WAIT_TIMEOUT;
706 }
707 if (rpcResult_ != DH_SUCCESS) {
708 DHLOGE("RPC notify Result Failed.");
709 return rpcResult_;
710 }
711 rpcNotify_ = 0;
712 rpcResult_ = ERR_DH_AUDIO_FAILED;
713 DHLOGD("Receive sink device notify type: %{public}d.", type);
714 return DH_SUCCESS;
715 }
716
TaskEnableDAudio(const std::string & args)717 int32_t DAudioSourceDev::TaskEnableDAudio(const std::string &args)
718 {
719 DHLOGI("Enable audio device.");
720 if (args.length() > DAUDIO_MAX_JSON_LEN || args.empty()) {
721 return ERR_DH_AUDIO_SA_PARAM_INVALID;
722 }
723 cJSON *jParam = cJSON_Parse(args.c_str());
724 CHECK_NULL_RETURN(jParam, ERR_DH_AUDIO_NULLPTR);
725 if (!CJsonParamCheck(jParam, { KEY_DH_ID, KEY_ATTRS })) {
726 DHLOGE("The keys or values is invalid.");
727 cJSON_Delete(jParam);
728 return ERR_DH_AUDIO_SA_PARAM_INVALID;
729 }
730 int32_t dhId = ParseDhidFromEvent(args);
731 CHECK_AND_FREE_RETURN_RET_LOG(dhId == ERR_DH_AUDIO_FAILED, ERR_DH_AUDIO_NOT_SUPPORT,
732 jParam, "%{public}s", "Parse dhId error.");
733 char *attrs = cJSON_PrintUnformatted(cJSON_GetObjectItem(jParam, KEY_ATTRS));
734 CHECK_NULL_FREE_RETURN(attrs, ERR_DH_AUDIO_NULLPTR, jParam);
735 std::string attrsStr(attrs);
736 int32_t result = 0;
737 switch (GetDevTypeByDHId(dhId)) {
738 case AUDIO_DEVICE_TYPE_SPEAKER:
739 result = EnableDSpeaker(dhId, attrsStr);
740 break;
741 case AUDIO_DEVICE_TYPE_MIC:
742 result = EnableDMic(dhId, attrsStr);
743 break;
744 default:
745 DHLOGE("Unknown audio device. dhId: %{public}d.", dhId);
746 result = ERR_DH_AUDIO_NOT_SUPPORT;
747 }
748 cJSON_Delete(jParam);
749 cJSON_free(attrs);
750 return result;
751 }
752
EnableDSpeaker(const int32_t dhId,const std::string & attrs)753 int32_t DAudioSourceDev::EnableDSpeaker(const int32_t dhId, const std::string &attrs)
754 {
755 std::lock_guard<std::mutex> devLck(ioDevMtx_);
756 if (deviceMap_.find(dhId) != deviceMap_.end()) {
757 DHLOGI("The speaker device is enabled, enable it with new data this time.");
758 CHECK_NULL_RETURN(deviceMap_[dhId], ERR_DH_AUDIO_NULLPTR);
759 if (deviceMap_[dhId]->EnableDevice(dhId, attrs) != DH_SUCCESS) {
760 DHLOGI("Failed to enable speaker device with new data.");
761 return ERR_DH_AUDIO_FAILED;
762 }
763 return DH_SUCCESS;
764 }
765 auto speaker = std::make_shared<DSpeakerDev>(devId_, shared_from_this());
766 if (speaker->EnableDevice(dhId, attrs) != DH_SUCCESS) {
767 DHLOGI("Failed to enable speaker device first time.");
768 return ERR_DH_AUDIO_FAILED;
769 }
770 deviceMap_[dhId] = speaker;
771 return DH_SUCCESS;
772 }
773
EnableDMic(const int32_t dhId,const std::string & attrs)774 int32_t DAudioSourceDev::EnableDMic(const int32_t dhId, const std::string &attrs)
775 {
776 std::lock_guard<std::mutex> devLck(ioDevMtx_);
777 if (deviceMap_.find(dhId) != deviceMap_.end()) {
778 DHLOGI("The mic device is enabled, enable it with new data this time.");
779 CHECK_NULL_RETURN(deviceMap_[dhId], ERR_DH_AUDIO_NULLPTR);
780 if (deviceMap_[dhId]->EnableDevice(dhId, attrs) != DH_SUCCESS) {
781 DHLOGI("Failed to enable mic device with new data.");
782 return ERR_DH_AUDIO_FAILED;
783 }
784 return DH_SUCCESS;
785 }
786 auto mic = std::make_shared<DMicDev>(devId_, shared_from_this());
787 if (mic->EnableDevice(dhId, attrs) != DH_SUCCESS) {
788 DHLOGI("Failed to enable mic device first time.");
789 return ERR_DH_AUDIO_FAILED;
790 }
791 deviceMap_[dhId] = mic;
792 return DH_SUCCESS;
793 }
794
OnEnableTaskResult(int32_t resultCode,const std::string & result,const std::string & funcName)795 void DAudioSourceDev::OnEnableTaskResult(int32_t resultCode, const std::string &result, const std::string &funcName)
796 {
797 (void)funcName;
798 DHLOGI("On enable task result.");
799 CHECK_NULL_VOID(mgrCallback_);
800 if (result.length() > DAUDIO_MAX_JSON_LEN || result.empty()) {
801 return;
802 }
803 cJSON *jParam = cJSON_Parse(result.c_str());
804 CHECK_NULL_VOID(jParam);
805 if (!CJsonParamCheck(jParam, { KEY_DEV_ID, KEY_DH_ID })) {
806 DHLOGE("Not found the keys.");
807 cJSON_Delete(jParam);
808 return;
809 }
810 mgrCallback_->OnEnableAudioResult(std::string(cJSON_GetObjectItem(jParam, KEY_DEV_ID)->valuestring),
811 std::string(cJSON_GetObjectItem(jParam, KEY_DH_ID)->valuestring), resultCode);
812 cJSON_Delete(jParam);
813 }
814
TaskDisableDAudio(const std::string & args)815 int32_t DAudioSourceDev::TaskDisableDAudio(const std::string &args)
816 {
817 DHLOGI("Task disable daudio.");
818 if (args.length() > DAUDIO_MAX_JSON_LEN || args.empty()) {
819 return ERR_DH_AUDIO_SA_PARAM_INVALID;
820 }
821 int32_t dhId = ParseDhidFromEvent(args);
822 if (dhId == ERR_DH_AUDIO_FAILED) {
823 DHLOGE("Parse dhId error. hdId: %{public}d.", dhId);
824 return ERR_DH_AUDIO_NULLPTR;
825 }
826
827 DHLOGI("Parsed dhId = %{public}d", dhId);
828 switch (GetDevTypeByDHId(dhId)) {
829 case AUDIO_DEVICE_TYPE_SPEAKER:
830 return DisableDSpeaker(dhId);
831 case AUDIO_DEVICE_TYPE_MIC:
832 return DisableDMic(dhId);
833 default:
834 DHLOGE("Unknown audio device. hdId: %{public}d.", dhId);
835 return ERR_DH_AUDIO_NOT_SUPPORT;
836 }
837 }
838
DisableDSpeaker(const int32_t dhId)839 int32_t DAudioSourceDev::DisableDSpeaker(const int32_t dhId)
840 {
841 std::lock_guard<std::mutex> devLck(ioDevMtx_);
842 if (deviceMap_.find(dhId) == deviceMap_.end()) {
843 DHLOGI("The speaker device is already disabled.");
844 return DH_SUCCESS;
845 }
846 auto ioDev = deviceMap_[dhId];
847 CHECK_NULL_RETURN(ioDev, ERR_DH_AUDIO_NULLPTR);
848 return ioDev->DisableDevice(dhId);
849 }
850
DisableDMic(const int32_t dhId)851 int32_t DAudioSourceDev::DisableDMic(const int32_t dhId)
852 {
853 std::lock_guard<std::mutex> devLck(ioDevMtx_);
854 if (deviceMap_.find(dhId) == deviceMap_.end()) {
855 DHLOGI("The mic device is already disabled.");
856 return DH_SUCCESS;
857 }
858 auto ioDev = deviceMap_[dhId];
859 CHECK_NULL_RETURN(ioDev, ERR_DH_AUDIO_NULLPTR);
860 return ioDev->DisableDevice(dhId);
861 }
862
OnDisableTaskResult(int32_t resultCode,const std::string & result,const std::string & funcName)863 void DAudioSourceDev::OnDisableTaskResult(int32_t resultCode, const std::string &result, const std::string &funcName)
864 {
865 (void)funcName;
866 DHLOGI("On disable task result.");
867 CHECK_NULL_VOID(mgrCallback_);
868 if (result.length() > DAUDIO_MAX_JSON_LEN || result.empty()) {
869 return;
870 }
871 cJSON *jParam = cJSON_Parse(result.c_str());
872 CHECK_NULL_VOID(jParam);
873 if (!CJsonParamCheck(jParam, { KEY_DEV_ID, KEY_DH_ID })) {
874 DHLOGE("Not found the keys.");
875 cJSON_Delete(jParam);
876 return;
877 }
878 mgrCallback_->OnDisableAudioResult(std::string(cJSON_GetObjectItem(jParam, KEY_DEV_ID)->valuestring),
879 std::string(cJSON_GetObjectItem(jParam, KEY_DH_ID)->valuestring), resultCode);
880 cJSON_Delete(jParam);
881 }
882
NotifyFwkRunning(const std::string & devId,const std::string & dhId)883 void DAudioSourceDev::NotifyFwkRunning(const std::string &devId, const std::string &dhId)
884 {
885 DAudioSourceManager::GetInstance().OnHardwareStateChanged(devId, dhId, DaudioBusinessState::RUNNING);
886 if (!isFull_.load()) {
887 DAudioSourceManager::GetInstance().OnDataSyncTrigger(devId);
888 }
889 }
890
NotifyFwkIdle(const std::string & devId,const std::string & dhId)891 void DAudioSourceDev::NotifyFwkIdle(const std::string &devId, const std::string &dhId)
892 {
893 DAudioSourceManager::GetInstance().OnHardwareStateChanged(devId, dhId, DaudioBusinessState::IDLE);
894 }
895
CreateSpkEngine(std::shared_ptr<DAudioIoDev> speaker)896 int32_t DAudioSourceDev::CreateSpkEngine(std::shared_ptr<DAudioIoDev> speaker)
897 {
898 CHECK_NULL_RETURN(speaker, ERR_DH_AUDIO_NULLPTR);
899 int32_t ret = speaker->InitSenderEngine(DAudioSourceManager::GetInstance().getSenderProvider());
900 DaudioRadar::GetInstance().ReportSpeakerOpenProgress("InitSenderEngine", SpeakerOpen::INIT_ENGINE, ret);
901 if (ret != DH_SUCCESS) {
902 DHLOGE("Speaker init sender Engine, error code %{public}d.", ret);
903 return ret;
904 }
905 ret = speaker->InitCtrlTrans();
906 DaudioRadar::GetInstance().ReportSpeakerOpenProgress("InitCtrlTrans", SpeakerOpen::TRANS_CONTROL, ret);
907 if (ret != DH_SUCCESS) {
908 DHLOGE("Speaker InitCtrlTrans, error code %{public}d.", ret);
909 return ret;
910 }
911 ret = WaitForRPC(NOTIFY_OPEN_CTRL_RESULT);
912 if (ret != DH_SUCCESS) {
913 DHLOGE("Speaker init sender engine, create ctrl error.");
914 return ret;
915 }
916 return DH_SUCCESS;
917 }
918
TaskOpenDSpeaker(const std::string & args)919 int32_t DAudioSourceDev::TaskOpenDSpeaker(const std::string &args)
920 {
921 DAudioHitrace trace("DAudioSourceDev::TaskOpenDSpeaker");
922 DHLOGI("Task open speaker args: %{public}s.", args.c_str());
923 if (args.length() > DAUDIO_MAX_JSON_LEN || args.empty()) {
924 DHLOGE("args length error. 0 or max.");
925 return ERR_DH_AUDIO_SA_PARAM_INVALID;
926 }
927 int32_t dhId = ParseDhidFromEvent(args);
928 if (dhId == ERR_DH_AUDIO_FAILED) {
929 return ERR_DH_AUDIO_FAILED;
930 }
931 auto speaker = FindIoDevImpl(args);
932 if (speaker == nullptr) {
933 DHLOGE("The IO device is invaild.");
934 NotifyHDF(NOTIFY_OPEN_SPEAKER_RESULT, HDF_EVENT_RESULT_FAILED, dhId);
935 return ERR_DH_AUDIO_NULLPTR;
936 }
937 int32_t ret = CreateSpkEngine(speaker);
938 if (ret != DH_SUCCESS) {
939 DHLOGE("Create speaker engine failed.");
940 NotifyHDF(NOTIFY_OPEN_SPEAKER_RESULT, HDF_EVENT_INIT_ENGINE_FAILED, dhId);
941 return ret;
942 }
943 cJSON *jAudioParam = cJSON_CreateObject();
944 CHECK_NULL_RETURN(jAudioParam, ERR_DH_AUDIO_NULLPTR);
945 to_json(jAudioParam, speaker->GetAudioParam());
946 std::string dhIdString = std::to_string(dhId);
947 ret = NotifySinkDev(OPEN_SPEAKER, jAudioParam, dhIdString);
948 if (ret != DH_SUCCESS) {
949 DHLOGE("Notify sink open speaker failed, error code %{public}d.", ret);
950 cJSON_Delete(jAudioParam);
951 NotifyHDF(NOTIFY_OPEN_SPEAKER_RESULT, HDF_EVENT_NOTIFY_SINK_FAILED, dhId);
952 return ret;
953 }
954 ret = OpenDSpeakerInner(speaker, dhId);
955 if (ret != DH_SUCCESS) {
956 cJSON_Delete(jAudioParam);
957 DHLOGE("Task Open DSpeaker Execute failed, error code %{public}d.", ret);
958 return ret;
959 }
960 NotifyFwkRunning(devId_, std::to_string(dhId));
961 cJSON_Delete(jAudioParam);
962 return DH_SUCCESS;
963 }
964
ParseDhidFromEvent(std::string args)965 int32_t DAudioSourceDev::ParseDhidFromEvent(std::string args)
966 {
967 cJSON *jParam = cJSON_Parse(args.c_str());
968 CHECK_NULL_RETURN(jParam, ERR_DH_AUDIO_FAILED);
969 if (!CJsonParamCheck(jParam, { KEY_DH_ID })) {
970 DHLOGE("Not found the keys of dhId.");
971 cJSON_Delete(jParam);
972 return ERR_DH_AUDIO_FAILED;
973 }
974 cJSON *dhIdItem = cJSON_GetObjectItem(jParam, KEY_DH_ID);
975 if (dhIdItem == NULL || !cJSON_IsString(dhIdItem)) {
976 DHLOGE("Not found the keys of dhId.");
977 cJSON_Delete(jParam);
978 return ERR_DH_AUDIO_FAILED;
979 }
980 int32_t dhId = ConvertString2Int(std::string(dhIdItem->valuestring));
981 cJSON_Delete(jParam);
982 DHLOGD("Parsed dhId is: %{public}d.", dhId);
983 return dhId;
984 }
985
ConvertString2Int(std::string val)986 int32_t DAudioSourceDev::ConvertString2Int(std::string val)
987 {
988 if (!CheckIsNum(val)) {
989 DHLOGE("String is not number. str:%{public}s.", val.c_str());
990 return ERR_DH_AUDIO_FAILED;
991 }
992 return std::atoi(val.c_str());
993 }
994
OpenDSpeakerInner(std::shared_ptr<DAudioIoDev> & speaker,const int32_t dhId)995 int32_t DAudioSourceDev::OpenDSpeakerInner(std::shared_ptr<DAudioIoDev> &speaker, const int32_t dhId)
996 {
997 CHECK_NULL_RETURN(speaker, ERR_DH_AUDIO_NULLPTR);
998 int32_t ret = speaker->SetUp();
999 if (ret != DH_SUCCESS) {
1000 DHLOGE("Speaker setup failed, error code %{public}d.", ret);
1001 NotifyHDF(NOTIFY_OPEN_SPEAKER_RESULT, HDF_EVENT_TRANS_SETUP_FAILED, dhId);
1002 return ret;
1003 }
1004 ret = speaker->Start();
1005 DaudioRadar::GetInstance().ReportSpeakerOpen("Start", SpeakerOpen::NOTIFY_HDF,
1006 BizState::BIZ_STATE_END, ret);
1007 if (ret != DH_SUCCESS) {
1008 DHLOGE("Speaker start failed, error code %{public}d.", ret);
1009 speaker->Stop();
1010 speaker->Release();
1011 NotifyHDF(NOTIFY_OPEN_SPEAKER_RESULT, HDF_EVENT_TRANS_START_FAILED, dhId);
1012 return ret;
1013 }
1014 NotifyHDF(NOTIFY_OPEN_SPEAKER_RESULT, HDF_EVENT_RESULT_SUCCESS, dhId);
1015 return DH_SUCCESS;
1016 }
1017
CloseSpkNew(const std::string & args)1018 int32_t DAudioSourceDev::CloseSpkNew(const std::string &args)
1019 {
1020 DHLOGI("Close speaker new");
1021 cJSON *jAudioParam = nullptr;
1022 int32_t dhId = ParseDhidFromEvent(args);
1023 CHECK_AND_RETURN_RET_LOG(dhId == ERR_DH_AUDIO_FAILED, ERR_DH_AUDIO_NULLPTR,
1024 "%{public}s", "Parse dhId error.");
1025 NotifySinkDev(CLOSE_SPEAKER, jAudioParam, std::to_string(dhId));
1026 bool closeStatus = true;
1027 auto speaker = FindIoDevImpl(args);
1028 CHECK_NULL_RETURN(speaker, ERR_DH_AUDIO_NULLPTR);
1029 if (speaker->Stop() != DH_SUCCESS) {
1030 DHLOGE("Speaker stop failed.");
1031 closeStatus = false;
1032 }
1033 if (speaker->Release() != DH_SUCCESS) {
1034 DHLOGE("Speaker release failed.");
1035 closeStatus = false;
1036 }
1037 if (!closeStatus) {
1038 return ERR_DH_AUDIO_FAILED;
1039 }
1040 return DH_SUCCESS;
1041 }
1042
TaskCloseDSpeaker(const std::string & args)1043 int32_t DAudioSourceDev::TaskCloseDSpeaker(const std::string &args)
1044 {
1045 DHLOGI("Task close speaker, args: %{public}s.", args.c_str());
1046 int32_t dhId = ParseDhidFromEvent(args);
1047 if (dhId == ERR_DH_AUDIO_FAILED) {
1048 DHLOGE("Failed to parse dhardware id.");
1049 return ERR_DH_AUDIO_FAILED;
1050 }
1051 auto speaker = FindIoDevImpl(args);
1052 if (speaker == nullptr) {
1053 DHLOGE("Speaker already closed.");
1054 NotifyHDF(NOTIFY_CLOSE_SPEAKER_RESULT, HDF_EVENT_RESULT_SUCCESS, dhId);
1055 return DH_SUCCESS;
1056 }
1057 if (args.length() > DAUDIO_MAX_JSON_LEN || args.empty()) {
1058 DHLOGE("args length error.");
1059 NotifyHDF(NOTIFY_CLOSE_SPEAKER_RESULT, HDF_EVENT_RESULT_FAILED, dhId);
1060 return ERR_DH_AUDIO_SA_PARAM_INVALID;
1061 }
1062 int32_t ret = CloseSpkNew(args);
1063 DaudioRadar::GetInstance().ReportSpeakerClose("CloseSpkNew", SpeakerClose::NOTIFY_HDF,
1064 BizState::BIZ_STATE_END, ret);
1065 if (ret != DH_SUCCESS) {
1066 DHLOGE("Close spk failed.");
1067 NotifyHDF(NOTIFY_CLOSE_SPEAKER_RESULT, HDF_EVENT_RESULT_FAILED, dhId);
1068 return ret;
1069 }
1070 NotifyHDF(NOTIFY_CLOSE_SPEAKER_RESULT, HDF_EVENT_RESULT_SUCCESS, dhId);
1071 NotifyFwkIdle(devId_, std::to_string(dhId));
1072 return DH_SUCCESS;
1073 }
1074
CreateMicEngine(std::shared_ptr<DAudioIoDev> mic)1075 int32_t DAudioSourceDev::CreateMicEngine(std::shared_ptr<DAudioIoDev> mic)
1076 {
1077 if (mic == nullptr) {
1078 DHLOGE("Mic device not init");
1079 return ERR_DH_AUDIO_NULLPTR;
1080 }
1081 int32_t ret = mic->InitReceiverEngine(DAudioSourceManager::GetInstance().getReceiverProvider());
1082 DaudioRadar::GetInstance().ReportMicOpenProgress("InitReceiverEngine", MicOpen::INIT_ENGINE, ret);
1083 if (ret != DH_SUCCESS) {
1084 DHLOGE("Init receiver engine failed.");
1085 return ret;
1086 }
1087 ret = mic->InitCtrlTrans();
1088 DaudioRadar::GetInstance().ReportMicOpenProgress("InitCtrlTrans", MicOpen::TRANS_CONTROL, ret);
1089 if (ret != DH_SUCCESS) {
1090 DHLOGE("mic InitCtrlTrans, error code %{public}d.", ret);
1091 return ret;
1092 }
1093 ret = WaitForRPC(NOTIFY_OPEN_CTRL_RESULT);
1094 if (ret != DH_SUCCESS) {
1095 DHLOGE("Mic init sender engine, create ctrl error.");
1096 return ret;
1097 }
1098 ret = mic->SetUp();
1099 if (ret != DH_SUCCESS) {
1100 DHLOGE("Mic setup failed.");
1101 return ret;
1102 }
1103 return DH_SUCCESS;
1104 }
1105
TaskOpenDMic(const std::string & args)1106 int32_t DAudioSourceDev::TaskOpenDMic(const std::string &args)
1107 {
1108 DHLOGI("Task open mic, args: %{public}s.", args.c_str());
1109 if (args.length() > DAUDIO_MAX_JSON_LEN || args.empty()) {
1110 return ERR_DH_AUDIO_SA_PARAM_INVALID;
1111 }
1112 int32_t dhId = ParseDhidFromEvent(args);
1113 CHECK_AND_RETURN_RET_LOG(dhId == ERR_DH_AUDIO_FAILED, ERR_DH_AUDIO_FAILED,
1114 "%{public}s", "Failed to parse dhardware id.");
1115 auto mic = FindIoDevImpl(args);
1116 if (mic == nullptr) {
1117 DHLOGE("Mic device not init");
1118 NotifyHDF(NOTIFY_OPEN_MIC_RESULT, HDF_EVENT_RESULT_FAILED, dhId);
1119 return ERR_DH_AUDIO_NULLPTR;
1120 }
1121 int32_t ret = CreateMicEngine(mic);
1122 if (ret != DH_SUCCESS) {
1123 DHLOGE("Create mic engine failed.");
1124 NotifyHDF(NOTIFY_OPEN_MIC_RESULT, HDF_EVENT_INIT_ENGINE_FAILED, dhId);
1125 return ret;
1126 }
1127 cJSON *jAudioParam = cJSON_CreateObject();
1128 CHECK_NULL_RETURN(jAudioParam, ERR_DH_AUDIO_NULLPTR);
1129 to_json(jAudioParam, mic->GetAudioParam());
1130 ret = NotifySinkDev(OPEN_MIC, jAudioParam, std::to_string(dhId));
1131 if (ret != DH_SUCCESS) {
1132 DHLOGE("Notify sink open mic failed, error code %{public}d.", ret);
1133 mic->Release();
1134 NotifyHDF(NOTIFY_OPEN_MIC_RESULT, HDF_EVENT_NOTIFY_SINK_FAILED, dhId);
1135 cJSON_Delete(jAudioParam);
1136 return ret;
1137 }
1138 ret = mic->Start();
1139 DaudioRadar::GetInstance().ReportMicOpen("Start", MicOpen::NOTIFY_HDF,
1140 BizState::BIZ_STATE_END, ret);
1141 if (ret != DH_SUCCESS) {
1142 DHLOGE("Mic start failed, error code %{public}d.", ret);
1143 mic->Stop();
1144 mic->Release();
1145 NotifyHDF(NOTIFY_OPEN_MIC_RESULT, HDF_EVENT_TRANS_START_FAILED, dhId);
1146 cJSON_Delete(jAudioParam);
1147 return ret;
1148 }
1149 NotifyHDF(NOTIFY_OPEN_MIC_RESULT, HDF_EVENT_RESULT_SUCCESS, dhId);
1150 NotifyFwkRunning(devId_, std::to_string(dhId));
1151 cJSON_Delete(jAudioParam);
1152 return DH_SUCCESS;
1153 }
1154
CloseMicNew(const std::string & args)1155 int32_t DAudioSourceDev::CloseMicNew(const std::string &args)
1156 {
1157 DHLOGI("Close mic new.");
1158 cJSON *jAudioParam = nullptr;
1159 int32_t dhId = ParseDhidFromEvent(args);
1160 CHECK_AND_RETURN_RET_LOG(dhId == ERR_DH_AUDIO_FAILED, ERR_DH_AUDIO_NULLPTR,
1161 "%{public}s", "Parse dhId error.");
1162 NotifySinkDev(CLOSE_MIC, jAudioParam, std::to_string(dhId));
1163
1164 auto mic = FindIoDevImpl(args);
1165 CHECK_NULL_RETURN(mic, DH_SUCCESS);
1166 if (mic->Stop() != DH_SUCCESS || mic->Release() != DH_SUCCESS) {
1167 return ERR_DH_AUDIO_FAILED;
1168 }
1169 return DH_SUCCESS;
1170 }
1171
TaskCloseDMic(const std::string & args)1172 int32_t DAudioSourceDev::TaskCloseDMic(const std::string &args)
1173 {
1174 DHLOGI("Task close mic, args: %{public}s.", args.c_str());
1175 if (args.length() > DAUDIO_MAX_JSON_LEN || args.empty()) {
1176 DHLOGE("Args length err. 0 or max.");
1177 return ERR_DH_AUDIO_SA_PARAM_INVALID;
1178 }
1179 int32_t dhId = ParseDhidFromEvent(args);
1180 if (dhId == ERR_DH_AUDIO_FAILED) {
1181 DHLOGE("Failed to parse dhardware id.");
1182 return ERR_DH_AUDIO_FAILED;
1183 }
1184 auto mic = FindIoDevImpl(args);
1185 if (mic == nullptr) {
1186 DHLOGE("Mic device already closed.");
1187 NotifyHDF(NOTIFY_CLOSE_MIC_RESULT, HDF_EVENT_RESULT_SUCCESS, dhId);
1188 return DH_SUCCESS;
1189 }
1190 int32_t ret = CloseMicNew(args);
1191 DaudioRadar::GetInstance().ReportMicClose("CloseMicNew", MicClose::NOTIFY_HDF,
1192 BizState::BIZ_STATE_END, ret);
1193 if (ret != DH_SUCCESS) {
1194 DHLOGE("Task close mic error.");
1195 NotifyHDF(NOTIFY_CLOSE_MIC_RESULT, HDF_EVENT_RESULT_FAILED, dhId);
1196 return ret;
1197 }
1198 NotifyHDF(NOTIFY_CLOSE_MIC_RESULT, HDF_EVENT_RESULT_SUCCESS, dhId);
1199 NotifyFwkIdle(devId_, std::to_string(dhId));
1200 return DH_SUCCESS;
1201 }
1202
TaskDMicClosed(const std::string & args)1203 int32_t DAudioSourceDev::TaskDMicClosed(const std::string &args)
1204 {
1205 DHLOGI("Task dmic closed, args: %{public}s.", args.c_str());
1206 if (args.length() > DAUDIO_MAX_JSON_LEN || args.empty()) {
1207 DHLOGE("Args length err. 0 or max.");
1208 return ERR_DH_AUDIO_SA_PARAM_INVALID;
1209 }
1210 int32_t dhId = ParseDhidFromEvent(args);
1211 if (dhId == ERR_DH_AUDIO_FAILED) {
1212 DHLOGE("Failed to parse dhardware id.");
1213 return ERR_DH_AUDIO_FAILED;
1214 }
1215 auto mic = FindIoDevImpl(args);
1216 CHECK_NULL_RETURN(mic, DH_SUCCESS);
1217 AudioEvent event(MIC_CLOSED, args);
1218 return mic->NotifyHdfAudioEvent(event, dhId);
1219 }
1220
TaskSetVolume(const std::string & args)1221 int32_t DAudioSourceDev::TaskSetVolume(const std::string &args)
1222 {
1223 DHLOGD("Task set volume, args: %{public}s.", args.c_str());
1224 AudioEvent event(getEventTypeFromArgs(args), args);
1225 return SendAudioEventToRemote(event);
1226 }
1227
TaskChangeVolume(const std::string & args)1228 int32_t DAudioSourceDev::TaskChangeVolume(const std::string &args)
1229 {
1230 DHLOGD("Task change volume, args: %{public}s.", args.c_str());
1231 cJSON *jParam = cJSON_Parse(args.c_str());
1232 CHECK_NULL_RETURN(jParam, ERR_DH_AUDIO_NULLPTR);
1233 if (!CJsonParamCheck(jParam, { KEY_DH_ID })) {
1234 DHLOGE("Not found the keys of dhId.");
1235 cJSON_Delete(jParam);
1236 return ERR_DH_AUDIO_FAILED;
1237 }
1238 cJSON *dhIdItem = cJSON_GetObjectItem(jParam, KEY_DH_ID);
1239 if (dhIdItem == NULL || !cJSON_IsString(dhIdItem)) {
1240 DHLOGE("Not found the keys of dhId.");
1241 cJSON_Delete(jParam);
1242 return ERR_DH_AUDIO_FAILED;
1243 }
1244 int32_t dhId = ConvertString2Int(std::string(dhIdItem->valuestring));
1245 cJSON_Delete(jParam);
1246 return NotifyHDF(AudioEventType::VOLUME_CHANGE, args, dhId);
1247 }
1248
TaskChangeFocus(const std::string & args)1249 int32_t DAudioSourceDev::TaskChangeFocus(const std::string &args)
1250 {
1251 DHLOGD("Task change focus, args: %{public}s.", args.c_str());
1252 int32_t dhId = ParseDhidFromEvent(args);
1253 if (dhId == ERR_DH_AUDIO_FAILED) {
1254 DHLOGE("Failed to parse dhardware id.");
1255 return ERR_DH_AUDIO_FAILED;
1256 }
1257 return NotifyHDF(AudioEventType::AUDIO_FOCUS_CHANGE, args, dhId);
1258 }
1259
TaskChangeRenderState(const std::string & args)1260 int32_t DAudioSourceDev::TaskChangeRenderState(const std::string &args)
1261 {
1262 DHLOGD("Task change render state, args: %{public}s.", args.c_str());
1263 cJSON *jParam = cJSON_Parse(args.c_str());
1264 CHECK_NULL_RETURN(jParam, ERR_DH_AUDIO_NULLPTR);
1265
1266 if (!CJsonParamCheck(jParam, { KEY_DH_ID })) {
1267 DHLOGE("Not found the keys of dhId.");
1268 cJSON_Delete(jParam);
1269 return ERR_DH_AUDIO_FAILED;
1270 }
1271 cJSON *dhIdItem = cJSON_GetObjectItem(jParam, KEY_DH_ID);
1272 if (dhIdItem == NULL || !cJSON_IsString(dhIdItem)) {
1273 DHLOGE("Not found the keys of dhId.");
1274 cJSON_Delete(jParam);
1275 return ERR_DH_AUDIO_FAILED;
1276 }
1277 int32_t dhId = ConvertString2Int(std::string(dhIdItem->valuestring));
1278 cJSON_Delete(jParam);
1279 return NotifyHDF(AudioEventType::AUDIO_RENDER_STATE_CHANGE, args, dhId);
1280 }
1281
TaskPlayStatusChange(const std::string & args)1282 int32_t DAudioSourceDev::TaskPlayStatusChange(const std::string &args)
1283 {
1284 DHLOGD("Task play status change, content: %{public}s.", args.c_str());
1285 AudioEvent audioEvent(CHANGE_PLAY_STATUS, args);
1286 if (SendAudioEventToRemote(audioEvent) != DH_SUCCESS) {
1287 DHLOGE("Task Play status change failed.");
1288 return ERR_DH_AUDIO_FAILED;
1289 }
1290 auto speaker = FindIoDevImpl(args);
1291 CHECK_NULL_RETURN(speaker, ERR_DH_AUDIO_NULLPTR);
1292
1293 std::string changeType = ParseStringFromArgs(args, KEY_CHANGE_TYPE);
1294 if (changeType == AUDIO_EVENT_RESTART) {
1295 if (speaker->Restart() != DH_SUCCESS) {
1296 DHLOGE("Speaker restart failed.");
1297 return ERR_DH_AUDIO_FAILED;
1298 }
1299 } else if (changeType == AUDIO_EVENT_PAUSE) {
1300 if (speaker->Pause() != DH_SUCCESS) {
1301 DHLOGE("Speaker Pause failed.");
1302 return ERR_DH_AUDIO_FAILED;
1303 }
1304 } else {
1305 DHLOGE("Play status error.");
1306 return ERR_DH_AUDIO_FAILED;
1307 }
1308 return DH_SUCCESS;
1309 }
1310
SendAudioEventToRemote(const AudioEvent & event)1311 int32_t DAudioSourceDev::SendAudioEventToRemote(const AudioEvent &event)
1312 {
1313 // because: type: CHANGE_PLAY_STATUS / VOLUME_MUTE_SET / VOLUME_SET, so speaker
1314 std::shared_ptr<DAudioIoDev> speaker = nullptr;
1315 if (event.type == VOLUME_SET || event.type == VOLUME_MUTE_SET) {
1316 int32_t dhId = 0;
1317 if (GetAudioParamInt(event.content, "dhId", dhId) != DH_SUCCESS) {
1318 DHLOGE("Get key of dhId failed.");
1319 return ERR_DH_AUDIO_FAILED;
1320 }
1321 std::lock_guard<std::mutex> devLck(ioDevMtx_);
1322 speaker = deviceMap_[dhId];
1323 } else {
1324 speaker = FindIoDevImpl(event.content);
1325 }
1326
1327 CHECK_NULL_RETURN(speaker, ERR_DH_AUDIO_NULLPTR);
1328 int32_t ret = speaker->SendMessage(static_cast<uint32_t>(event.type),
1329 event.content, devId_);
1330 if (ret != DH_SUCCESS) {
1331 DHLOGE("Task send message to remote failed.");
1332 return ERR_DH_AUDIO_NULLPTR;
1333 }
1334 return DH_SUCCESS;
1335 }
1336
TaskSpkMmapStart(const std::string & args)1337 int32_t DAudioSourceDev::TaskSpkMmapStart(const std::string &args)
1338 {
1339 DHLOGI("Task spk mmap start, content: %{public}s.", args.c_str());
1340 auto speaker = FindIoDevImpl(args);
1341 CHECK_NULL_RETURN(speaker, ERR_DH_AUDIO_NULLPTR);
1342 int32_t ret = speaker->MmapStart();
1343 if (ret != DH_SUCCESS) {
1344 DHLOGE("Task spk mmap start fail, error code: %{public}d.", ret);
1345 }
1346 return ret;
1347 }
1348
TaskSpkMmapStop(const std::string & args)1349 int32_t DAudioSourceDev::TaskSpkMmapStop(const std::string &args)
1350 {
1351 DHLOGI("Task spk mmap stop, content: %{public}s.", args.c_str());
1352 auto speaker = FindIoDevImpl(args);
1353 CHECK_NULL_RETURN(speaker, ERR_DH_AUDIO_NULLPTR);
1354 speaker->MmapStop();
1355 return DH_SUCCESS;
1356 }
1357
TaskMicMmapStart(const std::string & args)1358 int32_t DAudioSourceDev::TaskMicMmapStart(const std::string &args)
1359 {
1360 DHLOGI("Task mic mmap start, content: %{public}s.", args.c_str());
1361 auto mic = FindIoDevImpl(args);
1362 CHECK_NULL_RETURN(mic, ERR_DH_AUDIO_NULLPTR);
1363 int32_t ret = mic->MmapStart();
1364 if (ret != DH_SUCCESS) {
1365 DHLOGE("Task mic mmap start fail, error code: %{public}d.", ret);
1366 }
1367 return ret;
1368 }
1369
TaskMicMmapStop(const std::string & args)1370 int32_t DAudioSourceDev::TaskMicMmapStop(const std::string &args)
1371 {
1372 DHLOGI("Task mic mmap stop, content: %{public}s.", args.c_str());
1373 auto mic = FindIoDevImpl(args);
1374 CHECK_NULL_RETURN(mic, ERR_DH_AUDIO_NULLPTR);
1375 mic->MmapStop();
1376 return DH_SUCCESS;
1377 }
1378
OnTaskResult(int32_t resultCode,const std::string & result,const std::string & funcName)1379 void DAudioSourceDev::OnTaskResult(int32_t resultCode, const std::string &result, const std::string &funcName)
1380 {
1381 (void)resultCode;
1382 (void)result;
1383 (void)funcName;
1384 DHLOGD("OnTaskResult. resultcode: %{public}d, result: %{public}s, funcName: %{public}s", resultCode, result.c_str(),
1385 funcName.c_str());
1386 }
1387
NotifySinkDev(const AudioEventType type,const cJSON * Param,const std::string dhId)1388 int32_t DAudioSourceDev::NotifySinkDev(const AudioEventType type, const cJSON *Param, const std::string dhId)
1389 {
1390 if (!isRpcOpen_.load()) {
1391 DHLOGE("Network connection failure, rpc is not open!");
1392 return ERR_DH_AUDIO_FAILED;
1393 }
1394
1395 std::random_device rd;
1396 const uint32_t randomTaskCode = rd();
1397 constexpr uint32_t eventOffset = 4;
1398 cJSON *jParam = cJSON_CreateObject();
1399 CHECK_NULL_RETURN(jParam, ERR_DH_AUDIO_NULLPTR);
1400 cJSON_AddStringToObject(jParam, KEY_DH_ID, dhId.c_str());
1401 cJSON_AddNumberToObject(jParam, KEY_EVENT_TYPE, static_cast<int32_t>(type));
1402 cJSON *jParamCopy = cJSON_Duplicate(Param, 1);
1403 cJSON_AddItemToObject(jParam, KEY_AUDIO_PARAM, jParamCopy);
1404 cJSON_AddStringToObject(jParam, KEY_RANDOM_TASK_CODE, std::to_string(randomTaskCode).c_str());
1405 DHLOGI("Notify sink dev, new engine, random task code:%{public}s", std::to_string(randomTaskCode).c_str());
1406
1407 std::lock_guard<std::mutex> devLck(ioDevMtx_);
1408 int32_t dhIdInt = ConvertString2Int(dhId);
1409 if (deviceMap_.find(dhIdInt) == deviceMap_.end()) {
1410 DHLOGE("speaker or mic dev is null. find index: %{public}d.", dhIdInt);
1411 cJSON_Delete(jParam);
1412 return ERR_DH_AUDIO_NULLPTR;
1413 }
1414 auto ioDev = deviceMap_[dhIdInt];
1415 if (type == OPEN_CTRL || type == CLOSE_CTRL) {
1416 DHLOGE("In new engine mode, ctrl is not allowed.");
1417 cJSON_Delete(jParam);
1418 return ERR_DH_AUDIO_NULLPTR;
1419 }
1420 char *content = cJSON_PrintUnformatted(jParam);
1421 if (content == nullptr) {
1422 DHLOGE("Failed to create JSON data");
1423 cJSON_Delete(jParam);
1424 return ERR_DH_AUDIO_NULLPTR;
1425 }
1426 if (ioDev == nullptr) {
1427 cJSON_Delete(jParam);
1428 cJSON_free(content);
1429 return ERR_DH_AUDIO_NULLPTR;
1430 }
1431 ioDev->SendMessage(static_cast<uint32_t>(type), std::string(content), devId_);
1432 if (type == CLOSE_SPEAKER || type == CLOSE_MIC) {
1433 // Close spk || Close mic do not need to wait RPC
1434 cJSON_Delete(jParam);
1435 cJSON_free(content);
1436 return DH_SUCCESS;
1437 }
1438 cJSON_Delete(jParam);
1439 cJSON_free(content);
1440 return WaitForRPC(static_cast<AudioEventType>(static_cast<int32_t>(type) + eventOffset));
1441 }
1442
NotifyHDF(const AudioEventType type,const std::string result,const int32_t dhId)1443 int32_t DAudioSourceDev::NotifyHDF(const AudioEventType type, const std::string result, const int32_t dhId)
1444 {
1445 DHLOGI("Notify HDF framework the result, event type: %{public}d; result: %{public}s.", type, result.c_str());
1446 std::lock_guard<std::mutex> devLck(ioDevMtx_);
1447 if (deviceMap_.find(dhId) == deviceMap_.end()) {
1448 DHLOGE("Speaker or mic dev is null. dhId: %{public}d", dhId);
1449 return ERR_DH_AUDIO_NULLPTR;
1450 }
1451 auto ioDev = deviceMap_[dhId];
1452 CHECK_NULL_RETURN(ioDev, ERR_DH_AUDIO_NULLPTR);
1453 AudioEvent event(type, result);
1454 switch (type) {
1455 case NOTIFY_OPEN_SPEAKER_RESULT:
1456 case NOTIFY_CLOSE_SPEAKER_RESULT:
1457 case VOLUME_CHANGE:
1458 case AUDIO_FOCUS_CHANGE:
1459 case AUDIO_RENDER_STATE_CHANGE:
1460 return ioDev->NotifyHdfAudioEvent(event, dhId);
1461 case NOTIFY_OPEN_MIC_RESULT:
1462 case NOTIFY_CLOSE_MIC_RESULT:
1463 return ioDev->NotifyHdfAudioEvent(event, dhId);
1464 default:
1465 DHLOGE("NotifyHDF unknown type.");
1466 return ERR_DH_AUDIO_FAILED;
1467 }
1468 return DH_SUCCESS;
1469 }
1470
getEventTypeFromArgs(const std::string & args)1471 AudioEventType DAudioSourceDev::getEventTypeFromArgs(const std::string &args)
1472 {
1473 std::string::size_type volume_mute_set = args.find(STREAM_MUTE_STATUS);
1474 if (volume_mute_set != std::string::npos) {
1475 return AudioEventType::VOLUME_MUTE_SET;
1476 }
1477 return AudioEventType::VOLUME_SET;
1478 }
1479
to_json(cJSON * j,const AudioParam & param)1480 void DAudioSourceDev::to_json(cJSON *j, const AudioParam ¶m)
1481 {
1482 CHECK_NULL_VOID(j);
1483 cJSON_AddNumberToObject(j, KEY_SAMPLING_RATE, param.comParam.sampleRate);
1484 cJSON_AddNumberToObject(j, KEY_FORMAT, param.comParam.bitFormat);
1485 cJSON_AddNumberToObject(j, KEY_CHANNELS, param.comParam.channelMask);
1486 cJSON_AddNumberToObject(j, KEY_FRAMESIZE, param.comParam.frameSize);
1487 cJSON_AddNumberToObject(j, KEY_CODEC_TYPE, param.comParam.codecType);
1488 cJSON_AddNumberToObject(j, KEY_CONTENT_TYPE, param.renderOpts.contentType);
1489 cJSON_AddNumberToObject(j, KEY_STREAM_USAGE, param.renderOpts.streamUsage);
1490 cJSON_AddNumberToObject(j, KEY_RENDER_FLAGS, param.renderOpts.renderFlags);
1491 cJSON_AddNumberToObject(j, KEY_CAPTURE_FLAGS, param.captureOpts.capturerFlags);
1492 cJSON_AddNumberToObject(j, KEY_SOURCE_TYPE, param.captureOpts.sourceType);
1493 }
1494
SourceEventHandler(const std::shared_ptr<AppExecFwk::EventRunner> & runner,const std::shared_ptr<DAudioSourceDev> & dev)1495 DAudioSourceDev::SourceEventHandler::SourceEventHandler(const std::shared_ptr<AppExecFwk::EventRunner> &runner,
1496 const std::shared_ptr<DAudioSourceDev> &dev) : AppExecFwk::EventHandler(runner), sourceDev_(dev)
1497 {
1498 DHLOGD("Event handler is constructing.");
1499 mapEventFuncs_[EVENT_DAUDIO_ENABLE] = &DAudioSourceDev::SourceEventHandler::EnableDAudioCallback;
1500 mapEventFuncs_[EVENT_DAUDIO_DISABLE] = &DAudioSourceDev::SourceEventHandler::DisableDAudioCallback;
1501 mapEventFuncs_[EVENT_OPEN_SPEAKER] = &DAudioSourceDev::SourceEventHandler::OpenDSpeakerCallback;
1502 mapEventFuncs_[EVENT_CLOSE_SPEAKER] = &DAudioSourceDev::SourceEventHandler::CloseDSpeakerCallback;
1503 mapEventFuncs_[EVENT_OPEN_MIC] = &DAudioSourceDev::SourceEventHandler::OpenDMicCallback;
1504 mapEventFuncs_[EVENT_CLOSE_MIC] = &DAudioSourceDev::SourceEventHandler::CloseDMicCallback;
1505 mapEventFuncs_[EVENT_DMIC_CLOSED] = &DAudioSourceDev::SourceEventHandler::DMicClosedCallback;
1506 mapEventFuncs_[EVENT_VOLUME_SET] = &DAudioSourceDev::SourceEventHandler::SetVolumeCallback;
1507 mapEventFuncs_[EVENT_VOLUME_CHANGE] = &DAudioSourceDev::SourceEventHandler::ChangeVolumeCallback;
1508 mapEventFuncs_[EVENT_AUDIO_FOCUS_CHANGE] = &DAudioSourceDev::SourceEventHandler::ChangeFocusCallback;
1509 mapEventFuncs_[EVENT_AUDIO_RENDER_STATE_CHANGE] = &DAudioSourceDev::SourceEventHandler::ChangeRenderStateCallback;
1510 mapEventFuncs_[EVENT_CHANGE_PLAY_STATUS] = &DAudioSourceDev::SourceEventHandler::PlayStatusChangeCallback;
1511 mapEventFuncs_[EVENT_MMAP_SPK_START] = &DAudioSourceDev::SourceEventHandler::SpkMmapStartCallback;
1512 mapEventFuncs_[EVENT_MMAP_SPK_STOP] = &DAudioSourceDev::SourceEventHandler::SpkMmapStopCallback;
1513 mapEventFuncs_[EVENT_MMAP_MIC_START] = &DAudioSourceDev::SourceEventHandler::MicMmapStartCallback;
1514 mapEventFuncs_[EVENT_MMAP_MIC_STOP] = &DAudioSourceDev::SourceEventHandler::MicMmapStopCallback;
1515 }
1516
~SourceEventHandler()1517 DAudioSourceDev::SourceEventHandler::~SourceEventHandler() {}
1518
ProcessEventInner(const AppExecFwk::InnerEvent::Pointer & event)1519 void DAudioSourceDev::SourceEventHandler::ProcessEventInner(const AppExecFwk::InnerEvent::Pointer &event)
1520 {
1521 CHECK_NULL_VOID(event);
1522 switch (event->GetInnerEventId()) {
1523 case EVENT_VOLUME_SET:
1524 SetVolumeCallback(event);
1525 break;
1526 case EVENT_VOLUME_CHANGE:
1527 ChangeVolumeCallback(event);
1528 break;
1529 case EVENT_AUDIO_FOCUS_CHANGE:
1530 ChangeFocusCallback(event);
1531 break;
1532 case EVENT_AUDIO_RENDER_STATE_CHANGE:
1533 ChangeRenderStateCallback(event);
1534 break;
1535 case EVENT_CHANGE_PLAY_STATUS:
1536 PlayStatusChangeCallback(event);
1537 break;
1538 case EVENT_MMAP_SPK_START:
1539 SpkMmapStartCallback(event);
1540 break;
1541 case EVENT_MMAP_SPK_STOP:
1542 SpkMmapStopCallback(event);
1543 break;
1544 case EVENT_MMAP_MIC_START:
1545 MicMmapStartCallback(event);
1546 break;
1547 case EVENT_MMAP_MIC_STOP:
1548 MicMmapStopCallback(event);
1549 break;
1550 default:
1551 break;
1552 }
1553 }
1554
ProcessEvent(const AppExecFwk::InnerEvent::Pointer & event)1555 void DAudioSourceDev::SourceEventHandler::ProcessEvent(const AppExecFwk::InnerEvent::Pointer &event)
1556 {
1557 CHECK_NULL_VOID(event);
1558 DHLOGI("Event Id=%{public}d", event->GetInnerEventId());
1559 switch (event->GetInnerEventId()) {
1560 case EVENT_DAUDIO_ENABLE:
1561 EnableDAudioCallback(event);
1562 break;
1563 case EVENT_DAUDIO_DISABLE:
1564 DisableDAudioCallback(event);
1565 break;
1566 case EVENT_OPEN_SPEAKER:
1567 OpenDSpeakerCallback(event);
1568 break;
1569 case EVENT_CLOSE_SPEAKER:
1570 CloseDSpeakerCallback(event);
1571 break;
1572 case EVENT_OPEN_MIC:
1573 OpenDMicCallback(event);
1574 break;
1575 case EVENT_CLOSE_MIC:
1576 CloseDMicCallback(event);
1577 break;
1578 case EVENT_DMIC_CLOSED:
1579 DMicClosedCallback(event);
1580 break;
1581 case EVENT_VOLUME_SET:
1582 case EVENT_VOLUME_CHANGE:
1583 case EVENT_AUDIO_FOCUS_CHANGE:
1584 case EVENT_AUDIO_RENDER_STATE_CHANGE:
1585 case EVENT_CHANGE_PLAY_STATUS:
1586 case EVENT_MMAP_SPK_START:
1587 case EVENT_MMAP_SPK_STOP:
1588 case EVENT_MMAP_MIC_START:
1589 case EVENT_MMAP_MIC_STOP:
1590 ProcessEventInner(event);
1591 break;
1592 default:
1593 DHLOGE("Event Id is invaild. %{public}d", event->GetInnerEventId());
1594 break;
1595 }
1596 }
1597
EnableDAudioCallback(const AppExecFwk::InnerEvent::Pointer & event)1598 void DAudioSourceDev::SourceEventHandler::EnableDAudioCallback(const AppExecFwk::InnerEvent::Pointer &event)
1599 {
1600 CHECK_NULL_VOID(event);
1601 auto jsonString = event->GetSharedObject<std::string>().get();
1602 CHECK_NULL_VOID(jsonString);
1603 auto sourceDevObj = sourceDev_.lock();
1604 CHECK_NULL_VOID(sourceDevObj);
1605 if (sourceDevObj->TaskEnableDAudio(*jsonString) != DH_SUCCESS) {
1606 DHLOGE("Open ctrl channel failed.");
1607 }
1608 }
1609
DisableDAudioCallback(const AppExecFwk::InnerEvent::Pointer & event)1610 void DAudioSourceDev::SourceEventHandler::DisableDAudioCallback(const AppExecFwk::InnerEvent::Pointer &event)
1611 {
1612 CHECK_NULL_VOID(event);
1613 auto jsonString = event->GetSharedObject<std::string>().get();
1614 CHECK_NULL_VOID(jsonString);
1615 auto sourceDevObj = sourceDev_.lock();
1616 CHECK_NULL_VOID(sourceDevObj);
1617 if (sourceDevObj->TaskDisableDAudio(*jsonString) != DH_SUCCESS) {
1618 DHLOGE("Disable distributed audio failed.");
1619 }
1620 }
1621
OpenDSpeakerCallback(const AppExecFwk::InnerEvent::Pointer & event)1622 void DAudioSourceDev::SourceEventHandler::OpenDSpeakerCallback(const AppExecFwk::InnerEvent::Pointer &event)
1623 {
1624 std::string eventParam;
1625 if (GetEventParam(event, eventParam) != DH_SUCCESS) {
1626 DHLOGE("Failed to get event parameters.");
1627 return;
1628 }
1629 auto sourceDevObj = sourceDev_.lock();
1630 CHECK_NULL_VOID(sourceDevObj);
1631 if (sourceDevObj->TaskOpenDSpeaker(eventParam) != DH_SUCCESS) {
1632 DHLOGE("Open speaker failed.");
1633 return;
1634 }
1635 DHLOGI("Open speaker successfully.");
1636 }
1637
CloseDSpeakerCallback(const AppExecFwk::InnerEvent::Pointer & event)1638 void DAudioSourceDev::SourceEventHandler::CloseDSpeakerCallback(const AppExecFwk::InnerEvent::Pointer &event)
1639 {
1640 std::string eventParam;
1641 if (GetEventParam(event, eventParam) != DH_SUCCESS) {
1642 DHLOGE("Failed to get event parameters.");
1643 return;
1644 }
1645 auto sourceDevObj = sourceDev_.lock();
1646 CHECK_NULL_VOID(sourceDevObj);
1647 if (sourceDevObj->TaskCloseDSpeaker(eventParam) != DH_SUCCESS) {
1648 DHLOGE("Close speaker failed.");
1649 return;
1650 }
1651 DHLOGI("Close speaker successfully.");
1652 }
1653
OpenDMicCallback(const AppExecFwk::InnerEvent::Pointer & event)1654 void DAudioSourceDev::SourceEventHandler::OpenDMicCallback(const AppExecFwk::InnerEvent::Pointer &event)
1655 {
1656 std::string eventParam;
1657 if (GetEventParam(event, eventParam) != DH_SUCCESS) {
1658 DHLOGE("Failed to get event parameters.");
1659 return;
1660 }
1661 auto sourceDevObj = sourceDev_.lock();
1662 CHECK_NULL_VOID(sourceDevObj);
1663 if (sourceDevObj->TaskOpenDMic(eventParam) != DH_SUCCESS) {
1664 DHLOGE("Open mic failed.");
1665 return;
1666 }
1667 DHLOGI("Open mic successfully.");
1668 }
1669
CloseDMicCallback(const AppExecFwk::InnerEvent::Pointer & event)1670 void DAudioSourceDev::SourceEventHandler::CloseDMicCallback(const AppExecFwk::InnerEvent::Pointer &event)
1671 {
1672 std::string eventParam;
1673 if (GetEventParam(event, eventParam) != DH_SUCCESS) {
1674 DHLOGE("Failed to get event parameters.");
1675 return;
1676 }
1677 auto sourceDevObj = sourceDev_.lock();
1678 CHECK_NULL_VOID(sourceDevObj);
1679 if (sourceDevObj->TaskCloseDMic(eventParam) != DH_SUCCESS) {
1680 DHLOGE("Close mic failed.");
1681 return;
1682 }
1683 DHLOGI("Close mic successfully.");
1684 }
1685
DMicClosedCallback(const AppExecFwk::InnerEvent::Pointer & event)1686 void DAudioSourceDev::SourceEventHandler::DMicClosedCallback(const AppExecFwk::InnerEvent::Pointer &event)
1687 {
1688 std::string eventParam;
1689 if (GetEventParam(event, eventParam) != DH_SUCCESS) {
1690 DHLOGE("Failed to get event parameters.");
1691 return;
1692 }
1693 auto sourceDevObj = sourceDev_.lock();
1694 CHECK_NULL_VOID(sourceDevObj);
1695 if (sourceDevObj->TaskDMicClosed(eventParam) != DH_SUCCESS) {
1696 DHLOGE("Deal dmic closed failed.");
1697 return;
1698 }
1699 DHLOGI("Deal dmic closed successfully.");
1700 }
1701
SetVolumeCallback(const AppExecFwk::InnerEvent::Pointer & event)1702 void DAudioSourceDev::SourceEventHandler::SetVolumeCallback(const AppExecFwk::InnerEvent::Pointer &event)
1703 {
1704 std::string eventParam;
1705 if (GetEventParam(event, eventParam) != DH_SUCCESS) {
1706 DHLOGE("Failed to get event parameters.");
1707 return;
1708 }
1709 auto sourceDevObj = sourceDev_.lock();
1710 CHECK_NULL_VOID(sourceDevObj);
1711 if (sourceDevObj->TaskSetVolume(eventParam) != DH_SUCCESS) {
1712 DHLOGE("Set volume failed.");
1713 return;
1714 }
1715 DHLOGI("Set audio volume successfully.");
1716 }
1717
ChangeVolumeCallback(const AppExecFwk::InnerEvent::Pointer & event)1718 void DAudioSourceDev::SourceEventHandler::ChangeVolumeCallback(const AppExecFwk::InnerEvent::Pointer &event)
1719 {
1720 std::string eventParam;
1721 if (GetEventParam(event, eventParam) != DH_SUCCESS) {
1722 DHLOGE("Failed to get event parameters.");
1723 return;
1724 }
1725 auto sourceDevObj = sourceDev_.lock();
1726 CHECK_NULL_VOID(sourceDevObj);
1727 if (sourceDevObj->TaskChangeVolume(eventParam) != DH_SUCCESS) {
1728 DHLOGE("Failed to process volume change event.");
1729 return;
1730 }
1731 DHLOGI("Processing volume change event successfully.");
1732 }
1733
ChangeFocusCallback(const AppExecFwk::InnerEvent::Pointer & event)1734 void DAudioSourceDev::SourceEventHandler::ChangeFocusCallback(const AppExecFwk::InnerEvent::Pointer &event)
1735 {
1736 std::string eventParam;
1737 if (GetEventParam(event, eventParam) != DH_SUCCESS) {
1738 DHLOGE("Failed to get event parameters.");
1739 return;
1740 }
1741 auto sourceDevObj = sourceDev_.lock();
1742 CHECK_NULL_VOID(sourceDevObj);
1743 if (sourceDevObj->TaskChangeFocus(eventParam) != DH_SUCCESS) {
1744 DHLOGE("Failed to process focus change event.");
1745 return;
1746 }
1747 DHLOGI("Processing volume change event successfully.");
1748 }
1749
ChangeRenderStateCallback(const AppExecFwk::InnerEvent::Pointer & event)1750 void DAudioSourceDev::SourceEventHandler::ChangeRenderStateCallback(const AppExecFwk::InnerEvent::Pointer &event)
1751 {
1752 std::string eventParam;
1753 if (GetEventParam(event, eventParam) != DH_SUCCESS) {
1754 DHLOGE("Failed to get event parameters.");
1755 return;
1756 }
1757 auto sourceDevObj = sourceDev_.lock();
1758 CHECK_NULL_VOID(sourceDevObj);
1759 if (sourceDevObj->TaskChangeRenderState(eventParam) != DH_SUCCESS) {
1760 DHLOGE("Failed to process render state change event.");
1761 return;
1762 }
1763 DHLOGD("Processing render state change event successfully.");
1764 }
1765
PlayStatusChangeCallback(const AppExecFwk::InnerEvent::Pointer & event)1766 void DAudioSourceDev::SourceEventHandler::PlayStatusChangeCallback(const AppExecFwk::InnerEvent::Pointer &event)
1767 {
1768 std::string eventParam;
1769 if (GetEventParam(event, eventParam) != DH_SUCCESS) {
1770 DHLOGE("Failed to get event parameters.");
1771 return;
1772 }
1773 auto sourceDevObj = sourceDev_.lock();
1774 CHECK_NULL_VOID(sourceDevObj);
1775 if (sourceDevObj->TaskPlayStatusChange(eventParam) != DH_SUCCESS) {
1776 DHLOGE("Failed to process playing status change event.");
1777 return;
1778 }
1779 DHLOGD("Processing playing status change event successfully.");
1780 }
1781
SpkMmapStartCallback(const AppExecFwk::InnerEvent::Pointer & event)1782 void DAudioSourceDev::SourceEventHandler::SpkMmapStartCallback(const AppExecFwk::InnerEvent::Pointer &event)
1783 {
1784 std::string eventParam;
1785 if (GetEventParam(event, eventParam) != DH_SUCCESS) {
1786 DHLOGE("Failed to get event parameters.");
1787 return;
1788 }
1789 auto sourceDevObj = sourceDev_.lock();
1790 CHECK_NULL_VOID(sourceDevObj);
1791 if (sourceDevObj->TaskSpkMmapStart(eventParam) != DH_SUCCESS) {
1792 DHLOGE("Failed to start speaker with mmap mode.");
1793 return;
1794 }
1795 DHLOGD("Start speaker with mmap mode successfully.");
1796 }
1797
SpkMmapStopCallback(const AppExecFwk::InnerEvent::Pointer & event)1798 void DAudioSourceDev::SourceEventHandler::SpkMmapStopCallback(const AppExecFwk::InnerEvent::Pointer &event)
1799 {
1800 std::string eventParam;
1801 if (GetEventParam(event, eventParam) != DH_SUCCESS) {
1802 DHLOGE("Failed to get event parameters.");
1803 return;
1804 }
1805 auto sourceDevObj = sourceDev_.lock();
1806 CHECK_NULL_VOID(sourceDevObj);
1807 if (sourceDevObj->TaskSpkMmapStop(eventParam) != DH_SUCCESS) {
1808 DHLOGE("Failed to stop speaker with mmap mode.");
1809 return;
1810 }
1811 DHLOGD("Stop speaker with mmap mode successfully.");
1812 }
1813
MicMmapStartCallback(const AppExecFwk::InnerEvent::Pointer & event)1814 void DAudioSourceDev::SourceEventHandler::MicMmapStartCallback(const AppExecFwk::InnerEvent::Pointer &event)
1815 {
1816 std::string eventParam;
1817 if (GetEventParam(event, eventParam) != DH_SUCCESS) {
1818 DHLOGE("Failed to get event parameters.");
1819 return;
1820 }
1821 auto sourceDevObj = sourceDev_.lock();
1822 CHECK_NULL_VOID(sourceDevObj);
1823 if (sourceDevObj->TaskMicMmapStart(eventParam) != DH_SUCCESS) {
1824 DHLOGE("Failed to start mic with mmap mode.");
1825 return;
1826 }
1827 DHLOGD("Start mic with mmap mode successfully.");
1828 }
1829
MicMmapStopCallback(const AppExecFwk::InnerEvent::Pointer & event)1830 void DAudioSourceDev::SourceEventHandler::MicMmapStopCallback(const AppExecFwk::InnerEvent::Pointer &event)
1831 {
1832 std::string eventParam;
1833 if (GetEventParam(event, eventParam) != DH_SUCCESS) {
1834 DHLOGE("Failed to get event parameters.");
1835 return;
1836 }
1837 auto sourceDevObj = sourceDev_.lock();
1838 CHECK_NULL_VOID(sourceDevObj);
1839 if (sourceDevObj->TaskMicMmapStop(eventParam) != DH_SUCCESS) {
1840 DHLOGE("Failed to stop mic with mmap mode.");
1841 return;
1842 }
1843 DHLOGD("Stop mic with mmap mode successfully.");
1844 }
1845
GetEventParam(const AppExecFwk::InnerEvent::Pointer & event,std::string & eventParam)1846 int32_t DAudioSourceDev::SourceEventHandler::GetEventParam(const AppExecFwk::InnerEvent::Pointer &event,
1847 std::string &eventParam)
1848 {
1849 CHECK_NULL_RETURN(event, ERR_DH_AUDIO_NULLPTR);
1850 std::shared_ptr<AudioEvent> paramObj = event->GetSharedObject<AudioEvent>();
1851 CHECK_NULL_RETURN(paramObj, ERR_DH_AUDIO_NULLPTR);
1852 eventParam = paramObj->content;
1853 return DH_SUCCESS;
1854 }
1855 } // namespace DistributedHardware
1856 } // namespace OHOS
1857