1 /*
2 * Copyright (c) 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 #include "trigger_helper.h"
16
17 #ifdef SUPPORT_TELEPHONY_SERVICE
18 #include "telephony_observer_client.h"
19 #include "state_registry_errors.h"
20 #include "telephony_types.h"
21 #include "call_manager_inner_type.h"
22 #endif
23 #include "audio_policy_manager.h"
24 #include "power_mgr_client.h"
25
26 #include "intell_voice_log.h"
27 #include "trigger_connector_mgr.h"
28
29 #undef LOG_TAG
30 #define LOG_TAG "TriggerHelper"
31
32 using namespace OHOS::HDI::IntelligentVoice::Trigger::V1_0;
33 using namespace OHOS::AudioStandard;
34 #ifdef SUPPORT_TELEPHONY_SERVICE
35 using namespace OHOS::Telephony;
36 #endif
37 using namespace OHOS::AudioStandard;
38 using namespace OHOS::PowerMgr;
39 using namespace std;
40
41 namespace OHOS {
42 namespace IntellVoiceTrigger {
43 #ifdef SUPPORT_TELEPHONY_SERVICE
44 static constexpr int32_t SIM_SLOT_ID_1 = DEFAULT_SIM_SLOT_ID + 1;
45 #endif
46
TriggerModelData(int32_t uuid)47 TriggerModelData::TriggerModelData(int32_t uuid)
48 {
49 uuid_ = uuid;
50 }
51
~TriggerModelData()52 TriggerModelData::~TriggerModelData()
53 {
54 }
55
SetCallback(std::shared_ptr<IIntellVoiceTriggerRecognitionCallback> callback)56 void TriggerModelData::SetCallback(std::shared_ptr<IIntellVoiceTriggerRecognitionCallback> callback)
57 {
58 if (callback == nullptr) {
59 INTELL_VOICE_LOG_ERROR("callback is nullptr");
60 return;
61 }
62 callback_ = callback;
63 }
64
GetCallback()65 std::shared_ptr<IIntellVoiceTriggerRecognitionCallback> TriggerModelData::GetCallback()
66 {
67 return callback_;
68 }
69
SetModel(std::shared_ptr<GenericTriggerModel> model)70 void TriggerModelData::SetModel(std::shared_ptr<GenericTriggerModel> model)
71 {
72 if (SameModel(model)) {
73 INTELL_VOICE_LOG_INFO("same model not need to update");
74 return;
75 }
76 model_ = model;
77 model_->Print();
78 }
79
GetModel()80 shared_ptr<GenericTriggerModel> TriggerModelData::GetModel()
81 {
82 return model_;
83 }
84
SameModel(std::shared_ptr<GenericTriggerModel> model)85 bool TriggerModelData::SameModel(std::shared_ptr<GenericTriggerModel> model)
86 {
87 if (model == nullptr || model_ == nullptr) {
88 return false;
89 }
90 return model_->GetData() == model->GetData();
91 }
92
SetState(ModelState state)93 void TriggerModelData::SetState(ModelState state)
94 {
95 state_ = state;
96 }
97
GetState() const98 ModelState TriggerModelData::GetState() const
99 {
100 return state_;
101 }
102
SetModelHandle(int32_t handle)103 void TriggerModelData::SetModelHandle(int32_t handle)
104 {
105 modelHandle_ = handle;
106 }
107
GetModelHandle() const108 int32_t TriggerModelData::GetModelHandle() const
109 {
110 return modelHandle_;
111 }
112
SetRequested(bool requested)113 void TriggerModelData::SetRequested(bool requested)
114 {
115 requested_ = requested;
116 }
117
GetRequested() const118 bool TriggerModelData::GetRequested() const
119 {
120 return requested_;
121 }
122
Clear()123 void TriggerModelData::Clear()
124 {
125 callback_ = nullptr;
126 state_ = MODEL_NOTLOADED;
127 }
128
ClearCallback()129 void TriggerModelData::ClearCallback()
130 {
131 callback_ = nullptr;
132 }
133
TriggerHelper()134 TriggerHelper::TriggerHelper()
135 {
136 }
137
~TriggerHelper()138 TriggerHelper::~TriggerHelper()
139 {
140 modelDataMap_.clear();
141 }
142
Create()143 std::shared_ptr<TriggerHelper> TriggerHelper::Create()
144 {
145 return std::shared_ptr<TriggerHelper>(new (std::nothrow) TriggerHelper());
146 }
147
StartGenericRecognition(int32_t uuid,std::shared_ptr<GenericTriggerModel> model,shared_ptr<IIntellVoiceTriggerRecognitionCallback> callback)148 int32_t TriggerHelper::StartGenericRecognition(int32_t uuid, std::shared_ptr<GenericTriggerModel> model,
149 shared_ptr<IIntellVoiceTriggerRecognitionCallback> callback)
150 {
151 INTELL_VOICE_LOG_INFO("enter");
152 lock_guard<std::mutex> lock(mutex_);
153
154 auto modelData = GetTriggerModelData(uuid);
155 if (modelData == nullptr) {
156 modelData = CreateTriggerModelData((uuid));
157 if (modelData == nullptr) {
158 INTELL_VOICE_LOG_ERROR("failed to create trigger model data");
159 return -1;
160 }
161 }
162
163 bool unload = !modelData->SameModel(model);
164 int32_t ret = InitRecognition(modelData, unload);
165 if (ret != 0) {
166 INTELL_VOICE_LOG_ERROR("failed to initialize recognition");
167 return -1;
168 }
169
170 modelData->SetModel(model);
171 modelData->SetCallback(callback);
172 modelData->SetRequested(true);
173
174 if (IsConflictSceneActive()) {
175 INTELL_VOICE_LOG_INFO("conflict state, no need to start");
176 return 0;
177 }
178
179 ret = PrepareForRecognition(modelData);
180 if (ret != 0) {
181 return ret;
182 }
183
184 return StartRecognition(modelData);
185 }
186
StopGenericRecognition(int32_t uuid,shared_ptr<IIntellVoiceTriggerRecognitionCallback> callback)187 int32_t TriggerHelper::StopGenericRecognition(int32_t uuid, shared_ptr<IIntellVoiceTriggerRecognitionCallback> callback)
188 {
189 INTELL_VOICE_LOG_INFO("enter");
190 lock_guard<std::mutex> lock(mutex_);
191 auto modelData = GetTriggerModelData(uuid);
192 if (modelData == nullptr) {
193 INTELL_VOICE_LOG_ERROR("failed to get trigger model data");
194 return -1;
195 }
196 modelData->SetRequested(false);
197 int32_t ret = StopRecognition(modelData);
198 if (ret != 0) {
199 return ret;
200 }
201 modelData->ClearCallback();
202 return ret;
203 }
204
UnloadGenericTriggerModel(int32_t uuid)205 void TriggerHelper::UnloadGenericTriggerModel(int32_t uuid)
206 {
207 INTELL_VOICE_LOG_INFO("enter");
208 lock_guard<std::mutex> lock(mutex_);
209 auto modelData = GetTriggerModelData(uuid);
210 if (modelData == nullptr) {
211 INTELL_VOICE_LOG_WARN("no trigger model data");
212 return;
213 }
214
215 if (modelData->GetState() == MODEL_NOTLOADED) {
216 INTELL_VOICE_LOG_INFO("model is not loaded");
217 return;
218 }
219 StopRecognition(modelData);
220 UnloadModel(modelData);
221 modelDataMap_.erase(uuid);
222 }
223
SetParameter(const std::string & key,const std::string & value)224 int32_t TriggerHelper::SetParameter(const std::string &key, const std::string &value)
225 {
226 INTELL_VOICE_LOG_INFO("enter");
227 lock_guard<std::mutex> lock(mutex_);
228 if (!GetModule()) {
229 return -1;
230 }
231
232 return module_->SetParams(key, value);
233 }
234
GetParameter(const std::string & key)235 std::string TriggerHelper::GetParameter(const std::string &key)
236 {
237 INTELL_VOICE_LOG_INFO("enter");
238 lock_guard<std::mutex> lock(mutex_);
239 if (!GetModule()) {
240 return "";
241 }
242
243 std::string value;
244 auto ret = module_->GetParams(key, value);
245 if (ret != 0) {
246 INTELL_VOICE_LOG_ERROR("failed to get parameter");
247 return "";
248 }
249
250 return value;
251 }
252
GetModule()253 bool TriggerHelper::GetModule()
254 {
255 if (module_ != nullptr) {
256 return true;
257 }
258 const auto &connectMgr = TriggerConnectorMgr::GetInstance();
259 if (connectMgr == nullptr) {
260 INTELL_VOICE_LOG_ERROR("connectMgr is nullptr");
261 return false;
262 }
263 moduleDesc_ = connectMgr->ListConnectorModuleDescriptors();
264 if (moduleDesc_.size() == 0) {
265 INTELL_VOICE_LOG_ERROR("moduleDesc_ is empty");
266 return false;
267 }
268
269 module_ = connectMgr->GetConnectorModule(moduleDesc_[0].adapterName, shared_from_this());
270 if (module_ == nullptr) {
271 INTELL_VOICE_LOG_ERROR("failed to get connector module");
272 return false;
273 }
274 return true;
275 }
276
InitRecognition(std::shared_ptr<TriggerModelData> modelData,bool unload)277 int32_t TriggerHelper::InitRecognition(std::shared_ptr<TriggerModelData> modelData, bool unload)
278 {
279 INTELL_VOICE_LOG_INFO("enter");
280 if (modelData->GetState() == MODEL_NOTLOADED) {
281 return 0;
282 }
283 int32_t ret = StopRecognition(modelData);
284 if (unload) {
285 ret = UnloadModel(modelData);
286 modelData->Clear();
287 }
288
289 return ret;
290 }
291
PrepareForRecognition(std::shared_ptr<TriggerModelData> modelData)292 int32_t TriggerHelper::PrepareForRecognition(std::shared_ptr<TriggerModelData> modelData)
293 {
294 INTELL_VOICE_LOG_INFO("enter");
295 if (!GetModule()) {
296 return -1;
297 }
298
299 if (LoadModel(modelData) != 0) {
300 return -1;
301 }
302 return 0;
303 }
304
StartRecognition(shared_ptr<TriggerModelData> modelData)305 int32_t TriggerHelper::StartRecognition(shared_ptr<TriggerModelData> modelData)
306 {
307 if (modelData == nullptr) {
308 INTELL_VOICE_LOG_ERROR("modelData is nullptr");
309 return -1;
310 }
311 if (modelData->GetState() != MODEL_LOADED) {
312 return 0;
313 }
314 INTELL_VOICE_LOG_INFO("enter");
315 if (module_ == nullptr) {
316 INTELL_VOICE_LOG_ERROR("module_ is nullptr");
317 return -1;
318 }
319 auto ret = module_->Start(modelData->GetModelHandle());
320 if (ret != 0) {
321 INTELL_VOICE_LOG_ERROR("failed to start recognition");
322 return ret;
323 }
324 modelData->SetState(MODEL_STARTED);
325 return ret;
326 }
327
StopRecognition(shared_ptr<TriggerModelData> modelData)328 int32_t TriggerHelper::StopRecognition(shared_ptr<TriggerModelData> modelData)
329 {
330 if (modelData == nullptr) {
331 INTELL_VOICE_LOG_ERROR("modelData is nullptr");
332 return -1;
333 }
334 if (modelData->GetState() != MODEL_STARTED) {
335 return 0;
336 }
337 INTELL_VOICE_LOG_INFO("enter");
338 if (module_ == nullptr) {
339 INTELL_VOICE_LOG_ERROR("module_ is nullptr");
340 return -1;
341 }
342 auto ret = module_->Stop(modelData->GetModelHandle());
343 if (ret != 0) {
344 INTELL_VOICE_LOG_ERROR("failed to stop");
345 return ret;
346 }
347
348 modelData->SetState(MODEL_LOADED);
349 return ret;
350 }
351
LoadModel(shared_ptr<TriggerModelData> modelData)352 int32_t TriggerHelper::LoadModel(shared_ptr<TriggerModelData> modelData)
353 {
354 INTELL_VOICE_LOG_INFO("enter");
355 if (modelData == nullptr) {
356 INTELL_VOICE_LOG_ERROR("modelData is nullptr");
357 return -1;
358 }
359 if (modelData->GetState() != MODEL_NOTLOADED) {
360 INTELL_VOICE_LOG_WARN("model is already loaded");
361 return 0;
362 }
363
364 if (module_ == nullptr) {
365 INTELL_VOICE_LOG_ERROR("module_ is nullptr");
366 return -1;
367 }
368
369 int32_t handle;
370 auto ret = module_->LoadModel(modelData->GetModel(), handle);
371 if (ret != 0) {
372 INTELL_VOICE_LOG_WARN("failed to load model, ret: %{public}d", ret);
373 return ret;
374 }
375 modelData->SetModelHandle(handle);
376 modelData->SetState(MODEL_LOADED);
377 INTELL_VOICE_LOG_INFO("exit, handle: %{public}d", handle);
378 return ret;
379 }
380
UnloadModel(shared_ptr<TriggerModelData> modelData)381 int32_t TriggerHelper::UnloadModel(shared_ptr<TriggerModelData> modelData)
382 {
383 if (modelData == nullptr) {
384 INTELL_VOICE_LOG_ERROR("modelData is nullptr");
385 return -1;
386 }
387 if (modelData->GetState() != MODEL_LOADED) {
388 return 0;
389 }
390 INTELL_VOICE_LOG_INFO("enter");
391 if (module_ == nullptr) {
392 INTELL_VOICE_LOG_ERROR("module_ is nullptr");
393 return -1;
394 }
395 auto ret = module_->UnloadModel(modelData->GetModelHandle());
396 modelData->SetState(MODEL_NOTLOADED);
397 return ret;
398 }
399
GetTriggerModelData(int32_t uuid)400 shared_ptr<TriggerModelData> TriggerHelper::GetTriggerModelData(int32_t uuid)
401 {
402 INTELL_VOICE_LOG_INFO("enter, uuid is :%{public}d", uuid);
403 auto it = modelDataMap_.find(uuid);
404 if ((it == modelDataMap_.end()) || (it->second == nullptr)) {
405 return nullptr;
406 }
407
408 return it->second;
409 }
410
CreateTriggerModelData(int32_t uuid)411 shared_ptr<TriggerModelData> TriggerHelper::CreateTriggerModelData(int32_t uuid)
412 {
413 INTELL_VOICE_LOG_INFO("enter, uuid is :%{public}d", uuid);
414 auto modelData = std::make_shared<TriggerModelData>(uuid);
415 if (modelData == nullptr) {
416 INTELL_VOICE_LOG_INFO("modelData is nullptr");
417 return nullptr;
418 }
419 modelDataMap_.insert(std::make_pair(uuid, modelData));
420 return modelData;
421 }
422
OnRecognition(int32_t modelHandle,const IntellVoiceRecognitionEvent & event)423 void TriggerHelper::OnRecognition(int32_t modelHandle, const IntellVoiceRecognitionEvent &event)
424 {
425 INTELL_VOICE_LOG_INFO("enter, modelHandle:%{public}d", modelHandle);
426 lock_guard<std::mutex> lock(mutex_);
427 std::shared_ptr<IIntellVoiceTriggerRecognitionCallback> callback = nullptr;
428 for (auto iter : modelDataMap_) {
429 if (iter.second == nullptr) {
430 INTELL_VOICE_LOG_ERROR("uuid: %{public}d, model data is nullptr", iter.first);
431 continue;
432 }
433
434 if (iter.second->GetModelHandle() == modelHandle) {
435 iter.second->SetState(MODEL_LOADED);
436 callback = iter.second->GetCallback();
437 break;
438 }
439 }
440
441 if (callback == nullptr) {
442 INTELL_VOICE_LOG_ERROR("trigger recognition callback is nullptr, modelHandle: %{public}d", modelHandle);
443 return;
444 }
445
446 auto genericEvent = std::make_shared<GenericTriggerEvent>();
447 if (genericEvent == nullptr) {
448 INTELL_VOICE_LOG_ERROR("genericEvent is nullptr");
449 return;
450 }
451 genericEvent->modelHandle_ = modelHandle;
452 callback->OnGenericTriggerDetected(genericEvent);
453 }
454
IsConflictSceneActive()455 bool TriggerHelper::IsConflictSceneActive()
456 {
457 INTELL_VOICE_LOG_INFO("callActive: %{public}d, audioCaptureActive: %{public}d, systemHibernate: %{public}d",
458 callActive_, audioCaptureActive_, systemHibernate_);
459 return (callActive_ || audioCaptureActive_ || systemHibernate_);
460 }
461
OnUpdateAllRecognitionState()462 void TriggerHelper::OnUpdateAllRecognitionState()
463 {
464 for (auto iter : modelDataMap_) {
465 if (iter.second == nullptr) {
466 INTELL_VOICE_LOG_ERROR("uuid: %{public}d, model data is nullptr", iter.first);
467 continue;
468 }
469 bool needStart =
470 (iter.second->GetRequested() && (!IsConflictSceneActive()));
471 if (needStart == (iter.second->GetState() == MODEL_STARTED)) {
472 INTELL_VOICE_LOG_INFO("no operation, needStart:%{public}d", needStart);
473 continue;
474 }
475 if (needStart) {
476 if (PrepareForRecognition(iter.second) != 0) {
477 return;
478 }
479 StartRecognition(iter.second);
480 } else {
481 StopRecognition(iter.second);
482 if (systemHibernate_) {
483 UnloadModel(iter.second);
484 }
485 }
486 }
487 }
488
489 #ifdef SUPPORT_TELEPHONY_SERVICE
AttachTelephonyObserver()490 void TriggerHelper::AttachTelephonyObserver()
491 {
492 INTELL_VOICE_LOG_INFO("enter");
493 std::lock_guard<std::mutex> lock(telephonyMutex_);
494 if (isTelephonyDetached_) {
495 INTELL_VOICE_LOG_INFO("telephony is already detached");
496 return;
497 }
498 telephonyObserver0_ = std::make_unique<TelephonyStateObserver>(shared_from_this()).release();
499 if (telephonyObserver0_ == nullptr) {
500 INTELL_VOICE_LOG_ERROR("telephonyObserver0_ is nullptr");
501 return;
502 }
503 auto res = TelephonyObserverClient::GetInstance().AddStateObserver(
504 telephonyObserver0_, -1, TelephonyObserverBroker::OBSERVER_MASK_CALL_STATE, true);
505 if (res != TELEPHONY_SUCCESS) {
506 INTELL_VOICE_LOG_ERROR("telephonyObserver0_ add failed");
507 }
508 }
509
DetachTelephonyObserver()510 void TriggerHelper::DetachTelephonyObserver()
511 {
512 INTELL_VOICE_LOG_INFO("enter");
513 std::lock_guard<std::mutex> lock(telephonyMutex_);
514 isTelephonyDetached_ = true;
515
516 if (telephonyObserver0_ != nullptr) {
517 Telephony::TelephonyObserverClient::GetInstance().RemoveStateObserver(
518 -1, Telephony::TelephonyObserverBroker::OBSERVER_MASK_CALL_STATE);
519 telephonyObserver0_ = nullptr;
520 }
521 }
522
OnCallStateUpdated(int32_t callState)523 void TriggerHelper::OnCallStateUpdated(int32_t callState)
524 {
525 lock_guard<std::mutex> lock(mutex_);
526 if (callState < static_cast<int32_t>(TelCallState::CALL_STATUS_UNKNOWN) ||
527 callState > static_cast<int32_t>(TelCallState::CALL_STATUS_IDLE)) {
528 INTELL_VOICE_LOG_ERROR("callstate err: %{public}d", callState);
529 return;
530 }
531
532 bool curCallActive = (callState != static_cast<int32_t>(TelCallState::CALL_STATUS_DISCONNECTED) &&
533 callState != static_cast<int32_t>(TelCallState::CALL_STATUS_IDLE) &&
534 callState != static_cast<int32_t>(TelCallState::CALL_STATUS_UNKNOWN));
535 INTELL_VOICE_LOG_INFO("state: %{public}d, callActive: %{public}d, curCallActive: %{public}d",
536 callState,
537 callActive_,
538 curCallActive);
539 if (callActive_ == curCallActive) {
540 return;
541 }
542
543 callActive_ = curCallActive;
544 OnUpdateAllRecognitionState();
545 }
546
OnCallStateUpdated(int32_t slotId,int32_t callState,const std::u16string & phoneNumber)547 void TriggerHelper::TelephonyStateObserver::OnCallStateUpdated(
548 int32_t slotId, int32_t callState, const std::u16string &phoneNumber)
549 {
550 if (helper_ == nullptr) {
551 INTELL_VOICE_LOG_ERROR("helper is nullptr");
552 return;
553 }
554
555 helper_->OnCallStateUpdated(callState);
556 }
557 #endif
558
OnHibernateStateUpdated(bool isHibernate)559 void TriggerHelper::OnHibernateStateUpdated(bool isHibernate)
560 {
561 lock_guard<std::mutex> lock(mutex_);
562 if (systemHibernate_ == isHibernate) {
563 return;
564 }
565 systemHibernate_ = isHibernate;
566 OnUpdateAllRecognitionState();
567 }
568
AttachAudioCaptureListener()569 void TriggerHelper::AttachAudioCaptureListener()
570 {
571 INTELL_VOICE_LOG_INFO("enter");
572
573 audioCapturerSourceChangeCallback_ = std::make_shared<AudioCapturerSourceChangeCallback>(shared_from_this());
574 auto audioSystemManager = AudioSystemManager::GetInstance();
575 if (audioSystemManager != nullptr) {
576 audioSystemManager->SetAudioCapturerSourceCallback(audioCapturerSourceChangeCallback_);
577 } else {
578 INTELL_VOICE_LOG_ERROR("audioSystemManager is nullptr");
579 }
580 }
581
DetachAudioCaptureListener()582 void TriggerHelper::DetachAudioCaptureListener()
583 {
584 INTELL_VOICE_LOG_INFO("enter");
585
586 auto audioSystemManager = AudioSystemManager::GetInstance();
587 if (audioSystemManager != nullptr) {
588 audioSystemManager->SetAudioCapturerSourceCallback(nullptr);
589 } else {
590 INTELL_VOICE_LOG_ERROR("audioSystemManager is null");
591 }
592 }
593
OnCapturerStateChange(bool isActive)594 void TriggerHelper::OnCapturerStateChange(bool isActive)
595 {
596 lock_guard<std::mutex> lock(mutex_);
597 if (audioCaptureActive_ == isActive) {
598 return;
599 }
600
601 audioCaptureActive_ = isActive;
602 OnUpdateAllRecognitionState();
603 }
604
OnCapturerState(bool isActive)605 void TriggerHelper::AudioCapturerSourceChangeCallback::OnCapturerState(bool isActive)
606 {
607 INTELL_VOICE_LOG_INFO("OnCapturerState active: %{public}d", isActive);
608
609 if (helper_ == nullptr) {
610 INTELL_VOICE_LOG_ERROR("helper is nullptr");
611 return;
612 }
613
614 helper_->OnCapturerStateChange(isActive);
615 }
616
OnRendererStateChange(const std::vector<std::shared_ptr<AudioStandard::AudioRendererChangeInfo>> & audioRendererChangeInfos)617 void TriggerHelper::AudioRendererStateChangeCallbackImpl::OnRendererStateChange(
618 const std::vector<std::shared_ptr<AudioStandard::AudioRendererChangeInfo>> &audioRendererChangeInfos)
619 {
620 std::lock_guard<std::mutex> lock(mutex_);
621 if (helper_ == nullptr) {
622 INTELL_VOICE_LOG_ERROR("helper is nullptr");
623 return;
624 }
625 std::map<int32_t, bool> stateMap;
626 for (const auto &info : audioRendererChangeInfos) {
627 if (info == nullptr) {
628 INTELL_VOICE_LOG_ERROR("info is nullptr");
629 continue;
630 }
631 bool isPlaying = false;
632 if (info->rendererState == AudioStandard::RENDERER_RUNNING) {
633 isPlaying = true;
634 }
635
636 if (stateMap.count(info->rendererInfo.streamUsage) == 0 || !stateMap[info->rendererInfo.streamUsage]) {
637 stateMap[info->rendererInfo.streamUsage] = isPlaying;
638 }
639 }
640
641 for (auto iter : stateMap) {
642 std::string key = iter.second ? "start_stream" : "stop_stream";
643 if (rendererStateMap_.count(iter.first) == 0) {
644 rendererStateMap_[iter.first] = iter.second;
645 INTELL_VOICE_LOG_INFO("first change, usage:%{public}d, isPlaying:%{public}d",
646 iter.first, iter.second);
647 helper_->SetParameter(key, std::to_string(iter.first));
648 } else {
649 if (rendererStateMap_[iter.first] != iter.second) {
650 INTELL_VOICE_LOG_INFO("state change, usage:%{public}d, isPlaying:%{public}d",
651 iter.first, iter.second);
652 rendererStateMap_[iter.first] = iter.second;
653 helper_->SetParameter(key, std::to_string(iter.first));
654 }
655 }
656 }
657 }
658
OnSyncHibernate()659 void TriggerHelper::HibernateCallback::OnSyncHibernate()
660 {
661 if (helper_ == nullptr) {
662 INTELL_VOICE_LOG_ERROR("helper is nullptr");
663 return;
664 }
665
666 helper_->OnHibernateStateUpdated(true);
667 }
668
OnSyncWakeup(bool)669 void TriggerHelper::HibernateCallback::OnSyncWakeup(bool /* hibernateResult */)
670 {
671 if (helper_ == nullptr) {
672 INTELL_VOICE_LOG_ERROR("helper is nullptr");
673 return;
674 }
675
676 helper_->OnHibernateStateUpdated(false);
677 }
678
OnSyncSleep(bool onForceSleep)679 void TriggerHelper::SleepCallback::OnSyncSleep(bool onForceSleep)
680 {
681 if (!onForceSleep) {
682 INTELL_VOICE_LOG_INFO("not onForceSleep");
683 return;
684 }
685
686 if (helper_ == nullptr) {
687 INTELL_VOICE_LOG_ERROR("helper is nullptr");
688 return;
689 }
690
691 helper_->OnHibernateStateUpdated(true);
692 }
693
OnSyncWakeup(bool onForceSleep)694 void TriggerHelper::SleepCallback::OnSyncWakeup(bool onForceSleep)
695 {
696 if (!onForceSleep) {
697 INTELL_VOICE_LOG_INFO("not onForceSleep");
698 return;
699 }
700
701 if (helper_ == nullptr) {
702 INTELL_VOICE_LOG_ERROR("helper is nullptr");
703 return;
704 }
705
706 helper_->OnHibernateStateUpdated(false);
707 }
708
AttachAudioRendererEventListener()709 void TriggerHelper::AttachAudioRendererEventListener()
710 {
711 INTELL_VOICE_LOG_INFO("enter");
712 std::lock_guard<std::mutex> lock(rendererMutex_);
713 if (isRendererDetached_) {
714 INTELL_VOICE_LOG_INFO("renderer event listener is already detached");
715 return;
716 }
717 audioRendererStateChangeCallback_ = std::make_shared<AudioRendererStateChangeCallbackImpl>(shared_from_this());
718 if (audioRendererStateChangeCallback_ == nullptr) {
719 INTELL_VOICE_LOG_ERROR("Memory Allocation Failed !!");
720 return;
721 }
722
723 auto audioStreamManager = AudioStreamManager::GetInstance();
724 if (audioStreamManager == nullptr) {
725 INTELL_VOICE_LOG_ERROR("audioStreamManager is nullptr");
726 return;
727 }
728 int32_t ret = audioStreamManager->RegisterAudioRendererEventListener(getpid(),
729 audioRendererStateChangeCallback_);
730 if (ret != 0) {
731 INTELL_VOICE_LOG_ERROR("RegisterAudioRendererEventListener failed");
732 return;
733 }
734 INTELL_VOICE_LOG_INFO("RegisterAudioRendererEventListener success");
735
736 std::vector<std::shared_ptr<AudioRendererChangeInfo>> audioRendererChangeInfos;
737 audioStreamManager->GetCurrentRendererChangeInfos(audioRendererChangeInfos);
738 audioRendererStateChangeCallback_->OnRendererStateChange(audioRendererChangeInfos);
739 }
740
DetachAudioRendererEventListener()741 void TriggerHelper::DetachAudioRendererEventListener()
742 {
743 INTELL_VOICE_LOG_INFO("enter");
744 std::lock_guard<std::mutex> lock(rendererMutex_);
745 isRendererDetached_ = true;
746 auto audioStreamManager = AudioStreamManager::GetInstance();
747 if (audioStreamManager == nullptr) {
748 INTELL_VOICE_LOG_ERROR("audioStreamManager is nullptr");
749 return;
750 }
751 int32_t ret = audioStreamManager->UnregisterAudioRendererEventListener(getpid());
752 if (ret != 0) {
753 INTELL_VOICE_LOG_ERROR("UnregisterAudioRendererEventListener failed");
754 }
755 }
756
AttachHibernateObserver()757 void TriggerHelper::AttachHibernateObserver()
758 {
759 INTELL_VOICE_LOG_INFO("enter");
760 std::lock_guard<std::mutex> lock(hiberateMutex_);
761 if (isHibernateDetached_) {
762 INTELL_VOICE_LOG_INFO("system hibernate is already detached");
763 return;
764 }
765
766 hibernateCallback_ = std::make_unique<HibernateCallback>(shared_from_this()).release();
767 if (hibernateCallback_ == nullptr) {
768 INTELL_VOICE_LOG_ERROR("hibernateCallback_ is nullptr");
769 return;
770 }
771 auto res = PowerMgrClient::GetInstance().RegisterSyncHibernateCallback(hibernateCallback_);
772 if (!res) {
773 INTELL_VOICE_LOG_ERROR("hibernateCallback_ register failed");
774 }
775
776 sleepCallback_ = std::make_unique<SleepCallback>(shared_from_this()).release();
777 if (sleepCallback_ == nullptr) {
778 INTELL_VOICE_LOG_ERROR("sleepCallback_ is nullptr");
779 return;
780 }
781 res = PowerMgrClient::GetInstance().RegisterSyncSleepCallback(sleepCallback_, SleepPriority::DEFAULT);
782 if (!res) {
783 INTELL_VOICE_LOG_ERROR("sleepCallback_ register failed");
784 }
785 }
786
DetachHibernateObserver()787 void TriggerHelper::DetachHibernateObserver()
788 {
789 INTELL_VOICE_LOG_INFO("enter");
790 std::lock_guard<std::mutex> lock(hiberateMutex_);
791
792 isHibernateDetached_ = true;
793 if (hibernateCallback_ == nullptr) {
794 INTELL_VOICE_LOG_ERROR("hibernateCallback_ is nullptr");
795 return;
796 }
797 auto res = PowerMgrClient::GetInstance().UnRegisterSyncHibernateCallback(hibernateCallback_);
798 if (!res) {
799 INTELL_VOICE_LOG_ERROR("hibernateCallback_ unregister failed");
800 }
801
802 if (sleepCallback_ == nullptr) {
803 INTELL_VOICE_LOG_ERROR("sleepCallback_ is nullptr");
804 return;
805 }
806 res = PowerMgrClient::GetInstance().UnRegisterSyncSleepCallback(sleepCallback_);
807 if (!res) {
808 INTELL_VOICE_LOG_ERROR("sleepCallback_ unregister failed");
809 }
810 }
811 } // namespace IntellVoiceTrigger
812 } // namespace OHOS
813