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