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_sink_dev.h"
17
18 #include <dlfcn.h>
19 #include <random>
20
21 #include "daudio_constants.h"
22 #include "daudio_errorcode.h"
23 #include "daudio_log.h"
24 #include "daudio_sink_manager.h"
25 #include "daudio_util.h"
26 #include "task_impl.h"
27
28 #undef DH_LOG_TAG
29 #define DH_LOG_TAG "DAudioSinkDev"
30
31 namespace OHOS {
32 namespace DistributedHardware {
DAudioSinkDev(const std::string & devId)33 DAudioSinkDev::DAudioSinkDev(const std::string &devId) : devId_(devId)
34 {
35 DHLOGD("Distributed audio sink device constructed, devId: %s.", GetAnonyString(devId).c_str());
36 }
37
~DAudioSinkDev()38 DAudioSinkDev::~DAudioSinkDev()
39 {
40 DHLOGD("Distributed audio sink device destructed, devId: %s.", GetAnonyString(devId_).c_str());
41 }
42
AwakeAudioDev()43 int32_t DAudioSinkDev::AwakeAudioDev()
44 {
45 auto runner = AppExecFwk::EventRunner::Create(true);
46 if (runner == nullptr) {
47 DHLOGE("Create runner failed.");
48 return ERR_DH_AUDIO_NULLPTR;
49 }
50 handler_ = std::make_shared<DAudioSinkDev::SinkEventHandler>(runner, shared_from_this());
51 return DH_SUCCESS;
52 }
53
SleepAudioDev()54 void DAudioSinkDev::SleepAudioDev()
55 {
56 if (handler_ == nullptr) {
57 DHLOGI("Event handler is already stoped.");
58 return;
59 }
60 while (!handler_->IsIdle()) {
61 DHLOGD("Event handler is proccesing.");
62 }
63 }
64
InitAVTransEngines(const ChannelState channelState,IAVEngineProvider * providerPtr)65 int32_t DAudioSinkDev::InitAVTransEngines(const ChannelState channelState, IAVEngineProvider *providerPtr)
66 {
67 DHLOGI("Init InitAVTransEngines");
68 if (channelState == ChannelState::UNKNOWN || providerPtr == nullptr) {
69 DHLOGE("The channel type is invalid.");
70 return ERR_DH_AUDIO_FAILED;
71 }
72 if (channelState == ChannelState::MIC_CONTROL_OPENED) {
73 // only supports normal audio channel mode
74 micClient_ = std::make_shared<DMicClient>(devId_, shared_from_this());
75 micClient_->InitSenderEngine(providerPtr);
76 }
77
78 if (channelState == ChannelState::SPK_CONTROL_OPENED) {
79 speakerClient_ = std::make_shared<DSpeakerClient>(devId_, shared_from_this());
80 speakerClient_->InitReceiverEngine(providerPtr);
81 }
82 return DH_SUCCESS;
83 }
84
NotifyEvent(const AudioEvent & audioEvent)85 void DAudioSinkDev::NotifyEvent(const AudioEvent &audioEvent)
86 {
87 DHLOGD("Notify event, eventType: %d.", (int32_t)audioEvent.type);
88 auto eventParam = std::make_shared<AudioEvent>(audioEvent);
89 auto msgEvent = AppExecFwk::InnerEvent::Get(static_cast<uint32_t>(audioEvent.type), eventParam, 0);
90 if (handler_ == nullptr) {
91 DHLOGE("The event handler is null.");
92 return;
93 }
94 if (handler_->SendEvent(msgEvent, 0, AppExecFwk::EventQueue::Priority::IMMEDIATE)) {
95 DHLOGD("Send event success.");
96 }
97 }
98
TaskOpenCtrlChannel(const std::string & args)99 int32_t DAudioSinkDev::TaskOpenCtrlChannel(const std::string &args)
100 {
101 DHLOGI("Open ctrl channel.");
102 DHLOGI("Open ctrl channel success, notify open ctrl result.");
103 return DH_SUCCESS;
104 }
105
TaskCloseCtrlChannel(const std::string & args)106 int32_t DAudioSinkDev::TaskCloseCtrlChannel(const std::string &args)
107 {
108 (void)args;
109 DHLOGD("Close ctrl channel success.");
110 return DH_SUCCESS;
111 }
112
TaskOpenDSpeaker(const std::string & args)113 int32_t DAudioSinkDev::TaskOpenDSpeaker(const std::string &args)
114 {
115 DHLOGI("Open speaker device.");
116 if (args.length() > DAUDIO_MAX_JSON_LEN || args.empty()) {
117 return ERR_DH_AUDIO_SA_PARAM_INVALID;
118 }
119 json jParam = json::parse(args, nullptr, false);
120 if (!JsonParamCheck(jParam, { KEY_DH_ID, KEY_AUDIO_PARAM })) {
121 return ERR_DH_AUDIO_FAILED;
122 }
123 spkDhId_ = jParam[KEY_DH_ID];
124 AudioParam audioParam;
125 int32_t ret = from_json(jParam[KEY_AUDIO_PARAM], audioParam);
126 if (ret != DH_SUCCESS) {
127 DHLOGE("Get audio param from json failed, error code %d.", ret);
128 return ret;
129 }
130
131 if (speakerClient_ == nullptr) {
132 DHLOGE("speaker client should be init by dev.");
133 return ERR_DH_AUDIO_NULLPTR;
134 }
135 DHLOGI("Open speaker device.");
136 ret = speakerClient_->SetUp(audioParam);
137 if (ret != DH_SUCCESS) {
138 DHLOGE("Setup speaker failed, ret: %d.", ret);
139 NotifySourceDev(NOTIFY_OPEN_SPEAKER_RESULT, spkDhId_, ERR_DH_AUDIO_FAILED);
140 return ERR_DH_AUDIO_FAILED;
141 }
142
143 NotifySourceDev(NOTIFY_OPEN_SPEAKER_RESULT, spkDhId_, ret);
144 DHLOGI("Open speaker device task end, notify source ret %d.", ret);
145 isSpkInUse_.store(true);
146 return ret;
147 }
148
TaskCloseDSpeaker(const std::string & args)149 int32_t DAudioSinkDev::TaskCloseDSpeaker(const std::string &args)
150 {
151 (void)args;
152 DHLOGI("Close speaker device.");
153 if (speakerClient_ == nullptr) {
154 DHLOGE("Speaker client is null or already closed.");
155 return DH_SUCCESS;
156 }
157
158 int32_t ret = speakerClient_->StopRender();
159 if (ret != DH_SUCCESS) {
160 DHLOGE("Stop speaker client failed, ret: %d.", ret);
161 }
162 ret = speakerClient_->Release();
163 if (ret != DH_SUCCESS) {
164 DHLOGE("Release speaker client failed, ret: %d.", ret);
165 }
166 speakerClient_ = nullptr;
167 isSpkInUse_.store(false);
168 JudgeDeviceStatus();
169 DHLOGI("Close speaker device task excute success.");
170 return DH_SUCCESS;
171 }
172
TaskStartRender()173 int32_t DAudioSinkDev::TaskStartRender()
174 {
175 if (speakerClient_ == nullptr) {
176 DHLOGE("Speaker client is null.");
177 return ERR_DH_AUDIO_NULLPTR;
178 }
179 int32_t ret = speakerClient_->StartRender();
180 if (ret != DH_SUCCESS) {
181 DHLOGE("Start render failed. ret: %d.", ret);
182 return ret;
183 }
184 DHLOGI("Start render success.");
185 return DH_SUCCESS;
186 }
187
TaskOpenDMic(const std::string & args)188 int32_t DAudioSinkDev::TaskOpenDMic(const std::string &args)
189 {
190 DHLOGI("Open mic device.");
191 if (args.length() > DAUDIO_MAX_JSON_LEN || args.empty()) {
192 return ERR_DH_AUDIO_SA_PARAM_INVALID;
193 }
194 json jParam = json::parse(args, nullptr, false);
195 if (!JsonParamCheck(jParam, { KEY_DH_ID, KEY_AUDIO_PARAM })) {
196 return ERR_DH_AUDIO_FAILED;
197 }
198 micDhId_ = jParam[KEY_DH_ID];
199 AudioParam audioParam;
200 int32_t ret = from_json(jParam[KEY_AUDIO_PARAM], audioParam);
201 if (ret != DH_SUCCESS) {
202 DHLOGE("Get audio param from json failed, error code %d.", ret);
203 return ret;
204 }
205 if (micClient_ == nullptr) {
206 DHLOGE("Mic client should be init by dev.");
207 return ERR_DH_AUDIO_NULLPTR;
208 }
209 do {
210 ret = micClient_->SetUp(audioParam);
211 if (ret != DH_SUCCESS) {
212 DHLOGE("Set up mic failed, ret: %d.", ret);
213 break;
214 }
215 ret = micClient_->StartCapture();
216 if (ret != DH_SUCCESS) {
217 DHLOGE("Start capture failed, ret: %d.", ret);
218 break;
219 }
220 } while (false);
221 NotifySourceDev(NOTIFY_OPEN_MIC_RESULT, micDhId_, ret);
222 DHLOGI("Open mic device task end, notify source ret %d.", ret);
223 isMicInUse_.store(true);
224 return ret;
225 }
226
TaskCloseDMic(const std::string & args)227 int32_t DAudioSinkDev::TaskCloseDMic(const std::string &args)
228 {
229 (void)args;
230 DHLOGI("Close mic device.");
231 if (micClient_ == nullptr) {
232 DHLOGE("Mic client is null or already closed.");
233 return DH_SUCCESS;
234 }
235
236 int32_t ret = micClient_->StopCapture();
237 if (ret != DH_SUCCESS) {
238 DHLOGE("Stop mic client failed, ret: %d.", ret);
239 }
240 ret = micClient_->Release();
241 if (ret != DH_SUCCESS) {
242 DHLOGE("Release mic client failed, ret: %d.", ret);
243 }
244 micClient_ = nullptr;
245 isMicInUse_.store(false);
246 JudgeDeviceStatus();
247 DHLOGI("Close mic device task excute success.");
248 return DH_SUCCESS;
249 }
250
TaskSetParameter(const std::string & args)251 int32_t DAudioSinkDev::TaskSetParameter(const std::string &args)
252 {
253 DHLOGD("Set audio param.");
254 AudioEvent event(AudioEventType::EVENT_UNKNOWN, args);
255
256 if (speakerClient_ == nullptr) {
257 return ERR_DH_AUDIO_SA_SPEAKER_CLIENT_NOT_INIT;
258 }
259 return speakerClient_->SetAudioParameters(event);
260 }
261
TaskSetVolume(const std::string & args)262 int32_t DAudioSinkDev::TaskSetVolume(const std::string &args)
263 {
264 DHLOGD("Set audio volume.");
265 if (speakerClient_ == nullptr) {
266 DHLOGE("Speaker client already closed.");
267 return ERR_DH_AUDIO_NULLPTR;
268 }
269 AudioEvent event(AudioEventType::VOLUME_SET, args);
270 int32_t ret = speakerClient_->SetAudioParameters(event);
271 if (ret != DH_SUCCESS) {
272 DHLOGE("Volume set failed, ret: %d.", ret);
273 return ret;
274 }
275 DHLOGD("Set audio volume success.");
276 return DH_SUCCESS;
277 }
278
TaskSetMute(const std::string & args)279 int32_t DAudioSinkDev::TaskSetMute(const std::string &args)
280 {
281 DHLOGD("Set audio mute.");
282 if (speakerClient_ == nullptr) {
283 DHLOGE("Speaker client already closed.");
284 return ERR_DH_AUDIO_NULLPTR;
285 }
286 AudioEvent event(AudioEventType::VOLUME_MUTE_SET, args);
287 int32_t ret = speakerClient_->SetMute(event);
288 if (ret != DH_SUCCESS) {
289 DHLOGE("Set mute failed, ret: %d.", ret);
290 return ret;
291 }
292 DHLOGD("Set mute success.");
293 return DH_SUCCESS;
294 }
295
TaskVolumeChange(const std::string & args)296 int32_t DAudioSinkDev::TaskVolumeChange(const std::string &args)
297 {
298 DHLOGD("Audio volume changed.");
299 AudioEvent event(AudioEventType::VOLUME_CHANGE, args);
300 return SendAudioEventToRemote(event);
301 }
302
TaskFocusChange(const std::string & args)303 int32_t DAudioSinkDev::TaskFocusChange(const std::string &args)
304 {
305 DHLOGD("Audio focus changed.");
306 AudioEvent event(AudioEventType::AUDIO_FOCUS_CHANGE, args);
307 return SendAudioEventToRemote(event);
308 }
309
TaskRenderStateChange(const std::string & args)310 int32_t DAudioSinkDev::TaskRenderStateChange(const std::string &args)
311 {
312 DHLOGD("Audio render state changed.");
313 AudioEvent event(AudioEventType::AUDIO_RENDER_STATE_CHANGE, args);
314 return SendAudioEventToRemote(event);
315 }
316
TaskPlayStatusChange(const std::string & args)317 int32_t DAudioSinkDev::TaskPlayStatusChange(const std::string &args)
318 {
319 DHLOGD("Play status change, content: %s.", args.c_str());
320 if (speakerClient_ == nullptr) {
321 DHLOGE("Speaker client already closed.");
322 return ERR_DH_AUDIO_NULLPTR;
323 }
324 speakerClient_->PlayStatusChange(args);
325 DHLOGD("Play status change success.");
326 return DH_SUCCESS;
327 }
328
SendAudioEventToRemote(const AudioEvent & event)329 int32_t DAudioSinkDev::SendAudioEventToRemote(const AudioEvent &event)
330 {
331 // because: type: VOLUME_CHANGE / AUDIO_FOCUS_CHANGE / AUDIO_RENDER_STATE_CHANGE
332 // so speakerClient
333 if (speakerClient_ == nullptr) {
334 DHLOGE("Audio ctrl mgr not init.");
335 return ERR_DH_AUDIO_NULLPTR;
336 }
337 int32_t ret = speakerClient_->SendMessage(static_cast<uint32_t>(event.type),
338 event.content, devId_);
339 if (ret != DH_SUCCESS) {
340 DHLOGE("Task send message to remote failed.");
341 return ERR_DH_AUDIO_NULLPTR;
342 }
343 return DH_SUCCESS;
344 }
345
JudgeDeviceStatus()346 void DAudioSinkDev::JudgeDeviceStatus()
347 {
348 DHLOGI("Checking device's status.");
349 if (isSpkInUse_.load() || isMicInUse_.load()) {
350 DHLOGI("Device contain periperials in using, speaker status: %d, mic status: %d.",
351 isSpkInUse_.load(), isMicInUse_.load());
352 return;
353 }
354 DAudioSinkManager::GetInstance().OnSinkDevReleased(devId_);
355 }
356
NotifySourceDev(const AudioEventType type,const std::string dhId,const int32_t result)357 void DAudioSinkDev::NotifySourceDev(const AudioEventType type, const std::string dhId, const int32_t result)
358 {
359 std::random_device rd;
360 const uint32_t randomTaskCode = rd();
361 json jEvent;
362 jEvent[KEY_DH_ID] = dhId;
363 jEvent[KEY_RESULT] = result;
364 jEvent[KEY_EVENT_TYPE] = type;
365 jEvent[KEY_RANDOM_TASK_CODE] = std::to_string(randomTaskCode);
366
367 DHLOGD("Notify source dev, new engine, random task code:%s", std::to_string(randomTaskCode).c_str());
368 if (type == NOTIFY_OPEN_CTRL_RESULT || type == NOTIFY_CLOSE_CTRL_RESULT) {
369 DHLOGE("In new engine mode, ctrl is not allowed.");
370 return;
371 }
372 if (speakerClient_ != nullptr) {
373 speakerClient_->SendMessage(static_cast<uint32_t>(type), jEvent.dump(), devId_);
374 }
375 if (micClient_ != nullptr) {
376 micClient_->SendMessage(static_cast<uint32_t>(type), jEvent.dump(), devId_);
377 }
378 }
379
from_json(const json & j,AudioParam & audioParam)380 int32_t DAudioSinkDev::from_json(const json &j, AudioParam &audioParam)
381 {
382 if (!JsonParamCheck(j,
383 { KEY_SAMPLING_RATE, KEY_CHANNELS, KEY_FORMAT, KEY_SOURCE_TYPE, KEY_CONTENT_TYPE, KEY_STREAM_USAGE })) {
384 return ERR_DH_AUDIO_FAILED;
385 }
386 j.at(KEY_SAMPLING_RATE).get_to(audioParam.comParam.sampleRate);
387 j.at(KEY_CHANNELS).get_to(audioParam.comParam.channelMask);
388 j.at(KEY_FORMAT).get_to(audioParam.comParam.bitFormat);
389 j.at(KEY_FRAMESIZE).get_to(audioParam.comParam.frameSize);
390 j.at(KEY_SOURCE_TYPE).get_to(audioParam.captureOpts.sourceType);
391 j.at(KEY_CONTENT_TYPE).get_to(audioParam.renderOpts.contentType);
392 j.at(KEY_STREAM_USAGE).get_to(audioParam.renderOpts.streamUsage);
393 j.at(KEY_RENDER_FLAGS).get_to(audioParam.renderOpts.renderFlags);
394 j.at(KEY_CAPTURE_FLAGS).get_to(audioParam.captureOpts.capturerFlags);
395 return DH_SUCCESS;
396 }
397
HandleEngineMessage(uint32_t type,std::string content,std::string devId)398 int32_t DAudioSinkDev::HandleEngineMessage(uint32_t type, std::string content, std::string devId)
399 {
400 DHLOGI("HandleEngineMessage enter.");
401 return DAudioSinkManager::GetInstance().HandleDAudioNotify(devId, devId, static_cast<int32_t>(type), content);
402 }
403
SinkEventHandler(const std::shared_ptr<AppExecFwk::EventRunner> & runner,const std::shared_ptr<DAudioSinkDev> & dev)404 DAudioSinkDev::SinkEventHandler::SinkEventHandler(const std::shared_ptr<AppExecFwk::EventRunner> &runner,
405 const std::shared_ptr<DAudioSinkDev> &dev) : AppExecFwk::EventHandler(runner), sinkDev_(dev)
406 {
407 DHLOGD("Event handler is constructing.");
408 mapEventFuncs_[static_cast<uint32_t>(OPEN_CTRL)] = &DAudioSinkDev::SinkEventHandler::NotifyOpenCtrlChannel;
409 mapEventFuncs_[static_cast<uint32_t>(CLOSE_CTRL)] = &DAudioSinkDev::SinkEventHandler::NotifyCloseCtrlChannel;
410 mapEventFuncs_[static_cast<uint32_t>(CTRL_OPENED)] = &DAudioSinkDev::SinkEventHandler::NotifyCtrlOpened;
411 mapEventFuncs_[static_cast<uint32_t>(CTRL_CLOSED)] = &DAudioSinkDev::SinkEventHandler::NotifyCtrlClosed;
412 mapEventFuncs_[static_cast<uint32_t>(OPEN_SPEAKER)] = &DAudioSinkDev::SinkEventHandler::NotifyOpenSpeaker;
413 mapEventFuncs_[static_cast<uint32_t>(CLOSE_SPEAKER)] = &DAudioSinkDev::SinkEventHandler::NotifyCloseSpeaker;
414 mapEventFuncs_[static_cast<uint32_t>(SPEAKER_OPENED)] = &DAudioSinkDev::SinkEventHandler::NotifySpeakerOpened;
415 mapEventFuncs_[static_cast<uint32_t>(SPEAKER_CLOSED)] = &DAudioSinkDev::SinkEventHandler::NotifySpeakerClosed;
416 mapEventFuncs_[static_cast<uint32_t>(OPEN_MIC)] = &DAudioSinkDev::SinkEventHandler::NotifyOpenMic;
417 mapEventFuncs_[static_cast<uint32_t>(CLOSE_MIC)] = &DAudioSinkDev::SinkEventHandler::NotifyCloseMic;
418 mapEventFuncs_[static_cast<uint32_t>(MIC_OPENED)] = &DAudioSinkDev::SinkEventHandler::NotifyMicOpened;
419 mapEventFuncs_[static_cast<uint32_t>(MIC_CLOSED)] = &DAudioSinkDev::SinkEventHandler::NotifyMicClosed;
420 mapEventFuncs_[static_cast<uint32_t>(VOLUME_SET)] = &DAudioSinkDev::SinkEventHandler::NotifySetVolume;
421 mapEventFuncs_[static_cast<uint32_t>(VOLUME_CHANGE)] = &DAudioSinkDev::SinkEventHandler::NotifyVolumeChange;
422 mapEventFuncs_[static_cast<uint32_t>(SET_PARAM)] = &DAudioSinkDev::SinkEventHandler::NotifySetParam;
423 mapEventFuncs_[static_cast<uint32_t>(VOLUME_MUTE_SET)] = &DAudioSinkDev::SinkEventHandler::NotifySetMute;
424 mapEventFuncs_[static_cast<uint32_t>(AUDIO_FOCUS_CHANGE)] = &DAudioSinkDev::SinkEventHandler::NotifyFocusChange;
425 mapEventFuncs_[static_cast<uint32_t>(AUDIO_RENDER_STATE_CHANGE)] =
426 &DAudioSinkDev::SinkEventHandler::NotifyRenderStateChange;
427 mapEventFuncs_[static_cast<uint32_t>(CHANGE_PLAY_STATUS)] =
428 &DAudioSinkDev::SinkEventHandler::NotifyPlayStatusChange;
429 }
430
~SinkEventHandler()431 DAudioSinkDev::SinkEventHandler::~SinkEventHandler() {}
432
ProcessEvent(const AppExecFwk::InnerEvent::Pointer & event)433 void DAudioSinkDev::SinkEventHandler::ProcessEvent(const AppExecFwk::InnerEvent::Pointer &event)
434 {
435 auto iter = mapEventFuncs_.find(event->GetInnerEventId());
436 if (iter == mapEventFuncs_.end()) {
437 DHLOGE("Event Id is invaild.", event->GetInnerEventId());
438 return;
439 }
440 SinkEventFunc &func = iter->second;
441 (this->*func)(event);
442 }
443
NotifyOpenCtrlChannel(const AppExecFwk::InnerEvent::Pointer & event)444 void DAudioSinkDev::SinkEventHandler::NotifyOpenCtrlChannel(const AppExecFwk::InnerEvent::Pointer &event)
445 {
446 DHLOGI("Notify open ctrl channel.");
447 std::string eventParam;
448 if (GetEventParam(event, eventParam) != DH_SUCCESS) {
449 DHLOGE("Failed to get event parameters.");
450 return;
451 }
452 auto sinkDevObj = sinkDev_.lock();
453 if (sinkDevObj == nullptr) {
454 DHLOGE("Sink dev is invalid.");
455 return;
456 }
457 if (sinkDevObj->TaskOpenCtrlChannel(eventParam) != DH_SUCCESS) {
458 DHLOGE("Open ctrl channel failed.");
459 return;
460 }
461 }
462
NotifyCloseCtrlChannel(const AppExecFwk::InnerEvent::Pointer & event)463 void DAudioSinkDev::SinkEventHandler::NotifyCloseCtrlChannel(const AppExecFwk::InnerEvent::Pointer &event)
464 {
465 DHLOGI("Notify close ctrl channel.");
466 std::string eventParam;
467 if (GetEventParam(event, eventParam) != DH_SUCCESS) {
468 DHLOGE("Failed to get event parameters.");
469 return;
470 }
471 auto sinkDevObj = sinkDev_.lock();
472 if (sinkDevObj == nullptr) {
473 DHLOGE("Sink dev is invalid.");
474 return;
475 }
476 if (sinkDevObj->TaskCloseCtrlChannel(eventParam) != DH_SUCCESS) {
477 DHLOGE("Close ctrl channel falied.");
478 return;
479 }
480 }
481
NotifyCtrlOpened(const AppExecFwk::InnerEvent::Pointer & event)482 void DAudioSinkDev::SinkEventHandler::NotifyCtrlOpened(const AppExecFwk::InnerEvent::Pointer &event)
483 {
484 DHLOGI("Ctrl channel is opened.");
485 (void)event;
486 }
487
NotifyCtrlClosed(const AppExecFwk::InnerEvent::Pointer & event)488 void DAudioSinkDev::SinkEventHandler::NotifyCtrlClosed(const AppExecFwk::InnerEvent::Pointer &event)
489 {
490 DHLOGI("Notify ctrl closed.");
491 std::string eventParam;
492 if (GetEventParam(event, eventParam) != DH_SUCCESS) {
493 DHLOGE("Failed to get event parameters.");
494 return;
495 }
496 auto sinkDevObj = sinkDev_.lock();
497 if (sinkDevObj == nullptr) {
498 DHLOGE("Sink dev is invalid.");
499 return;
500 }
501 if (sinkDevObj->TaskCloseCtrlChannel(eventParam) != DH_SUCCESS) {
502 DHLOGE("Close ctrl channel failed.");
503 return;
504 }
505 if (sinkDevObj->TaskCloseDSpeaker(eventParam) != DH_SUCCESS) {
506 DHLOGE("Close speaker failed.");
507 return;
508 }
509 if (sinkDevObj->TaskCloseDMic(eventParam) != DH_SUCCESS) {
510 DHLOGE("Close mic failed.");
511 return;
512 }
513 sinkDevObj->JudgeDeviceStatus();
514 }
515
NotifyOpenSpeaker(const AppExecFwk::InnerEvent::Pointer & event)516 void DAudioSinkDev::SinkEventHandler::NotifyOpenSpeaker(const AppExecFwk::InnerEvent::Pointer &event)
517 {
518 std::string eventParam;
519 if (GetEventParam(event, eventParam) != DH_SUCCESS) {
520 DHLOGE("Failed to get event parameters.");
521 return;
522 }
523 auto sinkDevObj = sinkDev_.lock();
524 if (sinkDevObj == nullptr) {
525 DHLOGE("Sink dev is invalid.");
526 return;
527 }
528 if (sinkDevObj->TaskOpenDSpeaker(eventParam) != DH_SUCCESS) {
529 DHLOGE("Open speaker failed.");
530 return;
531 }
532 }
533
NotifyCloseSpeaker(const AppExecFwk::InnerEvent::Pointer & event)534 void DAudioSinkDev::SinkEventHandler::NotifyCloseSpeaker(const AppExecFwk::InnerEvent::Pointer &event)
535 {
536 std::string eventParam;
537 if (GetEventParam(event, eventParam) != DH_SUCCESS) {
538 DHLOGE("Failed to get event parameters.");
539 return;
540 }
541 auto sinkDevObj = sinkDev_.lock();
542 if (sinkDevObj == nullptr) {
543 DHLOGE("Sink dev is invalid.");
544 return;
545 }
546 if (sinkDevObj->TaskOpenDSpeaker(eventParam) != DH_SUCCESS) {
547 DHLOGE("Open speaker failed.");
548 return;
549 }
550 }
551
NotifySpeakerOpened(const AppExecFwk::InnerEvent::Pointer & event)552 void DAudioSinkDev::SinkEventHandler::NotifySpeakerOpened(const AppExecFwk::InnerEvent::Pointer &event)
553 {
554 DHLOGD("Starting render.");
555 std::string eventParam;
556 if (GetEventParam(event, eventParam) != DH_SUCCESS) {
557 DHLOGE("Failed to get event parameters.");
558 return;
559 }
560 auto sinkDevObj = sinkDev_.lock();
561 if (sinkDevObj == nullptr) {
562 DHLOGE("Sink dev is invalid.");
563 return;
564 }
565 if (sinkDevObj->TaskStartRender() != DH_SUCCESS) {
566 DHLOGE("Speaker client start failed.");
567 return;
568 }
569 if (sinkDevObj->TaskVolumeChange(eventParam) != DH_SUCCESS) {
570 DHLOGE("Notify pimary volume to source device failed.");
571 return;
572 }
573 }
574
NotifySpeakerClosed(const AppExecFwk::InnerEvent::Pointer & event)575 void DAudioSinkDev::SinkEventHandler::NotifySpeakerClosed(const AppExecFwk::InnerEvent::Pointer &event)
576 {
577 std::string eventParam;
578 if (GetEventParam(event, eventParam) != DH_SUCCESS) {
579 DHLOGE("Failed to get event parameters.");
580 return;
581 }
582 auto sinkDevObj = sinkDev_.lock();
583 if (sinkDevObj == nullptr) {
584 DHLOGE("Sink dev is invalid.");
585 return;
586 }
587 if (sinkDevObj->TaskCloseDSpeaker(eventParam) != DH_SUCCESS) {
588 DHLOGE("Close speaker failed.");
589 return;
590 }
591 }
592
NotifyOpenMic(const AppExecFwk::InnerEvent::Pointer & event)593 void DAudioSinkDev::SinkEventHandler::NotifyOpenMic(const AppExecFwk::InnerEvent::Pointer &event)
594 {
595 std::string eventParam;
596 if (GetEventParam(event, eventParam) != DH_SUCCESS) {
597 DHLOGE("Failed to get event parameters.");
598 return;
599 }
600 auto sinkDevObj = sinkDev_.lock();
601 if (sinkDevObj == nullptr) {
602 DHLOGE("Sink dev is invalid.");
603 return;
604 }
605 if (sinkDevObj->TaskOpenDMic(eventParam) != DH_SUCCESS) {
606 DHLOGE("Open mic failed.");
607 return;
608 }
609 }
610
NotifyCloseMic(const AppExecFwk::InnerEvent::Pointer & event)611 void DAudioSinkDev::SinkEventHandler::NotifyCloseMic(const AppExecFwk::InnerEvent::Pointer &event)
612 {
613 std::string eventParam;
614 if (GetEventParam(event, eventParam) != DH_SUCCESS) {
615 DHLOGE("Failed to get event parameters.");
616 return;
617 }
618 auto sinkDevObj = sinkDev_.lock();
619 if (sinkDevObj == nullptr) {
620 DHLOGE("Sink dev is invalid.");
621 return;
622 }
623 if (sinkDevObj->TaskCloseDMic(eventParam) != DH_SUCCESS) {
624 DHLOGE("Close mic failed.");
625 return;
626 }
627 }
628
NotifyMicOpened(const AppExecFwk::InnerEvent::Pointer & event)629 void DAudioSinkDev::SinkEventHandler::NotifyMicOpened(const AppExecFwk::InnerEvent::Pointer &event)
630 {
631 DHLOGI("Notify mic is opened.");
632 (void)event;
633 }
634
NotifyMicClosed(const AppExecFwk::InnerEvent::Pointer & event)635 void DAudioSinkDev::SinkEventHandler::NotifyMicClosed(const AppExecFwk::InnerEvent::Pointer &event)
636 {
637 std::string eventParam;
638 if (GetEventParam(event, eventParam) != DH_SUCCESS) {
639 DHLOGE("Failed to get event parameters.");
640 return;
641 }
642 auto sinkDevObj = sinkDev_.lock();
643 if (sinkDevObj == nullptr) {
644 DHLOGE("Sink dev is invalid.");
645 return;
646 }
647 if (sinkDevObj->TaskCloseDMic(eventParam) != DH_SUCCESS) {
648 DHLOGE("Close mic failed.");
649 return;
650 }
651 }
652
NotifySetVolume(const AppExecFwk::InnerEvent::Pointer & event)653 void DAudioSinkDev::SinkEventHandler::NotifySetVolume(const AppExecFwk::InnerEvent::Pointer &event)
654 {
655 std::string eventParam;
656 if (GetEventParam(event, eventParam) != DH_SUCCESS) {
657 DHLOGE("Failed to get event parameters.");
658 return;
659 }
660 auto sinkDevObj = sinkDev_.lock();
661 if (sinkDevObj == nullptr) {
662 DHLOGE("Sink dev is invalid.");
663 return;
664 }
665 if (sinkDevObj->TaskSetVolume(eventParam) != DH_SUCCESS) {
666 DHLOGE("Set volume failed.");
667 return;
668 }
669 }
670
NotifyVolumeChange(const AppExecFwk::InnerEvent::Pointer & event)671 void DAudioSinkDev::SinkEventHandler::NotifyVolumeChange(const AppExecFwk::InnerEvent::Pointer &event)
672 {
673 std::string eventParam;
674 if (GetEventParam(event, eventParam) != DH_SUCCESS) {
675 DHLOGE("Failed to get event parameters.");
676 return;
677 }
678 auto sinkDevObj = sinkDev_.lock();
679 if (sinkDevObj == nullptr) {
680 DHLOGE("Sink dev is invalid.");
681 return;
682 }
683 if (sinkDevObj->TaskVolumeChange(eventParam) != DH_SUCCESS) {
684 DHLOGE("Notify volume change status to source device failed.");
685 return;
686 }
687 }
688
NotifySetParam(const AppExecFwk::InnerEvent::Pointer & event)689 void DAudioSinkDev::SinkEventHandler::NotifySetParam(const AppExecFwk::InnerEvent::Pointer &event)
690 {
691 std::string eventParam;
692 if (GetEventParam(event, eventParam) != DH_SUCCESS) {
693 DHLOGE("Failed to get event parameters.");
694 return;
695 }
696 auto sinkDevObj = sinkDev_.lock();
697 if (sinkDevObj == nullptr) {
698 DHLOGE("Sink dev is invalid.");
699 return;
700 }
701 if (sinkDevObj->TaskSetParameter(eventParam) != DH_SUCCESS) {
702 DHLOGE("Set parameters failed.");
703 return;
704 }
705 }
706
NotifySetMute(const AppExecFwk::InnerEvent::Pointer & event)707 void DAudioSinkDev::SinkEventHandler::NotifySetMute(const AppExecFwk::InnerEvent::Pointer &event)
708 {
709 std::string eventParam;
710 if (GetEventParam(event, eventParam) != DH_SUCCESS) {
711 DHLOGE("Failed to get event parameters.");
712 return;
713 }
714 auto sinkDevObj = sinkDev_.lock();
715 if (sinkDevObj == nullptr) {
716 DHLOGE("Sink dev is invalid.");
717 return;
718 }
719 if (sinkDevObj->TaskSetMute(eventParam) != DH_SUCCESS) {
720 DHLOGE("Set mute failed.");
721 return;
722 }
723 }
724
NotifyFocusChange(const AppExecFwk::InnerEvent::Pointer & event)725 void DAudioSinkDev::SinkEventHandler::NotifyFocusChange(const AppExecFwk::InnerEvent::Pointer &event)
726 {
727 std::string eventParam;
728 if (GetEventParam(event, eventParam) != DH_SUCCESS) {
729 DHLOGE("Failed to get event parameters.");
730 return;
731 }
732 auto sinkDevObj = sinkDev_.lock();
733 if (sinkDevObj == nullptr) {
734 DHLOGE("Sink dev is invalid.");
735 return;
736 }
737 if (sinkDevObj->TaskFocusChange(eventParam) != DH_SUCCESS) {
738 DHLOGE("Handle focus change event failed.");
739 return;
740 }
741 }
742
NotifyRenderStateChange(const AppExecFwk::InnerEvent::Pointer & event)743 void DAudioSinkDev::SinkEventHandler::NotifyRenderStateChange(const AppExecFwk::InnerEvent::Pointer &event)
744 {
745 std::string eventParam;
746 if (GetEventParam(event, eventParam) != DH_SUCCESS) {
747 DHLOGE("Failed to get event parameters.");
748 return;
749 }
750 auto sinkDevObj = sinkDev_.lock();
751 if (sinkDevObj == nullptr) {
752 DHLOGE("Sink dev is invalid.");
753 return;
754 }
755 if (sinkDevObj->TaskRenderStateChange(eventParam) != DH_SUCCESS) {
756 DHLOGE("Handle render state change failed.");
757 return;
758 }
759 }
760
NotifyPlayStatusChange(const AppExecFwk::InnerEvent::Pointer & event)761 void DAudioSinkDev::SinkEventHandler::NotifyPlayStatusChange(const AppExecFwk::InnerEvent::Pointer &event)
762 {
763 std::string eventParam;
764 if (GetEventParam(event, eventParam) != DH_SUCCESS) {
765 DHLOGE("Failed to get event parameters.");
766 return;
767 }
768 auto sinkDevObj = sinkDev_.lock();
769 if (sinkDevObj == nullptr) {
770 DHLOGE("Sink dev is invalid.");
771 return;
772 }
773 if (sinkDevObj->TaskPlayStatusChange(eventParam) != DH_SUCCESS) {
774 DHLOGE("Handle play status change event failed.");
775 return;
776 }
777 }
778
GetEventParam(const AppExecFwk::InnerEvent::Pointer & event,std::string & eventParam)779 int32_t DAudioSinkDev::SinkEventHandler::GetEventParam(const AppExecFwk::InnerEvent::Pointer &event,
780 std::string &eventParam)
781 {
782 if (event == nullptr) {
783 DHLOGE("The input event is null.");
784 return ERR_DH_AUDIO_NULLPTR;
785 }
786 std::shared_ptr<AudioEvent> paramObj = event->GetSharedObject<AudioEvent>();
787 if (paramObj == nullptr) {
788 DHLOGE("The event parameter object is nullptr.");
789 return ERR_DH_AUDIO_NULLPTR;
790 }
791 eventParam = paramObj->content;
792 return DH_SUCCESS;
793 }
794 } // namespace DistributedHardware
795 } // namespace OHOS
796