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