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 20d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov#include <media/audiohal/hidl/HalDeathHandler.h> 217a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent#include <utils/Log.h> 227a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent#include "SoundTriggerHalHidl.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 Laurent/* static */ 337a544b44b7872b300f50e16fef480f76e9145fbbEric Laurentsp<SoundTriggerHalInterface> SoundTriggerHalInterface::connectModule(const char *moduleName) 347a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 357a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return new SoundTriggerHalHidl(moduleName); 367a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 377a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 387a544b44b7872b300f50e16fef480f76e9145fbbEric Laurentint SoundTriggerHalHidl::getProperties(struct sound_trigger_properties *properties) 397a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 407a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent sp<ISoundTriggerHw> soundtrigger = getService(); 417a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (soundtrigger == 0) { 427a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return -ENODEV; 437a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 447a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 457a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent ISoundTriggerHw::Properties halProperties; 467a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent Return<void> hidlReturn; 474b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent int ret; 487a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent { 497a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent AutoMutex lock(mHalLock); 507a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent hidlReturn = soundtrigger->getProperties([&](int rc, auto res) { 514b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent ret = rc; 527a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halProperties = res; 537a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent ALOGI("getProperties res implementor %s", res.implementor.c_str()); 547a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent }); 557a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 567a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 57e83be8af690ef1ac820a63414d522e77ca9d4db6Steven Moreland if (hidlReturn.isOk()) { 584b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent if (ret == 0) { 594b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent convertPropertiesFromHal(properties, &halProperties); 604b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent } 617a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } else { 62e83be8af690ef1ac820a63414d522e77ca9d4db6Steven Moreland ALOGE("getProperties error %s", hidlReturn.description().c_str()); 63d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov return FAILED_TRANSACTION; 647a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 654b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent ALOGI("getProperties ret %d", ret); 667a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return ret; 677a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 687a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 697a544b44b7872b300f50e16fef480f76e9145fbbEric Laurentint SoundTriggerHalHidl::loadSoundModel(struct sound_trigger_sound_model *sound_model, 707a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent sound_model_callback_t callback, 717a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent void *cookie, 727a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent sound_model_handle_t *handle) 737a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 747a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (handle == NULL) { 757a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return -EINVAL; 767a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 777a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 787a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent sp<ISoundTriggerHw> soundtrigger = getService(); 797a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (soundtrigger == 0) { 807a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return -ENODEV; 817a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 827a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 837a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent uint32_t modelId; 847a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent { 857a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent AutoMutex lock(mLock); 867a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent do { 877a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent modelId = nextUniqueId(); 887a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent ALOGI("loadSoundModel modelId %u", modelId); 897a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent sp<SoundModel> model = mSoundModels.valueFor(modelId); 907a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent ALOGI("loadSoundModel model %p", model.get()); 917a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } while (mSoundModels.valueFor(modelId) != 0 && modelId != 0); 927a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 937a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent LOG_ALWAYS_FATAL_IF(modelId == 0, 947a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent "loadSoundModel(): wrap around in sound model IDs, num loaded models %zd", 957a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent mSoundModels.size()); 967a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 977a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent ISoundTriggerHw::SoundModel *halSoundModel = 987a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent convertSoundModelToHal(sound_model); 997a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (halSoundModel == NULL) { 1007a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return -EINVAL; 1017a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 1027a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 1037a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent Return<void> hidlReturn; 1044b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent int ret; 1057a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent SoundModelHandle halHandle; 1067a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent { 1077a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent AutoMutex lock(mHalLock); 1087a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (sound_model->type == SOUND_MODEL_TYPE_KEYPHRASE) { 1097a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent hidlReturn = soundtrigger->loadPhraseSoundModel( 1107a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent *(const ISoundTriggerHw::PhraseSoundModel *)halSoundModel, 1117a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent this, modelId, [&](int32_t retval, auto res) { 1124b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent ret = retval; 1137a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halHandle = res; 1147a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent }); 1157a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 1167a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } else { 1177a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent hidlReturn = soundtrigger->loadSoundModel(*halSoundModel, 1187a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent this, modelId, [&](int32_t retval, auto res) { 1194b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent ret = retval; 1207a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halHandle = res; 1217a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent }); 1227a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 1237a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 1247a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 1257a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent delete halSoundModel; 1267a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 127e83be8af690ef1ac820a63414d522e77ca9d4db6Steven Moreland if (hidlReturn.isOk()) { 1284b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent if (ret == 0) { 1294b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent AutoMutex lock(mLock); 1304b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent *handle = (sound_model_handle_t)modelId; 1314b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent sp<SoundModel> model = new SoundModel(*handle, callback, cookie, halHandle); 1324b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent mSoundModels.add(*handle, model); 1334b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent } 1347a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } else { 135e83be8af690ef1ac820a63414d522e77ca9d4db6Steven Moreland ALOGE("loadSoundModel error %s", hidlReturn.description().c_str()); 136d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov return FAILED_TRANSACTION; 1377a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 1387a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 1397a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return ret; 1407a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 1417a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 1427a544b44b7872b300f50e16fef480f76e9145fbbEric Laurentint SoundTriggerHalHidl::unloadSoundModel(sound_model_handle_t handle) 1437a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 1447a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent sp<ISoundTriggerHw> soundtrigger = getService(); 1457a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (soundtrigger == 0) { 1467a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return -ENODEV; 1477a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 1487a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 1497a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent sp<SoundModel> model = removeModel(handle); 1507a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (model == 0) { 1517a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent ALOGE("unloadSoundModel model not found for handle %u", handle); 1527a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return -EINVAL; 1537a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 1547a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 1554b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent Return<int32_t> hidlReturn(0); 1567a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent { 1577a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent AutoMutex lock(mHalLock); 1584b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent hidlReturn = soundtrigger->unloadSoundModel(model->mHalHandle); 1597a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 160e83be8af690ef1ac820a63414d522e77ca9d4db6Steven Moreland 161e83be8af690ef1ac820a63414d522e77ca9d4db6Steven Moreland if (!hidlReturn.isOk()) { 162e83be8af690ef1ac820a63414d522e77ca9d4db6Steven Moreland ALOGE("unloadSoundModel error %s", hidlReturn.description().c_str()); 163d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov return FAILED_TRANSACTION; 1644b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent } 165e83be8af690ef1ac820a63414d522e77ca9d4db6Steven Moreland 166e83be8af690ef1ac820a63414d522e77ca9d4db6Steven Moreland return hidlReturn; 1677a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 1687a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 1697a544b44b7872b300f50e16fef480f76e9145fbbEric Laurentint SoundTriggerHalHidl::startRecognition(sound_model_handle_t handle, 1707a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent const struct sound_trigger_recognition_config *config, 1717a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent recognition_callback_t callback, 1727a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent void *cookie) 1737a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 1747a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent sp<ISoundTriggerHw> soundtrigger = getService(); 1757a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (soundtrigger == 0) { 1767a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return -ENODEV; 1777a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 1787a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 1797a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent sp<SoundModel> model = getModel(handle); 1807a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (model == 0) { 1817a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent ALOGE("startRecognition model not found for handle %u", handle); 1827a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return -EINVAL; 1837a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 1847a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 1857a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent model->mRecognitionCallback = callback; 1867a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent model->mRecognitionCookie = cookie; 1877a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 1887a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent ISoundTriggerHw::RecognitionConfig *halConfig = 1897a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent convertRecognitionConfigToHal(config); 1907a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 1914b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent Return<int32_t> hidlReturn(0); 1927a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent { 1937a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent AutoMutex lock(mHalLock); 1944b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent hidlReturn = soundtrigger->startRecognition(model->mHalHandle, *halConfig, this, handle); 1957a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 1967a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 1977a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent delete halConfig; 1987a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 199e83be8af690ef1ac820a63414d522e77ca9d4db6Steven Moreland if (!hidlReturn.isOk()) { 200e83be8af690ef1ac820a63414d522e77ca9d4db6Steven Moreland ALOGE("startRecognition error %s", hidlReturn.description().c_str()); 201d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov return FAILED_TRANSACTION; 2024b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent } 203e83be8af690ef1ac820a63414d522e77ca9d4db6Steven Moreland return hidlReturn; 2047a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 2057a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 2067a544b44b7872b300f50e16fef480f76e9145fbbEric Laurentint SoundTriggerHalHidl::stopRecognition(sound_model_handle_t handle) 2077a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 2087a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent sp<ISoundTriggerHw> soundtrigger = getService(); 2097a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (soundtrigger == 0) { 2107a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return -ENODEV; 2117a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 2127a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 2137a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent sp<SoundModel> model = getModel(handle); 2147a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (model == 0) { 2157a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent ALOGE("stopRecognition model not found for handle %u", handle); 2167a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return -EINVAL; 2177a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 2187a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 2194b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent Return<int32_t> hidlReturn(0); 2207a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent { 2217a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent AutoMutex lock(mHalLock); 2224b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent hidlReturn = soundtrigger->stopRecognition(model->mHalHandle); 2237a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 2247a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 225e83be8af690ef1ac820a63414d522e77ca9d4db6Steven Moreland if (!hidlReturn.isOk()) { 226e83be8af690ef1ac820a63414d522e77ca9d4db6Steven Moreland ALOGE("stopRecognition error %s", hidlReturn.description().c_str()); 227d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov return FAILED_TRANSACTION; 2284b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent } 229e83be8af690ef1ac820a63414d522e77ca9d4db6Steven Moreland return hidlReturn; 2307a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 2317a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 2327a544b44b7872b300f50e16fef480f76e9145fbbEric Laurentint SoundTriggerHalHidl::stopAllRecognitions() 2337a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 2347a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent sp<ISoundTriggerHw> soundtrigger = getService(); 2357a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (soundtrigger == 0) { 2367a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return -ENODEV; 2377a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 2387a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 2394b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent Return<int32_t> hidlReturn(0); 2407a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent { 2417a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent AutoMutex lock(mHalLock); 2424b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent hidlReturn = soundtrigger->stopAllRecognitions(); 2437a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 2447a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 245e83be8af690ef1ac820a63414d522e77ca9d4db6Steven Moreland if (!hidlReturn.isOk()) { 246e83be8af690ef1ac820a63414d522e77ca9d4db6Steven Moreland ALOGE("stopAllRecognitions error %s", hidlReturn.description().c_str()); 247d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov return FAILED_TRANSACTION; 2484b38e7ad3565de208c8a8d7a401c1e7b07b0108bEric Laurent } 249e83be8af690ef1ac820a63414d522e77ca9d4db6Steven Moreland return hidlReturn; 2507a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 2517a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 2527a544b44b7872b300f50e16fef480f76e9145fbbEric LaurentSoundTriggerHalHidl::SoundTriggerHalHidl(const char *moduleName) 2537a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent : mModuleName(moduleName), mNextUniqueId(1) 2547a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 25549ad5522d1012b683ca3c76a008bcee5e19668c3Mikhail Naganov LOG_ALWAYS_FATAL_IF(strcmp(mModuleName, "primary") != 0, 25649ad5522d1012b683ca3c76a008bcee5e19668c3Mikhail Naganov "Treble soundtrigger only supports primary module"); 2577a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 2587a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 2597a544b44b7872b300f50e16fef480f76e9145fbbEric LaurentSoundTriggerHalHidl::~SoundTriggerHalHidl() 2607a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 2617a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 2627a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 2637a544b44b7872b300f50e16fef480f76e9145fbbEric Laurentsp<ISoundTriggerHw> SoundTriggerHalHidl::getService() 2647a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 2657a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent AutoMutex lock(mLock); 2667a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (mISoundTrigger == 0) { 2677a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (mModuleName == NULL) { 2687a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent mModuleName = "primary"; 2697a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 27049ad5522d1012b683ca3c76a008bcee5e19668c3Mikhail Naganov mISoundTrigger = ISoundTriggerHw::getService(); 271d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov if (mISoundTrigger != 0) { 272d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov mISoundTrigger->linkToDeath(HalDeathHandler::getInstance(), 0 /*cookie*/); 273d621ac82e648c8ef395068edb1af2747f49b700aMikhail Naganov } 2747a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 2757a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return mISoundTrigger; 2767a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 2777a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 2787a544b44b7872b300f50e16fef480f76e9145fbbEric Laurentsp<SoundTriggerHalHidl::SoundModel> SoundTriggerHalHidl::getModel(sound_model_handle_t handle) 2797a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 2807a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent AutoMutex lock(mLock); 2817a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return mSoundModels.valueFor(handle); 2827a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 2837a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 2847a544b44b7872b300f50e16fef480f76e9145fbbEric Laurentsp<SoundTriggerHalHidl::SoundModel> SoundTriggerHalHidl::removeModel(sound_model_handle_t handle) 2857a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 2867a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent AutoMutex lock(mLock); 2877a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent sp<SoundModel> model = mSoundModels.valueFor(handle); 2887a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent mSoundModels.removeItem(handle); 2897a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return model; 2907a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 2917a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 2927a544b44b7872b300f50e16fef480f76e9145fbbEric Laurentuint32_t SoundTriggerHalHidl::nextUniqueId() 2937a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 2947a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return (uint32_t) atomic_fetch_add_explicit(&mNextUniqueId, 2957a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent (uint_fast32_t) 1, memory_order_acq_rel); 2967a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 2977a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 2987a544b44b7872b300f50e16fef480f76e9145fbbEric Laurentvoid SoundTriggerHalHidl::convertUuidToHal(Uuid *halUuid, 299f7854d45bd12d5239c588767bf85953aca46b4efEric Laurent const sound_trigger_uuid_t *uuid) 3007a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 3017a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halUuid->timeLow = uuid->timeLow; 3027a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halUuid->timeMid = uuid->timeMid; 3037a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halUuid->versionAndTimeHigh = uuid->timeHiAndVersion; 3047a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halUuid->variantAndClockSeqHigh = uuid->clockSeq; 3057a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent memcpy(halUuid->node.data(), &uuid->node[0], sizeof(uuid->node)); 3067a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 3077a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 308f7854d45bd12d5239c588767bf85953aca46b4efEric Laurentvoid SoundTriggerHalHidl::convertUuidFromHal(sound_trigger_uuid_t *uuid, 3097a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent const Uuid *halUuid) 3107a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 3117a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent uuid->timeLow = halUuid->timeLow; 3127a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent uuid->timeMid = halUuid->timeMid; 3137a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent uuid->timeHiAndVersion = halUuid->versionAndTimeHigh; 3147a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent uuid->clockSeq = halUuid->variantAndClockSeqHigh; 3157a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent memcpy(&uuid->node[0], halUuid->node.data(), sizeof(uuid->node)); 3167a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 3177a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 3187a544b44b7872b300f50e16fef480f76e9145fbbEric Laurentvoid SoundTriggerHalHidl::convertPropertiesFromHal( 3197a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent struct sound_trigger_properties *properties, 3207a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent const ISoundTriggerHw::Properties *halProperties) 3217a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 3227a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent strlcpy(properties->implementor, 3237a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halProperties->implementor.c_str(), SOUND_TRIGGER_MAX_STRING_LEN); 3247a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent strlcpy(properties->description, 3257a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halProperties->description.c_str(), SOUND_TRIGGER_MAX_STRING_LEN); 3267a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent properties->version = halProperties->version; 3277a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent convertUuidFromHal(&properties->uuid, &halProperties->uuid); 3287a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent properties->max_sound_models = halProperties->maxSoundModels; 3297a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent properties->max_key_phrases = halProperties->maxKeyPhrases; 3307a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent properties->max_users = halProperties->maxUsers; 3317a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent properties->recognition_modes = halProperties->recognitionModes; 3327a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent properties->capture_transition = (bool)halProperties->captureTransition; 3337a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent properties->max_buffer_ms = halProperties->maxBufferMs; 3347a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent properties->concurrent_capture = (bool)halProperties->concurrentCapture; 3357a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent properties->trigger_in_event = (bool)halProperties->triggerInEvent; 3367a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent properties->power_consumption_mw = halProperties->powerConsumptionMw; 3377a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 3387a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 3397a544b44b7872b300f50e16fef480f76e9145fbbEric Laurentvoid SoundTriggerHalHidl::convertTriggerPhraseToHal( 3407a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent ISoundTriggerHw::Phrase *halTriggerPhrase, 3417a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent const struct sound_trigger_phrase *triggerPhrase) 3427a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 3437a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halTriggerPhrase->id = triggerPhrase->id; 3447a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halTriggerPhrase->recognitionModes = triggerPhrase->recognition_mode; 3457a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halTriggerPhrase->users.setToExternal((uint32_t *)&triggerPhrase->users[0], triggerPhrase->num_users); 3467a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halTriggerPhrase->locale = triggerPhrase->locale; 3477a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halTriggerPhrase->text = triggerPhrase->text; 3487a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 3497a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 3507a544b44b7872b300f50e16fef480f76e9145fbbEric LaurentISoundTriggerHw::SoundModel *SoundTriggerHalHidl::convertSoundModelToHal( 3517a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent const struct sound_trigger_sound_model *soundModel) 3527a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 3537a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent ISoundTriggerHw::SoundModel *halModel = NULL; 3547a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (soundModel->type == SOUND_MODEL_TYPE_KEYPHRASE) { 3557a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent ISoundTriggerHw::PhraseSoundModel *halKeyPhraseModel = 3567a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent new ISoundTriggerHw::PhraseSoundModel(); 3577a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent struct sound_trigger_phrase_sound_model *keyPhraseModel = 3587a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent (struct sound_trigger_phrase_sound_model *)soundModel; 3597a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent ISoundTriggerHw::Phrase *halPhrases = 3607a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent new ISoundTriggerHw::Phrase[keyPhraseModel->num_phrases]; 3617a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 3627a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 3637a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent for (unsigned int i = 0; i < keyPhraseModel->num_phrases; i++) { 3647a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent convertTriggerPhraseToHal(&halPhrases[i], 3657a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent &keyPhraseModel->phrases[i]); 3667a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 3677a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halKeyPhraseModel->phrases.setToExternal(halPhrases, keyPhraseModel->num_phrases); 3687a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent // FIXME: transfer buffer ownership. should have a method for that in hidl_vec 3697a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halKeyPhraseModel->phrases.resize(keyPhraseModel->num_phrases); 3707a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 3717a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent delete[] halPhrases; 3727a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 3737a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halModel = (ISoundTriggerHw::SoundModel *)halKeyPhraseModel; 3747a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } else { 3757a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halModel = new ISoundTriggerHw::SoundModel(); 3767a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 3777a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halModel->type = (SoundModelType)soundModel->type; 3787a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent convertUuidToHal(&halModel->uuid, &soundModel->uuid); 3797a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent convertUuidToHal(&halModel->vendorUuid, &soundModel->vendor_uuid); 3807a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halModel->data.setToExternal((uint8_t *)soundModel + soundModel->data_offset, soundModel->data_size); 3817a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halModel->data.resize(soundModel->data_size); 3827a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 3837a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return halModel; 3847a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 3857a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 3867a544b44b7872b300f50e16fef480f76e9145fbbEric Laurentvoid SoundTriggerHalHidl::convertPhraseRecognitionExtraToHal( 3877a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent PhraseRecognitionExtra *halExtra, 3887a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent const struct sound_trigger_phrase_recognition_extra *extra) 3897a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 3907a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halExtra->id = extra->id; 3917a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halExtra->recognitionModes = extra->recognition_modes; 3927a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halExtra->confidenceLevel = extra->confidence_level; 3937a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent ConfidenceLevel *halLevels = 3947a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent new ConfidenceLevel[extra->num_levels]; 3957a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent for (unsigned int i = 0; i < extra->num_levels; i++) { 3967a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halLevels[i].userId = extra->levels[i].user_id; 3977a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halLevels[i].levelPercent = extra->levels[i].level; 3987a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 3997a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halExtra->levels.setToExternal(halLevels, extra->num_levels); 4007a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent // FIXME: transfer buffer ownership. should have a method for that in hidl_vec 4017a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halExtra->levels.resize(extra->num_levels); 4027a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 4037a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent delete[] halLevels; 4047a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 4057a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 4067a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 4077a544b44b7872b300f50e16fef480f76e9145fbbEric LaurentISoundTriggerHw::RecognitionConfig *SoundTriggerHalHidl::convertRecognitionConfigToHal( 4087a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent const struct sound_trigger_recognition_config *config) 4097a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 4107a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent ISoundTriggerHw::RecognitionConfig *halConfig = 4117a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent new ISoundTriggerHw::RecognitionConfig(); 4127a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 4137a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halConfig->captureHandle = config->capture_handle; 4147a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halConfig->captureDevice = (AudioDevice)config->capture_device; 4157a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halConfig->captureRequested = (uint32_t)config->capture_requested; 4167a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 4177a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent PhraseRecognitionExtra *halExtras = 4187a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent new PhraseRecognitionExtra[config->num_phrases]; 4197a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 4207a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent for (unsigned int i = 0; i < config->num_phrases; i++) { 4217a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent convertPhraseRecognitionExtraToHal(&halExtras[i], 4227a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent &config->phrases[i]); 4237a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 4247a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halConfig->phrases.setToExternal(halExtras, config->num_phrases); 4257a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent // FIXME: transfer buffer ownership. should have a method for that in hidl_vec 4267a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halConfig->phrases.resize(config->num_phrases); 4277a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 4287a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent delete[] halExtras; 4297a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 4307a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halConfig->data.setToExternal((uint8_t *)config + config->data_offset, config->data_size); 4317a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 4327a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return halConfig; 4337a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 4347a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 4357a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 4367a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent// ISoundTriggerHwCallback 4377a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent::android::hardware::Return<void> SoundTriggerHalHidl::recognitionCallback( 4387a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent const ISoundTriggerHwCallback::RecognitionEvent& halEvent, 4397a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent CallbackCookie cookie) 4407a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 4417a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent sp<SoundModel> model; 4427a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent { 4437a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent AutoMutex lock(mLock); 4447a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent model = mSoundModels.valueFor((SoundModelHandle)cookie); 4457a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (model == 0) { 4467a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return Return<void>(); 4477a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 4487a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 4497a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent struct sound_trigger_recognition_event *event = convertRecognitionEventFromHal(&halEvent); 4507a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (event == NULL) { 4517a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return Return<void>(); 4527a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 4537a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent event->model = model->mHandle; 4547a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent model->mRecognitionCallback(event, model->mRecognitionCookie); 4557a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 4567a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent free(event); 4577a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 4587a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return Return<void>(); 4597a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 4607a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 4617a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent::android::hardware::Return<void> SoundTriggerHalHidl::phraseRecognitionCallback( 4627a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent const ISoundTriggerHwCallback::PhraseRecognitionEvent& 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 4747a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent struct sound_trigger_recognition_event *event = convertRecognitionEventFromHal( 4757a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent (const ISoundTriggerHwCallback::RecognitionEvent *)&halEvent); 4767a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (event == NULL) { 4777a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return Return<void>(); 4787a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 4797a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 4807a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent event->model = model->mHandle; 4817a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent model->mRecognitionCallback(event, model->mRecognitionCookie); 4827a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 4837a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent free(event); 4847a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 4857a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return Return<void>(); 4867a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 4877a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 4887a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent::android::hardware::Return<void> SoundTriggerHalHidl::soundModelCallback( 4897a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent const ISoundTriggerHwCallback::ModelEvent& halEvent, 4907a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent CallbackCookie cookie) 4917a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 4927a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent sp<SoundModel> model; 4937a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent { 4947a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent AutoMutex lock(mLock); 4957a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent model = mSoundModels.valueFor((SoundModelHandle)cookie); 4967a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (model == 0) { 4977a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return Return<void>(); 4987a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 4997a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 5007a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 5017a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent struct sound_trigger_model_event *event = convertSoundModelEventFromHal(&halEvent); 5027a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (event == NULL) { 5037a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return Return<void>(); 5047a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 5057a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 5067a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent event->model = model->mHandle; 5077a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent model->mSoundModelCallback(event, model->mSoundModelCookie); 5087a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 5097a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent free(event); 5107a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 5117a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return Return<void>(); 5127a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 5137a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 5147a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 5157a544b44b7872b300f50e16fef480f76e9145fbbEric Laurentstruct sound_trigger_model_event *SoundTriggerHalHidl::convertSoundModelEventFromHal( 5167a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent const ISoundTriggerHwCallback::ModelEvent *halEvent) 5177a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 5187a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent struct sound_trigger_model_event *event = (struct sound_trigger_model_event *)malloc( 5197a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent sizeof(struct sound_trigger_model_event) + 5207a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halEvent->data.size()); 5217a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (event == NULL) { 5227a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return NULL; 5237a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 5247a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 5257a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent event->status = (int)halEvent->status; 5267a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent // event->model to be set by caller 5277a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent event->data_offset = sizeof(struct sound_trigger_model_event); 5287a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent event->data_size = halEvent->data.size(); 5297a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent uint8_t *dst = (uint8_t *)event + event->data_offset; 5307a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent uint8_t *src = (uint8_t *)&halEvent->data[0]; 5317a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent memcpy(dst, src, halEvent->data.size()); 5327a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 5337a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return event; 5347a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 5357a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 5367a544b44b7872b300f50e16fef480f76e9145fbbEric Laurentvoid SoundTriggerHalHidl::convertPhraseRecognitionExtraFromHal( 5377a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent struct sound_trigger_phrase_recognition_extra *extra, 5387a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent const PhraseRecognitionExtra *halExtra) 5397a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 5407a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent extra->id = halExtra->id; 5417a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent extra->recognition_modes = halExtra->recognitionModes; 5427a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent extra->confidence_level = halExtra->confidenceLevel; 5437a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 5447a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent size_t i; 5457a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent for (i = 0; i < halExtra->levels.size() && i < SOUND_TRIGGER_MAX_USERS; i++) { 5467a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent extra->levels[i].user_id = halExtra->levels[i].userId; 5477a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent extra->levels[i].level = halExtra->levels[i].levelPercent; 5487a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 5497a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent extra->num_levels = (unsigned int)i; 5507a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 5517a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 5527a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 5537a544b44b7872b300f50e16fef480f76e9145fbbEric Laurentstruct sound_trigger_recognition_event *SoundTriggerHalHidl::convertRecognitionEventFromHal( 5547a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent const ISoundTriggerHwCallback::RecognitionEvent *halEvent) 5557a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{ 5567a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent struct sound_trigger_recognition_event *event; 5577a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 5587a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (halEvent->type == SoundModelType::KEYPHRASE) { 5597a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent struct sound_trigger_phrase_recognition_event *phraseEvent = 5607a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent (struct sound_trigger_phrase_recognition_event *)malloc( 5617a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent sizeof(struct sound_trigger_phrase_recognition_event) + 5627a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent halEvent->data.size()); 5637a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (phraseEvent == NULL) { 5647a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return NULL; 5657a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 5667a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent const ISoundTriggerHwCallback::PhraseRecognitionEvent *halPhraseEvent = 5677a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent (const ISoundTriggerHwCallback::PhraseRecognitionEvent *)halEvent; 5687a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 5697a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent for (unsigned int i = 0; i < halPhraseEvent->phraseExtras.size(); i++) { 5707a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent convertPhraseRecognitionExtraFromHal(&phraseEvent->phrase_extras[i], 5717a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent &halPhraseEvent->phraseExtras[i]); 5727a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 5737a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent phraseEvent->num_phrases = halPhraseEvent->phraseExtras.size(); 5747a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent event = (struct sound_trigger_recognition_event *)phraseEvent; 5757a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent event->data_offset = sizeof(sound_trigger_phrase_recognition_event); 5767a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } else { 5777a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent event = (struct sound_trigger_recognition_event *)malloc( 5787a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent sizeof(struct sound_trigger_recognition_event) + halEvent->data.size()); 5797a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent if (event == NULL) { 5807a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return NULL; 5817a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 5827a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent event->data_offset = sizeof(sound_trigger_recognition_event); 5837a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent } 5847a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent event->status = (int)halEvent->status; 5857a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent event->type = (sound_trigger_sound_model_type_t)halEvent->type; 5867a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent // event->model to be set by caller 5877a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent event->capture_available = (bool)halEvent->captureAvailable; 5887a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent event->capture_session = halEvent->captureSession; 5897a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent event->capture_delay_ms = halEvent->captureDelayMs; 5907a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent event->capture_preamble_ms = halEvent->capturePreambleMs; 5917a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent event->trigger_in_data = (bool)halEvent->triggerInData; 5927a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent event->audio_config.sample_rate = halEvent->audioConfig.sampleRateHz; 5937a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent event->audio_config.channel_mask = (audio_channel_mask_t)halEvent->audioConfig.channelMask; 5947a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent event->audio_config.format = (audio_format_t)halEvent->audioConfig.format; 5957a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 5967a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent event->data_size = halEvent->data.size(); 5977a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent uint8_t *dst = (uint8_t *)event + event->data_offset; 5987a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent uint8_t *src = (uint8_t *)&halEvent->data[0]; 5997a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent memcpy(dst, src, halEvent->data.size()); 6007a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 6017a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent return event; 6027a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} 6037a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent 6047a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} // namespace android 605