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