blob: a97ccf00cde7fd35614e0451b4c80f289b79ebd1 [file] [log] [blame]
Aniket Kumar Lata0e6e1e52019-11-14 21:43:55 -08001/* Copyright (c) 2013-2014, 2016-2020, The Linux Foundation. All rights reserved.
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -07002 *
3 * Redistribution and use in source and binary forms, with or without
4 * modification, are permitted provided that the following conditions are
5 * met:
6 * * Redistributions of source code must retain the above copyright
7 * notice, this list of conditions and the following disclaimer.
8 * * Redistributions in binary form must reproduce the above
9 * copyright notice, this list of conditions and the following
10 * disclaimer in the documentation and/or other materials provided
11 * with the distribution.
12 * * Neither the name of The Linux Foundation nor the names of its
13 * contributors may be used to endorse or promote products derived
14 * from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *
28 */
29#define LOG_TAG "soundtrigger"
30/* #define LOG_NDEBUG 0 */
31#define LOG_NDDEBUG 0
32
Bharath Ramachandramurthy76d20892015-04-27 15:47:55 -070033#include <errno.h>
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -070034#include <stdbool.h>
35#include <stdlib.h>
36#include <dlfcn.h>
Aalique Grahame22e49102018-12-18 14:23:57 -080037#include <pthread.h>
38#include <log/log.h>
Vinay Vermaaddfa4a2018-04-29 14:03:38 +053039#include <unistd.h>
Zhou Song5ad29c92019-12-04 19:26:38 +080040#include <cutils/properties.h>
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -070041#include "audio_hw.h"
42#include "audio_extn.h"
43#include "platform.h"
44#include "platform_api.h"
Dhanalakshmi Siddanif133cc52018-02-08 14:34:51 +053045
46/*-------------------- Begin: AHAL-STHAL Interface ---------------------------*/
47/*
48 * Maintain the proprietary interface between AHAL and STHAL locally to avoid
49 * the compilation dependency of interface header file from STHAL.
50 */
51
52#define MAKE_HAL_VERSION(maj, min) ((((maj) & 0xff) << 8) | ((min) & 0xff))
53#define MAJOR_VERSION(ver) (((ver) & 0xff00) >> 8)
54#define MINOR_VERSION(ver) ((ver) & 0x00ff)
55
56/* Proprietary interface version used for compatibility with STHAL */
Aniket Kumar Lata0e6e1e52019-11-14 21:43:55 -080057#define STHAL_PROP_API_VERSION_2_0 MAKE_HAL_VERSION(2, 0)
58#define STHAL_PROP_API_CURRENT_VERSION STHAL_PROP_API_VERSION_2_0
Dhanalakshmi Siddanif133cc52018-02-08 14:34:51 +053059
60#define ST_EVENT_CONFIG_MAX_STR_VALUE 32
61#define ST_DEVICE_HANDSET_MIC 1
62
63typedef enum {
64 ST_EVENT_SESSION_REGISTER,
65 ST_EVENT_SESSION_DEREGISTER,
66 ST_EVENT_START_KEEP_ALIVE,
67 ST_EVENT_STOP_KEEP_ALIVE,
kunleiz70e57612018-12-28 17:50:23 +080068 ST_EVENT_UPDATE_ECHO_REF
Dhanalakshmi Siddanif133cc52018-02-08 14:34:51 +053069} sound_trigger_event_type_t;
70
71typedef enum {
72 AUDIO_EVENT_CAPTURE_DEVICE_INACTIVE,
73 AUDIO_EVENT_CAPTURE_DEVICE_ACTIVE,
74 AUDIO_EVENT_PLAYBACK_STREAM_INACTIVE,
75 AUDIO_EVENT_PLAYBACK_STREAM_ACTIVE,
76 AUDIO_EVENT_STOP_LAB,
77 AUDIO_EVENT_SSR,
78 AUDIO_EVENT_NUM_ST_SESSIONS,
79 AUDIO_EVENT_READ_SAMPLES,
80 AUDIO_EVENT_DEVICE_CONNECT,
81 AUDIO_EVENT_DEVICE_DISCONNECT,
82 AUDIO_EVENT_SVA_EXEC_MODE,
83 AUDIO_EVENT_SVA_EXEC_MODE_STATUS,
84 AUDIO_EVENT_CAPTURE_STREAM_INACTIVE,
85 AUDIO_EVENT_CAPTURE_STREAM_ACTIVE,
Zhou Songc1088ea2018-06-12 00:17:29 +080086 AUDIO_EVENT_BATTERY_STATUS_CHANGED,
kunleiz70e57612018-12-28 17:50:23 +080087 AUDIO_EVENT_GET_PARAM,
Quinn Male918796e2019-07-19 11:19:21 -070088 AUDIO_EVENT_UPDATE_ECHO_REF,
Zhou Song5ad29c92019-12-04 19:26:38 +080089 AUDIO_EVENT_SCREEN_STATUS_CHANGED,
90 AUDIO_EVENT_ROUTE_INIT_DONE
Dhanalakshmi Siddanif133cc52018-02-08 14:34:51 +053091} audio_event_type_t;
92
93typedef enum {
94 USECASE_TYPE_PCM_PLAYBACK,
95 USECASE_TYPE_PCM_CAPTURE,
96 USECASE_TYPE_VOICE_CALL,
97 USECASE_TYPE_VOIP_CALL,
98} audio_stream_usecase_type_t;
99
100typedef enum {
101 SND_CARD_STATUS_OFFLINE,
102 SND_CARD_STATUS_ONLINE,
103 CPE_STATUS_OFFLINE,
Aalique Grahame22e49102018-12-18 14:23:57 -0800104 CPE_STATUS_ONLINE,
105 SLPI_STATUS_OFFLINE,
106 SLPI_STATUS_ONLINE
Dhanalakshmi Siddanif133cc52018-02-08 14:34:51 +0530107} ssr_event_status_t;
108
109struct sound_trigger_session_info {
110 void* p_ses; /* opaque pointer to st_session obj */
111 int capture_handle;
112 struct pcm *pcm;
113 struct pcm_config config;
114};
115
116struct audio_read_samples_info {
117 struct sound_trigger_session_info *ses_info;
118 void *buf;
119 size_t num_bytes;
120};
121
122struct audio_hal_usecase {
123 audio_stream_usecase_type_t type;
124};
125
126struct sound_trigger_event_info {
127 struct sound_trigger_session_info st_ses;
kunleiz70e57612018-12-28 17:50:23 +0800128 bool st_ec_ref_enabled;
Dhanalakshmi Siddanif133cc52018-02-08 14:34:51 +0530129};
130typedef struct sound_trigger_event_info sound_trigger_event_info_t;
131
132struct sound_trigger_device_info {
Aniket Kumar Lata0e6e1e52019-11-14 21:43:55 -0800133 struct listnode devices;
Dhanalakshmi Siddanif133cc52018-02-08 14:34:51 +0530134};
135
Dhanalakshmi Siddani57b014e2018-04-23 12:52:02 +0530136struct sound_trigger_get_param_data {
137 char *param;
138 int sm_handle;
139 struct str_parms *reply;
140};
141
Dhanalakshmi Siddanif133cc52018-02-08 14:34:51 +0530142struct audio_event_info {
143 union {
144 ssr_event_status_t status;
145 int value;
146 struct sound_trigger_session_info ses_info;
147 struct audio_read_samples_info aud_info;
148 char str_value[ST_EVENT_CONFIG_MAX_STR_VALUE];
149 struct audio_hal_usecase usecase;
kunleiz70e57612018-12-28 17:50:23 +0800150 bool audio_ec_ref_enabled;
Dhanalakshmi Siddani57b014e2018-04-23 12:52:02 +0530151 struct sound_trigger_get_param_data st_get_param_data;
Zhou Song5ad29c92019-12-04 19:26:38 +0800152 struct audio_route *audio_route;
Dhanalakshmi Siddanif133cc52018-02-08 14:34:51 +0530153 } u;
154 struct sound_trigger_device_info device_info;
155};
156typedef struct audio_event_info audio_event_info_t;
157/* STHAL callback which is called by AHAL */
158typedef int (*sound_trigger_hw_call_back_t)(audio_event_type_t,
159 struct audio_event_info*);
160
161/*---------------- End: AHAL-STHAL Interface ----------------------------------*/
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -0700162
Revathi Uddaraju1eac8b02017-05-18 17:13:33 +0530163#ifdef DYNAMIC_LOG_ENABLED
164#include <log_xml_parser.h>
165#define LOG_MASK HAL_MOD_FILE_SND_TRIGGER
166#include <log_utils.h>
167#endif
168
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -0700169#define XSTR(x) STR(x)
170#define STR(x) #x
Yamit Mehtaa0d653a2016-11-25 20:33:25 +0530171#define MAX_LIBRARY_PATH 100
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -0700172
Dhanalakshmi Siddanif133cc52018-02-08 14:34:51 +0530173#define DLSYM(handle, ptr, symbol, err) \
174do {\
Venkatesh Mangalappalibcc684c2018-04-06 14:58:44 -0700175 ptr = dlsym(handle, #symbol); \
176 if (ptr == NULL) {\
177 ALOGW("%s: %s not found. %s", __func__, #symbol, dlerror());\
Dhanalakshmi Siddanif133cc52018-02-08 14:34:51 +0530178 err = -ENODEV;\
179 }\
180} while(0)
181
182#ifdef __LP64__
183#define SOUND_TRIGGER_LIBRARY_PATH "/vendor/lib64/hw/sound_trigger.primary.%s.so"
184#else
185#define SOUND_TRIGGER_LIBRARY_PATH "/vendor/lib/hw/sound_trigger.primary.%s.so"
186#endif
187
Dhanalakshmi Siddani57b014e2018-04-23 12:52:02 +0530188#define SVA_PARAM_DIRECTION_OF_ARRIVAL "st_direction_of_arrival"
189#define SVA_PARAM_CHANNEL_INDEX "st_channel_index"
Sidipotu Ashokaa4fa6a2018-12-21 09:19:26 +0530190#define MAX_STR_LENGTH_FFV_PARAMS 30
191#define MAX_FFV_SESSION_ID 100
Jasmine Cha20b15f92019-05-17 20:56:43 +0800192
193#define ST_DEVICE SND_DEVICE_IN_HANDSET_MIC
Dhanalakshmi Siddanif133cc52018-02-08 14:34:51 +0530194/*
195 * Current proprietary API version used by AHAL. Queried by STHAL
196 * for compatibility check with AHAL
197 */
198const unsigned int sthal_prop_api_version = STHAL_PROP_API_CURRENT_VERSION;
199
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -0700200struct sound_trigger_info {
201 struct sound_trigger_session_info st_ses;
202 bool lab_stopped;
203 struct listnode list;
204};
205
206struct sound_trigger_audio_device {
207 void *lib_handle;
208 struct audio_device *adev;
209 sound_trigger_hw_call_back_t st_callback;
210 struct listnode st_ses_list;
211 pthread_mutex_t lock;
Dhanalakshmi Siddanif133cc52018-02-08 14:34:51 +0530212 unsigned int sthal_prop_api_version;
kunleiz70e57612018-12-28 17:50:23 +0800213 bool st_ec_ref_enabled;
Zhou Song5ad29c92019-12-04 19:26:38 +0800214 bool shared_mixer;
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -0700215};
216
217static struct sound_trigger_audio_device *st_dev;
218
Yamit Mehtaa0d653a2016-11-25 20:33:25 +0530219#if LINUX_ENABLED
220static void get_library_path(char *lib_path)
221{
222 snprintf(lib_path, MAX_LIBRARY_PATH,
Manish Dewangan6a36d002017-10-09 14:11:00 +0530223 "sound_trigger.primary.default.so");
Yamit Mehtaa0d653a2016-11-25 20:33:25 +0530224}
225#else
226static void get_library_path(char *lib_path)
227{
228 snprintf(lib_path, MAX_LIBRARY_PATH,
David Ng06ccd872017-03-15 11:39:33 -0700229 "/vendor/lib/hw/sound_trigger.primary.%s.so",
Yamit Mehtaa0d653a2016-11-25 20:33:25 +0530230 XSTR(SOUND_TRIGGER_PLATFORM_NAME));
231}
232#endif
233
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -0700234static struct sound_trigger_info *
235get_sound_trigger_info(int capture_handle)
236{
237 struct sound_trigger_info *st_ses_info = NULL;
238 struct listnode *node;
Bharath Ramachandramurthy76d20892015-04-27 15:47:55 -0700239 ALOGV("%s: list empty %d capture_handle %d", __func__,
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -0700240 list_empty(&st_dev->st_ses_list), capture_handle);
241 list_for_each(node, &st_dev->st_ses_list) {
242 st_ses_info = node_to_item(node, struct sound_trigger_info , list);
243 if (st_ses_info->st_ses.capture_handle == capture_handle)
244 return st_ses_info;
245 }
246 return NULL;
247}
248
Dhanalakshmi Siddanif133cc52018-02-08 14:34:51 +0530249static int populate_usecase(struct audio_hal_usecase *usecase,
250 struct audio_usecase *uc_info)
251{
252 int status = 0;
253
254 switch(uc_info->type) {
255 case PCM_PLAYBACK:
256 if (uc_info->id == USECASE_AUDIO_PLAYBACK_VOIP)
257 usecase->type = USECASE_TYPE_VOIP_CALL;
258 else
259 usecase->type = USECASE_TYPE_PCM_PLAYBACK;
260 break;
261
262 case PCM_CAPTURE:
Jasmine Cha20b15f92019-05-17 20:56:43 +0800263 if (uc_info->stream.in != NULL &&
264 uc_info->stream.in->source == AUDIO_SOURCE_VOICE_COMMUNICATION)
Dhanalakshmi Siddanif133cc52018-02-08 14:34:51 +0530265 usecase->type = USECASE_TYPE_VOIP_CALL;
266 else
267 usecase->type = USECASE_TYPE_PCM_CAPTURE;
268 break;
269
270 case VOICE_CALL:
271 usecase->type = USECASE_TYPE_VOICE_CALL;
272 break;
273
274 default:
275 ALOGE("%s: unsupported usecase type %d", __func__, uc_info->type);
276 status = -EINVAL;
277 }
278 return status;
279}
280
Dhananjay Kumare6293dd2017-05-25 17:25:30 +0530281static void stdev_snd_mon_cb(void * stream __unused, struct str_parms * parms)
282{
Derek Chen6f293672019-04-01 01:40:24 -0700283 audio_event_info_t event;
284 char value[32];
285 int ret = 0;
286
Dhananjay Kumare6293dd2017-05-25 17:25:30 +0530287 if (!parms)
288 return;
289
Derek Chen6f293672019-04-01 01:40:24 -0700290 ret = str_parms_get_str(parms, "SND_CARD_STATUS", value,
291 sizeof(value));
292 if (ret > 0) {
293 if (strstr(value, "OFFLINE")) {
294 event.u.status = SND_CARD_STATUS_OFFLINE;
295 st_dev->st_callback(AUDIO_EVENT_SSR, &event);
296 }
297 else if (strstr(value, "ONLINE")) {
298 event.u.status = SND_CARD_STATUS_ONLINE;
299 st_dev->st_callback(AUDIO_EVENT_SSR, &event);
300 }
301 else
302 ALOGE("%s: unknown snd_card_status", __func__);
303 }
304
305 ret = str_parms_get_str(parms, "CPE_STATUS", value, sizeof(value));
306 if (ret > 0) {
307 if (strstr(value, "OFFLINE")) {
308 event.u.status = CPE_STATUS_OFFLINE;
309 st_dev->st_callback(AUDIO_EVENT_SSR, &event);
310 }
311 else if (strstr(value, "ONLINE")) {
312 event.u.status = CPE_STATUS_ONLINE;
313 st_dev->st_callback(AUDIO_EVENT_SSR, &event);
314 }
315 else
316 ALOGE("%s: unknown CPE status", __func__);
317 }
318
Dhananjay Kumare6293dd2017-05-25 17:25:30 +0530319 return;
320}
321
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -0700322int audio_hw_call_back(sound_trigger_event_type_t event,
323 sound_trigger_event_info_t* config)
324{
325 int status = 0;
326 struct sound_trigger_info *st_ses_info;
327
328 if (!st_dev)
329 return -EINVAL;
330
331 pthread_mutex_lock(&st_dev->lock);
332 switch (event) {
333 case ST_EVENT_SESSION_REGISTER:
334 if (!config) {
335 ALOGE("%s: NULL config", __func__);
336 status = -EINVAL;
337 break;
338 }
339 st_ses_info= calloc(1, sizeof(struct sound_trigger_info ));
340 if (!st_ses_info) {
341 ALOGE("%s: st_ses_info alloc failed", __func__);
342 status = -ENOMEM;
343 break;
344 }
Shiv Maliyappanahalli0e283d32016-07-14 23:20:03 -0700345 memcpy(&st_ses_info->st_ses, &config->st_ses, sizeof (struct sound_trigger_session_info));
346 ALOGV("%s: add capture_handle %d st session opaque ptr %p", __func__,
347 st_ses_info->st_ses.capture_handle, st_ses_info->st_ses.p_ses);
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -0700348 list_add_tail(&st_dev->st_ses_list, &st_ses_info->list);
349 break;
350
Surendar Karka59c51072017-12-13 11:25:57 +0530351 case ST_EVENT_START_KEEP_ALIVE:
352 pthread_mutex_unlock(&st_dev->lock);
353 pthread_mutex_lock(&st_dev->adev->lock);
354 audio_extn_keep_alive_start(KEEP_ALIVE_OUT_PRIMARY);
355 pthread_mutex_unlock(&st_dev->adev->lock);
356 goto done;
357
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -0700358 case ST_EVENT_SESSION_DEREGISTER:
359 if (!config) {
360 ALOGE("%s: NULL config", __func__);
361 status = -EINVAL;
362 break;
363 }
364 st_ses_info = get_sound_trigger_info(config->st_ses.capture_handle);
365 if (!st_ses_info) {
Shiv Maliyappanahalli0e283d32016-07-14 23:20:03 -0700366 ALOGE("%s: st session opaque ptr %p not in the list!", __func__, config->st_ses.p_ses);
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -0700367 status = -EINVAL;
368 break;
369 }
Shiv Maliyappanahalli0e283d32016-07-14 23:20:03 -0700370 ALOGV("%s: remove capture_handle %d st session opaque ptr %p", __func__,
371 st_ses_info->st_ses.capture_handle, st_ses_info->st_ses.p_ses);
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -0700372 list_remove(&st_ses_info->list);
373 free(st_ses_info);
374 break;
Surendar Karka59c51072017-12-13 11:25:57 +0530375
376 case ST_EVENT_STOP_KEEP_ALIVE:
377 pthread_mutex_unlock(&st_dev->lock);
378 pthread_mutex_lock(&st_dev->adev->lock);
379 audio_extn_keep_alive_stop(KEEP_ALIVE_OUT_PRIMARY);
380 pthread_mutex_unlock(&st_dev->adev->lock);
381 goto done;
382
kunleiz70e57612018-12-28 17:50:23 +0800383 case ST_EVENT_UPDATE_ECHO_REF:
384 if (!config) {
385 ALOGE("%s: NULL config", __func__);
386 status = -EINVAL;
387 break;
388 }
389 st_dev->st_ec_ref_enabled = config->st_ec_ref_enabled;
390 break;
391
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -0700392 default:
393 ALOGW("%s: Unknown event %d", __func__, event);
394 break;
395 }
396 pthread_mutex_unlock(&st_dev->lock);
Surendar Karka59c51072017-12-13 11:25:57 +0530397done:
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -0700398 return status;
399}
400
Bharath Ramachandramurthy76d20892015-04-27 15:47:55 -0700401int audio_extn_sound_trigger_read(struct stream_in *in, void *buffer,
402 size_t bytes)
403{
404 int ret = -1;
405 struct sound_trigger_info *st_info = NULL;
406 audio_event_info_t event;
407
408 if (!st_dev)
409 return ret;
410
411 if (!in->is_st_session_active) {
412 ALOGE(" %s: Sound trigger is not active", __func__);
413 goto exit;
414 }
Bharath Ramachandramurthy76d20892015-04-27 15:47:55 -0700415
416 pthread_mutex_lock(&st_dev->lock);
417 st_info = get_sound_trigger_info(in->capture_handle);
418 pthread_mutex_unlock(&st_dev->lock);
419 if (st_info) {
420 event.u.aud_info.ses_info = &st_info->st_ses;
421 event.u.aud_info.buf = buffer;
422 event.u.aud_info.num_bytes = bytes;
423 ret = st_dev->st_callback(AUDIO_EVENT_READ_SAMPLES, &event);
424 }
425
426exit:
427 if (ret) {
428 if (-ENETRESET == ret)
429 in->is_st_session_active = false;
430 memset(buffer, 0, bytes);
431 ALOGV("%s: read failed status %d - sleep", __func__, ret);
432 usleep((bytes * 1000000) / (audio_stream_in_frame_size((struct audio_stream_in *)in) *
433 in->config.rate));
434 }
435 return ret;
436}
437
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -0700438void audio_extn_sound_trigger_stop_lab(struct stream_in *in)
439{
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -0700440 struct sound_trigger_info *st_ses_info = NULL;
441 audio_event_info_t event;
442
Mingming Yinfd7607b2016-01-22 12:48:44 -0800443 if (!st_dev || !in || !in->is_st_session_active)
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -0700444 return;
445
446 pthread_mutex_lock(&st_dev->lock);
447 st_ses_info = get_sound_trigger_info(in->capture_handle);
Bharath Ramachandramurthy5baa6a52014-10-21 11:18:49 -0700448 pthread_mutex_unlock(&st_dev->lock);
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -0700449 if (st_ses_info) {
450 event.u.ses_info = st_ses_info->st_ses;
Shiv Maliyappanahalli0e283d32016-07-14 23:20:03 -0700451 ALOGV("%s: AUDIO_EVENT_STOP_LAB st sess %p", __func__, st_ses_info->st_ses.p_ses);
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -0700452 st_dev->st_callback(AUDIO_EVENT_STOP_LAB, &event);
Mingming Yinfd7607b2016-01-22 12:48:44 -0800453 in->is_st_session_active = false;
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -0700454 }
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -0700455}
456void audio_extn_sound_trigger_check_and_get_session(struct stream_in *in)
457{
458 struct sound_trigger_info *st_ses_info = NULL;
459 struct listnode *node;
460
461 if (!st_dev || !in)
462 return;
463
464 pthread_mutex_lock(&st_dev->lock);
465 in->is_st_session = false;
466 ALOGV("%s: list %d capture_handle %d", __func__,
467 list_empty(&st_dev->st_ses_list), in->capture_handle);
468 list_for_each(node, &st_dev->st_ses_list) {
469 st_ses_info = node_to_item(node, struct sound_trigger_info , list);
470 if (st_ses_info->st_ses.capture_handle == in->capture_handle) {
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -0700471 in->config = st_ses_info->st_ses.config;
472 in->channel_mask = audio_channel_in_mask_from_count(in->config.channels);
473 in->is_st_session = true;
Bharath Ramachandramurthy837535b2015-02-05 14:27:59 -0800474 in->is_st_session_active = true;
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -0700475 ALOGD("%s: capture_handle %d is sound trigger", __func__, in->capture_handle);
476 break;
477 }
478 }
479 pthread_mutex_unlock(&st_dev->lock);
480}
481
Dhanalakshmi Siddanif133cc52018-02-08 14:34:51 +0530482bool is_same_as_st_device(snd_device_t snd_device)
483{
Jasmine Cha20b15f92019-05-17 20:56:43 +0800484 if (platform_check_all_backends_match(ST_DEVICE, snd_device)) {
Dhanalakshmi Siddanif133cc52018-02-08 14:34:51 +0530485 ALOGD("audio HAL using same device %d as ST", snd_device);
486 return true;
487 }
488 return false;
489}
490
kunleiz70e57612018-12-28 17:50:23 +0800491bool audio_extn_sound_trigger_check_ec_ref_enable()
492{
493 bool ret = false;
494
495 if (!st_dev) {
496 ALOGE("%s: st_dev NULL", __func__);
497 return ret;
498 }
499
Zhou Song5ad29c92019-12-04 19:26:38 +0800500 if (st_dev->shared_mixer)
501 return ret;
502
kunleiz70e57612018-12-28 17:50:23 +0800503 pthread_mutex_lock(&st_dev->lock);
504 if (st_dev->st_ec_ref_enabled) {
505 ret = true;
506 ALOGD("%s: EC Reference is enabled", __func__);
507 } else {
508 ALOGD("%s: EC Reference is disabled", __func__);
509 }
510 pthread_mutex_unlock(&st_dev->lock);
511
512 return ret;
513}
514
515void audio_extn_sound_trigger_update_ec_ref_status(bool on)
516{
517 struct audio_event_info ev_info;
518
519 if (!st_dev) {
520 ALOGE("%s: st_dev NULL", __func__);
521 return;
522 }
523
Zhou Song5ad29c92019-12-04 19:26:38 +0800524 if (st_dev->shared_mixer)
525 return;
526
kunleiz70e57612018-12-28 17:50:23 +0800527 ev_info.u.audio_ec_ref_enabled = on;
528 st_dev->st_callback(AUDIO_EVENT_UPDATE_ECHO_REF, &ev_info);
529 ALOGD("%s: update audio echo ref status %s",__func__,
530 ev_info.u.audio_ec_ref_enabled == true ? "true" : "false");
531}
532
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -0700533void audio_extn_sound_trigger_update_device_status(snd_device_t snd_device,
534 st_event_type_t event)
535{
536 bool raise_event = false;
537 int device_type = -1;
Jasmine Cha20b15f92019-05-17 20:56:43 +0800538 struct audio_event_info ev_info;
539
540 ev_info.u.usecase.type = -1;
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -0700541
542 if (!st_dev)
543 return;
544
Jasmine Cha20b15f92019-05-17 20:56:43 +0800545 list_init(&ev_info.device_info.devices);
546
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -0700547 if (snd_device >= SND_DEVICE_OUT_BEGIN &&
548 snd_device < SND_DEVICE_OUT_END)
549 device_type = PCM_PLAYBACK;
550 else if (snd_device >= SND_DEVICE_IN_BEGIN &&
Jasmine Cha20b15f92019-05-17 20:56:43 +0800551 snd_device < SND_DEVICE_IN_END) {
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -0700552 device_type = PCM_CAPTURE;
Jasmine Cha20b15f92019-05-17 20:56:43 +0800553 if (is_same_as_st_device(snd_device))
554 update_device_list(&ev_info.device_info.devices, ST_DEVICE_HANDSET_MIC, "", true);
555 } else {
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -0700556 ALOGE("%s: invalid device 0x%x, for event %d",
557 __func__, snd_device, event);
558 return;
559 }
560
Jasmine Cha20b15f92019-05-17 20:56:43 +0800561 struct stream_in *active_input = adev_get_active_input(st_dev->adev);
562 audio_source_t source = (active_input == NULL) ?
563 AUDIO_SOURCE_DEFAULT : active_input->source;
564 if (st_dev->adev->mode == AUDIO_MODE_IN_CALL) {
565 ev_info.u.usecase.type = USECASE_TYPE_VOICE_CALL;
566 } else if ((st_dev->adev->mode == AUDIO_MODE_IN_COMMUNICATION ||
567 source == AUDIO_SOURCE_VOICE_COMMUNICATION) &&
568 active_input) {
569 ev_info.u.usecase.type = USECASE_TYPE_VOIP_CALL;
570 } else if (device_type == PCM_CAPTURE) {
571 ev_info.u.usecase.type = USECASE_TYPE_PCM_CAPTURE;
572 }
573
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -0700574 raise_event = platform_sound_trigger_device_needs_event(snd_device);
575 ALOGI("%s: device 0x%x of type %d for Event %d, with Raise=%d",
576 __func__, snd_device, device_type, event, raise_event);
577 if (raise_event && (device_type == PCM_CAPTURE)) {
578 switch(event) {
579 case ST_EVENT_SND_DEVICE_FREE:
Jasmine Cha20b15f92019-05-17 20:56:43 +0800580 st_dev->st_callback(AUDIO_EVENT_CAPTURE_DEVICE_INACTIVE, &ev_info);
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -0700581 break;
582 case ST_EVENT_SND_DEVICE_BUSY:
Jasmine Cha20b15f92019-05-17 20:56:43 +0800583 st_dev->st_callback(AUDIO_EVENT_CAPTURE_DEVICE_ACTIVE, &ev_info);
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -0700584 break;
585 default:
586 ALOGW("%s:invalid event %d for device 0x%x",
587 __func__, event, snd_device);
588 }
589 }/*Events for output device, if required can be placed here in else*/
590}
591
592void audio_extn_sound_trigger_update_stream_status(struct audio_usecase *uc_info,
593 st_event_type_t event)
594{
595 bool raise_event = false;
Dhanalakshmi Siddanif133cc52018-02-08 14:34:51 +0530596 struct audio_event_info ev_info;
597 audio_event_type_t ev;
598 /*Initialize to invalid device*/
Aniket Kumar Lata0e6e1e52019-11-14 21:43:55 -0800599 list_init(&ev_info.device_info.devices);
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -0700600
Dhanalakshmi Siddanif133cc52018-02-08 14:34:51 +0530601 if (!st_dev)
602 return;
603
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -0700604 if (uc_info == NULL) {
605 ALOGE("%s: usecase is NULL!!!", __func__);
606 return;
607 }
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -0700608
Dhanalakshmi Siddanif133cc52018-02-08 14:34:51 +0530609 if ((uc_info->in_snd_device >= SND_DEVICE_IN_BEGIN &&
610 uc_info->in_snd_device < SND_DEVICE_IN_END)) {
611 if (is_same_as_st_device(uc_info->in_snd_device))
Aniket Kumar Lata0e6e1e52019-11-14 21:43:55 -0800612 update_device_list(&ev_info.device_info.devices, ST_DEVICE_HANDSET_MIC, "", true);
Dhanalakshmi Siddanif133cc52018-02-08 14:34:51 +0530613 }
Aniket Kumar Latad13758f2020-08-06 15:11:36 -0700614
Dhanalakshmi Siddanif133cc52018-02-08 14:34:51 +0530615 raise_event = platform_sound_trigger_usecase_needs_event(uc_info->id);
616 ALOGD("%s: uc_info->id %d of type %d for Event %d, with Raise=%d",
617 __func__, uc_info->id, uc_info->type, event, raise_event);
618 if (raise_event) {
619 if (uc_info->type == PCM_PLAYBACK) {
Zhou Songc1088ea2018-06-12 00:17:29 +0800620 if (uc_info->stream.out)
Aniket Kumar Lata0e6e1e52019-11-14 21:43:55 -0800621 assign_devices(&ev_info.device_info.devices, &uc_info->stream.out->device_list);
Zhou Songc1088ea2018-06-12 00:17:29 +0800622 else
Aniket Kumar Lata0e6e1e52019-11-14 21:43:55 -0800623 reassign_device_list(&ev_info.device_info.devices,
624 AUDIO_DEVICE_OUT_SPEAKER, "");
Dhanalakshmi Siddanif133cc52018-02-08 14:34:51 +0530625 switch(event) {
626 case ST_EVENT_STREAM_FREE:
Zhou Songc1088ea2018-06-12 00:17:29 +0800627 st_dev->st_callback(AUDIO_EVENT_PLAYBACK_STREAM_INACTIVE, &ev_info);
Dhanalakshmi Siddanif133cc52018-02-08 14:34:51 +0530628 break;
629 case ST_EVENT_STREAM_BUSY:
Zhou Songc1088ea2018-06-12 00:17:29 +0800630 st_dev->st_callback(AUDIO_EVENT_PLAYBACK_STREAM_ACTIVE, &ev_info);
Dhanalakshmi Siddanif133cc52018-02-08 14:34:51 +0530631 break;
632 default:
633 ALOGW("%s:invalid event %d, for usecase %d",
634 __func__, event, uc_info->id);
635 }
Revathi Uddaraju9f99ddd2018-05-03 12:01:38 +0530636 } else if ((uc_info->type == PCM_CAPTURE) || (uc_info->type == VOICE_CALL)) {
Dhanalakshmi Siddanif133cc52018-02-08 14:34:51 +0530637 if (event == ST_EVENT_STREAM_BUSY)
638 ev = AUDIO_EVENT_CAPTURE_STREAM_ACTIVE;
639 else
640 ev = AUDIO_EVENT_CAPTURE_STREAM_INACTIVE;
641 if (!populate_usecase(&ev_info.u.usecase, uc_info)) {
642 ALOGD("%s: send event %d: usecase id %d, type %d",
643 __func__, ev, uc_info->id, uc_info->type);
644 st_dev->st_callback(ev, &ev_info);
645 }
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -0700646 }
Dhanalakshmi Siddanif133cc52018-02-08 14:34:51 +0530647 }
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -0700648}
649
Zhou Songc1088ea2018-06-12 00:17:29 +0800650void audio_extn_sound_trigger_update_battery_status(bool charging)
651{
Aniket Kumar Lata0e6e1e52019-11-14 21:43:55 -0800652 struct audio_event_info ev_info = {{0}, {0}};
Zhou Songc1088ea2018-06-12 00:17:29 +0800653
Aniket Kumar Lata0e6e1e52019-11-14 21:43:55 -0800654 if (!st_dev)
Zhou Songc1088ea2018-06-12 00:17:29 +0800655 return;
656
657 ev_info.u.value = charging;
658 st_dev->st_callback(AUDIO_EVENT_BATTERY_STATUS_CHANGED, &ev_info);
659}
660
Quinn Male70f20f32019-06-26 16:50:26 -0700661void audio_extn_sound_trigger_update_screen_status(bool screen_off)
662{
663 struct audio_event_info ev_info = {{0}, {0}};
664
665 if (!st_dev)
666 return;
667
668 ev_info.u.value = screen_off;
669 st_dev->st_callback(AUDIO_EVENT_SCREEN_STATUS_CHANGED, &ev_info);
670}
671
Zhou Songc1088ea2018-06-12 00:17:29 +0800672
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -0700673void audio_extn_sound_trigger_set_parameters(struct audio_device *adev __unused,
674 struct str_parms *params)
675{
676 audio_event_info_t event;
677 char value[32];
Bharath Ramachandramurthyc694f8a2014-09-25 16:15:12 -0700678 int ret, val;
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -0700679
680 if(!st_dev || !params) {
681 ALOGE("%s: str_params NULL", __func__);
682 return;
683 }
684
Derek Chen6f293672019-04-01 01:40:24 -0700685 stdev_snd_mon_cb(NULL, params);
Bharath Ramachandramurthyc694f8a2014-09-25 16:15:12 -0700686
687 ret = str_parms_get_int(params, "SVA_NUM_SESSIONS", &val);
688 if (ret >= 0) {
689 event.u.value = val;
690 st_dev->st_callback(AUDIO_EVENT_NUM_ST_SESSIONS, &event);
691 }
Quinn male73dd1fd2016-12-02 10:47:11 -0800692
693 ret = str_parms_get_int(params, AUDIO_PARAMETER_DEVICE_CONNECT, &val);
Dhanalakshmi Siddani10621622018-04-30 15:07:27 +0530694 if ((ret >= 0) && (audio_is_input_device(val) ||
695 (val == AUDIO_DEVICE_OUT_LINE))) {
Quinn male73dd1fd2016-12-02 10:47:11 -0800696 event.u.value = val;
697 st_dev->st_callback(AUDIO_EVENT_DEVICE_CONNECT, &event);
698 }
699
700 ret = str_parms_get_int(params, AUDIO_PARAMETER_DEVICE_DISCONNECT, &val);
Dhanalakshmi Siddani10621622018-04-30 15:07:27 +0530701 if ((ret >= 0) && (audio_is_input_device(val) ||
702 (val == AUDIO_DEVICE_OUT_LINE))) {
Quinn male73dd1fd2016-12-02 10:47:11 -0800703 event.u.value = val;
704 st_dev->st_callback(AUDIO_EVENT_DEVICE_DISCONNECT, &event);
705 }
Chaithanya Krishna Bacharajue3d711e2016-12-08 16:17:32 +0530706
707 ret = str_parms_get_str(params, "SVA_EXEC_MODE", value, sizeof(value));
708 if (ret >= 0) {
709 strlcpy(event.u.str_value, value, sizeof(event.u.str_value));
710 st_dev->st_callback(AUDIO_EVENT_SVA_EXEC_MODE, &event);
711 }
Aalique Grahame22e49102018-12-18 14:23:57 -0800712
713 ret = str_parms_get_str(params, "SLPI_STATUS", value, sizeof(value));
714 if (ret > 0) {
715 if (strstr(value, "OFFLINE")) {
716 event.u.status = SLPI_STATUS_OFFLINE;
717 st_dev->st_callback(AUDIO_EVENT_SSR, &event);
718 } else if (strstr(value, "ONLINE")) {
719 event.u.status = SLPI_STATUS_ONLINE;
720 st_dev->st_callback(AUDIO_EVENT_SSR, &event);
721 } else
722 ALOGE("%s: unknown SLPI status", __func__);
723 }
Chaithanya Krishna Bacharajue3d711e2016-12-08 16:17:32 +0530724}
725
Sidipotu Ashokaa4fa6a2018-12-21 09:19:26 +0530726static int extract_sm_handle(const char *keys, char *paramstr) {
727 char *tmpstr, *token;
728 char *inputstr = NULL;
729 int value = -EINVAL;
730
731 if (keys == NULL || paramstr == NULL)
732 goto exit;
733
734 inputstr = strdup(keys);
735 token =strtok_r(inputstr,":", &tmpstr);
736
737 if (token == NULL)
738 goto exit;
739
740 ALOGD("%s input string <%s> param string <%s>", __func__, keys,token);
741 strlcpy(paramstr, token, MAX_STR_LENGTH_FFV_PARAMS);
742 token =strtok_r(NULL,":=",&tmpstr);
743
744 if (token == NULL)
745 goto exit;
746
747 value = atoi(token);
748 if (value > 0 && value < MAX_FFV_SESSION_ID)
749 ALOGD(" %s SVA sm handle<=%d>",__func__, value);
750
751exit:
752 if (inputstr != NULL)
753 free(inputstr);
754
755 return value;
756}
Chaithanya Krishna Bacharajue3d711e2016-12-08 16:17:32 +0530757void audio_extn_sound_trigger_get_parameters(const struct audio_device *adev __unused,
Sidipotu Ashokaa4fa6a2018-12-21 09:19:26 +0530758 struct str_parms *query,
759 struct str_parms *reply)
Chaithanya Krishna Bacharajue3d711e2016-12-08 16:17:32 +0530760{
761 audio_event_info_t event;
Sidipotu Ashokaa4fa6a2018-12-21 09:19:26 +0530762 int ret;
763 char value[32], paramstr[MAX_STR_LENGTH_FFV_PARAMS];
Quinn Maled6b0d722020-06-18 13:03:49 -0700764 char *kv_pairs = NULL;
Sidipotu Ashokaa4fa6a2018-12-21 09:19:26 +0530765
Quinn Maled6b0d722020-06-18 13:03:49 -0700766 if (query == NULL || reply == NULL) {
Mingshu Pange1a99d92020-06-05 10:38:25 +0800767 ALOGD("%s: query is null or reply is null",__func__);
768 return;
769 }
Quinn Maled6b0d722020-06-18 13:03:49 -0700770
771 kv_pairs = str_parms_to_str(query);
Mingshu Pange1a99d92020-06-05 10:38:25 +0800772 ALOGD("%s input string<%s>", __func__, kv_pairs);
Chaithanya Krishna Bacharajue3d711e2016-12-08 16:17:32 +0530773
774 ret = str_parms_get_str(query, "SVA_EXEC_MODE_STATUS", value,
775 sizeof(value));
776 if (ret >= 0) {
777 st_dev->st_callback(AUDIO_EVENT_SVA_EXEC_MODE_STATUS, &event);
778 str_parms_add_int(reply, "SVA_EXEC_MODE_STATUS", event.u.value);
779 }
Dhanalakshmi Siddani57b014e2018-04-23 12:52:02 +0530780
Mingshu Pange1a99d92020-06-05 10:38:25 +0800781 ret = extract_sm_handle(kv_pairs, paramstr);
Sidipotu Ashokaa4fa6a2018-12-21 09:19:26 +0530782
783 if ((ret >= 0) && !strncmp(paramstr, SVA_PARAM_DIRECTION_OF_ARRIVAL,
784 MAX_STR_LENGTH_FFV_PARAMS)) {
785 event.u.st_get_param_data.sm_handle = ret;
Dhanalakshmi Siddani57b014e2018-04-23 12:52:02 +0530786 event.u.st_get_param_data.param = SVA_PARAM_DIRECTION_OF_ARRIVAL;
787 event.u.st_get_param_data.reply = reply;
788 st_dev->st_callback(AUDIO_EVENT_GET_PARAM, &event);
Sidipotu Ashokaa4fa6a2018-12-21 09:19:26 +0530789 } else if ((ret >=0) && !strncmp(paramstr, SVA_PARAM_CHANNEL_INDEX,
790 MAX_STR_LENGTH_FFV_PARAMS)) {
791 event.u.st_get_param_data.sm_handle = ret;
Dhanalakshmi Siddani57b014e2018-04-23 12:52:02 +0530792 event.u.st_get_param_data.param = SVA_PARAM_CHANNEL_INDEX;
793 event.u.st_get_param_data.reply = reply;
794 st_dev->st_callback(AUDIO_EVENT_GET_PARAM, &event);
795 }
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -0700796}
797
798int audio_extn_sound_trigger_init(struct audio_device *adev)
799{
800 int status = 0;
801 char sound_trigger_lib[100];
Dhanalakshmi Siddanif133cc52018-02-08 14:34:51 +0530802 void *sthal_prop_api_version;
Zhou Song5ad29c92019-12-04 19:26:38 +0800803 audio_event_info_t event = {{0}, {0}};
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -0700804
805 ALOGI("%s: Enter", __func__);
806
807 st_dev = (struct sound_trigger_audio_device*)
808 calloc(1, sizeof(struct sound_trigger_audio_device));
809 if (!st_dev) {
810 ALOGE("%s: ERROR. sound trigger alloc failed", __func__);
811 return -ENOMEM;
812 }
813
Yamit Mehtaa0d653a2016-11-25 20:33:25 +0530814 get_library_path(sound_trigger_lib);
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -0700815 st_dev->lib_handle = dlopen(sound_trigger_lib, RTLD_NOW);
816
817 if (st_dev->lib_handle == NULL) {
Dhanalakshmi Siddanif133cc52018-02-08 14:34:51 +0530818 ALOGE("%s: error %s", __func__, dlerror());
819 status = -ENODEV;
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -0700820 goto cleanup;
821 }
822 ALOGI("%s: DLOPEN successful for %s", __func__, sound_trigger_lib);
823
Dhanalakshmi Siddanif133cc52018-02-08 14:34:51 +0530824 DLSYM(st_dev->lib_handle, st_dev->st_callback, sound_trigger_hw_call_back,
825 status);
826 if (status)
827 goto cleanup;
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -0700828
Dhanalakshmi Siddanif133cc52018-02-08 14:34:51 +0530829 DLSYM(st_dev->lib_handle, sthal_prop_api_version,
830 sthal_prop_api_version, status);
831 if (status) {
832 st_dev->sthal_prop_api_version = 0;
833 status = 0; /* passthru for backward compability */
834 } else {
Jhansi Konathala902fc412018-09-05 13:21:44 +0530835 if (sthal_prop_api_version != NULL) {
836 st_dev->sthal_prop_api_version = *(int*)sthal_prop_api_version;
837 }
Dhanalakshmi Siddanif133cc52018-02-08 14:34:51 +0530838 if (MAJOR_VERSION(st_dev->sthal_prop_api_version) !=
839 MAJOR_VERSION(STHAL_PROP_API_CURRENT_VERSION)) {
840 ALOGE("%s: Incompatible API versions ahal:0x%x != sthal:0x%x",
841 __func__, STHAL_PROP_API_CURRENT_VERSION,
842 st_dev->sthal_prop_api_version);
843 goto cleanup;
844 }
845 ALOGD("%s: sthal is using proprietary API version 0x%04x", __func__,
846 st_dev->sthal_prop_api_version);
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -0700847 }
848
849 st_dev->adev = adev;
kunleiz70e57612018-12-28 17:50:23 +0800850 st_dev->st_ec_ref_enabled = false;
Zhou Song5ad29c92019-12-04 19:26:38 +0800851 st_dev->shared_mixer =
852 property_get_bool("persist.vendor.audio.shared_mixer.enabled", false);
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -0700853 list_init(&st_dev->st_ses_list);
Dhananjay Kumare6293dd2017-05-25 17:25:30 +0530854 audio_extn_snd_mon_register_listener(st_dev, stdev_snd_mon_cb);
Zhou Song5ad29c92019-12-04 19:26:38 +0800855 if (st_dev->shared_mixer) {
856 event.u.audio_route = adev->audio_route;
857 st_dev->st_callback(AUDIO_EVENT_ROUTE_INIT_DONE, &event);
858 ALOGD("%s: send the audio route instance to sthal", __func__);
859 }
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -0700860 return 0;
861
862cleanup:
863 if (st_dev->lib_handle)
864 dlclose(st_dev->lib_handle);
865 free(st_dev);
866 st_dev = NULL;
867 return status;
868
869}
870
871void audio_extn_sound_trigger_deinit(struct audio_device *adev)
872{
873 ALOGI("%s: Enter", __func__);
874 if (st_dev && (st_dev->adev == adev) && st_dev->lib_handle) {
Dhananjay Kumare6293dd2017-05-25 17:25:30 +0530875 audio_extn_snd_mon_unregister_listener(st_dev);
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -0700876 dlclose(st_dev->lib_handle);
877 free(st_dev);
878 st_dev = NULL;
879 }
880}