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