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_CONNECTOR_H 16 #define INTELL_VOICE_TRIGGER_CONNECTOR_H 17 18 #include <memory> 19 #include <set> 20 #include <map> 21 #include <atomic> 22 #include <mutex> 23 #include <iservmgr_hdi.h> 24 #include "v1_0/iintell_voice_trigger_adapter.h" 25 #include "i_intell_voice_trigger_adapter_listener.h" 26 #include "i_intell_voice_trigger_connector_module.h" 27 #include "i_intell_voice_trigger_connector_callback.h" 28 #include "msg_handle_thread.h" 29 30 namespace OHOS { 31 namespace IntellVoiceTrigger { 32 using OHOS::HDI::ServiceManager::V1_0::ServiceStatus; 33 using OHOS::HDI::ServiceManager::V1_0::ServStatListenerStub; 34 35 using OHOS::HDI::IntelligentVoice::Trigger::V1_0::IntellVoiceTriggerAdapterDsecriptor; 36 using OHOS::HDI::IntelligentVoice::Trigger::V1_0::IntellVoiceTriggerProperties; 37 using OHOS::HDI::IntelligentVoice::Trigger::V1_0::IIntellVoiceTriggerAdapter; 38 using OHOS::HDI::IntelligentVoice::Trigger::V1_0::IntellVoiceRecognitionEvent; 39 using OHOS::HDI::IntelligentVoice::Trigger::V1_0::IIntellVoiceTriggerCallback; 40 41 const std::string INTELL_VOICE_TRIGGER_SERVICE = "intell_voice_trigger_manager_service"; 42 43 class TriggerConnector : public ServStatListenerStub { 44 public: 45 explicit TriggerConnector(const IntellVoiceTriggerAdapterDsecriptor &desc); 46 ~TriggerConnector() override; 47 std::shared_ptr<IIntellVoiceTriggerConnectorModule> GetModule( 48 std::shared_ptr<IIntellVoiceTriggerConnectorCallback> callback); 49 IntellVoiceTriggerProperties GetProperties(); 50 void OnReceive(const ServiceStatus &serviceStatus) override; 51 52 private: 53 class TriggerSession : public IIntellVoiceTriggerConnectorModule, public OHOS::IntellVoiceUtils::MsgHandleThread { 54 public: 55 TriggerSession(std::shared_ptr<IIntellVoiceTriggerConnectorCallback> callback, 56 const sptr<IIntellVoiceTriggerAdapter> &adapter); 57 ~TriggerSession() override; GetAdapter()58 const sptr<IIntellVoiceTriggerAdapter> &GetAdapter() 59 { 60 return adapter_; 61 } GetCallback()62 std::shared_ptr<IIntellVoiceTriggerConnectorCallback> GetCallback() 63 { 64 return callback_; 65 } 66 int32_t LoadModel(std::shared_ptr<GenericTriggerModel> model, int32_t &modelHandle) override; 67 int32_t UnloadModel(int32_t modelHandle) override; 68 int32_t Start(int32_t modelHandle) override; 69 int32_t Stop(int32_t modelHandle) override; 70 71 void HandleRecognitionHdiEvent(std::shared_ptr<IntellVoiceRecognitionEvent> event, 72 int32_t modelHandle); 73 private: 74 enum MsgType { 75 MSG_TYPE_NONE, 76 MSG_TYPE_RECOGNITION_HDI_EVENT, 77 MSG_TYPE_QUIT, 78 }; 79 80 private: 81 class Model : public IIntellVoiceTriggerAdapterListener, public std::enable_shared_from_this<Model> { 82 public: 83 static std::shared_ptr<Model> Create(TriggerSession *session); 84 int32_t Load(std::shared_ptr<GenericTriggerModel> model, int32_t &modelHandle); 85 int32_t Unload(); 86 int32_t Start(); 87 int32_t Stop(); 88 #ifdef TRIGGER_MANAGER_TEST 89 void TriggerManagerCallbackTest(); 90 #endif 91 public: 92 void OnRecognitionHdiEvent(const IntellVoiceRecognitionEvent &event, int32_t cookie) override; 93 94 enum ModelState { 95 IDLE, 96 LOADED, 97 ACTIVE, 98 }; GetState()99 ModelState GetState() 100 { 101 return state_.load(); 102 } 103 SetState(ModelState state)104 void SetState(ModelState state) 105 { 106 state_.store(state); 107 } 108 109 private: Model(TriggerSession * session)110 explicit Model(TriggerSession *session) : session_(session) {} 111 sptr<Ashmem> CreateAshmemFromModelData(const std::vector<uint8_t> &modelData); 112 int32_t handle_ = 0; 113 std::atomic<ModelState> state_ = IDLE; 114 TriggerSession *session_ = nullptr; 115 sptr<IIntellVoiceTriggerCallback> callback_ = nullptr; 116 }; // Model 117 118 private: 119 bool HandleMsg(OHOS::IntellVoiceUtils::Message &message) override; 120 void ProcessRecognitionHdiEvent(const OHOS::IntellVoiceUtils::Message &message); 121 private: 122 std::mutex mutex_ {}; 123 std::shared_ptr<IIntellVoiceTriggerConnectorCallback> callback_ = nullptr; 124 const OHOS::sptr<IIntellVoiceTriggerAdapter> &adapter_; 125 std::map<int32_t, std::shared_ptr<Model>> loadedModels_; 126 }; // TriggerSession 127 128 private: 129 IntellVoiceTriggerAdapterDsecriptor desc_; 130 sptr<IIntellVoiceTriggerAdapter> adapter_ = nullptr; 131 std::set<std::shared_ptr<TriggerSession>> activeSessions_; 132 }; 133 } // namespace IntellVoiceTrigger 134 } // namespace OHOS 135 #endif