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 }