blob: 6a15e81ff85ae2a35b0d0397df34b4c3c1d5e334 [file] [log] [blame]
/* st_second_stage.h
*
* This file contains a sound trigger second stage session abstraction. This
* abstraction represents a single st second stage session from the st session
* perspective.
*
* Copyright (c) 2018-2020, 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_SECOND_STAGE_H
#define ST_SECOND_STAGE_H
#include <stdint.h>
#include <pthread.h>
#include <cutils/list.h>
#ifdef ST_MULTI_STAGE_ENABLED
#include <capi_v2.h>
#endif
#include "st_common_defs.h"
#include "sml_model_parser.h"
#include "st_buffering.h"
#define CNN_FRAME_SIZE (320)
typedef enum st_sound_model_type {
ST_SM_TYPE_NONE,
ST_SM_TYPE_KEYWORD_DETECTION,
ST_SM_TYPE_USER_VERIFICATION,
ST_SM_TYPE_CUSTOM_DETECTION,
ST_SM_TYPE_MAX
}st_sound_model_type_t;
typedef enum st_ss_detection_status {
KEYWORD_DETECTION_PENDING = 0x1,
KEYWORD_DETECTION_SUCCESS = 0x2,
KEYWORD_DETECTION_REJECT = 0x4,
USER_VERIFICATION_PENDING = 0x8,
USER_VERIFICATION_SUCCESS = 0x10,
USER_VERIFICATION_REJECT = 0x20,
}st_ss_detection_status_t;
typedef struct st_second_stage_info {
enum st_sound_model_type sm_detection_type;
listen_model_indicator_enum sm_id;
char lib_name[MAX_LIB_HANDLE_SIZE];
unsigned int sample_rate;
unsigned int bit_width;
unsigned int channel_count;
unsigned int data_before_kw_start;
unsigned int data_after_kw_end;
}st_second_stage_info_t;
typedef struct st_lsm_second_stage_config {
struct st_second_stage_info *ss_info;
struct listnode list_node;
struct st_lsm_ss_params *params;
/* sound model data */
uint8_t *sm_data;
unsigned int sm_size;
/* confidence levels */
int32_t confidence_threshold;
}st_lsm_ss_config_t;
typedef struct st_arm_second_stage {
struct st_second_stage_info *ss_info;
struct listnode list_node;
struct st_arm_ss_session *ss_session;
struct sound_trigger_device *stdev;
FILE *dump_fp;
}st_arm_second_stage_t;
typedef struct st_arm_ss_session {
/* For controlling the second stage session */
pthread_t thread;
pthread_mutex_t lock;
pthread_cond_t cond;
bool exit_thread;
struct st_proxy_session *st_ses;
/* For CNN to overwrite 1st stage indices */
uint32_t kw_start_idx;
uint32_t kw_end_idx;
/* For passing the buffered pcm data to modules */
uint8_t *hw_rd_ptr;
unsigned int unread_bytes;
bool exit_buffering;
unsigned int buff_sz;
unsigned int lab_buf_sz;
unsigned int bytes_processed;
unsigned int buf_start;
unsigned int buf_end;
/* For handling SUCCESS/REJECT results from modules */
enum st_ss_detection_status det_status;
/* For communicating with Capi modules */
#ifdef ST_MULTI_STAGE_ENABLED
capi_v2_init_f capi_init;
void *capi_lib_handle;
capi_v2_t *capi_handle;
#endif
/* For registering the sound model with modules */
uint8_t *sound_model;
unsigned int sm_size;
/* For getting and setting confidence levels */
int32_t confidence_threshold;
int32_t confidence_score;
/* For controlling the second stage process threads */
bool start_processing;
}st_arm_ss_session_t;
#ifdef ST_MULTI_STAGE_ENABLED
int st_second_stage_module_init(st_arm_second_stage_t *st_sec_stage,
void *lib_name);
int st_second_stage_module_deinit(st_arm_second_stage_t *st_sec_stage);
int st_second_stage_prepare_session(st_arm_second_stage_t *st_sec_stage);
int st_second_stage_start_session(st_arm_second_stage_t *st_sec_stage);
int st_second_stage_stop_session(st_arm_second_stage_t *st_sec_stage);
#else
#define st_second_stage_module_init(a, b) (0)
#define st_second_stage_module_deinit(a) (0)
#define st_second_stage_prepare_session(a) (0)
#define st_second_stage_start_session(a) (0)
#define st_second_stage_stop_session(a) (0)
#endif
#endif /* ST_SECOND_STAGE_H */