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