SoundTriggerHalHidl.cpp revision 4b38e7ad3565de208c8a8d7a401c1e7b07b0108b
17a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent/* 27a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent * Copyright (C) 2016 The Android Open Source Project 37a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent * 47a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent * Licensed under the Apache License, Version 2.0 (the "License"); 57a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent * you may not use this file except in compliance with the License. 67a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent * You may obtain a copy of the License at 77a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent * 87a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent * http://www.apache.org/licenses/LICENSE-2.0 97a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent * 107a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent * Unless required by applicable law or agreed to in writing, software 117a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent * distributed under the License is distributed on an "AS IS" BASIS, 127a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent * See the License for the specific language governing permissions and 147a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent * limitations under the License. 157a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent */ 167a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 177a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent#define LOG_TAG "SoundTriggerHalHidl" 187a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent//#define LOG_NDEBUG 0 197a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 207a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent#include <utils/Log.h> 217a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent#include "SoundTriggerHalHidl.h" 227a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent#include <hwbinder/IPCThreadState.h> 237a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent#include <hwbinder/ProcessState.h> 247a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 257a544b44b7872b300f50e16fef480f76e9145fbbEric Laurentnamespace android { 267a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 277a544b44b7872b300f50e16fef480f76e9145fbbEric Laurentusing android::hardware::Return; 287a544b44b7872b300f50e16fef480f76e9145fbbEric Laurentusing android::hardware::ProcessState; 297a544b44b7872b300f50e16fef480f76e9145fbbEric Laurentusing android::hardware::audio::common::V2_0::AudioDevice; 307a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 317a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent/* static */ 327a544b44b7872b300f50e16fef480f76e9145fbbEric Laurentsp<SoundTriggerHalInterface> SoundTriggerHalInterface::connectModule(const char *moduleName) 337a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 347a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return new SoundTriggerHalHidl(moduleName); 357a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 367a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 377a544b44b7872b300f50e16fef480f76e9145fbbEric Laurentint SoundTriggerHalHidl::getProperties(struct sound_trigger_properties *properties) 387a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 397a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent sp<ISoundTriggerHw> soundtrigger = getService(); 407a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (soundtrigger == 0) { 417a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return -ENODEV; 427a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 437a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 447a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent ISoundTriggerHw::Properties halProperties; 457a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent Return<void> hidlReturn; 464b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent int ret; 477a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent { 487a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent AutoMutex lock(mHalLock); 497a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent hidlReturn = soundtrigger->getProperties([&](int rc, auto res) { 504b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent ret = rc; 517a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halProperties = res; 527a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent ALOGI("getProperties res implementor %s", res.implementor.c_str()); 537a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent }); 547a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 557a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 567a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (hidlReturn.getStatus().isOk()) { 574b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent if (ret == 0) { 584b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent convertPropertiesFromHal(properties, &halProperties); 594b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent } 607a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } else { 617a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent ret = (int)hidlReturn.getStatus().transactionError(); 627a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (ret == -EPIPE) { 637a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent clearService(); 647a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 657a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 664b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent ALOGI("getProperties ret %d", ret); 677a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return ret; 687a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 697a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 707a544b44b7872b300f50e16fef480f76e9145fbbEric Laurentint SoundTriggerHalHidl::loadSoundModel(struct sound_trigger_sound_model *sound_model, 717a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent sound_model_callback_t callback, 727a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent void *cookie, 737a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent sound_model_handle_t *handle) 747a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 757a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (handle == NULL) { 767a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return -EINVAL; 777a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 787a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 797a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent sp<ISoundTriggerHw> soundtrigger = getService(); 807a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (soundtrigger == 0) { 817a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return -ENODEV; 827a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 837a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 847a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent uint32_t modelId; 857a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent { 867a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent AutoMutex lock(mLock); 877a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent do { 887a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent modelId = nextUniqueId(); 897a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent ALOGI("loadSoundModel modelId %u", modelId); 907a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent sp<SoundModel> model = mSoundModels.valueFor(modelId); 917a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent ALOGI("loadSoundModel model %p", model.get()); 927a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } while (mSoundModels.valueFor(modelId) != 0 && modelId != 0); 937a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 947a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent LOG_ALWAYS_FATAL_IF(modelId == 0, 957a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent "loadSoundModel(): wrap around in sound model IDs, num loaded models %zd", 967a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent mSoundModels.size()); 977a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 987a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent ISoundTriggerHw::SoundModel *halSoundModel = 997a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent convertSoundModelToHal(sound_model); 1007a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (halSoundModel == NULL) { 1017a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return -EINVAL; 1027a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 1037a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 1047a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent Return<void> hidlReturn; 1054b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent int ret; 1067a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent SoundModelHandle halHandle; 1077a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent { 1087a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent AutoMutex lock(mHalLock); 1097a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (sound_model->type == SOUND_MODEL_TYPE_KEYPHRASE) { 1107a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent hidlReturn = soundtrigger->loadPhraseSoundModel( 1117a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent *(const ISoundTriggerHw::PhraseSoundModel *)halSoundModel, 1127a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent this, modelId, [&](int32_t retval, auto res) { 1134b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent ret = retval; 1147a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halHandle = res; 1157a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent }); 1167a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 1177a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } else { 1187a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent hidlReturn = soundtrigger->loadSoundModel(*halSoundModel, 1197a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent this, modelId, [&](int32_t retval, auto res) { 1204b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent ret = retval; 1217a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halHandle = res; 1227a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent }); 1237a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 1247a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 1257a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 1267a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent delete halSoundModel; 1277a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 1287a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (hidlReturn.getStatus().isOk()) { 1294b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent if (ret == 0) { 1304b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent AutoMutex lock(mLock); 1314b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent *handle = (sound_model_handle_t)modelId; 1324b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent sp<SoundModel> model = new SoundModel(*handle, callback, cookie, halHandle); 1334b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent mSoundModels.add(*handle, model); 1344b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent } 1357a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } else { 1367a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent ret = (int)hidlReturn.getStatus().transactionError(); 1377a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent ALOGE("loadSoundModel error %d", ret); 1387a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (ret == -EPIPE) { 1397a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent clearService(); 1407a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 1417a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 1427a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 1437a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 1447a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return ret; 1457a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 1467a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 1477a544b44b7872b300f50e16fef480f76e9145fbbEric Laurentint SoundTriggerHalHidl::unloadSoundModel(sound_model_handle_t handle) 1487a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 1497a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent sp<ISoundTriggerHw> soundtrigger = getService(); 1507a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (soundtrigger == 0) { 1517a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return -ENODEV; 1527a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 1537a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 1547a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent sp<SoundModel> model = removeModel(handle); 1557a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (model == 0) { 1567a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent ALOGE("unloadSoundModel model not found for handle %u", handle); 1577a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return -EINVAL; 1587a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 1597a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 1604b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent Return<int32_t> hidlReturn(0); 1617a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent { 1627a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent AutoMutex lock(mHalLock); 1634b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent hidlReturn = soundtrigger->unloadSoundModel(model->mHalHandle); 1647a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 1654b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent int ret = (int)hidlReturn.getStatus().transactionError(); 1667a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent ALOGE_IF(ret != 0, "unloadSoundModel error %d", ret); 1677a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (ret == -EPIPE) { 1687a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent clearService(); 1697a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 1704b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent if (ret == 0) { 1714b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent ret = hidlReturn; 1724b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent } 1737a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return ret; 1747a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 1757a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 1767a544b44b7872b300f50e16fef480f76e9145fbbEric Laurentint SoundTriggerHalHidl::startRecognition(sound_model_handle_t handle, 1777a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent const struct sound_trigger_recognition_config *config, 1787a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent recognition_callback_t callback, 1797a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent void *cookie) 1807a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 1817a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent sp<ISoundTriggerHw> soundtrigger = getService(); 1827a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (soundtrigger == 0) { 1837a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return -ENODEV; 1847a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 1857a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 1867a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent sp<SoundModel> model = getModel(handle); 1877a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (model == 0) { 1887a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent ALOGE("startRecognition model not found for handle %u", handle); 1897a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return -EINVAL; 1907a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 1917a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 1927a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent model->mRecognitionCallback = callback; 1937a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent model->mRecognitionCookie = cookie; 1947a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 1957a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent ISoundTriggerHw::RecognitionConfig *halConfig = 1967a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent convertRecognitionConfigToHal(config); 1977a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 1984b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent Return<int32_t> hidlReturn(0); 1997a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent { 2007a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent AutoMutex lock(mHalLock); 2014b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent hidlReturn = soundtrigger->startRecognition(model->mHalHandle, *halConfig, this, handle); 2027a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 2037a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 2047a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent delete halConfig; 2057a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 2064b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent int ret = (int)hidlReturn.getStatus().transactionError(); 2077a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent ALOGE_IF(ret != 0, "startRecognition error %d", ret); 2087a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (ret == -EPIPE) { 2097a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent clearService(); 2107a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 2114b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent if (ret == 0) { 2124b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent ret = hidlReturn; 2134b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent } 2147a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return ret; 2157a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 2167a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 2177a544b44b7872b300f50e16fef480f76e9145fbbEric Laurentint SoundTriggerHalHidl::stopRecognition(sound_model_handle_t handle) 2187a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 2197a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent sp<ISoundTriggerHw> soundtrigger = getService(); 2207a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (soundtrigger == 0) { 2217a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return -ENODEV; 2227a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 2237a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 2247a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent sp<SoundModel> model = getModel(handle); 2257a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (model == 0) { 2267a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent ALOGE("stopRecognition model not found for handle %u", handle); 2277a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return -EINVAL; 2287a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 2297a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 2304b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent Return<int32_t> hidlReturn(0); 2317a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent { 2327a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent AutoMutex lock(mHalLock); 2334b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent hidlReturn = soundtrigger->stopRecognition(model->mHalHandle); 2347a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 2357a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 2364b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent int ret = (int)hidlReturn.getStatus().transactionError(); 2377a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent ALOGE_IF(ret != 0, "stopRecognition error %d", ret); 2387a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (ret == -EPIPE) { 2397a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent clearService(); 2407a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 2414b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent if (ret == 0) { 2424b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent ret = hidlReturn; 2434b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent } 2447a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return ret; 2457a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 2467a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 2477a544b44b7872b300f50e16fef480f76e9145fbbEric Laurentint SoundTriggerHalHidl::stopAllRecognitions() 2487a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 2497a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent sp<ISoundTriggerHw> soundtrigger = getService(); 2507a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (soundtrigger == 0) { 2517a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return -ENODEV; 2527a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 2537a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 2544b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent Return<int32_t> hidlReturn(0); 2557a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent { 2567a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent AutoMutex lock(mHalLock); 2574b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent hidlReturn = soundtrigger->stopAllRecognitions(); 2587a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 2597a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 2604b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent int ret = (int)hidlReturn.getStatus().transactionError(); 2617a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent ALOGE_IF(ret != 0, "stopAllRecognitions error %d", ret); 2627a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (ret == -EPIPE) { 2637a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent clearService(); 2647a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 2654b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent if (ret == 0) { 2664b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent ret = hidlReturn; 2674b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent } 2687a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return ret; 2697a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 2707a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 2717a544b44b7872b300f50e16fef480f76e9145fbbEric LaurentSoundTriggerHalHidl::SoundTriggerHalHidl(const char *moduleName) 2727a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent : mModuleName(moduleName), mNextUniqueId(1) 2737a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 2747a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 2757a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 2767a544b44b7872b300f50e16fef480f76e9145fbbEric LaurentSoundTriggerHalHidl::~SoundTriggerHalHidl() 2777a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 2787a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 2797a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 2807a544b44b7872b300f50e16fef480f76e9145fbbEric Laurentsp<ISoundTriggerHw> SoundTriggerHalHidl::getService() 2817a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 2827a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent AutoMutex lock(mLock); 2837a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (mISoundTrigger == 0) { 2847a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (mModuleName == NULL) { 2857a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent mModuleName = "primary"; 2867a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 2877a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent std::string serviceName = "sound_trigger."; 2887a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent serviceName.append(mModuleName); 2897a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent mISoundTrigger = ISoundTriggerHw::getService(serviceName); 2907a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 2917a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return mISoundTrigger; 2927a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 2937a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 2947a544b44b7872b300f50e16fef480f76e9145fbbEric Laurentvoid SoundTriggerHalHidl::clearService() 2957a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 2967a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent AutoMutex lock(mLock); 2977a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent mISoundTrigger = 0; 2987a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 2997a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 3007a544b44b7872b300f50e16fef480f76e9145fbbEric Laurentsp<SoundTriggerHalHidl::SoundModel> SoundTriggerHalHidl::getModel(sound_model_handle_t handle) 3017a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 3027a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent AutoMutex lock(mLock); 3037a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return mSoundModels.valueFor(handle); 3047a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 3057a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 3067a544b44b7872b300f50e16fef480f76e9145fbbEric Laurentsp<SoundTriggerHalHidl::SoundModel> SoundTriggerHalHidl::removeModel(sound_model_handle_t handle) 3077a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 3087a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent AutoMutex lock(mLock); 3097a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent sp<SoundModel> model = mSoundModels.valueFor(handle); 3107a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent mSoundModels.removeItem(handle); 3117a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return model; 3127a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 3137a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 3147a544b44b7872b300f50e16fef480f76e9145fbbEric Laurentuint32_t SoundTriggerHalHidl::nextUniqueId() 3157a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 3167a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return (uint32_t) atomic_fetch_add_explicit(&mNextUniqueId, 3177a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent (uint_fast32_t) 1, memory_order_acq_rel); 3187a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 3197a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 3207a544b44b7872b300f50e16fef480f76e9145fbbEric Laurentvoid SoundTriggerHalHidl::convertUuidToHal(Uuid *halUuid, 321f7854d45bd12d5239c588767bf85953aca46b4efEric Laurent const sound_trigger_uuid_t *uuid) 3227a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 3237a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halUuid->timeLow = uuid->timeLow; 3247a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halUuid->timeMid = uuid->timeMid; 3257a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halUuid->versionAndTimeHigh = uuid->timeHiAndVersion; 3267a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halUuid->variantAndClockSeqHigh = uuid->clockSeq; 3277a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent memcpy(halUuid->node.data(), &uuid->node[0], sizeof(uuid->node)); 3287a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 3297a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 330f7854d45bd12d5239c588767bf85953aca46b4efEric Laurentvoid SoundTriggerHalHidl::convertUuidFromHal(sound_trigger_uuid_t *uuid, 3317a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent const Uuid *halUuid) 3327a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 3337a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent uuid->timeLow = halUuid->timeLow; 3347a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent uuid->timeMid = halUuid->timeMid; 3357a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent uuid->timeHiAndVersion = halUuid->versionAndTimeHigh; 3367a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent uuid->clockSeq = halUuid->variantAndClockSeqHigh; 3377a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent memcpy(&uuid->node[0], halUuid->node.data(), sizeof(uuid->node)); 3387a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 3397a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 3407a544b44b7872b300f50e16fef480f76e9145fbbEric Laurentvoid SoundTriggerHalHidl::convertPropertiesFromHal( 3417a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent struct sound_trigger_properties *properties, 3427a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent const ISoundTriggerHw::Properties *halProperties) 3437a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 3447a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent strlcpy(properties->implementor, 3457a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halProperties->implementor.c_str(), SOUND_TRIGGER_MAX_STRING_LEN); 3467a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent strlcpy(properties->description, 3477a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halProperties->description.c_str(), SOUND_TRIGGER_MAX_STRING_LEN); 3487a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent properties->version = halProperties->version; 3497a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent convertUuidFromHal(&properties->uuid, &halProperties->uuid); 3507a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent properties->max_sound_models = halProperties->maxSoundModels; 3517a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent properties->max_key_phrases = halProperties->maxKeyPhrases; 3527a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent properties->max_users = halProperties->maxUsers; 3537a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent properties->recognition_modes = halProperties->recognitionModes; 3547a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent properties->capture_transition = (bool)halProperties->captureTransition; 3557a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent properties->max_buffer_ms = halProperties->maxBufferMs; 3567a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent properties->concurrent_capture = (bool)halProperties->concurrentCapture; 3577a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent properties->trigger_in_event = (bool)halProperties->triggerInEvent; 3587a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent properties->power_consumption_mw = halProperties->powerConsumptionMw; 3597a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 3607a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 3617a544b44b7872b300f50e16fef480f76e9145fbbEric Laurentvoid SoundTriggerHalHidl::convertTriggerPhraseToHal( 3627a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent ISoundTriggerHw::Phrase *halTriggerPhrase, 3637a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent const struct sound_trigger_phrase *triggerPhrase) 3647a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 3657a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halTriggerPhrase->id = triggerPhrase->id; 3667a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halTriggerPhrase->recognitionModes = triggerPhrase->recognition_mode; 3677a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halTriggerPhrase->users.setToExternal((uint32_t *)&triggerPhrase->users[0], triggerPhrase->num_users); 3687a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halTriggerPhrase->locale = triggerPhrase->locale; 3697a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halTriggerPhrase->text = triggerPhrase->text; 3707a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 3717a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 3727a544b44b7872b300f50e16fef480f76e9145fbbEric LaurentISoundTriggerHw::SoundModel *SoundTriggerHalHidl::convertSoundModelToHal( 3737a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent const struct sound_trigger_sound_model *soundModel) 3747a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 3757a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent ISoundTriggerHw::SoundModel *halModel = NULL; 3767a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (soundModel->type == SOUND_MODEL_TYPE_KEYPHRASE) { 3777a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent ISoundTriggerHw::PhraseSoundModel *halKeyPhraseModel = 3787a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent new ISoundTriggerHw::PhraseSoundModel(); 3797a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent struct sound_trigger_phrase_sound_model *keyPhraseModel = 3807a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent (struct sound_trigger_phrase_sound_model *)soundModel; 3817a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent ISoundTriggerHw::Phrase *halPhrases = 3827a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent new ISoundTriggerHw::Phrase[keyPhraseModel->num_phrases]; 3837a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 3847a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 3857a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent for (unsigned int i = 0; i < keyPhraseModel->num_phrases; i++) { 3867a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent convertTriggerPhraseToHal(&halPhrases[i], 3877a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent &keyPhraseModel->phrases[i]); 3887a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 3897a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halKeyPhraseModel->phrases.setToExternal(halPhrases, keyPhraseModel->num_phrases); 3907a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent // FIXME: transfer buffer ownership. should have a method for that in hidl_vec 3917a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halKeyPhraseModel->phrases.resize(keyPhraseModel->num_phrases); 3927a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 3937a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent delete[] halPhrases; 3947a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 3957a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halModel = (ISoundTriggerHw::SoundModel *)halKeyPhraseModel; 3967a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } else { 3977a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halModel = new ISoundTriggerHw::SoundModel(); 3987a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 3997a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halModel->type = (SoundModelType)soundModel->type; 4007a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent convertUuidToHal(&halModel->uuid, &soundModel->uuid); 4017a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent convertUuidToHal(&halModel->vendorUuid, &soundModel->vendor_uuid); 4027a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halModel->data.setToExternal((uint8_t *)soundModel + soundModel->data_offset, soundModel->data_size); 4037a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halModel->data.resize(soundModel->data_size); 4047a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 4057a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return halModel; 4067a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 4077a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 4087a544b44b7872b300f50e16fef480f76e9145fbbEric Laurentvoid SoundTriggerHalHidl::convertPhraseRecognitionExtraToHal( 4097a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent PhraseRecognitionExtra *halExtra, 4107a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent const struct sound_trigger_phrase_recognition_extra *extra) 4117a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 4127a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halExtra->id = extra->id; 4137a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halExtra->recognitionModes = extra->recognition_modes; 4147a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halExtra->confidenceLevel = extra->confidence_level; 4157a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent ConfidenceLevel *halLevels = 4167a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent new ConfidenceLevel[extra->num_levels]; 4177a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent for (unsigned int i = 0; i < extra->num_levels; i++) { 4187a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halLevels[i].userId = extra->levels[i].user_id; 4197a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halLevels[i].levelPercent = extra->levels[i].level; 4207a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 4217a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halExtra->levels.setToExternal(halLevels, extra->num_levels); 4227a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent // FIXME: transfer buffer ownership. should have a method for that in hidl_vec 4237a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halExtra->levels.resize(extra->num_levels); 4247a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 4257a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent delete[] halLevels; 4267a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 4277a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 4287a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 4297a544b44b7872b300f50e16fef480f76e9145fbbEric LaurentISoundTriggerHw::RecognitionConfig *SoundTriggerHalHidl::convertRecognitionConfigToHal( 4307a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent const struct sound_trigger_recognition_config *config) 4317a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 4327a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent ISoundTriggerHw::RecognitionConfig *halConfig = 4337a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent new ISoundTriggerHw::RecognitionConfig(); 4347a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 4357a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halConfig->captureHandle = config->capture_handle; 4367a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halConfig->captureDevice = (AudioDevice)config->capture_device; 4377a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halConfig->captureRequested = (uint32_t)config->capture_requested; 4387a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 4397a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent PhraseRecognitionExtra *halExtras = 4407a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent new PhraseRecognitionExtra[config->num_phrases]; 4417a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 4427a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent for (unsigned int i = 0; i < config->num_phrases; i++) { 4437a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent convertPhraseRecognitionExtraToHal(&halExtras[i], 4447a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent &config->phrases[i]); 4457a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 4467a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halConfig->phrases.setToExternal(halExtras, config->num_phrases); 4477a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent // FIXME: transfer buffer ownership. should have a method for that in hidl_vec 4487a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halConfig->phrases.resize(config->num_phrases); 4497a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 4507a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent delete[] halExtras; 4517a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 4527a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halConfig->data.setToExternal((uint8_t *)config + config->data_offset, config->data_size); 4537a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 4547a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return halConfig; 4557a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 4567a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 4577a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 4587a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent// ISoundTriggerHwCallback 4597a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent::android::hardware::Return<void> SoundTriggerHalHidl::recognitionCallback( 4607a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent const ISoundTriggerHwCallback::RecognitionEvent& halEvent, 4617a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent CallbackCookie cookie) 4627a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 4637a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent sp<SoundModel> model; 4647a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent { 4657a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent AutoMutex lock(mLock); 4667a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent model = mSoundModels.valueFor((SoundModelHandle)cookie); 4677a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (model == 0) { 4687a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return Return<void>(); 4697a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 4707a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 4717a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent struct sound_trigger_recognition_event *event = convertRecognitionEventFromHal(&halEvent); 4727a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (event == NULL) { 4737a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return Return<void>(); 4747a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 4757a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent event->model = model->mHandle; 4767a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent model->mRecognitionCallback(event, model->mRecognitionCookie); 4777a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 4787a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent free(event); 4797a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 4807a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return Return<void>(); 4817a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 4827a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 4837a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent::android::hardware::Return<void> SoundTriggerHalHidl::phraseRecognitionCallback( 4847a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent const ISoundTriggerHwCallback::PhraseRecognitionEvent& halEvent, 4857a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent CallbackCookie cookie) 4867a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 4877a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent sp<SoundModel> model; 4887a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent { 4897a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent AutoMutex lock(mLock); 4907a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent model = mSoundModels.valueFor((SoundModelHandle)cookie); 4917a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (model == 0) { 4927a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return Return<void>(); 4937a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 4947a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 4957a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 4967a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent struct sound_trigger_recognition_event *event = convertRecognitionEventFromHal( 4977a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent (const ISoundTriggerHwCallback::RecognitionEvent *)&halEvent); 4987a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (event == NULL) { 4997a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return Return<void>(); 5007a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 5017a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 5027a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent event->model = model->mHandle; 5037a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent model->mRecognitionCallback(event, model->mRecognitionCookie); 5047a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 5057a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent free(event); 5067a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 5077a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return Return<void>(); 5087a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 5097a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 5107a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent::android::hardware::Return<void> SoundTriggerHalHidl::soundModelCallback( 5117a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent const ISoundTriggerHwCallback::ModelEvent& halEvent, 5127a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent CallbackCookie cookie) 5137a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 5147a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent sp<SoundModel> model; 5157a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent { 5167a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent AutoMutex lock(mLock); 5177a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent model = mSoundModels.valueFor((SoundModelHandle)cookie); 5187a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (model == 0) { 5197a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return Return<void>(); 5207a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 5217a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 5227a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 5237a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent struct sound_trigger_model_event *event = convertSoundModelEventFromHal(&halEvent); 5247a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (event == NULL) { 5257a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return Return<void>(); 5267a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 5277a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 5287a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent event->model = model->mHandle; 5297a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent model->mSoundModelCallback(event, model->mSoundModelCookie); 5307a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 5317a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent free(event); 5327a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 5337a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return Return<void>(); 5347a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 5357a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 5367a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 5377a544b44b7872b300f50e16fef480f76e9145fbbEric Laurentstruct sound_trigger_model_event *SoundTriggerHalHidl::convertSoundModelEventFromHal( 5387a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent const ISoundTriggerHwCallback::ModelEvent *halEvent) 5397a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 5407a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent struct sound_trigger_model_event *event = (struct sound_trigger_model_event *)malloc( 5417a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent sizeof(struct sound_trigger_model_event) + 5427a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halEvent->data.size()); 5437a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (event == NULL) { 5447a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return NULL; 5457a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 5467a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 5477a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent event->status = (int)halEvent->status; 5487a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent // event->model to be set by caller 5497a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent event->data_offset = sizeof(struct sound_trigger_model_event); 5507a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent event->data_size = halEvent->data.size(); 5517a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent uint8_t *dst = (uint8_t *)event + event->data_offset; 5527a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent uint8_t *src = (uint8_t *)&halEvent->data[0]; 5537a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent memcpy(dst, src, halEvent->data.size()); 5547a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 5557a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return event; 5567a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 5577a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 5587a544b44b7872b300f50e16fef480f76e9145fbbEric Laurentvoid SoundTriggerHalHidl::convertPhraseRecognitionExtraFromHal( 5597a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent struct sound_trigger_phrase_recognition_extra *extra, 5607a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent const PhraseRecognitionExtra *halExtra) 5617a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 5627a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent extra->id = halExtra->id; 5637a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent extra->recognition_modes = halExtra->recognitionModes; 5647a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent extra->confidence_level = halExtra->confidenceLevel; 5657a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 5667a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent size_t i; 5677a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent for (i = 0; i < halExtra->levels.size() && i < SOUND_TRIGGER_MAX_USERS; i++) { 5687a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent extra->levels[i].user_id = halExtra->levels[i].userId; 5697a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent extra->levels[i].level = halExtra->levels[i].levelPercent; 5707a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 5717a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent extra->num_levels = (unsigned int)i; 5727a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 5737a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 5747a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 5757a544b44b7872b300f50e16fef480f76e9145fbbEric Laurentstruct sound_trigger_recognition_event *SoundTriggerHalHidl::convertRecognitionEventFromHal( 5767a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent const ISoundTriggerHwCallback::RecognitionEvent *halEvent) 5777a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 5787a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent struct sound_trigger_recognition_event *event; 5797a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 5807a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (halEvent->type == SoundModelType::KEYPHRASE) { 5817a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent struct sound_trigger_phrase_recognition_event *phraseEvent = 5827a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent (struct sound_trigger_phrase_recognition_event *)malloc( 5837a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent sizeof(struct sound_trigger_phrase_recognition_event) + 5847a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halEvent->data.size()); 5857a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (phraseEvent == NULL) { 5867a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return NULL; 5877a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 5887a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent const ISoundTriggerHwCallback::PhraseRecognitionEvent *halPhraseEvent = 5897a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent (const ISoundTriggerHwCallback::PhraseRecognitionEvent *)halEvent; 5907a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 5917a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent for (unsigned int i = 0; i < halPhraseEvent->phraseExtras.size(); i++) { 5927a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent convertPhraseRecognitionExtraFromHal(&phraseEvent->phrase_extras[i], 5937a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent &halPhraseEvent->phraseExtras[i]); 5947a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 5957a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent phraseEvent->num_phrases = halPhraseEvent->phraseExtras.size(); 5967a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent event = (struct sound_trigger_recognition_event *)phraseEvent; 5977a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent event->data_offset = sizeof(sound_trigger_phrase_recognition_event); 5987a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } else { 5997a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent event = (struct sound_trigger_recognition_event *)malloc( 6007a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent sizeof(struct sound_trigger_recognition_event) + halEvent->data.size()); 6017a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (event == NULL) { 6027a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return NULL; 6037a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 6047a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent event->data_offset = sizeof(sound_trigger_recognition_event); 6057a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 6067a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent event->status = (int)halEvent->status; 6077a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent event->type = (sound_trigger_sound_model_type_t)halEvent->type; 6087a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent // event->model to be set by caller 6097a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent event->capture_available = (bool)halEvent->captureAvailable; 6107a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent event->capture_session = halEvent->captureSession; 6117a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent event->capture_delay_ms = halEvent->captureDelayMs; 6127a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent event->capture_preamble_ms = halEvent->capturePreambleMs; 6137a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent event->trigger_in_data = (bool)halEvent->triggerInData; 6147a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent event->audio_config.sample_rate = halEvent->audioConfig.sampleRateHz; 6157a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent event->audio_config.channel_mask = (audio_channel_mask_t)halEvent->audioConfig.channelMask; 6167a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent event->audio_config.format = (audio_format_t)halEvent->audioConfig.format; 6177a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 6187a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent event->data_size = halEvent->data.size(); 6197a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent uint8_t *dst = (uint8_t *)event + event->data_offset; 6207a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent uint8_t *src = (uint8_t *)&halEvent->data[0]; 6217a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent memcpy(dst, src, halEvent->data.size()); 6227a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 6237a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return event; 6247a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 6257a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 6267a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} // namespace android 627