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