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