• 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 #ifndef INTELL_VOICE_TRIGGER_HELPER_H
16 #define INTELL_VOICE_TRIGGER_HELPER_H
17 
18 #include <cstdint>
19 #include <map>
20 #include "msg_handle_thread.h"
21 #include "trigger_base_type.h"
22 #include "i_intell_voice_trigger_recognition_callback.h"
23 #include "i_intell_voice_trigger_connector_module.h"
24 #include "i_intell_voice_trigger_connector_callback.h"
25 #include "trigger_connector_common_type.h"
26 #ifdef SUPPORT_TELEPHONY_SERVICE
27 #include "telephony_observer.h"
28 #endif
29 #include "audio_system_manager.h"
30 #include "audio_stream_manager.h"
31 #include "audio_info.h"
32 #include "sync_hibernate_callback_stub.h"
33 #include "sync_sleep_callback_stub.h"
34 
35 namespace OHOS {
36 namespace IntellVoiceTrigger {
37 using OHOS::AudioStandard::AudioCapturerSourceCallback;
38 using OHOS::AudioStandard::AudioRendererStateChangeCallback;
39 using OHOS::AudioStandard::AudioRendererChangeInfo;
40 
41 enum ModelState { MODEL_NOTLOADED, MODEL_LOADED, MODEL_STARTED, MODEL_STATE_BUT };
42 
43 class TriggerModelData {
44 public:
45     explicit TriggerModelData(int32_t uuid);
46     ~TriggerModelData();
47     void SetCallback(std::shared_ptr<IIntellVoiceTriggerRecognitionCallback> callback);
48     std::shared_ptr<IIntellVoiceTriggerRecognitionCallback> GetCallback();
49     void SetModel(std::shared_ptr<GenericTriggerModel> model);
50     std::shared_ptr<GenericTriggerModel> GetModel();
51     void SetState(ModelState state);
52     ModelState GetState() const;
53     void SetModelHandle(int32_t handle);
54     int32_t GetModelHandle() const;
55     void SetRequested(bool requested);
56     bool GetRequested() const;
57 
58     bool SameModel(std::shared_ptr<GenericTriggerModel> model);
59     void Clear();
60     void ClearCallback();
61 
62 public:
63     int32_t uuid_ = -1;
64 
65 private:
66     ModelState state_ = MODEL_NOTLOADED;
67     std::shared_ptr<GenericTriggerModel> model_ = nullptr;
68     std::shared_ptr<IIntellVoiceTriggerRecognitionCallback> callback_ = nullptr;
69     int32_t modelHandle_ = 0;
70     bool requested_ = false;
71 };
72 
73 class TriggerHelper : public IIntellVoiceTriggerConnectorCallback, public std::enable_shared_from_this<TriggerHelper> {
74 public:
75     ~TriggerHelper();
76 
77     static std::shared_ptr<TriggerHelper> Create();
78 
79     int32_t StartGenericRecognition(int32_t uuid, std::shared_ptr<GenericTriggerModel> model,
80         std::shared_ptr<IIntellVoiceTriggerRecognitionCallback> callback);
81     int32_t StopGenericRecognition(int32_t uuid, std::shared_ptr<IIntellVoiceTriggerRecognitionCallback> callback);
82     void UnloadGenericTriggerModel(int32_t uuid);
83     int32_t SetParameter(const std::string &key, const std::string &value);
84     std::string GetParameter(const std::string &key);
85     void AttachAudioCaptureListener();
86     void DetachAudioCaptureListener();
87     void AttachAudioRendererEventListener();
88     void DetachAudioRendererEventListener();
89 #ifdef SUPPORT_TELEPHONY_SERVICE
90     void AttachTelephonyObserver();
91     void DetachTelephonyObserver();
92 #endif
93     void AttachHibernateObserver();
94     void DetachHibernateObserver();
95 
96 private:
97     TriggerHelper();
98     bool GetModule();
99     std::shared_ptr<TriggerModelData> GetTriggerModelData(int32_t uuid);
100     std::shared_ptr<TriggerModelData> CreateTriggerModelData(int32_t uuid);
101     int32_t InitRecognition(std::shared_ptr<TriggerModelData> modelData, bool unload);
102     int32_t PrepareForRecognition(std::shared_ptr<TriggerModelData> modelData);
103     int32_t StartRecognition(std::shared_ptr<TriggerModelData> modelData);
104     int32_t StopRecognition(std::shared_ptr<TriggerModelData> modelData);
105     int32_t LoadModel(std::shared_ptr<TriggerModelData> modelData);
106     int32_t UnloadModel(std::shared_ptr<TriggerModelData> modelData);
107     void OnUpdateAllRecognitionState();
108     bool IsConflictSceneActive();
109 
110     void OnRecognition(int32_t modelHandle, const IntellVoiceRecognitionEvent &event) override;
111     void OnCapturerStateChange(bool isActive);
112     void OnUpdateRendererState(int32_t streamUsage, bool isPlaying);
113     void OnHibernateStateUpdated(bool isHibernate);
114 #ifdef SUPPORT_TELEPHONY_SERVICE
115     void OnCallStateUpdated(int32_t callState);
116     class TelephonyStateObserver : public Telephony::TelephonyObserver {
117     public:
TelephonyStateObserver(const std::shared_ptr<TriggerHelper> helper)118         explicit TelephonyStateObserver(const std::shared_ptr<TriggerHelper> helper) : helper_(helper)
119         {}
~TelephonyStateObserver()120         ~TelephonyStateObserver()
121         {
122             helper_ = nullptr;
123         }
124         void OnCallStateUpdated(int32_t slotId, int32_t callState, const std::u16string &phoneNumber) override;
125 
126     public:
127         std::shared_ptr<TriggerHelper> helper_ = nullptr;
128     };
129 
130 private:
131     sptr<TelephonyStateObserver> telephonyObserver0_ = nullptr;
132 #endif
133 
134     class AudioCapturerSourceChangeCallback : public AudioCapturerSourceCallback {
135     public:
AudioCapturerSourceChangeCallback(const std::shared_ptr<TriggerHelper> helper)136         explicit AudioCapturerSourceChangeCallback(const std::shared_ptr<TriggerHelper> helper) : helper_(helper)
137         {}
~AudioCapturerSourceChangeCallback()138         ~AudioCapturerSourceChangeCallback()
139         {
140             helper_ = nullptr;
141         }
142         void OnCapturerState(bool isActive) override;
143 
144     public:
145         std::shared_ptr<TriggerHelper> helper_ = nullptr;
146     };
147 
148     class AudioRendererStateChangeCallbackImpl : public AudioRendererStateChangeCallback {
149     public:
AudioRendererStateChangeCallbackImpl(const std::shared_ptr<TriggerHelper> helper)150         explicit AudioRendererStateChangeCallbackImpl(const std::shared_ptr<TriggerHelper> helper)
151             : helper_(helper)
152         {}
~AudioRendererStateChangeCallbackImpl()153         ~AudioRendererStateChangeCallbackImpl()
154         {
155             helper_ = nullptr;
156             rendererStateMap_.clear();
157         }
158 
159         void OnRendererStateChange(
160            const std::vector<std::shared_ptr<AudioRendererChangeInfo>> &audioRendererChangeInfos) override;
161     private:
162         std::mutex mutex_;
163         std::shared_ptr<TriggerHelper> helper_ = nullptr;
164         std::map<int32_t, bool> rendererStateMap_;
165     };
166 
167     class HibernateCallback : public PowerMgr::SyncHibernateCallbackStub {
168     public:
HibernateCallback(const std::shared_ptr<TriggerHelper> helper)169         explicit HibernateCallback(const std::shared_ptr<TriggerHelper> helper)
170             : helper_(helper)
171         {}
~HibernateCallback()172         ~HibernateCallback()
173         {
174             helper_ = nullptr;
175         }
176 
177         void OnSyncHibernate() override;
178         void OnSyncWakeup(bool hibernateResult = false) override;
179 
180     private:
181         std::shared_ptr<TriggerHelper> helper_ = nullptr;
182     };
183 
184     class SleepCallback : public PowerMgr::SyncSleepCallbackStub {
185     public:
SleepCallback(const std::shared_ptr<TriggerHelper> helper)186         explicit SleepCallback(const std::shared_ptr<TriggerHelper> helper)
187             : helper_(helper)
188         {}
~SleepCallback()189         ~SleepCallback()
190         {
191             helper_ = nullptr;
192         }
193 
194         void OnSyncSleep(bool onForceSleep);
195         void OnSyncWakeup(bool onForceSleep);
196 
197     private:
198         std::shared_ptr<TriggerHelper> helper_ = nullptr;
199     };
200 
201 private:
202     std::mutex mutex_;
203     std::mutex telephonyMutex_;
204     std::mutex rendererMutex_;
205     std::mutex hiberateMutex_;
206 
207     std::map<int32_t, std::shared_ptr<TriggerModelData>> modelDataMap_;
208     std::shared_ptr<IIntellVoiceTriggerConnectorModule> module_ = nullptr;
209     std::vector<TriggerConnectorModuleDesc> moduleDesc_;
210     std::shared_ptr<AudioCapturerSourceChangeCallback> audioCapturerSourceChangeCallback_ = nullptr;
211     std::shared_ptr<AudioRendererStateChangeCallbackImpl> audioRendererStateChangeCallback_ = nullptr;
212     sptr<HibernateCallback> hibernateCallback_ = nullptr;
213     sptr<SleepCallback> sleepCallback_ = nullptr;
214     bool callActive_ = false;
215     bool systemHibernate_ = false;
216     bool audioCaptureActive_ = false;
217 #ifdef SUPPORT_TELEPHONY_SERVICE
218     bool isTelephonyDetached_ = false;
219 #endif
220     bool isRendererDetached_ = false;
221     bool isHibernateDetached_ = false;
222 };
223 }  // namespace IntellVoiceTrigger
224 }  // namespace OHOS
225 #endif