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