• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024 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 
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 
27 #undef DH_LOG_TAG
28 #define DH_LOG_TAG "DAudioSinkDev"
29 
30 namespace OHOS {
31 namespace DistributedHardware {
DAudioSinkDev(const std::string & devId,const sptr<IDAudioSinkIpcCallback> & sinkCallback)32 DAudioSinkDev::DAudioSinkDev(const std::string &devId, const sptr<IDAudioSinkIpcCallback> &sinkCallback)
33     : devId_(devId), ipcSinkCallback_(sinkCallback)
34 {
35     DHLOGD("Distributed audio sink device constructed, devId: %{public}s.", GetAnonyString(devId).c_str());
36 }
37 
~DAudioSinkDev()38 DAudioSinkDev::~DAudioSinkDev()
39 {
40     SetDevLevelStatus(false);
41     DHLOGD("Distributed audio sink device destructed, devId: %{public}s.", GetAnonyString(devId_).c_str());
42 }
43 
AwakeAudioDev()44 int32_t DAudioSinkDev::AwakeAudioDev()
45 {
46     auto runner = AppExecFwk::EventRunner::Create(true);
47     CHECK_NULL_RETURN(runner, ERR_DH_AUDIO_NULLPTR);
48     handler_ = std::make_shared<DAudioSinkDev::SinkEventHandler>(runner, shared_from_this());
49     return DH_SUCCESS;
50 }
51 
SleepAudioDev()52 void DAudioSinkDev::SleepAudioDev()
53 {
54     DHLOGD("Sleep audio dev.");
55     CHECK_NULL_VOID(handler_);
56     while (!handler_->IsIdle()) {
57         DHLOGD("handler is running, wait for idle.");
58         usleep(WAIT_HANDLER_IDLE_TIME_US);
59     }
60     DHLOGI("Sleep audio dev over.");
61 }
62 
InitAVTransEngines(const ChannelState channelState,IAVEngineProvider * providerPtr)63 int32_t DAudioSinkDev::InitAVTransEngines(const ChannelState channelState, IAVEngineProvider *providerPtr)
64 {
65     DHLOGI("Init InitAVTransEngines.");
66     CHECK_NULL_RETURN(providerPtr, ERR_DH_AUDIO_FAILED);
67 
68     if (channelState == ChannelState::UNKNOWN) {
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         std::lock_guard<std::mutex> devLck(micClientMutex_);
75         micClientMap_[DEFAULT_CAPTURE_ID] = std::make_shared<DMicClient>(devId_, DEFAULT_CAPTURE_ID,
76             shared_from_this());
77         micClientMap_[DEFAULT_CAPTURE_ID]->InitSenderEngine(providerPtr);
78         micClientMap_[DEFAULT_CAPTURE_ID]->InitCtrlTrans();
79     }
80 
81     if (channelState == ChannelState::SPK_CONTROL_OPENED) {
82         std::lock_guard<std::mutex> devLck(spkClientMutex_);
83         spkClientMap_[DEFAULT_RENDER_ID] =
84             std::make_shared<DSpeakerClient>(devId_, DEFAULT_RENDER_ID, shared_from_this());
85         spkClientMap_[DEFAULT_RENDER_ID]->InitReceiverEngine(providerPtr);
86         spkClientMap_[DEFAULT_RENDER_ID]->InitCtrlTrans();
87         spkClientMap_[LOW_LATENCY_RENDER_ID] =
88             std::make_shared<DSpeakerClient>(devId_, LOW_LATENCY_RENDER_ID, shared_from_this());
89         spkClientMap_[LOW_LATENCY_RENDER_ID]->InitReceiverEngine(providerPtr);
90         spkClientMap_[LOW_LATENCY_RENDER_ID]->InitCtrlTrans();
91     }
92     return DH_SUCCESS;
93 }
94 
NotifyEvent(const AudioEvent & audioEvent)95 void DAudioSinkDev::NotifyEvent(const AudioEvent &audioEvent)
96 {
97     DHLOGD("Notify event, eventType: %{public}d.", (int32_t)audioEvent.type);
98     if ((int32_t)audioEvent.type == DISABLE_DEVICE) {
99         TaskDisableDevice(audioEvent.content);
100         return;
101     }
102     auto eventParam = std::make_shared<AudioEvent>(audioEvent);
103     auto msgEvent = AppExecFwk::InnerEvent::Get(static_cast<uint32_t>(audioEvent.type), eventParam, 0);
104     CHECK_NULL_VOID(handler_);
105     if (handler_->SendEvent(msgEvent, 0, AppExecFwk::EventQueue::Priority::IMMEDIATE)) {
106         DHLOGD("Send event success.");
107     }
108 }
109 
TaskDisableDevice(const std::string & args)110 int32_t DAudioSinkDev::TaskDisableDevice(const std::string &args)
111 {
112     if (args.find(OWNER_NAME_D_SPEAKER) != args.npos) {
113         isSpkInUse_.store(false);
114     }
115     if (args.find(OWNER_NAME_D_MIC) != args.npos) {
116         isMicInUse_.store(false);
117     }
118     JudgeDeviceStatus();
119     return DH_SUCCESS;
120 }
121 
TaskOpenDSpeaker(const std::string & args)122 int32_t DAudioSinkDev::TaskOpenDSpeaker(const std::string &args)
123 {
124     DHLOGI("Open speaker device, args = %{public}s.", args.c_str());
125     if (args.length() > DAUDIO_MAX_JSON_LEN || args.empty()) {
126         return ERR_DH_AUDIO_SA_PARAM_INVALID;
127     }
128     cJSON *jParam = cJSON_Parse(args.c_str());
129     CHECK_NULL_RETURN(jParam, ERR_DH_AUDIO_NULLPTR);
130     if (!CJsonParamCheck(jParam, { KEY_DH_ID, KEY_AUDIO_PARAM })) {
131         cJSON_Delete(jParam);
132         DHLOGE("Not found the keys.");
133         return ERR_DH_AUDIO_FAILED;
134     }
135     int32_t dhId = ConvertString2Int(std::string(cJSON_GetObjectItem(jParam, KEY_DH_ID)->valuestring));
136     CHECK_AND_FREE_RETURN_RET_LOG(dhId == -1, ERR_DH_AUDIO_NULLPTR, jParam,
137         "%{public}s", "Parse dhId error.");
138     std::shared_ptr<ISpkClient> speakerClient = nullptr;
139     {
140         std::lock_guard<std::mutex> devLck(spkClientMutex_);
141         speakerClient = spkClientMap_[dhId];
142     }
143     cJSON *audioParamJson = cJSON_GetObjectItem(jParam, KEY_AUDIO_PARAM);
144     AudioParam audioParam;
145     int32_t ret = from_json(audioParamJson, audioParam);
146     if (ret != DH_SUCCESS) {
147         DHLOGE("Get audio param from cjson failed, error code %{public}d.", ret);
148         cJSON_Delete(jParam);
149         return ret;
150     }
151     CHECK_NULL_FREE_RETURN(speakerClient, ERR_DH_AUDIO_NULLPTR, jParam);
152     ret = speakerClient->SetUp(audioParam);
153     CHECK_AND_FREE_RETURN_RET_LOG(ret != DH_SUCCESS, ret, jParam,
154         "Setup speaker failed, ret: %{public}d.", ret);
155     isSpkInUse_.store(true);
156     cJSON_Delete(jParam);
157     return ret;
158 }
159 
TaskCloseDSpeaker(const std::string & args)160 int32_t DAudioSinkDev::TaskCloseDSpeaker(const std::string &args)
161 {
162     DHLOGI("Close speaker device.");
163     int32_t dhId = ParseDhidFromEvent(args);
164     if (dhId == ERR_DH_AUDIO_FAILED) {
165         DHLOGE("Failed to parse dhardware id.");
166         return ERR_DH_AUDIO_FAILED;
167     }
168     std::lock_guard<std::mutex> devLck(spkClientMutex_);
169     auto speakerClient = spkClientMap_[dhId];
170     CHECK_NULL_RETURN(speakerClient, DH_SUCCESS);
171 
172     int32_t ret = speakerClient->StopRender();
173     if (ret != DH_SUCCESS) {
174         DHLOGE("Stop speaker client failed, ret: %{public}d.", ret);
175     }
176     ret = speakerClient->Release();
177     if (ret != DH_SUCCESS) {
178         DHLOGE("Release speaker client failed, ret: %{public}d.", ret);
179     }
180     spkClientMap_.erase(dhId);
181     DHLOGI("Close speaker device task excute success.");
182     return DH_SUCCESS;
183 }
184 
ParseDhidFromEvent(std::string args)185 int32_t DAudioSinkDev::ParseDhidFromEvent(std::string args)
186 {
187     DHLOGI("ParseDhidFrom args : %{public}s", args.c_str());
188     cJSON *jParam = cJSON_Parse(args.c_str());
189     CHECK_NULL_RETURN(jParam, ERR_DH_AUDIO_FAILED);
190 
191     if (!CJsonParamCheck(jParam, { KEY_DH_ID })) {
192         DHLOGE("Not found the keys of dhId.");
193         cJSON_Delete(jParam);
194         return ERR_DH_AUDIO_FAILED;
195     }
196     cJSON *dhIdItem = cJSON_GetObjectItem(jParam, KEY_DH_ID);
197     if (dhIdItem == NULL || !cJSON_IsString(dhIdItem)) {
198         DHLOGE("Not found the keys of dhId.");
199         cJSON_Delete(jParam);
200         return ERR_DH_AUDIO_FAILED;
201     }
202     int32_t dhId = ConvertString2Int(std::string(dhIdItem->valuestring));
203     cJSON_Delete(jParam);
204     DHLOGI("Parsed dhId is: %{public}d.", dhId);
205     return dhId;
206 }
207 
ParseResultFromEvent(std::string args)208 int32_t DAudioSinkDev::ParseResultFromEvent(std::string args)
209 {
210     DHLOGD("ParseResultFrom args : %{public}s", args.c_str());
211     cJSON *jParam = cJSON_Parse(args.c_str());
212     CHECK_NULL_RETURN(jParam, ERR_DH_AUDIO_FAILED);
213 
214     if (!CJsonParamCheck(jParam, { KEY_RESULT })) {
215         DHLOGE("Not found the keys of result.");
216         cJSON_Delete(jParam);
217         return -1;
218     }
219     cJSON *retItem = cJSON_GetObjectItem(jParam, KEY_RESULT);
220     if (retItem == NULL || !cJSON_IsNumber(retItem)) {
221         DHLOGE("Not found the keys of result.");
222         cJSON_Delete(jParam);
223         return ERR_DH_AUDIO_FAILED;
224     }
225     int32_t ret = retItem->valueint;
226     cJSON_Delete(jParam);
227     DHLOGI("Parsed result is: %{public}d.", ret);
228     return ret;
229 }
230 
TaskStartRender(const std::string & args)231 int32_t DAudioSinkDev::TaskStartRender(const std::string &args)
232 {
233     int32_t dhId = ParseDhidFromEvent(args);
234     if (dhId == ERR_DH_AUDIO_FAILED) {
235         DHLOGE("Failed to parse dhardware id.");
236         return ERR_DH_AUDIO_FAILED;
237     }
238     std::shared_ptr<ISpkClient> speakerClient = nullptr;
239     {
240         std::lock_guard<std::mutex> devLck(spkClientMutex_);
241         speakerClient = spkClientMap_[dhId];
242     }
243     CHECK_NULL_RETURN(speakerClient, ERR_DH_AUDIO_NULLPTR);
244 
245     int32_t ret = speakerClient->StartRender();
246     CHECK_AND_RETURN_RET_LOG(ret != DH_SUCCESS, ret,
247         "Start render failed. ret: %{public}d.", ret);
248     DHLOGI("Start render success.");
249     return DH_SUCCESS;
250 }
251 
TaskOpenDMic(const std::string & args)252 int32_t DAudioSinkDev::TaskOpenDMic(const std::string &args)
253 {
254     DHLOGI("Open mic device.");
255     if (!isDevLevelStatus_) {
256         DHLOGI("Dev security level status is false.");
257         return ERR_DH_AUDIO_FAILED;
258     }
259     if (args.length() > DAUDIO_MAX_JSON_LEN || args.empty()) {
260         return ERR_DH_AUDIO_SA_PARAM_INVALID;
261     }
262     cJSON *jParam = cJSON_Parse(args.c_str());
263     CHECK_NULL_RETURN(jParam, ERR_DH_AUDIO_NULLPTR);
264     if (!CJsonParamCheck(jParam, { KEY_DH_ID, KEY_AUDIO_PARAM })) {
265         DHLOGE("Not found the keys.");
266         cJSON_Delete(jParam);
267         return ERR_DH_AUDIO_FAILED;
268     }
269     AudioParam audioParam;
270     cJSON *audioParamJson = cJSON_GetObjectItem(jParam, KEY_AUDIO_PARAM);
271     int32_t ret = from_json(audioParamJson, audioParam);
272     if (ret != DH_SUCCESS) {
273         DHLOGE("Get audio param from cjson failed, error code %{public}d.", ret);
274         cJSON_Delete(jParam);
275         return ret;
276     }
277     CHECK_AND_FREE_RETURN_RET_LOG(ret != DH_SUCCESS, ret, jParam,
278         "Get audio param from cjson failed, error code %{public}d.", ret);
279     int32_t dhId = ParseDhidFromEvent(args);
280     CHECK_AND_FREE_RETURN_RET_LOG(dhId == -1, ERR_DH_AUDIO_NULLPTR, jParam,
281         "%{public}s", "Parse dhId error.");
282     micDhId_ = std::to_string(dhId);
283     std::shared_ptr<DMicClient> micClient = nullptr;
284     {
285         std::lock_guard<std::mutex> devLck(micClientMutex_);
286         micClient = micClientMap_[dhId];
287     }
288     CHECK_NULL_FREE_RETURN(micClient, ERR_DH_AUDIO_NULLPTR, jParam);
289     ret = micClient->SetUp(audioParam);
290     CHECK_AND_FREE_RETURN_RET_LOG(ret != DH_SUCCESS, ERR_DH_AUDIO_FAILED, jParam,
291         "Set up mic failed, ret: %{public}d.", ret);
292     ret = micClient->StartCapture();
293     CHECK_AND_FREE_RETURN_RET_LOG(ret != DH_SUCCESS, ERR_DH_AUDIO_FAILED, jParam,
294         "Start capture failed, ret: %{public}d.", ret);
295     PullUpPage();
296     isMicInUse_.store(true);
297     cJSON_Delete(jParam);
298     return ret;
299 }
300 
TaskCloseDMic(const std::string & args)301 int32_t DAudioSinkDev::TaskCloseDMic(const std::string &args)
302 {
303     DHLOGI("Close mic device.");
304     int32_t dhId = ParseDhidFromEvent(args);
305     if (dhId == ERR_DH_AUDIO_FAILED) {
306         DHLOGE("Failed to parse dhardware id.");
307         return ERR_DH_AUDIO_FAILED;
308     }
309     std::lock_guard<std::mutex> devLck(micClientMutex_);
310     std::shared_ptr<DMicClient> micClient = micClientMap_[dhId];
311     CHECK_NULL_RETURN(micClient, DH_SUCCESS);
312 
313     int32_t ret = micClient->StopCapture();
314     CHECK_AND_LOG(ret != DH_SUCCESS, "Stop mic client failed, ret: %{public}d.", ret);
315     ret = micClient->Release();
316     CHECK_AND_LOG(ret != DH_SUCCESS, "Release mic client failed, ret: %{public}d.", ret);
317     micClientMap_.erase(dhId);
318     if (isPageStatus_.load() && ipcSinkCallback_ != nullptr) {
319         bool isSensitive = false;
320         bool isSameAccount = false;
321         ipcSinkCallback_->OnNotifyResourceInfo(ResourceEventType::EVENT_TYPE_CLOSE_PAGE, SUBTYPE, devId_,
322             isSensitive, isSameAccount);
323         isPageStatus_.store(false);
324     }
325     DHLOGI("Close mic device task excute success.");
326     return DH_SUCCESS;
327 }
328 
TaskSetParameter(const std::string & args)329 int32_t DAudioSinkDev::TaskSetParameter(const std::string &args)
330 {
331     DHLOGD("Set audio param.");
332     AudioEvent event(AudioEventType::EVENT_UNKNOWN, args);
333     int32_t dhId = ParseDhidFromEvent(args);
334     if (dhId == ERR_DH_AUDIO_FAILED) {
335         DHLOGE("Failed to parse dhardware id.");
336         return ERR_DH_AUDIO_FAILED;
337     }
338     std::shared_ptr<ISpkClient> speakerClient = nullptr;
339     {
340         std::lock_guard<std::mutex> devLck(spkClientMutex_);
341         speakerClient = spkClientMap_[dhId];
342     }
343     CHECK_NULL_RETURN(speakerClient, ERR_DH_AUDIO_NULLPTR);
344     return speakerClient->SetAudioParameters(event);
345 }
346 
TaskSetVolume(const std::string & args)347 int32_t DAudioSinkDev::TaskSetVolume(const std::string &args)
348 {
349     DHLOGD("Set audio volume.");
350     int32_t dhId = 0;
351     if (GetAudioParamInt(args, "dhId", dhId) != DH_SUCCESS) {
352         DHLOGE("Get key of dhId failed.");
353         return ERR_DH_AUDIO_FAILED;
354     }
355     std::shared_ptr<ISpkClient> speakerClient = nullptr;
356     {
357         std::lock_guard<std::mutex> devLck(spkClientMutex_);
358         speakerClient = spkClientMap_[dhId];
359     }
360     CHECK_NULL_RETURN(speakerClient, ERR_DH_AUDIO_NULLPTR);
361 
362     AudioEvent event(AudioEventType::VOLUME_SET, args);
363     int32_t ret = speakerClient->SetAudioParameters(event);
364     CHECK_AND_RETURN_RET_LOG(ret != DH_SUCCESS, ret,
365         "Volume set failed, ret: %{public}d.", ret);
366     DHLOGD("Set audio volume success.");
367     return DH_SUCCESS;
368 }
369 
TaskSetMute(const std::string & args)370 int32_t DAudioSinkDev::TaskSetMute(const std::string &args)
371 {
372     DHLOGD("Set audio mute.");
373     int dhId = 0;
374     if (GetAudioParamInt(args, "dhId", dhId) != DH_SUCCESS) {
375         DHLOGE("Get key of dhId failed.");
376         return ERR_DH_AUDIO_FAILED;
377     }
378     std::shared_ptr<ISpkClient> speakerClient = nullptr;
379     {
380         std::lock_guard<std::mutex> devLck(spkClientMutex_);
381         speakerClient = spkClientMap_[dhId];
382     }
383     CHECK_NULL_RETURN(speakerClient, ERR_DH_AUDIO_NULLPTR);
384 
385     AudioEvent event(AudioEventType::VOLUME_MUTE_SET, args);
386     int32_t ret = speakerClient->SetMute(event);
387     CHECK_AND_RETURN_RET_LOG(ret != DH_SUCCESS, ret,
388         "Set mute failed, ret: %{public}d.", ret);
389     DHLOGD("Set mute success.");
390     return DH_SUCCESS;
391 }
392 
TaskVolumeChange(const std::string & args)393 int32_t DAudioSinkDev::TaskVolumeChange(const std::string &args)
394 {
395     DHLOGD("Audio volume changed.");
396     AudioEvent event(AudioEventType::VOLUME_CHANGE, args);
397     return SendAudioEventToRemote(event);
398 }
399 
TaskFocusChange(const std::string & args)400 int32_t DAudioSinkDev::TaskFocusChange(const std::string &args)
401 {
402     DHLOGD("Audio focus changed.");
403     AudioEvent event(AudioEventType::AUDIO_FOCUS_CHANGE, args);
404     return SendAudioEventToRemote(event);
405 }
406 
TaskRenderStateChange(const std::string & args)407 int32_t DAudioSinkDev::TaskRenderStateChange(const std::string &args)
408 {
409     DHLOGD("Audio render state changed.");
410     AudioEvent event(AudioEventType::AUDIO_RENDER_STATE_CHANGE, args);
411     return SendAudioEventToRemote(event);
412 }
413 
TaskPlayStatusChange(const std::string & args)414 int32_t DAudioSinkDev::TaskPlayStatusChange(const std::string &args)
415 {
416     DHLOGD("Play status change, content: %{public}s.", args.c_str());
417     int32_t dhId = ParseDhidFromEvent(args);
418     if (dhId == ERR_DH_AUDIO_FAILED) {
419         DHLOGE("Failed to parse dhardware id.");
420         return ERR_DH_AUDIO_FAILED;
421     }
422     std::shared_ptr<ISpkClient> speakerClient = nullptr;
423     {
424         std::lock_guard<std::mutex> devLck(spkClientMutex_);
425         speakerClient = spkClientMap_[dhId];
426     }
427     CHECK_NULL_RETURN(speakerClient, ERR_DH_AUDIO_NULLPTR);
428     speakerClient->PlayStatusChange(args);
429     DHLOGD("Play status change success.");
430     return DH_SUCCESS;
431 }
432 
SendAudioEventToRemote(const AudioEvent & event)433 int32_t DAudioSinkDev::SendAudioEventToRemote(const AudioEvent &event)
434 {
435     // because: type: VOLUME_CHANGE / AUDIO_FOCUS_CHANGE / AUDIO_RENDER_STATE_CHANGE
436     // so speakerClient
437     int32_t dhId = ParseDhidFromEvent(event.content);
438     if (dhId == ERR_DH_AUDIO_FAILED) {
439         DHLOGE("Failed to parse dhardware id.");
440         return ERR_DH_AUDIO_FAILED;
441     }
442     std::shared_ptr<ISpkClient> speakerClient = nullptr;
443     {
444         std::lock_guard<std::mutex> devLck(spkClientMutex_);
445         speakerClient = spkClientMap_[dhId];
446     }
447     CHECK_NULL_RETURN(speakerClient, ERR_DH_AUDIO_NULLPTR);
448 
449     int32_t ret = speakerClient->SendMessage(static_cast<uint32_t>(event.type),
450         event.content, devId_);
451     CHECK_AND_RETURN_RET_LOG(ret != DH_SUCCESS, ERR_DH_AUDIO_NULLPTR,
452         "%{public}s", "Task send message to remote failed.");
453     return DH_SUCCESS;
454 }
455 
JudgeDeviceStatus()456 void DAudioSinkDev::JudgeDeviceStatus()
457 {
458     DHLOGD("Checking device's status.");
459     if (isSpkInUse_.load() || isMicInUse_.load()) {
460         DHLOGI("Device contain periperials in using, speaker status: %{public}d, mic status: %{public}d.",
461             isSpkInUse_.load(), isMicInUse_.load());
462         return;
463     }
464     DAudioSinkManager::GetInstance().OnSinkDevReleased(devId_);
465 }
466 
SetDevLevelStatus(bool checkStatus)467 void DAudioSinkDev::SetDevLevelStatus(bool checkStatus)
468 {
469     isDevLevelStatus_ = checkStatus;
470 }
471 
ConvertString2Int(std::string val)472 int32_t DAudioSinkDev::ConvertString2Int(std::string val)
473 {
474     if (!CheckIsNum(val)) {
475         DHLOGE("String is not number. str:%{public}s.", val.c_str());
476         return ERR_DH_AUDIO_FAILED;
477     }
478     return std::atoi(val.c_str());
479 }
480 
PullUpPage()481 void DAudioSinkDev::PullUpPage()
482 {
483     bool isSensitive = false;
484     bool isSameAccount = false;
485     if (ipcSinkCallback_ != nullptr) {
486         ipcSinkCallback_->OnNotifyResourceInfo(ResourceEventType::EVENT_TYPE_PULL_UP_PAGE, SUBTYPE, devId_,
487             isSensitive, isSameAccount);
488         isPageStatus_.store(true);
489     }
490 }
491 
NotifySourceDev(const AudioEventType type,const std::string dhId,const int32_t result)492 void DAudioSinkDev::NotifySourceDev(const AudioEventType type, const std::string dhId, const int32_t result)
493 {
494     std::random_device rd;
495     const uint32_t randomTaskCode = rd();
496     cJSON *jEvent = cJSON_CreateObject();
497     CHECK_NULL_VOID(jEvent);
498     cJSON_AddStringToObject(jEvent, KEY_DH_ID, dhId.c_str());
499     cJSON_AddNumberToObject(jEvent, KEY_RESULT, result);
500     cJSON_AddNumberToObject(jEvent, KEY_EVENT_TYPE, static_cast<int32_t>(type));
501     cJSON_AddStringToObject(jEvent, KEY_RANDOM_TASK_CODE, std::to_string(randomTaskCode).c_str());
502 
503     DHLOGI("Notify source dev, new engine, random task code:%{public}s", std::to_string(randomTaskCode).c_str());
504     int32_t dhIdInt = ConvertString2Int(dhId);
505     if (dhIdInt == -1) {
506         DHLOGE("Parse dhId error.");
507         cJSON_Delete(jEvent);
508         return;
509     }
510     char *data = cJSON_PrintUnformatted(jEvent);
511     if (data == nullptr) {
512         DHLOGE("Failed to create JSON data.");
513         cJSON_Delete(jEvent);
514         return;
515     }
516     std::string message(data);
517 
518     std::shared_ptr<ISpkClient> speakerClient = nullptr;
519     {
520         std::lock_guard<std::mutex> devLck(spkClientMutex_);
521         speakerClient = spkClientMap_[dhIdInt];
522     }
523     if (speakerClient != nullptr) {
524         speakerClient->SendMessage(static_cast<uint32_t>(type), message, devId_);
525     }
526     std::shared_ptr<DMicClient> micClient = nullptr;
527     {
528         std::lock_guard<std::mutex> devLck(micClientMutex_);
529         micClient = micClientMap_[dhIdInt];
530     }
531     if (micClient != nullptr) {
532         micClient->SendMessage(static_cast<uint32_t>(type), message, devId_);
533     }
534     cJSON_Delete(jEvent);
535     cJSON_free(data);
536 }
537 
GetParamValue(const cJSON * j,const char * key,int32_t & value)538 int32_t DAudioSinkDev::GetParamValue(const cJSON *j, const char* key, int32_t &value)
539 {
540     cJSON *paramValue = cJSON_GetObjectItemCaseSensitive(j, key);
541     if (paramValue == nullptr || !cJSON_IsNumber(paramValue)) {
542         return ERR_DH_AUDIO_FAILED;
543     }
544     value = paramValue->valueint;
545     return DH_SUCCESS;
546 }
547 
GetCJsonObjectItems(const cJSON * j,AudioParam & audioParam)548 int32_t DAudioSinkDev::GetCJsonObjectItems(const cJSON *j, AudioParam &audioParam)
549 {
550     int32_t ret = 0;
551     ret = GetParamValue(j, KEY_SAMPLING_RATE, reinterpret_cast<int32_t&>(audioParam.comParam.sampleRate));
552     CHECK_AND_RETURN_RET_LOG(ret != DH_SUCCESS, ret, "%{public}s", "Get param value error.");
553     ret = GetParamValue(j, KEY_CHANNELS, reinterpret_cast<int32_t&>(audioParam.comParam.channelMask));
554     CHECK_AND_RETURN_RET_LOG(ret != DH_SUCCESS, ret, "%{public}s", "Get param value error.");
555     ret = GetParamValue(j, KEY_FORMAT, reinterpret_cast<int32_t&>(audioParam.comParam.bitFormat));
556     CHECK_AND_RETURN_RET_LOG(ret != DH_SUCCESS, ret, "%{public}s", "Get param value error.");
557     ret = GetParamValue(j, KEY_FRAMESIZE, reinterpret_cast<int32_t&>(audioParam.comParam.frameSize));
558     CHECK_AND_RETURN_RET_LOG(ret != DH_SUCCESS, ret, "%{public}s", "Get param value error.");
559     ret = GetParamValue(j, KEY_SOURCE_TYPE, reinterpret_cast<int32_t&>(audioParam.captureOpts.sourceType));
560     CHECK_AND_RETURN_RET_LOG(ret != DH_SUCCESS, ret, "%{public}s", "Get param value error.");
561     ret = GetParamValue(j, KEY_CONTENT_TYPE, reinterpret_cast<int32_t&>(audioParam.renderOpts.contentType));
562     CHECK_AND_RETURN_RET_LOG(ret != DH_SUCCESS, ret, "%{public}s", "Get param value error.");
563     ret = GetParamValue(j, KEY_STREAM_USAGE, reinterpret_cast<int32_t&>(audioParam.renderOpts.streamUsage));
564     CHECK_AND_RETURN_RET_LOG(ret != DH_SUCCESS, ret, "%{public}s", "Get param value error.");
565     ret = GetParamValue(j, KEY_RENDER_FLAGS, reinterpret_cast<int32_t&>(audioParam.renderOpts.renderFlags));
566     CHECK_AND_RETURN_RET_LOG(ret != DH_SUCCESS, ret, "%{public}s", "Get param value error.");
567     ret = GetParamValue(j, KEY_CAPTURE_FLAGS, reinterpret_cast<int32_t&>(audioParam.captureOpts.capturerFlags));
568     CHECK_AND_RETURN_RET_LOG(ret != DH_SUCCESS, ret, "%{public}s", "Get param value error.");
569 
570     if (CJsonParamCheck(j, { KEY_CODEC_TYPE })) {
571         ret = GetParamValue(j, KEY_CODEC_TYPE, reinterpret_cast<int32_t&>(audioParam.comParam.codecType));
572         CHECK_AND_RETURN_RET_LOG(ret != DH_SUCCESS, ret, "%{public}s", "Get param value error.");
573     }
574     DHLOGD("codecType: %{public}d", static_cast<int32_t>(audioParam.comParam.codecType));
575     return ret;
576 }
577 
from_json(const cJSON * j,AudioParam & audioParam)578 int32_t DAudioSinkDev::from_json(const cJSON  *j, AudioParam &audioParam)
579 {
580     if (!CJsonParamCheck(j, { KEY_SAMPLING_RATE, KEY_CHANNELS, KEY_FORMAT,
581         KEY_SOURCE_TYPE, KEY_CONTENT_TYPE, KEY_STREAM_USAGE })) {
582         DHLOGE("Not found the keys of dhId");
583         return ERR_DH_AUDIO_FAILED;
584     }
585     if (GetCJsonObjectItems(j, audioParam) != DH_SUCCESS) {
586         DHLOGE("Get Cjson Object Items failed.");
587         return ERR_DH_AUDIO_FAILED;
588     }
589     return DH_SUCCESS;
590 }
591 
HandleEngineMessage(uint32_t type,std::string content,std::string devId)592 int32_t DAudioSinkDev::HandleEngineMessage(uint32_t type, std::string content, std::string devId)
593 {
594     DHLOGI("HandleEngineMessage enter.");
595     return DAudioSinkManager::GetInstance().HandleDAudioNotify(devId, devId, static_cast<int32_t>(type), content);
596 }
597 
SinkEventHandler(const std::shared_ptr<AppExecFwk::EventRunner> & runner,const std::shared_ptr<DAudioSinkDev> & dev)598 DAudioSinkDev::SinkEventHandler::SinkEventHandler(const std::shared_ptr<AppExecFwk::EventRunner> &runner,
599     const std::shared_ptr<DAudioSinkDev> &dev) : AppExecFwk::EventHandler(runner), sinkDev_(dev)
600 {
601     DHLOGD("Event handler is constructing.");
602     mapEventFuncs_[static_cast<uint32_t>(CTRL_OPENED)] = &DAudioSinkDev::SinkEventHandler::NotifyCtrlOpened;
603     mapEventFuncs_[static_cast<uint32_t>(CTRL_CLOSED)] = &DAudioSinkDev::SinkEventHandler::NotifyCtrlClosed;
604     mapEventFuncs_[static_cast<uint32_t>(OPEN_SPEAKER)] = &DAudioSinkDev::SinkEventHandler::NotifyOpenSpeaker;
605     mapEventFuncs_[static_cast<uint32_t>(CLOSE_SPEAKER)] = &DAudioSinkDev::SinkEventHandler::NotifyCloseSpeaker;
606     mapEventFuncs_[static_cast<uint32_t>(SPEAKER_OPENED)] = &DAudioSinkDev::SinkEventHandler::NotifySpeakerOpened;
607     mapEventFuncs_[static_cast<uint32_t>(SPEAKER_CLOSED)] = &DAudioSinkDev::SinkEventHandler::NotifySpeakerClosed;
608     mapEventFuncs_[static_cast<uint32_t>(OPEN_MIC)] = &DAudioSinkDev::SinkEventHandler::NotifyOpenMic;
609     mapEventFuncs_[static_cast<uint32_t>(CLOSE_MIC)] = &DAudioSinkDev::SinkEventHandler::NotifyCloseMic;
610     mapEventFuncs_[static_cast<uint32_t>(MIC_OPENED)] = &DAudioSinkDev::SinkEventHandler::NotifyMicOpened;
611     mapEventFuncs_[static_cast<uint32_t>(MIC_CLOSED)] = &DAudioSinkDev::SinkEventHandler::NotifyMicClosed;
612     mapEventFuncs_[static_cast<uint32_t>(VOLUME_SET)] = &DAudioSinkDev::SinkEventHandler::NotifySetVolume;
613     mapEventFuncs_[static_cast<uint32_t>(VOLUME_CHANGE)] = &DAudioSinkDev::SinkEventHandler::NotifyVolumeChange;
614     mapEventFuncs_[static_cast<uint32_t>(SET_PARAM)] = &DAudioSinkDev::SinkEventHandler::NotifySetParam;
615     mapEventFuncs_[static_cast<uint32_t>(VOLUME_MUTE_SET)] = &DAudioSinkDev::SinkEventHandler::NotifySetMute;
616     mapEventFuncs_[static_cast<uint32_t>(AUDIO_FOCUS_CHANGE)] = &DAudioSinkDev::SinkEventHandler::NotifyFocusChange;
617     mapEventFuncs_[static_cast<uint32_t>(AUDIO_RENDER_STATE_CHANGE)] =
618         &DAudioSinkDev::SinkEventHandler::NotifyRenderStateChange;
619     mapEventFuncs_[static_cast<uint32_t>(CHANGE_PLAY_STATUS)] =
620         &DAudioSinkDev::SinkEventHandler::NotifyPlayStatusChange;
621 }
622 
~SinkEventHandler()623 DAudioSinkDev::SinkEventHandler::~SinkEventHandler() {}
624 
ProcessEventInner(const AppExecFwk::InnerEvent::Pointer & event)625 void DAudioSinkDev::SinkEventHandler::ProcessEventInner(const AppExecFwk::InnerEvent::Pointer &event)
626 {
627     CHECK_NULL_VOID(event);
628     switch (event->GetInnerEventId()) {
629         case OPEN_MIC:
630             NotifyOpenMic(event);
631             break;
632         case CLOSE_MIC:
633             NotifyCloseMic(event);
634             break;
635         case MIC_OPENED:
636             NotifyMicOpened(event);
637             break;
638         case MIC_CLOSED:
639             NotifyMicClosed(event);
640             break;
641         case VOLUME_SET:
642             NotifySetVolume(event);
643             break;
644         case VOLUME_CHANGE:
645             NotifyVolumeChange(event);
646             break;
647         case SET_PARAM:
648             NotifySetParam(event);
649             break;
650         case VOLUME_MUTE_SET:
651             NotifySetMute(event);
652             break;
653         case AUDIO_FOCUS_CHANGE:
654             NotifyFocusChange(event);
655             break;
656         case AUDIO_RENDER_STATE_CHANGE:
657             NotifyRenderStateChange(event);
658             break;
659         case CHANGE_PLAY_STATUS:
660             NotifyPlayStatusChange(event);
661             break;
662         default:
663             break;
664     }
665 }
666 
ProcessEvent(const AppExecFwk::InnerEvent::Pointer & event)667 void DAudioSinkDev::SinkEventHandler::ProcessEvent(const AppExecFwk::InnerEvent::Pointer &event)
668 {
669     CHECK_NULL_VOID(event);
670     DHLOGD("Event Id=%{public}d", event->GetInnerEventId());
671     switch (event->GetInnerEventId()) {
672         case CTRL_OPENED:
673             NotifyCtrlOpened(event);
674             break;
675         case CTRL_CLOSED:
676             NotifyCtrlClosed(event);
677             break;
678         case OPEN_SPEAKER:
679             NotifyOpenSpeaker(event);
680             break;
681         case CLOSE_SPEAKER:
682             NotifyCloseSpeaker(event);
683             break;
684         case SPEAKER_OPENED:
685             NotifySpeakerOpened(event);
686             break;
687         case SPEAKER_CLOSED:
688             NotifySpeakerClosed(event);
689             break;
690         case OPEN_MIC:
691         case CLOSE_MIC:
692         case MIC_OPENED:
693         case MIC_CLOSED:
694         case VOLUME_SET:
695         case VOLUME_CHANGE:
696         case SET_PARAM:
697         case VOLUME_MUTE_SET:
698         case AUDIO_FOCUS_CHANGE:
699         case AUDIO_RENDER_STATE_CHANGE:
700         case CHANGE_PLAY_STATUS:
701             ProcessEventInner(event);
702             break;
703         default:
704             DHLOGE("Event Id is invaild. %{public}d", event->GetInnerEventId());
705             break;
706     }
707 }
708 
NotifyCtrlOpened(const AppExecFwk::InnerEvent::Pointer & event)709 void DAudioSinkDev::SinkEventHandler::NotifyCtrlOpened(const AppExecFwk::InnerEvent::Pointer &event)
710 {
711     DHLOGI("Ctrl channel is opened. begin to init dev, then to notify source dev.");
712     std::string eventParam;
713     if (GetEventParam(event, eventParam) != DH_SUCCESS) {
714         DHLOGE("Failed to get event parameters.");
715         return;
716     }
717     auto sinkDevObj = sinkDev_.lock();
718     CHECK_NULL_VOID(sinkDevObj);
719 
720     int32_t dhId = sinkDevObj->ParseDhidFromEvent(eventParam);
721     CHECK_AND_RETURN_LOG(dhId == -1, "%{public}s", "Parse dhId error.");
722     int32_t ret = sinkDevObj->ParseResultFromEvent(eventParam);
723     sinkDevObj->NotifySourceDev(NOTIFY_OPEN_CTRL_RESULT, std::to_string(dhId), ret);
724     DHLOGI("Init sink device task end, notify source ret %{public}d.", ret);
725     CHECK_AND_RETURN_LOG(ret != DH_SUCCESS, "%{public}s", "Init sink device failed.");
726 }
727 
NotifyCtrlClosed(const AppExecFwk::InnerEvent::Pointer & event)728 void DAudioSinkDev::SinkEventHandler::NotifyCtrlClosed(const AppExecFwk::InnerEvent::Pointer &event)
729 {
730     DHLOGI("Notify ctrl closed.");
731     (void)event;
732 }
733 
NotifyOpenSpeaker(const AppExecFwk::InnerEvent::Pointer & event)734 void DAudioSinkDev::SinkEventHandler::NotifyOpenSpeaker(const AppExecFwk::InnerEvent::Pointer &event)
735 {
736     std::string eventParam;
737     if (GetEventParam(event, eventParam) != DH_SUCCESS) {
738         DHLOGE("Failed to get event parameters.");
739         return;
740     }
741     auto sinkDevObj = sinkDev_.lock();
742     CHECK_NULL_VOID(sinkDevObj);
743 
744     int32_t dhId = sinkDevObj->ParseDhidFromEvent(eventParam);
745     CHECK_AND_RETURN_LOG(dhId == -1, "%{public}s", "Parse dhId error.");
746     int32_t ret = sinkDevObj->TaskOpenDSpeaker(eventParam);
747     sinkDevObj->NotifySourceDev(NOTIFY_OPEN_SPEAKER_RESULT, std::to_string(dhId), ret);
748     DHLOGI("Open speaker device task end, notify source ret %{public}d.", ret);
749     CHECK_AND_RETURN_LOG(ret != DH_SUCCESS, "%{public}s", "Open speaker failed.");
750 }
751 
NotifyCloseSpeaker(const AppExecFwk::InnerEvent::Pointer & event)752 void DAudioSinkDev::SinkEventHandler::NotifyCloseSpeaker(const AppExecFwk::InnerEvent::Pointer &event)
753 {
754     std::string eventParam;
755     if (GetEventParam(event, eventParam) != DH_SUCCESS) {
756         DHLOGE("Failed to get event parameters.");
757         return;
758     }
759     auto sinkDevObj = sinkDev_.lock();
760     CHECK_NULL_VOID(sinkDevObj);
761     CHECK_AND_RETURN_LOG(sinkDevObj->TaskCloseDSpeaker(eventParam) != DH_SUCCESS,
762         "%{public}s", "close speaker failed.");
763 }
764 
NotifySpeakerOpened(const AppExecFwk::InnerEvent::Pointer & event)765 void DAudioSinkDev::SinkEventHandler::NotifySpeakerOpened(const AppExecFwk::InnerEvent::Pointer &event)
766 {
767     DHLOGD("Starting render.");
768     std::string eventParam;
769     if (GetEventParam(event, eventParam) != DH_SUCCESS) {
770         DHLOGE("Failed to get event parameters.");
771         return;
772     }
773     auto sinkDevObj = sinkDev_.lock();
774     CHECK_NULL_VOID(sinkDevObj);
775     CHECK_AND_RETURN_LOG(sinkDevObj->TaskStartRender(eventParam) != DH_SUCCESS,
776         "%{public}s", "Speaker client start failed.");
777     CHECK_AND_RETURN_LOG(sinkDevObj->TaskVolumeChange(eventParam) != DH_SUCCESS,
778         "%{public}s", "Notify pimary volume to source device failed.");
779 }
780 
NotifySpeakerClosed(const AppExecFwk::InnerEvent::Pointer & event)781 void DAudioSinkDev::SinkEventHandler::NotifySpeakerClosed(const AppExecFwk::InnerEvent::Pointer &event)
782 {
783     std::string eventParam;
784     if (GetEventParam(event, eventParam) != DH_SUCCESS) {
785         DHLOGE("Failed to get event parameters.");
786         return;
787     }
788     auto sinkDevObj = sinkDev_.lock();
789     CHECK_NULL_VOID(sinkDevObj);
790     CHECK_AND_RETURN_LOG(sinkDevObj->TaskCloseDSpeaker(eventParam) != DH_SUCCESS,
791         "%{public}s", "Close speaker failed.");
792 }
793 
NotifyOpenMic(const AppExecFwk::InnerEvent::Pointer & event)794 void DAudioSinkDev::SinkEventHandler::NotifyOpenMic(const AppExecFwk::InnerEvent::Pointer &event)
795 {
796     std::string eventParam;
797     if (GetEventParam(event, eventParam) != DH_SUCCESS) {
798         DHLOGE("Failed to get event parameters.");
799         return;
800     }
801     auto sinkDevObj = sinkDev_.lock();
802     CHECK_NULL_VOID(sinkDevObj);
803 
804     cJSON *jParam = cJSON_Parse(eventParam.c_str());
805     CHECK_NULL_VOID(jParam);
806     if (!CJsonParamCheck(jParam, { KEY_DH_ID, KEY_AUDIO_PARAM })) {
807         DHLOGE("Json param check failed.");
808         cJSON_Delete(jParam);
809         return;
810     }
811     int32_t ret = sinkDevObj->TaskOpenDMic(eventParam);
812     sinkDevObj->NotifySourceDev(NOTIFY_OPEN_MIC_RESULT,
813         std::string(cJSON_GetObjectItem(jParam, KEY_DH_ID)->valuestring), ret);
814     DHLOGI("Open mic device task end, notify source ret %{public}d.", ret);
815     CHECK_AND_FREE_RETURN_LOG(ret != DH_SUCCESS, jParam, "%{public}s", "Open mic failed.");
816     cJSON_Delete(jParam);
817 }
818 
NotifyCloseMic(const AppExecFwk::InnerEvent::Pointer & event)819 void DAudioSinkDev::SinkEventHandler::NotifyCloseMic(const AppExecFwk::InnerEvent::Pointer &event)
820 {
821     std::string eventParam;
822     if (GetEventParam(event, eventParam) != DH_SUCCESS) {
823         DHLOGE("Failed to get event parameters.");
824         return;
825     }
826     auto sinkDevObj = sinkDev_.lock();
827     CHECK_NULL_VOID(sinkDevObj);
828     CHECK_AND_RETURN_LOG(sinkDevObj->TaskCloseDMic(eventParam) != DH_SUCCESS,
829         "%{public}s", "Close mic failed.");
830 }
831 
NotifyMicOpened(const AppExecFwk::InnerEvent::Pointer & event)832 void DAudioSinkDev::SinkEventHandler::NotifyMicOpened(const AppExecFwk::InnerEvent::Pointer &event)
833 {
834     DHLOGI("Notify mic is opened.");
835     (void)event;
836 }
837 
NotifyMicClosed(const AppExecFwk::InnerEvent::Pointer & event)838 void DAudioSinkDev::SinkEventHandler::NotifyMicClosed(const AppExecFwk::InnerEvent::Pointer &event)
839 {
840     std::string eventParam;
841     if (GetEventParam(event, eventParam) != DH_SUCCESS) {
842         DHLOGE("Failed to get event parameters.");
843         return;
844     }
845     auto sinkDevObj = sinkDev_.lock();
846     CHECK_NULL_VOID(sinkDevObj);
847     CHECK_AND_RETURN_LOG(sinkDevObj->TaskCloseDMic(eventParam) != DH_SUCCESS,
848         "%{public}s", "Close mic failed.");
849 }
850 
NotifySetVolume(const AppExecFwk::InnerEvent::Pointer & event)851 void DAudioSinkDev::SinkEventHandler::NotifySetVolume(const AppExecFwk::InnerEvent::Pointer &event)
852 {
853     std::string eventParam;
854     if (GetEventParam(event, eventParam) != DH_SUCCESS) {
855         DHLOGE("Failed to get event parameters.");
856         return;
857     }
858     auto sinkDevObj = sinkDev_.lock();
859     CHECK_NULL_VOID(sinkDevObj);
860     CHECK_AND_RETURN_LOG(sinkDevObj->TaskSetVolume(eventParam) != DH_SUCCESS,
861         "%{public}s", "Set volume failed.");
862 }
863 
NotifyVolumeChange(const AppExecFwk::InnerEvent::Pointer & event)864 void DAudioSinkDev::SinkEventHandler::NotifyVolumeChange(const AppExecFwk::InnerEvent::Pointer &event)
865 {
866     std::string eventParam;
867     if (GetEventParam(event, eventParam) != DH_SUCCESS) {
868         DHLOGE("Failed to get event parameters.");
869         return;
870     }
871     auto sinkDevObj = sinkDev_.lock();
872     CHECK_NULL_VOID(sinkDevObj);
873     CHECK_AND_RETURN_LOG(sinkDevObj->TaskVolumeChange(eventParam) != DH_SUCCESS,
874         "%{public}s", "Notify volume change status to source device failed.");
875 }
876 
NotifySetParam(const AppExecFwk::InnerEvent::Pointer & event)877 void DAudioSinkDev::SinkEventHandler::NotifySetParam(const AppExecFwk::InnerEvent::Pointer &event)
878 {
879     std::string eventParam;
880     if (GetEventParam(event, eventParam) != DH_SUCCESS) {
881         DHLOGE("Failed to get event parameters.");
882         return;
883     }
884     auto sinkDevObj = sinkDev_.lock();
885     CHECK_NULL_VOID(sinkDevObj);
886     CHECK_AND_RETURN_LOG(sinkDevObj->TaskSetParameter(eventParam) != DH_SUCCESS,
887         "%{public}s", "Set parameters failed.");
888 }
889 
NotifySetMute(const AppExecFwk::InnerEvent::Pointer & event)890 void DAudioSinkDev::SinkEventHandler::NotifySetMute(const AppExecFwk::InnerEvent::Pointer &event)
891 {
892     std::string eventParam;
893     if (GetEventParam(event, eventParam) != DH_SUCCESS) {
894         DHLOGE("Failed to get event parameters.");
895         return;
896     }
897     auto sinkDevObj = sinkDev_.lock();
898     CHECK_NULL_VOID(sinkDevObj);
899     CHECK_AND_RETURN_LOG(sinkDevObj->TaskSetMute(eventParam) != DH_SUCCESS,
900         "%{public}s", "Set mute failed.");
901 }
902 
NotifyFocusChange(const AppExecFwk::InnerEvent::Pointer & event)903 void DAudioSinkDev::SinkEventHandler::NotifyFocusChange(const AppExecFwk::InnerEvent::Pointer &event)
904 {
905     std::string eventParam;
906     if (GetEventParam(event, eventParam) != DH_SUCCESS) {
907         DHLOGE("Failed to get event parameters.");
908         return;
909     }
910     auto sinkDevObj = sinkDev_.lock();
911     CHECK_NULL_VOID(sinkDevObj);
912     CHECK_AND_RETURN_LOG(sinkDevObj->TaskFocusChange(eventParam) != DH_SUCCESS,
913         "%{public}s", "Handle focus change event failed.");
914 }
915 
NotifyRenderStateChange(const AppExecFwk::InnerEvent::Pointer & event)916 void DAudioSinkDev::SinkEventHandler::NotifyRenderStateChange(const AppExecFwk::InnerEvent::Pointer &event)
917 {
918     std::string eventParam;
919     if (GetEventParam(event, eventParam) != DH_SUCCESS) {
920         DHLOGE("Failed to get event parameters.");
921         return;
922     }
923     auto sinkDevObj = sinkDev_.lock();
924     CHECK_NULL_VOID(sinkDevObj);
925     CHECK_AND_RETURN_LOG(sinkDevObj->TaskRenderStateChange(eventParam) != DH_SUCCESS,
926         "%{public}s", "Handle render state change failed.");
927 }
928 
NotifyPlayStatusChange(const AppExecFwk::InnerEvent::Pointer & event)929 void DAudioSinkDev::SinkEventHandler::NotifyPlayStatusChange(const AppExecFwk::InnerEvent::Pointer &event)
930 {
931     std::string eventParam;
932     if (GetEventParam(event, eventParam) != DH_SUCCESS) {
933         DHLOGE("Failed to get event parameters.");
934         return;
935     }
936     auto sinkDevObj = sinkDev_.lock();
937     CHECK_NULL_VOID(sinkDevObj);
938     CHECK_AND_RETURN_LOG(sinkDevObj->TaskPlayStatusChange(eventParam) != DH_SUCCESS,
939         "%{public}s", "Handle play status change event failed.");
940 }
941 
GetEventParam(const AppExecFwk::InnerEvent::Pointer & event,std::string & eventParam)942 int32_t DAudioSinkDev::SinkEventHandler::GetEventParam(const AppExecFwk::InnerEvent::Pointer &event,
943     std::string &eventParam)
944 {
945     CHECK_NULL_RETURN(event, ERR_DH_AUDIO_NULLPTR);
946     std::shared_ptr<AudioEvent> paramObj = event->GetSharedObject<AudioEvent>();
947     CHECK_NULL_RETURN(paramObj, ERR_DH_AUDIO_NULLPTR);
948     eventParam = paramObj->content;
949     return DH_SUCCESS;
950 }
951 
PauseDistributedHardware(const std::string & networkId)952 int32_t DAudioSinkDev::PauseDistributedHardware(const std::string &networkId)
953 {
954     DHLOGI("DAudioSinkDev PauseDistributedHardware.");
955     int32_t dhId = ConvertString2Int(micDhId_);
956     std::shared_ptr<DMicClient> micClient = nullptr;
957     {
958         std::lock_guard<std::mutex> devLck(micClientMutex_);
959         micClient = micClientMap_[dhId];
960     }
961 
962     CHECK_NULL_RETURN(micClient, ERR_DH_AUDIO_NULLPTR);
963     int32_t ret = micClient->PauseCapture();
964     CHECK_AND_LOG(ret != DH_SUCCESS, "Pause mic client failed, ret: %{public}d.", ret);
965     return ret;
966 }
967 
ResumeDistributedHardware(const std::string & networkId)968 int32_t DAudioSinkDev::ResumeDistributedHardware(const std::string &networkId)
969 {
970     DHLOGI("DAudioSinkDev ResumeDistributedHardware.");
971     int32_t dhId = ConvertString2Int(micDhId_);
972     std::shared_ptr<DMicClient> micClient = nullptr;
973     {
974         std::lock_guard<std::mutex> devLck(micClientMutex_);
975         micClient = micClientMap_[dhId];
976     }
977 
978     CHECK_NULL_RETURN(micClient, ERR_DH_AUDIO_NULLPTR);
979     int32_t ret = micClient->ResumeCapture();
980     CHECK_AND_LOG(ret != DH_SUCCESS, "Resume mic client failed, ret: %{public}d.", ret);
981     return ret;
982 }
983 
StopDistributedHardware(const std::string & networkId)984 int32_t DAudioSinkDev::StopDistributedHardware(const std::string &networkId)
985 {
986     DHLOGI("DAudioSinkDev StopDistributedHardware.");
987     isPageStatus_.store(false);
988     NotifySourceDev(CLOSE_MIC, micDhId_, DH_SUCCESS);
989     return DH_SUCCESS;
990 }
991 } // namespace DistributedHardware
992 } // namespace OHOS
993