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#include <utils/Log.h>
187a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent#include "SoundTriggerHalLegacy.h"
197a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent
207a544b44b7872b300f50e16fef480f76e9145fbbEric Laurentnamespace android {
217a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent
227a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent/* static */
237a544b44b7872b300f50e16fef480f76e9145fbbEric Laurentsp<SoundTriggerHalInterface> SoundTriggerHalInterface::connectModule(const char *moduleName)
247a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{
257a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent    return new SoundTriggerHalLegacy(moduleName);
267a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent}
277a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent
287a544b44b7872b300f50e16fef480f76e9145fbbEric LaurentSoundTriggerHalLegacy::SoundTriggerHalLegacy(const char *moduleName)
297a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent    : mModuleName(moduleName), mHwDevice(NULL)
307a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{
317a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent}
327a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent
337a544b44b7872b300f50e16fef480f76e9145fbbEric Laurentvoid SoundTriggerHalLegacy::onFirstRef()
347a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{
357a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent    const hw_module_t *mod;
367a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent    int rc;
377a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent
387a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent    if (mModuleName == NULL) {
397a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent        mModuleName = "primary";
407a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent    }
417a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent
427a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent    rc = hw_get_module_by_class(SOUND_TRIGGER_HARDWARE_MODULE_ID, mModuleName, &mod);
437a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent    if (rc != 0) {
447a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent        ALOGE("couldn't load sound trigger module %s.%s (%s)",
457a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent              SOUND_TRIGGER_HARDWARE_MODULE_ID, mModuleName, strerror(-rc));
467a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent        return;
477a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent    }
487a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent    rc = sound_trigger_hw_device_open(mod, &mHwDevice);
497a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent    if (rc != 0) {
507a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent        ALOGE("couldn't open sound trigger hw device in %s.%s (%s)",
517a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent              SOUND_TRIGGER_HARDWARE_MODULE_ID, mModuleName, strerror(-rc));
527a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent        mHwDevice = NULL;
537a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent        return;
547a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent    }
557a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent    if (mHwDevice->common.version < SOUND_TRIGGER_DEVICE_API_VERSION_1_0 ||
567a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent            mHwDevice->common.version > SOUND_TRIGGER_DEVICE_API_VERSION_CURRENT) {
577a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent        ALOGE("wrong sound trigger hw device version %04x", mHwDevice->common.version);
587a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent        return;
597a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent    }
607a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent}
617a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent
627a544b44b7872b300f50e16fef480f76e9145fbbEric LaurentSoundTriggerHalLegacy::~SoundTriggerHalLegacy()
637a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{
647a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent    if (mHwDevice != NULL) {
657a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent        sound_trigger_hw_device_close(mHwDevice);
667a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent    }
677a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent}
687a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent
697a544b44b7872b300f50e16fef480f76e9145fbbEric Laurentint SoundTriggerHalLegacy::getProperties(struct sound_trigger_properties *properties)
707a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{
717a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent    if (mHwDevice == NULL) {
727a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent        return -ENODEV;
737a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent    }
747a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent    return mHwDevice->get_properties(mHwDevice, properties);
757a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent}
767a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent
777a544b44b7872b300f50e16fef480f76e9145fbbEric Laurentint SoundTriggerHalLegacy::loadSoundModel(struct sound_trigger_sound_model *sound_model,
787a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent                        sound_model_callback_t callback,
797a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent                        void *cookie,
807a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent                        sound_model_handle_t *handle)
817a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{
827a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent    if (mHwDevice == NULL) {
837a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent        return -ENODEV;
847a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent    }
857a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent    return mHwDevice->load_sound_model(mHwDevice, sound_model, callback, cookie, handle);
867a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent}
877a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent
887a544b44b7872b300f50e16fef480f76e9145fbbEric Laurentint SoundTriggerHalLegacy::unloadSoundModel(sound_model_handle_t handle)
897a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{
907a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent    if (mHwDevice == NULL) {
917a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent        return -ENODEV;
927a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent    }
937a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent    return mHwDevice->unload_sound_model(mHwDevice, handle);
947a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent}
957a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent
967a544b44b7872b300f50e16fef480f76e9145fbbEric Laurentint SoundTriggerHalLegacy::startRecognition(sound_model_handle_t handle,
977a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent                         const struct sound_trigger_recognition_config *config,
987a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent                         recognition_callback_t callback,
997a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent                         void *cookie)
1007a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{
1017a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent    if (mHwDevice == NULL) {
1027a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent        return -ENODEV;
1037a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent    }
1047a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent    return mHwDevice->start_recognition(mHwDevice, handle, config, callback, cookie);
1057a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent}
1067a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent
1077a544b44b7872b300f50e16fef480f76e9145fbbEric Laurentint SoundTriggerHalLegacy::stopRecognition(sound_model_handle_t handle)
1087a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{
1097a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent    if (mHwDevice == NULL) {
1107a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent        return -ENODEV;
1117a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent    }
1127a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent    return mHwDevice->stop_recognition(mHwDevice, handle);
1137a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent}
1147a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent
1157a544b44b7872b300f50e16fef480f76e9145fbbEric Laurentint SoundTriggerHalLegacy::stopAllRecognitions()
1167a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent{
1177a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent    if (mHwDevice == NULL) {
1187a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent        return -ENODEV;
1197a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent    }
1207a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent    if (mHwDevice->common.version >= SOUND_TRIGGER_DEVICE_API_VERSION_1_1 &&
1217a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent     mHwDevice->stop_all_recognitions) {
1227a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent        return mHwDevice->stop_all_recognitions(mHwDevice);
1237a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent    }
1247a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent    return -ENOSYS;
1257a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent}
1267a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent
1277a544b44b7872b300f50e16fef480f76e9145fbbEric Laurent} // namespace android
128