-
Notifications
You must be signed in to change notification settings - Fork 0
/
st_session.h
275 lines (243 loc) · 9.2 KB
/
st_session.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
/* st_session.h
*
* This file contains a sound trigger user session abstraction. This
* abstraction represents a single st session from the application/framework
* point of view.
*
* Copyright (c) 2016-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_SESSION_H
#define ST_SESSION_H
#include <stdint.h>
#include <pthread.h>
#include "st_hw_session.h"
#include "sound_trigger_platform.h"
#include "st_common_defs.h"
/* Below are the states that can be requested from the client */
enum client_states_t {
ST_STATE_IDLE,
ST_STATE_LOADED,
ST_STATE_ACTIVE
};
typedef enum {
ST_DET_LOW_POWER_MODE,
ST_DET_HIGH_PERF_MODE,
ST_DET_UNKNOWN_MODE = 0xFF,
} st_det_perf_mode_t;
typedef enum st_session_event_id {
ST_SES_EV_LOAD_SM,
ST_SES_EV_UNLOAD_SM,
ST_SES_EV_START,
ST_SES_EV_RESTART,
ST_SES_EV_STOP,
ST_SES_EV_DETECTED,
ST_SES_EV_READ_PCM,
ST_SES_EV_END_BUFFERING,
ST_SES_EV_SET_EXEC_MODE,
ST_SES_EV_SSR_OFFLINE,
ST_SES_EV_SSR_ONLINE,
ST_SES_EV_PAUSE,
ST_SES_EV_RESUME,
ST_SES_EV_SEND_CHMIX_COEFF,
ST_SES_EV_SET_DEVICE,
ST_SES_EV_GET_PARAM_DATA,
ST_SES_EV_DEFERRED_STOP,
ST_SES_EV_REQUEST_DET,
ST_SES_EV_GET_MODULE_VERSION,
} st_session_event_id_t;
struct sound_trigger_device;
struct st_session_ev;
typedef struct st_session_ev st_session_ev_t;
typedef struct st_session st_session_t;
typedef struct st_proxy_session st_proxy_session_t;
typedef int (*st_proxy_session_state_fn_t)(st_proxy_session_t*,
st_session_ev_t *ev);
typedef struct multi_model_result_info multi_model_result_info_t;
struct multi_model_result_info {
uint32_t minor_version;
uint32_t num_detected_models;
uint32_t detected_model_id;
uint32_t detected_keyword_id;
uint32_t best_channel_idx;
int32_t best_confidence_level;
int32_t keyword_start_idx_bytes;
int32_t keyword_end_idx_bytes;
uint32_t timestamp_lsw_us;
uint32_t timestamp_msw_us;
};
struct sound_model_info {
unsigned int model_id;
unsigned char *sm_data;
unsigned int sm_size;
sound_trigger_sound_model_type_t sm_type;
unsigned int num_keyphrases;
unsigned int num_users;
char **keyphrases;
char **users;
char **cf_levels_kw_users;
unsigned char *cf_levels;
unsigned char *det_cf_levels;
unsigned int cf_levels_size;
};
struct st_proxy_ses_sm_info_wrapper {
struct listnode sm_list_node;
struct sound_model_info sm_info;
};
struct st_session {
/* TODO: decouple device below from session */
struct listnode list_node;
struct listnode transit_list_node;
struct listnode hw_list_node;
struct sound_trigger_device *stdev;
struct st_vendor_info *vendor_uuid_info;
pthread_mutex_t lock;
st_exec_mode_t exec_mode;
st_exec_mode_t ssr_transit_exec_mode;
struct sound_trigger_phrase_sound_model *phrase_sm;
struct sound_trigger_recognition_config *rc_config;
sound_trigger_sound_model_type_t sm_type;
sound_model_handle_t sm_handle;
recognition_callback_t callback;
void *cookie;
audio_io_handle_t capture_handle;
bool capture_requested;
unsigned int num_phrases;
unsigned int num_users;
unsigned int recognition_mode;
enum client_states_t state;
bool paused;
bool pending_stop;
bool pending_load;
bool pending_set_device;
bool pending_client_start;
bool detection_sent;
st_det_perf_mode_t client_req_det_mode;
unsigned int hist_buf_duration;
unsigned int preroll_duration;
struct listnode second_stage_list;
uint32_t conf_levels_intf_version;
void *st_conf_levels;
st_proxy_session_t *hw_proxy_ses;
struct sound_model_info sm_info;
st_module_type_t f_stage_version;
uint32_t fs_det_count;
uint32_t ss_det_count;
uint32_t ss_rej_count;
};
struct st_proxy_session {
struct listnode clients_list; /* Attached client sessions */
struct sound_trigger_device *stdev;
struct st_vendor_info *vendor_uuid_info;
pthread_mutex_t lock;
st_exec_mode_t exec_mode;
bool enable_trans;
struct sound_trigger_recognition_config *rc_config;
sound_model_handle_t sm_handle;
bool lab_enabled;
unsigned int recognition_mode;
st_hw_session_t *hw_ses_cpe; /* cpe hw session */
st_hw_session_t *hw_ses_adsp; /* adsp hw session */
st_hw_session_t *hw_ses_arm; /* arm hw session */
st_hw_session_t *hw_ses_current; /* current hw session, this is set every
time there is an exec_mode change and points to one of the above
hw sessions */
st_hw_session_t *hw_ses_prev; /* cached hw_ses_current,
used for WDSP<->ADSP transitions */
st_session_t *det_stc_ses; /* Current detected client */
/*
* flag gets set if user restarts
* session right after detection before we have a chance to stop the
* session
*/
bool hw_session_started;
st_proxy_session_state_fn_t current_state;
bool device_disabled;
pthread_t aggregator_thread;
pthread_mutex_t ss_detections_lock;
pthread_cond_t ss_detections_cond;
bool aggregator_thread_created;
bool exit_aggregator_loop;
bool enable_second_stage;
st_session_ev_t *det_session_ev;
int rc_config_update_counter;
bool detection_requested;
struct listnode sm_info_list;
bool sm_merged;
FILE *lab_fp;
uint64_t detection_event_time;
st_module_type_t f_stage_version;
};
/*
* Initialzies a sound trigger session. Must be called before
* any other opertaions.
* Parameters:
* use_gcs TRUE indicates that GCS should be used for CPE HW
* session (WCD9340 and beyond) otherwise use
* LSM(WCD9335 and earlier)
* exec_mode Indicates initial execution mode for the st
* session, whether it is in CPE or ADSP
*/
int st_session_init(st_session_t *st_ses, struct sound_trigger_device *stdev,
st_exec_mode_t exec_mode, sound_model_handle_t sm_handle);
int st_session_deinit(st_session_t *);
int st_session_ss_init(st_session_t *st_ses);
int st_session_ss_deinit(st_session_t *st_ses);
int st_session_load_sm(st_session_t *st_ses);
int st_session_start(st_session_t *st_ses);
int st_session_unload_sm(st_session_t *st_ses);
int st_session_stop(st_session_t *st_ses);
int st_session_read_pcm(st_session_t *st_ses, uint8_t *buff,
size_t buff_size, /*out*/ size_t *read_size);
int st_session_stop_lab(st_session_t *st_ses);
int st_session_ssr_offline(st_session_t *st_ses,
enum ssr_event_status ssr_type);
int st_session_ssr_online(st_session_t *st_ses,
enum ssr_event_status ssr_type);
int st_session_pause(st_session_t *st_ses);
int st_session_resume(st_session_t *st_ses);
int st_session_restart(st_session_t *st_ses);
int st_session_send_custom_chmix_coeff(st_session_t *st_ses, char *str);
int st_session_get_config(st_session_t *st_ses, struct pcm_config *config);
int st_session_enable_device(st_session_t *st_ses);
int st_session_disable_device(st_session_t *st_ses);
bool st_session_is_detected(st_session_t *st_ses);
bool st_session_is_active(st_session_t *st_ses);
bool st_session_is_buffering(st_session_t *st_ses);
bool st_session_is_ssr_state(st_session_t *st_ses);
int st_session_set_exec_mode(st_session_t *st_ses, st_exec_mode_t exec);
int st_session_get_param_data(st_session_t *st_ses, const char *param,
void *payload, size_t payload_size, size_t *param_data_size);
int st_session_request_detection(st_session_t *st_ses);
int st_session_update_recongition_config(st_session_t *st_ses);
int st_session_get_preroll(st_session_t *st_ses);
int st_session_get_module_version(st_session_t *st_ses, char *version);
int process_detection_event_keyphrase_v2(
st_proxy_session_t *st_ses, int detect_status,
void *payload, size_t payload_size,
struct sound_trigger_phrase_recognition_event **event);
#endif /* ST_SESSION_H */