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