| /* st_hw_session.h |
| * |
| * This file contains the API to load sound models with |
| * DSP and start/stop detection of associated key phrases. |
| * |
| * Copyright (c) 2017-2021, The Linux Foundation. All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions are |
| * met: |
| * * Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * * Redistributions in binary form must reproduce the above |
| * copyright notice, this list of conditions and the following |
| * disclaimer in the documentation and/or other materials provided |
| * with the distribution. |
| * * Neither the name of The Linux Foundation nor the names of its |
| * contributors may be used to endorse or promote products derived |
| * from this software without specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED |
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
| * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT |
| * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS |
| * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR |
| * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
| * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE |
| * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN |
| * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| #ifndef ST_HW_SESSION_H |
| #define ST_HW_SESSION_H |
| |
| #include <hardware/sound_trigger.h> |
| #include <tinyalsa/asoundlib.h> |
| #include "sound_trigger_platform.h" |
| #include "st_common_defs.h" |
| #include "opaque_header.h" |
| #include "st_buffering.h" |
| |
| enum sound_trigger_states { |
| SES_CREATED = 0x00, |
| SES_STARTED = 0x01, |
| SES_EVENT_RECEIVED = 0x02, |
| SES_BUFFERING = 0x04, |
| SES_INVALIDATED = 0x08, |
| }; |
| |
| typedef enum st_hw_sess_event_id { |
| ST_HW_SESS_EVENT_DETECTED, |
| ST_HW_SESS_EVENT_BUFFERING_STOPPED, |
| ST_HW_SESS_EVENT_MAX |
| } st_hw_sess_event_id_t; |
| |
| typedef struct st_hw_sess_detected_ev { |
| uint64_t timestamp; |
| int detect_status; |
| void* detect_payload; |
| size_t payload_size; |
| } st_hw_sess_detected_ev_t; |
| |
| typedef struct st_hw_sess_event { |
| st_hw_sess_event_id_t event_id; |
| union { |
| st_hw_sess_detected_ev_t detected; |
| } payload; |
| } st_hw_sess_event_t; |
| |
| typedef void (*hw_ses_event_callback_t)(st_hw_sess_event_t *event, void *cookie); |
| |
| struct st_hw_ses_config { |
| struct listnode sthw_cfg_list_node; |
| unsigned int model_id; |
| unsigned int client_req_hist_buf; |
| unsigned int client_req_preroll; |
| unsigned char *conf_levels; |
| unsigned int num_conf_levels; |
| }; |
| |
| struct st_hw_session { |
| |
| struct st_session_fptrs *fptrs; |
| |
| unsigned int use_case_idx; |
| |
| struct pcm_config config; |
| struct st_vendor_info *vendor_uuid_info; |
| |
| hw_ses_event_callback_t callback_to_st_session; |
| void *cookie; |
| |
| st_exec_mode_t exec_mode; |
| |
| enum sound_trigger_states state; |
| sound_model_handle_t sm_handle; /* used when logging */ |
| struct sound_trigger_device *stdev; |
| |
| st_device_t st_device; |
| char *st_device_name; |
| struct listnode *second_stage_list; |
| uint32_t kw_start_idx; |
| uint32_t kw_end_idx; |
| uint32_t channel_idx; |
| int32_t user_level; |
| bool enable_second_stage; |
| bool is_generic_event; |
| struct listnode lsm_ss_cfg_list; |
| bool lpi_enable; |
| bool barge_in_mode; |
| bool lab_enabled; |
| |
| int rc_config_update_counter; |
| uint64_t first_stage_det_event_time; |
| uint64_t second_stage_det_event_time; |
| st_buffer_t *buffer; |
| |
| struct listnode sthw_cfg_list; |
| uint32_t max_hist_buf; |
| uint32_t max_preroll; |
| bool sthw_cfg_updated; |
| char *custom_data; |
| unsigned int custom_data_size; |
| unsigned int num_reg_sm; |
| |
| st_module_type_t f_stage_version; |
| uint32_t detected_preroll; |
| }; |
| |
| typedef struct st_hw_session st_hw_session_t; |
| |
| /* Function pointers to routing layers */ |
| typedef void (*sound_trigger_init_session_t)(st_hw_session_t *); |
| typedef int (*sound_trigger_reg_sm_t)(st_hw_session_t *, |
| void*, unsigned int, uint32_t); |
| typedef int (*sound_trigger_reg_sm_params_t)(st_hw_session_t *, |
| unsigned int recognition_mode, bool capture_requested, |
| struct sound_trigger_recognition_config *rc_config); |
| |
| typedef int (*sound_trigger_dereg_sm_t)(st_hw_session_t *, uint32_t); |
| typedef int (*sound_trigger_dereg_sm_params_t)(st_hw_session_t *); |
| typedef int (*sound_trigger_start_t)(st_hw_session_t *); |
| typedef int (*sound_trigger_restart_t)(st_hw_session_t *, unsigned int, |
| struct sound_trigger_recognition_config *); |
| typedef int (*sound_trigger_stop_t)(st_hw_session_t *); |
| typedef int (*sound_trigger_stop_buffering_t)(st_hw_session_t *); |
| typedef int (*sound_trigger_set_device_t)(st_hw_session_t *, bool); |
| typedef int (*sound_trigger_read_pcm_t)(st_hw_session_t *, |
| unsigned char *, unsigned int ); |
| typedef void (*sound_trigger_lab_capture_t)(st_hw_session_t *); |
| typedef int (*sound_trigger_send_custom_chmix_coeff_t)(st_hw_session_t *, char *); |
| typedef int (*sound_trigger_disable_device_t)(st_hw_session_t *, bool); |
| typedef int (*sound_trigger_enable_device_t)(st_hw_session_t *, bool); |
| typedef int (*sound_trigger_get_param_data_t)(st_hw_session_t *, const char *, |
| void *, size_t, size_t *); |
| typedef int (*sound_trigger_send_detection_request_t)(st_hw_session_t *); |
| typedef int (*sound_trigger_get_module_version)(st_hw_session_t *, void *, size_t); |
| typedef int (*sound_trigger_open_session)(st_hw_session_t *); |
| typedef void (*sound_trigger_close_session)(st_hw_session_t *); |
| |
| |
| struct st_session_fptrs { |
| sound_trigger_reg_sm_t reg_sm; |
| sound_trigger_reg_sm_params_t reg_sm_params; |
| sound_trigger_dereg_sm_t dereg_sm; |
| sound_trigger_dereg_sm_params_t dereg_sm_params; |
| sound_trigger_start_t start; |
| sound_trigger_restart_t restart; /* If sessionn already started used to |
| quickly restart the session, in case of lsm this is a no-op in-case of |
| gcs it will do a stop/start */ |
| sound_trigger_stop_t stop; |
| sound_trigger_stop_buffering_t stop_buffering; /* directs underlying |
| driver to stop sending PCM buffers, this will cause the pcm_read to |
| fail eventually, also signals the lab_capture thread in-case it is waiting |
| for data to be read from the big buffer */ |
| sound_trigger_set_device_t set_device; |
| sound_trigger_read_pcm_t read_pcm; |
| sound_trigger_lab_capture_t process_lab_capture; /* goes into a loop that |
| read a chunk of data from PCM device and writes to large buffer that |
| is part of the session */ |
| sound_trigger_send_custom_chmix_coeff_t send_custom_chmix_coeff; |
| sound_trigger_disable_device_t disable_device; |
| sound_trigger_enable_device_t enable_device; |
| sound_trigger_get_param_data_t get_param_data; |
| sound_trigger_send_detection_request_t send_detection_request; |
| sound_trigger_get_module_version get_module_version; |
| sound_trigger_open_session open_session; |
| sound_trigger_close_session close_session; |
| }; |
| |
| #endif |