• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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