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