146bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent/* 246bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent * Copyright (C) 2014 The Android Open Source Project 346bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent * 446bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent * Licensed under the Apache License, Version 2.0 (the "License"); 546bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent * you may not use this file except in compliance with the License. 646bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent * You may obtain a copy of the License at 746bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent * 846bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent * http://www.apache.org/licenses/LICENSE-2.0 946bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent * 1046bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent * Unless required by applicable law or agreed to in writing, software 1146bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent * distributed under the License is distributed on an "AS IS" BASIS, 1246bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1346bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent * See the License for the specific language governing permissions and 1446bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent * limitations under the License. 1546bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent */ 1646bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent 1746bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent#include <system/audio.h> 1846bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent#include <system/sound_trigger.h> 1946bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent#include <hardware/hardware.h> 2046bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent 2146bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent#ifndef ANDROID_SOUND_TRIGGER_HAL_H 2246bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent#define ANDROID_SOUND_TRIGGER_HAL_H 2346bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent 2446bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent 2546bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent__BEGIN_DECLS 2646bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent 2746bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent/** 2846bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent * The id of this module 2946bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent */ 3046bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent#define SOUND_TRIGGER_HARDWARE_MODULE_ID "sound_trigger" 3146bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent 3246bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent/** 3346bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent * Name of the audio devices to open 3446bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent */ 3546bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent#define SOUND_TRIGGER_HARDWARE_INTERFACE "sound_trigger_hw_if" 3646bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent 3746bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent#define SOUND_TRIGGER_MODULE_API_VERSION_1_0 HARDWARE_MODULE_API_VERSION(1, 0) 3846bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent#define SOUND_TRIGGER_MODULE_API_VERSION_CURRENT SOUND_TRIGGER_MODULE_API_VERSION_1_0 3946bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent 4046bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent 4146bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent#define SOUND_TRIGGER_DEVICE_API_VERSION_1_0 HARDWARE_DEVICE_API_VERSION(1, 0) 420a965102e729bffb29d99761d7eb85da22730cb4Chris Thornton#define SOUND_TRIGGER_DEVICE_API_VERSION_1_1 HARDWARE_DEVICE_API_VERSION(1, 1) 430a965102e729bffb29d99761d7eb85da22730cb4Chris Thornton#define SOUND_TRIGGER_DEVICE_API_VERSION_CURRENT SOUND_TRIGGER_DEVICE_API_VERSION_1_1 4446bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent 4546bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent/** 4646bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent * List of known sound trigger HAL modules. This is the base name of the sound_trigger HAL 4746bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent * library composed of the "sound_trigger." prefix, one of the base names below and 4846bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent * a suffix specific to the device. 4946bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent * e.g: sondtrigger.primary.goldfish.so or sound_trigger.primary.default.so 5046bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent */ 5146bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent 5246bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent#define SOUND_TRIGGER_HARDWARE_MODULE_ID_PRIMARY "primary" 5346bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent 5446bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent 5546bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent/** 5646bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent * Every hardware module must have a data structure named HAL_MODULE_INFO_SYM 5746bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent * and the fields of this data structure must begin with hw_module_t 5846bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent * followed by module specific information. 5946bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent */ 6046bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurentstruct sound_trigger_module { 6146bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent struct hw_module_t common; 6246bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent}; 6346bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent 6446bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurenttypedef void (*recognition_callback_t)(struct sound_trigger_recognition_event *event, void *cookie); 6546bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurenttypedef void (*sound_model_callback_t)(struct sound_trigger_model_event *event, void *cookie); 6646bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent 6746bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurentstruct sound_trigger_hw_device { 6846bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent struct hw_device_t common; 6946bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent 7046bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent /* 7146bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent * Retrieve implementation properties. 7246bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent */ 7346bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent int (*get_properties)(const struct sound_trigger_hw_device *dev, 7446bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent struct sound_trigger_properties *properties); 7546bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent 7646bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent /* 7746bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent * Load a sound model. Once loaded, recognition of this model can be started and stopped. 7846bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent * Only one active recognition per model at a time. The SoundTrigger service will handle 7946bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent * concurrent recognition requests by different users/applications on the same model. 8046bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent * The implementation returns a unique handle used by other functions (unload_sound_model(), 8146bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent * start_recognition(), etc... 8246bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent */ 8346bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent int (*load_sound_model)(const struct sound_trigger_hw_device *dev, 8446bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent struct sound_trigger_sound_model *sound_model, 8546bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent sound_model_callback_t callback, 8646bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent void *cookie, 8746bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent sound_model_handle_t *handle); 8846bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent 8946bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent /* 9046bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent * Unload a sound model. A sound model can be unloaded to make room for a new one to overcome 9146bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent * implementation limitations. 9246bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent */ 9346bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent int (*unload_sound_model)(const struct sound_trigger_hw_device *dev, 9446bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent sound_model_handle_t handle); 9546bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent 9646bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent /* Start recognition on a given model. Only one recognition active at a time per model. 9746bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent * Once recognition succeeds of fails, the callback is called. 9846bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent * TODO: group recognition configuration parameters into one struct and add key phrase options. 9946bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent */ 10046bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent int (*start_recognition)(const struct sound_trigger_hw_device *dev, 10146bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent sound_model_handle_t sound_model_handle, 10230f3e6d348e5267320b40dbd8a67ffd77d179b4bEric Laurent const struct sound_trigger_recognition_config *config, 10346bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent recognition_callback_t callback, 10430f3e6d348e5267320b40dbd8a67ffd77d179b4bEric Laurent void *cookie); 10546bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent 10646bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent /* Stop recognition on a given model. 10746bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent * The implementation does not have to call the callback when stopped via this method. 10846bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent */ 10946bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent int (*stop_recognition)(const struct sound_trigger_hw_device *dev, 11042a448d790891870dd945eb94aeb5f05b426ab3eChris Thornton sound_model_handle_t sound_model_handle); 11142a448d790891870dd945eb94aeb5f05b426ab3eChris Thornton 11242a448d790891870dd945eb94aeb5f05b426ab3eChris Thornton /* Stop recognition on all models. 1130a965102e729bffb29d99761d7eb85da22730cb4Chris Thornton * Only supported for device api versions SOUND_TRIGGER_DEVICE_API_VERSION_1_1 or above. 11442a448d790891870dd945eb94aeb5f05b426ab3eChris Thornton * If no implementation is provided, stop_recognition will be called for each running model. 11542a448d790891870dd945eb94aeb5f05b426ab3eChris Thornton */ 11642a448d790891870dd945eb94aeb5f05b426ab3eChris Thornton int (*stop_all_recognitions)(const struct sound_trigger_hw_device* dev); 11746bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent}; 11846bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent 11946bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurenttypedef struct sound_trigger_hw_device sound_trigger_hw_device_t; 12046bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent 12146bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent/** convenience API for opening and closing a supported device */ 12246bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent 12346bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurentstatic inline int sound_trigger_hw_device_open(const struct hw_module_t* module, 12446bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent struct sound_trigger_hw_device** device) 12546bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent{ 12646bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent return module->methods->open(module, SOUND_TRIGGER_HARDWARE_INTERFACE, 127cc8d9f9fcbc170dedba609a15705e838cf09218bColin Cross TO_HW_DEVICE_T_OPEN(device)); 12846bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent} 12946bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent 13046bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurentstatic inline int sound_trigger_hw_device_close(struct sound_trigger_hw_device* device) 13146bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent{ 13246bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent return device->common.close(&device->common); 13346bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent} 13446bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent 13546bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent__END_DECLS 13646bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent 13746bbe8a7822278db4b3bd926e6f7cb2e0326a2dfEric Laurent#endif // ANDROID_SOUND_TRIGGER_HAL_H 138