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