• 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 "intell_voice_trigger_manager_impl.h"
16 
17 #include <dlfcn.h>
18 
19 #include "hdf_base.h"
20 #include "intell_voice_log.h"
21 #include "intell_voice_trigger_adapter_impl.h"
22 
23 #undef HDF_LOG_TAG
24 #define HDF_LOG_TAG "TriggerManagerImpl"
25 
26 using namespace OHOS::HDI::IntelligentVoice::Trigger::V1_0;
27 
28 namespace OHOS {
29 namespace IntelligentVoice {
30 namespace Trigger {
IntellVoiceTriggerManagerImplGetInstance(void)31 extern "C" IIntellVoiceTriggerManager *IntellVoiceTriggerManagerImplGetInstance(void)
32 {
33     return new (std::nothrow) IntellVoiceTriggerManagerImpl();
34 }
35 
LoadVendorLib()36 int32_t IntellVoiceTriggerManagerImpl::LoadVendorLib()
37 {
38     std::string error;
39     const char *vendorLibPath = HDF_LIBRARY_FULL_PATH("libvendor_intell_voice_trigger");
40     triggerManagerPriv_.handle = dlopen(vendorLibPath, RTLD_LAZY);
41     if (triggerManagerPriv_.handle == nullptr) {
42         error = dlerror();
43         INTELLIGENT_VOICE_LOGE("load path%{public}s, dlopen err=%{public}s", vendorLibPath, error.c_str());
44         return HDF_FAILURE;
45     }
46 
47     (void)dlerror(); // clear existing error
48 
49     triggerManagerPriv_.getTriggerManagerHalInst = reinterpret_cast<GetTriggerManagerHalInstFunc>(dlsym(
50         triggerManagerPriv_.handle, "GetIntellVoiceTriggerHalInst"));
51     if (triggerManagerPriv_.getTriggerManagerHalInst == nullptr) {
52         error = dlerror();
53         INTELLIGENT_VOICE_LOGE("dlsym GetIntellVoiceEngineManagerHalInst err=%{public}s", error.c_str());
54         dlclose(triggerManagerPriv_.handle);
55         triggerManagerPriv_.handle = nullptr;
56         return HDF_FAILURE;
57     }
58 
59     INTELLIGENT_VOICE_LOGI("load vendor lib success");
60     return HDF_SUCCESS;
61 }
62 
UnloadVendorLib()63 void IntellVoiceTriggerManagerImpl::UnloadVendorLib()
64 {
65     if (triggerManagerPriv_.handle != nullptr) {
66         dlclose(triggerManagerPriv_.handle);
67         triggerManagerPriv_.handle = nullptr;
68     }
69 }
70 
IntellVoiceTriggerManagerImpl()71 IntellVoiceTriggerManagerImpl::IntellVoiceTriggerManagerImpl()
72 {
73     if (LoadVendorLib() == static_cast<int32_t>(HDF_SUCCESS)) {
74         inst_ = triggerManagerPriv_.getTriggerManagerHalInst();
75         if (inst_ == nullptr) {
76             INTELLIGENT_VOICE_LOGE("failed to get trigger manager hal inst");
77         }
78     }
79 }
80 
~IntellVoiceTriggerManagerImpl()81 IntellVoiceTriggerManagerImpl::~IntellVoiceTriggerManagerImpl()
82 {
83     UnloadVendorLib();
84     inst_ = nullptr;
85     halAdapters_.clear();
86 }
87 
LoadAdapter(const IntellVoiceTriggerAdapterDsecriptor & descriptor,sptr<OHOS::HDI::IntelligentVoice::Trigger::V1_0::IIntellVoiceTriggerAdapter> & adapter)88 int32_t IntellVoiceTriggerManagerImpl::LoadAdapter(const IntellVoiceTriggerAdapterDsecriptor &descriptor,
89     sptr<OHOS::HDI::IntelligentVoice::Trigger::V1_0::IIntellVoiceTriggerAdapter> &adapter)
90 {
91     return LoadIntellVoiceTriggerAdapter(descriptor, adapter);
92 }
93 
LoadAdapter_V1_1(const IntellVoiceTriggerAdapterDsecriptor & descriptor,sptr<OHOS::HDI::IntelligentVoice::Trigger::V1_1::IIntellVoiceTriggerAdapter> & adapter)94 int32_t IntellVoiceTriggerManagerImpl::LoadAdapter_V1_1(const IntellVoiceTriggerAdapterDsecriptor &descriptor,
95     sptr<OHOS::HDI::IntelligentVoice::Trigger::V1_1::IIntellVoiceTriggerAdapter> &adapter)
96 {
97     return LoadIntellVoiceTriggerAdapter(descriptor, adapter);
98 }
99 
100 template<typename T>
LoadIntellVoiceTriggerAdapter(const IntellVoiceTriggerAdapterDsecriptor & descriptor,sptr<T> & adapter)101 int32_t IntellVoiceTriggerManagerImpl::LoadIntellVoiceTriggerAdapter(
102     const IntellVoiceTriggerAdapterDsecriptor &descriptor, sptr<T> &adapter)
103 {
104     std::lock_guard<std::mutex> lock(mutex_);
105     if (inst_ == nullptr) {
106         INTELLIGENT_VOICE_LOGE("inst is nullptr");
107         return HDF_FAILURE;
108     }
109 
110     auto it = halAdapters_.find(descriptor.adapterName);
111     if (it != halAdapters_.end()) {
112         INTELLIGENT_VOICE_LOGW("adapter %{public}s already exist", descriptor.adapterName.c_str());
113         inst_->UnloadAdapter(descriptor);
114         it->second = nullptr;
115         halAdapters_.erase(it);
116     }
117 
118     std::unique_ptr<ITrigger> triggerAdapterDevice = nullptr;
119     int32_t ret = inst_->LoadAdapter(descriptor, triggerAdapterDevice);
120     if (triggerAdapterDevice == nullptr) {
121         INTELLIGENT_VOICE_LOGE("get adapter device from hal failed, ret:%{public}d", ret);
122         return HDF_FAILURE;
123     }
124 
125     adapter = sptr<T>(new (std::nothrow) IntellVoiceTriggerAdapterImpl(std::move(triggerAdapterDevice)));
126     if (adapter == nullptr) {
127         INTELLIGENT_VOICE_LOGE("new adapter failed");
128         return HDF_ERR_MALLOC_FAIL;
129     }
130 
131     halAdapters_[descriptor.adapterName] = adapter;
132     return HDF_SUCCESS;
133 }
134 
UnloadAdapter(const IntellVoiceTriggerAdapterDsecriptor & descriptor)135 int32_t IntellVoiceTriggerManagerImpl::UnloadAdapter(const IntellVoiceTriggerAdapterDsecriptor &descriptor)
136 {
137     std::lock_guard<std::mutex> lock(mutex_);
138     if (inst_ == nullptr) {
139         INTELLIGENT_VOICE_LOGE("inst is nullptr");
140         return HDF_FAILURE;
141     }
142 
143     auto adapter = halAdapters_.find(descriptor.adapterName);
144     if (adapter == halAdapters_.end()) {
145         INTELLIGENT_VOICE_LOGE("there is no %{public}s adapter", descriptor.adapterName.c_str());
146         return HDF_ERR_INVALID_OBJECT;
147     }
148 
149     int32_t ret = inst_->UnloadAdapter(descriptor);
150     adapter->second = nullptr;
151     halAdapters_.erase(adapter);
152     return ret;
153 }
154 }
155 }
156 }