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