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