• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "daudio_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