xref: /aosp_15_r20/hardware/interfaces/soundtrigger/2.0/default/SoundTriggerHalImpl.cpp (revision 4d7e907c777eeecc4c5bd7cf640a754fac206ff7)
1*4d7e907cSAndroid Build Coastguard Worker /*
2*4d7e907cSAndroid Build Coastguard Worker  * Copyright (C) 2016 The Android Open Source Project
3*4d7e907cSAndroid Build Coastguard Worker  *
4*4d7e907cSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*4d7e907cSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*4d7e907cSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*4d7e907cSAndroid Build Coastguard Worker  *
8*4d7e907cSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*4d7e907cSAndroid Build Coastguard Worker  *
10*4d7e907cSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*4d7e907cSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*4d7e907cSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*4d7e907cSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*4d7e907cSAndroid Build Coastguard Worker  * limitations under the License.
15*4d7e907cSAndroid Build Coastguard Worker  */
16*4d7e907cSAndroid Build Coastguard Worker 
17*4d7e907cSAndroid Build Coastguard Worker #define LOG_TAG "SoundTriggerHalImpl"
18*4d7e907cSAndroid Build Coastguard Worker //#define LOG_NDEBUG 0
19*4d7e907cSAndroid Build Coastguard Worker 
20*4d7e907cSAndroid Build Coastguard Worker #include "SoundTriggerHalImpl.h"
21*4d7e907cSAndroid Build Coastguard Worker #include <android/log.h>
22*4d7e907cSAndroid Build Coastguard Worker 
23*4d7e907cSAndroid Build Coastguard Worker namespace android {
24*4d7e907cSAndroid Build Coastguard Worker namespace hardware {
25*4d7e907cSAndroid Build Coastguard Worker namespace soundtrigger {
26*4d7e907cSAndroid Build Coastguard Worker namespace V2_0 {
27*4d7e907cSAndroid Build Coastguard Worker namespace implementation {
28*4d7e907cSAndroid Build Coastguard Worker 
29*4d7e907cSAndroid Build Coastguard Worker // static
soundModelCallback(struct sound_trigger_model_event * halEvent,void * cookie)30*4d7e907cSAndroid Build Coastguard Worker void SoundTriggerHalImpl::soundModelCallback(struct sound_trigger_model_event* halEvent,
31*4d7e907cSAndroid Build Coastguard Worker                                              void* cookie) {
32*4d7e907cSAndroid Build Coastguard Worker     if (halEvent == NULL) {
33*4d7e907cSAndroid Build Coastguard Worker         ALOGW("soundModelCallback called with NULL event");
34*4d7e907cSAndroid Build Coastguard Worker         return;
35*4d7e907cSAndroid Build Coastguard Worker     }
36*4d7e907cSAndroid Build Coastguard Worker     sp<SoundModelClient> client =
37*4d7e907cSAndroid Build Coastguard Worker         wp<SoundModelClient>(static_cast<SoundModelClient*>(cookie)).promote();
38*4d7e907cSAndroid Build Coastguard Worker     if (client == 0) {
39*4d7e907cSAndroid Build Coastguard Worker         ALOGW("soundModelCallback called on stale client");
40*4d7e907cSAndroid Build Coastguard Worker         return;
41*4d7e907cSAndroid Build Coastguard Worker     }
42*4d7e907cSAndroid Build Coastguard Worker     if (halEvent->model != client->getHalHandle()) {
43*4d7e907cSAndroid Build Coastguard Worker         ALOGW("soundModelCallback call with wrong handle %d on client with handle %d",
44*4d7e907cSAndroid Build Coastguard Worker               (int)halEvent->model, (int)client->getHalHandle());
45*4d7e907cSAndroid Build Coastguard Worker         return;
46*4d7e907cSAndroid Build Coastguard Worker     }
47*4d7e907cSAndroid Build Coastguard Worker 
48*4d7e907cSAndroid Build Coastguard Worker     client->soundModelCallback(halEvent);
49*4d7e907cSAndroid Build Coastguard Worker }
50*4d7e907cSAndroid Build Coastguard Worker 
51*4d7e907cSAndroid Build Coastguard Worker // static
recognitionCallback(struct sound_trigger_recognition_event * halEvent,void * cookie)52*4d7e907cSAndroid Build Coastguard Worker void SoundTriggerHalImpl::recognitionCallback(struct sound_trigger_recognition_event* halEvent,
53*4d7e907cSAndroid Build Coastguard Worker                                               void* cookie) {
54*4d7e907cSAndroid Build Coastguard Worker     if (halEvent == NULL) {
55*4d7e907cSAndroid Build Coastguard Worker         ALOGW("recognitionCallback call NULL event");
56*4d7e907cSAndroid Build Coastguard Worker         return;
57*4d7e907cSAndroid Build Coastguard Worker     }
58*4d7e907cSAndroid Build Coastguard Worker     sp<SoundModelClient> client =
59*4d7e907cSAndroid Build Coastguard Worker         wp<SoundModelClient>(static_cast<SoundModelClient*>(cookie)).promote();
60*4d7e907cSAndroid Build Coastguard Worker     if (client == 0) {
61*4d7e907cSAndroid Build Coastguard Worker         ALOGW("soundModelCallback called on stale client");
62*4d7e907cSAndroid Build Coastguard Worker         return;
63*4d7e907cSAndroid Build Coastguard Worker     }
64*4d7e907cSAndroid Build Coastguard Worker 
65*4d7e907cSAndroid Build Coastguard Worker     client->recognitionCallback(halEvent);
66*4d7e907cSAndroid Build Coastguard Worker }
67*4d7e907cSAndroid Build Coastguard Worker 
getProperties(ISoundTriggerHw::getProperties_cb _hidl_cb)68*4d7e907cSAndroid Build Coastguard Worker Return<void> SoundTriggerHalImpl::getProperties(ISoundTriggerHw::getProperties_cb _hidl_cb) {
69*4d7e907cSAndroid Build Coastguard Worker     ALOGV("getProperties() mHwDevice %p", mHwDevice);
70*4d7e907cSAndroid Build Coastguard Worker     int ret;
71*4d7e907cSAndroid Build Coastguard Worker     struct sound_trigger_properties halProperties;
72*4d7e907cSAndroid Build Coastguard Worker     ISoundTriggerHw::Properties properties;
73*4d7e907cSAndroid Build Coastguard Worker 
74*4d7e907cSAndroid Build Coastguard Worker     if (mHwDevice == NULL) {
75*4d7e907cSAndroid Build Coastguard Worker         ret = -ENODEV;
76*4d7e907cSAndroid Build Coastguard Worker         goto exit;
77*4d7e907cSAndroid Build Coastguard Worker     }
78*4d7e907cSAndroid Build Coastguard Worker 
79*4d7e907cSAndroid Build Coastguard Worker     ret = mHwDevice->get_properties(mHwDevice, &halProperties);
80*4d7e907cSAndroid Build Coastguard Worker 
81*4d7e907cSAndroid Build Coastguard Worker     convertPropertiesFromHal(&properties, &halProperties);
82*4d7e907cSAndroid Build Coastguard Worker 
83*4d7e907cSAndroid Build Coastguard Worker     ALOGV("getProperties implementor %s recognitionModes %08x", properties.implementor.c_str(),
84*4d7e907cSAndroid Build Coastguard Worker           properties.recognitionModes);
85*4d7e907cSAndroid Build Coastguard Worker 
86*4d7e907cSAndroid Build Coastguard Worker exit:
87*4d7e907cSAndroid Build Coastguard Worker     _hidl_cb(ret, properties);
88*4d7e907cSAndroid Build Coastguard Worker     return Void();
89*4d7e907cSAndroid Build Coastguard Worker }
90*4d7e907cSAndroid Build Coastguard Worker 
doLoadSoundModel(const ISoundTriggerHw::SoundModel & soundModel,sp<SoundModelClient> client)91*4d7e907cSAndroid Build Coastguard Worker int SoundTriggerHalImpl::doLoadSoundModel(const ISoundTriggerHw::SoundModel& soundModel,
92*4d7e907cSAndroid Build Coastguard Worker                                           sp<SoundModelClient> client) {
93*4d7e907cSAndroid Build Coastguard Worker     int32_t ret = 0;
94*4d7e907cSAndroid Build Coastguard Worker     struct sound_trigger_sound_model* halSoundModel;
95*4d7e907cSAndroid Build Coastguard Worker 
96*4d7e907cSAndroid Build Coastguard Worker     ALOGV("doLoadSoundModel() data size %zu", soundModel.data.size());
97*4d7e907cSAndroid Build Coastguard Worker 
98*4d7e907cSAndroid Build Coastguard Worker     if (mHwDevice == NULL) {
99*4d7e907cSAndroid Build Coastguard Worker         ret = -ENODEV;
100*4d7e907cSAndroid Build Coastguard Worker         goto exit;
101*4d7e907cSAndroid Build Coastguard Worker     }
102*4d7e907cSAndroid Build Coastguard Worker 
103*4d7e907cSAndroid Build Coastguard Worker     halSoundModel = convertSoundModelToHal(&soundModel);
104*4d7e907cSAndroid Build Coastguard Worker     if (halSoundModel == NULL) {
105*4d7e907cSAndroid Build Coastguard Worker         ret = -EINVAL;
106*4d7e907cSAndroid Build Coastguard Worker         goto exit;
107*4d7e907cSAndroid Build Coastguard Worker     }
108*4d7e907cSAndroid Build Coastguard Worker 
109*4d7e907cSAndroid Build Coastguard Worker     sound_model_handle_t halHandle;
110*4d7e907cSAndroid Build Coastguard Worker     ret = mHwDevice->load_sound_model(mHwDevice, halSoundModel, soundModelCallback, client.get(),
111*4d7e907cSAndroid Build Coastguard Worker                                       &halHandle);
112*4d7e907cSAndroid Build Coastguard Worker 
113*4d7e907cSAndroid Build Coastguard Worker     free(halSoundModel);
114*4d7e907cSAndroid Build Coastguard Worker 
115*4d7e907cSAndroid Build Coastguard Worker     if (ret != 0) {
116*4d7e907cSAndroid Build Coastguard Worker         goto exit;
117*4d7e907cSAndroid Build Coastguard Worker     }
118*4d7e907cSAndroid Build Coastguard Worker 
119*4d7e907cSAndroid Build Coastguard Worker     client->setHalHandle(halHandle);
120*4d7e907cSAndroid Build Coastguard Worker     {
121*4d7e907cSAndroid Build Coastguard Worker         AutoMutex lock(mLock);
122*4d7e907cSAndroid Build Coastguard Worker         mClients.add(client->getId(), client);
123*4d7e907cSAndroid Build Coastguard Worker     }
124*4d7e907cSAndroid Build Coastguard Worker 
125*4d7e907cSAndroid Build Coastguard Worker exit:
126*4d7e907cSAndroid Build Coastguard Worker     return ret;
127*4d7e907cSAndroid Build Coastguard Worker }
128*4d7e907cSAndroid Build Coastguard Worker 
loadSoundModel(const ISoundTriggerHw::SoundModel & soundModel,const sp<ISoundTriggerHwCallback> & callback,ISoundTriggerHwCallback::CallbackCookie cookie,ISoundTriggerHw::loadSoundModel_cb _hidl_cb)129*4d7e907cSAndroid Build Coastguard Worker Return<void> SoundTriggerHalImpl::loadSoundModel(const ISoundTriggerHw::SoundModel& soundModel,
130*4d7e907cSAndroid Build Coastguard Worker                                                  const sp<ISoundTriggerHwCallback>& callback,
131*4d7e907cSAndroid Build Coastguard Worker                                                  ISoundTriggerHwCallback::CallbackCookie cookie,
132*4d7e907cSAndroid Build Coastguard Worker                                                  ISoundTriggerHw::loadSoundModel_cb _hidl_cb) {
133*4d7e907cSAndroid Build Coastguard Worker     sp<SoundModelClient> client = new SoundModelClient_2_0(nextUniqueModelId(), cookie, callback);
134*4d7e907cSAndroid Build Coastguard Worker     _hidl_cb(doLoadSoundModel(soundModel, client), client->getId());
135*4d7e907cSAndroid Build Coastguard Worker     return Void();
136*4d7e907cSAndroid Build Coastguard Worker }
137*4d7e907cSAndroid Build Coastguard Worker 
loadPhraseSoundModel(const ISoundTriggerHw::PhraseSoundModel & soundModel,const sp<ISoundTriggerHwCallback> & callback,ISoundTriggerHwCallback::CallbackCookie cookie,ISoundTriggerHw::loadPhraseSoundModel_cb _hidl_cb)138*4d7e907cSAndroid Build Coastguard Worker Return<void> SoundTriggerHalImpl::loadPhraseSoundModel(
139*4d7e907cSAndroid Build Coastguard Worker     const ISoundTriggerHw::PhraseSoundModel& soundModel,
140*4d7e907cSAndroid Build Coastguard Worker     const sp<ISoundTriggerHwCallback>& callback, ISoundTriggerHwCallback::CallbackCookie cookie,
141*4d7e907cSAndroid Build Coastguard Worker     ISoundTriggerHw::loadPhraseSoundModel_cb _hidl_cb) {
142*4d7e907cSAndroid Build Coastguard Worker     sp<SoundModelClient> client = new SoundModelClient_2_0(nextUniqueModelId(), cookie, callback);
143*4d7e907cSAndroid Build Coastguard Worker     _hidl_cb(doLoadSoundModel((const ISoundTriggerHw::SoundModel&)soundModel, client),
144*4d7e907cSAndroid Build Coastguard Worker              client->getId());
145*4d7e907cSAndroid Build Coastguard Worker     return Void();
146*4d7e907cSAndroid Build Coastguard Worker }
147*4d7e907cSAndroid Build Coastguard Worker 
unloadSoundModel(SoundModelHandle modelHandle)148*4d7e907cSAndroid Build Coastguard Worker Return<int32_t> SoundTriggerHalImpl::unloadSoundModel(SoundModelHandle modelHandle) {
149*4d7e907cSAndroid Build Coastguard Worker     int32_t ret;
150*4d7e907cSAndroid Build Coastguard Worker     sp<SoundModelClient> client;
151*4d7e907cSAndroid Build Coastguard Worker 
152*4d7e907cSAndroid Build Coastguard Worker     if (mHwDevice == NULL) {
153*4d7e907cSAndroid Build Coastguard Worker         ret = -ENODEV;
154*4d7e907cSAndroid Build Coastguard Worker         goto exit;
155*4d7e907cSAndroid Build Coastguard Worker     }
156*4d7e907cSAndroid Build Coastguard Worker 
157*4d7e907cSAndroid Build Coastguard Worker     {
158*4d7e907cSAndroid Build Coastguard Worker         AutoMutex lock(mLock);
159*4d7e907cSAndroid Build Coastguard Worker         client = mClients.valueFor(modelHandle);
160*4d7e907cSAndroid Build Coastguard Worker         if (client == 0) {
161*4d7e907cSAndroid Build Coastguard Worker             ret = -ENOSYS;
162*4d7e907cSAndroid Build Coastguard Worker             goto exit;
163*4d7e907cSAndroid Build Coastguard Worker         }
164*4d7e907cSAndroid Build Coastguard Worker     }
165*4d7e907cSAndroid Build Coastguard Worker 
166*4d7e907cSAndroid Build Coastguard Worker     ret = mHwDevice->unload_sound_model(mHwDevice, client->getHalHandle());
167*4d7e907cSAndroid Build Coastguard Worker 
168*4d7e907cSAndroid Build Coastguard Worker     mClients.removeItem(modelHandle);
169*4d7e907cSAndroid Build Coastguard Worker 
170*4d7e907cSAndroid Build Coastguard Worker exit:
171*4d7e907cSAndroid Build Coastguard Worker     return ret;
172*4d7e907cSAndroid Build Coastguard Worker }
173*4d7e907cSAndroid Build Coastguard Worker 
startRecognition(SoundModelHandle modelHandle,const ISoundTriggerHw::RecognitionConfig & config)174*4d7e907cSAndroid Build Coastguard Worker Return<int32_t> SoundTriggerHalImpl::startRecognition(
175*4d7e907cSAndroid Build Coastguard Worker     SoundModelHandle modelHandle, const ISoundTriggerHw::RecognitionConfig& config) {
176*4d7e907cSAndroid Build Coastguard Worker     int32_t ret;
177*4d7e907cSAndroid Build Coastguard Worker     sp<SoundModelClient> client;
178*4d7e907cSAndroid Build Coastguard Worker     struct sound_trigger_recognition_config* halConfig;
179*4d7e907cSAndroid Build Coastguard Worker 
180*4d7e907cSAndroid Build Coastguard Worker     if (mHwDevice == NULL) {
181*4d7e907cSAndroid Build Coastguard Worker         ret = -ENODEV;
182*4d7e907cSAndroid Build Coastguard Worker         goto exit;
183*4d7e907cSAndroid Build Coastguard Worker     }
184*4d7e907cSAndroid Build Coastguard Worker 
185*4d7e907cSAndroid Build Coastguard Worker     {
186*4d7e907cSAndroid Build Coastguard Worker         AutoMutex lock(mLock);
187*4d7e907cSAndroid Build Coastguard Worker         client = mClients.valueFor(modelHandle);
188*4d7e907cSAndroid Build Coastguard Worker         if (client == 0) {
189*4d7e907cSAndroid Build Coastguard Worker             ret = -ENOSYS;
190*4d7e907cSAndroid Build Coastguard Worker             goto exit;
191*4d7e907cSAndroid Build Coastguard Worker         }
192*4d7e907cSAndroid Build Coastguard Worker     }
193*4d7e907cSAndroid Build Coastguard Worker 
194*4d7e907cSAndroid Build Coastguard Worker     halConfig = convertRecognitionConfigToHal(&config);
195*4d7e907cSAndroid Build Coastguard Worker 
196*4d7e907cSAndroid Build Coastguard Worker     if (halConfig == NULL) {
197*4d7e907cSAndroid Build Coastguard Worker         ret = -EINVAL;
198*4d7e907cSAndroid Build Coastguard Worker         goto exit;
199*4d7e907cSAndroid Build Coastguard Worker     }
200*4d7e907cSAndroid Build Coastguard Worker     ret = mHwDevice->start_recognition(mHwDevice, client->getHalHandle(), halConfig,
201*4d7e907cSAndroid Build Coastguard Worker                                        recognitionCallback, client.get());
202*4d7e907cSAndroid Build Coastguard Worker 
203*4d7e907cSAndroid Build Coastguard Worker     free(halConfig);
204*4d7e907cSAndroid Build Coastguard Worker 
205*4d7e907cSAndroid Build Coastguard Worker exit:
206*4d7e907cSAndroid Build Coastguard Worker     return ret;
207*4d7e907cSAndroid Build Coastguard Worker }
208*4d7e907cSAndroid Build Coastguard Worker 
stopRecognition(SoundModelHandle modelHandle)209*4d7e907cSAndroid Build Coastguard Worker Return<int32_t> SoundTriggerHalImpl::stopRecognition(SoundModelHandle modelHandle) {
210*4d7e907cSAndroid Build Coastguard Worker     int32_t ret;
211*4d7e907cSAndroid Build Coastguard Worker     sp<SoundModelClient> client;
212*4d7e907cSAndroid Build Coastguard Worker     if (mHwDevice == NULL) {
213*4d7e907cSAndroid Build Coastguard Worker         ret = -ENODEV;
214*4d7e907cSAndroid Build Coastguard Worker         goto exit;
215*4d7e907cSAndroid Build Coastguard Worker     }
216*4d7e907cSAndroid Build Coastguard Worker 
217*4d7e907cSAndroid Build Coastguard Worker     {
218*4d7e907cSAndroid Build Coastguard Worker         AutoMutex lock(mLock);
219*4d7e907cSAndroid Build Coastguard Worker         client = mClients.valueFor(modelHandle);
220*4d7e907cSAndroid Build Coastguard Worker         if (client == 0) {
221*4d7e907cSAndroid Build Coastguard Worker             ret = -ENOSYS;
222*4d7e907cSAndroid Build Coastguard Worker             goto exit;
223*4d7e907cSAndroid Build Coastguard Worker         }
224*4d7e907cSAndroid Build Coastguard Worker     }
225*4d7e907cSAndroid Build Coastguard Worker 
226*4d7e907cSAndroid Build Coastguard Worker     ret = mHwDevice->stop_recognition(mHwDevice, client->getHalHandle());
227*4d7e907cSAndroid Build Coastguard Worker 
228*4d7e907cSAndroid Build Coastguard Worker exit:
229*4d7e907cSAndroid Build Coastguard Worker     return ret;
230*4d7e907cSAndroid Build Coastguard Worker }
231*4d7e907cSAndroid Build Coastguard Worker 
stopAllRecognitions()232*4d7e907cSAndroid Build Coastguard Worker Return<int32_t> SoundTriggerHalImpl::stopAllRecognitions() {
233*4d7e907cSAndroid Build Coastguard Worker     int32_t ret;
234*4d7e907cSAndroid Build Coastguard Worker     if (mHwDevice == NULL) {
235*4d7e907cSAndroid Build Coastguard Worker         ret = -ENODEV;
236*4d7e907cSAndroid Build Coastguard Worker         goto exit;
237*4d7e907cSAndroid Build Coastguard Worker     }
238*4d7e907cSAndroid Build Coastguard Worker 
239*4d7e907cSAndroid Build Coastguard Worker     if (mHwDevice->common.version >= SOUND_TRIGGER_DEVICE_API_VERSION_1_1 &&
240*4d7e907cSAndroid Build Coastguard Worker         mHwDevice->stop_all_recognitions) {
241*4d7e907cSAndroid Build Coastguard Worker         ret = mHwDevice->stop_all_recognitions(mHwDevice);
242*4d7e907cSAndroid Build Coastguard Worker     } else {
243*4d7e907cSAndroid Build Coastguard Worker         ret = -ENOSYS;
244*4d7e907cSAndroid Build Coastguard Worker     }
245*4d7e907cSAndroid Build Coastguard Worker exit:
246*4d7e907cSAndroid Build Coastguard Worker     return ret;
247*4d7e907cSAndroid Build Coastguard Worker }
248*4d7e907cSAndroid Build Coastguard Worker 
SoundTriggerHalImpl()249*4d7e907cSAndroid Build Coastguard Worker SoundTriggerHalImpl::SoundTriggerHalImpl()
250*4d7e907cSAndroid Build Coastguard Worker     : mModuleName("primary"), mHwDevice(NULL), mNextModelId(1) {}
251*4d7e907cSAndroid Build Coastguard Worker 
onFirstRef()252*4d7e907cSAndroid Build Coastguard Worker void SoundTriggerHalImpl::onFirstRef() {
253*4d7e907cSAndroid Build Coastguard Worker     const hw_module_t* mod;
254*4d7e907cSAndroid Build Coastguard Worker     int rc;
255*4d7e907cSAndroid Build Coastguard Worker 
256*4d7e907cSAndroid Build Coastguard Worker     rc = hw_get_module_by_class(SOUND_TRIGGER_HARDWARE_MODULE_ID, mModuleName, &mod);
257*4d7e907cSAndroid Build Coastguard Worker     if (rc != 0) {
258*4d7e907cSAndroid Build Coastguard Worker         ALOGE("couldn't load sound trigger module %s.%s (%s)", SOUND_TRIGGER_HARDWARE_MODULE_ID,
259*4d7e907cSAndroid Build Coastguard Worker               mModuleName, strerror(-rc));
260*4d7e907cSAndroid Build Coastguard Worker         return;
261*4d7e907cSAndroid Build Coastguard Worker     }
262*4d7e907cSAndroid Build Coastguard Worker     rc = sound_trigger_hw_device_open(mod, &mHwDevice);
263*4d7e907cSAndroid Build Coastguard Worker     if (rc != 0) {
264*4d7e907cSAndroid Build Coastguard Worker         ALOGE("couldn't open sound trigger hw device in %s.%s (%s)",
265*4d7e907cSAndroid Build Coastguard Worker               SOUND_TRIGGER_HARDWARE_MODULE_ID, mModuleName, strerror(-rc));
266*4d7e907cSAndroid Build Coastguard Worker         mHwDevice = NULL;
267*4d7e907cSAndroid Build Coastguard Worker         return;
268*4d7e907cSAndroid Build Coastguard Worker     }
269*4d7e907cSAndroid Build Coastguard Worker     if (mHwDevice->common.version < SOUND_TRIGGER_DEVICE_API_VERSION_1_0 ||
270*4d7e907cSAndroid Build Coastguard Worker         mHwDevice->common.version > SOUND_TRIGGER_DEVICE_API_VERSION_CURRENT) {
271*4d7e907cSAndroid Build Coastguard Worker         ALOGE("wrong sound trigger hw device version %04x", mHwDevice->common.version);
272*4d7e907cSAndroid Build Coastguard Worker         sound_trigger_hw_device_close(mHwDevice);
273*4d7e907cSAndroid Build Coastguard Worker         mHwDevice = NULL;
274*4d7e907cSAndroid Build Coastguard Worker         return;
275*4d7e907cSAndroid Build Coastguard Worker     }
276*4d7e907cSAndroid Build Coastguard Worker 
277*4d7e907cSAndroid Build Coastguard Worker     ALOGI("onFirstRef() mModuleName %s mHwDevice %p", mModuleName, mHwDevice);
278*4d7e907cSAndroid Build Coastguard Worker }
279*4d7e907cSAndroid Build Coastguard Worker 
~SoundTriggerHalImpl()280*4d7e907cSAndroid Build Coastguard Worker SoundTriggerHalImpl::~SoundTriggerHalImpl() {
281*4d7e907cSAndroid Build Coastguard Worker     if (mHwDevice != NULL) {
282*4d7e907cSAndroid Build Coastguard Worker         sound_trigger_hw_device_close(mHwDevice);
283*4d7e907cSAndroid Build Coastguard Worker     }
284*4d7e907cSAndroid Build Coastguard Worker }
285*4d7e907cSAndroid Build Coastguard Worker 
nextUniqueModelId()286*4d7e907cSAndroid Build Coastguard Worker uint32_t SoundTriggerHalImpl::nextUniqueModelId() {
287*4d7e907cSAndroid Build Coastguard Worker     uint32_t modelId = 0;
288*4d7e907cSAndroid Build Coastguard Worker     {
289*4d7e907cSAndroid Build Coastguard Worker         AutoMutex lock(mLock);
290*4d7e907cSAndroid Build Coastguard Worker         do {
291*4d7e907cSAndroid Build Coastguard Worker             modelId =
292*4d7e907cSAndroid Build Coastguard Worker                 atomic_fetch_add_explicit(&mNextModelId, (uint_fast32_t)1, memory_order_acq_rel);
293*4d7e907cSAndroid Build Coastguard Worker         } while (mClients.valueFor(modelId) != 0 && modelId != 0);
294*4d7e907cSAndroid Build Coastguard Worker     }
295*4d7e907cSAndroid Build Coastguard Worker     LOG_ALWAYS_FATAL_IF(modelId == 0, "wrap around in sound model IDs, num loaded models %zu",
296*4d7e907cSAndroid Build Coastguard Worker                         mClients.size());
297*4d7e907cSAndroid Build Coastguard Worker     return modelId;
298*4d7e907cSAndroid Build Coastguard Worker }
299*4d7e907cSAndroid Build Coastguard Worker 
convertUuidFromHal(Uuid * uuid,const sound_trigger_uuid_t * halUuid)300*4d7e907cSAndroid Build Coastguard Worker void SoundTriggerHalImpl::convertUuidFromHal(Uuid* uuid, const sound_trigger_uuid_t* halUuid) {
301*4d7e907cSAndroid Build Coastguard Worker     uuid->timeLow = halUuid->timeLow;
302*4d7e907cSAndroid Build Coastguard Worker     uuid->timeMid = halUuid->timeMid;
303*4d7e907cSAndroid Build Coastguard Worker     uuid->versionAndTimeHigh = halUuid->timeHiAndVersion;
304*4d7e907cSAndroid Build Coastguard Worker     uuid->variantAndClockSeqHigh = halUuid->clockSeq;
305*4d7e907cSAndroid Build Coastguard Worker     memcpy(&uuid->node[0], &halUuid->node[0], 6);
306*4d7e907cSAndroid Build Coastguard Worker }
307*4d7e907cSAndroid Build Coastguard Worker 
convertUuidToHal(sound_trigger_uuid_t * halUuid,const Uuid * uuid)308*4d7e907cSAndroid Build Coastguard Worker void SoundTriggerHalImpl::convertUuidToHal(sound_trigger_uuid_t* halUuid, const Uuid* uuid) {
309*4d7e907cSAndroid Build Coastguard Worker     halUuid->timeLow = uuid->timeLow;
310*4d7e907cSAndroid Build Coastguard Worker     halUuid->timeMid = uuid->timeMid;
311*4d7e907cSAndroid Build Coastguard Worker     halUuid->timeHiAndVersion = uuid->versionAndTimeHigh;
312*4d7e907cSAndroid Build Coastguard Worker     halUuid->clockSeq = uuid->variantAndClockSeqHigh;
313*4d7e907cSAndroid Build Coastguard Worker     memcpy(&halUuid->node[0], &uuid->node[0], 6);
314*4d7e907cSAndroid Build Coastguard Worker }
315*4d7e907cSAndroid Build Coastguard Worker 
convertPropertiesFromHal(ISoundTriggerHw::Properties * properties,const struct sound_trigger_properties * halProperties)316*4d7e907cSAndroid Build Coastguard Worker void SoundTriggerHalImpl::convertPropertiesFromHal(
317*4d7e907cSAndroid Build Coastguard Worker     ISoundTriggerHw::Properties* properties, const struct sound_trigger_properties* halProperties) {
318*4d7e907cSAndroid Build Coastguard Worker     properties->implementor = halProperties->implementor;
319*4d7e907cSAndroid Build Coastguard Worker     properties->description = halProperties->description;
320*4d7e907cSAndroid Build Coastguard Worker     properties->version = halProperties->version;
321*4d7e907cSAndroid Build Coastguard Worker     convertUuidFromHal(&properties->uuid, &halProperties->uuid);
322*4d7e907cSAndroid Build Coastguard Worker     properties->maxSoundModels = halProperties->max_sound_models;
323*4d7e907cSAndroid Build Coastguard Worker     properties->maxKeyPhrases = halProperties->max_key_phrases;
324*4d7e907cSAndroid Build Coastguard Worker     properties->maxUsers = halProperties->max_users;
325*4d7e907cSAndroid Build Coastguard Worker     properties->recognitionModes = halProperties->recognition_modes;
326*4d7e907cSAndroid Build Coastguard Worker     properties->captureTransition = halProperties->capture_transition;
327*4d7e907cSAndroid Build Coastguard Worker     properties->maxBufferMs = halProperties->max_buffer_ms;
328*4d7e907cSAndroid Build Coastguard Worker     properties->concurrentCapture = halProperties->concurrent_capture;
329*4d7e907cSAndroid Build Coastguard Worker     properties->triggerInEvent = halProperties->trigger_in_event;
330*4d7e907cSAndroid Build Coastguard Worker     properties->powerConsumptionMw = halProperties->power_consumption_mw;
331*4d7e907cSAndroid Build Coastguard Worker }
332*4d7e907cSAndroid Build Coastguard Worker 
convertTriggerPhraseToHal(struct sound_trigger_phrase * halTriggerPhrase,const ISoundTriggerHw::Phrase * triggerPhrase)333*4d7e907cSAndroid Build Coastguard Worker void SoundTriggerHalImpl::convertTriggerPhraseToHal(struct sound_trigger_phrase* halTriggerPhrase,
334*4d7e907cSAndroid Build Coastguard Worker                                                     const ISoundTriggerHw::Phrase* triggerPhrase) {
335*4d7e907cSAndroid Build Coastguard Worker     halTriggerPhrase->id = triggerPhrase->id;
336*4d7e907cSAndroid Build Coastguard Worker     halTriggerPhrase->recognition_mode = triggerPhrase->recognitionModes;
337*4d7e907cSAndroid Build Coastguard Worker     unsigned int i;
338*4d7e907cSAndroid Build Coastguard Worker 
339*4d7e907cSAndroid Build Coastguard Worker     halTriggerPhrase->num_users =
340*4d7e907cSAndroid Build Coastguard Worker         std::min((int)triggerPhrase->users.size(), SOUND_TRIGGER_MAX_USERS);
341*4d7e907cSAndroid Build Coastguard Worker     for (i = 0; i < halTriggerPhrase->num_users; i++) {
342*4d7e907cSAndroid Build Coastguard Worker         halTriggerPhrase->users[i] = triggerPhrase->users[i];
343*4d7e907cSAndroid Build Coastguard Worker     }
344*4d7e907cSAndroid Build Coastguard Worker 
345*4d7e907cSAndroid Build Coastguard Worker     strlcpy(halTriggerPhrase->locale, triggerPhrase->locale.c_str(), SOUND_TRIGGER_MAX_LOCALE_LEN);
346*4d7e907cSAndroid Build Coastguard Worker     strlcpy(halTriggerPhrase->text, triggerPhrase->text.c_str(), SOUND_TRIGGER_MAX_STRING_LEN);
347*4d7e907cSAndroid Build Coastguard Worker }
348*4d7e907cSAndroid Build Coastguard Worker 
convertSoundModelToHal(const ISoundTriggerHw::SoundModel * soundModel)349*4d7e907cSAndroid Build Coastguard Worker struct sound_trigger_sound_model* SoundTriggerHalImpl::convertSoundModelToHal(
350*4d7e907cSAndroid Build Coastguard Worker     const ISoundTriggerHw::SoundModel* soundModel) {
351*4d7e907cSAndroid Build Coastguard Worker     struct sound_trigger_sound_model* halModel = NULL;
352*4d7e907cSAndroid Build Coastguard Worker     if (soundModel->type == SoundModelType::KEYPHRASE) {
353*4d7e907cSAndroid Build Coastguard Worker         size_t allocSize =
354*4d7e907cSAndroid Build Coastguard Worker             sizeof(struct sound_trigger_phrase_sound_model) + soundModel->data.size();
355*4d7e907cSAndroid Build Coastguard Worker         struct sound_trigger_phrase_sound_model* halKeyPhraseModel =
356*4d7e907cSAndroid Build Coastguard Worker             static_cast<struct sound_trigger_phrase_sound_model*>(malloc(allocSize));
357*4d7e907cSAndroid Build Coastguard Worker         LOG_ALWAYS_FATAL_IF(halKeyPhraseModel == NULL,
358*4d7e907cSAndroid Build Coastguard Worker                             "malloc failed for size %zu in convertSoundModelToHal PHRASE",
359*4d7e907cSAndroid Build Coastguard Worker                             allocSize);
360*4d7e907cSAndroid Build Coastguard Worker 
361*4d7e907cSAndroid Build Coastguard Worker         const ISoundTriggerHw::PhraseSoundModel* keyPhraseModel =
362*4d7e907cSAndroid Build Coastguard Worker             reinterpret_cast<const ISoundTriggerHw::PhraseSoundModel*>(soundModel);
363*4d7e907cSAndroid Build Coastguard Worker 
364*4d7e907cSAndroid Build Coastguard Worker         size_t i;
365*4d7e907cSAndroid Build Coastguard Worker         for (i = 0; i < keyPhraseModel->phrases.size() && i < SOUND_TRIGGER_MAX_PHRASES; i++) {
366*4d7e907cSAndroid Build Coastguard Worker             convertTriggerPhraseToHal(&halKeyPhraseModel->phrases[i], &keyPhraseModel->phrases[i]);
367*4d7e907cSAndroid Build Coastguard Worker         }
368*4d7e907cSAndroid Build Coastguard Worker         halKeyPhraseModel->num_phrases = (unsigned int)i;
369*4d7e907cSAndroid Build Coastguard Worker         halModel = reinterpret_cast<struct sound_trigger_sound_model*>(halKeyPhraseModel);
370*4d7e907cSAndroid Build Coastguard Worker         halModel->data_offset = sizeof(struct sound_trigger_phrase_sound_model);
371*4d7e907cSAndroid Build Coastguard Worker     } else {
372*4d7e907cSAndroid Build Coastguard Worker         size_t allocSize = sizeof(struct sound_trigger_sound_model) + soundModel->data.size();
373*4d7e907cSAndroid Build Coastguard Worker         halModel = static_cast<struct sound_trigger_sound_model*>(malloc(allocSize));
374*4d7e907cSAndroid Build Coastguard Worker         LOG_ALWAYS_FATAL_IF(halModel == NULL,
375*4d7e907cSAndroid Build Coastguard Worker                             "malloc failed for size %zu in convertSoundModelToHal GENERIC",
376*4d7e907cSAndroid Build Coastguard Worker                             allocSize);
377*4d7e907cSAndroid Build Coastguard Worker 
378*4d7e907cSAndroid Build Coastguard Worker         halModel->data_offset = sizeof(struct sound_trigger_sound_model);
379*4d7e907cSAndroid Build Coastguard Worker     }
380*4d7e907cSAndroid Build Coastguard Worker     halModel->type = (sound_trigger_sound_model_type_t)soundModel->type;
381*4d7e907cSAndroid Build Coastguard Worker     convertUuidToHal(&halModel->uuid, &soundModel->uuid);
382*4d7e907cSAndroid Build Coastguard Worker     convertUuidToHal(&halModel->vendor_uuid, &soundModel->vendorUuid);
383*4d7e907cSAndroid Build Coastguard Worker     halModel->data_size = soundModel->data.size();
384*4d7e907cSAndroid Build Coastguard Worker     uint8_t* dst = reinterpret_cast<uint8_t*>(halModel) + halModel->data_offset;
385*4d7e907cSAndroid Build Coastguard Worker     const uint8_t* src = reinterpret_cast<const uint8_t*>(&soundModel->data[0]);
386*4d7e907cSAndroid Build Coastguard Worker     memcpy(dst, src, soundModel->data.size());
387*4d7e907cSAndroid Build Coastguard Worker 
388*4d7e907cSAndroid Build Coastguard Worker     return halModel;
389*4d7e907cSAndroid Build Coastguard Worker }
390*4d7e907cSAndroid Build Coastguard Worker 
convertPhraseRecognitionExtraToHal(struct sound_trigger_phrase_recognition_extra * halExtra,const PhraseRecognitionExtra * extra)391*4d7e907cSAndroid Build Coastguard Worker void SoundTriggerHalImpl::convertPhraseRecognitionExtraToHal(
392*4d7e907cSAndroid Build Coastguard Worker     struct sound_trigger_phrase_recognition_extra* halExtra, const PhraseRecognitionExtra* extra) {
393*4d7e907cSAndroid Build Coastguard Worker     halExtra->id = extra->id;
394*4d7e907cSAndroid Build Coastguard Worker     halExtra->recognition_modes = extra->recognitionModes;
395*4d7e907cSAndroid Build Coastguard Worker     halExtra->confidence_level = extra->confidenceLevel;
396*4d7e907cSAndroid Build Coastguard Worker 
397*4d7e907cSAndroid Build Coastguard Worker     unsigned int i;
398*4d7e907cSAndroid Build Coastguard Worker     for (i = 0; i < extra->levels.size() && i < SOUND_TRIGGER_MAX_USERS; i++) {
399*4d7e907cSAndroid Build Coastguard Worker         halExtra->levels[i].user_id = extra->levels[i].userId;
400*4d7e907cSAndroid Build Coastguard Worker         halExtra->levels[i].level = extra->levels[i].levelPercent;
401*4d7e907cSAndroid Build Coastguard Worker     }
402*4d7e907cSAndroid Build Coastguard Worker     halExtra->num_levels = i;
403*4d7e907cSAndroid Build Coastguard Worker }
404*4d7e907cSAndroid Build Coastguard Worker 
convertRecognitionConfigToHal(const ISoundTriggerHw::RecognitionConfig * config)405*4d7e907cSAndroid Build Coastguard Worker struct sound_trigger_recognition_config* SoundTriggerHalImpl::convertRecognitionConfigToHal(
406*4d7e907cSAndroid Build Coastguard Worker     const ISoundTriggerHw::RecognitionConfig* config) {
407*4d7e907cSAndroid Build Coastguard Worker     size_t allocSize = sizeof(struct sound_trigger_recognition_config) + config->data.size();
408*4d7e907cSAndroid Build Coastguard Worker     struct sound_trigger_recognition_config* halConfig =
409*4d7e907cSAndroid Build Coastguard Worker         static_cast<struct sound_trigger_recognition_config*>(malloc(allocSize));
410*4d7e907cSAndroid Build Coastguard Worker 
411*4d7e907cSAndroid Build Coastguard Worker     LOG_ALWAYS_FATAL_IF(halConfig == NULL,
412*4d7e907cSAndroid Build Coastguard Worker                         "malloc failed for size %zu in convertRecognitionConfigToHal", allocSize);
413*4d7e907cSAndroid Build Coastguard Worker 
414*4d7e907cSAndroid Build Coastguard Worker     halConfig->capture_handle = (audio_io_handle_t)config->captureHandle;
415*4d7e907cSAndroid Build Coastguard Worker     halConfig->capture_device = (audio_devices_t)config->captureDevice;
416*4d7e907cSAndroid Build Coastguard Worker     halConfig->capture_requested = config->captureRequested;
417*4d7e907cSAndroid Build Coastguard Worker 
418*4d7e907cSAndroid Build Coastguard Worker     unsigned int i;
419*4d7e907cSAndroid Build Coastguard Worker     for (i = 0; i < config->phrases.size() && i < SOUND_TRIGGER_MAX_PHRASES; i++) {
420*4d7e907cSAndroid Build Coastguard Worker         convertPhraseRecognitionExtraToHal(&halConfig->phrases[i], &config->phrases[i]);
421*4d7e907cSAndroid Build Coastguard Worker     }
422*4d7e907cSAndroid Build Coastguard Worker     halConfig->num_phrases = i;
423*4d7e907cSAndroid Build Coastguard Worker 
424*4d7e907cSAndroid Build Coastguard Worker     halConfig->data_offset = sizeof(struct sound_trigger_recognition_config);
425*4d7e907cSAndroid Build Coastguard Worker     halConfig->data_size = config->data.size();
426*4d7e907cSAndroid Build Coastguard Worker     uint8_t* dst = reinterpret_cast<uint8_t*>(halConfig) + halConfig->data_offset;
427*4d7e907cSAndroid Build Coastguard Worker     const uint8_t* src = reinterpret_cast<const uint8_t*>(&config->data[0]);
428*4d7e907cSAndroid Build Coastguard Worker     memcpy(dst, src, config->data.size());
429*4d7e907cSAndroid Build Coastguard Worker     return halConfig;
430*4d7e907cSAndroid Build Coastguard Worker }
431*4d7e907cSAndroid Build Coastguard Worker 
432*4d7e907cSAndroid Build Coastguard Worker // static
convertSoundModelEventFromHal(ISoundTriggerHwCallback::ModelEvent * event,const struct sound_trigger_model_event * halEvent)433*4d7e907cSAndroid Build Coastguard Worker void SoundTriggerHalImpl::convertSoundModelEventFromHal(
434*4d7e907cSAndroid Build Coastguard Worker     ISoundTriggerHwCallback::ModelEvent* event, const struct sound_trigger_model_event* halEvent) {
435*4d7e907cSAndroid Build Coastguard Worker     event->status = (ISoundTriggerHwCallback::SoundModelStatus)halEvent->status;
436*4d7e907cSAndroid Build Coastguard Worker     // event->model to be remapped by called
437*4d7e907cSAndroid Build Coastguard Worker     event->data.setToExternal(
438*4d7e907cSAndroid Build Coastguard Worker         const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(halEvent)) + halEvent->data_offset,
439*4d7e907cSAndroid Build Coastguard Worker         halEvent->data_size);
440*4d7e907cSAndroid Build Coastguard Worker }
441*4d7e907cSAndroid Build Coastguard Worker 
442*4d7e907cSAndroid Build Coastguard Worker // static
convertPhaseRecognitionEventFromHal(ISoundTriggerHwCallback::PhraseRecognitionEvent * event,const struct sound_trigger_phrase_recognition_event * halEvent)443*4d7e907cSAndroid Build Coastguard Worker void SoundTriggerHalImpl::convertPhaseRecognitionEventFromHal(
444*4d7e907cSAndroid Build Coastguard Worker     ISoundTriggerHwCallback::PhraseRecognitionEvent* event,
445*4d7e907cSAndroid Build Coastguard Worker     const struct sound_trigger_phrase_recognition_event* halEvent) {
446*4d7e907cSAndroid Build Coastguard Worker     event->phraseExtras.resize(halEvent->num_phrases);
447*4d7e907cSAndroid Build Coastguard Worker     for (unsigned int i = 0; i < halEvent->num_phrases; i++) {
448*4d7e907cSAndroid Build Coastguard Worker         convertPhraseRecognitionExtraFromHal(&event->phraseExtras[i], &halEvent->phrase_extras[i]);
449*4d7e907cSAndroid Build Coastguard Worker     }
450*4d7e907cSAndroid Build Coastguard Worker     convertRecognitionEventFromHal(&event->common, &halEvent->common);
451*4d7e907cSAndroid Build Coastguard Worker }
452*4d7e907cSAndroid Build Coastguard Worker 
453*4d7e907cSAndroid Build Coastguard Worker // static
convertRecognitionEventFromHal(ISoundTriggerHwCallback::RecognitionEvent * event,const struct sound_trigger_recognition_event * halEvent)454*4d7e907cSAndroid Build Coastguard Worker void SoundTriggerHalImpl::convertRecognitionEventFromHal(
455*4d7e907cSAndroid Build Coastguard Worker     ISoundTriggerHwCallback::RecognitionEvent* event,
456*4d7e907cSAndroid Build Coastguard Worker     const struct sound_trigger_recognition_event* halEvent) {
457*4d7e907cSAndroid Build Coastguard Worker     event->status = static_cast<ISoundTriggerHwCallback::RecognitionStatus>(halEvent->status);
458*4d7e907cSAndroid Build Coastguard Worker     event->type = static_cast<SoundModelType>(halEvent->type);
459*4d7e907cSAndroid Build Coastguard Worker     // event->model to be remapped by called
460*4d7e907cSAndroid Build Coastguard Worker     event->captureAvailable = halEvent->capture_available;
461*4d7e907cSAndroid Build Coastguard Worker     event->captureSession = halEvent->capture_session;
462*4d7e907cSAndroid Build Coastguard Worker     event->captureDelayMs = halEvent->capture_delay_ms;
463*4d7e907cSAndroid Build Coastguard Worker     event->capturePreambleMs = halEvent->capture_preamble_ms;
464*4d7e907cSAndroid Build Coastguard Worker     event->triggerInData = halEvent->trigger_in_data;
465*4d7e907cSAndroid Build Coastguard Worker     event->audioConfig.sampleRateHz = halEvent->audio_config.sample_rate;
466*4d7e907cSAndroid Build Coastguard Worker     event->audioConfig.channelMask =
467*4d7e907cSAndroid Build Coastguard Worker         (audio::common::V2_0::AudioChannelMask)halEvent->audio_config.channel_mask;
468*4d7e907cSAndroid Build Coastguard Worker     event->audioConfig.format = (audio::common::V2_0::AudioFormat)halEvent->audio_config.format;
469*4d7e907cSAndroid Build Coastguard Worker     event->data.setToExternal(
470*4d7e907cSAndroid Build Coastguard Worker         const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(halEvent)) + halEvent->data_offset,
471*4d7e907cSAndroid Build Coastguard Worker         halEvent->data_size);
472*4d7e907cSAndroid Build Coastguard Worker }
473*4d7e907cSAndroid Build Coastguard Worker 
474*4d7e907cSAndroid Build Coastguard Worker // static
convertPhraseRecognitionExtraFromHal(PhraseRecognitionExtra * extra,const struct sound_trigger_phrase_recognition_extra * halExtra)475*4d7e907cSAndroid Build Coastguard Worker void SoundTriggerHalImpl::convertPhraseRecognitionExtraFromHal(
476*4d7e907cSAndroid Build Coastguard Worker     PhraseRecognitionExtra* extra, const struct sound_trigger_phrase_recognition_extra* halExtra) {
477*4d7e907cSAndroid Build Coastguard Worker     extra->id = halExtra->id;
478*4d7e907cSAndroid Build Coastguard Worker     extra->recognitionModes = halExtra->recognition_modes;
479*4d7e907cSAndroid Build Coastguard Worker     extra->confidenceLevel = halExtra->confidence_level;
480*4d7e907cSAndroid Build Coastguard Worker 
481*4d7e907cSAndroid Build Coastguard Worker     extra->levels.resize(halExtra->num_levels);
482*4d7e907cSAndroid Build Coastguard Worker     for (unsigned int i = 0; i < halExtra->num_levels; i++) {
483*4d7e907cSAndroid Build Coastguard Worker         extra->levels[i].userId = halExtra->levels[i].user_id;
484*4d7e907cSAndroid Build Coastguard Worker         extra->levels[i].levelPercent = halExtra->levels[i].level;
485*4d7e907cSAndroid Build Coastguard Worker     }
486*4d7e907cSAndroid Build Coastguard Worker }
487*4d7e907cSAndroid Build Coastguard Worker 
recognitionCallback(struct sound_trigger_recognition_event * halEvent)488*4d7e907cSAndroid Build Coastguard Worker void SoundTriggerHalImpl::SoundModelClient_2_0::recognitionCallback(
489*4d7e907cSAndroid Build Coastguard Worker     struct sound_trigger_recognition_event* halEvent) {
490*4d7e907cSAndroid Build Coastguard Worker     if (halEvent->type == SOUND_MODEL_TYPE_KEYPHRASE) {
491*4d7e907cSAndroid Build Coastguard Worker         ISoundTriggerHwCallback::PhraseRecognitionEvent event;
492*4d7e907cSAndroid Build Coastguard Worker         convertPhaseRecognitionEventFromHal(
493*4d7e907cSAndroid Build Coastguard Worker             &event, reinterpret_cast<sound_trigger_phrase_recognition_event*>(halEvent));
494*4d7e907cSAndroid Build Coastguard Worker         event.common.model = mId;
495*4d7e907cSAndroid Build Coastguard Worker         mCallback->phraseRecognitionCallback(event, mCookie);
496*4d7e907cSAndroid Build Coastguard Worker     } else {
497*4d7e907cSAndroid Build Coastguard Worker         ISoundTriggerHwCallback::RecognitionEvent event;
498*4d7e907cSAndroid Build Coastguard Worker         convertRecognitionEventFromHal(&event, halEvent);
499*4d7e907cSAndroid Build Coastguard Worker         event.model = mId;
500*4d7e907cSAndroid Build Coastguard Worker         mCallback->recognitionCallback(event, mCookie);
501*4d7e907cSAndroid Build Coastguard Worker     }
502*4d7e907cSAndroid Build Coastguard Worker }
503*4d7e907cSAndroid Build Coastguard Worker 
soundModelCallback(struct sound_trigger_model_event * halEvent)504*4d7e907cSAndroid Build Coastguard Worker void SoundTriggerHalImpl::SoundModelClient_2_0::soundModelCallback(
505*4d7e907cSAndroid Build Coastguard Worker     struct sound_trigger_model_event* halEvent) {
506*4d7e907cSAndroid Build Coastguard Worker     ISoundTriggerHwCallback::ModelEvent event;
507*4d7e907cSAndroid Build Coastguard Worker     convertSoundModelEventFromHal(&event, halEvent);
508*4d7e907cSAndroid Build Coastguard Worker     event.model = mId;
509*4d7e907cSAndroid Build Coastguard Worker     mCallback->soundModelCallback(event, mCookie);
510*4d7e907cSAndroid Build Coastguard Worker }
511*4d7e907cSAndroid Build Coastguard Worker 
512*4d7e907cSAndroid Build Coastguard Worker }  // namespace implementation
513*4d7e907cSAndroid Build Coastguard Worker }  // namespace V2_0
514*4d7e907cSAndroid Build Coastguard Worker }  // namespace soundtrigger
515*4d7e907cSAndroid Build Coastguard Worker }  // namespace hardware
516*4d7e907cSAndroid Build Coastguard Worker }  // namespace android
517